@wefunder/sdk 0.1.0-beta.5 → 0.1.0-beta.7
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/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -3
- package/dist/index.d.ts +17 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/examples_manifest.json +32 -0
- package/package.json +7 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/generated/core/bodySerializer.gen.ts","../src/generated/core/params.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/http.ts","../src/oauth.ts","../src/errors.ts","../src/token-manager.ts","../src/pagination.ts","../src/generated/sdk.gen.ts","../src/generated/client.gen.ts","../src/client.ts","../src/webhooks.ts"],"sourcesContent":["// Public API surface for @wefunder/sdk.\n\nexport {\n Wefunder,\n modeForToken,\n DEFAULT_API_BASE_URL,\n DEFAULT_API_VERSION,\n type WefunderOptions,\n type Mode,\n type OfferingSort,\n} from \"./client.js\";\n\nexport { WefunderError, WefunderAuthError, REQUEST_ID_HEADER } from \"./errors.js\";\n\nexport {\n // PKCE + authorization_code\n generatePkce,\n createAuthorizationUrl,\n exchangeCode,\n // client_credentials\n clientCredentialsGrant,\n // refresh (rotation)\n refreshToken,\n // host config (authorize host vs token host split)\n DEFAULT_AUTHORIZE_BASE_URL,\n SANDBOX_AUTHORIZE_BASE_URL,\n DEFAULT_TOKEN_BASE_URL,\n DEFAULT_OAUTH_BASE_URL,\n type OAuthHostOptions,\n type TokenSet,\n type Pkce,\n type AuthorizationUrlOptions,\n type ExchangeCodeOptions,\n type ClientCredentialsOptions,\n type RefreshOptions,\n} from \"./oauth.js\";\n\nexport { type TokenStore, type TokenManagerOptions } from \"./token-manager.js\";\n\nexport { paginate, collect, type Cursor, type Page, type PageFetcher } from \"./pagination.js\";\n\nexport {\n verifyWebhook,\n constructEvent,\n type VerifyWebhookOptions,\n type ParsedWebhook,\n SIGNATURE_HEADER,\n TIMESTAMP_HEADER,\n EVENT_HEADER,\n DELIVERY_ID_HEADER,\n} from \"./webhooks.js\";\n\n// Re-export all generated model types for consumers (Investment, Syndicate, etc.).\nexport type * from \"./generated/types.gen.js\";\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type {\n ArrayStyle,\n ObjectStyle,\n SerializerOptions,\n} 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 = (\n data: FormData,\n key: string,\n value: unknown,\n): 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 = (\n data: URLSearchParams,\n key: string,\n value: unknown,\n): 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) =>\n typeof value === \"bigint\" ? value.toString() : value,\n ),\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\ntype Slot = \"body\" | \"headers\" | \"path\" | \"query\";\n\nexport type Field =\n | {\n in: Exclude<Slot, \"body\">;\n /**\n * Field name. This is the name we want the user to see and use.\n */\n key: string;\n /**\n * Field mapped name. This is the name we want to use in the request.\n * If omitted, we use the same value as `key`.\n */\n map?: string;\n }\n | {\n in: Extract<Slot, \"body\">;\n /**\n * Key isn't required for bodies.\n */\n key?: string;\n map?: string;\n }\n | {\n /**\n * Field name. This is the name we want the user to see and use.\n */\n key: string;\n /**\n * Field mapped name. This is the name we want to use in the request.\n * If `in` is omitted, `map` aliases `key` to the transport layer.\n */\n map: Slot;\n };\n\nexport interface Fields {\n allowExtra?: Partial<Record<Slot, boolean>>;\n args?: ReadonlyArray<Field>;\n}\n\nexport type FieldsConfig = ReadonlyArray<Field | Fields>;\n\nconst extraPrefixesMap: Record<string, Slot> = {\n $body_: \"body\",\n $headers_: \"headers\",\n $path_: \"path\",\n $query_: \"query\",\n};\nconst extraPrefixes = Object.entries(extraPrefixesMap);\n\ntype KeyMap = Map<\n string,\n | {\n in: Slot;\n map?: string;\n }\n | {\n in?: never;\n map: Slot;\n }\n>;\n\nfunction buildKeyMap(fields: FieldsConfig, map?: KeyMap): KeyMap {\n if (!map) {\n map = new Map();\n }\n\n for (const config of fields) {\n if (\"in\" in config) {\n if (config.key) {\n map.set(config.key, {\n in: config.in,\n map: config.map,\n });\n }\n } else if (\"key\" in config) {\n map.set(config.key, {\n map: config.map,\n });\n } else if (config.args) {\n buildKeyMap(config.args, map);\n }\n }\n\n return map;\n}\n\ninterface Params {\n body?: unknown;\n headers: Record<string, unknown>;\n path: Record<string, unknown>;\n query: Record<string, unknown>;\n}\n\nfunction stripEmptySlots(params: Params): void {\n for (const [slot, value] of Object.entries(params)) {\n if (slot === \"body\") continue;\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n !Object.keys(value).length\n ) {\n delete params[slot as Slot];\n }\n }\n}\n\nexport function buildClientParams(\n args: ReadonlyArray<unknown>,\n fields: FieldsConfig,\n): Params {\n const params: Params = {\n headers: Object.create(null),\n path: Object.create(null),\n query: Object.create(null),\n };\n\n const map = buildKeyMap(fields);\n\n function writeSlot(slot: Slot, key: string, value: unknown): void {\n let record = params[slot] as Record<string, unknown> | undefined;\n if (record === undefined) {\n record = Object.create(null) as Record<string, unknown>;\n params[slot] = record;\n }\n record[key] = value;\n }\n\n let config: FieldsConfig[number] | undefined;\n\n for (const [index, arg] of args.entries()) {\n if (fields[index]) {\n config = fields[index];\n }\n\n if (!config) {\n continue;\n }\n\n if (\"in\" in config) {\n if (config.key) {\n const field = map.get(config.key)!;\n const name = field.map || config.key;\n if (field.in) {\n writeSlot(field.in, name, arg);\n }\n } else {\n params.body = arg;\n }\n } else {\n for (const [key, value] of Object.entries(arg ?? {})) {\n const field = map.get(key);\n\n if (field) {\n if (field.in) {\n const name = field.map || key;\n writeSlot(field.in, name, value);\n } else {\n params[field.map] = value;\n }\n } else {\n const extra = extraPrefixes.find(([prefix]) =>\n key.startsWith(prefix),\n );\n\n if (extra) {\n const [prefix, slot] = extra;\n writeSlot(slot, key.slice(prefix.length), value);\n } else if (\"allowExtra\" in config && config.allowExtra) {\n for (const [slot, allowed] of Object.entries(config.allowExtra)) {\n if (allowed) {\n writeSlot(slot as Slot, key, value);\n break;\n }\n }\n }\n }\n }\n }\n }\n\n stripEmptySlots(params);\n\n return params;\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<\n RequestInit,\n \"method\"\n> &\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<\n TData = unknown,\n TReturn = void,\n TNext = unknown,\n> = {\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 =\n sseSleepFn ??\n ((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)\n throw new Error(\n `SSE failed: ${response.status} ${response.statusText}`,\n );\n\n if (!response.body) throw new Error(\"No body in SSE response\");\n\n const reader = response.body\n .pipeThrough(new TextDecoderStream())\n .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(\n line.replace(/^retry:\\s*/, \"\"),\n 10,\n );\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 (\n sseMaxRetryAttempts !== undefined &&\n attempt >= sseMaxRetryAttempts\n ) {\n break; // stop after firing error\n }\n\n // exponential backoff: double retry each attempt, cap at 30s\n const backoff = Math.min(\n retryDelay * 2 ** (attempt - 1),\n sseMaxRetryDelay ?? 30000,\n );\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>\n 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 = (\n style: ArraySeparatorStyle,\n): \".\" | \";\" | \",\" | \"&\" => {\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 = (\n style: ArraySeparatorStyle,\n): \",\" | \"|\" | \"%20\" => {\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 = (\n style: ObjectSeparatorStyle,\n): \".\" | \";\" | \",\" | \"&\" => {\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}): string => {\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\"\n ? separator + joinedValues\n : joinedValues;\n};\n\nexport const serializePrimitiveParam = ({\n allowReserved,\n name,\n value,\n}: SerializePrimitiveParam): string => {\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}): string => {\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 = [\n ...values,\n key,\n allowReserved ? (v as string) : encodeURIComponent(v as string),\n ];\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\"\n ? separator + joinedValues\n : 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: RegExp = /\\{[^{}]+\\}/g;\n\nexport const defaultPathSerializer = ({\n path,\n url: _url,\n}: PathSerializer): string => {\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(\n match,\n serializeArrayParam({ explode, name, style, value }),\n );\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}): string => {\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}): unknown {\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 * A unique identifier for the security scheme.\n *\n * Defined only when there are multiple security schemes whose `Auth`\n * shape would otherwise be identical.\n */\n key?: string;\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 =\n 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 {\n Client,\n ClientOptions,\n Config,\n RequestOptions,\n} from \"./types.gen\";\n\nexport const createQuerySerializer = <T = unknown>({\n parameters = {},\n ...args\n}: QuerySerializerOptions = {}): ((queryParams: T) => string) => {\n const querySerializer = (queryParams: T): string => {\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 = (\n contentType: string | null,\n): 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 (\n cleanContent.startsWith(\"application/json\") ||\n cleanContent.endsWith(\"+json\")\n ) {\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) =>\n cleanContent.startsWith(type),\n )\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 =\n header instanceof Headers\n ? headersEntries(header)\n : 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> = (\n request: Req,\n options: Options,\n) => 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(\n id: number | Interceptor,\n fn: Interceptor,\n ): 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 {\n Client,\n Config,\n RequestOptions,\n ResolvedRequestOptions,\n} 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<\n Request,\n Response,\n unknown,\n ResolvedRequestOptions\n >();\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\n 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 (\n response.status === 204 ||\n response.headers.get(\"Content-Length\") === \"0\"\n ) {\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(\n finalError,\n response,\n request,\n options as ResolvedRequestOptions,\n );\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 =\n (method: Uppercase<HttpMethod>) => (options: RequestOptions) =>\n request({ ...options, method });\n\n const makeSseFn =\n (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\n BodyInit | null | undefined,\n url,\n });\n };\n\n const _buildUrl: Client[\"buildUrl\"] = (options) =>\n 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","// The retry/refresh fetch wrapper passed to the generated client. Centralizes the\n// three contract-driven behaviors (plan §4.1 #6, §9):\n// - 401 -> refresh the token (rotation, via TokenManager) and retry ONCE\n// - 429 -> honor X-RateLimit-Reset (NOT Retry-After) and retry (safe: request was\n// rejected, not processed)\n// - 5xx / network error -> retry IDEMPOTENT requests only (GET/HEAD) with\n// exponential backoff + jitter. Writes are never auto-retried (no\n// universal idempotency key).\n\nimport type { TokenManager } from \"./token-manager.js\";\n\nexport interface RetryOptions {\n maxRetries?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n}\n\nexport interface HttpDeps {\n tokenManager?: TokenManager;\n fetch?: typeof fetch;\n sleep?: (ms: number) => Promise<void>;\n now?: () => number;\n /** Deterministic jitter source for tests; defaults to Math.random. */\n random?: () => number;\n retry?: RetryOptions;\n}\n\ntype FetchInput = Parameters<typeof fetch>[0];\n\nconst IDEMPOTENT = new Set([\"GET\", \"HEAD\", \"OPTIONS\"]);\n\nfunction methodOf(input: FetchInput, init?: RequestInit): string {\n if (init?.method) return init.method.toUpperCase();\n if (input instanceof Request) return input.method.toUpperCase();\n return \"GET\";\n}\n\n/**\n * Compute how long to wait for a 429, reading X-RateLimit-Reset. The header may be\n * either an absolute epoch-seconds timestamp or a delta in seconds — handle both.\n * Bounded so a misbehaving header can't hang the caller.\n */\nexport function rateLimitWaitMs(response: Response, now: number, maxDelayMs: number): number {\n const raw = response.headers.get(\"x-ratelimit-reset\");\n if (!raw) return Math.min(1000, maxDelayMs);\n const n = Number(raw);\n if (!Number.isFinite(n)) return Math.min(1000, maxDelayMs);\n // Heuristic: values larger than ~now-in-seconds are absolute epoch timestamps.\n const wait = n > 1_000_000_000 ? n * 1000 - now : n * 1000;\n return Math.max(0, Math.min(wait, maxDelayMs));\n}\n\nfunction backoffMs(attempt: number, opts: Required<RetryOptions>, random: () => number): number {\n const exp = opts.baseDelayMs * 2 ** attempt;\n const jitter = exp * 0.5 * random();\n return Math.min(exp + jitter, opts.maxDelayMs);\n}\n\nexport function createFetch(deps: HttpDeps): typeof fetch {\n const baseFetch = deps.fetch ?? fetch;\n const sleep = deps.sleep ?? ((ms: number) => new Promise<void>((r) => setTimeout(r, ms)));\n const now = deps.now ?? Date.now;\n const random = deps.random ?? Math.random;\n const retry: Required<RetryOptions> = {\n maxRetries: deps.retry?.maxRetries ?? 2,\n baseDelayMs: deps.retry?.baseDelayMs ?? 250,\n maxDelayMs: deps.retry?.maxDelayMs ?? 60_000,\n };\n\n return async function wrappedFetch(input: FetchInput, init?: RequestInit): Promise<Response> {\n const method = methodOf(input, init);\n const idempotent = IDEMPOTENT.has(method);\n const isRequest = input instanceof Request;\n let refreshed = false;\n let attempt = 0;\n let retryToken: string | undefined; // set after a refresh, applied to the next attempt\n\n // Issue the request for one attempt. CRITICAL: a `Request` body is a single-use\n // stream — the hey-api client hands us a `Request`, and the first fetch consumes\n // it, so we must NOT re-dispatch the same object on a retry. Clone per attempt\n // (leaving `input` pristine), overriding the bearer after a refresh. For the\n // (url, init) form, a string body is freely re-sendable.\n const dispatch = (authToken?: string): Promise<Response> => {\n if (isRequest) {\n const fresh = (input as Request).clone();\n if (authToken === undefined) return baseFetch(fresh);\n const headers = new Headers(fresh.headers);\n headers.set(\"Authorization\", `Bearer ${authToken}`);\n return baseFetch(new Request(fresh, { headers }));\n }\n const nextInit =\n authToken === undefined\n ? init\n : (() => {\n const headers = new Headers(init?.headers);\n headers.set(\"Authorization\", `Bearer ${authToken}`);\n return { ...init, headers };\n })();\n return baseFetch(input, nextInit);\n };\n\n for (;;) {\n let response: Response | undefined;\n let networkError: unknown;\n try {\n response = await dispatch(retryToken);\n } catch (err) {\n networkError = err;\n }\n\n // --- 401: refresh once, then retry (any method — a 401 means the request was\n // rejected before processing, so re-sending is safe; the per-attempt clone makes\n // body-bearing writes replayable). ---\n if (response?.status === 401 && !refreshed && deps.tokenManager?.canRefresh) {\n refreshed = true;\n const next = await deps.tokenManager.refresh();\n retryToken = next.accessToken;\n continue;\n }\n\n // --- 429: honor X-RateLimit-Reset, retry (bounded) ---\n if (response?.status === 429 && attempt < retry.maxRetries) {\n attempt++;\n await sleep(rateLimitWaitMs(response, now(), retry.maxDelayMs));\n continue;\n }\n\n // --- 5xx / network: retry idempotent only ---\n const transient = networkError !== undefined || (response !== undefined && response.status >= 500);\n if (transient && idempotent && attempt < retry.maxRetries) {\n attempt++;\n await sleep(backoffMs(attempt, retry, random));\n continue;\n }\n\n if (response) return response;\n throw networkError;\n }\n };\n}\n","// OAuth 2.0 helpers. The contract review established:\n// - BOTH authorization_code + PKCE (user flows) AND client_credentials (server, read:public)\n// - refresh tokens ROTATE: every refresh returns a NEW refresh token that MUST be persisted\n//\n// HOST SPLIT: /authorize and /token live on different hosts by purpose.\n// - /token (+ refresh) is on api.wefunder.com — the edge gateway routes by the\n// credential's mode segment (form-body client_id for /oauth/token), so a pk_test_\n// grant mints in the sandbox cluster and a pk_live_ grant in live. ONE token host\n// for both modes; do NOT route by prefix here. (wefunder.com/oauth/token still works\n// as a transition alias but mints into live — wrong for sandbox once the gateway is\n// in front of the API, so we default to the gateway host.)\n// - /authorize is the browser consent redirect (needs the human session). Live consent\n// is on wefunder.com; sandbox (pk_test_) consent is on the canonical sandbox host\n// oauth.wefunder-sandbox.com. createAuthorizationUrl picks by client_id prefix.\n// All hosts remain independently overridable (authorizeBaseUrl / tokenBaseUrl).\n//\n// These helpers are framework-agnostic and depend only on Web Crypto + fetch (Node 18+).\n\nimport { createHash, randomBytes } from \"node:crypto\";\n\n/** Host for the LIVE browser /authorize redirect (pk_live_ / default). */\nexport const DEFAULT_AUTHORIZE_BASE_URL = \"https://wefunder.com/oauth\";\n\n/** Host for the SANDBOX browser /authorize redirect (pk_test_). Canonical, client_id-derivable. */\nexport const SANDBOX_AUTHORIZE_BASE_URL = \"https://oauth.wefunder-sandbox.com/oauth\";\n\n// Host for /token (+ refresh). The edge gateway routes test/live by the client_id mode,\n// so one host serves both. Callers can override via `tokenBaseUrl`.\nexport const DEFAULT_TOKEN_BASE_URL = \"https://api.wefunder.com/oauth\";\n\n/**\n * @deprecated Use `authorizeBaseUrl` / `tokenBaseUrl` instead. Kept as a convenience\n * alias that sets BOTH hosts at once. Equals the authorize default today.\n */\nexport const DEFAULT_OAUTH_BASE_URL = DEFAULT_AUTHORIZE_BASE_URL;\n\n/** Hosts can be set together (`oauthBaseUrl`) or independently. Precedence: specific > alias > default. */\nexport interface OAuthHostOptions {\n /** Overrides BOTH hosts. Prefer the specific options below. */\n oauthBaseUrl?: string;\n /** Host for the /authorize redirect. */\n authorizeBaseUrl?: string;\n /** Host for /token + refresh. */\n tokenBaseUrl?: string;\n}\n\n/** The default authorize host for a client_id: sandbox host for pk_test_, else live. */\nfunction defaultAuthorizeBase(clientId: string): string {\n return clientId.startsWith(\"pk_test_\") ? SANDBOX_AUTHORIZE_BASE_URL : DEFAULT_AUTHORIZE_BASE_URL;\n}\n\nexport function resolveTokenBase(o: OAuthHostOptions): string {\n return o.tokenBaseUrl ?? o.oauthBaseUrl ?? DEFAULT_TOKEN_BASE_URL;\n}\n\nexport interface TokenSet {\n accessToken: string;\n refreshToken?: string;\n /** Epoch milliseconds at which the access token expires (if the server told us). */\n expiresAt?: number;\n scope?: string;\n tokenType?: string;\n}\n\ninterface RawTokenResponse {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n scope?: string;\n token_type?: string;\n}\n\nfunction toTokenSet(raw: RawTokenResponse, now: number): TokenSet {\n return {\n accessToken: raw.access_token,\n refreshToken: raw.refresh_token,\n expiresAt: raw.expires_in ? now + raw.expires_in * 1000 : undefined,\n scope: raw.scope,\n tokenType: raw.token_type,\n };\n}\n\nasync function postToken(\n oauthBaseUrl: string,\n params: Record<string, string>,\n fetchImpl: typeof fetch,\n now: () => number,\n): Promise<TokenSet> {\n const res = await fetchImpl(`${oauthBaseUrl}/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams(params).toString(),\n });\n if (!res.ok) {\n let detail = \"\";\n try {\n detail = JSON.stringify(await res.json());\n } catch {\n detail = await res.text().catch(() => \"\");\n }\n throw new Error(`OAuth token request failed (${res.status}): ${detail}`);\n }\n return toTokenSet((await res.json()) as RawTokenResponse, now());\n}\n\n// ---- PKCE (authorization_code) ----\n\nexport interface Pkce {\n codeVerifier: string;\n codeChallenge: string;\n codeChallengeMethod: \"S256\";\n}\n\nfunction base64Url(buf: Buffer): string {\n return buf.toString(\"base64\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\n/** Generate a PKCE verifier/challenge pair (RFC 7636, S256). */\nexport function generatePkce(): Pkce {\n const codeVerifier = base64Url(randomBytes(32));\n const codeChallenge = base64Url(createHash(\"sha256\").update(codeVerifier).digest());\n return { codeVerifier, codeChallenge, codeChallengeMethod: \"S256\" };\n}\n\nexport interface AuthorizationUrlOptions extends OAuthHostOptions {\n clientId: string;\n redirectUri: string;\n scopes: string[];\n /** Opaque CSRF token you generate and verify on callback. */\n state: string;\n pkce: Pkce;\n}\n\n/** Build the URL to redirect a user to for the authorization_code + PKCE flow. */\nexport function createAuthorizationUrl(opts: AuthorizationUrlOptions): string {\n // Explicit override wins; otherwise pick the host from the client_id mode\n // (pk_test_ → sandbox consent host, else live). The token host is separate.\n const base = opts.authorizeBaseUrl ?? opts.oauthBaseUrl ?? defaultAuthorizeBase(opts.clientId);\n const q = new URLSearchParams({\n response_type: \"code\",\n client_id: opts.clientId,\n redirect_uri: opts.redirectUri,\n scope: opts.scopes.join(\" \"),\n state: opts.state,\n code_challenge: opts.pkce.codeChallenge,\n code_challenge_method: opts.pkce.codeChallengeMethod,\n });\n return `${base}/authorize?${q.toString()}`;\n}\n\nexport interface ExchangeCodeOptions extends OAuthHostOptions {\n clientId: string;\n /** Public (PKCE) clients omit this; confidential clients pass it. */\n clientSecret?: string;\n code: string;\n redirectUri: string;\n codeVerifier: string;\n fetch?: typeof fetch;\n now?: () => number;\n}\n\n/** Exchange an authorization code (+ PKCE verifier) for a token set. */\nexport function exchangeCode(opts: ExchangeCodeOptions): Promise<TokenSet> {\n const params: Record<string, string> = {\n grant_type: \"authorization_code\",\n client_id: opts.clientId,\n code: opts.code,\n redirect_uri: opts.redirectUri,\n code_verifier: opts.codeVerifier,\n };\n if (opts.clientSecret) params.client_secret = opts.clientSecret;\n return postToken(resolveTokenBase(opts), params, opts.fetch ?? fetch, opts.now ?? Date.now);\n}\n\n// ---- client_credentials (server-to-server, read:public) ----\n\nexport interface ClientCredentialsOptions extends OAuthHostOptions {\n clientId: string;\n clientSecret: string;\n scopes?: string[];\n fetch?: typeof fetch;\n now?: () => number;\n}\n\nexport function clientCredentialsGrant(opts: ClientCredentialsOptions): Promise<TokenSet> {\n const params: Record<string, string> = {\n grant_type: \"client_credentials\",\n client_id: opts.clientId,\n client_secret: opts.clientSecret,\n };\n if (opts.scopes?.length) params.scope = opts.scopes.join(\" \");\n return postToken(resolveTokenBase(opts), params, opts.fetch ?? fetch, opts.now ?? Date.now);\n}\n\n// ---- refresh with ROTATION ----\n\nexport interface RefreshOptions extends OAuthHostOptions {\n clientId: string;\n clientSecret?: string;\n refreshToken: string;\n fetch?: typeof fetch;\n now?: () => number;\n}\n\n/**\n * Refresh an access token. CRITICAL: the returned TokenSet carries a NEW refresh\n * token (rotation). The caller MUST persist it — reusing the old refresh token\n * after rotation results in a permanent 401. The client/TokenManager handles this.\n */\nexport function refreshToken(opts: RefreshOptions): Promise<TokenSet> {\n const params: Record<string, string> = {\n grant_type: \"refresh_token\",\n client_id: opts.clientId,\n refresh_token: opts.refreshToken,\n };\n if (opts.clientSecret) params.client_secret = opts.clientSecret;\n return postToken(resolveTokenBase(opts), params, opts.fetch ?? fetch, opts.now ?? Date.now);\n}\n","// Typed errors mapped from the REAL Wefunder error envelope. Confirmed against\n// api/v2/base_controller.rb#render_error (and the doorkeeper render options):\n// { \"error\": { \"type\", \"message\", \"details\"?, \"request_id\", \"remediation\"? } }\n// NOTE: request_id and remediation are NESTED under `error` (not top-level) — the\n// spec's Error schema models neither, but the runtime always emits request_id.\n\nexport interface WefunderErrorBody {\n error?: {\n type?: string;\n message?: string;\n details?: unknown;\n request_id?: string;\n remediation?: string;\n };\n // Defensive: some envelopes (e.g. *WithMeta success meta) carry request_id here.\n request_id?: string;\n}\n\n/** Response header carrying the partner-facing request id (Stripe-style `req_…`). */\nexport const REQUEST_ID_HEADER = \"x-wf-request-id\";\n\n/** Prefer the X-Wf-Request-Id response header; fall back to a body-derived id. */\nexport function requestIdFrom(response: Response | undefined, bodyRequestId: string | undefined): string | undefined {\n return response?.headers.get(REQUEST_ID_HEADER) ?? bodyRequestId;\n}\n\nexport class WefunderError extends Error {\n readonly status: number;\n readonly type: string;\n readonly requestId?: string;\n readonly details?: unknown;\n /** Server-provided hint on how to resolve the error, when present. */\n readonly remediation?: string;\n /** Documentation pointer surfaced to developers in stack traces / logs. */\n readonly documentationUrl = \"https://docs.wefunder.com/api-reference\";\n\n constructor(args: {\n status: number;\n type: string;\n message: string;\n requestId?: string;\n details?: unknown;\n remediation?: string;\n }) {\n super(args.message);\n this.name = \"WefunderError\";\n this.status = args.status;\n this.type = args.type;\n this.requestId = args.requestId;\n this.details = args.details;\n this.remediation = args.remediation;\n }\n}\n\n/** Raised when token refresh is needed but no refresh token / refresher is configured. */\nexport class WefunderAuthError extends WefunderError {\n constructor(message: string) {\n super({ status: 401, type: \"unauthorized\", message });\n this.name = \"WefunderAuthError\";\n }\n}\n\n/**\n * Build a WefunderError from a failed Response. Reads the typed envelope from the\n * body; falls back gracefully when the body isn't the expected shape.\n */\nexport async function errorFromResponse(response: Response): Promise<WefunderError> {\n let body: WefunderErrorBody | undefined;\n try {\n body = (await response.clone().json()) as WefunderErrorBody;\n } catch {\n // non-JSON body (e.g. an HTML 502 from the edge) — keep body undefined\n }\n const err = body?.error ?? {};\n return new WefunderError({\n status: response.status,\n type: err.type ?? \"api_error\",\n message: err.message ?? response.statusText ?? \"Request failed\",\n // X-Wf-Request-Id is set on every authenticated response (base_controller.rb),\n // so it's present even when the body isn't JSON (e.g. an HTML 502 from the edge),\n // unlike the nested error.request_id. Prefer the header; fall back to the body.\n requestId: requestIdFrom(response, err.request_id ?? body?.request_id),\n details: err.details,\n remediation: err.remediation,\n });\n}\n","// Holds the live token state and owns token recovery + persistence. Two recovery\n// strategies, picked automatically:\n// - refresh_token (user flows): rotates — every refresh returns a NEW refresh\n// token, persisted BEFORE the next request can use it (the CRITICAL invariant).\n// - re-mint (client_credentials): cc tokens have NO refresh token, but a client\n// built via fromClientCredentials holds the grant inputs, so it can mint a fresh\n// token on expiry/401 instead of throwing. (Stress-test finding A.)\n// Either way, concurrent callers share one in-flight promise so a burst of 401s\n// fires a single recovery (no rotation race / thundering herd).\n\nimport { refreshToken, resolveTokenBase, type TokenSet, type OAuthHostOptions } from \"./oauth.js\";\nimport { WefunderAuthError } from \"./errors.js\";\n\n/** Pluggable persistence for the rotating token set (DB row, secrets manager, etc.). */\nexport interface TokenStore {\n load?(): Promise<TokenSet | undefined> | TokenSet | undefined;\n save(tokens: TokenSet): Promise<void> | void;\n}\n\nexport interface TokenManagerOptions extends OAuthHostOptions {\n tokens: TokenSet;\n clientId?: string;\n clientSecret?: string;\n /**\n * For client_credentials clients: mint a fresh token from the stored grant inputs.\n * When set (and there's no refresh token), this is the recovery strategy.\n */\n reMint?: () => Promise<TokenSet>;\n /** Called with the new TokenSet on every successful recovery (rotation or re-mint). */\n onTokenRefresh?: (tokens: TokenSet) => void | Promise<void>;\n store?: TokenStore;\n fetch?: typeof fetch;\n now?: () => number;\n /** Refresh proactively when the access token is within this many ms of expiry. */\n expiryLeewayMs?: number;\n}\n\nexport class TokenManager {\n #tokens: TokenSet;\n readonly #clientId?: string;\n readonly #clientSecret?: string;\n readonly #reMint?: () => Promise<TokenSet>;\n readonly #tokenBaseUrl: string;\n readonly #onTokenRefresh?: (tokens: TokenSet) => void | Promise<void>;\n readonly #store?: TokenStore;\n readonly #fetch: typeof fetch;\n readonly #now: () => number;\n readonly #leeway: number;\n #inflight: Promise<TokenSet> | undefined;\n\n constructor(opts: TokenManagerOptions) {\n this.#tokens = opts.tokens;\n this.#clientId = opts.clientId;\n this.#clientSecret = opts.clientSecret;\n this.#reMint = opts.reMint;\n this.#tokenBaseUrl = resolveTokenBase(opts);\n this.#onTokenRefresh = opts.onTokenRefresh;\n this.#store = opts.store;\n this.#fetch = opts.fetch ?? fetch;\n this.#now = opts.now ?? Date.now;\n this.#leeway = opts.expiryLeewayMs ?? 30_000;\n }\n\n get current(): TokenSet {\n return this.#tokens;\n }\n\n /** True if the manager can recover an expired token (rotate a refresh token or re-mint). */\n get canRefresh(): boolean {\n return Boolean((this.#tokens.refreshToken && this.#clientId) || this.#reMint);\n }\n\n /** Returns a valid access token, refreshing proactively if it's expired/near-expiry. */\n async getAccessToken(): Promise<string> {\n const { expiresAt } = this.#tokens;\n if (expiresAt !== undefined && this.#now() >= expiresAt - this.#leeway && this.canRefresh) {\n await this.refresh();\n }\n return this.#tokens.accessToken;\n }\n\n /**\n * Recover an expired/rejected token (e.g. after a 401): rotates the refresh token\n * if there is one, otherwise re-mints (client_credentials). Coalesces concurrent\n * calls into one network round-trip, then persists. Returns the new token set.\n */\n async refresh(): Promise<TokenSet> {\n if (this.#inflight) return this.#inflight;\n const strategy = this.#recoveryStrategy();\n if (!strategy) {\n throw new WefunderAuthError(\n \"Access token expired and no refresh token / re-mint capability is configured.\",\n );\n }\n this.#inflight = (async () => {\n const next = await strategy();\n this.#tokens = next;\n await this.#store?.save(next);\n await this.#onTokenRefresh?.(next);\n return next;\n })();\n try {\n return await this.#inflight;\n } finally {\n this.#inflight = undefined;\n }\n }\n\n // Pick the recovery strategy: refresh_token rotation, else cc re-mint, else none.\n #recoveryStrategy(): (() => Promise<TokenSet>) | undefined {\n const refreshTokenValue = this.#tokens.refreshToken;\n if (refreshTokenValue && this.#clientId) {\n const clientId = this.#clientId;\n return async () => {\n const next = await refreshToken({\n clientId,\n clientSecret: this.#clientSecret,\n refreshToken: refreshTokenValue,\n tokenBaseUrl: this.#tokenBaseUrl,\n fetch: this.#fetch,\n now: this.#now,\n });\n // Some servers omit a fresh refresh_token on rotation-disabled flows;\n // keep the previous one rather than dropping our ability to refresh.\n if (!next.refreshToken) next.refreshToken = refreshTokenValue;\n return next;\n };\n }\n return this.#reMint;\n }\n}\n","// Lazy auto-pagination. The cursor is treated as an OPAQUE token (plan §4.1 #5):\n// different endpoints back it with an int id, an ISO timestamp, or an offset, so we\n// never inspect or arithmetic it — we just feed `meta.next_cursor` back verbatim.\n// Streams items one page at a time (never buffers the whole result set).\n\nexport type Cursor = string | number;\n\nexport interface Page<T> {\n data?: T[] | null;\n meta?: {\n has_more?: boolean;\n next_cursor?: Cursor | null;\n [k: string]: unknown;\n };\n}\n\n/** Fetches a single page given an opaque cursor (undefined = first page). */\nexport type PageFetcher<T> = (cursor?: Cursor) => Promise<Page<T>>;\n\n/** Yields every item across all pages, lazily. */\nexport async function* paginate<T>(fetchPage: PageFetcher<T>): AsyncGenerator<T> {\n let cursor: Cursor | undefined;\n const seen = new Set<Cursor>();\n for (;;) {\n const page = await fetchPage(cursor);\n for (const item of page.data ?? []) yield item;\n\n const meta = page.meta ?? {};\n const next = meta.next_cursor;\n // Stop conditions: explicit has_more=false, no next cursor, or a cursor that\n // doesn't advance (defensive guard against an endpoint that loops).\n if (meta.has_more === false) return;\n if (next === undefined || next === null) return;\n if (seen.has(next)) return;\n seen.add(next);\n cursor = next;\n }\n}\n\n/** Collect all items into an array. Convenience over `paginate` for small result sets. */\nexport async function collect<T>(fetchPage: PageFetcher<T>): Promise<T[]> {\n const out: T[] = [];\n for await (const item of paginate(fetchPage)) out.push(item);\n return out;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type {\n Client,\n ClientMeta,\n Options as Options2,\n RequestResult,\n TDataShape,\n} from \"./client\";\nimport { client } from \"./client.gen\";\nimport type {\n ApproveSyndicateMemberData,\n ApproveSyndicateMemberErrors,\n ApproveSyndicateMemberResponses,\n CloseSyndicateDealData,\n CloseSyndicateDealErrors,\n CreateIntentData,\n CreateIntentErrors,\n CreateIntentResponses,\n CreatePartnerInviteData,\n CreatePartnerInviteErrors,\n CreatePartnerInviteResponses,\n CreateWebhookSubscriptionData,\n CreateWebhookSubscriptionErrors,\n CreateWebhookSubscriptionResponses,\n DeleteWebhookSubscriptionData,\n DeleteWebhookSubscriptionErrors,\n DeleteWebhookSubscriptionResponses,\n DemoteSyndicateMemberData,\n DemoteSyndicateMemberErrors,\n DemoteSyndicateMemberResponses,\n ExportSyndicateMembersCsvData,\n ExportSyndicateMembersCsvErrors,\n ExportSyndicateMembersCsvResponses,\n FinalizeSyndicateDealData,\n FinalizeSyndicateDealErrors,\n GetAttributionMeData,\n GetAttributionMeErrors,\n GetAttributionMeResponses,\n GetAttributionStatsData,\n GetAttributionStatsErrors,\n GetAttributionStatsResponses,\n GetCurrentUserData,\n GetCurrentUserErrors,\n GetCurrentUserResponses,\n GetIntentData,\n GetIntentErrors,\n GetIntentResponses,\n GetOfferingData,\n GetOfferingErrors,\n GetOfferingResponses,\n GetSyndicateData,\n GetSyndicateDealData,\n GetSyndicateDealErrors,\n GetSyndicateDealResponses,\n GetSyndicateErrors,\n GetSyndicateResponses,\n GetSyndicateStatisticsData,\n GetSyndicateStatisticsErrors,\n GetSyndicateStatisticsResponses,\n GetWebhookSubscriptionData,\n GetWebhookSubscriptionErrors,\n GetWebhookSubscriptionResponses,\n HideSyndicateMemberData,\n HideSyndicateMemberErrors,\n HideSyndicateMemberResponses,\n InviteSyndicateMemberData,\n InviteSyndicateMemberErrors,\n InviteSyndicateMemberResponses,\n ListActivityData,\n ListActivityErrors,\n ListActivityResponses,\n ListAttributedInvestmentsData,\n ListAttributedInvestmentsErrors,\n ListAttributedInvestmentsResponses,\n ListAttributionCampaignsData,\n ListAttributionCampaignsErrors,\n ListAttributionCampaignsResponses,\n ListCampaignsData,\n ListCampaignsErrors,\n ListCampaignsResponses,\n ListConnectedAppsData,\n ListConnectedAppsErrors,\n ListConnectedAppsResponses,\n ListIntentsData,\n ListIntentsErrors,\n ListIntentsResponses,\n ListInvestmentsData,\n ListInvestmentsErrors,\n ListInvestmentsResponses,\n ListOfferingsData,\n ListOfferingsErrors,\n ListOfferingsResponses,\n ListPartnerInvitesData,\n ListPartnerInvitesErrors,\n ListPartnerInvitesResponses,\n ListSyndicateDealInvestorsData,\n ListSyndicateDealInvestorsErrors,\n ListSyndicateDealInvestorsResponses,\n ListSyndicateDealsData,\n ListSyndicateDealsErrors,\n ListSyndicateDealsResponses,\n ListSyndicateMemberInvestmentsData,\n ListSyndicateMemberInvestmentsErrors,\n ListSyndicateMemberInvestmentsResponses,\n ListSyndicateMembersData,\n ListSyndicateMembersErrors,\n ListSyndicateMembersResponses,\n ListSyndicatesData,\n ListSyndicatesErrors,\n ListSyndicatesResponses,\n ListWebhookSubscriptionsData,\n ListWebhookSubscriptionsErrors,\n ListWebhookSubscriptionsResponses,\n PromoteSyndicateMemberData,\n PromoteSyndicateMemberErrors,\n PromoteSyndicateMemberResponses,\n ReactivateWebhookSubscriptionData,\n ReactivateWebhookSubscriptionErrors,\n ReactivateWebhookSubscriptionResponses,\n RegenerateWebhookSecretData,\n RegenerateWebhookSecretErrors,\n RegenerateWebhookSecretResponses,\n RegisterAsPartnerData,\n RegisterAsPartnerErrors,\n RegisterAsPartnerResponses,\n RemoveSyndicateMemberData,\n RemoveSyndicateMemberErrors,\n ReorderSyndicateMembersData,\n ReorderSyndicateMembersErrors,\n ReorderSyndicateMembersResponses,\n ResendSyndicateInviteData,\n ResendSyndicateInviteErrors,\n ResendSyndicateInviteResponses,\n RestoreSyndicateMemberData,\n RestoreSyndicateMemberErrors,\n RestoreSyndicateMemberResponses,\n RevokeConnectedAppData,\n RevokeConnectedAppErrors,\n RevokeConnectedAppResponses,\n RevokePartnerInviteData,\n RevokePartnerInviteErrors,\n RevokePartnerInviteResponses,\n TestWebhookSubscriptionData,\n TestWebhookSubscriptionErrors,\n TestWebhookSubscriptionResponses,\n UpdateSyndicateData,\n UpdateSyndicateErrors,\n UpdateSyndicateMemberData,\n UpdateSyndicateMemberErrors,\n UpdateSyndicateMemberResponses,\n UpdateSyndicateResponses,\n} from \"./types.gen\";\n\nexport type Options<\n TData extends TDataShape = TDataShape,\n ThrowOnError extends boolean = boolean,\n TResponse = unknown,\n> = 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?: keyof ClientMeta extends never ? Record<string, unknown> : ClientMeta;\n};\n\n/**\n * List public offerings\n *\n * Returns the offerings shown on wefunder.com/explore — the curated set of companies that\n * meet Wefunder's discoverability bar (a soft-confirmed traction threshold plus approval),\n * **one offering per company**. An \"offering\" is a fundraise, addressed by its `ofr_`\n * external id.\n *\n * This is a public, read-only endpoint backed by the `read:public` scope. It is reachable\n * with either a server-side (client_credentials) token or a user access token carrying\n * `read:public`. Private rounds (e.g. Reg D 506(b)) are never listed, and low-traction or\n * unapproved companies are excluded — exactly as they are on the website.\n *\n * Order with `sort` (default: most raised); paginate with `cursor`. `meta.total_count` is\n * the number of offerings across all pages.\n *\n * Use this endpoint to:\n * - Discover and monitor active deals\n * - Build deal aggregators and public listings\n *\n */\nexport const listOfferings = <ThrowOnError extends boolean = false>(\n options?: Options<ListOfferingsData, ThrowOnError>,\n): RequestResult<ListOfferingsResponses, ListOfferingsErrors, ThrowOnError> =>\n (options?.client ?? client).get<\n ListOfferingsResponses,\n ListOfferingsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/explore\",\n ...options,\n });\n\n/**\n * Get a public offering\n *\n * Retrieves a single public offering by its `ofr_` external id.\n *\n * A valid id for a non-public offering (e.g. a private Reg D 506(b) round) returns `404` —\n * having an id does not make an offering publicly resolvable.\n *\n */\nexport const getOffering = <ThrowOnError extends boolean = false>(\n options: Options<GetOfferingData, ThrowOnError>,\n): RequestResult<GetOfferingResponses, GetOfferingErrors, ThrowOnError> =>\n (options.client ?? client).get<\n GetOfferingResponses,\n GetOfferingErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/offerings/{external_id}\",\n ...options,\n });\n\n/**\n * Get current user profile\n *\n * Retrieves the profile information for the currently authenticated user. This endpoint returns\n * basic user details including name, email, and account status.\n *\n * Use this endpoint to:\n * - Display user information in your application\n * - Verify the identity of the authenticated user\n * - Check user account status and permissions\n *\n * The response includes the user's unique ID which can be used to reference the user in other API calls.\n *\n */\nexport const getCurrentUser = <ThrowOnError extends boolean = false>(\n options?: Options<GetCurrentUserData, ThrowOnError>,\n): RequestResult<GetCurrentUserResponses, GetCurrentUserErrors, ThrowOnError> =>\n (options?.client ?? client).get<\n GetCurrentUserResponses,\n GetCurrentUserErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/users/me\",\n ...options,\n });\n\n/**\n * List user investments\n *\n * Retrieves a paginated list of all investments made by the authenticated user. Each investment\n * includes details about the amount invested, the company, investment date, and current status.\n *\n * Use this endpoint to:\n * - Display a user's investment portfolio\n * - Track investment history and performance\n * - Build custom reporting and analytics\n *\n * The list is ordered by investment date (newest first) and supports cursor-based pagination\n * for efficient iteration through large portfolios. Each investment object includes the\n * campaign details and current valuation information.\n *\n */\nexport const listInvestments = <ThrowOnError extends boolean = false>(\n options?: Options<ListInvestmentsData, ThrowOnError>,\n): RequestResult<\n ListInvestmentsResponses,\n ListInvestmentsErrors,\n ThrowOnError\n> =>\n (options?.client ?? client).get<\n ListInvestmentsResponses,\n ListInvestmentsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/investments\",\n ...options,\n });\n\n/**\n * List founder campaigns\n *\n * Retrieves all fundraising campaigns for companies where the authenticated user is a founder.\n * This endpoint returns comprehensive campaign data including funding progress, investor counts,\n * and campaign status.\n *\n * Use this endpoint to:\n * - Build custom founder dashboards\n * - Monitor fundraising progress across multiple campaigns\n * - Generate reports on campaign performance\n * - Integrate campaign data into your own tools\n *\n * Only founders with the appropriate permissions can access this endpoint. The response includes\n * both active and closed campaigns, with detailed metrics for each.\n *\n */\nexport const listCampaigns = <ThrowOnError extends boolean = false>(\n options?: Options<ListCampaignsData, ThrowOnError>,\n): RequestResult<ListCampaignsResponses, ListCampaignsErrors, ThrowOnError> =>\n (options?.client ?? client).get<\n ListCampaignsResponses,\n ListCampaignsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns\",\n ...options,\n });\n\n/**\n * List syndicates\n *\n * Returns syndicates the authenticated user can manage, based on their roles.\n * Results can be filtered by status and sorted by name or creation date.\n *\n */\nexport const listSyndicates = <ThrowOnError extends boolean = false>(\n options?: Options<ListSyndicatesData, ThrowOnError>,\n): RequestResult<ListSyndicatesResponses, ListSyndicatesErrors, ThrowOnError> =>\n (options?.client ?? client).get<\n ListSyndicatesResponses,\n ListSyndicatesErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates\",\n ...options,\n });\n\n/**\n * Get syndicate details\n *\n * Returns full details for a specific syndicate including settings, team configuration, and summary metrics.\n */\nexport const getSyndicate = <ThrowOnError extends boolean = false>(\n options: Options<GetSyndicateData, ThrowOnError>,\n): RequestResult<GetSyndicateResponses, GetSyndicateErrors, ThrowOnError> =>\n (options.client ?? client).get<\n GetSyndicateResponses,\n GetSyndicateErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}\",\n ...options,\n });\n\n/**\n * Update syndicate settings\n *\n * Update syndicate configuration. Currently supports name, description, and tagline.\n * Requires `write:syndicates` scope and at least operator permission.\n *\n */\nexport const updateSyndicate = <ThrowOnError extends boolean = false>(\n options: Options<UpdateSyndicateData, ThrowOnError>,\n): RequestResult<\n UpdateSyndicateResponses,\n UpdateSyndicateErrors,\n ThrowOnError\n> =>\n (options.client ?? client).patch<\n UpdateSyndicateResponses,\n UpdateSyndicateErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * List members\n *\n * Returns the member directory for a syndicate with role, status, tags, sidebar notes,\n * and investment history summaries. Supports filtering, sorting, search, and pagination.\n *\n */\nexport const listSyndicateMembers = <ThrowOnError extends boolean = false>(\n options: Options<ListSyndicateMembersData, ThrowOnError>,\n): RequestResult<\n ListSyndicateMembersResponses,\n ListSyndicateMembersErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n ListSyndicateMembersResponses,\n ListSyndicateMembersErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members\",\n ...options,\n });\n\n/**\n * Invite member\n *\n * Send an invitation to join the syndicate by email.\n */\nexport const inviteSyndicateMember = <ThrowOnError extends boolean = false>(\n options: Options<InviteSyndicateMemberData, ThrowOnError>,\n): RequestResult<\n InviteSyndicateMemberResponses,\n InviteSyndicateMemberErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n InviteSyndicateMemberResponses,\n InviteSyndicateMemberErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/invite\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Remove member (requires intent)\n *\n * Removing a member is irreversible and requires human approval through the Intent system.\n * This endpoint always returns 422 with a `use_intents` error directing you to\n * `POST /v2/intents` with action `syndicates.remove_member`.\n *\n */\nexport const removeSyndicateMember = <ThrowOnError extends boolean = false>(\n options: Options<RemoveSyndicateMemberData, ThrowOnError>,\n): RequestResult<unknown, RemoveSyndicateMemberErrors, ThrowOnError> =>\n (options.client ?? client).delete<\n unknown,\n RemoveSyndicateMemberErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}\",\n ...options,\n });\n\n/**\n * Update member\n *\n * Update title and carry override for a member. Requires operator permission.\n */\nexport const updateSyndicateMember = <ThrowOnError extends boolean = false>(\n options: Options<UpdateSyndicateMemberData, ThrowOnError>,\n): RequestResult<\n UpdateSyndicateMemberResponses,\n UpdateSyndicateMemberErrors,\n ThrowOnError\n> =>\n (options.client ?? client).patch<\n UpdateSyndicateMemberResponses,\n UpdateSyndicateMemberErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Approve applicant\n *\n * Approve a pending applicant. Only applicants can be approved via API; invitees must accept their invite link.\n */\nexport const approveSyndicateMember = <ThrowOnError extends boolean = false>(\n options: Options<ApproveSyndicateMemberData, ThrowOnError>,\n): RequestResult<\n ApproveSyndicateMemberResponses,\n ApproveSyndicateMemberErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n ApproveSyndicateMemberResponses,\n ApproveSyndicateMemberErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}/approve\",\n ...options,\n });\n\n/**\n * Exile member\n *\n * Exile (hide) a member from the syndicate. Sets their role to exiled.\n */\nexport const hideSyndicateMember = <ThrowOnError extends boolean = false>(\n options: Options<HideSyndicateMemberData, ThrowOnError>,\n): RequestResult<\n HideSyndicateMemberResponses,\n HideSyndicateMemberErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n HideSyndicateMemberResponses,\n HideSyndicateMemberErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}/hide\",\n ...options,\n });\n\n/**\n * Promote member to admin\n *\n * Promote a member to full_access (admin) role. Only the syndicate creator can promote members.\n */\nexport const promoteSyndicateMember = <ThrowOnError extends boolean = false>(\n options: Options<PromoteSyndicateMemberData, ThrowOnError>,\n): RequestResult<\n PromoteSyndicateMemberResponses,\n PromoteSyndicateMemberErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n PromoteSyndicateMemberResponses,\n PromoteSyndicateMemberErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}/promote\",\n ...options,\n });\n\n/**\n * Demote member to operator\n *\n * Demote a member from full_access (admin) to operator permission.\n */\nexport const demoteSyndicateMember = <ThrowOnError extends boolean = false>(\n options: Options<DemoteSyndicateMemberData, ThrowOnError>,\n): RequestResult<\n DemoteSyndicateMemberResponses,\n DemoteSyndicateMemberErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n DemoteSyndicateMemberResponses,\n DemoteSyndicateMemberErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}/demote\",\n ...options,\n });\n\n/**\n * Restore exiled or resigned member\n *\n * Restore a member who was previously exiled or resigned. Sets their role back to member.\n */\nexport const restoreSyndicateMember = <ThrowOnError extends boolean = false>(\n options: Options<RestoreSyndicateMemberData, ThrowOnError>,\n): RequestResult<\n RestoreSyndicateMemberResponses,\n RestoreSyndicateMemberErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n RestoreSyndicateMemberResponses,\n RestoreSyndicateMemberErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}/restore\",\n ...options,\n });\n\n/**\n * Resend invitation\n */\nexport const resendSyndicateInvite = <ThrowOnError extends boolean = false>(\n options: Options<ResendSyndicateInviteData, ThrowOnError>,\n): RequestResult<\n ResendSyndicateInviteResponses,\n ResendSyndicateInviteErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n ResendSyndicateInviteResponses,\n ResendSyndicateInviteErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}/resend_invite\",\n ...options,\n });\n\n/**\n * Reorder members\n *\n * Set the display order for the member directory.\n */\nexport const reorderSyndicateMembers = <ThrowOnError extends boolean = false>(\n options: Options<ReorderSyndicateMembersData, ThrowOnError>,\n): RequestResult<\n ReorderSyndicateMembersResponses,\n ReorderSyndicateMembersErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n ReorderSyndicateMembersResponses,\n ReorderSyndicateMembersErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/reorder\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Export members CSV\n *\n * Generate a CSV export of the member directory. Returns the CSV data directly\n * with Content-Type text/csv. Requires operator permission.\n *\n */\nexport const exportSyndicateMembersCsv = <ThrowOnError extends boolean = false>(\n options: Options<ExportSyndicateMembersCsvData, ThrowOnError>,\n): RequestResult<\n ExportSyndicateMembersCsvResponses,\n ExportSyndicateMembersCsvErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n ExportSyndicateMembersCsvResponses,\n ExportSyndicateMembersCsvErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/export_csv\",\n ...options,\n });\n\n/**\n * List deals\n *\n * Returns all deals (fundraises) within a syndicate with status, terms, and metrics.\n */\nexport const listSyndicateDeals = <ThrowOnError extends boolean = false>(\n options: Options<ListSyndicateDealsData, ThrowOnError>,\n): RequestResult<\n ListSyndicateDealsResponses,\n ListSyndicateDealsErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n ListSyndicateDealsResponses,\n ListSyndicateDealsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/deals\",\n ...options,\n });\n\n/**\n * Get deal details\n *\n * Returns full details for a specific deal including investor breakdown.\n */\nexport const getSyndicateDeal = <ThrowOnError extends boolean = false>(\n options: Options<GetSyndicateDealData, ThrowOnError>,\n): RequestResult<\n GetSyndicateDealResponses,\n GetSyndicateDealErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n GetSyndicateDealResponses,\n GetSyndicateDealErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/deals/{fundraise_id}\",\n ...options,\n });\n\n/**\n * List deal investors\n *\n * Returns syndicate members who invested in this deal. Results are scoped to\n * syndicate member user IDs only and sorted by amount descending.\n *\n * The `user_email` field is **moderator-only** — it returns null for non-moderator\n * callers (i.e., users who are not a manager/operator of the syndicate).\n *\n * All monetary values are strings representing cents to avoid floating-point precision issues.\n *\n */\nexport const listSyndicateDealInvestors = <\n ThrowOnError extends boolean = false,\n>(\n options: Options<ListSyndicateDealInvestorsData, ThrowOnError>,\n): RequestResult<\n ListSyndicateDealInvestorsResponses,\n ListSyndicateDealInvestorsErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n ListSyndicateDealInvestorsResponses,\n ListSyndicateDealInvestorsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/deals/{fundraise_id}/investors\",\n ...options,\n });\n\n/**\n * List member investments\n *\n * Returns this member's investments in syndicate deals. Scoped to the syndicate's\n * selected deals (one per company, matching directory semantics).\n *\n * All monetary values are strings representing cents to avoid floating-point precision issues.\n *\n */\nexport const listSyndicateMemberInvestments = <\n ThrowOnError extends boolean = false,\n>(\n options: Options<ListSyndicateMemberInvestmentsData, ThrowOnError>,\n): RequestResult<\n ListSyndicateMemberInvestmentsResponses,\n ListSyndicateMemberInvestmentsErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n ListSyndicateMemberInvestmentsResponses,\n ListSyndicateMemberInvestmentsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}/investments\",\n ...options,\n });\n\n/**\n * Get syndicate statistics\n *\n * Returns aggregate metrics for a syndicate including member counts, deal counts,\n * total raised, and recent activity.\n *\n * `total_raised` and `total_investors` are computed from directory-selected deals\n * (one per company). `total_deals` and `live_deals` use all linked deals.\n *\n * All monetary values are strings representing cents to avoid floating-point precision issues.\n *\n */\nexport const getSyndicateStatistics = <ThrowOnError extends boolean = false>(\n options: Options<GetSyndicateStatisticsData, ThrowOnError>,\n): RequestResult<\n GetSyndicateStatisticsResponses,\n GetSyndicateStatisticsErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n GetSyndicateStatisticsResponses,\n GetSyndicateStatisticsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/statistics\",\n ...options,\n });\n\n/**\n * Close deal (requires intent)\n *\n * Closing a deal is irreversible and requires human approval through the Intent system.\n * This endpoint always returns 422 with a `use_intents` error directing you to\n * `POST /v2/intents` with action `syndicates.close_deal`.\n *\n */\nexport const closeSyndicateDeal = <ThrowOnError extends boolean = false>(\n options: Options<CloseSyndicateDealData, ThrowOnError>,\n): RequestResult<unknown, CloseSyndicateDealErrors, ThrowOnError> =>\n (options.client ?? client).post<\n unknown,\n CloseSyndicateDealErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/deals/{fundraise_id}/close\",\n ...options,\n });\n\n/**\n * Finalize deal (requires intent)\n *\n * Finalizing a deal triggers disbursement and is irreversible. It requires human approval\n * through the Intent system. This endpoint always returns 422 with a `use_intents` error\n * directing you to `POST /v2/intents` with action `syndicates.finalize_deal`.\n *\n */\nexport const finalizeSyndicateDeal = <ThrowOnError extends boolean = false>(\n options: Options<FinalizeSyndicateDealData, ThrowOnError>,\n): RequestResult<unknown, FinalizeSyndicateDealErrors, ThrowOnError> =>\n (options.client ?? client).post<\n unknown,\n FinalizeSyndicateDealErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/deals/{fundraise_id}/finalize\",\n ...options,\n });\n\n/**\n * List intents\n *\n * List intents created by the current token, optionally filtered by status or resource.\n */\nexport const listIntents = <ThrowOnError extends boolean = false>(\n options?: Options<ListIntentsData, ThrowOnError>,\n): RequestResult<ListIntentsResponses, ListIntentsErrors, ThrowOnError> =>\n (options?.client ?? client).get<\n ListIntentsResponses,\n ListIntentsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/intents\",\n ...options,\n });\n\n/**\n * Propose an intent\n *\n * Propose a dangerous or irreversible action for human approval. Returns a `review_url`\n * where a human must review the impact and approve before the action executes.\n *\n * The entity that proposes an intent can never approve it. Approval always happens\n * on Wefunder's UI by a user with permission on the resource.\n *\n * See [Intents documentation](/concepts/intents) for the full pattern.\n *\n */\nexport const createIntent = <ThrowOnError extends boolean = false>(\n options: Options<CreateIntentData, ThrowOnError>,\n): RequestResult<CreateIntentResponses, CreateIntentErrors, ThrowOnError> =>\n (options.client ?? client).post<\n CreateIntentResponses,\n CreateIntentErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/intents\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Get intent status\n *\n * Check the current status of an intent. Use this to poll for approval\n * after proposing an intent, or subscribe to `intent.*` webhook events instead.\n *\n */\nexport const getIntent = <ThrowOnError extends boolean = false>(\n options: Options<GetIntentData, ThrowOnError>,\n): RequestResult<GetIntentResponses, GetIntentErrors, ThrowOnError> =>\n (options.client ?? client).get<\n GetIntentResponses,\n GetIntentErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/intents/{intent_id}\",\n ...options,\n });\n\n/**\n * List activity events\n *\n * Returns actions taken by OAuth apps authorized by the current user.\n * This is the API backing the user-facing activity feed at Settings > Activity.\n *\n */\nexport const listActivity = <ThrowOnError extends boolean = false>(\n options?: Options<ListActivityData, ThrowOnError>,\n): RequestResult<ListActivityResponses, ListActivityErrors, ThrowOnError> =>\n (options?.client ?? client).get<\n ListActivityResponses,\n ListActivityErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/activity\",\n ...options,\n });\n\n/**\n * List connected apps\n *\n * Returns all OAuth apps the user has authorized, with summary stats.\n */\nexport const listConnectedApps = <ThrowOnError extends boolean = false>(\n options?: Options<ListConnectedAppsData, ThrowOnError>,\n): RequestResult<\n ListConnectedAppsResponses,\n ListConnectedAppsErrors,\n ThrowOnError\n> =>\n (options?.client ?? client).get<\n ListConnectedAppsResponses,\n ListConnectedAppsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/connected-apps\",\n ...options,\n });\n\n/**\n * Revoke connected app\n *\n * Revoke all tokens for this app. Any pending intents from this app are automatically expired.\n *\n */\nexport const revokeConnectedApp = <ThrowOnError extends boolean = false>(\n options: Options<RevokeConnectedAppData, ThrowOnError>,\n): RequestResult<\n RevokeConnectedAppResponses,\n RevokeConnectedAppErrors,\n ThrowOnError\n> =>\n (options.client ?? client).delete<\n RevokeConnectedAppResponses,\n RevokeConnectedAppErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/connected-apps/{app_id}\",\n ...options,\n });\n\n/**\n * Get aggregate attribution statistics\n *\n * Returns aggregate attribution statistics for a campaign. This is a **Tier 0** endpoint\n * available to all OAuth applications with the `read:attribution:aggregate` scope.\n *\n * Use this endpoint to:\n * - Track overall marketing campaign performance\n * - Measure conversion rates by UTM source/campaign\n * - Monitor investment quality metrics\n * - Build performance dashboards\n *\n * The response includes totals and breakdowns by UTM parameters. All counts exclude\n * disputed attributions.\n *\n * **Privacy**: This endpoint returns aggregate data only. No individual investor\n * information is exposed.\n *\n */\nexport const getAttributionStats = <ThrowOnError extends boolean = false>(\n options: Options<GetAttributionStatsData, ThrowOnError>,\n): RequestResult<\n GetAttributionStatsResponses,\n GetAttributionStatsErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n GetAttributionStatsResponses,\n GetAttributionStatsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/stats\",\n ...options,\n });\n\n/**\n * List attributed investments\n *\n * Returns a list of attributed investments. The detail level depends on your access:\n *\n * **Tier 1 (Marketing Partners)** - Anonymized data:\n * - Investor identity represented by opaque tokens (not real IDs)\n * - Tokens are campaign-scoped (different token per campaign for same investor)\n * - Investment amounts shown as tiers (small/medium/large), not exact values\n * - No PII (email, name, address) is returned\n *\n * **Tier 2 (Founders/Employees)** - Full data with `detail_level=full`:\n * - Real investment IDs (linkable to Wefunder admin)\n * - Investor name, email, and username\n * - Exact dollar amounts\n *\n * **Access**: Requires Tier 1+ access approval from Wefunder admin.\n *\n */\nexport const listAttributedInvestments = <ThrowOnError extends boolean = false>(\n options: Options<ListAttributedInvestmentsData, ThrowOnError>,\n): RequestResult<\n ListAttributedInvestmentsResponses,\n ListAttributedInvestmentsErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n ListAttributedInvestmentsResponses,\n ListAttributedInvestmentsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/investments\",\n ...options,\n });\n\n/**\n * List attribution webhook subscriptions\n *\n * Returns all active webhook subscriptions for this campaign belonging to\n * your OAuth application.\n *\n * **Tier 1** endpoint requiring admin-approved access with the\n * `read:attribution:anonymized` scope.\n *\n */\nexport const listWebhookSubscriptions = <ThrowOnError extends boolean = false>(\n options: Options<ListWebhookSubscriptionsData, ThrowOnError>,\n): RequestResult<\n ListWebhookSubscriptionsResponses,\n ListWebhookSubscriptionsErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n ListWebhookSubscriptionsResponses,\n ListWebhookSubscriptionsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/webhooks\",\n ...options,\n });\n\n/**\n * Create webhook subscription\n *\n * Creates a new webhook subscription for this campaign. When attributed\n * investments change state, we'll POST a JSON payload to your target URL.\n *\n * **Tier 1** endpoint requiring admin-approved access.\n *\n * ## Webhook Payload\n *\n * Payloads include anonymized data (tokens, amount tiers) matching the\n * `/attribution/investments` endpoint.\n *\n * ## Security\n *\n * - `target_url` must use HTTPS\n * - `target_url` cannot resolve to private/internal IPs (SSRF protection)\n * - Payloads are signed with HMAC-SHA256 using the returned `secret`\n *\n * ## Verification\n *\n * Verify webhook signatures using the `X-Wefunder-Signature` header:\n * ```\n * timestamp = headers['X-Wefunder-Timestamp']\n * signature = headers['X-Wefunder-Signature']\n * expected = \"sha256=\" + HMAC-SHA256(secret, timestamp + \".\" + raw_body)\n * ```\n *\n * Reject requests where:\n * - Signature doesn't match\n * - Timestamp is more than 5 minutes old (replay protection)\n *\n */\nexport const createWebhookSubscription = <ThrowOnError extends boolean = false>(\n options: Options<CreateWebhookSubscriptionData, ThrowOnError>,\n): RequestResult<\n CreateWebhookSubscriptionResponses,\n CreateWebhookSubscriptionErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n CreateWebhookSubscriptionResponses,\n CreateWebhookSubscriptionErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/webhooks\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Delete webhook subscription\n *\n * Deactivates a webhook subscription. The subscription will stop receiving\n * events but historical delivery data is retained for 7 days.\n *\n */\nexport const deleteWebhookSubscription = <ThrowOnError extends boolean = false>(\n options: Options<DeleteWebhookSubscriptionData, ThrowOnError>,\n): RequestResult<\n DeleteWebhookSubscriptionResponses,\n DeleteWebhookSubscriptionErrors,\n ThrowOnError\n> =>\n (options.client ?? client).delete<\n DeleteWebhookSubscriptionResponses,\n DeleteWebhookSubscriptionErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/webhooks/{webhook_id}\",\n ...options,\n });\n\n/**\n * Get webhook subscription details\n *\n * Returns details for a specific webhook subscription including recent\n * delivery history.\n *\n */\nexport const getWebhookSubscription = <ThrowOnError extends boolean = false>(\n options: Options<GetWebhookSubscriptionData, ThrowOnError>,\n): RequestResult<\n GetWebhookSubscriptionResponses,\n GetWebhookSubscriptionErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n GetWebhookSubscriptionResponses,\n GetWebhookSubscriptionErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/webhooks/{webhook_id}\",\n ...options,\n });\n\n/**\n * Send test webhook\n *\n * Sends a test webhook to verify your endpoint is working correctly.\n * The test payload includes a `\"event\": \"test\"` field to distinguish\n * it from real events.\n *\n */\nexport const testWebhookSubscription = <ThrowOnError extends boolean = false>(\n options: Options<TestWebhookSubscriptionData, ThrowOnError>,\n): RequestResult<\n TestWebhookSubscriptionResponses,\n TestWebhookSubscriptionErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n TestWebhookSubscriptionResponses,\n TestWebhookSubscriptionErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/webhooks/{webhook_id}/test\",\n ...options,\n });\n\n/**\n * Regenerate webhook signing secret\n *\n * Generates a new HMAC signing secret for the webhook subscription.\n * The old secret is immediately invalidated.\n *\n * **Important**: Store the new secret securely - it cannot be retrieved later.\n *\n */\nexport const regenerateWebhookSecret = <ThrowOnError extends boolean = false>(\n options: Options<RegenerateWebhookSecretData, ThrowOnError>,\n): RequestResult<\n RegenerateWebhookSecretResponses,\n RegenerateWebhookSecretErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n RegenerateWebhookSecretResponses,\n RegenerateWebhookSecretErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/webhooks/{webhook_id}/regenerate_secret\",\n ...options,\n });\n\n/**\n * Reactivate disabled webhook\n *\n * Reactivates a webhook subscription that was auto-disabled after\n * consecutive failures. Resets the failure counter to 0.\n *\n * Use this after fixing issues with your webhook endpoint.\n *\n */\nexport const reactivateWebhookSubscription = <\n ThrowOnError extends boolean = false,\n>(\n options: Options<ReactivateWebhookSubscriptionData, ThrowOnError>,\n): RequestResult<\n ReactivateWebhookSubscriptionResponses,\n ReactivateWebhookSubscriptionErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n ReactivateWebhookSubscriptionResponses,\n ReactivateWebhookSubscriptionErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/webhooks/{webhook_id}/reactivate\",\n ...options,\n });\n\n/**\n * Get current user's attribution profile\n *\n * Returns the authenticated user's marketing partner profile and connected campaigns.\n * If the user is not registered as a marketing partner, returns partner info as null.\n *\n */\nexport const getAttributionMe = <ThrowOnError extends boolean = false>(\n options?: Options<GetAttributionMeData, ThrowOnError>,\n): RequestResult<\n GetAttributionMeResponses,\n GetAttributionMeErrors,\n ThrowOnError\n> =>\n (options?.client ?? client).get<\n GetAttributionMeResponses,\n GetAttributionMeErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/attribution/me\",\n ...options,\n });\n\n/**\n * List campaigns accessible to the current user\n *\n * Returns all campaigns the authenticated user can access for attribution data.\n * For founders, this includes their own campaigns.\n * For marketing partners, this includes campaigns they've been granted access to.\n *\n */\nexport const listAttributionCampaigns = <ThrowOnError extends boolean = false>(\n options?: Options<ListAttributionCampaignsData, ThrowOnError>,\n): RequestResult<\n ListAttributionCampaignsResponses,\n ListAttributionCampaignsErrors,\n ThrowOnError\n> =>\n (options?.client ?? client).get<\n ListAttributionCampaignsResponses,\n ListAttributionCampaignsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/attribution/campaigns\",\n ...options,\n });\n\n/**\n * Register as a marketing partner\n *\n * Registers the authenticated user as a marketing partner.\n * After registration, the partner can create invites to request access to campaigns.\n *\n */\nexport const registerAsPartner = <ThrowOnError extends boolean = false>(\n options: Options<RegisterAsPartnerData, ThrowOnError>,\n): RequestResult<\n RegisterAsPartnerResponses,\n RegisterAsPartnerErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n RegisterAsPartnerResponses,\n RegisterAsPartnerErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/attribution/partners/register\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * List partner invites\n *\n * Returns all invites created by or sent to the authenticated user.\n * Includes both pending and accepted invites.\n *\n */\nexport const listPartnerInvites = <ThrowOnError extends boolean = false>(\n options?: Options<ListPartnerInvitesData, ThrowOnError>,\n): RequestResult<\n ListPartnerInvitesResponses,\n ListPartnerInvitesErrors,\n ThrowOnError\n> =>\n (options?.client ?? client).get<\n ListPartnerInvitesResponses,\n ListPartnerInvitesErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/attribution/invites\",\n ...options,\n });\n\n/**\n * Create a partner invite\n *\n * Creates an invite to establish a partner-company connection.\n *\n * **Directions**:\n * - `partner_to_founder`: Marketing partner invites a founder to grant access\n * - `founder_to_partner`: Founder invites a marketing partner to access their campaign\n *\n * For `partner_to_founder`: Creates a shareable invite link.\n * For `founder_to_partner`: Sends an email to the partner.\n *\n */\nexport const createPartnerInvite = <ThrowOnError extends boolean = false>(\n options: Options<CreatePartnerInviteData, ThrowOnError>,\n): RequestResult<\n CreatePartnerInviteResponses,\n CreatePartnerInviteErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n CreatePartnerInviteResponses,\n CreatePartnerInviteErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/attribution/invites\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Revoke a partner invite\n *\n * Revokes a pending invite. Only the creator can revoke an invite.\n * Accepted invites cannot be revoked (delete the connection instead).\n *\n */\nexport const revokePartnerInvite = <ThrowOnError extends boolean = false>(\n options: Options<RevokePartnerInviteData, ThrowOnError>,\n): RequestResult<\n RevokePartnerInviteResponses,\n RevokePartnerInviteErrors,\n ThrowOnError\n> =>\n (options.client ?? client).delete<\n RevokePartnerInviteResponses,\n RevokePartnerInviteErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/attribution/invites/{token}\",\n ...options,\n });\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport {\n type Client,\n type ClientOptions,\n type Config,\n createClient,\n createConfig,\n} 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> = (\n override?: Config<ClientOptions & T>,\n) => Config<Required<ClientOptions> & T>;\n\nexport const client: Client = createClient(createConfig<ClientOptions2>());\n","// The Wefunder client — the stable, hand-written public surface over the generated\n// layer. Wires: single API base (the edge proxy routes live/sandbox by token prefix,\n// so we do NOT route by prefix — plan §4.2 #1), a pinned Wefunder-Version, the\n// retry/refresh fetch wrapper, token rotation, typed-error unwrapping, and lazy\n// auto-pagination. Resource namespaces cover the common GA paths; `raw` exposes\n// every generated operation, pre-bound, as an escape hatch.\n\nimport { createClient, type Client } from \"./generated/client/index.js\";\nimport { createFetch, type RetryOptions } from \"./http.js\";\nimport { TokenManager, type TokenStore } from \"./token-manager.js\";\nimport { WefunderError, requestIdFrom } from \"./errors.js\";\nimport { clientCredentialsGrant, type TokenSet, type OAuthHostOptions } from \"./oauth.js\";\nimport { paginate, collect, type Cursor, type Page } from \"./pagination.js\";\nimport * as ops from \"./generated/sdk.gen.js\";\nimport type {\n User,\n Investment,\n Offering,\n Campaign,\n Syndicate,\n Intent,\n AttributionMe,\n ListOfferingsData,\n} from \"./generated/types.gen.js\";\n\n/** Documented `sort` values for the offerings list, from the generated op. */\nexport type OfferingSort = NonNullable<ListOfferingsData[\"query\"]>[\"sort\"];\n\n// Version-free base — the edge gateway serves the API at the host root; `/api/v2`\n// remains a working back-compat alias. The API version is pinned via the\n// `Wefunder-Version` header (DEFAULT_API_VERSION), not the path.\nexport const DEFAULT_API_BASE_URL = \"https://api.wefunder.com\";\nexport const DEFAULT_API_VERSION = \"2025-01-15\";\n\nexport type Mode = \"live\" | \"test\" | \"unknown\";\n\nexport function modeForToken(token: string): Mode {\n if (token.startsWith(\"at_live_\")) return \"live\";\n if (token.startsWith(\"at_test_\")) return \"test\";\n return \"unknown\";\n}\n\nexport interface WefunderOptions extends OAuthHostOptions {\n /** A bearer access token. Either this or `tokens` is required. */\n accessToken?: string;\n /** A full token set (access + rotating refresh). Enables auto-refresh. */\n tokens?: TokenSet;\n /** Needed (with the refresh token) to auto-refresh on expiry/401. */\n clientId?: string;\n clientSecret?: string;\n /**\n * Marks this as a client_credentials client so the SDK auto-re-mints on expiry/401\n * (cc tokens have no refresh token). `fromClientCredentials` sets this for you.\n */\n clientCredentials?: { scopes?: string[] };\n apiVersion?: string;\n /** Override the API base. The edge proxy routes mode by token prefix — leave default in prod. */\n baseUrl?: string;\n // OAuth hosts (oauthBaseUrl / authorizeBaseUrl / tokenBaseUrl) come from OAuthHostOptions.\n store?: TokenStore;\n onTokenRefresh?: (tokens: TokenSet) => void | Promise<void>;\n retry?: RetryOptions;\n // --- injectables (testing) ---\n fetch?: typeof fetch;\n now?: () => number;\n sleep?: (ms: number) => Promise<void>;\n random?: () => number;\n}\n\ntype Result<T> = Promise<{ data?: T; error?: unknown; response?: Response }>;\n\n/** Every generated operation, pre-bound to this client. */\ntype RawOps = {\n [K in keyof typeof ops]: (typeof ops)[K] extends (o: infer O) => infer R\n ? (options?: Omit<O & object, \"client\">) => R\n : never;\n};\n\nexport class Wefunder {\n readonly mode: Mode;\n readonly raw: RawOps;\n #client: Client;\n #tokens: TokenManager;\n\n constructor(opts: WefunderOptions) {\n const tokenSet: TokenSet | undefined =\n opts.tokens ?? (opts.accessToken ? { accessToken: opts.accessToken } : undefined);\n if (!tokenSet) {\n throw new Error(\"Wefunder: provide `accessToken` or `tokens`.\");\n }\n this.mode = modeForToken(tokenSet.accessToken);\n\n // For client_credentials clients, build a re-mint closure from the stored grant\n // inputs so the TokenManager can recover expired tokens (which have no refresh token).\n const reMint =\n opts.clientCredentials && opts.clientId && opts.clientSecret\n ? () =>\n clientCredentialsGrant({\n clientId: opts.clientId!,\n clientSecret: opts.clientSecret!,\n scopes: opts.clientCredentials!.scopes,\n oauthBaseUrl: opts.oauthBaseUrl,\n tokenBaseUrl: opts.tokenBaseUrl,\n fetch: opts.fetch,\n now: opts.now,\n })\n : undefined;\n\n this.#tokens = new TokenManager({\n tokens: tokenSet,\n clientId: opts.clientId,\n clientSecret: opts.clientSecret,\n reMint,\n oauthBaseUrl: opts.oauthBaseUrl,\n tokenBaseUrl: opts.tokenBaseUrl,\n onTokenRefresh: opts.onTokenRefresh,\n store: opts.store,\n fetch: opts.fetch,\n now: opts.now,\n });\n\n const wrappedFetch = createFetch({\n tokenManager: this.#tokens,\n fetch: opts.fetch,\n now: opts.now,\n sleep: opts.sleep,\n random: opts.random,\n retry: opts.retry,\n });\n\n this.#client = createClient({\n baseUrl: opts.baseUrl ?? DEFAULT_API_BASE_URL,\n headers: { \"Wefunder-Version\": opts.apiVersion ?? DEFAULT_API_VERSION },\n auth: () => this.#tokens.getAccessToken(),\n fetch: wrappedFetch,\n });\n\n this.raw = this.#buildRaw();\n }\n\n /** Server-to-server: exchange client credentials for a token, then build a client. */\n static async fromClientCredentials(\n opts: OAuthHostOptions & {\n clientId: string;\n clientSecret: string;\n scopes?: string[];\n apiVersion?: string;\n baseUrl?: string;\n fetch?: typeof fetch;\n now?: () => number;\n },\n ): Promise<Wefunder> {\n const tokens = await clientCredentialsGrant({\n clientId: opts.clientId,\n clientSecret: opts.clientSecret,\n scopes: opts.scopes,\n oauthBaseUrl: opts.oauthBaseUrl,\n tokenBaseUrl: opts.tokenBaseUrl,\n fetch: opts.fetch,\n now: opts.now,\n });\n return new Wefunder({\n tokens,\n clientId: opts.clientId,\n clientSecret: opts.clientSecret,\n clientCredentials: { scopes: opts.scopes }, // enables auto-re-mint on expiry/401\n oauthBaseUrl: opts.oauthBaseUrl,\n tokenBaseUrl: opts.tokenBaseUrl,\n apiVersion: opts.apiVersion,\n baseUrl: opts.baseUrl,\n fetch: opts.fetch,\n now: opts.now,\n });\n }\n\n /** The live token set (e.g. to persist after construction). */\n get tokens(): TokenSet {\n return this.#tokens.current;\n }\n\n // ---- unwrap: turn the {data,error,response} result into data-or-throw ----\n async #unwrap<T>(p: Result<T>): Promise<T> {\n const { data, error, response } = await p;\n if (response && response.ok && error === undefined) return data as T;\n const status = response?.status ?? 0;\n // The runtime error envelope nests request_id + remediation UNDER `error`\n // (api/v2/base_controller.rb#render_error), even though the spec's Error\n // schema models neither. Read them from there; fall back to top-level.\n const env = (error ?? {}) as {\n error?: { type?: string; message?: string; details?: unknown; request_id?: string; remediation?: string };\n request_id?: string;\n };\n throw new WefunderError({\n status,\n type: env.error?.type ?? \"api_error\",\n message: env.error?.message ?? response?.statusText ?? \"Request failed\",\n // X-Wf-Request-Id header is primary (present even on non-JSON edge errors).\n requestId: requestIdFrom(response, env.error?.request_id ?? env.request_id),\n details: env.error?.details,\n remediation: env.error?.remediation,\n });\n }\n\n // Single-resource ops return a `{ data: Entity }` envelope; strip it for ergonomics.\n async #unwrapData<T>(p: Result<unknown>): Promise<T> {\n const env = await this.#unwrap<{ data?: T }>(p as Result<{ data?: T }>);\n return env.data as T;\n }\n\n #buildRaw(): RawOps {\n const raw = {} as Record<string, unknown>;\n for (const [name, fn] of Object.entries(ops)) {\n raw[name] = (options?: Record<string, unknown>) =>\n (fn as (o: unknown) => unknown)({ ...options, client: this.#client });\n }\n return raw as RawOps;\n }\n\n /**\n * Unwrap any generated op result (incl. `wf.raw.*`) the way the ergonomic\n * namespaces do: returns the response body on success, throws a typed\n * `WefunderError` (with `request_id`) on failure. Lets `raw` callers keep the\n * SDK's error handling. (Stress-test finding C.)\n */\n unwrap<T>(p: Result<T>): Promise<T> {\n return this.#unwrap(p);\n }\n\n // Generic page helper: forwards the endpoint's full query (cursor + documented\n // params like `sort`), not just the cursor. (Stress-test finding B.)\n #page<T, Q extends { cursor?: Cursor } = { cursor?: Cursor }>(\n fn: (o: { client: Client; query?: Q }) => Result<Page<T>>,\n ) {\n return (query?: Q): Promise<Page<T>> =>\n this.#unwrap(fn({ client: this.#client, query }) as Result<Page<T>>);\n }\n\n // ---- resource namespaces (common GA paths) ----\n\n users = {\n me: () => this.#unwrapData<User>(ops.getCurrentUser({ client: this.#client })),\n };\n\n offerings = {\n list: this.#page<Offering, { cursor?: Cursor; sort?: OfferingSort }>(ops.listOfferings as never),\n all: (query?: { sort?: OfferingSort }): AsyncGenerator<Offering> =>\n paginate((cursor) => this.offerings.list({ ...query, cursor })),\n collect: (query?: { sort?: OfferingSort }): Promise<Offering[]> =>\n collect((cursor) => this.offerings.list({ ...query, cursor })),\n get: (externalId: string) =>\n this.#unwrapData<Offering>(\n ops.getOffering({ client: this.#client, path: { external_id: externalId } }),\n ),\n };\n\n investments = {\n list: this.#page<Investment>(ops.listInvestments as never),\n all: (): AsyncGenerator<Investment> => paginate((cursor) => this.investments.list({ cursor })),\n collect: (): Promise<Investment[]> => collect((cursor) => this.investments.list({ cursor })),\n };\n\n campaigns = {\n list: this.#page<Campaign>(ops.listCampaigns as never),\n all: (): AsyncGenerator<Campaign> => paginate((cursor) => this.campaigns.list({ cursor })),\n collect: (): Promise<Campaign[]> => collect((cursor) => this.campaigns.list({ cursor })),\n };\n\n syndicates = {\n list: this.#page<Syndicate>(ops.listSyndicates as never),\n all: (): AsyncGenerator<Syndicate> => paginate((cursor) => this.syndicates.list({ cursor })),\n get: (id: number | string) =>\n this.#unwrapData<Syndicate>(ops.getSyndicate({ client: this.#client, path: { id } as never })),\n };\n\n intents = {\n list: this.#page<Intent>(ops.listIntents as never),\n all: (): AsyncGenerator<Intent> => paginate((cursor) => this.intents.list({ cursor })),\n get: (id: number | string) =>\n this.#unwrapData<Intent>(ops.getIntent({ client: this.#client, path: { id } as never })),\n };\n\n attribution = {\n me: () => this.#unwrapData<AttributionMe>(ops.getAttributionMe({ client: this.#client })),\n };\n}\n","// Webhook signature verification. Matches the REAL Wefunder attribution webhook\n// scheme (app/jobs/attribution/webhook_delivery_job.rb): the delivery sends\n// X-Wefunder-Signature: sha256=<hex> where hex = HMAC-SHA256(secret, \"<ts>.<rawBody>\")\n// X-Wefunder-Timestamp: <unix seconds>\n// X-Wefunder-Event, X-Wefunder-Delivery-Id\n// We recompute the HMAC over \"<timestamp>.<rawBody>\" and constant-time compare,\n// plus a timestamp tolerance to reject replays (plan §4.2 #4, §9).\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\n\nexport const SIGNATURE_HEADER = \"x-wefunder-signature\";\nexport const TIMESTAMP_HEADER = \"x-wefunder-timestamp\";\nexport const EVENT_HEADER = \"x-wefunder-event\";\nexport const DELIVERY_ID_HEADER = \"x-wefunder-delivery-id\";\n\nexport interface VerifyWebhookOptions {\n /** The exact raw request body bytes/string (NOT a re-serialized object). */\n payload: string;\n /** Value of the X-Wefunder-Signature header (`sha256=<hex>`). */\n signature: string;\n /** Value of the X-Wefunder-Timestamp header (unix seconds). */\n timestamp: string | number;\n secret: string;\n /** Reject if |now - timestamp| exceeds this. Default 300s. Set 0 to disable. */\n toleranceSeconds?: number;\n now?: () => number;\n}\n\nfunction computeSignature(secret: string, timestamp: string | number, payload: string): string {\n const mac = createHmac(\"sha256\", secret).update(`${timestamp}.${payload}`).digest(\"hex\");\n return `sha256=${mac}`;\n}\n\nfunction constantTimeEqual(a: string, b: string): boolean {\n const ab = Buffer.from(a);\n const bb = Buffer.from(b);\n if (ab.length !== bb.length) return false;\n return timingSafeEqual(ab, bb);\n}\n\n/**\n * Returns true iff the signature is valid AND (when tolerance > 0) the timestamp\n * is within tolerance. Does not throw on a bad signature — returns false so the\n * caller can respond 400 without a try/catch.\n */\nexport function verifyWebhook(opts: VerifyWebhookOptions): boolean {\n const tolerance = opts.toleranceSeconds ?? 300;\n const now = (opts.now ?? Date.now)();\n const ts = Number(opts.timestamp);\n if (!Number.isFinite(ts)) return false;\n if (tolerance > 0 && Math.abs(now / 1000 - ts) > tolerance) return false;\n\n const expected = computeSignature(opts.secret, opts.timestamp, opts.payload);\n return constantTimeEqual(opts.signature, expected);\n}\n\nexport interface ParsedWebhook<T = unknown> {\n event: string;\n deliveryId: string;\n timestamp: number;\n data: T;\n}\n\n/**\n * Verify + parse in one step using a header lookup (works with Node's\n * IncomingHttpHeaders, a Headers instance, or a plain object). Returns the parsed\n * event on success; throws on an invalid signature so handlers fail loudly.\n */\nexport function constructEvent<T = unknown>(\n payload: string,\n headers: Headers | Record<string, string | string[] | undefined>,\n secret: string,\n opts?: { toleranceSeconds?: number; now?: () => number },\n): ParsedWebhook<T> {\n const get = (name: string): string | undefined => {\n if (headers instanceof Headers) return headers.get(name) ?? undefined;\n const v = headers[name] ?? headers[name.toLowerCase()];\n return Array.isArray(v) ? v[0] : v;\n };\n const signature = get(SIGNATURE_HEADER);\n const timestamp = get(TIMESTAMP_HEADER);\n if (!signature || !timestamp) {\n throw new Error(\"Missing X-Wefunder-Signature or X-Wefunder-Timestamp header\");\n }\n const ok = verifyWebhook({\n payload,\n signature,\n timestamp,\n secret,\n toleranceSeconds: opts?.toleranceSeconds,\n now: opts?.now,\n });\n if (!ok) throw new Error(\"Webhook signature verification failed\");\n return {\n event: get(EVENT_HEADER) ?? \"\",\n deliveryId: get(DELIVERY_ID_HEADER) ?? \"\",\n timestamp: Number(timestamp),\n data: JSON.parse(payload) as T,\n };\n}\n"],"mappings":"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","names":["joinedValues","config","request","url","import_node_crypto"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/generated/core/bodySerializer.gen.ts","../src/generated/core/params.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/http.ts","../src/oauth.ts","../src/errors.ts","../src/token-manager.ts","../src/pagination.ts","../src/generated/sdk.gen.ts","../src/generated/client.gen.ts","../src/client.ts","../src/webhooks.ts"],"sourcesContent":["// Public API surface for @wefunder/sdk.\n\nexport {\n Wefunder,\n modeForToken,\n DEFAULT_API_BASE_URL,\n DEFAULT_API_VERSION,\n type WefunderOptions,\n type Mode,\n type OfferingSort,\n type IntentStatus,\n} from \"./client.js\";\n\nexport { WefunderError, WefunderAuthError, REQUEST_ID_HEADER } from \"./errors.js\";\n\nexport {\n // PKCE + authorization_code\n generatePkce,\n createAuthorizationUrl,\n exchangeCode,\n // client_credentials\n clientCredentialsGrant,\n // refresh (rotation)\n refreshToken,\n // host config (authorize host vs token host split)\n DEFAULT_AUTHORIZE_BASE_URL,\n SANDBOX_AUTHORIZE_BASE_URL,\n DEFAULT_TOKEN_BASE_URL,\n DEFAULT_OAUTH_BASE_URL,\n type OAuthHostOptions,\n type TokenSet,\n type Pkce,\n type AuthorizationUrlOptions,\n type ExchangeCodeOptions,\n type ClientCredentialsOptions,\n type RefreshOptions,\n} from \"./oauth.js\";\n\nexport { type TokenStore, type TokenManagerOptions } from \"./token-manager.js\";\n\nexport { paginate, collect, type Cursor, type Page, type PageFetcher } from \"./pagination.js\";\n\nexport {\n verifyWebhook,\n constructEvent,\n type VerifyWebhookOptions,\n type ParsedWebhook,\n SIGNATURE_HEADER,\n TIMESTAMP_HEADER,\n EVENT_HEADER,\n DELIVERY_ID_HEADER,\n} from \"./webhooks.js\";\n\n// Re-export all generated model types for consumers (Investment, Syndicate, etc.).\nexport type * from \"./generated/types.gen.js\";\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type {\n ArrayStyle,\n ObjectStyle,\n SerializerOptions,\n} 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 = (\n data: FormData,\n key: string,\n value: unknown,\n): 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 = (\n data: URLSearchParams,\n key: string,\n value: unknown,\n): 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) =>\n typeof value === \"bigint\" ? value.toString() : value,\n ),\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\ntype Slot = \"body\" | \"headers\" | \"path\" | \"query\";\n\nexport type Field =\n | {\n in: Exclude<Slot, \"body\">;\n /**\n * Field name. This is the name we want the user to see and use.\n */\n key: string;\n /**\n * Field mapped name. This is the name we want to use in the request.\n * If omitted, we use the same value as `key`.\n */\n map?: string;\n }\n | {\n in: Extract<Slot, \"body\">;\n /**\n * Key isn't required for bodies.\n */\n key?: string;\n map?: string;\n }\n | {\n /**\n * Field name. This is the name we want the user to see and use.\n */\n key: string;\n /**\n * Field mapped name. This is the name we want to use in the request.\n * If `in` is omitted, `map` aliases `key` to the transport layer.\n */\n map: Slot;\n };\n\nexport interface Fields {\n allowExtra?: Partial<Record<Slot, boolean>>;\n args?: ReadonlyArray<Field>;\n}\n\nexport type FieldsConfig = ReadonlyArray<Field | Fields>;\n\nconst extraPrefixesMap: Record<string, Slot> = {\n $body_: \"body\",\n $headers_: \"headers\",\n $path_: \"path\",\n $query_: \"query\",\n};\nconst extraPrefixes = Object.entries(extraPrefixesMap);\n\ntype KeyMap = Map<\n string,\n | {\n in: Slot;\n map?: string;\n }\n | {\n in?: never;\n map: Slot;\n }\n>;\n\nfunction buildKeyMap(fields: FieldsConfig, map?: KeyMap): KeyMap {\n if (!map) {\n map = new Map();\n }\n\n for (const config of fields) {\n if (\"in\" in config) {\n if (config.key) {\n map.set(config.key, {\n in: config.in,\n map: config.map,\n });\n }\n } else if (\"key\" in config) {\n map.set(config.key, {\n map: config.map,\n });\n } else if (config.args) {\n buildKeyMap(config.args, map);\n }\n }\n\n return map;\n}\n\ninterface Params {\n body?: unknown;\n headers: Record<string, unknown>;\n path: Record<string, unknown>;\n query: Record<string, unknown>;\n}\n\nfunction stripEmptySlots(params: Params): void {\n for (const [slot, value] of Object.entries(params)) {\n if (slot === \"body\") continue;\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n !Object.keys(value).length\n ) {\n delete params[slot as Slot];\n }\n }\n}\n\nexport function buildClientParams(\n args: ReadonlyArray<unknown>,\n fields: FieldsConfig,\n): Params {\n const params: Params = {\n headers: Object.create(null),\n path: Object.create(null),\n query: Object.create(null),\n };\n\n const map = buildKeyMap(fields);\n\n function writeSlot(slot: Slot, key: string, value: unknown): void {\n let record = params[slot] as Record<string, unknown> | undefined;\n if (record === undefined) {\n record = Object.create(null) as Record<string, unknown>;\n params[slot] = record;\n }\n record[key] = value;\n }\n\n let config: FieldsConfig[number] | undefined;\n\n for (const [index, arg] of args.entries()) {\n if (fields[index]) {\n config = fields[index];\n }\n\n if (!config) {\n continue;\n }\n\n if (\"in\" in config) {\n if (config.key) {\n const field = map.get(config.key)!;\n const name = field.map || config.key;\n if (field.in) {\n writeSlot(field.in, name, arg);\n }\n } else {\n params.body = arg;\n }\n } else {\n for (const [key, value] of Object.entries(arg ?? {})) {\n const field = map.get(key);\n\n if (field) {\n if (field.in) {\n const name = field.map || key;\n writeSlot(field.in, name, value);\n } else {\n params[field.map] = value;\n }\n } else {\n const extra = extraPrefixes.find(([prefix]) =>\n key.startsWith(prefix),\n );\n\n if (extra) {\n const [prefix, slot] = extra;\n writeSlot(slot, key.slice(prefix.length), value);\n } else if (\"allowExtra\" in config && config.allowExtra) {\n for (const [slot, allowed] of Object.entries(config.allowExtra)) {\n if (allowed) {\n writeSlot(slot as Slot, key, value);\n break;\n }\n }\n }\n }\n }\n }\n }\n\n stripEmptySlots(params);\n\n return params;\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<\n RequestInit,\n \"method\"\n> &\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<\n TData = unknown,\n TReturn = void,\n TNext = unknown,\n> = {\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 =\n sseSleepFn ??\n ((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)\n throw new Error(\n `SSE failed: ${response.status} ${response.statusText}`,\n );\n\n if (!response.body) throw new Error(\"No body in SSE response\");\n\n const reader = response.body\n .pipeThrough(new TextDecoderStream())\n .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(\n line.replace(/^retry:\\s*/, \"\"),\n 10,\n );\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 (\n sseMaxRetryAttempts !== undefined &&\n attempt >= sseMaxRetryAttempts\n ) {\n break; // stop after firing error\n }\n\n // exponential backoff: double retry each attempt, cap at 30s\n const backoff = Math.min(\n retryDelay * 2 ** (attempt - 1),\n sseMaxRetryDelay ?? 30000,\n );\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>\n 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 = (\n style: ArraySeparatorStyle,\n): \".\" | \";\" | \",\" | \"&\" => {\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 = (\n style: ArraySeparatorStyle,\n): \",\" | \"|\" | \"%20\" => {\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 = (\n style: ObjectSeparatorStyle,\n): \".\" | \";\" | \",\" | \"&\" => {\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}): string => {\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\"\n ? separator + joinedValues\n : joinedValues;\n};\n\nexport const serializePrimitiveParam = ({\n allowReserved,\n name,\n value,\n}: SerializePrimitiveParam): string => {\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}): string => {\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 = [\n ...values,\n key,\n allowReserved ? (v as string) : encodeURIComponent(v as string),\n ];\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\"\n ? separator + joinedValues\n : 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: RegExp = /\\{[^{}]+\\}/g;\n\nexport const defaultPathSerializer = ({\n path,\n url: _url,\n}: PathSerializer): string => {\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(\n match,\n serializeArrayParam({ explode, name, style, value }),\n );\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}): string => {\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}): unknown {\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 * A unique identifier for the security scheme.\n *\n * Defined only when there are multiple security schemes whose `Auth`\n * shape would otherwise be identical.\n */\n key?: string;\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 =\n 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 {\n Client,\n ClientOptions,\n Config,\n RequestOptions,\n} from \"./types.gen\";\n\nexport const createQuerySerializer = <T = unknown>({\n parameters = {},\n ...args\n}: QuerySerializerOptions = {}): ((queryParams: T) => string) => {\n const querySerializer = (queryParams: T): string => {\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 = (\n contentType: string | null,\n): 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 (\n cleanContent.startsWith(\"application/json\") ||\n cleanContent.endsWith(\"+json\")\n ) {\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) =>\n cleanContent.startsWith(type),\n )\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 =\n header instanceof Headers\n ? headersEntries(header)\n : 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> = (\n request: Req,\n options: Options,\n) => 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(\n id: number | Interceptor,\n fn: Interceptor,\n ): 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 {\n Client,\n Config,\n RequestOptions,\n ResolvedRequestOptions,\n} 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<\n Request,\n Response,\n unknown,\n ResolvedRequestOptions\n >();\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\n 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 (\n response.status === 204 ||\n response.headers.get(\"Content-Length\") === \"0\"\n ) {\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(\n finalError,\n response,\n request,\n options as ResolvedRequestOptions,\n );\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 =\n (method: Uppercase<HttpMethod>) => (options: RequestOptions) =>\n request({ ...options, method });\n\n const makeSseFn =\n (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\n BodyInit | null | undefined,\n url,\n });\n };\n\n const _buildUrl: Client[\"buildUrl\"] = (options) =>\n 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","// The retry/refresh fetch wrapper passed to the generated client. Centralizes the\n// three contract-driven behaviors (plan §4.1 #6, §9):\n// - 401 -> refresh the token (rotation, via TokenManager) and retry ONCE\n// - 429 -> honor X-RateLimit-Reset (NOT Retry-After) and retry (safe: request was\n// rejected, not processed)\n// - 5xx / network error -> retry IDEMPOTENT requests only (GET/HEAD) with\n// exponential backoff + jitter. Writes are never auto-retried (no\n// universal idempotency key).\n\nimport type { TokenManager } from \"./token-manager.js\";\n\nexport interface RetryOptions {\n maxRetries?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n}\n\nexport interface HttpDeps {\n tokenManager?: TokenManager;\n fetch?: typeof fetch;\n sleep?: (ms: number) => Promise<void>;\n now?: () => number;\n /** Deterministic jitter source for tests; defaults to Math.random. */\n random?: () => number;\n retry?: RetryOptions;\n}\n\ntype FetchInput = Parameters<typeof fetch>[0];\n\nconst IDEMPOTENT = new Set([\"GET\", \"HEAD\", \"OPTIONS\"]);\n\nfunction methodOf(input: FetchInput, init?: RequestInit): string {\n if (init?.method) return init.method.toUpperCase();\n if (input instanceof Request) return input.method.toUpperCase();\n return \"GET\";\n}\n\n/**\n * Compute how long to wait for a 429, reading X-RateLimit-Reset. The header may be\n * either an absolute epoch-seconds timestamp or a delta in seconds — handle both.\n * Bounded so a misbehaving header can't hang the caller.\n */\nexport function rateLimitWaitMs(response: Response, now: number, maxDelayMs: number): number {\n const raw = response.headers.get(\"x-ratelimit-reset\");\n if (!raw) return Math.min(1000, maxDelayMs);\n const n = Number(raw);\n if (!Number.isFinite(n)) return Math.min(1000, maxDelayMs);\n // Heuristic: values larger than ~now-in-seconds are absolute epoch timestamps.\n const wait = n > 1_000_000_000 ? n * 1000 - now : n * 1000;\n return Math.max(0, Math.min(wait, maxDelayMs));\n}\n\nfunction backoffMs(attempt: number, opts: Required<RetryOptions>, random: () => number): number {\n const exp = opts.baseDelayMs * 2 ** attempt;\n const jitter = exp * 0.5 * random();\n return Math.min(exp + jitter, opts.maxDelayMs);\n}\n\nexport function createFetch(deps: HttpDeps): typeof fetch {\n const baseFetch = deps.fetch ?? fetch;\n const sleep = deps.sleep ?? ((ms: number) => new Promise<void>((r) => setTimeout(r, ms)));\n const now = deps.now ?? Date.now;\n const random = deps.random ?? Math.random;\n const retry: Required<RetryOptions> = {\n maxRetries: deps.retry?.maxRetries ?? 2,\n baseDelayMs: deps.retry?.baseDelayMs ?? 250,\n maxDelayMs: deps.retry?.maxDelayMs ?? 60_000,\n };\n\n return async function wrappedFetch(input: FetchInput, init?: RequestInit): Promise<Response> {\n const method = methodOf(input, init);\n const idempotent = IDEMPOTENT.has(method);\n const isRequest = input instanceof Request;\n let refreshed = false;\n let attempt = 0;\n let retryToken: string | undefined; // set after a refresh, applied to the next attempt\n\n // Issue the request for one attempt. CRITICAL: a `Request` body is a single-use\n // stream — the hey-api client hands us a `Request`, and the first fetch consumes\n // it, so we must NOT re-dispatch the same object on a retry. Clone per attempt\n // (leaving `input` pristine), overriding the bearer after a refresh. For the\n // (url, init) form, a string body is freely re-sendable.\n const dispatch = (authToken?: string): Promise<Response> => {\n if (isRequest) {\n const fresh = (input as Request).clone();\n if (authToken === undefined) return baseFetch(fresh);\n const headers = new Headers(fresh.headers);\n headers.set(\"Authorization\", `Bearer ${authToken}`);\n return baseFetch(new Request(fresh, { headers }));\n }\n const nextInit =\n authToken === undefined\n ? init\n : (() => {\n const headers = new Headers(init?.headers);\n headers.set(\"Authorization\", `Bearer ${authToken}`);\n return { ...init, headers };\n })();\n return baseFetch(input, nextInit);\n };\n\n for (;;) {\n let response: Response | undefined;\n let networkError: unknown;\n try {\n response = await dispatch(retryToken);\n } catch (err) {\n networkError = err;\n }\n\n // --- 401: refresh once, then retry (any method — a 401 means the request was\n // rejected before processing, so re-sending is safe; the per-attempt clone makes\n // body-bearing writes replayable). ---\n if (response?.status === 401 && !refreshed && deps.tokenManager?.canRefresh) {\n refreshed = true;\n const next = await deps.tokenManager.refresh();\n retryToken = next.accessToken;\n continue;\n }\n\n // --- 429: honor X-RateLimit-Reset, retry (bounded) ---\n if (response?.status === 429 && attempt < retry.maxRetries) {\n attempt++;\n await sleep(rateLimitWaitMs(response, now(), retry.maxDelayMs));\n continue;\n }\n\n // --- 5xx / network: retry idempotent only ---\n const transient = networkError !== undefined || (response !== undefined && response.status >= 500);\n if (transient && idempotent && attempt < retry.maxRetries) {\n attempt++;\n await sleep(backoffMs(attempt, retry, random));\n continue;\n }\n\n if (response) return response;\n throw networkError;\n }\n };\n}\n","// OAuth 2.0 helpers. The contract review established:\n// - BOTH authorization_code + PKCE (user flows) AND client_credentials (server, read:public)\n// - refresh tokens ROTATE: every refresh returns a NEW refresh token that MUST be persisted\n//\n// HOST SPLIT: /authorize and /token live on different hosts by purpose.\n// - /token (+ refresh) is on api.wefunder.com — the edge gateway routes by the\n// credential's mode segment (form-body client_id for /oauth/token), so a pk_test_\n// grant mints in the sandbox cluster and a pk_live_ grant in live. ONE token host\n// for both modes; do NOT route by prefix here. (wefunder.com/oauth/token still works\n// as a transition alias but mints into live — wrong for sandbox once the gateway is\n// in front of the API, so we default to the gateway host.)\n// - /authorize is the browser consent redirect (needs the human session). Live consent\n// is on wefunder.com; sandbox (pk_test_) consent is on the canonical sandbox host\n// oauth.wefunder-sandbox.com. createAuthorizationUrl picks by client_id prefix.\n// All hosts remain independently overridable (authorizeBaseUrl / tokenBaseUrl).\n//\n// These helpers are framework-agnostic and depend only on Web Crypto + fetch (Node 18+).\n\nimport { createHash, randomBytes } from \"node:crypto\";\n\n/** Host for the LIVE browser /authorize redirect (pk_live_ / default). */\nexport const DEFAULT_AUTHORIZE_BASE_URL = \"https://wefunder.com/oauth\";\n\n/** Host for the SANDBOX browser /authorize redirect (pk_test_). Canonical, client_id-derivable. */\nexport const SANDBOX_AUTHORIZE_BASE_URL = \"https://oauth.wefunder-sandbox.com/oauth\";\n\n// Host for /token (+ refresh). The edge gateway routes test/live by the client_id mode,\n// so one host serves both. Callers can override via `tokenBaseUrl`.\nexport const DEFAULT_TOKEN_BASE_URL = \"https://api.wefunder.com/oauth\";\n\n/**\n * @deprecated Use `authorizeBaseUrl` / `tokenBaseUrl` instead. Kept as a convenience\n * alias that sets BOTH hosts at once. Equals the authorize default today.\n */\nexport const DEFAULT_OAUTH_BASE_URL = DEFAULT_AUTHORIZE_BASE_URL;\n\n/** Hosts can be set together (`oauthBaseUrl`) or independently. Precedence: specific > alias > default. */\nexport interface OAuthHostOptions {\n /** Overrides BOTH hosts. Prefer the specific options below. */\n oauthBaseUrl?: string;\n /** Host for the /authorize redirect. */\n authorizeBaseUrl?: string;\n /** Host for /token + refresh. */\n tokenBaseUrl?: string;\n}\n\n/** The default authorize host for a client_id: sandbox host for pk_test_, else live. */\nfunction defaultAuthorizeBase(clientId: string): string {\n return clientId.startsWith(\"pk_test_\") ? SANDBOX_AUTHORIZE_BASE_URL : DEFAULT_AUTHORIZE_BASE_URL;\n}\n\nexport function resolveTokenBase(o: OAuthHostOptions): string {\n return o.tokenBaseUrl ?? o.oauthBaseUrl ?? DEFAULT_TOKEN_BASE_URL;\n}\n\nexport interface TokenSet {\n accessToken: string;\n refreshToken?: string;\n /** Epoch milliseconds at which the access token expires (if the server told us). */\n expiresAt?: number;\n scope?: string;\n tokenType?: string;\n}\n\ninterface RawTokenResponse {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n scope?: string;\n token_type?: string;\n}\n\nfunction toTokenSet(raw: RawTokenResponse, now: number): TokenSet {\n return {\n accessToken: raw.access_token,\n refreshToken: raw.refresh_token,\n expiresAt: raw.expires_in ? now + raw.expires_in * 1000 : undefined,\n scope: raw.scope,\n tokenType: raw.token_type,\n };\n}\n\nasync function postToken(\n oauthBaseUrl: string,\n params: Record<string, string>,\n fetchImpl: typeof fetch,\n now: () => number,\n): Promise<TokenSet> {\n const res = await fetchImpl(`${oauthBaseUrl}/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams(params).toString(),\n });\n if (!res.ok) {\n let detail = \"\";\n try {\n detail = JSON.stringify(await res.json());\n } catch {\n detail = await res.text().catch(() => \"\");\n }\n throw new Error(`OAuth token request failed (${res.status}): ${detail}`);\n }\n return toTokenSet((await res.json()) as RawTokenResponse, now());\n}\n\n// ---- PKCE (authorization_code) ----\n\nexport interface Pkce {\n codeVerifier: string;\n codeChallenge: string;\n codeChallengeMethod: \"S256\";\n}\n\nfunction base64Url(buf: Buffer): string {\n return buf.toString(\"base64\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\n/** Generate a PKCE verifier/challenge pair (RFC 7636, S256). */\nexport function generatePkce(): Pkce {\n const codeVerifier = base64Url(randomBytes(32));\n const codeChallenge = base64Url(createHash(\"sha256\").update(codeVerifier).digest());\n return { codeVerifier, codeChallenge, codeChallengeMethod: \"S256\" };\n}\n\nexport interface AuthorizationUrlOptions extends OAuthHostOptions {\n clientId: string;\n redirectUri: string;\n scopes: string[];\n /** Opaque CSRF token you generate and verify on callback. */\n state: string;\n pkce: Pkce;\n}\n\n/** Build the URL to redirect a user to for the authorization_code + PKCE flow. */\nexport function createAuthorizationUrl(opts: AuthorizationUrlOptions): string {\n // Explicit override wins; otherwise pick the host from the client_id mode\n // (pk_test_ → sandbox consent host, else live). The token host is separate.\n const base = opts.authorizeBaseUrl ?? opts.oauthBaseUrl ?? defaultAuthorizeBase(opts.clientId);\n const q = new URLSearchParams({\n response_type: \"code\",\n client_id: opts.clientId,\n redirect_uri: opts.redirectUri,\n scope: opts.scopes.join(\" \"),\n state: opts.state,\n code_challenge: opts.pkce.codeChallenge,\n code_challenge_method: opts.pkce.codeChallengeMethod,\n });\n return `${base}/authorize?${q.toString()}`;\n}\n\nexport interface ExchangeCodeOptions extends OAuthHostOptions {\n clientId: string;\n /** Public (PKCE) clients omit this; confidential clients pass it. */\n clientSecret?: string;\n code: string;\n redirectUri: string;\n codeVerifier: string;\n fetch?: typeof fetch;\n now?: () => number;\n}\n\n/** Exchange an authorization code (+ PKCE verifier) for a token set. */\nexport function exchangeCode(opts: ExchangeCodeOptions): Promise<TokenSet> {\n const params: Record<string, string> = {\n grant_type: \"authorization_code\",\n client_id: opts.clientId,\n code: opts.code,\n redirect_uri: opts.redirectUri,\n code_verifier: opts.codeVerifier,\n };\n if (opts.clientSecret) params.client_secret = opts.clientSecret;\n return postToken(resolveTokenBase(opts), params, opts.fetch ?? fetch, opts.now ?? Date.now);\n}\n\n// ---- client_credentials (server-to-server, read:public) ----\n\nexport interface ClientCredentialsOptions extends OAuthHostOptions {\n clientId: string;\n clientSecret: string;\n scopes?: string[];\n fetch?: typeof fetch;\n now?: () => number;\n}\n\nexport function clientCredentialsGrant(opts: ClientCredentialsOptions): Promise<TokenSet> {\n const params: Record<string, string> = {\n grant_type: \"client_credentials\",\n client_id: opts.clientId,\n client_secret: opts.clientSecret,\n };\n if (opts.scopes?.length) params.scope = opts.scopes.join(\" \");\n return postToken(resolveTokenBase(opts), params, opts.fetch ?? fetch, opts.now ?? Date.now);\n}\n\n// ---- refresh with ROTATION ----\n\nexport interface RefreshOptions extends OAuthHostOptions {\n clientId: string;\n clientSecret?: string;\n refreshToken: string;\n fetch?: typeof fetch;\n now?: () => number;\n}\n\n/**\n * Refresh an access token. CRITICAL: the returned TokenSet carries a NEW refresh\n * token (rotation). The caller MUST persist it — reusing the old refresh token\n * after rotation results in a permanent 401. The client/TokenManager handles this.\n */\nexport function refreshToken(opts: RefreshOptions): Promise<TokenSet> {\n const params: Record<string, string> = {\n grant_type: \"refresh_token\",\n client_id: opts.clientId,\n refresh_token: opts.refreshToken,\n };\n if (opts.clientSecret) params.client_secret = opts.clientSecret;\n return postToken(resolveTokenBase(opts), params, opts.fetch ?? fetch, opts.now ?? Date.now);\n}\n","// Typed errors mapped from the REAL Wefunder error envelope. Confirmed against\n// api/v2/base_controller.rb#render_error (and the doorkeeper render options):\n// { \"error\": { \"type\", \"message\", \"details\"?, \"request_id\", \"remediation\"? } }\n// NOTE: request_id and remediation are NESTED under `error` (not top-level) — the\n// spec's Error schema models neither, but the runtime always emits request_id.\n\nexport interface WefunderErrorBody {\n error?: {\n type?: string;\n message?: string;\n details?: unknown;\n request_id?: string;\n remediation?: string;\n };\n // Defensive: some envelopes (e.g. *WithMeta success meta) carry request_id here.\n request_id?: string;\n}\n\n/** Response header carrying the partner-facing request id (Stripe-style `req_…`). */\nexport const REQUEST_ID_HEADER = \"x-wf-request-id\";\n\n/** Prefer the X-Wf-Request-Id response header; fall back to a body-derived id. */\nexport function requestIdFrom(response: Response | undefined, bodyRequestId: string | undefined): string | undefined {\n return response?.headers.get(REQUEST_ID_HEADER) ?? bodyRequestId;\n}\n\nexport class WefunderError extends Error {\n readonly status: number;\n readonly type: string;\n readonly requestId?: string;\n readonly details?: unknown;\n /** Server-provided hint on how to resolve the error, when present. */\n readonly remediation?: string;\n /** Documentation pointer surfaced to developers in stack traces / logs. */\n readonly documentationUrl = \"https://docs.wefunder.com/api-reference\";\n\n constructor(args: {\n status: number;\n type: string;\n message: string;\n requestId?: string;\n details?: unknown;\n remediation?: string;\n }) {\n super(args.message);\n this.name = \"WefunderError\";\n this.status = args.status;\n this.type = args.type;\n this.requestId = args.requestId;\n this.details = args.details;\n this.remediation = args.remediation;\n }\n}\n\n/** Raised when token refresh is needed but no refresh token / refresher is configured. */\nexport class WefunderAuthError extends WefunderError {\n constructor(message: string) {\n super({ status: 401, type: \"unauthorized\", message });\n this.name = \"WefunderAuthError\";\n }\n}\n\n/**\n * Build a WefunderError from a failed Response. Reads the typed envelope from the\n * body; falls back gracefully when the body isn't the expected shape.\n */\nexport async function errorFromResponse(response: Response): Promise<WefunderError> {\n let body: WefunderErrorBody | undefined;\n try {\n body = (await response.clone().json()) as WefunderErrorBody;\n } catch {\n // non-JSON body (e.g. an HTML 502 from the edge) — keep body undefined\n }\n const err = body?.error ?? {};\n return new WefunderError({\n status: response.status,\n type: err.type ?? \"api_error\",\n message: err.message ?? response.statusText ?? \"Request failed\",\n // X-Wf-Request-Id is set on every authenticated response (base_controller.rb),\n // so it's present even when the body isn't JSON (e.g. an HTML 502 from the edge),\n // unlike the nested error.request_id. Prefer the header; fall back to the body.\n requestId: requestIdFrom(response, err.request_id ?? body?.request_id),\n details: err.details,\n remediation: err.remediation,\n });\n}\n","// Holds the live token state and owns token recovery + persistence. Two recovery\n// strategies, picked automatically:\n// - refresh_token (user flows): rotates — every refresh returns a NEW refresh\n// token, persisted BEFORE the next request can use it (the CRITICAL invariant).\n// - re-mint (client_credentials): cc tokens have NO refresh token, but a client\n// built via fromClientCredentials holds the grant inputs, so it can mint a fresh\n// token on expiry/401 instead of throwing. (Stress-test finding A.)\n// Either way, concurrent callers share one in-flight promise so a burst of 401s\n// fires a single recovery (no rotation race / thundering herd).\n\nimport { refreshToken, resolveTokenBase, type TokenSet, type OAuthHostOptions } from \"./oauth.js\";\nimport { WefunderAuthError } from \"./errors.js\";\n\n/** Pluggable persistence for the rotating token set (DB row, secrets manager, etc.). */\nexport interface TokenStore {\n load?(): Promise<TokenSet | undefined> | TokenSet | undefined;\n save(tokens: TokenSet): Promise<void> | void;\n}\n\nexport interface TokenManagerOptions extends OAuthHostOptions {\n tokens: TokenSet;\n clientId?: string;\n clientSecret?: string;\n /**\n * For client_credentials clients: mint a fresh token from the stored grant inputs.\n * When set (and there's no refresh token), this is the recovery strategy.\n */\n reMint?: () => Promise<TokenSet>;\n /** Called with the new TokenSet on every successful recovery (rotation or re-mint). */\n onTokenRefresh?: (tokens: TokenSet) => void | Promise<void>;\n store?: TokenStore;\n fetch?: typeof fetch;\n now?: () => number;\n /** Refresh proactively when the access token is within this many ms of expiry. */\n expiryLeewayMs?: number;\n}\n\nexport class TokenManager {\n #tokens: TokenSet;\n readonly #clientId?: string;\n readonly #clientSecret?: string;\n readonly #reMint?: () => Promise<TokenSet>;\n readonly #tokenBaseUrl: string;\n readonly #onTokenRefresh?: (tokens: TokenSet) => void | Promise<void>;\n readonly #store?: TokenStore;\n readonly #fetch: typeof fetch;\n readonly #now: () => number;\n readonly #leeway: number;\n #inflight: Promise<TokenSet> | undefined;\n\n constructor(opts: TokenManagerOptions) {\n this.#tokens = opts.tokens;\n this.#clientId = opts.clientId;\n this.#clientSecret = opts.clientSecret;\n this.#reMint = opts.reMint;\n this.#tokenBaseUrl = resolveTokenBase(opts);\n this.#onTokenRefresh = opts.onTokenRefresh;\n this.#store = opts.store;\n this.#fetch = opts.fetch ?? fetch;\n this.#now = opts.now ?? Date.now;\n this.#leeway = opts.expiryLeewayMs ?? 30_000;\n }\n\n get current(): TokenSet {\n return this.#tokens;\n }\n\n /** True if the manager can recover an expired token (rotate a refresh token or re-mint). */\n get canRefresh(): boolean {\n return Boolean((this.#tokens.refreshToken && this.#clientId) || this.#reMint);\n }\n\n /** Returns a valid access token, refreshing proactively if it's expired/near-expiry. */\n async getAccessToken(): Promise<string> {\n const { expiresAt } = this.#tokens;\n if (expiresAt !== undefined && this.#now() >= expiresAt - this.#leeway && this.canRefresh) {\n await this.refresh();\n }\n return this.#tokens.accessToken;\n }\n\n /**\n * Recover an expired/rejected token (e.g. after a 401): rotates the refresh token\n * if there is one, otherwise re-mints (client_credentials). Coalesces concurrent\n * calls into one network round-trip, then persists. Returns the new token set.\n */\n async refresh(): Promise<TokenSet> {\n if (this.#inflight) return this.#inflight;\n const strategy = this.#recoveryStrategy();\n if (!strategy) {\n throw new WefunderAuthError(\n \"Access token expired and no refresh token / re-mint capability is configured.\",\n );\n }\n this.#inflight = (async () => {\n const next = await strategy();\n this.#tokens = next;\n await this.#store?.save(next);\n await this.#onTokenRefresh?.(next);\n return next;\n })();\n try {\n return await this.#inflight;\n } finally {\n this.#inflight = undefined;\n }\n }\n\n // Pick the recovery strategy: refresh_token rotation, else cc re-mint, else none.\n #recoveryStrategy(): (() => Promise<TokenSet>) | undefined {\n const refreshTokenValue = this.#tokens.refreshToken;\n if (refreshTokenValue && this.#clientId) {\n const clientId = this.#clientId;\n return async () => {\n const next = await refreshToken({\n clientId,\n clientSecret: this.#clientSecret,\n refreshToken: refreshTokenValue,\n tokenBaseUrl: this.#tokenBaseUrl,\n fetch: this.#fetch,\n now: this.#now,\n });\n // Some servers omit a fresh refresh_token on rotation-disabled flows;\n // keep the previous one rather than dropping our ability to refresh.\n if (!next.refreshToken) next.refreshToken = refreshTokenValue;\n return next;\n };\n }\n return this.#reMint;\n }\n}\n","// Lazy auto-pagination. The cursor is treated as an OPAQUE token (plan §4.1 #5):\n// different endpoints back it with an int id, an ISO timestamp, or an offset, so we\n// never inspect or arithmetic it — we just feed `meta.next_cursor` back verbatim.\n// Streams items one page at a time (never buffers the whole result set).\n\nexport type Cursor = string | number;\n\nexport interface Page<T> {\n data?: T[] | null;\n meta?: {\n has_more?: boolean;\n next_cursor?: Cursor | null;\n [k: string]: unknown;\n };\n}\n\n/** Fetches a single page given an opaque cursor (undefined = first page). */\nexport type PageFetcher<T> = (cursor?: Cursor) => Promise<Page<T>>;\n\n/** Yields every item across all pages, lazily. */\nexport async function* paginate<T>(fetchPage: PageFetcher<T>): AsyncGenerator<T> {\n let cursor: Cursor | undefined;\n const seen = new Set<Cursor>();\n for (;;) {\n const page = await fetchPage(cursor);\n for (const item of page.data ?? []) yield item;\n\n const meta = page.meta ?? {};\n const next = meta.next_cursor;\n // Stop conditions: explicit has_more=false, no next cursor, or a cursor that\n // doesn't advance (defensive guard against an endpoint that loops).\n if (meta.has_more === false) return;\n if (next === undefined || next === null) return;\n if (seen.has(next)) return;\n seen.add(next);\n cursor = next;\n }\n}\n\n/** Collect all items into an array. Convenience over `paginate` for small result sets. */\nexport async function collect<T>(fetchPage: PageFetcher<T>): Promise<T[]> {\n const out: T[] = [];\n for await (const item of paginate(fetchPage)) out.push(item);\n return out;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type {\n Client,\n ClientMeta,\n Options as Options2,\n RequestResult,\n TDataShape,\n} from \"./client\";\nimport { client } from \"./client.gen\";\nimport type {\n ApproveSyndicateMemberData,\n ApproveSyndicateMemberErrors,\n ApproveSyndicateMemberResponses,\n CloseSyndicateDealData,\n CloseSyndicateDealErrors,\n CreateIntentData,\n CreateIntentErrors,\n CreateIntentResponses,\n CreatePartnerInviteData,\n CreatePartnerInviteErrors,\n CreatePartnerInviteResponses,\n CreateWebhookSubscriptionData,\n CreateWebhookSubscriptionErrors,\n CreateWebhookSubscriptionResponses,\n DeleteWebhookSubscriptionData,\n DeleteWebhookSubscriptionErrors,\n DeleteWebhookSubscriptionResponses,\n DemoteSyndicateMemberData,\n DemoteSyndicateMemberErrors,\n DemoteSyndicateMemberResponses,\n ExportSyndicateMembersCsvData,\n ExportSyndicateMembersCsvErrors,\n ExportSyndicateMembersCsvResponses,\n FinalizeSyndicateDealData,\n FinalizeSyndicateDealErrors,\n GetAttributionMeData,\n GetAttributionMeErrors,\n GetAttributionMeResponses,\n GetAttributionStatsData,\n GetAttributionStatsErrors,\n GetAttributionStatsResponses,\n GetCurrentUserData,\n GetCurrentUserErrors,\n GetCurrentUserResponses,\n GetIntentData,\n GetIntentErrors,\n GetIntentResponses,\n GetOfferingData,\n GetOfferingErrors,\n GetOfferingResponses,\n GetSyndicateData,\n GetSyndicateDealData,\n GetSyndicateDealErrors,\n GetSyndicateDealResponses,\n GetSyndicateErrors,\n GetSyndicateResponses,\n GetSyndicateStatisticsData,\n GetSyndicateStatisticsErrors,\n GetSyndicateStatisticsResponses,\n GetWebhookSubscriptionData,\n GetWebhookSubscriptionErrors,\n GetWebhookSubscriptionResponses,\n HideSyndicateMemberData,\n HideSyndicateMemberErrors,\n HideSyndicateMemberResponses,\n InviteSyndicateMemberData,\n InviteSyndicateMemberErrors,\n InviteSyndicateMemberResponses,\n ListActivityData,\n ListActivityErrors,\n ListActivityResponses,\n ListAttributedInvestmentsData,\n ListAttributedInvestmentsErrors,\n ListAttributedInvestmentsResponses,\n ListAttributionCampaignsData,\n ListAttributionCampaignsErrors,\n ListAttributionCampaignsResponses,\n ListCampaignsData,\n ListCampaignsErrors,\n ListCampaignsResponses,\n ListConnectedAppsData,\n ListConnectedAppsErrors,\n ListConnectedAppsResponses,\n ListIntentsData,\n ListIntentsErrors,\n ListIntentsResponses,\n ListInvestmentsData,\n ListInvestmentsErrors,\n ListInvestmentsResponses,\n ListOfferingsData,\n ListOfferingsErrors,\n ListOfferingsResponses,\n ListPartnerInvitesData,\n ListPartnerInvitesErrors,\n ListPartnerInvitesResponses,\n ListSyndicateDealInvestorsData,\n ListSyndicateDealInvestorsErrors,\n ListSyndicateDealInvestorsResponses,\n ListSyndicateDealsData,\n ListSyndicateDealsErrors,\n ListSyndicateDealsResponses,\n ListSyndicateMemberInvestmentsData,\n ListSyndicateMemberInvestmentsErrors,\n ListSyndicateMemberInvestmentsResponses,\n ListSyndicateMembersData,\n ListSyndicateMembersErrors,\n ListSyndicateMembersResponses,\n ListSyndicatesData,\n ListSyndicatesErrors,\n ListSyndicatesResponses,\n ListWebhookSubscriptionsData,\n ListWebhookSubscriptionsErrors,\n ListWebhookSubscriptionsResponses,\n PromoteSyndicateMemberData,\n PromoteSyndicateMemberErrors,\n PromoteSyndicateMemberResponses,\n ReactivateWebhookSubscriptionData,\n ReactivateWebhookSubscriptionErrors,\n ReactivateWebhookSubscriptionResponses,\n RegenerateWebhookSecretData,\n RegenerateWebhookSecretErrors,\n RegenerateWebhookSecretResponses,\n RegisterAsPartnerData,\n RegisterAsPartnerErrors,\n RegisterAsPartnerResponses,\n RemoveSyndicateMemberData,\n RemoveSyndicateMemberErrors,\n ReorderSyndicateMembersData,\n ReorderSyndicateMembersErrors,\n ReorderSyndicateMembersResponses,\n ResendSyndicateInviteData,\n ResendSyndicateInviteErrors,\n ResendSyndicateInviteResponses,\n RestoreSyndicateMemberData,\n RestoreSyndicateMemberErrors,\n RestoreSyndicateMemberResponses,\n RevokeConnectedAppData,\n RevokeConnectedAppErrors,\n RevokeConnectedAppResponses,\n RevokePartnerInviteData,\n RevokePartnerInviteErrors,\n RevokePartnerInviteResponses,\n TestWebhookSubscriptionData,\n TestWebhookSubscriptionErrors,\n TestWebhookSubscriptionResponses,\n UpdateSyndicateData,\n UpdateSyndicateErrors,\n UpdateSyndicateMemberData,\n UpdateSyndicateMemberErrors,\n UpdateSyndicateMemberResponses,\n UpdateSyndicateResponses,\n} from \"./types.gen\";\n\nexport type Options<\n TData extends TDataShape = TDataShape,\n ThrowOnError extends boolean = boolean,\n TResponse = unknown,\n> = 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?: keyof ClientMeta extends never ? Record<string, unknown> : ClientMeta;\n};\n\n/**\n * List public offerings\n *\n * Returns the offerings shown on wefunder.com/explore — the curated set of companies that\n * meet Wefunder's discoverability bar (a soft-confirmed traction threshold plus approval),\n * **one offering per company**. An \"offering\" is a fundraise, addressed by its `ofr_`\n * external id.\n *\n * This is a public, read-only endpoint backed by the `read:public` scope. It is reachable\n * with either a server-side (client_credentials) token or a user access token carrying\n * `read:public`. Private rounds (e.g. Reg D 506(b)) are never listed, and low-traction or\n * unapproved companies are excluded — exactly as they are on the website.\n *\n * Order with `sort` (default: most raised); paginate with `cursor`. `meta.total_count` is\n * the number of offerings across all pages.\n *\n * Use this endpoint to:\n * - Discover and monitor active deals\n * - Build deal aggregators and public listings\n *\n */\nexport const listOfferings = <ThrowOnError extends boolean = false>(\n options?: Options<ListOfferingsData, ThrowOnError>,\n): RequestResult<ListOfferingsResponses, ListOfferingsErrors, ThrowOnError> =>\n (options?.client ?? client).get<\n ListOfferingsResponses,\n ListOfferingsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/explore\",\n ...options,\n });\n\n/**\n * Get a public offering\n *\n * Retrieves a single public offering by its `ofr_` external id.\n *\n * A valid id for a non-public offering (e.g. a private Reg D 506(b) round) returns `404` —\n * having an id does not make an offering publicly resolvable.\n *\n */\nexport const getOffering = <ThrowOnError extends boolean = false>(\n options: Options<GetOfferingData, ThrowOnError>,\n): RequestResult<GetOfferingResponses, GetOfferingErrors, ThrowOnError> =>\n (options.client ?? client).get<\n GetOfferingResponses,\n GetOfferingErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/offerings/{external_id}\",\n ...options,\n });\n\n/**\n * Get current user profile\n *\n * Retrieves the profile information for the currently authenticated user. This endpoint returns\n * basic user details including name, email, and account status.\n *\n * Use this endpoint to:\n * - Display user information in your application\n * - Verify the identity of the authenticated user\n * - Check user account status and permissions\n *\n * The response includes the user's unique ID which can be used to reference the user in other API calls.\n *\n */\nexport const getCurrentUser = <ThrowOnError extends boolean = false>(\n options?: Options<GetCurrentUserData, ThrowOnError>,\n): RequestResult<GetCurrentUserResponses, GetCurrentUserErrors, ThrowOnError> =>\n (options?.client ?? client).get<\n GetCurrentUserResponses,\n GetCurrentUserErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/users/me\",\n ...options,\n });\n\n/**\n * List user investments\n *\n * Retrieves a paginated list of all investments made by the authenticated user. Each investment\n * includes details about the amount invested, the company, investment date, and current status.\n *\n * Use this endpoint to:\n * - Display a user's investment portfolio\n * - Track investment history and performance\n * - Build custom reporting and analytics\n *\n * The list is ordered by investment date (newest first) and supports cursor-based pagination\n * for efficient iteration through large portfolios. Each investment object includes the\n * campaign details and current valuation information.\n *\n */\nexport const listInvestments = <ThrowOnError extends boolean = false>(\n options?: Options<ListInvestmentsData, ThrowOnError>,\n): RequestResult<\n ListInvestmentsResponses,\n ListInvestmentsErrors,\n ThrowOnError\n> =>\n (options?.client ?? client).get<\n ListInvestmentsResponses,\n ListInvestmentsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/investments\",\n ...options,\n });\n\n/**\n * List founder campaigns\n *\n * Retrieves all fundraising campaigns for companies where the authenticated user is a founder.\n * This endpoint returns comprehensive campaign data including funding progress, investor counts,\n * and campaign status.\n *\n * Use this endpoint to:\n * - Build custom founder dashboards\n * - Monitor fundraising progress across multiple campaigns\n * - Generate reports on campaign performance\n * - Integrate campaign data into your own tools\n *\n * Only founders with the appropriate permissions can access this endpoint. The response includes\n * both active and closed campaigns, with detailed metrics for each.\n *\n */\nexport const listCampaigns = <ThrowOnError extends boolean = false>(\n options?: Options<ListCampaignsData, ThrowOnError>,\n): RequestResult<ListCampaignsResponses, ListCampaignsErrors, ThrowOnError> =>\n (options?.client ?? client).get<\n ListCampaignsResponses,\n ListCampaignsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns\",\n ...options,\n });\n\n/**\n * List syndicates\n *\n * Returns syndicates the authenticated user can manage, based on their roles.\n * Results can be filtered by status and sorted by name or creation date.\n *\n */\nexport const listSyndicates = <ThrowOnError extends boolean = false>(\n options?: Options<ListSyndicatesData, ThrowOnError>,\n): RequestResult<ListSyndicatesResponses, ListSyndicatesErrors, ThrowOnError> =>\n (options?.client ?? client).get<\n ListSyndicatesResponses,\n ListSyndicatesErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates\",\n ...options,\n });\n\n/**\n * Get syndicate details\n *\n * Returns full details for a specific syndicate including settings, team configuration, and summary metrics.\n */\nexport const getSyndicate = <ThrowOnError extends boolean = false>(\n options: Options<GetSyndicateData, ThrowOnError>,\n): RequestResult<GetSyndicateResponses, GetSyndicateErrors, ThrowOnError> =>\n (options.client ?? client).get<\n GetSyndicateResponses,\n GetSyndicateErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}\",\n ...options,\n });\n\n/**\n * Update syndicate settings\n *\n * Update syndicate configuration. Currently supports name, description, and tagline.\n * Requires `write:syndicates` scope and at least operator permission.\n *\n */\nexport const updateSyndicate = <ThrowOnError extends boolean = false>(\n options: Options<UpdateSyndicateData, ThrowOnError>,\n): RequestResult<\n UpdateSyndicateResponses,\n UpdateSyndicateErrors,\n ThrowOnError\n> =>\n (options.client ?? client).patch<\n UpdateSyndicateResponses,\n UpdateSyndicateErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * List members\n *\n * Returns the member directory for a syndicate with role, status, tags, sidebar notes,\n * and investment history summaries. Supports filtering, sorting, search, and pagination.\n *\n */\nexport const listSyndicateMembers = <ThrowOnError extends boolean = false>(\n options: Options<ListSyndicateMembersData, ThrowOnError>,\n): RequestResult<\n ListSyndicateMembersResponses,\n ListSyndicateMembersErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n ListSyndicateMembersResponses,\n ListSyndicateMembersErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members\",\n ...options,\n });\n\n/**\n * Invite member\n *\n * Send an invitation to join the syndicate by email.\n */\nexport const inviteSyndicateMember = <ThrowOnError extends boolean = false>(\n options: Options<InviteSyndicateMemberData, ThrowOnError>,\n): RequestResult<\n InviteSyndicateMemberResponses,\n InviteSyndicateMemberErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n InviteSyndicateMemberResponses,\n InviteSyndicateMemberErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/invite\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Remove member (requires intent)\n *\n * Removing a member is irreversible and requires human approval through the Intent system.\n * This endpoint always returns 422 with a `use_intents` error directing you to\n * `POST /v2/intents` with action `syndicates.remove_member`.\n *\n */\nexport const removeSyndicateMember = <ThrowOnError extends boolean = false>(\n options: Options<RemoveSyndicateMemberData, ThrowOnError>,\n): RequestResult<unknown, RemoveSyndicateMemberErrors, ThrowOnError> =>\n (options.client ?? client).delete<\n unknown,\n RemoveSyndicateMemberErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}\",\n ...options,\n });\n\n/**\n * Update member\n *\n * Update title and carry override for a member. Requires operator permission.\n */\nexport const updateSyndicateMember = <ThrowOnError extends boolean = false>(\n options: Options<UpdateSyndicateMemberData, ThrowOnError>,\n): RequestResult<\n UpdateSyndicateMemberResponses,\n UpdateSyndicateMemberErrors,\n ThrowOnError\n> =>\n (options.client ?? client).patch<\n UpdateSyndicateMemberResponses,\n UpdateSyndicateMemberErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Approve applicant\n *\n * Approve a pending applicant. Only applicants can be approved via API; invitees must accept their invite link.\n */\nexport const approveSyndicateMember = <ThrowOnError extends boolean = false>(\n options: Options<ApproveSyndicateMemberData, ThrowOnError>,\n): RequestResult<\n ApproveSyndicateMemberResponses,\n ApproveSyndicateMemberErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n ApproveSyndicateMemberResponses,\n ApproveSyndicateMemberErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}/approve\",\n ...options,\n });\n\n/**\n * Exile member\n *\n * Exile (hide) a member from the syndicate. Sets their role to exiled.\n */\nexport const hideSyndicateMember = <ThrowOnError extends boolean = false>(\n options: Options<HideSyndicateMemberData, ThrowOnError>,\n): RequestResult<\n HideSyndicateMemberResponses,\n HideSyndicateMemberErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n HideSyndicateMemberResponses,\n HideSyndicateMemberErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}/hide\",\n ...options,\n });\n\n/**\n * Promote member to admin\n *\n * Promote a member to full_access (admin) role. Only the syndicate creator can promote members.\n */\nexport const promoteSyndicateMember = <ThrowOnError extends boolean = false>(\n options: Options<PromoteSyndicateMemberData, ThrowOnError>,\n): RequestResult<\n PromoteSyndicateMemberResponses,\n PromoteSyndicateMemberErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n PromoteSyndicateMemberResponses,\n PromoteSyndicateMemberErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}/promote\",\n ...options,\n });\n\n/**\n * Demote member to operator\n *\n * Demote a member from full_access (admin) to operator permission.\n */\nexport const demoteSyndicateMember = <ThrowOnError extends boolean = false>(\n options: Options<DemoteSyndicateMemberData, ThrowOnError>,\n): RequestResult<\n DemoteSyndicateMemberResponses,\n DemoteSyndicateMemberErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n DemoteSyndicateMemberResponses,\n DemoteSyndicateMemberErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}/demote\",\n ...options,\n });\n\n/**\n * Restore exiled or resigned member\n *\n * Restore a member who was previously exiled or resigned. Sets their role back to member.\n */\nexport const restoreSyndicateMember = <ThrowOnError extends boolean = false>(\n options: Options<RestoreSyndicateMemberData, ThrowOnError>,\n): RequestResult<\n RestoreSyndicateMemberResponses,\n RestoreSyndicateMemberErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n RestoreSyndicateMemberResponses,\n RestoreSyndicateMemberErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}/restore\",\n ...options,\n });\n\n/**\n * Resend invitation\n */\nexport const resendSyndicateInvite = <ThrowOnError extends boolean = false>(\n options: Options<ResendSyndicateInviteData, ThrowOnError>,\n): RequestResult<\n ResendSyndicateInviteResponses,\n ResendSyndicateInviteErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n ResendSyndicateInviteResponses,\n ResendSyndicateInviteErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}/resend_invite\",\n ...options,\n });\n\n/**\n * Reorder members\n *\n * Set the display order for the member directory.\n */\nexport const reorderSyndicateMembers = <ThrowOnError extends boolean = false>(\n options: Options<ReorderSyndicateMembersData, ThrowOnError>,\n): RequestResult<\n ReorderSyndicateMembersResponses,\n ReorderSyndicateMembersErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n ReorderSyndicateMembersResponses,\n ReorderSyndicateMembersErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/reorder\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Export members CSV\n *\n * Generate a CSV export of the member directory. Returns the CSV data directly\n * with Content-Type text/csv. Requires operator permission.\n *\n */\nexport const exportSyndicateMembersCsv = <ThrowOnError extends boolean = false>(\n options: Options<ExportSyndicateMembersCsvData, ThrowOnError>,\n): RequestResult<\n ExportSyndicateMembersCsvResponses,\n ExportSyndicateMembersCsvErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n ExportSyndicateMembersCsvResponses,\n ExportSyndicateMembersCsvErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/export_csv\",\n ...options,\n });\n\n/**\n * List deals\n *\n * Returns all deals (fundraises) within a syndicate with status, terms, and metrics.\n */\nexport const listSyndicateDeals = <ThrowOnError extends boolean = false>(\n options: Options<ListSyndicateDealsData, ThrowOnError>,\n): RequestResult<\n ListSyndicateDealsResponses,\n ListSyndicateDealsErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n ListSyndicateDealsResponses,\n ListSyndicateDealsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/deals\",\n ...options,\n });\n\n/**\n * Get deal details\n *\n * Returns full details for a specific deal including investor breakdown.\n */\nexport const getSyndicateDeal = <ThrowOnError extends boolean = false>(\n options: Options<GetSyndicateDealData, ThrowOnError>,\n): RequestResult<\n GetSyndicateDealResponses,\n GetSyndicateDealErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n GetSyndicateDealResponses,\n GetSyndicateDealErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/deals/{fundraise_id}\",\n ...options,\n });\n\n/**\n * List deal investors\n *\n * Returns syndicate members who invested in this deal. Results are scoped to\n * syndicate member user IDs only and sorted by amount descending.\n *\n * The `user_email` field is **moderator-only** — it returns null for non-moderator\n * callers (i.e., users who are not a manager/operator of the syndicate).\n *\n * All monetary values are strings representing cents to avoid floating-point precision issues.\n *\n */\nexport const listSyndicateDealInvestors = <\n ThrowOnError extends boolean = false,\n>(\n options: Options<ListSyndicateDealInvestorsData, ThrowOnError>,\n): RequestResult<\n ListSyndicateDealInvestorsResponses,\n ListSyndicateDealInvestorsErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n ListSyndicateDealInvestorsResponses,\n ListSyndicateDealInvestorsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/deals/{fundraise_id}/investors\",\n ...options,\n });\n\n/**\n * List member investments\n *\n * Returns this member's investments in syndicate deals. Scoped to the syndicate's\n * selected deals (one per company, matching directory semantics).\n *\n * All monetary values are strings representing cents to avoid floating-point precision issues.\n *\n */\nexport const listSyndicateMemberInvestments = <\n ThrowOnError extends boolean = false,\n>(\n options: Options<ListSyndicateMemberInvestmentsData, ThrowOnError>,\n): RequestResult<\n ListSyndicateMemberInvestmentsResponses,\n ListSyndicateMemberInvestmentsErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n ListSyndicateMemberInvestmentsResponses,\n ListSyndicateMemberInvestmentsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/members/{member_id}/investments\",\n ...options,\n });\n\n/**\n * Get syndicate statistics\n *\n * Returns aggregate metrics for a syndicate including member counts, deal counts,\n * total raised, and recent activity.\n *\n * `total_raised` and `total_investors` are computed from directory-selected deals\n * (one per company). `total_deals` and `live_deals` use all linked deals.\n *\n * All monetary values are strings representing cents to avoid floating-point precision issues.\n *\n */\nexport const getSyndicateStatistics = <ThrowOnError extends boolean = false>(\n options: Options<GetSyndicateStatisticsData, ThrowOnError>,\n): RequestResult<\n GetSyndicateStatisticsResponses,\n GetSyndicateStatisticsErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n GetSyndicateStatisticsResponses,\n GetSyndicateStatisticsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/statistics\",\n ...options,\n });\n\n/**\n * Close deal (requires intent)\n *\n * Closing a deal is irreversible and requires human approval through the Intent system.\n * This endpoint always returns 422 with a `use_intents` error directing you to\n * `POST /v2/intents` with action `syndicates.close_deal`.\n *\n */\nexport const closeSyndicateDeal = <ThrowOnError extends boolean = false>(\n options: Options<CloseSyndicateDealData, ThrowOnError>,\n): RequestResult<unknown, CloseSyndicateDealErrors, ThrowOnError> =>\n (options.client ?? client).post<\n unknown,\n CloseSyndicateDealErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/deals/{fundraise_id}/close\",\n ...options,\n });\n\n/**\n * Finalize deal (requires intent)\n *\n * Finalizing a deal triggers disbursement and is irreversible. It requires human approval\n * through the Intent system. This endpoint always returns 422 with a `use_intents` error\n * directing you to `POST /v2/intents` with action `syndicates.finalize_deal`.\n *\n */\nexport const finalizeSyndicateDeal = <ThrowOnError extends boolean = false>(\n options: Options<FinalizeSyndicateDealData, ThrowOnError>,\n): RequestResult<unknown, FinalizeSyndicateDealErrors, ThrowOnError> =>\n (options.client ?? client).post<\n unknown,\n FinalizeSyndicateDealErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/syndicates/{syndicate_id}/deals/{fundraise_id}/finalize\",\n ...options,\n });\n\n/**\n * List intents\n *\n * List intents created by the current token, optionally filtered by status or resource.\n */\nexport const listIntents = <ThrowOnError extends boolean = false>(\n options?: Options<ListIntentsData, ThrowOnError>,\n): RequestResult<ListIntentsResponses, ListIntentsErrors, ThrowOnError> =>\n (options?.client ?? client).get<\n ListIntentsResponses,\n ListIntentsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/intents\",\n ...options,\n });\n\n/**\n * Propose an intent\n *\n * Propose a dangerous or irreversible action for human approval. Returns a `review_url`\n * where a human must review the impact and approve before the action executes.\n *\n * The entity that proposes an intent can never approve it. Approval always happens\n * on Wefunder's UI by a user with permission on the resource.\n *\n * See [Intents documentation](/concepts/intents) for the full pattern.\n *\n */\nexport const createIntent = <ThrowOnError extends boolean = false>(\n options: Options<CreateIntentData, ThrowOnError>,\n): RequestResult<CreateIntentResponses, CreateIntentErrors, ThrowOnError> =>\n (options.client ?? client).post<\n CreateIntentResponses,\n CreateIntentErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/intents\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Get intent status\n *\n * Check the current status of an intent. Use this to poll for approval\n * after proposing an intent, or subscribe to `intent.*` webhook events instead.\n *\n */\nexport const getIntent = <ThrowOnError extends boolean = false>(\n options: Options<GetIntentData, ThrowOnError>,\n): RequestResult<GetIntentResponses, GetIntentErrors, ThrowOnError> =>\n (options.client ?? client).get<\n GetIntentResponses,\n GetIntentErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/intents/{intent_id}\",\n ...options,\n });\n\n/**\n * List activity events\n *\n * Returns actions taken by OAuth apps authorized by the current user.\n * This is the API backing the user-facing activity feed at Settings > Activity.\n *\n */\nexport const listActivity = <ThrowOnError extends boolean = false>(\n options?: Options<ListActivityData, ThrowOnError>,\n): RequestResult<ListActivityResponses, ListActivityErrors, ThrowOnError> =>\n (options?.client ?? client).get<\n ListActivityResponses,\n ListActivityErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/activity\",\n ...options,\n });\n\n/**\n * List connected apps\n *\n * Returns all OAuth apps the user has authorized, with summary stats.\n */\nexport const listConnectedApps = <ThrowOnError extends boolean = false>(\n options?: Options<ListConnectedAppsData, ThrowOnError>,\n): RequestResult<\n ListConnectedAppsResponses,\n ListConnectedAppsErrors,\n ThrowOnError\n> =>\n (options?.client ?? client).get<\n ListConnectedAppsResponses,\n ListConnectedAppsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/connected-apps\",\n ...options,\n });\n\n/**\n * Revoke connected app\n *\n * Revoke all tokens for this app. Any pending intents from this app are automatically expired.\n *\n */\nexport const revokeConnectedApp = <ThrowOnError extends boolean = false>(\n options: Options<RevokeConnectedAppData, ThrowOnError>,\n): RequestResult<\n RevokeConnectedAppResponses,\n RevokeConnectedAppErrors,\n ThrowOnError\n> =>\n (options.client ?? client).delete<\n RevokeConnectedAppResponses,\n RevokeConnectedAppErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/connected-apps/{app_id}\",\n ...options,\n });\n\n/**\n * Get aggregate attribution statistics\n *\n * Returns aggregate attribution statistics for a campaign. This is a **Tier 0** endpoint\n * available to all OAuth applications with the `read:attribution:aggregate` scope.\n *\n * Use this endpoint to:\n * - Track overall marketing campaign performance\n * - Measure conversion rates by UTM source/campaign\n * - Monitor investment quality metrics\n * - Build performance dashboards\n *\n * The response includes totals and breakdowns by UTM parameters. All counts exclude\n * disputed attributions.\n *\n * **Privacy**: This endpoint returns aggregate data only. No individual investor\n * information is exposed.\n *\n */\nexport const getAttributionStats = <ThrowOnError extends boolean = false>(\n options: Options<GetAttributionStatsData, ThrowOnError>,\n): RequestResult<\n GetAttributionStatsResponses,\n GetAttributionStatsErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n GetAttributionStatsResponses,\n GetAttributionStatsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/stats\",\n ...options,\n });\n\n/**\n * List attributed investments\n *\n * Returns a list of attributed investments. The detail level depends on your access:\n *\n * **Tier 1 (Marketing Partners)** - Anonymized data:\n * - Investor identity represented by opaque tokens (not real IDs)\n * - Tokens are campaign-scoped (different token per campaign for same investor)\n * - Investment amounts shown as tiers (small/medium/large), not exact values\n * - No PII (email, name, address) is returned\n *\n * **Tier 2 (Founders/Employees)** - Full data with `detail_level=full`:\n * - Real investment IDs (linkable to Wefunder admin)\n * - Investor name, email, and username\n * - Exact dollar amounts\n *\n * **Access**: Requires Tier 1+ access approval from Wefunder admin.\n *\n */\nexport const listAttributedInvestments = <ThrowOnError extends boolean = false>(\n options: Options<ListAttributedInvestmentsData, ThrowOnError>,\n): RequestResult<\n ListAttributedInvestmentsResponses,\n ListAttributedInvestmentsErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n ListAttributedInvestmentsResponses,\n ListAttributedInvestmentsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/investments\",\n ...options,\n });\n\n/**\n * List attribution webhook subscriptions\n *\n * Returns all active webhook subscriptions for this campaign belonging to\n * your OAuth application.\n *\n * **Tier 1** endpoint requiring admin-approved access with the\n * `read:attribution:anonymized` scope.\n *\n */\nexport const listWebhookSubscriptions = <ThrowOnError extends boolean = false>(\n options: Options<ListWebhookSubscriptionsData, ThrowOnError>,\n): RequestResult<\n ListWebhookSubscriptionsResponses,\n ListWebhookSubscriptionsErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n ListWebhookSubscriptionsResponses,\n ListWebhookSubscriptionsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/webhooks\",\n ...options,\n });\n\n/**\n * Create webhook subscription\n *\n * Creates a new webhook subscription for this campaign. When attributed\n * investments change state, we'll POST a JSON payload to your target URL.\n *\n * **Tier 1** endpoint requiring admin-approved access.\n *\n * ## Webhook Payload\n *\n * Payloads include anonymized data (tokens, amount tiers) matching the\n * `/attribution/investments` endpoint.\n *\n * ## Security\n *\n * - `target_url` must use HTTPS\n * - `target_url` cannot resolve to private/internal IPs (SSRF protection)\n * - Payloads are signed with HMAC-SHA256 using the returned `secret`\n *\n * ## Verification\n *\n * Verify webhook signatures using the `X-Wefunder-Signature` header:\n * ```\n * timestamp = headers['X-Wefunder-Timestamp']\n * signature = headers['X-Wefunder-Signature']\n * expected = \"sha256=\" + HMAC-SHA256(secret, timestamp + \".\" + raw_body)\n * ```\n *\n * Reject requests where:\n * - Signature doesn't match\n * - Timestamp is more than 5 minutes old (replay protection)\n *\n */\nexport const createWebhookSubscription = <ThrowOnError extends boolean = false>(\n options: Options<CreateWebhookSubscriptionData, ThrowOnError>,\n): RequestResult<\n CreateWebhookSubscriptionResponses,\n CreateWebhookSubscriptionErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n CreateWebhookSubscriptionResponses,\n CreateWebhookSubscriptionErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/webhooks\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Delete webhook subscription\n *\n * Deactivates a webhook subscription. The subscription will stop receiving\n * events but historical delivery data is retained for 7 days.\n *\n */\nexport const deleteWebhookSubscription = <ThrowOnError extends boolean = false>(\n options: Options<DeleteWebhookSubscriptionData, ThrowOnError>,\n): RequestResult<\n DeleteWebhookSubscriptionResponses,\n DeleteWebhookSubscriptionErrors,\n ThrowOnError\n> =>\n (options.client ?? client).delete<\n DeleteWebhookSubscriptionResponses,\n DeleteWebhookSubscriptionErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/webhooks/{webhook_id}\",\n ...options,\n });\n\n/**\n * Get webhook subscription details\n *\n * Returns details for a specific webhook subscription including recent\n * delivery history.\n *\n */\nexport const getWebhookSubscription = <ThrowOnError extends boolean = false>(\n options: Options<GetWebhookSubscriptionData, ThrowOnError>,\n): RequestResult<\n GetWebhookSubscriptionResponses,\n GetWebhookSubscriptionErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n GetWebhookSubscriptionResponses,\n GetWebhookSubscriptionErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/webhooks/{webhook_id}\",\n ...options,\n });\n\n/**\n * Send test webhook\n *\n * Sends a test webhook to verify your endpoint is working correctly.\n * The test payload includes a `\"event\": \"test\"` field to distinguish\n * it from real events.\n *\n */\nexport const testWebhookSubscription = <ThrowOnError extends boolean = false>(\n options: Options<TestWebhookSubscriptionData, ThrowOnError>,\n): RequestResult<\n TestWebhookSubscriptionResponses,\n TestWebhookSubscriptionErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n TestWebhookSubscriptionResponses,\n TestWebhookSubscriptionErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/webhooks/{webhook_id}/test\",\n ...options,\n });\n\n/**\n * Regenerate webhook signing secret\n *\n * Generates a new HMAC signing secret for the webhook subscription.\n * The old secret is immediately invalidated.\n *\n * **Important**: Store the new secret securely - it cannot be retrieved later.\n *\n */\nexport const regenerateWebhookSecret = <ThrowOnError extends boolean = false>(\n options: Options<RegenerateWebhookSecretData, ThrowOnError>,\n): RequestResult<\n RegenerateWebhookSecretResponses,\n RegenerateWebhookSecretErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n RegenerateWebhookSecretResponses,\n RegenerateWebhookSecretErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/webhooks/{webhook_id}/regenerate_secret\",\n ...options,\n });\n\n/**\n * Reactivate disabled webhook\n *\n * Reactivates a webhook subscription that was auto-disabled after\n * consecutive failures. Resets the failure counter to 0.\n *\n * Use this after fixing issues with your webhook endpoint.\n *\n */\nexport const reactivateWebhookSubscription = <\n ThrowOnError extends boolean = false,\n>(\n options: Options<ReactivateWebhookSubscriptionData, ThrowOnError>,\n): RequestResult<\n ReactivateWebhookSubscriptionResponses,\n ReactivateWebhookSubscriptionErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n ReactivateWebhookSubscriptionResponses,\n ReactivateWebhookSubscriptionErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/campaigns/{campaign_id}/attribution/webhooks/{webhook_id}/reactivate\",\n ...options,\n });\n\n/**\n * Get current user's attribution profile\n *\n * Returns the authenticated user's marketing partner profile and connected campaigns.\n * If the user is not registered as a marketing partner, returns partner info as null.\n *\n */\nexport const getAttributionMe = <ThrowOnError extends boolean = false>(\n options?: Options<GetAttributionMeData, ThrowOnError>,\n): RequestResult<\n GetAttributionMeResponses,\n GetAttributionMeErrors,\n ThrowOnError\n> =>\n (options?.client ?? client).get<\n GetAttributionMeResponses,\n GetAttributionMeErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/attribution/me\",\n ...options,\n });\n\n/**\n * List campaigns accessible to the current user\n *\n * Returns all campaigns the authenticated user can access for attribution data.\n * For founders, this includes their own campaigns.\n * For marketing partners, this includes campaigns they've been granted access to.\n *\n */\nexport const listAttributionCampaigns = <ThrowOnError extends boolean = false>(\n options?: Options<ListAttributionCampaignsData, ThrowOnError>,\n): RequestResult<\n ListAttributionCampaignsResponses,\n ListAttributionCampaignsErrors,\n ThrowOnError\n> =>\n (options?.client ?? client).get<\n ListAttributionCampaignsResponses,\n ListAttributionCampaignsErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/attribution/campaigns\",\n ...options,\n });\n\n/**\n * Register as a marketing partner\n *\n * Registers the authenticated user as a marketing partner.\n * After registration, the partner can create invites to request access to campaigns.\n *\n */\nexport const registerAsPartner = <ThrowOnError extends boolean = false>(\n options: Options<RegisterAsPartnerData, ThrowOnError>,\n): RequestResult<\n RegisterAsPartnerResponses,\n RegisterAsPartnerErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n RegisterAsPartnerResponses,\n RegisterAsPartnerErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/attribution/partners/register\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * List partner invites\n *\n * Returns all invites created by or sent to the authenticated user.\n * Includes both pending and accepted invites.\n *\n */\nexport const listPartnerInvites = <ThrowOnError extends boolean = false>(\n options?: Options<ListPartnerInvitesData, ThrowOnError>,\n): RequestResult<\n ListPartnerInvitesResponses,\n ListPartnerInvitesErrors,\n ThrowOnError\n> =>\n (options?.client ?? client).get<\n ListPartnerInvitesResponses,\n ListPartnerInvitesErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/attribution/invites\",\n ...options,\n });\n\n/**\n * Create a partner invite\n *\n * Creates an invite to establish a partner-company connection.\n *\n * **Directions**:\n * - `partner_to_founder`: Marketing partner invites a founder to grant access\n * - `founder_to_partner`: Founder invites a marketing partner to access their campaign\n *\n * For `partner_to_founder`: Creates a shareable invite link.\n * For `founder_to_partner`: Sends an email to the partner.\n *\n */\nexport const createPartnerInvite = <ThrowOnError extends boolean = false>(\n options: Options<CreatePartnerInviteData, ThrowOnError>,\n): RequestResult<\n CreatePartnerInviteResponses,\n CreatePartnerInviteErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n CreatePartnerInviteResponses,\n CreatePartnerInviteErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/attribution/invites\",\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n/**\n * Revoke a partner invite\n *\n * Revokes a pending invite. Only the creator can revoke an invite.\n * Accepted invites cannot be revoked (delete the connection instead).\n *\n */\nexport const revokePartnerInvite = <ThrowOnError extends boolean = false>(\n options: Options<RevokePartnerInviteData, ThrowOnError>,\n): RequestResult<\n RevokePartnerInviteResponses,\n RevokePartnerInviteErrors,\n ThrowOnError\n> =>\n (options.client ?? client).delete<\n RevokePartnerInviteResponses,\n RevokePartnerInviteErrors,\n ThrowOnError\n >({\n security: [{ scheme: \"bearer\", type: \"http\" }],\n url: \"/attribution/invites/{token}\",\n ...options,\n });\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport {\n type Client,\n type ClientOptions,\n type Config,\n createClient,\n createConfig,\n} 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> = (\n override?: Config<ClientOptions & T>,\n) => Config<Required<ClientOptions> & T>;\n\nexport const client: Client = createClient(createConfig<ClientOptions2>());\n","// The Wefunder client — the stable, hand-written public surface over the generated\n// layer. Wires: single API base (the edge proxy routes live/sandbox by token prefix,\n// so we do NOT route by prefix — plan §4.2 #1), a pinned Wefunder-Version, the\n// retry/refresh fetch wrapper, token rotation, typed-error unwrapping, and lazy\n// auto-pagination. Resource namespaces cover the common GA paths; `raw` exposes\n// every generated operation, pre-bound, as an escape hatch.\n\nimport { createClient, type Client } from \"./generated/client/index.js\";\nimport { createFetch, type RetryOptions } from \"./http.js\";\nimport { TokenManager, type TokenStore } from \"./token-manager.js\";\nimport { WefunderError, requestIdFrom } from \"./errors.js\";\nimport { clientCredentialsGrant, type TokenSet, type OAuthHostOptions } from \"./oauth.js\";\nimport { paginate, collect, type Cursor, type Page } from \"./pagination.js\";\nimport * as ops from \"./generated/sdk.gen.js\";\nimport type {\n User,\n Investment,\n Offering,\n Campaign,\n Syndicate,\n Intent,\n AttributionMe,\n ListOfferingsData,\n ListIntentsData,\n} from \"./generated/types.gen.js\";\n\n/** Documented `sort` values for the offerings list, from the generated op. */\nexport type OfferingSort = NonNullable<ListOfferingsData[\"query\"]>[\"sort\"];\n/** Documented `status` filter values for the intents list, from the generated op. */\nexport type IntentStatus = NonNullable<ListIntentsData[\"query\"]>[\"status\"];\n\n// Version-free base — the edge gateway serves the API at the host root; `/api/v2`\n// remains a working back-compat alias. The API version is pinned via the\n// `Wefunder-Version` header (DEFAULT_API_VERSION), not the path.\nexport const DEFAULT_API_BASE_URL = \"https://api.wefunder.com\";\nexport const DEFAULT_API_VERSION = \"2025-01-15\";\n\nexport type Mode = \"live\" | \"test\" | \"unknown\";\n\nexport function modeForToken(token: string): Mode {\n if (token.startsWith(\"at_live_\")) return \"live\";\n if (token.startsWith(\"at_test_\")) return \"test\";\n return \"unknown\";\n}\n\nexport interface WefunderOptions extends OAuthHostOptions {\n /** A bearer access token. Either this or `tokens` is required. */\n accessToken?: string;\n /** A full token set (access + rotating refresh). Enables auto-refresh. */\n tokens?: TokenSet;\n /** Needed (with the refresh token) to auto-refresh on expiry/401. */\n clientId?: string;\n clientSecret?: string;\n /**\n * Marks this as a client_credentials client so the SDK auto-re-mints on expiry/401\n * (cc tokens have no refresh token). `fromClientCredentials` sets this for you.\n */\n clientCredentials?: { scopes?: string[] };\n apiVersion?: string;\n /** Override the API base. The edge proxy routes mode by token prefix — leave default in prod. */\n baseUrl?: string;\n // OAuth hosts (oauthBaseUrl / authorizeBaseUrl / tokenBaseUrl) come from OAuthHostOptions.\n store?: TokenStore;\n onTokenRefresh?: (tokens: TokenSet) => void | Promise<void>;\n retry?: RetryOptions;\n // --- injectables (testing) ---\n fetch?: typeof fetch;\n now?: () => number;\n sleep?: (ms: number) => Promise<void>;\n random?: () => number;\n}\n\ntype Result<T> = Promise<{ data?: T; error?: unknown; response?: Response }>;\n\n/** Every generated operation, pre-bound to this client. */\ntype RawOps = {\n [K in keyof typeof ops]: (typeof ops)[K] extends (o: infer O) => infer R\n ? (options?: Omit<O & object, \"client\">) => R\n : never;\n};\n\nexport class Wefunder {\n readonly mode: Mode;\n readonly raw: RawOps;\n #client: Client;\n #tokens: TokenManager;\n\n constructor(opts: WefunderOptions) {\n const tokenSet: TokenSet | undefined =\n opts.tokens ?? (opts.accessToken ? { accessToken: opts.accessToken } : undefined);\n if (!tokenSet) {\n throw new Error(\"Wefunder: provide `accessToken` or `tokens`.\");\n }\n this.mode = modeForToken(tokenSet.accessToken);\n\n // For client_credentials clients, build a re-mint closure from the stored grant\n // inputs so the TokenManager can recover expired tokens (which have no refresh token).\n const reMint =\n opts.clientCredentials && opts.clientId && opts.clientSecret\n ? () =>\n clientCredentialsGrant({\n clientId: opts.clientId!,\n clientSecret: opts.clientSecret!,\n scopes: opts.clientCredentials!.scopes,\n oauthBaseUrl: opts.oauthBaseUrl,\n tokenBaseUrl: opts.tokenBaseUrl,\n fetch: opts.fetch,\n now: opts.now,\n })\n : undefined;\n\n this.#tokens = new TokenManager({\n tokens: tokenSet,\n clientId: opts.clientId,\n clientSecret: opts.clientSecret,\n reMint,\n oauthBaseUrl: opts.oauthBaseUrl,\n tokenBaseUrl: opts.tokenBaseUrl,\n onTokenRefresh: opts.onTokenRefresh,\n store: opts.store,\n fetch: opts.fetch,\n now: opts.now,\n });\n\n const wrappedFetch = createFetch({\n tokenManager: this.#tokens,\n fetch: opts.fetch,\n now: opts.now,\n sleep: opts.sleep,\n random: opts.random,\n retry: opts.retry,\n });\n\n this.#client = createClient({\n baseUrl: opts.baseUrl ?? DEFAULT_API_BASE_URL,\n headers: { \"Wefunder-Version\": opts.apiVersion ?? DEFAULT_API_VERSION },\n auth: () => this.#tokens.getAccessToken(),\n fetch: wrappedFetch,\n });\n\n this.raw = this.#buildRaw();\n }\n\n /** Server-to-server: exchange client credentials for a token, then build a client. */\n static async fromClientCredentials(\n opts: OAuthHostOptions & {\n clientId: string;\n clientSecret: string;\n scopes?: string[];\n apiVersion?: string;\n baseUrl?: string;\n fetch?: typeof fetch;\n now?: () => number;\n },\n ): Promise<Wefunder> {\n const tokens = await clientCredentialsGrant({\n clientId: opts.clientId,\n clientSecret: opts.clientSecret,\n scopes: opts.scopes,\n oauthBaseUrl: opts.oauthBaseUrl,\n tokenBaseUrl: opts.tokenBaseUrl,\n fetch: opts.fetch,\n now: opts.now,\n });\n return new Wefunder({\n tokens,\n clientId: opts.clientId,\n clientSecret: opts.clientSecret,\n clientCredentials: { scopes: opts.scopes }, // enables auto-re-mint on expiry/401\n oauthBaseUrl: opts.oauthBaseUrl,\n tokenBaseUrl: opts.tokenBaseUrl,\n apiVersion: opts.apiVersion,\n baseUrl: opts.baseUrl,\n fetch: opts.fetch,\n now: opts.now,\n });\n }\n\n /** The live token set (e.g. to persist after construction). */\n get tokens(): TokenSet {\n return this.#tokens.current;\n }\n\n // ---- unwrap: turn the {data,error,response} result into data-or-throw ----\n async #unwrap<T>(p: Result<T>): Promise<T> {\n const { data, error, response } = await p;\n if (response && response.ok && error === undefined) return data as T;\n const status = response?.status ?? 0;\n // The runtime error envelope nests request_id + remediation UNDER `error`\n // (api/v2/base_controller.rb#render_error), even though the spec's Error\n // schema models neither. Read them from there; fall back to top-level.\n const env = (error ?? {}) as {\n error?: { type?: string; message?: string; details?: unknown; request_id?: string; remediation?: string };\n request_id?: string;\n };\n throw new WefunderError({\n status,\n type: env.error?.type ?? \"api_error\",\n message: env.error?.message ?? response?.statusText ?? \"Request failed\",\n // X-Wf-Request-Id header is primary (present even on non-JSON edge errors).\n requestId: requestIdFrom(response, env.error?.request_id ?? env.request_id),\n details: env.error?.details,\n remediation: env.error?.remediation,\n });\n }\n\n // Single-resource ops return a `{ data: Entity }` envelope; strip it for ergonomics.\n async #unwrapData<T>(p: Result<unknown>): Promise<T> {\n const env = await this.#unwrap<{ data?: T }>(p as Result<{ data?: T }>);\n return env.data as T;\n }\n\n #buildRaw(): RawOps {\n const raw = {} as Record<string, unknown>;\n for (const [name, fn] of Object.entries(ops)) {\n raw[name] = (options?: Record<string, unknown>) =>\n (fn as (o: unknown) => unknown)({ ...options, client: this.#client });\n }\n return raw as RawOps;\n }\n\n /**\n * Unwrap any generated op result (incl. `wf.raw.*`) the way the ergonomic\n * namespaces do: returns the response body on success, throws a typed\n * `WefunderError` (with `request_id`) on failure. Lets `raw` callers keep the\n * SDK's error handling. (Stress-test finding C.)\n */\n unwrap<T>(p: Result<T>): Promise<T> {\n return this.#unwrap(p);\n }\n\n // Generic page helper: forwards the endpoint's full query (cursor + documented\n // params like `sort`), not just the cursor. (Stress-test finding B.)\n #page<T, Q extends { cursor?: Cursor } = { cursor?: Cursor }>(\n fn: (o: { client: Client; query?: Q }) => Result<Page<T>>,\n ) {\n return (query?: Q): Promise<Page<T>> =>\n this.#unwrap(fn({ client: this.#client, query }) as Result<Page<T>>);\n }\n\n // ---- resource namespaces (common GA paths) ----\n\n users = {\n me: () => this.#unwrapData<User>(ops.getCurrentUser({ client: this.#client })),\n };\n\n offerings = {\n list: this.#page<Offering, { cursor?: Cursor; sort?: OfferingSort }>(ops.listOfferings as never),\n all: (query?: { sort?: OfferingSort }): AsyncGenerator<Offering> =>\n paginate((cursor) => this.offerings.list({ ...query, cursor })),\n collect: (query?: { sort?: OfferingSort }): Promise<Offering[]> =>\n collect((cursor) => this.offerings.list({ ...query, cursor })),\n get: (externalId: string) =>\n this.#unwrapData<Offering>(\n ops.getOffering({ client: this.#client, path: { external_id: externalId } }),\n ),\n };\n\n investments = {\n list: this.#page<Investment>(ops.listInvestments as never),\n all: (): AsyncGenerator<Investment> => paginate((cursor) => this.investments.list({ cursor })),\n collect: (): Promise<Investment[]> => collect((cursor) => this.investments.list({ cursor })),\n };\n\n campaigns = {\n list: this.#page<Campaign>(ops.listCampaigns as never),\n all: (): AsyncGenerator<Campaign> => paginate((cursor) => this.campaigns.list({ cursor })),\n collect: (): Promise<Campaign[]> => collect((cursor) => this.campaigns.list({ cursor })),\n };\n\n syndicates = {\n list: this.#page<Syndicate, { cursor?: Cursor; limit?: number }>(ops.listSyndicates as never),\n all: (query?: { limit?: number }): AsyncGenerator<Syndicate> =>\n paginate((cursor) => this.syndicates.list({ ...query, cursor })),\n get: (id: number | string) =>\n this.#unwrapData<Syndicate>(ops.getSyndicate({ client: this.#client, path: { id } as never })),\n };\n\n intents = {\n list: this.#page<\n Intent,\n { cursor?: Cursor; status?: IntentStatus; resource_type?: string; resource_id?: number; limit?: number }\n >(ops.listIntents as never),\n all: (query?: {\n status?: IntentStatus;\n resource_type?: string;\n resource_id?: number;\n limit?: number;\n }): AsyncGenerator<Intent> => paginate((cursor) => this.intents.list({ ...query, cursor })),\n get: (id: number | string) =>\n this.#unwrapData<Intent>(ops.getIntent({ client: this.#client, path: { id } as never })),\n };\n\n attribution = {\n me: () => this.#unwrapData<AttributionMe>(ops.getAttributionMe({ client: this.#client })),\n };\n}\n","// Webhook signature verification. Matches the REAL Wefunder attribution webhook\n// scheme (app/jobs/attribution/webhook_delivery_job.rb): the delivery sends\n// X-Wefunder-Signature: sha256=<hex> where hex = HMAC-SHA256(secret, \"<ts>.<rawBody>\")\n// X-Wefunder-Timestamp: <unix seconds>\n// X-Wefunder-Event, X-Wefunder-Delivery-Id\n// We recompute the HMAC over \"<timestamp>.<rawBody>\" and constant-time compare,\n// plus a timestamp tolerance to reject replays (plan §4.2 #4, §9).\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\n\nexport const SIGNATURE_HEADER = \"x-wefunder-signature\";\nexport const TIMESTAMP_HEADER = \"x-wefunder-timestamp\";\nexport const EVENT_HEADER = \"x-wefunder-event\";\nexport const DELIVERY_ID_HEADER = \"x-wefunder-delivery-id\";\n\nexport interface VerifyWebhookOptions {\n /** The exact raw request body bytes/string (NOT a re-serialized object). */\n payload: string;\n /** Value of the X-Wefunder-Signature header (`sha256=<hex>`). */\n signature: string;\n /** Value of the X-Wefunder-Timestamp header (unix seconds). */\n timestamp: string | number;\n secret: string;\n /** Reject if |now - timestamp| exceeds this. Default 300s. Set 0 to disable. */\n toleranceSeconds?: number;\n now?: () => number;\n}\n\nfunction computeSignature(secret: string, timestamp: string | number, payload: string): string {\n const mac = createHmac(\"sha256\", secret).update(`${timestamp}.${payload}`).digest(\"hex\");\n return `sha256=${mac}`;\n}\n\nfunction constantTimeEqual(a: string, b: string): boolean {\n const ab = Buffer.from(a);\n const bb = Buffer.from(b);\n if (ab.length !== bb.length) return false;\n return timingSafeEqual(ab, bb);\n}\n\n/**\n * Returns true iff the signature is valid AND (when tolerance > 0) the timestamp\n * is within tolerance. Does not throw on a bad signature — returns false so the\n * caller can respond 400 without a try/catch.\n */\nexport function verifyWebhook(opts: VerifyWebhookOptions): boolean {\n const tolerance = opts.toleranceSeconds ?? 300;\n const now = (opts.now ?? Date.now)();\n const ts = Number(opts.timestamp);\n if (!Number.isFinite(ts)) return false;\n if (tolerance > 0 && Math.abs(now / 1000 - ts) > tolerance) return false;\n\n const expected = computeSignature(opts.secret, opts.timestamp, opts.payload);\n return constantTimeEqual(opts.signature, expected);\n}\n\nexport interface ParsedWebhook<T = unknown> {\n event: string;\n deliveryId: string;\n timestamp: number;\n data: T;\n}\n\n/**\n * Verify + parse in one step using a header lookup (works with Node's\n * IncomingHttpHeaders, a Headers instance, or a plain object). Returns the parsed\n * event on success; throws on an invalid signature so handlers fail loudly.\n */\nexport function constructEvent<T = unknown>(\n payload: string,\n headers: Headers | Record<string, string | string[] | undefined>,\n secret: string,\n opts?: { toleranceSeconds?: number; now?: () => number },\n): ParsedWebhook<T> {\n const get = (name: string): string | undefined => {\n if (headers instanceof Headers) return headers.get(name) ?? undefined;\n const v = headers[name] ?? headers[name.toLowerCase()];\n return Array.isArray(v) ? v[0] : v;\n };\n const signature = get(SIGNATURE_HEADER);\n const timestamp = get(TIMESTAMP_HEADER);\n if (!signature || !timestamp) {\n throw new Error(\"Missing X-Wefunder-Signature or X-Wefunder-Timestamp header\");\n }\n const ok = verifyWebhook({\n payload,\n signature,\n timestamp,\n secret,\n toleranceSeconds: opts?.toleranceSeconds,\n now: opts?.now,\n });\n if (!ok) throw new Error(\"Webhook signature verification failed\");\n return {\n event: get(EVENT_HEADER) ?? \"\",\n deliveryId: get(DELIVERY_ID_HEADER) ?? \"\",\n timestamp: Number(timestamp),\n data: JSON.parse(payload) as T,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACuEO,IAAM,qBAAqB;AAAA,EAChC,gBAAgB,CAAC,SACf,KAAK;AAAA,IAAU;AAAA,IAAM,CAAC,MAAM,UAC1B,OAAO,UAAU,WAAW,MAAM,SAAS,IAAI;AAAA,EACjD;AACJ;;;AChCA,IAAM,mBAAyC;AAAA,EAC7C,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AACX;AACA,IAAM,gBAAgB,OAAO,QAAQ,gBAAgB;;;ACsC9C,SAAS,gBAAiC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA2D;AACzD,MAAI;AAEJ,QAAM,QACJ,eACC,CAAC,OAAe,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAEnE,QAAM,eAAe,mBAAmB;AACtC,QAAI,aAAqB,wBAAwB;AACjD,QAAI,UAAU;AACd,UAAM,SAAS,QAAQ,UAAU,IAAI,gBAAgB,EAAE;AAEvD,WAAO,MAAM;AACX,UAAI,OAAO,QAAS;AAEpB;AAEA,YAAM,UACJ,QAAQ,mBAAmB,UACvB,QAAQ,UACR,IAAI,QAAQ,QAAQ,OAA6C;AAEvE,UAAI,gBAAgB,QAAW;AAC7B,gBAAQ,IAAI,iBAAiB,WAAW;AAAA,MAC1C;AAEA,UAAI;AACF,cAAM,cAA2B;AAAA,UAC/B,UAAU;AAAA,UACV,GAAG;AAAA,UACH,MAAM,QAAQ;AAAA,UACd;AAAA,UACA;AAAA,QACF;AACA,YAAI,UAAU,IAAI,QAAQ,KAAK,WAAW;AAC1C,YAAI,WAAW;AACb,oBAAU,MAAM,UAAU,KAAK,WAAW;AAAA,QAC5C;AAGA,cAAM,SAAS,QAAQ,SAAS,WAAW;AAC3C,cAAM,WAAW,MAAM,OAAO,OAAO;AAErC,YAAI,CAAC,SAAS;AACZ,gBAAM,IAAI;AAAA,YACR,eAAe,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,UACvD;AAEF,YAAI,CAAC,SAAS,KAAM,OAAM,IAAI,MAAM,yBAAyB;AAE7D,cAAM,SAAS,SAAS,KACrB,YAAY,IAAI,kBAAkB,CAAC,EACnC,UAAU;AAEb,YAAI,SAAS;AAEb,cAAM,eAAe,MAAM;AACzB,cAAI;AACF,mBAAO,OAAO;AAAA,UAChB,QAAQ;AAAA,UAER;AAAA,QACF;AAEA,eAAO,iBAAiB,SAAS,YAAY;AAE7C,YAAI;AACF,iBAAO,MAAM;AACX,kBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,gBAAI,KAAM;AACV,sBAAU;AACV,qBAAS,OAAO,QAAQ,UAAU,IAAI;AAEtC,kBAAM,SAAS,OAAO,MAAM,MAAM;AAClC,qBAAS,OAAO,IAAI,KAAK;AAEzB,uBAAW,SAAS,QAAQ;AAC1B,oBAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,oBAAM,YAA2B,CAAC;AAClC,kBAAI;AAEJ,yBAAW,QAAQ,OAAO;AACxB,oBAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,4BAAU,KAAK,KAAK,QAAQ,aAAa,EAAE,CAAC;AAAA,gBAC9C,WAAW,KAAK,WAAW,QAAQ,GAAG;AACpC,8BAAY,KAAK,QAAQ,cAAc,EAAE;AAAA,gBAC3C,WAAW,KAAK,WAAW,KAAK,GAAG;AACjC,gCAAc,KAAK,QAAQ,WAAW,EAAE;AAAA,gBAC1C,WAAW,KAAK,WAAW,QAAQ,GAAG;AACpC,wBAAM,SAAS,OAAO;AAAA,oBACpB,KAAK,QAAQ,cAAc,EAAE;AAAA,oBAC7B;AAAA,kBACF;AACA,sBAAI,CAAC,OAAO,MAAM,MAAM,GAAG;AACzB,iCAAa;AAAA,kBACf;AAAA,gBACF;AAAA,cACF;AAEA,kBAAI;AACJ,kBAAI,aAAa;AAEjB,kBAAI,UAAU,QAAQ;AACpB,sBAAM,UAAU,UAAU,KAAK,IAAI;AACnC,oBAAI;AACF,yBAAO,KAAK,MAAM,OAAO;AACzB,+BAAa;AAAA,gBACf,QAAQ;AACN,yBAAO;AAAA,gBACT;AAAA,cACF;AAEA,kBAAI,YAAY;AACd,oBAAI,mBAAmB;AACrB,wBAAM,kBAAkB,IAAI;AAAA,gBAC9B;AAEA,oBAAI,qBAAqB;AACvB,yBAAO,MAAM,oBAAoB,IAAI;AAAA,gBACvC;AAAA,cACF;AAEA,2BAAa;AAAA,gBACX;AAAA,gBACA,OAAO;AAAA,gBACP,IAAI;AAAA,gBACJ,OAAO;AAAA,cACT,CAAC;AAED,kBAAI,UAAU,QAAQ;AACpB,sBAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF,UAAE;AACA,iBAAO,oBAAoB,SAAS,YAAY;AAChD,iBAAO,YAAY;AAAA,QACrB;AAEA;AAAA,MACF,SAAS,OAAO;AAEd,qBAAa,KAAK;AAElB,YACE,wBAAwB,UACxB,WAAW,qBACX;AACA;AAAA,QACF;AAGA,cAAM,UAAU,KAAK;AAAA,UACnB,aAAa,MAAM,UAAU;AAAA,UAC7B,oBAAoB;AAAA,QACtB;AACA,cAAM,MAAM,OAAO;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,aAAa;AAE5B,SAAO,EAAE,OAAO;AAClB;;;AC5OO,IAAM,wBAAwB,CACnC,UAC0B;AAC1B,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,0BAA0B,CACrC,UACsB;AACtB,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,yBAAyB,CACpC,UAC0B;AAC1B,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAEc;AACZ,MAAI,CAAC,SAAS;AACZ,UAAMA,iBACJ,gBAAgB,QAAQ,MAAM,IAAI,CAAC,MAAM,mBAAmB,CAAW,CAAC,GACxE,KAAK,wBAAwB,KAAK,CAAC;AACrC,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,eAAO,IAAIA,aAAY;AAAA,MACzB,KAAK;AACH,eAAO,IAAI,IAAI,IAAIA,aAAY;AAAA,MACjC,KAAK;AACH,eAAOA;AAAA,MACT;AACE,eAAO,GAAG,IAAI,IAAIA,aAAY;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,YAAY,sBAAsB,KAAK;AAC7C,QAAM,eAAe,MAClB,IAAI,CAAC,MAAM;AACV,QAAI,UAAU,WAAW,UAAU,UAAU;AAC3C,aAAO,gBAAgB,IAAI,mBAAmB,CAAW;AAAA,IAC3D;AAEA,WAAO,wBAAwB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAAA,EACH,CAAC,EACA,KAAK,SAAS;AACjB,SAAO,UAAU,WAAW,UAAU,WAClC,YAAY,eACZ;AACN;AAEO,IAAM,0BAA0B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,MAAuC;AACrC,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,GAAG,IAAI,IAAI,gBAAgB,QAAQ,mBAAmB,KAAK,CAAC;AACrE;AAEO,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAGc;AACZ,MAAI,iBAAiB,MAAM;AACzB,WAAO,YAAY,MAAM,YAAY,IAAI,GAAG,IAAI,IAAI,MAAM,YAAY,CAAC;AAAA,EACzE;AAEA,MAAI,UAAU,gBAAgB,CAAC,SAAS;AACtC,QAAI,SAAmB,CAAC;AACxB,WAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,MAAM;AAC1C,eAAS;AAAA,QACP,GAAG;AAAA,QACH;AAAA,QACA,gBAAiB,IAAe,mBAAmB,CAAW;AAAA,MAChE;AAAA,IACF,CAAC;AACD,UAAMA,gBAAe,OAAO,KAAK,GAAG;AACpC,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,eAAO,GAAG,IAAI,IAAIA,aAAY;AAAA,MAChC,KAAK;AACH,eAAO,IAAIA,aAAY;AAAA,MACzB,KAAK;AACH,eAAO,IAAI,IAAI,IAAIA,aAAY;AAAA,MACjC;AACE,eAAOA;AAAA,IACX;AAAA,EACF;AAEA,QAAM,YAAY,uBAAuB,KAAK;AAC9C,QAAM,eAAe,OAAO,QAAQ,KAAK,EACtC;AAAA,IAAI,CAAC,CAAC,KAAK,CAAC,MACX,wBAAwB;AAAA,MACtB;AAAA,MACA,MAAM,UAAU,eAAe,GAAG,IAAI,IAAI,GAAG,MAAM;AAAA,MACnD,OAAO;AAAA,IACT,CAAC;AAAA,EACH,EACC,KAAK,SAAS;AACjB,SAAO,UAAU,WAAW,UAAU,WAClC,YAAY,eACZ;AACN;;;AC1KO,IAAM,gBAAwB;AAE9B,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA,KAAK;AACP,MAA8B;AAC5B,MAAI,MAAM;AACV,QAAM,UAAU,KAAK,MAAM,aAAa;AACxC,MAAI,SAAS;AACX,eAAW,SAAS,SAAS;AAC3B,UAAI,UAAU;AACd,UAAI,OAAO,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC;AAC9C,UAAI,QAA6B;AAEjC,UAAI,KAAK,SAAS,GAAG,GAAG;AACtB,kBAAU;AACV,eAAO,KAAK,UAAU,GAAG,KAAK,SAAS,CAAC;AAAA,MAC1C;AAEA,UAAI,KAAK,WAAW,GAAG,GAAG;AACxB,eAAO,KAAK,UAAU,CAAC;AACvB,gBAAQ;AAAA,MACV,WAAW,KAAK,WAAW,GAAG,GAAG;AAC/B,eAAO,KAAK,UAAU,CAAC;AACvB,gBAAQ;AAAA,MACV;AAEA,YAAM,QAAQ,KAAK,IAAI;AAEvB,UAAI,UAAU,UAAa,UAAU,MAAM;AACzC;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,oBAAoB,EAAE,SAAS,MAAM,OAAO,MAAM,CAAC;AAAA,QACrD;AACA;AAAA,MACF;AAEA,UAAI,OAAO,UAAU,UAAU;AAC7B,cAAM,IAAI;AAAA,UACR;AAAA,UACA,qBAAqB;AAAA,YACnB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,WAAW;AAAA,UACb,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAEA,UAAI,UAAU,UAAU;AACtB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,IAAI,wBAAwB;AAAA,YAC1B;AAAA,YACA;AAAA,UACF,CAAC,CAAC;AAAA,QACJ;AACA;AAAA,MACF;AAEA,YAAM,eAAe;AAAA,QACnB,UAAU,UAAU,IAAI,KAAe,KAAM;AAAA,MAC/C;AACA,YAAM,IAAI,QAAQ,OAAO,YAAY;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,SAAS,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAK;AACP,MAMc;AACZ,QAAM,UAAU,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AACtD,MAAI,OAAO,WAAW,MAAM;AAC5B,MAAI,MAAM;AACR,UAAM,sBAAsB,EAAE,MAAM,IAAI,CAAC;AAAA,EAC3C;AACA,MAAI,SAAS,QAAQ,gBAAgB,KAAK,IAAI;AAC9C,MAAI,OAAO,WAAW,GAAG,GAAG;AAC1B,aAAS,OAAO,UAAU,CAAC;AAAA,EAC7B;AACA,MAAI,QAAQ;AACV,WAAO,IAAI,MAAM;AAAA,EACnB;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,SAIxB;AACV,QAAM,UAAU,QAAQ,SAAS;AACjC,QAAM,mBAAmB,WAAW,QAAQ;AAE5C,MAAI,kBAAkB;AACpB,QAAI,oBAAoB,SAAS;AAC/B,YAAM,oBACJ,QAAQ,mBAAmB,UAAa,QAAQ,mBAAmB;AAErE,aAAO,oBAAoB,QAAQ,iBAAiB;AAAA,IACtD;AAGA,WAAO,QAAQ,SAAS,KAAK,QAAQ,OAAO;AAAA,EAC9C;AAGA,MAAI,SAAS;AACX,WAAO,QAAQ;AAAA,EACjB;AAGA,SAAO;AACT;;;ACrHO,IAAM,eAAe,OAC1B,MACA,aACgC;AAChC,QAAM,QACJ,OAAO,aAAa,aAAa,MAAM,SAAS,IAAI,IAAI;AAE1D,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AAEA,MAAI,KAAK,WAAW,UAAU;AAC5B,WAAO,UAAU,KAAK;AAAA,EACxB;AAEA,MAAI,KAAK,WAAW,SAAS;AAC3B,WAAO,SAAS,KAAK,KAAK,CAAC;AAAA,EAC7B;AAEA,SAAO;AACT;;;AC9BO,IAAM,wBAAwB,CAAc;AAAA,EACjD,aAAa,CAAC;AAAA,EACd,GAAG;AACL,IAA4B,CAAC,MAAoC;AAC/D,QAAM,kBAAkB,CAAC,gBAA2B;AAClD,UAAM,SAAmB,CAAC;AAC1B,QAAI,eAAe,OAAO,gBAAgB,UAAU;AAClD,iBAAW,QAAQ,aAAa;AAC9B,cAAM,QAAQ,YAAY,IAAI;AAE9B,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC;AAAA,QACF;AAEA,cAAM,UAAU,WAAW,IAAI,KAAK;AAEpC,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,gBAAM,kBAAkB,oBAAoB;AAAA,YAC1C,eAAe,QAAQ;AAAA,YACvB,SAAS;AAAA,YACT;AAAA,YACA,OAAO;AAAA,YACP;AAAA,YACA,GAAG,QAAQ;AAAA,UACb,CAAC;AACD,cAAI,gBAAiB,QAAO,KAAK,eAAe;AAAA,QAClD,WAAW,OAAO,UAAU,UAAU;AACpC,gBAAM,mBAAmB,qBAAqB;AAAA,YAC5C,eAAe,QAAQ;AAAA,YACvB,SAAS;AAAA,YACT;AAAA,YACA,OAAO;AAAA,YACP;AAAA,YACA,GAAG,QAAQ;AAAA,UACb,CAAC;AACD,cAAI,iBAAkB,QAAO,KAAK,gBAAgB;AAAA,QACpD,OAAO;AACL,gBAAM,sBAAsB,wBAAwB;AAAA,YAClD,eAAe,QAAQ;AAAA,YACvB;AAAA,YACA;AAAA,UACF,CAAC;AACD,cAAI,oBAAqB,QAAO,KAAK,mBAAmB;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AACA,WAAO,OAAO,KAAK,GAAG;AAAA,EACxB;AACA,SAAO;AACT;AAKO,IAAM,aAAa,CACxB,gBACuC;AACvC,MAAI,CAAC,aAAa;AAGhB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,YAAY,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK;AAErD,MAAI,CAAC,cAAc;AACjB;AAAA,EACF;AAEA,MACE,aAAa,WAAW,kBAAkB,KAC1C,aAAa,SAAS,OAAO,GAC7B;AACA,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,uBAAuB;AAC1C,WAAO;AAAA,EACT;AAEA,MACE,CAAC,gBAAgB,UAAU,UAAU,QAAQ,EAAE;AAAA,IAAK,CAAC,SACnD,aAAa,WAAW,IAAI;AAAA,EAC9B,GACA;AACA,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,WAAW,OAAO,GAAG;AACpC,WAAO;AAAA,EACT;AAEA;AACF;AAEA,IAAM,oBAAoB,CACxB,SAGA,SACY;AACZ,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,MACE,QAAQ,QAAQ,IAAI,IAAI,KACxB,QAAQ,QAAQ,IAAI,KACpB,QAAQ,QAAQ,IAAI,QAAQ,GAAG,SAAS,GAAG,IAAI,GAAG,GAClD;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAsB,cACpB,SAGe;AACf,aAAW,QAAQ,QAAQ,YAAY,CAAC,GAAG;AACzC,QAAI,kBAAkB,SAAS,KAAK,IAAI,GAAG;AACzC;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,aAAa,MAAM,QAAQ,IAAI;AAEnD,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,QAAQ;AAE1B,YAAQ,KAAK,IAAI;AAAA,MACf,KAAK;AACH,YAAI,CAAC,QAAQ,OAAO;AAClB,kBAAQ,QAAQ,CAAC;AAAA,QACnB;AACA,gBAAQ,MAAM,IAAI,IAAI;AACtB;AAAA,MACF,KAAK;AACH,gBAAQ,QAAQ,OAAO,UAAU,GAAG,IAAI,IAAI,KAAK,EAAE;AACnD;AAAA,MACF,KAAK;AAAA,MACL;AACE,gBAAQ,QAAQ,IAAI,MAAM,KAAK;AAC/B;AAAA,IACJ;AAAA,EACF;AACF;AAEO,IAAM,WAA+B,CAAC,YAC3C,OAAO;AAAA,EACL,SAAS,QAAQ;AAAA,EACjB,MAAM,QAAQ;AAAA,EACd,OAAO,QAAQ;AAAA,EACf,iBACE,OAAO,QAAQ,oBAAoB,aAC/B,QAAQ,kBACR,sBAAsB,QAAQ,eAAe;AAAA,EACnD,KAAK,QAAQ;AACf,CAAC;AAEI,IAAM,eAAe,CAAC,GAAW,MAAsB;AAC5D,QAAM,SAAS,EAAE,GAAG,GAAG,GAAG,EAAE;AAC5B,MAAI,OAAO,SAAS,SAAS,GAAG,GAAG;AACjC,WAAO,UAAU,OAAO,QAAQ,UAAU,GAAG,OAAO,QAAQ,SAAS,CAAC;AAAA,EACxE;AACA,SAAO,UAAU,aAAa,EAAE,SAAS,EAAE,OAAO;AAClD,SAAO;AACT;AAEA,IAAM,iBAAiB,CAAC,YAA8C;AACpE,QAAM,UAAmC,CAAC;AAC1C,UAAQ,QAAQ,CAAC,OAAO,QAAQ;AAC9B,YAAQ,KAAK,CAAC,KAAK,KAAK,CAAC;AAAA,EAC3B,CAAC;AACD,SAAO;AACT;AAEO,IAAM,eAAe,IACvB,YACS;AACZ,QAAM,gBAAgB,IAAI,QAAQ;AAClC,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,UAAM,WACJ,kBAAkB,UACd,eAAe,MAAM,IACrB,OAAO,QAAQ,MAAM;AAE3B,eAAW,CAAC,KAAK,KAAK,KAAK,UAAU;AACnC,UAAI,UAAU,MAAM;AAClB,sBAAc,OAAO,GAAG;AAAA,MAC1B,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,mBAAW,KAAK,OAAO;AACrB,wBAAc,OAAO,KAAK,CAAW;AAAA,QACvC;AAAA,MACF,WAAW,UAAU,QAAW;AAG9B,sBAAc;AAAA,UACZ;AAAA,UACA,OAAO,UAAU,WAAW,KAAK,UAAU,KAAK,IAAK;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAsBA,IAAM,eAAN,MAAgC;AAAA,EAC9B,MAAiC,CAAC;AAAA,EAElC,QAAc;AACZ,SAAK,MAAM,CAAC;AAAA,EACd;AAAA,EAEA,MAAM,IAAgC;AACpC,UAAM,QAAQ,KAAK,oBAAoB,EAAE;AACzC,QAAI,KAAK,IAAI,KAAK,GAAG;AACnB,WAAK,IAAI,KAAK,IAAI;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,OAAO,IAAmC;AACxC,UAAM,QAAQ,KAAK,oBAAoB,EAAE;AACzC,WAAO,QAAQ,KAAK,IAAI,KAAK,CAAC;AAAA,EAChC;AAAA,EAEA,oBAAoB,IAAkC;AACpD,QAAI,OAAO,OAAO,UAAU;AAC1B,aAAO,KAAK,IAAI,EAAE,IAAI,KAAK;AAAA,IAC7B;AACA,WAAO,KAAK,IAAI,QAAQ,EAAE;AAAA,EAC5B;AAAA,EAEA,OACE,IACA,IAC8B;AAC9B,UAAM,QAAQ,KAAK,oBAAoB,EAAE;AACzC,QAAI,KAAK,IAAI,KAAK,GAAG;AACnB,WAAK,IAAI,KAAK,IAAI;AAClB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,IAAyB;AAC3B,SAAK,IAAI,KAAK,EAAE;AAChB,WAAO,KAAK,IAAI,SAAS;AAAA,EAC3B;AACF;AAQO,IAAM,qBAAqB,OAK5B;AAAA,EACJ,OAAO,IAAI,aAAqD;AAAA,EAChE,SAAS,IAAI,aAA2C;AAAA,EACxD,UAAU,IAAI,aAAgD;AAChE;AAEA,IAAM,yBAAyB,sBAAsB;AAAA,EACnD,eAAe;AAAA,EACf,OAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACF,CAAC;AAED,IAAM,iBAAiB;AAAA,EACrB,gBAAgB;AAClB;AAEO,IAAM,eAAe,CAC1B,WAAqD,CAAC,OACR;AAAA,EAC9C,GAAG;AAAA,EACH,SAAS;AAAA,EACT,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,GAAG;AACL;;;ACtTO,IAAM,eAAe,CAAC,SAAiB,CAAC,MAAc;AAC3D,MAAI,UAAU,aAAa,aAAa,GAAG,MAAM;AAEjD,QAAM,YAAY,OAAe,EAAE,GAAG,QAAQ;AAE9C,QAAM,YAAY,CAACC,YAA2B;AAC5C,cAAU,aAAa,SAASA,OAAM;AACtC,WAAO,UAAU;AAAA,EACnB;AAEA,QAAM,eAAe,mBAKnB;AAEF,QAAM,gBAAgB,OAMpB,YACG;AACH,UAAM,OAAO;AAAA,MACX,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO,QAAQ,SAAS,QAAQ,SAAS,WAAW;AAAA,MACpD,SAAS,aAAa,QAAQ,SAAS,QAAQ,OAAO;AAAA,MACtD,gBAAgB;AAAA,IAClB;AAEA,QAAI,KAAK,UAAU;AACjB,YAAM,cAAc,IAAI;AAAA,IAC1B;AAEA,QAAI,KAAK,kBAAkB;AACzB,YAAM,KAAK,iBAAiB,IAAI;AAAA,IAClC;AAEA,QAAI,KAAK,SAAS,UAAa,KAAK,gBAAgB;AAClD,WAAK,iBAAiB,KAAK,eAAe,KAAK,IAAI;AAAA,IAErD;AAGA,QAAI,KAAK,SAAS,UAAa,KAAK,mBAAmB,IAAI;AACzD,WAAK,QAAQ,OAAO,cAAc;AAAA,IACpC;AAEA,UAAM,eAAe;AAErB,UAAM,MAAM,SAAS,YAAY;AAEjC,WAAO,EAAE,MAAM,cAAc,IAAI;AAAA,EACnC;AAEA,QAAM,UAA6B,OAAO,YAAY;AACpD,UAAM,eAAe,QAAQ,gBAAgB,QAAQ;AACrD,UAAM,gBAAgB,QAAQ,iBAAiB,QAAQ;AAEvD,QAAIC;AACJ,QAAI;AAEJ,QAAI;AACF,YAAM,EAAE,MAAM,IAAI,IAAI,MAAM,cAAc,OAAO;AACjD,YAAM,cAAuB;AAAA,QAC3B,UAAU;AAAA,QACV,GAAG;AAAA,QACH,MAAM,oBAAoB,IAAI;AAAA,MAChC;AAEA,MAAAA,WAAU,IAAI,QAAQ,KAAK,WAAW;AAEtC,iBAAW,MAAM,aAAa,QAAQ,KAAK;AACzC,YAAI,IAAI;AACN,UAAAA,WAAU,MAAM,GAAGA,UAAS,IAAI;AAAA,QAClC;AAAA,MACF;AAIA,YAAM,SAAS,KAAK;AAEpB,iBAAW,MAAM,OAAOA,QAAO;AAE/B,iBAAW,MAAM,aAAa,SAAS,KAAK;AAC1C,YAAI,IAAI;AACN,qBAAW,MAAM,GAAG,UAAUA,UAAS,IAAI;AAAA,QAC7C;AAAA,MACF;AAEA,YAAM,SAAS;AAAA,QACb,SAAAA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,SAAS,IAAI;AACf,cAAM,WACH,KAAK,YAAY,SACd,WAAW,SAAS,QAAQ,IAAI,cAAc,CAAC,IAC/C,KAAK,YAAY;AAEvB,YACE,SAAS,WAAW,OACpB,SAAS,QAAQ,IAAI,gBAAgB,MAAM,KAC3C;AACA,cAAI;AACJ,kBAAQ,SAAS;AAAA,YACf,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AACH,0BAAY,MAAM,SAAS,OAAO,EAAE;AACpC;AAAA,YACF,KAAK;AACH,0BAAY,IAAI,SAAS;AACzB;AAAA,YACF,KAAK;AACH,0BAAY,SAAS;AACrB;AAAA,YACF,KAAK;AAAA,YACL;AACE,0BAAY,CAAC;AACb;AAAA,UACJ;AACA,iBAAO,KAAK,kBAAkB,SAC1B,YACA;AAAA,YACE,MAAM;AAAA,YACN,GAAG;AAAA,UACL;AAAA,QACN;AAEA,YAAI;AACJ,gBAAQ,SAAS;AAAA,UACf,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AACH,mBAAO,MAAM,SAAS,OAAO,EAAE;AAC/B;AAAA,UACF,KAAK,QAAQ;AAGX,kBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,mBAAO,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC;AAClC;AAAA,UACF;AAAA,UACA,KAAK;AACH,mBAAO,KAAK,kBAAkB,SAC1B,SAAS,OACT;AAAA,cACE,MAAM,SAAS;AAAA,cACf,GAAG;AAAA,YACL;AAAA,QACR;AAEA,YAAI,YAAY,QAAQ;AACtB,cAAI,KAAK,mBAAmB;AAC1B,kBAAM,KAAK,kBAAkB,IAAI;AAAA,UACnC;AAEA,cAAI,KAAK,qBAAqB;AAC5B,mBAAO,MAAM,KAAK,oBAAoB,IAAI;AAAA,UAC5C;AAAA,QACF;AAEA,eAAO,KAAK,kBAAkB,SAC1B,OACA;AAAA,UACE;AAAA,UACA,GAAG;AAAA,QACL;AAAA,MACN;AAEA,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,UAAI;AAEJ,UAAI;AACF,oBAAY,KAAK,MAAM,SAAS;AAAA,MAClC,QAAQ;AAAA,MAER;AAEA,YAAM,aAAa;AAAA,IACrB,SAAS,OAAO;AACd,UAAI,aAAa;AAEjB,iBAAW,MAAM,aAAa,MAAM,KAAK;AACvC,YAAI,IAAI;AACN,uBAAa,MAAM;AAAA,YACjB;AAAA,YACA;AAAA,YACAA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,mBAAa,cAAc,CAAC;AAE5B,UAAI,cAAc;AAChB,cAAM;AAAA,MACR;AAGA,aAAO,kBAAkB,SACrB,SACA;AAAA,QACE,OAAO;AAAA,QACP,SAAAA;AAAA,QACA;AAAA,MACF;AAAA,IACN;AAAA,EACF;AAEA,QAAM,eACJ,CAAC,WAAkC,CAAC,YAClC,QAAQ,EAAE,GAAG,SAAS,OAAO,CAAC;AAElC,QAAM,YACJ,CAAC,WAAkC,OAAO,YAA4B;AACpE,UAAM,EAAE,MAAM,IAAI,IAAI,MAAM,cAAc,OAAO;AACjD,WAAO,gBAAgB;AAAA,MACrB,GAAG;AAAA,MACH,MAAM,KAAK;AAAA,MACX;AAAA,MACA,WAAW,OAAOC,MAAK,SAAS;AAC9B,YAAID,WAAU,IAAI,QAAQC,MAAK,IAAI;AACnC,mBAAW,MAAM,aAAa,QAAQ,KAAK;AACzC,cAAI,IAAI;AACN,YAAAD,WAAU,MAAM,GAAGA,UAAS,IAAI;AAAA,UAClC;AAAA,QACF;AACA,eAAOA;AAAA,MACT;AAAA,MACA,gBAAgB,oBAAoB,IAAI;AAAA,MAExC;AAAA,IACF,CAAC;AAAA,EACH;AAEF,QAAM,YAAgC,CAAC,YACrC,SAAS,EAAE,GAAG,SAAS,GAAG,QAAQ,CAAC;AAErC,SAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS,aAAa,SAAS;AAAA,IAC/B,QAAQ,aAAa,QAAQ;AAAA,IAC7B,KAAK,aAAa,KAAK;AAAA,IACvB;AAAA,IACA,MAAM,aAAa,MAAM;AAAA,IACzB;AAAA,IACA,SAAS,aAAa,SAAS;AAAA,IAC/B,OAAO,aAAa,OAAO;AAAA,IAC3B,MAAM,aAAa,MAAM;AAAA,IACzB,KAAK,aAAa,KAAK;AAAA,IACvB;AAAA,IACA;AAAA,IACA,KAAK;AAAA,MACH,SAAS,UAAU,SAAS;AAAA,MAC5B,QAAQ,UAAU,QAAQ;AAAA,MAC1B,KAAK,UAAU,KAAK;AAAA,MACpB,MAAM,UAAU,MAAM;AAAA,MACtB,SAAS,UAAU,SAAS;AAAA,MAC5B,OAAO,UAAU,OAAO;AAAA,MACxB,MAAM,UAAU,MAAM;AAAA,MACtB,KAAK,UAAU,KAAK;AAAA,MACpB,OAAO,UAAU,OAAO;AAAA,IAC1B;AAAA,IACA,OAAO,aAAa,OAAO;AAAA,EAC7B;AACF;;;AC9QA,IAAM,aAAa,oBAAI,IAAI,CAAC,OAAO,QAAQ,SAAS,CAAC;AAErD,SAAS,SAAS,OAAmB,MAA4B;AAC/D,MAAI,MAAM,OAAQ,QAAO,KAAK,OAAO,YAAY;AACjD,MAAI,iBAAiB,QAAS,QAAO,MAAM,OAAO,YAAY;AAC9D,SAAO;AACT;AAOO,SAAS,gBAAgB,UAAoB,KAAa,YAA4B;AAC3F,QAAM,MAAM,SAAS,QAAQ,IAAI,mBAAmB;AACpD,MAAI,CAAC,IAAK,QAAO,KAAK,IAAI,KAAM,UAAU;AAC1C,QAAM,IAAI,OAAO,GAAG;AACpB,MAAI,CAAC,OAAO,SAAS,CAAC,EAAG,QAAO,KAAK,IAAI,KAAM,UAAU;AAEzD,QAAM,OAAO,IAAI,MAAgB,IAAI,MAAO,MAAM,IAAI;AACtD,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,UAAU,CAAC;AAC/C;AAEA,SAAS,UAAU,SAAiB,MAA8B,QAA8B;AAC9F,QAAM,MAAM,KAAK,cAAc,KAAK;AACpC,QAAM,SAAS,MAAM,MAAM,OAAO;AAClC,SAAO,KAAK,IAAI,MAAM,QAAQ,KAAK,UAAU;AAC/C;AAEO,SAAS,YAAY,MAA8B;AACxD,QAAM,YAAY,KAAK,SAAS;AAChC,QAAM,QAAQ,KAAK,UAAU,CAAC,OAAe,IAAI,QAAc,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AACvF,QAAM,MAAM,KAAK,OAAO,KAAK;AAC7B,QAAM,SAAS,KAAK,UAAU,KAAK;AACnC,QAAM,QAAgC;AAAA,IACpC,YAAY,KAAK,OAAO,cAAc;AAAA,IACtC,aAAa,KAAK,OAAO,eAAe;AAAA,IACxC,YAAY,KAAK,OAAO,cAAc;AAAA,EACxC;AAEA,SAAO,eAAe,aAAa,OAAmB,MAAuC;AAC3F,UAAM,SAAS,SAAS,OAAO,IAAI;AACnC,UAAM,aAAa,WAAW,IAAI,MAAM;AACxC,UAAM,YAAY,iBAAiB;AACnC,QAAI,YAAY;AAChB,QAAI,UAAU;AACd,QAAI;AAOJ,UAAM,WAAW,CAAC,cAA0C;AAC1D,UAAI,WAAW;AACb,cAAM,QAAS,MAAkB,MAAM;AACvC,YAAI,cAAc,OAAW,QAAO,UAAU,KAAK;AACnD,cAAM,UAAU,IAAI,QAAQ,MAAM,OAAO;AACzC,gBAAQ,IAAI,iBAAiB,UAAU,SAAS,EAAE;AAClD,eAAO,UAAU,IAAI,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC;AAAA,MAClD;AACA,YAAM,WACJ,cAAc,SACV,QACC,MAAM;AACL,cAAM,UAAU,IAAI,QAAQ,MAAM,OAAO;AACzC,gBAAQ,IAAI,iBAAiB,UAAU,SAAS,EAAE;AAClD,eAAO,EAAE,GAAG,MAAM,QAAQ;AAAA,MAC5B,GAAG;AACT,aAAO,UAAU,OAAO,QAAQ;AAAA,IAClC;AAEA,eAAS;AACP,UAAI;AACJ,UAAI;AACJ,UAAI;AACF,mBAAW,MAAM,SAAS,UAAU;AAAA,MACtC,SAAS,KAAK;AACZ,uBAAe;AAAA,MACjB;AAKA,UAAI,UAAU,WAAW,OAAO,CAAC,aAAa,KAAK,cAAc,YAAY;AAC3E,oBAAY;AACZ,cAAM,OAAO,MAAM,KAAK,aAAa,QAAQ;AAC7C,qBAAa,KAAK;AAClB;AAAA,MACF;AAGA,UAAI,UAAU,WAAW,OAAO,UAAU,MAAM,YAAY;AAC1D;AACA,cAAM,MAAM,gBAAgB,UAAU,IAAI,GAAG,MAAM,UAAU,CAAC;AAC9D;AAAA,MACF;AAGA,YAAM,YAAY,iBAAiB,UAAc,aAAa,UAAa,SAAS,UAAU;AAC9F,UAAI,aAAa,cAAc,UAAU,MAAM,YAAY;AACzD;AACA,cAAM,MAAM,UAAU,SAAS,OAAO,MAAM,CAAC;AAC7C;AAAA,MACF;AAEA,UAAI,SAAU,QAAO;AACrB,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;ACzHA,yBAAwC;AAGjC,IAAM,6BAA6B;AAGnC,IAAM,6BAA6B;AAInC,IAAM,yBAAyB;AAM/B,IAAM,yBAAyB;AAatC,SAAS,qBAAqB,UAA0B;AACtD,SAAO,SAAS,WAAW,UAAU,IAAI,6BAA6B;AACxE;AAEO,SAAS,iBAAiB,GAA6B;AAC5D,SAAO,EAAE,gBAAgB,EAAE,gBAAgB;AAC7C;AAmBA,SAAS,WAAW,KAAuB,KAAuB;AAChE,SAAO;AAAA,IACL,aAAa,IAAI;AAAA,IACjB,cAAc,IAAI;AAAA,IAClB,WAAW,IAAI,aAAa,MAAM,IAAI,aAAa,MAAO;AAAA,IAC1D,OAAO,IAAI;AAAA,IACX,WAAW,IAAI;AAAA,EACjB;AACF;AAEA,eAAe,UACb,cACA,QACA,WACA,KACmB;AACnB,QAAM,MAAM,MAAM,UAAU,GAAG,YAAY,UAAU;AAAA,IACnD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,IAC/D,MAAM,IAAI,gBAAgB,MAAM,EAAE,SAAS;AAAA,EAC7C,CAAC;AACD,MAAI,CAAC,IAAI,IAAI;AACX,QAAI,SAAS;AACb,QAAI;AACF,eAAS,KAAK,UAAU,MAAM,IAAI,KAAK,CAAC;AAAA,IAC1C,QAAQ;AACN,eAAS,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAAA,IAC1C;AACA,UAAM,IAAI,MAAM,+BAA+B,IAAI,MAAM,MAAM,MAAM,EAAE;AAAA,EACzE;AACA,SAAO,WAAY,MAAM,IAAI,KAAK,GAAwB,IAAI,CAAC;AACjE;AAUA,SAAS,UAAU,KAAqB;AACtC,SAAO,IAAI,SAAS,QAAQ,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,EAAE;AACzF;AAGO,SAAS,eAAqB;AACnC,QAAM,eAAe,cAAU,gCAAY,EAAE,CAAC;AAC9C,QAAM,gBAAgB,cAAU,+BAAW,QAAQ,EAAE,OAAO,YAAY,EAAE,OAAO,CAAC;AAClF,SAAO,EAAE,cAAc,eAAe,qBAAqB,OAAO;AACpE;AAYO,SAAS,uBAAuB,MAAuC;AAG5E,QAAM,OAAO,KAAK,oBAAoB,KAAK,gBAAgB,qBAAqB,KAAK,QAAQ;AAC7F,QAAM,IAAI,IAAI,gBAAgB;AAAA,IAC5B,eAAe;AAAA,IACf,WAAW,KAAK;AAAA,IAChB,cAAc,KAAK;AAAA,IACnB,OAAO,KAAK,OAAO,KAAK,GAAG;AAAA,IAC3B,OAAO,KAAK;AAAA,IACZ,gBAAgB,KAAK,KAAK;AAAA,IAC1B,uBAAuB,KAAK,KAAK;AAAA,EACnC,CAAC;AACD,SAAO,GAAG,IAAI,cAAc,EAAE,SAAS,CAAC;AAC1C;AAcO,SAAS,aAAa,MAA8C;AACzE,QAAM,SAAiC;AAAA,IACrC,YAAY;AAAA,IACZ,WAAW,KAAK;AAAA,IAChB,MAAM,KAAK;AAAA,IACX,cAAc,KAAK;AAAA,IACnB,eAAe,KAAK;AAAA,EACtB;AACA,MAAI,KAAK,aAAc,QAAO,gBAAgB,KAAK;AACnD,SAAO,UAAU,iBAAiB,IAAI,GAAG,QAAQ,KAAK,SAAS,OAAO,KAAK,OAAO,KAAK,GAAG;AAC5F;AAYO,SAAS,uBAAuB,MAAmD;AACxF,QAAM,SAAiC;AAAA,IACrC,YAAY;AAAA,IACZ,WAAW,KAAK;AAAA,IAChB,eAAe,KAAK;AAAA,EACtB;AACA,MAAI,KAAK,QAAQ,OAAQ,QAAO,QAAQ,KAAK,OAAO,KAAK,GAAG;AAC5D,SAAO,UAAU,iBAAiB,IAAI,GAAG,QAAQ,KAAK,SAAS,OAAO,KAAK,OAAO,KAAK,GAAG;AAC5F;AAiBO,SAAS,aAAa,MAAyC;AACpE,QAAM,SAAiC;AAAA,IACrC,YAAY;AAAA,IACZ,WAAW,KAAK;AAAA,IAChB,eAAe,KAAK;AAAA,EACtB;AACA,MAAI,KAAK,aAAc,QAAO,gBAAgB,KAAK;AACnD,SAAO,UAAU,iBAAiB,IAAI,GAAG,QAAQ,KAAK,SAAS,OAAO,KAAK,OAAO,KAAK,GAAG;AAC5F;;;ACtMO,IAAM,oBAAoB;AAG1B,SAAS,cAAc,UAAgC,eAAuD;AACnH,SAAO,UAAU,QAAQ,IAAI,iBAAiB,KAAK;AACrD;AAEO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA,mBAAmB;AAAA,EAE5B,YAAY,MAOT;AACD,UAAM,KAAK,OAAO;AAClB,SAAK,OAAO;AACZ,SAAK,SAAS,KAAK;AACnB,SAAK,OAAO,KAAK;AACjB,SAAK,YAAY,KAAK;AACtB,SAAK,UAAU,KAAK;AACpB,SAAK,cAAc,KAAK;AAAA,EAC1B;AACF;AAGO,IAAM,oBAAN,cAAgC,cAAc;AAAA,EACnD,YAAY,SAAiB;AAC3B,UAAM,EAAE,QAAQ,KAAK,MAAM,gBAAgB,QAAQ,CAAC;AACpD,SAAK,OAAO;AAAA,EACd;AACF;;;ACvBO,IAAM,eAAN,MAAmB;AAAA,EACxB;AAAA,EACS;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EAEA,YAAY,MAA2B;AACrC,SAAK,UAAU,KAAK;AACpB,SAAK,YAAY,KAAK;AACtB,SAAK,gBAAgB,KAAK;AAC1B,SAAK,UAAU,KAAK;AACpB,SAAK,gBAAgB,iBAAiB,IAAI;AAC1C,SAAK,kBAAkB,KAAK;AAC5B,SAAK,SAAS,KAAK;AACnB,SAAK,SAAS,KAAK,SAAS;AAC5B,SAAK,OAAO,KAAK,OAAO,KAAK;AAC7B,SAAK,UAAU,KAAK,kBAAkB;AAAA,EACxC;AAAA,EAEA,IAAI,UAAoB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,aAAsB;AACxB,WAAO,QAAS,KAAK,QAAQ,gBAAgB,KAAK,aAAc,KAAK,OAAO;AAAA,EAC9E;AAAA;AAAA,EAGA,MAAM,iBAAkC;AACtC,UAAM,EAAE,UAAU,IAAI,KAAK;AAC3B,QAAI,cAAc,UAAa,KAAK,KAAK,KAAK,YAAY,KAAK,WAAW,KAAK,YAAY;AACzF,YAAM,KAAK,QAAQ;AAAA,IACrB;AACA,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAA6B;AACjC,QAAI,KAAK,UAAW,QAAO,KAAK;AAChC,UAAM,WAAW,KAAK,kBAAkB;AACxC,QAAI,CAAC,UAAU;AACb,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,SAAK,aAAa,YAAY;AAC5B,YAAM,OAAO,MAAM,SAAS;AAC5B,WAAK,UAAU;AACf,YAAM,KAAK,QAAQ,KAAK,IAAI;AAC5B,YAAM,KAAK,kBAAkB,IAAI;AACjC,aAAO;AAAA,IACT,GAAG;AACH,QAAI;AACF,aAAO,MAAM,KAAK;AAAA,IACpB,UAAE;AACA,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AAAA;AAAA,EAGA,oBAA2D;AACzD,UAAM,oBAAoB,KAAK,QAAQ;AACvC,QAAI,qBAAqB,KAAK,WAAW;AACvC,YAAM,WAAW,KAAK;AACtB,aAAO,YAAY;AACjB,cAAM,OAAO,MAAM,aAAa;AAAA,UAC9B;AAAA,UACA,cAAc,KAAK;AAAA,UACnB,cAAc;AAAA,UACd,cAAc,KAAK;AAAA,UACnB,OAAO,KAAK;AAAA,UACZ,KAAK,KAAK;AAAA,QACZ,CAAC;AAGD,YAAI,CAAC,KAAK,aAAc,MAAK,eAAe;AAC5C,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AACF;;;AC9GA,gBAAuB,SAAY,WAA8C;AAC/E,MAAI;AACJ,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAS;AACP,UAAM,OAAO,MAAM,UAAU,MAAM;AACnC,eAAW,QAAQ,KAAK,QAAQ,CAAC,EAAG,OAAM;AAE1C,UAAM,OAAO,KAAK,QAAQ,CAAC;AAC3B,UAAM,OAAO,KAAK;AAGlB,QAAI,KAAK,aAAa,MAAO;AAC7B,QAAI,SAAS,UAAa,SAAS,KAAM;AACzC,QAAI,KAAK,IAAI,IAAI,EAAG;AACpB,SAAK,IAAI,IAAI;AACb,aAAS;AAAA,EACX;AACF;AAGA,eAAsB,QAAW,WAAyC;AACxE,QAAM,MAAW,CAAC;AAClB,mBAAiB,QAAQ,SAAS,SAAS,EAAG,KAAI,KAAK,IAAI;AAC3D,SAAO;AACT;;;AC5CA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACuBO,IAAM,SAAiB,aAAa,aAA6B,CAAC;;;AD0KlE,IAAM,gBAAgB,CAC3B,aAEC,SAAS,UAAU,QAAQ,IAI1B;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAWI,IAAM,cAAc,CACzB,aAEC,QAAQ,UAAU,QAAQ,IAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAgBI,IAAM,iBAAiB,CAC5B,aAEC,SAAS,UAAU,QAAQ,IAI1B;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAkBI,IAAM,kBAAkB,CAC7B,aAMC,SAAS,UAAU,QAAQ,IAI1B;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAmBI,IAAM,gBAAgB,CAC3B,aAEC,SAAS,UAAU,QAAQ,IAI1B;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AASI,IAAM,iBAAiB,CAC5B,aAEC,SAAS,UAAU,QAAQ,IAI1B;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAOI,IAAM,eAAe,CAC1B,aAEC,QAAQ,UAAU,QAAQ,IAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AASI,IAAM,kBAAkB,CAC7B,aAMC,QAAQ,UAAU,QAAQ,MAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACP,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACb;AACF,CAAC;AASI,IAAM,uBAAuB,CAClC,aAMC,QAAQ,UAAU,QAAQ,IAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAOI,IAAM,wBAAwB,CACnC,aAMC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACP,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACb;AACF,CAAC;AAUI,IAAM,wBAAwB,CACnC,aAEC,QAAQ,UAAU,QAAQ,OAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAOI,IAAM,wBAAwB,CACnC,aAMC,QAAQ,UAAU,QAAQ,MAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACP,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACb;AACF,CAAC;AAOI,IAAM,yBAAyB,CACpC,aAMC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAOI,IAAM,sBAAsB,CACjC,aAMC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAOI,IAAM,yBAAyB,CACpC,aAMC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAOI,IAAM,wBAAwB,CACnC,aAMC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAOI,IAAM,yBAAyB,CACpC,aAMC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAKI,IAAM,wBAAwB,CACnC,aAMC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAOI,IAAM,0BAA0B,CACrC,aAMC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACP,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACb;AACF,CAAC;AASI,IAAM,4BAA4B,CACvC,aAMC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAOI,IAAM,qBAAqB,CAChC,aAMC,QAAQ,UAAU,QAAQ,IAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAOI,IAAM,mBAAmB,CAC9B,aAMC,QAAQ,UAAU,QAAQ,IAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAcI,IAAM,6BAA6B,CAGxC,aAMC,QAAQ,UAAU,QAAQ,IAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAWI,IAAM,iCAAiC,CAG5C,aAMC,QAAQ,UAAU,QAAQ,IAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAcI,IAAM,yBAAyB,CACpC,aAMC,QAAQ,UAAU,QAAQ,IAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAUI,IAAM,qBAAqB,CAChC,aAEC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAUI,IAAM,wBAAwB,CACnC,aAEC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAOI,IAAM,cAAc,CACzB,aAEC,SAAS,UAAU,QAAQ,IAI1B;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAcI,IAAM,eAAe,CAC1B,aAEC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACP,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACb;AACF,CAAC;AASI,IAAM,YAAY,CACvB,aAEC,QAAQ,UAAU,QAAQ,IAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AASI,IAAM,eAAe,CAC1B,aAEC,SAAS,UAAU,QAAQ,IAI1B;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAOI,IAAM,oBAAoB,CAC/B,aAMC,SAAS,UAAU,QAAQ,IAI1B;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAQI,IAAM,qBAAqB,CAChC,aAMC,QAAQ,UAAU,QAAQ,OAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAqBI,IAAM,sBAAsB,CACjC,aAMC,QAAQ,UAAU,QAAQ,IAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAqBI,IAAM,4BAA4B,CACvC,aAMC,QAAQ,UAAU,QAAQ,IAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAYI,IAAM,2BAA2B,CACtC,aAMC,QAAQ,UAAU,QAAQ,IAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAmCI,IAAM,4BAA4B,CACvC,aAMC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACP,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACb;AACF,CAAC;AASI,IAAM,4BAA4B,CACvC,aAMC,QAAQ,UAAU,QAAQ,OAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AASI,IAAM,yBAAyB,CACpC,aAMC,QAAQ,UAAU,QAAQ,IAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAUI,IAAM,0BAA0B,CACrC,aAMC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAWI,IAAM,0BAA0B,CACrC,aAMC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAWI,IAAM,gCAAgC,CAG3C,aAMC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AASI,IAAM,mBAAmB,CAC9B,aAMC,SAAS,UAAU,QAAQ,IAI1B;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAUI,IAAM,2BAA2B,CACtC,aAMC,SAAS,UAAU,QAAQ,IAI1B;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AASI,IAAM,oBAAoB,CAC/B,aAMC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACP,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACb;AACF,CAAC;AASI,IAAM,qBAAqB,CAChC,aAMC,SAAS,UAAU,QAAQ,IAI1B;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;AAeI,IAAM,sBAAsB,CACjC,aAMC,QAAQ,UAAU,QAAQ,KAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AAAA,EACH,SAAS;AAAA,IACP,gBAAgB;AAAA,IAChB,GAAG,QAAQ;AAAA,EACb;AACF,CAAC;AASI,IAAM,sBAAsB,CACjC,aAMC,QAAQ,UAAU,QAAQ,OAIzB;AAAA,EACA,UAAU,CAAC,EAAE,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,EAC7C,KAAK;AAAA,EACL,GAAG;AACL,CAAC;;;AE11CI,IAAM,uBAAuB;AAC7B,IAAM,sBAAsB;AAI5B,SAAS,aAAa,OAAqB;AAChD,MAAI,MAAM,WAAW,UAAU,EAAG,QAAO;AACzC,MAAI,MAAM,WAAW,UAAU,EAAG,QAAO;AACzC,SAAO;AACT;AAsCO,IAAM,WAAN,MAAM,UAAS;AAAA,EACX;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EAEA,YAAY,MAAuB;AACjC,UAAM,WACJ,KAAK,WAAW,KAAK,cAAc,EAAE,aAAa,KAAK,YAAY,IAAI;AACzE,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AACA,SAAK,OAAO,aAAa,SAAS,WAAW;AAI7C,UAAM,SACJ,KAAK,qBAAqB,KAAK,YAAY,KAAK,eAC5C,MACE,uBAAuB;AAAA,MACrB,UAAU,KAAK;AAAA,MACf,cAAc,KAAK;AAAA,MACnB,QAAQ,KAAK,kBAAmB;AAAA,MAChC,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,IACZ,CAAC,IACH;AAEN,SAAK,UAAU,IAAI,aAAa;AAAA,MAC9B,QAAQ;AAAA,MACR,UAAU,KAAK;AAAA,MACf,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,gBAAgB,KAAK;AAAA,MACrB,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,IACZ,CAAC;AAED,UAAM,eAAe,YAAY;AAAA,MAC/B,cAAc,KAAK;AAAA,MACnB,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,IACd,CAAC;AAED,SAAK,UAAU,aAAa;AAAA,MAC1B,SAAS,KAAK,WAAW;AAAA,MACzB,SAAS,EAAE,oBAAoB,KAAK,cAAc,oBAAoB;AAAA,MACtE,MAAM,MAAM,KAAK,QAAQ,eAAe;AAAA,MACxC,OAAO;AAAA,IACT,CAAC;AAED,SAAK,MAAM,KAAK,UAAU;AAAA,EAC5B;AAAA;AAAA,EAGA,aAAa,sBACX,MASmB;AACnB,UAAM,SAAS,MAAM,uBAAuB;AAAA,MAC1C,UAAU,KAAK;AAAA,MACf,cAAc,KAAK;AAAA,MACnB,QAAQ,KAAK;AAAA,MACb,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,IACZ,CAAC;AACD,WAAO,IAAI,UAAS;AAAA,MAClB;AAAA,MACA,UAAU,KAAK;AAAA,MACf,cAAc,KAAK;AAAA,MACnB,mBAAmB,EAAE,QAAQ,KAAK,OAAO;AAAA;AAAA,MACzC,cAAc,KAAK;AAAA,MACnB,cAAc,KAAK;AAAA,MACnB,YAAY,KAAK;AAAA,MACjB,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,IAAI,SAAmB;AACrB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA,EAGA,MAAM,QAAW,GAA0B;AACzC,UAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM;AACxC,QAAI,YAAY,SAAS,MAAM,UAAU,OAAW,QAAO;AAC3D,UAAM,SAAS,UAAU,UAAU;AAInC,UAAM,MAAO,SAAS,CAAC;AAIvB,UAAM,IAAI,cAAc;AAAA,MACtB;AAAA,MACA,MAAM,IAAI,OAAO,QAAQ;AAAA,MACzB,SAAS,IAAI,OAAO,WAAW,UAAU,cAAc;AAAA;AAAA,MAEvD,WAAW,cAAc,UAAU,IAAI,OAAO,cAAc,IAAI,UAAU;AAAA,MAC1E,SAAS,IAAI,OAAO;AAAA,MACpB,aAAa,IAAI,OAAO;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,YAAe,GAAgC;AACnD,UAAM,MAAM,MAAM,KAAK,QAAsB,CAAyB;AACtE,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,YAAoB;AAClB,UAAM,MAAM,CAAC;AACb,eAAW,CAAC,MAAM,EAAE,KAAK,OAAO,QAAQ,eAAG,GAAG;AAC5C,UAAI,IAAI,IAAI,CAAC,YACV,GAA+B,EAAE,GAAG,SAAS,QAAQ,KAAK,QAAQ,CAAC;AAAA,IACxE;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAU,GAA0B;AAClC,WAAO,KAAK,QAAQ,CAAC;AAAA,EACvB;AAAA;AAAA;AAAA,EAIA,MACE,IACA;AACA,WAAO,CAAC,UACN,KAAK,QAAQ,GAAG,EAAE,QAAQ,KAAK,SAAS,MAAM,CAAC,CAAoB;AAAA,EACvE;AAAA;AAAA,EAIA,QAAQ;AAAA,IACN,IAAI,MAAM,KAAK,YAAsB,eAAe,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAAA,EAC/E;AAAA,EAEA,YAAY;AAAA,IACV,MAAM,KAAK,MAA8D,aAAsB;AAAA,IAC/F,KAAK,CAAC,UACJ,SAAS,CAAC,WAAW,KAAK,UAAU,KAAK,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;AAAA,IAChE,SAAS,CAAC,UACR,QAAQ,CAAC,WAAW,KAAK,UAAU,KAAK,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;AAAA,IAC/D,KAAK,CAAC,eACJ,KAAK;AAAA,MACC,YAAY,EAAE,QAAQ,KAAK,SAAS,MAAM,EAAE,aAAa,WAAW,EAAE,CAAC;AAAA,IAC7E;AAAA,EACJ;AAAA,EAEA,cAAc;AAAA,IACZ,MAAM,KAAK,MAAsB,eAAwB;AAAA,IACzD,KAAK,MAAkC,SAAS,CAAC,WAAW,KAAK,YAAY,KAAK,EAAE,OAAO,CAAC,CAAC;AAAA,IAC7F,SAAS,MAA6B,QAAQ,CAAC,WAAW,KAAK,YAAY,KAAK,EAAE,OAAO,CAAC,CAAC;AAAA,EAC7F;AAAA,EAEA,YAAY;AAAA,IACV,MAAM,KAAK,MAAoB,aAAsB;AAAA,IACrD,KAAK,MAAgC,SAAS,CAAC,WAAW,KAAK,UAAU,KAAK,EAAE,OAAO,CAAC,CAAC;AAAA,IACzF,SAAS,MAA2B,QAAQ,CAAC,WAAW,KAAK,UAAU,KAAK,EAAE,OAAO,CAAC,CAAC;AAAA,EACzF;AAAA,EAEA,aAAa;AAAA,IACX,MAAM,KAAK,MAA0D,cAAuB;AAAA,IAC5F,KAAK,CAAC,UACJ,SAAS,CAAC,WAAW,KAAK,WAAW,KAAK,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;AAAA,IACjE,KAAK,CAAC,OACJ,KAAK,YAA2B,aAAa,EAAE,QAAQ,KAAK,SAAS,MAAM,EAAE,GAAG,EAAW,CAAC,CAAC;AAAA,EACjG;AAAA,EAEA,UAAU;AAAA,IACR,MAAM,KAAK,MAGL,WAAoB;AAAA,IAC1B,KAAK,CAAC,UAKwB,SAAS,CAAC,WAAW,KAAK,QAAQ,KAAK,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;AAAA,IAC1F,KAAK,CAAC,OACJ,KAAK,YAAwB,UAAU,EAAE,QAAQ,KAAK,SAAS,MAAM,EAAE,GAAG,EAAW,CAAC,CAAC;AAAA,EAC3F;AAAA,EAEA,cAAc;AAAA,IACZ,IAAI,MAAM,KAAK,YAA+B,iBAAiB,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAAA,EAC1F;AACF;;;AChSA,IAAAE,sBAA4C;AAErC,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,eAAe;AACrB,IAAM,qBAAqB;AAelC,SAAS,iBAAiB,QAAgB,WAA4B,SAAyB;AAC7F,QAAM,UAAM,gCAAW,UAAU,MAAM,EAAE,OAAO,GAAG,SAAS,IAAI,OAAO,EAAE,EAAE,OAAO,KAAK;AACvF,SAAO,UAAU,GAAG;AACtB;AAEA,SAAS,kBAAkB,GAAW,GAAoB;AACxD,QAAM,KAAK,OAAO,KAAK,CAAC;AACxB,QAAM,KAAK,OAAO,KAAK,CAAC;AACxB,MAAI,GAAG,WAAW,GAAG,OAAQ,QAAO;AACpC,aAAO,qCAAgB,IAAI,EAAE;AAC/B;AAOO,SAAS,cAAc,MAAqC;AACjE,QAAM,YAAY,KAAK,oBAAoB;AAC3C,QAAM,OAAO,KAAK,OAAO,KAAK,KAAK;AACnC,QAAM,KAAK,OAAO,KAAK,SAAS;AAChC,MAAI,CAAC,OAAO,SAAS,EAAE,EAAG,QAAO;AACjC,MAAI,YAAY,KAAK,KAAK,IAAI,MAAM,MAAO,EAAE,IAAI,UAAW,QAAO;AAEnE,QAAM,WAAW,iBAAiB,KAAK,QAAQ,KAAK,WAAW,KAAK,OAAO;AAC3E,SAAO,kBAAkB,KAAK,WAAW,QAAQ;AACnD;AAcO,SAAS,eACd,SACA,SACA,QACA,MACkB;AAClB,QAAM,MAAM,CAAC,SAAqC;AAChD,QAAI,mBAAmB,QAAS,QAAO,QAAQ,IAAI,IAAI,KAAK;AAC5D,UAAM,IAAI,QAAQ,IAAI,KAAK,QAAQ,KAAK,YAAY,CAAC;AACrD,WAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI;AAAA,EACnC;AACA,QAAM,YAAY,IAAI,gBAAgB;AACtC,QAAM,YAAY,IAAI,gBAAgB;AACtC,MAAI,CAAC,aAAa,CAAC,WAAW;AAC5B,UAAM,IAAI,MAAM,6DAA6D;AAAA,EAC/E;AACA,QAAM,KAAK,cAAc;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,MAAM;AAAA,IACxB,KAAK,MAAM;AAAA,EACb,CAAC;AACD,MAAI,CAAC,GAAI,OAAM,IAAI,MAAM,uCAAuC;AAChE,SAAO;AAAA,IACL,OAAO,IAAI,YAAY,KAAK;AAAA,IAC5B,YAAY,IAAI,kBAAkB,KAAK;AAAA,IACvC,WAAW,OAAO,SAAS;AAAA,IAC3B,MAAM,KAAK,MAAM,OAAO;AAAA,EAC1B;AACF;","names":["joinedValues","config","request","url","import_node_crypto"]}
|