@pidgeon-ai/cli 1.41.0 → 1.42.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../sdk/src/generated/core/bodySerializer.gen.ts","../../sdk/src/generated/core/serverSentEvents.gen.ts","../../sdk/src/generated/core/pathSerializer.gen.ts","../../sdk/src/generated/core/utils.gen.ts","../../sdk/src/generated/core/auth.gen.ts","../../sdk/src/generated/client/utils.gen.ts","../../sdk/src/generated/client/client.gen.ts","../../sdk/src/runtime-config.ts","../../sdk/src/generated/client.gen.ts","../../sdk/src/generated/sdk.gen.ts","../../sdk/src/webhooks.ts","../../sdk/src/stream.ts","../../id/src/keys.ts","../../../src/lib/post/wasm/bytes.ts","../../../src/lib/post/wasm/post_core_wasm.js","../../id/src/http.ts","../../id/src/api.ts","../../id/src/sign-in.ts","../../id/src/cli.ts","../src/index.ts"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { ArrayStyle, ObjectStyle, SerializerOptions } from './pathSerializer.gen';\n\nexport type QuerySerializer = (query: Record<string, unknown>) => string;\n\nexport type BodySerializer = (body: unknown) => unknown;\n\ntype QuerySerializerOptionsObject = {\n allowReserved?: boolean;\n array?: Partial<SerializerOptions<ArrayStyle>>;\n object?: Partial<SerializerOptions<ObjectStyle>>;\n};\n\nexport type QuerySerializerOptions = QuerySerializerOptionsObject & {\n /**\n * Per-parameter serialization overrides. When provided, these settings\n * override the global array/object settings for specific parameter names.\n */\n parameters?: Record<string, QuerySerializerOptionsObject>;\n};\n\nconst serializeFormDataPair = (data: FormData, key: string, value: unknown): void => {\n if (typeof value === 'string' || value instanceof Blob) {\n data.append(key, value);\n } else if (value instanceof Date) {\n data.append(key, value.toISOString());\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nconst serializeUrlSearchParamsPair = (data: URLSearchParams, key: string, value: unknown): void => {\n if (typeof value === 'string') {\n data.append(key, value);\n } else {\n data.append(key, JSON.stringify(value));\n }\n};\n\nexport const formDataBodySerializer = {\n bodySerializer: (body: unknown): FormData => {\n const data = new FormData();\n\n Object.entries(body as Record<string, unknown>).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeFormDataPair(data, key, v));\n } else {\n serializeFormDataPair(data, key, value);\n }\n });\n\n return data;\n },\n};\n\nexport const jsonBodySerializer = {\n bodySerializer: (body: unknown): string =>\n JSON.stringify(body, (_key, value) => (typeof value === 'bigint' ? value.toString() : value)),\n};\n\nexport const urlSearchParamsBodySerializer = {\n bodySerializer: (body: unknown): string => {\n const data = new URLSearchParams();\n\n Object.entries(body as Record<string, unknown>).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeUrlSearchParamsPair(data, key, v));\n } else {\n serializeUrlSearchParamsPair(data, key, value);\n }\n });\n\n return data.toString();\n },\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { Config } from './types.gen';\n\nexport type ServerSentEventsOptions<TData = unknown> = Omit<RequestInit, 'method'> &\n Pick<Config, 'method' | 'responseTransformer' | 'responseValidator'> & {\n /**\n * Fetch API implementation. You can use this option to provide a custom\n * fetch instance.\n *\n * @default globalThis.fetch\n */\n fetch?: typeof fetch;\n /**\n * Implementing clients can call request interceptors inside this hook.\n */\n onRequest?: (url: string, init: RequestInit) => Promise<Request>;\n /**\n * Callback invoked when a network or parsing error occurs during streaming.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param error The error that occurred.\n */\n onSseError?: (error: unknown) => void;\n /**\n * Callback invoked when an event is streamed from the server.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @param event Event streamed from the server.\n * @returns Nothing (void).\n */\n onSseEvent?: (event: StreamEvent<TData>) => void;\n serializedBody?: RequestInit['body'];\n /**\n * Default retry delay in milliseconds.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 3000\n */\n sseDefaultRetryDelay?: number;\n /**\n * Maximum number of retry attempts before giving up.\n */\n sseMaxRetryAttempts?: number;\n /**\n * Maximum retry delay in milliseconds.\n *\n * Applies only when exponential backoff is used.\n *\n * This option applies only if the endpoint returns a stream of events.\n *\n * @default 30000\n */\n sseMaxRetryDelay?: number;\n /**\n * Optional sleep function for retry backoff.\n *\n * Defaults to using `setTimeout`.\n */\n sseSleepFn?: (ms: number) => Promise<void>;\n url: string;\n };\n\nexport interface StreamEvent<TData = unknown> {\n data: TData;\n event?: string;\n id?: string;\n retry?: number;\n}\n\nexport type ServerSentEventsResult<TData = unknown, TReturn = void, TNext = unknown> = {\n stream: AsyncGenerator<\n TData extends Record<string, unknown> ? TData[keyof TData] : TData,\n TReturn,\n TNext\n >;\n};\n\nexport function createSseClient<TData = unknown>({\n onRequest,\n onSseError,\n onSseEvent,\n responseTransformer,\n responseValidator,\n sseDefaultRetryDelay,\n sseMaxRetryAttempts,\n sseMaxRetryDelay,\n sseSleepFn,\n url,\n ...options\n}: ServerSentEventsOptions): ServerSentEventsResult<TData> {\n let lastEventId: string | undefined;\n\n const sleep = sseSleepFn ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));\n\n const createStream = async function* () {\n let retryDelay: number = sseDefaultRetryDelay ?? 3000;\n let attempt = 0;\n const signal = options.signal ?? new AbortController().signal;\n\n while (true) {\n if (signal.aborted) break;\n\n attempt++;\n\n const headers =\n options.headers instanceof Headers\n ? options.headers\n : new Headers(options.headers as Record<string, string> | undefined);\n\n if (lastEventId !== undefined) {\n headers.set('Last-Event-ID', lastEventId);\n }\n\n try {\n const requestInit: RequestInit = {\n redirect: 'follow',\n ...options,\n body: options.serializedBody,\n headers,\n signal,\n };\n let request = new Request(url, requestInit);\n if (onRequest) {\n request = await onRequest(url, requestInit);\n }\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = options.fetch ?? globalThis.fetch;\n const response = await _fetch(request);\n\n if (!response.ok) throw new Error(`SSE failed: ${response.status} ${response.statusText}`);\n\n if (!response.body) throw new Error('No body in SSE response');\n\n const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();\n\n let buffer = '';\n\n const abortHandler = () => {\n try {\n reader.cancel();\n } catch {\n // noop\n }\n };\n\n signal.addEventListener('abort', abortHandler);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += value;\n buffer = buffer.replace(/\\r\\n?/g, '\\n'); // normalize line endings\n\n const chunks = buffer.split('\\n\\n');\n buffer = chunks.pop() ?? '';\n\n for (const chunk of chunks) {\n const lines = chunk.split('\\n');\n const dataLines: Array<string> = [];\n let eventName: string | undefined;\n\n for (const line of lines) {\n if (line.startsWith('data:')) {\n dataLines.push(line.replace(/^data:\\s*/, ''));\n } else if (line.startsWith('event:')) {\n eventName = line.replace(/^event:\\s*/, '');\n } else if (line.startsWith('id:')) {\n lastEventId = line.replace(/^id:\\s*/, '');\n } else if (line.startsWith('retry:')) {\n const parsed = Number.parseInt(line.replace(/^retry:\\s*/, ''), 10);\n if (!Number.isNaN(parsed)) {\n retryDelay = parsed;\n }\n }\n }\n\n let data: unknown;\n let parsedJson = false;\n\n if (dataLines.length) {\n const rawData = dataLines.join('\\n');\n try {\n data = JSON.parse(rawData);\n parsedJson = true;\n } catch {\n data = rawData;\n }\n }\n\n if (parsedJson) {\n if (responseValidator) {\n await responseValidator(data);\n }\n\n if (responseTransformer) {\n data = await responseTransformer(data);\n }\n }\n\n onSseEvent?.({\n data,\n event: eventName,\n id: lastEventId,\n retry: retryDelay,\n });\n\n if (dataLines.length) {\n yield data as any;\n }\n }\n }\n } finally {\n signal.removeEventListener('abort', abortHandler);\n reader.releaseLock();\n }\n\n break; // exit loop on normal completion\n } catch (error) {\n // connection failed or aborted; retry after delay\n onSseError?.(error);\n\n if (sseMaxRetryAttempts !== undefined && attempt >= sseMaxRetryAttempts) {\n break; // stop after firing error\n }\n\n // exponential backoff: double retry each attempt, cap at 30s\n const backoff = Math.min(retryDelay * 2 ** (attempt - 1), sseMaxRetryDelay ?? 30000);\n await sleep(backoff);\n }\n }\n };\n\n const stream = createStream();\n\n return { stream };\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\ninterface SerializeOptions<T> extends SerializePrimitiveOptions, SerializerOptions<T> {}\n\ninterface SerializePrimitiveOptions {\n allowReserved?: boolean;\n name: string;\n}\n\nexport interface SerializerOptions<T> {\n /**\n * @default true\n */\n explode: boolean;\n style: T;\n}\n\nexport type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited';\nexport type ArraySeparatorStyle = ArrayStyle | MatrixStyle;\ntype MatrixStyle = 'label' | 'matrix' | 'simple';\nexport type ObjectStyle = 'form' | 'deepObject';\ntype ObjectSeparatorStyle = ObjectStyle | MatrixStyle;\n\ninterface SerializePrimitiveParam extends SerializePrimitiveOptions {\n value: string;\n}\n\nexport const separatorArrayExplode = (style: ArraySeparatorStyle): '.' | ';' | ',' | '&' => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\n\nexport const separatorArrayNoExplode = (style: ArraySeparatorStyle): ',' | '|' | '%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 = (style: ObjectSeparatorStyle): '.' | ';' | ',' | '&' => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\n\nexport const serializeArrayParam = ({\n allowReserved,\n explode,\n name,\n style,\n value,\n}: SerializeOptions<ArraySeparatorStyle> & {\n value: unknown[];\n}): 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' ? separator + joinedValues : 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 = [...values, key, allowReserved ? (v as string) : encodeURIComponent(v as string)];\n });\n const joinedValues = values.join(',');\n switch (style) {\n case 'form':\n return `${name}=${joinedValues}`;\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n default:\n return joinedValues;\n }\n }\n\n const separator = separatorObjectExplode(style);\n const joinedValues = Object.entries(value)\n .map(([key, v]) =>\n serializePrimitiveParam({\n allowReserved,\n name: style === 'deepObject' ? `${name}[${key}]` : key,\n value: v as string,\n }),\n )\n .join(separator);\n return style === 'label' || style === 'matrix' ? separator + joinedValues : joinedValues;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport type { BodySerializer, QuerySerializer } from './bodySerializer.gen';\nimport {\n type ArraySeparatorStyle,\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from './pathSerializer.gen';\n\nexport interface PathSerializer {\n path: Record<string, unknown>;\n url: string;\n}\n\nexport const PATH_PARAM_RE: RegExp = /\\{[^{}]+\\}/g;\n\nexport const defaultPathSerializer = ({ path, url: _url }: 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(match, serializeArrayParam({ explode, name, style, value }));\n continue;\n }\n\n if (typeof value === 'object') {\n url = url.replace(\n match,\n serializeObjectParam({\n explode,\n name,\n style,\n value: value as Record<string, unknown>,\n valueOnly: true,\n }),\n );\n continue;\n }\n\n if (style === 'matrix') {\n url = url.replace(\n match,\n `;${serializePrimitiveParam({\n name,\n value: value as string,\n })}`,\n );\n continue;\n }\n\n const replaceValue = encodeURIComponent(\n style === 'label' ? `.${value as string}` : (value as string),\n );\n url = url.replace(match, replaceValue);\n }\n }\n return url;\n};\n\nexport const getUrl = ({\n baseUrl,\n path,\n query,\n querySerializer,\n url: _url,\n}: {\n baseUrl?: string;\n path?: Record<string, unknown>;\n query?: Record<string, unknown>;\n querySerializer: QuerySerializer;\n url: string;\n}): 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 = typeof callback === 'function' ? await callback(auth) : callback;\n\n if (!token) {\n return;\n }\n\n if (auth.scheme === 'bearer') {\n return `Bearer ${token}`;\n }\n\n if (auth.scheme === 'basic') {\n return `Basic ${btoa(token)}`;\n }\n\n return token;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { getAuthToken } from '../core/auth.gen';\nimport type { QuerySerializerOptions } from '../core/bodySerializer.gen';\nimport { jsonBodySerializer } from '../core/bodySerializer.gen';\nimport {\n serializeArrayParam,\n serializeObjectParam,\n serializePrimitiveParam,\n} from '../core/pathSerializer.gen';\nimport { getUrl } from '../core/utils.gen';\nimport type { Client, ClientOptions, Config, RequestOptions } from './types.gen';\n\nexport const createQuerySerializer = <T = unknown>({\n parameters = {},\n ...args\n}: QuerySerializerOptions = {}): ((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 = (contentType: string | null): Exclude<Config['parseAs'], 'auto'> => {\n if (!contentType) {\n // If no Content-Type header is provided, the best we can do is return the raw response body,\n // which is effectively the same as the 'stream' option.\n return 'stream';\n }\n\n const cleanContent = contentType.split(';')[0]?.trim();\n\n if (!cleanContent) {\n return;\n }\n\n if (cleanContent.startsWith('application/json') || cleanContent.endsWith('+json')) {\n return 'json';\n }\n\n if (cleanContent === 'multipart/form-data') {\n return 'formData';\n }\n\n if (\n ['application/', 'audio/', 'image/', 'video/'].some((type) => cleanContent.startsWith(type))\n ) {\n return 'blob';\n }\n\n if (cleanContent.startsWith('text/')) {\n return 'text';\n }\n\n return;\n};\n\nconst checkForExistence = (\n options: Pick<RequestOptions, 'auth' | 'query'> & {\n headers: Headers;\n },\n name?: string,\n): boolean => {\n if (!name) {\n return false;\n }\n if (\n options.headers.has(name) ||\n options.query?.[name] ||\n options.headers.get('Cookie')?.includes(`${name}=`)\n ) {\n return true;\n }\n return false;\n};\n\nexport async function setAuthParams(\n options: Pick<RequestOptions, 'auth' | 'query' | 'security'> & {\n headers: Headers;\n },\n): Promise<void> {\n for (const auth of options.security ?? []) {\n if (checkForExistence(options, auth.name)) {\n continue;\n }\n\n const token = await getAuthToken(auth, options.auth);\n\n if (!token) {\n continue;\n }\n\n const name = auth.name ?? 'Authorization';\n\n switch (auth.in) {\n case 'query':\n if (!options.query) {\n options.query = {};\n }\n options.query[name] = token;\n break;\n case 'cookie':\n options.headers.append('Cookie', `${name}=${token}`);\n break;\n case 'header':\n default:\n options.headers.set(name, token);\n break;\n }\n }\n}\n\nexport const buildUrl: Client['buildUrl'] = (options) =>\n getUrl({\n baseUrl: options.baseUrl as string,\n path: options.path,\n query: options.query,\n querySerializer:\n typeof options.querySerializer === 'function'\n ? options.querySerializer\n : createQuerySerializer(options.querySerializer),\n url: options.url,\n });\n\nexport const mergeConfigs = (a: Config, b: Config): Config => {\n const config = { ...a, ...b };\n if (config.baseUrl?.endsWith('/')) {\n config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);\n }\n config.headers = mergeHeaders(a.headers, b.headers);\n return config;\n};\n\nconst headersEntries = (headers: Headers): Array<[string, string]> => {\n const entries: Array<[string, string]> = [];\n headers.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries;\n};\n\nexport const mergeHeaders = (\n ...headers: Array<Required<Config>['headers'] | undefined>\n): Headers => {\n const mergedHeaders = new Headers();\n for (const header of headers) {\n if (!header) {\n continue;\n }\n\n const iterator = header instanceof Headers ? headersEntries(header) : Object.entries(header);\n\n for (const [key, value] of iterator) {\n if (value === null) {\n mergedHeaders.delete(key);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n mergedHeaders.append(key, v as string);\n }\n } else if (value !== undefined) {\n // assume object headers are meant to be JSON stringified, i.e., their\n // content value in OpenAPI specification is 'application/json'\n mergedHeaders.set(\n key,\n typeof value === 'object' ? JSON.stringify(value) : (value as string),\n );\n }\n }\n }\n return mergedHeaders;\n};\n\ntype ErrInterceptor<Err, Res, Req, Options> = (\n error: Err,\n /** response may be undefined due to a network error where no response object is produced */\n response: Res | undefined,\n /** request may be undefined, because error may be from building the request object itself */\n request: Req | undefined,\n options: Options,\n) => Err | Promise<Err>;\n\ntype ReqInterceptor<Req, Options> = (request: Req, options: Options) => Req | Promise<Req>;\n\ntype ResInterceptor<Res, Req, Options> = (\n response: Res,\n request: Req,\n options: Options,\n) => Res | Promise<Res>;\n\nclass Interceptors<Interceptor> {\n fns: Array<Interceptor | null> = [];\n\n clear(): void {\n this.fns = [];\n }\n\n eject(id: number | Interceptor): void {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = null;\n }\n }\n\n exists(id: number | Interceptor): boolean {\n const index = this.getInterceptorIndex(id);\n return Boolean(this.fns[index]);\n }\n\n getInterceptorIndex(id: number | Interceptor): number {\n if (typeof id === 'number') {\n return this.fns[id] ? id : -1;\n }\n return this.fns.indexOf(id);\n }\n\n update(id: number | Interceptor, fn: Interceptor): number | Interceptor | false {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = fn;\n return id;\n }\n return false;\n }\n\n use(fn: Interceptor): number {\n this.fns.push(fn);\n return this.fns.length - 1;\n }\n}\n\nexport interface Middleware<Req, Res, Err, Options> {\n error: Interceptors<ErrInterceptor<Err, Res, Req, Options>>;\n request: Interceptors<ReqInterceptor<Req, Options>>;\n response: Interceptors<ResInterceptor<Res, Req, Options>>;\n}\n\nexport const createInterceptors = <Req, Res, Err, Options>(): Middleware<\n Req,\n Res,\n Err,\n Options\n> => ({\n error: new Interceptors<ErrInterceptor<Err, Res, Req, Options>>(),\n request: new Interceptors<ReqInterceptor<Req, Options>>(),\n response: new Interceptors<ResInterceptor<Res, Req, Options>>(),\n});\n\nconst defaultQuerySerializer = createQuerySerializer({\n allowReserved: false,\n array: {\n explode: true,\n style: 'form',\n },\n object: {\n explode: true,\n style: 'deepObject',\n },\n});\n\nconst defaultHeaders = {\n 'Content-Type': 'application/json',\n};\n\nexport const createConfig = <T extends ClientOptions = ClientOptions>(\n override: Config<Omit<ClientOptions, keyof T> & T> = {},\n): Config<Omit<ClientOptions, keyof T> & T> => ({\n ...jsonBodySerializer,\n headers: defaultHeaders,\n parseAs: 'auto',\n querySerializer: defaultQuerySerializer,\n ...override,\n});\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { createSseClient } from '../core/serverSentEvents.gen';\nimport type { HttpMethod } from '../core/types.gen';\nimport { getValidRequestBody } from '../core/utils.gen';\nimport type { Client, Config, RequestOptions, ResolvedRequestOptions } from './types.gen';\nimport {\n buildUrl,\n createConfig,\n createInterceptors,\n getParseAs,\n mergeConfigs,\n mergeHeaders,\n setAuthParams,\n} from './utils.gen';\n\ntype ReqInit = Omit<RequestInit, 'body' | 'headers'> & {\n body?: any;\n headers: ReturnType<typeof mergeHeaders>;\n};\n\nexport const createClient = (config: Config = {}): Client => {\n let _config = mergeConfigs(createConfig(), config);\n\n const getConfig = (): Config => ({ ..._config });\n\n const setConfig = (config: Config): Config => {\n _config = mergeConfigs(_config, config);\n return getConfig();\n };\n\n const interceptors = createInterceptors<Request, Response, unknown, ResolvedRequestOptions>();\n\n const beforeRequest = async <\n TData = unknown,\n TResponseStyle extends 'data' | 'fields' = 'fields',\n ThrowOnError extends boolean = boolean,\n Url extends string = string,\n >(\n options: RequestOptions<TData, TResponseStyle, ThrowOnError, Url>,\n ) => {\n const opts = {\n ..._config,\n ...options,\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n headers: mergeHeaders(_config.headers, options.headers),\n serializedBody: undefined as string | undefined,\n };\n\n if (opts.security) {\n await setAuthParams(opts);\n }\n\n if (opts.requestValidator) {\n await opts.requestValidator(opts);\n }\n\n if (opts.body !== undefined && opts.bodySerializer) {\n opts.serializedBody = opts.bodySerializer(opts.body) as string | undefined;\n }\n\n // remove Content-Type header if body is empty to avoid sending invalid requests\n if (opts.body === undefined || opts.serializedBody === '') {\n opts.headers.delete('Content-Type');\n }\n\n const resolvedOpts = opts as typeof opts &\n ResolvedRequestOptions<TResponseStyle, ThrowOnError, Url>;\n const url = buildUrl(resolvedOpts);\n\n return { opts: resolvedOpts, url };\n };\n\n const request: Client['request'] = async (options) => {\n const throwOnError = options.throwOnError ?? _config.throwOnError;\n const responseStyle = options.responseStyle ?? _config.responseStyle;\n\n let request: Request | undefined;\n let response: Response | undefined;\n\n try {\n const { opts, url } = await beforeRequest(options);\n const requestInit: ReqInit = {\n redirect: 'follow',\n ...opts,\n body: getValidRequestBody(opts),\n };\n\n request = new Request(url, requestInit);\n\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = opts.fetch!;\n\n response = await _fetch(request);\n\n for (const fn of interceptors.response.fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n\n const result = {\n request,\n response,\n };\n\n if (response.ok) {\n const parseAs =\n (opts.parseAs === 'auto'\n ? getParseAs(response.headers.get('Content-Type'))\n : opts.parseAs) ?? 'json';\n\n if (response.status === 204 || response.headers.get('Content-Length') === '0') {\n let emptyData: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'text':\n emptyData = await response[parseAs]();\n break;\n case 'formData':\n emptyData = new FormData();\n break;\n case 'stream':\n emptyData = response.body;\n break;\n case 'json':\n default:\n emptyData = {};\n break;\n }\n return opts.responseStyle === 'data'\n ? emptyData\n : {\n data: emptyData,\n ...result,\n };\n }\n\n let data: any;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'formData':\n case 'text':\n data = await response[parseAs]();\n break;\n case 'json': {\n // Some servers return 200 with no Content-Length and empty body.\n // response.json() would throw; read as text and parse if non-empty.\n const text = await response.text();\n data = text ? JSON.parse(text) : {};\n break;\n }\n case 'stream':\n return opts.responseStyle === 'data'\n ? response.body\n : {\n data: response.body,\n ...result,\n };\n }\n\n if (parseAs === 'json') {\n if (opts.responseValidator) {\n await opts.responseValidator(data);\n }\n\n if (opts.responseTransformer) {\n data = await opts.responseTransformer(data);\n }\n }\n\n return opts.responseStyle === 'data'\n ? data\n : {\n data,\n ...result,\n };\n }\n\n const textError = await response.text();\n let jsonError: unknown;\n\n try {\n jsonError = JSON.parse(textError);\n } catch {\n // noop\n }\n\n throw jsonError ?? textError;\n } catch (error) {\n let finalError = error;\n\n for (const fn of interceptors.error.fns) {\n if (fn) {\n finalError = await fn(finalError, response, request, options as ResolvedRequestOptions);\n }\n }\n\n finalError = finalError || {};\n\n if (throwOnError) {\n throw finalError;\n }\n\n // TODO: we probably want to return error and improve types\n return responseStyle === 'data'\n ? undefined\n : {\n error: finalError,\n request,\n response,\n };\n }\n };\n\n const makeMethodFn = (method: Uppercase<HttpMethod>) => (options: RequestOptions) =>\n request({ ...options, method });\n\n const makeSseFn = (method: Uppercase<HttpMethod>) => async (options: RequestOptions) => {\n const { opts, url } = await beforeRequest(options);\n return createSseClient({\n ...opts,\n body: opts.body as BodyInit | null | undefined,\n method,\n onRequest: async (url, init) => {\n let request = new Request(url, init);\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n return request;\n },\n serializedBody: getValidRequestBody(opts) as BodyInit | null | undefined,\n url,\n });\n };\n\n const _buildUrl: Client['buildUrl'] = (options) => buildUrl({ ..._config, ...options });\n\n return {\n buildUrl: _buildUrl,\n connect: makeMethodFn('CONNECT'),\n delete: makeMethodFn('DELETE'),\n get: makeMethodFn('GET'),\n getConfig,\n head: makeMethodFn('HEAD'),\n interceptors,\n options: makeMethodFn('OPTIONS'),\n patch: makeMethodFn('PATCH'),\n post: makeMethodFn('POST'),\n put: makeMethodFn('PUT'),\n request,\n setConfig,\n sse: {\n connect: makeSseFn('CONNECT'),\n delete: makeSseFn('DELETE'),\n get: makeSseFn('GET'),\n head: makeSseFn('HEAD'),\n options: makeSseFn('OPTIONS'),\n patch: makeSseFn('PATCH'),\n post: makeSseFn('POST'),\n put: makeSseFn('PUT'),\n trace: makeSseFn('TRACE'),\n },\n trace: makeMethodFn('TRACE'),\n } as Client;\n};\n","import type { CreateClientConfig } from './generated/client.gen';\n\n/**\n * Who is calling, by package name, on every request the default client makes.\n *\n * Pidgeon labels the first client an account uses from this header\n * (`src/lib/analytics/client.ts`), which is how it can say an account came\n * through the SDK rather than a hand-written `fetch`. The name and nothing\n * else: no machine, no runtime, nothing that identifies the caller.\n *\n * **Not in a browser.** Browsers decide the User-Agent themselves, and the\n * ones that let a page set it would turn every call into a CORS preflight\n * asking about a header the API has no reason to allow.\n *\n * Wired in by `openapi-ts.config.ts` (`runtimeConfigPath`), so the generated\n * client calls it and the generated files stay untouched. A wrapper that\n * builds its own client — the CLI, the AI SDK tools — sends its own name.\n */\nexport const USER_AGENT = '@pidgeon-ai/sdk';\n\nexport const createClientConfig: CreateClientConfig = (config) => ({\n ...config,\n ...(typeof window === 'undefined'\n ? { headers: { 'User-Agent': USER_AGENT, ...plain(config?.headers) } }\n : {}),\n});\n\nfunction plain(headers: unknown): Record<string, string> {\n return headers && typeof headers === 'object' && !(headers instanceof Headers)\n ? (headers as Record<string, string>)\n : {};\n}\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport { createClientConfig } from '../runtime-config';\n\nimport { type Client, type ClientOptions, type Config, createClient, createConfig } from './client';\nimport type { ClientOptions as ClientOptions2 } from './types.gen';\n\n/**\n * The `createClientConfig()` function will be called on client initialization\n * and the returned object will become the client's initial configuration.\n *\n * You may want to initialize your client this way instead of calling\n * `setConfig()`. This is useful for example if you're using Next.js\n * to ensure your client always has the correct values.\n */\nexport type CreateClientConfig<T extends ClientOptions = ClientOptions2> = (\n override?: Config<ClientOptions & T>,\n) => Config<Required<ClientOptions> & T>;\n\nexport const client: Client = createClient(\n createClientConfig(createConfig<ClientOptions2>({ baseUrl: 'https://pidgeon.ai/api/v1' })),\n);\n","// This file is auto-generated by @hey-api/openapi-ts\n\nimport {\n type Client,\n type ClientMeta,\n formDataBodySerializer,\n type Options as Options2,\n type RequestResult,\n type ServerSentEventsResult,\n type TDataShape,\n} from './client';\nimport { client } from './client.gen';\nimport type {\n AgentAttachHumanData,\n AgentAttachHumanErrors,\n AgentAttachHumanResponses,\n AgentConnectData,\n AgentConnectErrors,\n AgentConnectResponses,\n AgentSetupData,\n AgentSetupErrors,\n AgentSetupResponses,\n AgentSignUpData,\n AgentSignUpErrors,\n AgentSignUpResponses,\n AgentVerifyData,\n AgentVerifyErrors,\n AgentVerifyResponses,\n AppPasswordsCreateData,\n AppPasswordsCreateErrors,\n AppPasswordsCreateResponses,\n AppPasswordsListData,\n AppPasswordsListErrors,\n AppPasswordsListResponses,\n AppPasswordsRevokeData,\n AppPasswordsRevokeErrors,\n AppPasswordsRevokeResponses,\n AttachmentsCompleteUploadData,\n AttachmentsCompleteUploadErrors,\n AttachmentsCompleteUploadResponses,\n AttachmentsCreateUploadData,\n AttachmentsCreateUploadErrors,\n AttachmentsCreateUploadResponses,\n AttachmentsDownloadUrlData,\n AttachmentsDownloadUrlErrors,\n AttachmentsDownloadUrlResponses,\n AttachmentsTextData,\n AttachmentsTextErrors,\n AttachmentsTextResponses,\n AttachmentsUploadData,\n AttachmentsUploadErrors,\n AttachmentsUploadResponses,\n CalendarCreateEventData,\n CalendarCreateEventErrors,\n CalendarCreateEventResponses,\n CalendarDeleteEventData,\n CalendarDeleteEventErrors,\n CalendarDeleteEventResponses,\n CalendarFreeTimeData,\n CalendarFreeTimeErrors,\n CalendarFreeTimeResponses,\n CalendarGetAgendaData,\n CalendarGetAgendaErrors,\n CalendarGetAgendaResponses,\n CalendarGetData,\n CalendarGetErrors,\n CalendarGetEventData,\n CalendarGetEventErrors,\n CalendarGetEventResponses,\n CalendarGetResponses,\n CalendarListEventInstancesData,\n CalendarListEventInstancesErrors,\n CalendarListEventInstancesResponses,\n CalendarListEventsData,\n CalendarListEventsErrors,\n CalendarListEventsResponses,\n CalendarRespondToEventData,\n CalendarRespondToEventErrors,\n CalendarRespondToEventResponses,\n CalendarUpdateData,\n CalendarUpdateErrors,\n CalendarUpdateEventData,\n CalendarUpdateEventErrors,\n CalendarUpdateEventResponses,\n CalendarUpdateResponses,\n CardsGetData,\n CardsGetErrors,\n CardsGetResponses,\n ContactsBlockData,\n ContactsBlockErrors,\n ContactsBlockResponses,\n ContactsCreateData,\n ContactsCreateErrors,\n ContactsCreateResponses,\n ContactsDeleteData,\n ContactsDeleteErrors,\n ContactsDeleteResponses,\n ContactsGetData,\n ContactsGetErrors,\n ContactsGetResponses,\n ContactsListData,\n ContactsListErrors,\n ContactsListResponses,\n ContactsUnblockData,\n ContactsUnblockErrors,\n ContactsUnblockResponses,\n ContactsUpdateData,\n ContactsUpdateErrors,\n ContactsUpdateResponses,\n DomainsCreateData,\n DomainsCreateErrors,\n DomainsCreateResponses,\n DomainsDeleteData,\n DomainsDeleteErrors,\n DomainsDeleteResponses,\n DomainsGetData,\n DomainsGetErrors,\n DomainsGetResponses,\n DomainsGetSetupLinkData,\n DomainsGetSetupLinkErrors,\n DomainsGetSetupLinkResponses,\n DomainsListData,\n DomainsListErrors,\n DomainsListResponses,\n DomainsUpdateData,\n DomainsUpdateErrors,\n DomainsUpdateResponses,\n DomainsVerifyData,\n DomainsVerifyErrors,\n DomainsVerifyResponses,\n DomainsZoneFileData,\n DomainsZoneFileErrors,\n DomainsZoneFileResponses,\n DraftsApprovalData,\n DraftsApprovalErrors,\n DraftsApprovalResponses,\n DraftsCancelScheduleData,\n DraftsCancelScheduleErrors,\n DraftsCancelScheduleResponses,\n DraftsCreateData,\n DraftsCreateErrors,\n DraftsCreateResponses,\n DraftsDeleteData,\n DraftsDeleteErrors,\n DraftsDeleteResponses,\n DraftsGetData,\n DraftsGetErrors,\n DraftsGetResponses,\n DraftsListData,\n DraftsListErrors,\n DraftsListResponses,\n DraftsRemoveAttachmentData,\n DraftsRemoveAttachmentErrors,\n DraftsRemoveAttachmentResponses,\n DraftsScheduleData,\n DraftsScheduleErrors,\n DraftsScheduleResponses,\n DraftsSendData,\n DraftsSendErrors,\n DraftsSendResponses,\n DraftsUpdateData,\n DraftsUpdateErrors,\n DraftsUpdateResponses,\n EventsGetData,\n EventsGetErrors,\n EventsGetResponses,\n EventsListData,\n EventsListErrors,\n EventsListResponses,\n EventsSocketData,\n EventsSocketErrors,\n EventsStreamData,\n EventsStreamErrors,\n EventsStreamResponse,\n EventsStreamResponses,\n ExportMailData,\n ExportMailErrors,\n ExportMailResponses,\n GrantsCreateData,\n GrantsCreateErrors,\n GrantsCreateResponses,\n GrantsGetData,\n GrantsGetErrors,\n GrantsGetResponses,\n GrantsListData,\n GrantsListErrors,\n GrantsListResponses,\n GrantsRevokeData,\n GrantsRevokeErrors,\n GrantsRevokeResponses,\n GrantsStatusData,\n GrantsStatusErrors,\n GrantsStatusResponses,\n GrantsTemplatesCreateData,\n GrantsTemplatesCreateErrors,\n GrantsTemplatesCreateResponses,\n GrantsTemplatesDeleteData,\n GrantsTemplatesDeleteErrors,\n GrantsTemplatesDeleteResponses,\n GrantsTemplatesListData,\n GrantsTemplatesListErrors,\n GrantsTemplatesListResponses,\n IdentitiesAccessCreateData,\n IdentitiesAccessCreateErrors,\n IdentitiesAccessCreateResponses,\n IdentitiesAccessDeleteData,\n IdentitiesAccessDeleteErrors,\n IdentitiesAccessDeleteResponses,\n IdentitiesAccessGetData,\n IdentitiesAccessGetErrors,\n IdentitiesAccessGetResponses,\n IdentitiesCardData,\n IdentitiesCardErrors,\n IdentitiesCardResponses,\n IdentitiesCreateData,\n IdentitiesCreateErrors,\n IdentitiesCreateResponses,\n IdentitiesDeleteData,\n IdentitiesDeleteErrors,\n IdentitiesDeleteResponses,\n IdentitiesGetData,\n IdentitiesGetErrors,\n IdentitiesGetResponses,\n IdentitiesListData,\n IdentitiesListErrors,\n IdentitiesListResponses,\n IdentitiesReceiveRulesCreateData,\n IdentitiesReceiveRulesCreateErrors,\n IdentitiesReceiveRulesCreateResponses,\n IdentitiesReceiveRulesDeleteData,\n IdentitiesReceiveRulesDeleteErrors,\n IdentitiesReceiveRulesDeleteResponses,\n IdentitiesReceiveRulesGetData,\n IdentitiesReceiveRulesGetErrors,\n IdentitiesReceiveRulesGetResponses,\n IdentitiesSendRulesCreateData,\n IdentitiesSendRulesCreateErrors,\n IdentitiesSendRulesCreateResponses,\n IdentitiesSendRulesDeleteData,\n IdentitiesSendRulesDeleteErrors,\n IdentitiesSendRulesDeleteResponses,\n IdentitiesSendRulesGetData,\n IdentitiesSendRulesGetErrors,\n IdentitiesSendRulesGetResponses,\n IdentitiesSuspendTenantData,\n IdentitiesSuspendTenantErrors,\n IdentitiesSuspendTenantResponses,\n IdentitiesUpdateData,\n IdentitiesUpdateErrors,\n IdentitiesUpdateResponses,\n KeysCreateData,\n KeysCreateErrors,\n KeysCreateResponses,\n KeysGetData,\n KeysGetErrors,\n KeysGetResponses,\n KeysListData,\n KeysListErrors,\n KeysListResponses,\n KeysRevokeData,\n KeysRevokeErrors,\n KeysRevokeResponses,\n KeysRotateData,\n KeysRotateErrors,\n KeysRotateResponses,\n KeysUpdateData,\n KeysUpdateErrors,\n KeysUpdateResponses,\n LabelsCreateData,\n LabelsCreateErrors,\n LabelsCreateResponses,\n LabelsDeleteData,\n LabelsDeleteErrors,\n LabelsDeleteResponses,\n LabelsListData,\n LabelsListErrors,\n LabelsListResponses,\n LabelsUpdateData,\n LabelsUpdateErrors,\n LabelsUpdateResponses,\n LogCheckpointData,\n LogCheckpointErrors,\n LogCheckpointResponses,\n LogConsistencyData,\n LogConsistencyErrors,\n LogConsistencyResponses,\n LogEntriesData,\n LogEntriesErrors,\n LogEntriesResponses,\n LogHeadData,\n LogHeadErrors,\n LogHeadResponses,\n LogMonitorsCreateData,\n LogMonitorsCreateErrors,\n LogMonitorsCreateResponses,\n LogMonitorsDeleteData,\n LogMonitorsDeleteErrors,\n LogMonitorsDeleteResponses,\n LogMonitorsListData,\n LogMonitorsListErrors,\n LogMonitorsListResponses,\n LogProofData,\n LogProofErrors,\n LogProofResponses,\n MailboxesChangesData,\n MailboxesChangesErrors,\n MailboxesChangesResponses,\n MailboxesEmptyTrashData,\n MailboxesEmptyTrashErrors,\n MailboxesEmptyTrashResponses,\n MailboxesListData,\n MailboxesListErrors,\n MailboxesListFolderData,\n MailboxesListFolderErrors,\n MailboxesListFolderResponses,\n MailboxesListResponses,\n MeGetData,\n MeGetErrors,\n MeGetResponses,\n MessagesActData,\n MessagesActErrors,\n MessagesActResponses,\n MessagesAwaitData,\n MessagesAwaitErrors,\n MessagesAwaitResponses,\n MessagesCheckData,\n MessagesCheckErrors,\n MessagesCheckResponses,\n MessagesForwardData,\n MessagesForwardErrors,\n MessagesForwardResponses,\n MessagesGetData,\n MessagesGetErrors,\n MessagesGetResponses,\n MessagesListInThreadData,\n MessagesListInThreadErrors,\n MessagesListInThreadResponses,\n MessagesRawData,\n MessagesRawErrors,\n MessagesRawResponses,\n MessagesReplyAllData,\n MessagesReplyAllErrors,\n MessagesReplyAllResponses,\n MessagesReplyData,\n MessagesReplyErrors,\n MessagesReplyResponses,\n MessagesRespondToInvitationData,\n MessagesRespondToInvitationErrors,\n MessagesRespondToInvitationResponses,\n MessagesSearchData,\n MessagesSearchErrors,\n MessagesSearchResponses,\n MessagesSendData,\n MessagesSendErrors,\n MessagesSendResponses,\n MessagesUndoData,\n MessagesUndoErrors,\n MessagesUndoResponses,\n MessagesUpdateData,\n MessagesUpdateErrors,\n MessagesUpdateResponses,\n MetricsQueryData,\n MetricsQueryErrors,\n MetricsQueryResponses,\n PodsCreateData,\n PodsCreateErrors,\n PodsCreateResponses,\n PodsDeleteData,\n PodsDeleteErrors,\n PodsDeleteResponses,\n PodsGetData,\n PodsGetErrors,\n PodsGetResponses,\n PodsListData,\n PodsListErrors,\n PodsListResponses,\n PodsUpdateData,\n PodsUpdateErrors,\n PodsUpdateResponses,\n RoutingCreateData,\n RoutingCreateErrors,\n RoutingCreateResponses,\n RoutingDeleteData,\n RoutingDeleteErrors,\n RoutingDeleteResponses,\n RoutingListData,\n RoutingListErrors,\n RoutingListResponses,\n RoutingUpdateData,\n RoutingUpdateErrors,\n RoutingUpdateResponses,\n SignInsApproveData,\n SignInsApproveErrors,\n SignInsApproveResponses,\n TestInboundData,\n TestInboundErrors,\n TestInboundResponses,\n ThreadsGetData,\n ThreadsGetErrors,\n ThreadsGetResponses,\n ThreadsLabelsCreateData,\n ThreadsLabelsCreateErrors,\n ThreadsLabelsCreateResponses,\n ThreadsLabelsDeleteData,\n ThreadsLabelsDeleteErrors,\n ThreadsLabelsDeleteResponses,\n ThreadsLabelsGetData,\n ThreadsLabelsGetErrors,\n ThreadsLabelsGetResponses,\n ThreadsListData,\n ThreadsListErrors,\n ThreadsListResponses,\n ThreadsUpdateData,\n ThreadsUpdateErrors,\n ThreadsUpdateResponses,\n VerifySenderData,\n VerifySenderErrors,\n VerifySenderResponses,\n WebhooksCreateData,\n WebhooksCreateErrors,\n WebhooksCreateResponses,\n WebhooksDeleteData,\n WebhooksDeleteErrors,\n WebhooksDeleteResponses,\n WebhooksDeliveriesData,\n WebhooksDeliveriesErrors,\n WebhooksDeliveriesResponses,\n WebhooksGetData,\n WebhooksGetErrors,\n WebhooksGetHeadersData,\n WebhooksGetHeadersErrors,\n WebhooksGetHeadersResponses,\n WebhooksGetResponses,\n WebhooksListData,\n WebhooksListErrors,\n WebhooksListResponses,\n WebhooksReplayData,\n WebhooksReplayErrors,\n WebhooksReplayResponses,\n WebhooksUpdateData,\n WebhooksUpdateErrors,\n WebhooksUpdateHeadersData,\n WebhooksUpdateHeadersErrors,\n WebhooksUpdateHeadersResponses,\n WebhooksUpdateResponses,\n WorkspaceGetData,\n WorkspaceGetErrors,\n WorkspaceGetResponses,\n WorkspaceMembersData,\n WorkspaceMembersErrors,\n WorkspaceMembersResponses,\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 * Sign an agent up\n *\n * The one call in this API that needs no key. An agent names a username and, optionally, the human who will own the mailbox; a six-digit code goes to that human and **nothing is created until it comes back**. Without a `human_email` the name is reserved and dormant — attach one with `POST /agent/human`.\n */\nexport const agentSignUp = <ThrowOnError extends boolean = false>(\n options: Options<AgentSignUpData, ThrowOnError>,\n): RequestResult<AgentSignUpResponses, AgentSignUpErrors, ThrowOnError> =>\n (options.client ?? client).post<AgentSignUpResponses, AgentSignUpErrors, ThrowOnError>({\n url: '/agent/signup',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Name the human for a signup\n *\n * For a signup that named none. Sends a fresh code and restarts the clock.\n */\nexport const agentAttachHuman = <ThrowOnError extends boolean = false>(\n options: Options<AgentAttachHumanData, ThrowOnError>,\n): RequestResult<AgentAttachHumanResponses, AgentAttachHumanErrors, ThrowOnError> =>\n (options.client ?? client).post<AgentAttachHumanResponses, AgentAttachHumanErrors, ThrowOnError>({\n url: '/agent/human',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Verify an agent with the human’s code\n *\n * Creates the account, the address and a workspace-scoped API key. Ten wrong codes spend the signup, whatever comes next. The key is returned once and never again — store it before doing anything else. It is minted here rather than at signup because this is the call a human has vouched for.\n */\nexport const agentVerify = <ThrowOnError extends boolean = false>(\n options: Options<AgentVerifyData, ThrowOnError>,\n): RequestResult<AgentVerifyResponses, AgentVerifyErrors, ThrowOnError> =>\n (options.client ?? client).post<AgentVerifyResponses, AgentVerifyErrors, ThrowOnError>({\n url: '/agent/verify',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Read an agent card\n *\n * Public, with no key. An agent or service address’s identity, signed by the domain that vouches for it: `jws` is a compact JWS (EdDSA) to check against the keys at `<iss>/.well-known/post.json`, and `card` is its payload, decoded for reading. Good for a day (`exp`). The URL is permanent, and every agent message names it in its signed `Agent-attribution`. A person’s or a team’s address has one once software has sent from it as an agent. Anything that has no card — a person’s address only people send from, a deleted one, an id that is nothing — answers the same 404. Limited per IP.\n */\nexport const cardsGet = <ThrowOnError extends boolean = false>(\n options: Options<CardsGetData, ThrowOnError>,\n): RequestResult<CardsGetResponses, CardsGetErrors, ThrowOnError> =>\n (options.client ?? client).get<CardsGetResponses, CardsGetErrors, ThrowOnError>({\n url: '/cards/{id}',\n ...options,\n });\n\n/**\n * Check who sent a message\n *\n * Public, with no key. Send a raw message, or its headers alone; the answer says whether an AI agent sent it, on whose behalf, and whether its signatures hold — the signed agent declaration (`Agent-of` under an aligned DKIM signature) and the `Post-Envelope` — for Pidgeon’s mail and any other signer using the same formats. Act on `verdict`. Pass `recipient`, the address it reached you at, to catch a signed message replayed to you. Or send `request` instead of `message`: an HTTP request an agent signed with HTTP Message Signatures (RFC 9421) in Web Bot Auth’s profile, which is also how an MCP call over HTTP is signed; the key is found by its `keyid` among domains proved with `pidgeon id`, or in the directory its `Signature-Agent` names. `grants` says what the sender may do: each grant it carried in `Post-Grant`, or that you send in `grants`, checked against the sender a signature verified — act on each one’s `valid`, and pass `subject` to have it checked against the customer, account or order you are about to act on. Nothing sent is stored. Limited per IP; a key may be sent and is not required.\n */\nexport const verifySender = <ThrowOnError extends boolean = false>(\n options: Options<VerifySenderData, ThrowOnError>,\n): RequestResult<VerifySenderResponses, VerifySenderErrors, ThrowOnError> =>\n (options.client ?? client).post<VerifySenderResponses, VerifySenderErrors, ThrowOnError>({\n url: '/verify',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Read the card log’s signed head\n *\n * Public, with no key. The card log holds every agent card Pidgeon has issued, changed or revoked, in an append-only Merkle tree (RFC 9162). `checkpoint` is its signed head, a C2SP checkpoint: check it against `verifier_key`, which never changes, and pin that. Cached for ten seconds. Limited per IP.\n */\nexport const logHead = <ThrowOnError extends boolean = false>(\n options?: Options<LogHeadData, ThrowOnError>,\n): RequestResult<LogHeadResponses, LogHeadErrors, ThrowOnError> =>\n (options?.client ?? client).get<LogHeadResponses, LogHeadErrors, ThrowOnError>({\n url: '/log/head',\n ...options,\n });\n\n/**\n * Read the card log’s checkpoint as text\n *\n * Public, with no key. The same signed checkpoint as `GET /log/head`, as `text/plain`, for a witness or monitor built for C2SP tiled logs.\n */\nexport const logCheckpoint = <ThrowOnError extends boolean = false>(\n options?: Options<LogCheckpointData, ThrowOnError>,\n): RequestResult<LogCheckpointResponses, LogCheckpointErrors, ThrowOnError> =>\n (options?.client ?? client).get<LogCheckpointResponses, LogCheckpointErrors, ThrowOnError>({\n url: '/log/checkpoint',\n ...options,\n });\n\n/**\n * List card log entries\n *\n * Public, with no key. Entries from `start` up to `end`, at most 100. An entry is one card subject’s claims at the moment they changed: `issued`, `updated` or `revoked`. `data` is its exact bytes, canonical JSON; a leaf hash is SHA-256 of 0x00 and `data`. Entries never change.\n */\nexport const logEntries = <ThrowOnError extends boolean = false>(\n options?: Options<LogEntriesData, ThrowOnError>,\n): RequestResult<LogEntriesResponses, LogEntriesErrors, ThrowOnError> =>\n (options?.client ?? client).get<LogEntriesResponses, LogEntriesErrors, ThrowOnError>({\n url: '/log/entries',\n ...options,\n });\n\n/**\n * Prove a card is in the card log\n *\n * Public, with no key. The inclusion proof (RFC 9162 §2.1.3) for a card’s latest entry, by its `sub`, against the current head; or for an entry `index` against the head at `tree_size`. 404 when it is not in the log: a card appears within five minutes.\n */\nexport const logProof = <ThrowOnError extends boolean = false>(\n options?: Options<LogProofData, ThrowOnError>,\n): RequestResult<LogProofResponses, LogProofErrors, ThrowOnError> =>\n (options?.client ?? client).get<LogProofResponses, LogProofErrors, ThrowOnError>({\n url: '/log/proof',\n ...options,\n });\n\n/**\n * Prove the card log only grew\n *\n * Public, with no key. The consistency proof (RFC 9162 §2.1.4) that the tree of `first` entries is a prefix of the tree of `second`: what a monitor asks each time the head moves, so nothing it saw was rewritten.\n */\nexport const logConsistency = <ThrowOnError extends boolean = false>(\n options: Options<LogConsistencyData, ThrowOnError>,\n): RequestResult<LogConsistencyResponses, LogConsistencyErrors, ThrowOnError> =>\n (options.client ?? client).get<LogConsistencyResponses, LogConsistencyErrors, ThrowOnError>({\n url: '/log/consistency',\n ...options,\n });\n\n/**\n * List card log monitors\n *\n * The names and domains this account watches the card log for. An owner, or an admin key over every address.\n */\nexport const logMonitorsList = <ThrowOnError extends boolean = false>(\n options?: Options<LogMonitorsListData, ThrowOnError>,\n): RequestResult<LogMonitorsListResponses, LogMonitorsListErrors, ThrowOnError> =>\n (options?.client ?? client).get<LogMonitorsListResponses, LogMonitorsListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/log/monitors',\n ...options,\n });\n\n/**\n * Watch the card log for a name\n *\n * Every new card log entry whose address, `on_behalf_of` or operator domain claims `term` — look-alikes included, such as a Greek Μ in “Meta” — emits a `card_log.matched` event to the account’s webhooks and, unless `email` is false, emails its owners. It watches from now on. An owner, or an admin key over every address; 50 at most.\n */\nexport const logMonitorsCreate = <ThrowOnError extends boolean = false>(\n options: Options<LogMonitorsCreateData, ThrowOnError>,\n): RequestResult<LogMonitorsCreateResponses, LogMonitorsCreateErrors, ThrowOnError> =>\n (options.client ?? client).post<\n LogMonitorsCreateResponses,\n LogMonitorsCreateErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/log/monitors',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Stop watching\n */\nexport const logMonitorsDelete = <ThrowOnError extends boolean = false>(\n options: Options<LogMonitorsDeleteData, ThrowOnError>,\n): RequestResult<LogMonitorsDeleteResponses, LogMonitorsDeleteErrors, ThrowOnError> =>\n (options.client ?? client).delete<\n LogMonitorsDeleteResponses,\n LogMonitorsDeleteErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/log/monitors/{id}',\n ...options,\n });\n\n/**\n * Whether a grant still holds\n *\n * Public, with no key: the URL every grant names as its `status`, for a recipient that checks a grant’s signature offline. `active`, `revoked` or `expired`. Cached thirty seconds, so a revocation shows within the minute. `POST /verify` reads the grant itself and needs none of this. A grant never given answers 404.\n */\nexport const grantsStatus = <ThrowOnError extends boolean = false>(\n options: Options<GrantsStatusData, ThrowOnError>,\n): RequestResult<GrantsStatusResponses, GrantsStatusErrors, ThrowOnError> =>\n (options.client ?? client).get<GrantsStatusResponses, GrantsStatusErrors, ThrowOnError>({\n url: '/grants/{id}/status',\n ...options,\n });\n\n/**\n * Connect an agent with a setup code\n *\n * For an inbox a person already has. They press \"Get a setup code\" on the dashboard and give the agent the code; this returns an API key with `send` on that one address. No account is created and no code is emailed. A code works once, for 10 minutes; every way one fails gets the same `400`. The key is returned once and never again, shows under the person’s API keys, and is held for approval like any other key.\n */\nexport const agentConnect = <ThrowOnError extends boolean = false>(\n options: Options<AgentConnectData, ThrowOnError>,\n): RequestResult<AgentConnectResponses, AgentConnectErrors, ThrowOnError> =>\n (options.client ?? client).post<AgentConnectResponses, AgentConnectErrors, ThrowOnError>({\n url: '/agent/connect',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * What stands between this key and sending\n *\n * **Call this first.** It asks every check a send would, without sending, and answers in order: `steps[]`, each with `done`, who acts (`owner`: `agent` or `person`), `what` and `how`, and `next`, the first not done. A person returns the signup code, publishes DNS (the records are listed) or gives you a key that can send; you create an address or wait out a limit (`resets_at`). `ready_to_send` is true when nothing is left. Without `identity_id` it answers for the address nearest to sending and lists the rest. It sees only the addresses this key reaches.\n */\nexport const agentSetup = <ThrowOnError extends boolean = false>(\n options?: Options<AgentSetupData, ThrowOnError>,\n): RequestResult<AgentSetupResponses, AgentSetupErrors, ThrowOnError> =>\n (options?.client ?? client).get<AgentSetupResponses, AgentSetupErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/agent/setup',\n ...options,\n });\n\n/**\n * List addresses\n *\n * Alphabetical by address. `cursor` is the last address on the page before it, not a timestamp — this is the one list that is not ordered by time, because it is read by somebody looking for a particular address.\n */\nexport const identitiesList = <ThrowOnError extends boolean = false>(\n options?: Options<IdentitiesListData, ThrowOnError>,\n): RequestResult<IdentitiesListResponses, IdentitiesListErrors, ThrowOnError> =>\n (options?.client ?? client).get<IdentitiesListResponses, IdentitiesListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities',\n ...options,\n });\n\n/**\n * Create an address\n *\n * Idempotent with an `Idempotency-Key` header: the same key returns the first result rather than creating a second address.\n *\n * Needs a key with admin over the account, or over its pod. A **test key** creates a test address (`test: true`): outside your plan’s counts, at most 100 at once, taking only test mail, and deleted a day after it was made.\n */\nexport const identitiesCreate = <ThrowOnError extends boolean = false>(\n options: Options<IdentitiesCreateData, ThrowOnError>,\n): RequestResult<IdentitiesCreateResponses, IdentitiesCreateErrors, ThrowOnError> =>\n (options.client ?? client).post<IdentitiesCreateResponses, IdentitiesCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Delete an address\n *\n * Takes its messages, routing rules and webhooks with it.\n */\nexport const identitiesDelete = <ThrowOnError extends boolean = false>(\n options: Options<IdentitiesDeleteData, ThrowOnError>,\n): RequestResult<IdentitiesDeleteResponses, IdentitiesDeleteErrors, ThrowOnError> =>\n (options.client ?? client).delete<\n IdentitiesDeleteResponses,\n IdentitiesDeleteErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}',\n ...options,\n });\n\n/**\n * Fetch one address\n */\nexport const identitiesGet = <ThrowOnError extends boolean = false>(\n options: Options<IdentitiesGetData, ThrowOnError>,\n): RequestResult<IdentitiesGetResponses, IdentitiesGetErrors, ThrowOnError> =>\n (options.client ?? client).get<IdentitiesGetResponses, IdentitiesGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}',\n ...options,\n });\n\n/**\n * Update an address\n */\nexport const identitiesUpdate = <ThrowOnError extends boolean = false>(\n options: Options<IdentitiesUpdateData, ThrowOnError>,\n): RequestResult<IdentitiesUpdateResponses, IdentitiesUpdateErrors, ThrowOnError> =>\n (options.client ?? client).patch<IdentitiesUpdateResponses, IdentitiesUpdateErrors, ThrowOnError>(\n {\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n },\n );\n\n/**\n * This address’s agent card\n *\n * The signed card for an address an agent or a service sends from: who it is, for whom, which keys sign its mail, and a coarse standing. The same document anyone can read without a key at `GET /cards/{id}`. A person’s or a team’s address has one once software has sent from it as an agent; until then it answers 404.\n */\nexport const identitiesCard = <ThrowOnError extends boolean = false>(\n options: Options<IdentitiesCardData, ThrowOnError>,\n): RequestResult<IdentitiesCardResponses, IdentitiesCardErrors, ThrowOnError> =>\n (options.client ?? client).get<IdentitiesCardResponses, IdentitiesCardErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/card',\n ...options,\n });\n\n/**\n * Revoke access\n *\n * By the grant’s own id, which `GET` returned as `id`.\n */\nexport const identitiesAccessDelete = <ThrowOnError extends boolean = false>(\n options: Options<IdentitiesAccessDeleteData, ThrowOnError>,\n): RequestResult<IdentitiesAccessDeleteResponses, IdentitiesAccessDeleteErrors, ThrowOnError> =>\n (options.client ?? client).delete<\n IdentitiesAccessDeleteResponses,\n IdentitiesAccessDeleteErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/access',\n ...options,\n });\n\n/**\n * Who can reach this address\n *\n * Reading the list requires being able to reach the address: who has access to somebody’s mailbox is itself private.\n */\nexport const identitiesAccessGet = <ThrowOnError extends boolean = false>(\n options: Options<IdentitiesAccessGetData, ThrowOnError>,\n): RequestResult<IdentitiesAccessGetResponses, IdentitiesAccessGetErrors, ThrowOnError> =>\n (options.client ?? client).get<\n IdentitiesAccessGetResponses,\n IdentitiesAccessGetErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/access',\n ...options,\n });\n\n/**\n * Grant access\n *\n * Name exactly one of `user_id`, `api_key_id` or `everyone`. Granting **replaces** any grant that principal already had, so calling this twice changes the rung rather than leaving two answers behind. Answers 404 rather than 403 when you may not administer the address — including when you can read it.\n */\nexport const identitiesAccessCreate = <ThrowOnError extends boolean = false>(\n options: Options<IdentitiesAccessCreateData, ThrowOnError>,\n): RequestResult<IdentitiesAccessCreateResponses, IdentitiesAccessCreateErrors, ThrowOnError> =>\n (options.client ?? client).post<\n IdentitiesAccessCreateResponses,\n IdentitiesAccessCreateErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/access',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Remove a rule\n *\n * By the rule’s own id, which `GET` returned as `id`.\n */\nexport const identitiesSendRulesDelete = <ThrowOnError extends boolean = false>(\n options: Options<IdentitiesSendRulesDeleteData, ThrowOnError>,\n): RequestResult<\n IdentitiesSendRulesDeleteResponses,\n IdentitiesSendRulesDeleteErrors,\n ThrowOnError\n> =>\n (options.client ?? client).delete<\n IdentitiesSendRulesDeleteResponses,\n IdentitiesSendRulesDeleteErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/send-rules',\n ...options,\n });\n\n/**\n * What this address may write to\n *\n * The allow and block list, and the `send_policy` it hangs off — the rules mean nothing without it. Requires `send` on the address rather than `admin`: a caller refused a recipient has to be able to find out why.\n */\nexport const identitiesSendRulesGet = <ThrowOnError extends boolean = false>(\n options: Options<IdentitiesSendRulesGetData, ThrowOnError>,\n): RequestResult<IdentitiesSendRulesGetResponses, IdentitiesSendRulesGetErrors, ThrowOnError> =>\n (options.client ?? client).get<\n IdentitiesSendRulesGetResponses,\n IdentitiesSendRulesGetErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/send-rules',\n ...options,\n });\n\n/**\n * Allow or block a recipient\n *\n * `value` is an address or a domain and the string says which: `billing@acme.com` matches one person, `acme.com` matches everybody there. **The more specific rule wins**, so blocking a domain and allowing one person at it does what it looks like. Adding **replaces** any rule already there for that value, so `allow` where `block` sat is a change of mind rather than a conflict. A `block` refuses under every policy, including `open`.\n */\nexport const identitiesSendRulesCreate = <ThrowOnError extends boolean = false>(\n options: Options<IdentitiesSendRulesCreateData, ThrowOnError>,\n): RequestResult<\n IdentitiesSendRulesCreateResponses,\n IdentitiesSendRulesCreateErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n IdentitiesSendRulesCreateResponses,\n IdentitiesSendRulesCreateErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/send-rules',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Remove a rule\n *\n * By the rule’s own id, which `GET` returned as `id`.\n */\nexport const identitiesReceiveRulesDelete = <ThrowOnError extends boolean = false>(\n options: Options<IdentitiesReceiveRulesDeleteData, ThrowOnError>,\n): RequestResult<\n IdentitiesReceiveRulesDeleteResponses,\n IdentitiesReceiveRulesDeleteErrors,\n ThrowOnError\n> =>\n (options.client ?? client).delete<\n IdentitiesReceiveRulesDeleteResponses,\n IdentitiesReceiveRulesDeleteErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/receive-rules',\n ...options,\n });\n\n/**\n * Who may write to this address\n *\n * The rules that decide what reaches this address. Requires `read` rather than `admin`: anybody who may read the mail may see why some of it did not arrive. **Workspace-wide rules are not listed here** — these are the address’s own, and a key that administers one address must not be able to silence a sender for every other address in the workspace.\n */\nexport const identitiesReceiveRulesGet = <ThrowOnError extends boolean = false>(\n options: Options<IdentitiesReceiveRulesGetData, ThrowOnError>,\n): RequestResult<\n IdentitiesReceiveRulesGetResponses,\n IdentitiesReceiveRulesGetErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n IdentitiesReceiveRulesGetResponses,\n IdentitiesReceiveRulesGetErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/receive-rules',\n ...options,\n });\n\n/**\n * Decide what happens to a sender\n *\n * `value` is an address or a domain and the string says which: `billing@acme.com` matches one person, `acme.com` matches everybody there. **The more specific rule wins**, and an address’s own rule wins over a workspace-wide one. Adding **replaces** any rule already there for that value.\n *\n * `action` is `reject`, `spam`, `trash`, `archive` or `inbox`. **`reject` refuses before the message is stored** — no row, no thread, no storage charged and no webhook — which is what an address nobody will ever open wants. The other four file it, and `inbox` means *never file this sender as spam*. A rule takes a message out of spam only when it passed DMARC, because the rule matches a `From:` anybody can write.\n *\n * **It is not a security control.** The `From:` header is written by the sender, and anybody blocked can change it for the price of a new address. What this buys is not paying for mail from senders who have not bothered.\n */\nexport const identitiesReceiveRulesCreate = <ThrowOnError extends boolean = false>(\n options: Options<IdentitiesReceiveRulesCreateData, ThrowOnError>,\n): RequestResult<\n IdentitiesReceiveRulesCreateResponses,\n IdentitiesReceiveRulesCreateErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n IdentitiesReceiveRulesCreateResponses,\n IdentitiesReceiveRulesCreateErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/receive-rules',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Offboard one of your customers\n *\n * Suspends every address carrying that `tenant_id`. **Suspends, never deletes** — the mail, the threads and the grants all stay, and each address emits `identity.suspended`. Deleting them is still one call each. Idempotent: it changes what is active and reports how many, so a retry is safe. It reaches only addresses you could have suspended one at a time.\n */\nexport const identitiesSuspendTenant = <ThrowOnError extends boolean = false>(\n options: Options<IdentitiesSuspendTenantData, ThrowOnError>,\n): RequestResult<IdentitiesSuspendTenantResponses, IdentitiesSuspendTenantErrors, ThrowOnError> =>\n (options.client ?? client).post<\n IdentitiesSuspendTenantResponses,\n IdentitiesSuspendTenantErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/tenants/{id}/suspend',\n ...options,\n });\n\n/**\n * List pods\n *\n * The containers in this account, the default first. A pod holds addresses and domains — a customer of yours, a client, or just test apart from production.\n *\n * **Each pod has its own sending reputation**, so bounces from one customer cannot degrade delivery for another — mail sends under the pod its address is in, whichever domain it is on. A pod key (`pod_id` on `POST /api-keys`) reaches one pod and nothing else.\n *\n * Not paged: this is a menu somebody switches with, and a product where that menu needs a cursor is one where the menu was the wrong shape.\n */\nexport const podsList = <ThrowOnError extends boolean = false>(\n options?: Options<PodsListData, ThrowOnError>,\n): RequestResult<PodsListResponses, PodsListErrors, ThrowOnError> =>\n (options?.client ?? client).get<PodsListResponses, PodsListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/pods',\n ...options,\n });\n\n/**\n * Create a pod\n *\n * Name it after whatever it holds — a customer, an environment. `client_id` is your own id for it, carried and never parsed, and has to be unique within the account so that looking one up by it has an answer.\n *\n * **Provisioning in one call.** Pass `address` to create an address in the new pod (the same fields as `POST /identities`) and `key` to mint a pod key: a key that reaches the pod’s addresses, now and later, and nothing else. All of it is made or none of it is. Needs a live key over the whole account; a test key gets 403, and `key.test` mints a test key for the pod instead. `key.access` is required; until 26 November 2026 leaving it out still works, with a `warnings` entry, and then it is a 400.\n *\n * **The token is shown once.** Send an `Idempotency-Key`: a retry with it returns the same pod, address and key, with `token: null`, because the secret is never stored. If the first answer was lost, rotate the key (`POST /api-keys/{id}/rotate`) for a new secret.\n */\nexport const podsCreate = <ThrowOnError extends boolean = false>(\n options: Options<PodsCreateData, ThrowOnError>,\n): RequestResult<PodsCreateResponses, PodsCreateErrors, ThrowOnError> =>\n (options.client ?? client).post<PodsCreateResponses, PodsCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/pods',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Delete a pod, its addresses and their mail\n *\n * **This deletes customer data and cannot be undone.** It revokes every key of the pod, and every key those minted, then deletes each address in the pod with all of its mail, then the pod.\n *\n * A pod that still holds an address is refused with 409 unless you pass `delete_addresses=true`. The default pod and a pod holding a domain are always refused: delete the domain first. Needs a live key over the whole account.\n *\n * If it fails part way, call it again: it carries on from where it stopped. To keep the mail, suspend the addresses (`PATCH /identities/{id}`) or move them to another pod instead.\n */\nexport const podsDelete = <ThrowOnError extends boolean = false>(\n options: Options<PodsDeleteData, ThrowOnError>,\n): RequestResult<PodsDeleteResponses, PodsDeleteErrors, ThrowOnError> =>\n (options.client ?? client).delete<PodsDeleteResponses, PodsDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/pods/{id}',\n ...options,\n });\n\n/**\n * Fetch one pod\n */\nexport const podsGet = <ThrowOnError extends boolean = false>(\n options: Options<PodsGetData, ThrowOnError>,\n): RequestResult<PodsGetResponses, PodsGetErrors, ThrowOnError> =>\n (options.client ?? client).get<PodsGetResponses, PodsGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/pods/{id}',\n ...options,\n });\n\n/**\n * Rename a pod, or change its client id\n */\nexport const podsUpdate = <ThrowOnError extends boolean = false>(\n options: Options<PodsUpdateData, ThrowOnError>,\n): RequestResult<PodsUpdateResponses, PodsUpdateErrors, ThrowOnError> =>\n (options.client ?? client).patch<PodsUpdateResponses, PodsUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/pods/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * List labels\n *\n * The labels of one address.\n */\nexport const labelsList = <ThrowOnError extends boolean = false>(\n options: Options<LabelsListData, ThrowOnError>,\n): RequestResult<LabelsListResponses, LabelsListErrors, ThrowOnError> =>\n (options.client ?? client).get<LabelsListResponses, LabelsListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/labels',\n ...options,\n });\n\n/**\n * Create a label\n */\nexport const labelsCreate = <ThrowOnError extends boolean = false>(\n options: Options<LabelsCreateData, ThrowOnError>,\n): RequestResult<LabelsCreateResponses, LabelsCreateErrors, ThrowOnError> =>\n (options.client ?? client).post<LabelsCreateResponses, LabelsCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/labels',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Delete a label\n *\n * The label goes; the conversations it was on stay.\n */\nexport const labelsDelete = <ThrowOnError extends boolean = false>(\n options: Options<LabelsDeleteData, ThrowOnError>,\n): RequestResult<LabelsDeleteResponses, LabelsDeleteErrors, ThrowOnError> =>\n (options.client ?? client).delete<LabelsDeleteResponses, LabelsDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/labels/{id}',\n ...options,\n });\n\n/**\n * Rename or recolour a label\n *\n * A body with neither `name` nor `colour` is refused.\n */\nexport const labelsUpdate = <ThrowOnError extends boolean = false>(\n options: Options<LabelsUpdateData, ThrowOnError>,\n): RequestResult<LabelsUpdateResponses, LabelsUpdateErrors, ThrowOnError> =>\n (options.client ?? client).patch<LabelsUpdateResponses, LabelsUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/labels/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * List grant templates\n *\n * What this account’s agents may ask a person for: a scope (`name`, and the `label` the consent screen says), where (`audience`), for what (`subject_type`), a ceiling and a longest term. Any key reads them.\n */\nexport const grantsTemplatesList = <ThrowOnError extends boolean = false>(\n options?: Options<GrantsTemplatesListData, ThrowOnError>,\n): RequestResult<GrantsTemplatesListResponses, GrantsTemplatesListErrors, ThrowOnError> =>\n (options?.client ?? client).get<\n GrantsTemplatesListResponses,\n GrantsTemplatesListErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/grant-templates',\n ...options,\n });\n\n/**\n * Define a grant template\n *\n * Needs a key with admin on the whole account: a template is the account speaking to everybody its agents ask. A grant copies its template’s words when it is asked for, so a template is never edited, only retired.\n */\nexport const grantsTemplatesCreate = <ThrowOnError extends boolean = false>(\n options: Options<GrantsTemplatesCreateData, ThrowOnError>,\n): RequestResult<GrantsTemplatesCreateResponses, GrantsTemplatesCreateErrors, ThrowOnError> =>\n (options.client ?? client).post<\n GrantsTemplatesCreateResponses,\n GrantsTemplatesCreateErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/grant-templates',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Retire a grant template\n *\n * No new grant can be asked for from it. Every grant already given is unchanged.\n */\nexport const grantsTemplatesDelete = <ThrowOnError extends boolean = false>(\n options: Options<GrantsTemplatesDeleteData, ThrowOnError>,\n): RequestResult<GrantsTemplatesDeleteResponses, GrantsTemplatesDeleteErrors, ThrowOnError> =>\n (options.client ?? client).delete<\n GrantsTemplatesDeleteResponses,\n GrantsTemplatesDeleteErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/grant-templates/{id}',\n ...options,\n });\n\n/**\n * List an address’s grants\n *\n * Every grant asked for or given to one address, newest first.\n */\nexport const grantsList = <ThrowOnError extends boolean = false>(\n options: Options<GrantsListData, ThrowOnError>,\n): RequestResult<GrantsListResponses, GrantsListErrors, ThrowOnError> =>\n (options.client ?? client).get<GrantsListResponses, GrantsListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/grants',\n ...options,\n });\n\n/**\n * Ask for a grant\n *\n * A grant says what an agent may do, for whom, until when, signed by us and checkable by anyone at `POST /verify`. With `grantor: { email }`, the person is asked: the answer is `pending` and carries `consent_url`, the page to send them to, where they allow it from a link we email them or signed in as that address. Nothing is signed until they do. With `grantor: { organisation: true }` the account grants at once, as its verified domain, which needs a live key with admin on the account. Either way it needs `send` on the address. Carry an active grant with `grant_ids` on `POST /messages`.\n */\nexport const grantsCreate = <ThrowOnError extends boolean = false>(\n options: Options<GrantsCreateData, ThrowOnError>,\n): RequestResult<GrantsCreateResponses, GrantsCreateErrors, ThrowOnError> =>\n (options.client ?? client).post<GrantsCreateResponses, GrantsCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/grants',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Revoke a grant\n *\n * For good, at once: the next `POST /verify` says `revoked`. A pending one stops its consent link working. Needs `send` on the address.\n */\nexport const grantsRevoke = <ThrowOnError extends boolean = false>(\n options: Options<GrantsRevokeData, ThrowOnError>,\n): RequestResult<GrantsRevokeResponses, GrantsRevokeErrors, ThrowOnError> =>\n (options.client ?? client).delete<GrantsRevokeResponses, GrantsRevokeErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/grants/{id}',\n ...options,\n });\n\n/**\n * Read a grant\n *\n * Its status and, while active, `jws`: the signed grant the agent carries.\n */\nexport const grantsGet = <ThrowOnError extends boolean = false>(\n options: Options<GrantsGetData, ThrowOnError>,\n): RequestResult<GrantsGetResponses, GrantsGetErrors, ThrowOnError> =>\n (options.client ?? client).get<GrantsGetResponses, GrantsGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/grants/{id}',\n ...options,\n });\n\n/**\n * Find contacts\n *\n * The people and agents your addresses correspond with, most recent first: noted from the mail as it comes and goes, and editable. A contact belongs to one address, so the same person on two addresses is two contacts. `search` matches part of a name or an address. Only the addresses this key reads are listed; naming one it cannot read lists nothing. Pages through `next_cursor`.\n */\nexport const contactsList = <ThrowOnError extends boolean = false>(\n options?: Options<ContactsListData, ThrowOnError>,\n): RequestResult<ContactsListResponses, ContactsListErrors, ThrowOnError> =>\n (options?.client ?? client).get<ContactsListResponses, ContactsListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/contacts',\n ...options,\n });\n\n/**\n * Add a contact\n *\n * Somebody this address has not corresponded with yet. Needs `draft` on the address. One of the workspace’s own addresses is refused, and an address already a contact here is a 409.\n */\nexport const contactsCreate = <ThrowOnError extends boolean = false>(\n options: Options<ContactsCreateData, ThrowOnError>,\n): RequestResult<ContactsCreateResponses, ContactsCreateErrors, ThrowOnError> =>\n (options.client ?? client).post<ContactsCreateResponses, ContactsCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/contacts',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Forget a contact\n *\n * The contact goes; the mail stays. Their next message notes them again, so this is not a block.\n */\nexport const contactsDelete = <ThrowOnError extends boolean = false>(\n options: Options<ContactsDeleteData, ThrowOnError>,\n): RequestResult<ContactsDeleteResponses, ContactsDeleteErrors, ThrowOnError> =>\n (options.client ?? client).delete<ContactsDeleteResponses, ContactsDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/contacts/{id}',\n ...options,\n });\n\n/**\n * One contact\n */\nexport const contactsGet = <ThrowOnError extends boolean = false>(\n options: Options<ContactsGetData, ThrowOnError>,\n): RequestResult<ContactsGetResponses, ContactsGetErrors, ThrowOnError> =>\n (options.client ?? client).get<ContactsGetResponses, ContactsGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/contacts/{id}',\n ...options,\n });\n\n/**\n * Change or mute a contact\n *\n * The fields you send, leaving the rest. `snoozed_until` mutes them: their new mail arrives snoozed until then and comes back to the inbox on its own. `null` unmutes. Needs `draft` on the address.\n */\nexport const contactsUpdate = <ThrowOnError extends boolean = false>(\n options: Options<ContactsUpdateData, ThrowOnError>,\n): RequestResult<ContactsUpdateResponses, ContactsUpdateErrors, ThrowOnError> =>\n (options.client ?? client).patch<ContactsUpdateResponses, ContactsUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/contacts/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Unblock a contact\n *\n * Removes the block this address has on them. A block from a wider rule, on their domain or the whole workspace, stays: `blocked` is then `rule`, and it is changed on Rules.\n */\nexport const contactsUnblock = <ThrowOnError extends boolean = false>(\n options: Options<ContactsUnblockData, ThrowOnError>,\n): RequestResult<ContactsUnblockResponses, ContactsUnblockErrors, ThrowOnError> =>\n (options.client ?? client).delete<ContactsUnblockResponses, ContactsUnblockErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/contacts/{id}/block',\n ...options,\n });\n\n/**\n * Block a contact\n *\n * Their mail to this address goes to spam from now on: a sender rule on this address, which Rules lists. Spam rather than rejected, so a mistake is a folder away. Their mail to your other addresses is unchanged.\n */\nexport const contactsBlock = <ThrowOnError extends boolean = false>(\n options: Options<ContactsBlockData, ThrowOnError>,\n): RequestResult<ContactsBlockResponses, ContactsBlockErrors, ThrowOnError> =>\n (options.client ?? client).post<ContactsBlockResponses, ContactsBlockErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/contacts/{id}/block',\n ...options,\n });\n\n/**\n * Remove a label\n *\n * `label_id` in the query, because a label hangs off the conversation.\n */\nexport const threadsLabelsDelete = <ThrowOnError extends boolean = false>(\n options: Options<ThreadsLabelsDeleteData, ThrowOnError>,\n): RequestResult<ThreadsLabelsDeleteResponses, ThreadsLabelsDeleteErrors, ThrowOnError> =>\n (options.client ?? client).delete<\n ThreadsLabelsDeleteResponses,\n ThreadsLabelsDeleteErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/{id}/labels',\n ...options,\n });\n\n/**\n * The labels on a conversation\n */\nexport const threadsLabelsGet = <ThrowOnError extends boolean = false>(\n options: Options<ThreadsLabelsGetData, ThrowOnError>,\n): RequestResult<ThreadsLabelsGetResponses, ThreadsLabelsGetErrors, ThrowOnError> =>\n (options.client ?? client).get<ThreadsLabelsGetResponses, ThreadsLabelsGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/{id}/labels',\n ...options,\n });\n\n/**\n * Apply a label\n *\n * Answers the conversation’s whole label list, not just the one added.\n */\nexport const threadsLabelsCreate = <ThrowOnError extends boolean = false>(\n options: Options<ThreadsLabelsCreateData, ThrowOnError>,\n): RequestResult<ThreadsLabelsCreateResponses, ThreadsLabelsCreateErrors, ThrowOnError> =>\n (options.client ?? client).post<\n ThreadsLabelsCreateResponses,\n ThreadsLabelsCreateErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/{id}/labels',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * List messages\n */\nexport const messagesListInThread = <ThrowOnError extends boolean = false>(\n options: Options<MessagesListInThreadData, ThrowOnError>,\n): RequestResult<MessagesListInThreadResponses, MessagesListInThreadErrors, ThrowOnError> =>\n (options.client ?? client).get<\n MessagesListInThreadResponses,\n MessagesListInThreadErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/messages',\n ...options,\n });\n\n/**\n * Send a message\n *\n * Idempotent with an `Idempotency-Key` header. Answers `202` with the id, the thread and anything **rejected** — addresses the provider would not accept at hand-off, so read it before assuming every recipient got it. A recipient this address is not allowed to write to is a different thing and refuses the whole send: `403` with `blocked` when a rule says no, `not_permitted` when the send policy does. Nothing is sent to anybody in that case. With a test key, `rejected@` at any domain is always rejected and `bounce@` bounces, and `Pidgeon-Test-Fail` causes a 429, a 503, a slow answer or a lost one: https://pidgeon.ai/docs/test-mode#causing-failures.\n */\nexport const messagesSend = <ThrowOnError extends boolean = false>(\n options: Options<MessagesSendData, ThrowOnError>,\n): RequestResult<MessagesSendResponses, MessagesSendErrors, ThrowOnError> =>\n (options.client ?? client).post<MessagesSendResponses, MessagesSendErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/messages',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Check a send without sending\n *\n * Would this send? The body `POST /messages` takes, plus `forward`, through every check a send makes: the address, the plan’s sending limits, suppression, the send policy and rules, the per-recipient cooldown, the daily cap, canary tokens, hand-over and approval. Answers `200` with `would_send` and the envelope, or the exact refusal the send would give — the same status, `error.code`, message, field and `Retry-After`. Nothing is sent or written, and nothing counts against a limit. A reply is checked with `in_reply_to`; a forward with `in_reply_to` and `forward: true`. The answer is for now: a send a moment later can meet a limit this did not.\n */\nexport const messagesCheck = <ThrowOnError extends boolean = false>(\n options: Options<MessagesCheckData, ThrowOnError>,\n): RequestResult<MessagesCheckResponses, MessagesCheckErrors, ThrowOnError> =>\n (options.client ?? client).post<MessagesCheckResponses, MessagesCheckErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/messages/check',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Approve a sign-in as your address\n *\n * Sign in with Pidgeon, from the agent’s side. An app gave the agent an authorization URL; post it here with a key that can **send** as the address, and get back the app’s callback with a one-use code. Open `redirect_url` yourself, within a minute, in the session that started the sign-in: whoever opens it is the one signed in. Name the address in `address` when the URL does not (`login_hint`). The key goes to Pidgeon only, never to the app. A key that can only read, or that does not reach the address, is refused as a send would be.\n */\nexport const signInsApprove = <ThrowOnError extends boolean = false>(\n options: Options<SignInsApproveData, ThrowOnError>,\n): RequestResult<SignInsApproveResponses, SignInsApproveErrors, ThrowOnError> =>\n (options.client ?? client).post<SignInsApproveResponses, SignInsApproveErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/sign-ins',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Search messages\n *\n * Full-text, ranked by relevance, across every address this credential can reach. Name an `identity_id` to search exactly one. Every result carries the address it was found in and the folder it is in, because a hit you cannot attribute to a mailbox is a hit you cannot open. Not paged: page two of a relevance ranking is a place nobody goes, so narrow the query instead.\n */\nexport const messagesSearch = <ThrowOnError extends boolean = false>(\n options?: Options<MessagesSearchData, ThrowOnError>,\n): RequestResult<MessagesSearchResponses, MessagesSearchErrors, ThrowOnError> =>\n (options?.client ?? client).get<MessagesSearchResponses, MessagesSearchErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/messages/search',\n ...options,\n });\n\n/**\n * Apply one action to many conversations\n *\n * Up to 200, the same cap the dashboard uses. Thread-scoped, like everything else that changes a conversation. The response carries an `undo`.\n */\nexport const messagesAct = <ThrowOnError extends boolean = false>(\n options: Options<MessagesActData, ThrowOnError>,\n): RequestResult<MessagesActResponses, MessagesActErrors, ThrowOnError> =>\n (options.client ?? client).post<MessagesActResponses, MessagesActErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/messages/actions',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Put an action back\n *\n * Hand back the `undo` from a `PATCH` or a batch. Unusual for an API to have, and the argument is that software makes mistakes at a speed a person does not.\n */\nexport const messagesUndo = <ThrowOnError extends boolean = false>(\n options: Options<MessagesUndoData, ThrowOnError>,\n): RequestResult<MessagesUndoResponses, MessagesUndoErrors, ThrowOnError> =>\n (options.client ?? client).post<MessagesUndoResponses, MessagesUndoErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/messages/undo',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Wait for the next message\n *\n * Holds the request open until a message matching the filters arrives at the address, or `timeout` seconds pass — one call where you would otherwise poll. The message carries `extracted`: verification codes and links, most likely first. To wait for mail you are about to cause, take a cursor first: call with `after=now&timeout=1`, keep the `cursor`, submit the form or send, then wait with that cursor as `after`, so the mail cannot arrive before the wait starts. Without `after`, it first looks back 2 minutes and returns the newest matching message from then, because a code often lands before the call is made; narrow it with `from`, `subject_contains` or `has_code` so an earlier email is not taken for the one you want, or pass `after=now` to wait only for new mail. With `after=now`, `has_code=true` and a `timeout` above 5, it also takes a code that arrived up to 60 seconds before the call and that no key has read, and says so with `looked_back: true`: a code that beat the wait is not lost. Pass the returned `cursor` as `after` on the next call so nothing arriving between calls is missed. Answers 200 with `message: null` and `timed_out: true` when nothing came. A matching message filed as spam is not returned unless you pass `include_spam=true`; it is counted in `held_back`, with its id, so a timeout never hides mail that arrived. A message matches `from` only when it passed DMARC, because anybody can write a `From:`; one that did not is counted in `held_back.unauthenticated`, and `include_unauthenticated=true` returns it.\n */\nexport const messagesAwait = <ThrowOnError extends boolean = false>(\n options: Options<MessagesAwaitData, ThrowOnError>,\n): RequestResult<MessagesAwaitResponses, MessagesAwaitErrors, ThrowOnError> =>\n (options.client ?? client).get<MessagesAwaitResponses, MessagesAwaitErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/messages/await',\n ...options,\n });\n\n/**\n * Fetch one message\n */\nexport const messagesGet = <ThrowOnError extends boolean = false>(\n options: Options<MessagesGetData, ThrowOnError>,\n): RequestResult<MessagesGetResponses, MessagesGetErrors, ThrowOnError> =>\n (options.client ?? client).get<MessagesGetResponses, MessagesGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/messages/{id}',\n ...options,\n });\n\n/**\n * Change one conversation\n *\n * Three different kinds of fact: `is_read` is about the reader, `is_starred` is about the mailbox, and `folder` is where the conversation lives. Thread-scoped. The response carries an `undo`.\n */\nexport const messagesUpdate = <ThrowOnError extends boolean = false>(\n options: Options<MessagesUpdateData, ThrowOnError>,\n): RequestResult<MessagesUpdateResponses, MessagesUpdateErrors, ThrowOnError> =>\n (options.client ?? client).patch<MessagesUpdateResponses, MessagesUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/messages/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Reply to one message\n *\n * The recipients, the subject and the thread are read off the message being answered. You bring the words.\n */\nexport const messagesReply = <ThrowOnError extends boolean = false>(\n options: Options<MessagesReplyData, ThrowOnError>,\n): RequestResult<MessagesReplyResponses, MessagesReplyErrors, ThrowOnError> =>\n (options.client ?? client).post<MessagesReplyResponses, MessagesReplyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/messages/{id}/reply',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Reply to everybody on one message\n *\n * Every address on the message except the ones that reach this mailbox — which a caller cannot work out, because it needs the routing table.\n */\nexport const messagesReplyAll = <ThrowOnError extends boolean = false>(\n options: Options<MessagesReplyAllData, ThrowOnError>,\n): RequestResult<MessagesReplyAllResponses, MessagesReplyAllErrors, ThrowOnError> =>\n (options.client ?? client).post<MessagesReplyAllResponses, MessagesReplyAllErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/messages/{id}/reply-all',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Forward one message\n *\n * `to` is required: a forward exists to reach somebody the original did not.\n */\nexport const messagesForward = <ThrowOnError extends boolean = false>(\n options: Options<MessagesForwardData, ThrowOnError>,\n): RequestResult<MessagesForwardResponses, MessagesForwardErrors, ThrowOnError> =>\n (options.client ?? client).post<MessagesForwardResponses, MessagesForwardErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/messages/{id}/forward',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * The message as MIME\n *\n * `message/rfc822`, not JSON. An API key gets the message rebuilt from the stored message, with a canary token in its text (/docs/firewall): the original bytes cannot carry one, so `X-Pidgeon-Reconstructed` is `true` and a rebuild cannot verify DKIM. The message’s `authentication` is our check of the original’s signatures. `headers=original` returns only the original’s header section, for any caller: the signed agent declaration, checkable as /verify checks it, with no body to stamp.\n */\nexport const messagesRaw = <ThrowOnError extends boolean = false>(\n options: Options<MessagesRawData, ThrowOnError>,\n): RequestResult<MessagesRawResponses, MessagesRawErrors, ThrowOnError> =>\n (options.client ?? client).get<MessagesRawResponses, MessagesRawErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/messages/{id}/raw',\n ...options,\n });\n\n/**\n * Export mail as mbox\n *\n * Every message the key can read, as one `application/mbox` file, streamed — or one address of it with `identity_id`. Each message carries `X-Pidgeon-Mailbox` so a file holding several addresses can be split again; originals are byte for byte where storage still holds them. Four an hour per workspace.\n */\nexport const exportMail = <ThrowOnError extends boolean = false>(\n options?: Options<ExportMailData, ThrowOnError>,\n): RequestResult<ExportMailResponses, ExportMailErrors, ThrowOnError> =>\n (options?.client ?? client).get<ExportMailResponses, ExportMailErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/export',\n ...options,\n });\n\n/**\n * List threads\n *\n * Filter with `identity_id`, `status`, `owner_type` and `assignee_id`. `assignee_id` takes a person’s id, or the literal `unassigned` for the queue nobody has picked up — it says which *human* is answering, where `owner_type` says which kind of thing is.\n */\nexport const threadsList = <ThrowOnError extends boolean = false>(\n options?: Options<ThreadsListData, ThrowOnError>,\n): RequestResult<ThreadsListResponses, ThreadsListErrors, ThrowOnError> =>\n (options?.client ?? client).get<ThreadsListResponses, ThreadsListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads',\n ...options,\n });\n\n/**\n * Read a conversation\n *\n * One conversation, by id. Every event payload carries a `thread_id`, so this is how a webhook handler turns one into something it can read.\n */\nexport const threadsGet = <ThrowOnError extends boolean = false>(\n options: Options<ThreadsGetData, ThrowOnError>,\n): RequestResult<ThreadsGetResponses, ThreadsGetErrors, ThrowOnError> =>\n (options.client ?? client).get<ThreadsGetResponses, ThreadsGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/{id}',\n ...options,\n });\n\n/**\n * Update a thread\n *\n * Its status and who owns it — the state a conversation carries. Handing it to a person notifies them: the assignee if you name one, otherwise everybody who can answer as the address. `reason` is shown in that notification. While a person has the conversation (it is `human` with an assignee, or in `human_review`), a key may not set `owner_type` to anything else: `403 taken_over`. The person hands it back.\n */\nexport const threadsUpdate = <ThrowOnError extends boolean = false>(\n options: Options<ThreadsUpdateData, ThrowOnError>,\n): RequestResult<ThreadsUpdateResponses, ThreadsUpdateErrors, ThrowOnError> =>\n (options.client ?? client).patch<ThreadsUpdateResponses, ThreadsUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/threads/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * List domains\n */\nexport const domainsList = <ThrowOnError extends boolean = false>(\n options?: Options<DomainsListData, ThrowOnError>,\n): RequestResult<DomainsListResponses, DomainsListErrors, ThrowOnError> =>\n (options?.client ?? client).get<DomainsListResponses, DomainsListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/domains',\n ...options,\n });\n\n/**\n * Connect a domain\n *\n * Returns the domain **and the records to publish**, because showing them to your own customer is the one thing every caller does next. DNS is the step this API cannot perform — we cannot write in somebody else’s zone — so the job is to make the human step delegable. Watch `dns_complete`: it is false while the DKIM records do not exist yet, and a list published in that state verifies and cannot sign mail. Watch `existing_mail` too: when the domain already receives mail elsewhere it names the provider, and with `inbound_enabled` true, publishing the MX record stops that mail arriving there. Send `inbound_enabled: false` to send as the domain and leave its mail alone, or use a subdomain such as `agents.` for inboxes.\n */\nexport const domainsCreate = <ThrowOnError extends boolean = false>(\n options: Options<DomainsCreateData, ThrowOnError>,\n): RequestResult<DomainsCreateResponses, DomainsCreateErrors, ThrowOnError> =>\n (options.client ?? client).post<DomainsCreateResponses, DomainsCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/domains',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * The records as a zone file\n *\n * BIND format, which Route 53, Cloudflare and most registrars import and our JSON is not. TTLs are 300: these records change twice, and a long TTL on one you are getting right is an hour of somebody else’s cache.\n */\nexport const domainsZoneFile = <ThrowOnError extends boolean = false>(\n options: Options<DomainsZoneFileData, ThrowOnError>,\n): RequestResult<DomainsZoneFileResponses, DomainsZoneFileErrors, ThrowOnError> =>\n (options.client ?? client).get<DomainsZoneFileResponses, DomainsZoneFileErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/domains/{id}/zone-file',\n ...options,\n });\n\n/**\n * One-click DNS setup, when the provider supports it\n *\n * The **Domain Connect** standard: the URL returned is signed by and points at the domain’s own DNS provider, where the owner signs in, reviews the records and approves — the provider writes them. Nothing here is a credential of ours.\n *\n * Answers `200` either way. `supported: false` is a fact about somebody else’s DNS provider rather than a failure of this request, and `reason` says whose problem it is: `provider` means that zone cannot do it, `unconfigured` means this deployment is not registered. Either way, fall back to `GET /domains/{id}/zone-file` or the `records` on the domain.\n *\n * `template` is `mail` (everything: ownership, DKIM and MX) or `mx` (the MX alone, for a domain already sending through us that is now going to receive).\n */\nexport const domainsGetSetupLink = <ThrowOnError extends boolean = false>(\n options: Options<DomainsGetSetupLinkData, ThrowOnError>,\n): RequestResult<DomainsGetSetupLinkResponses, DomainsGetSetupLinkErrors, ThrowOnError> =>\n (options.client ?? client).get<\n DomainsGetSetupLinkResponses,\n DomainsGetSetupLinkErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/domains/{id}/setup-link',\n ...options,\n });\n\n/**\n * Check the zone again\n *\n * Idempotent and safe to poll — calling it on a verified domain re-checks and says so rather than erroring. Both halves in one answer: ownership, and whether mail is configured. The floor on how often this is worth calling is the zone’s TTL. Better still, subscribe to `domain.verified` and do not poll.\n */\nexport const domainsVerify = <ThrowOnError extends boolean = false>(\n options: Options<DomainsVerifyData, ThrowOnError>,\n): RequestResult<DomainsVerifyResponses, DomainsVerifyErrors, ThrowOnError> =>\n (options.client ?? client).post<DomainsVerifyResponses, DomainsVerifyErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/domains/{id}/verify',\n ...options,\n });\n\n/**\n * Disconnect a domain\n *\n * Takes its addresses, their mail, their routing rules and their webhooks with it. There is no undo.\n */\nexport const domainsDelete = <ThrowOnError extends boolean = false>(\n options: Options<DomainsDeleteData, ThrowOnError>,\n): RequestResult<DomainsDeleteResponses, DomainsDeleteErrors, ThrowOnError> =>\n (options.client ?? client).delete<DomainsDeleteResponses, DomainsDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/domains/{id}',\n ...options,\n });\n\n/**\n * Fetch one domain, with the state of each record\n *\n * `dns_records[].status` says which of ownership, MX, SPF, DKIM and DMARC is missing or wrong, and `found` says what is there instead — which is the difference between your support queue and your customer fixing one TXT record.\n */\nexport const domainsGet = <ThrowOnError extends boolean = false>(\n options: Options<DomainsGetData, ThrowOnError>,\n): RequestResult<DomainsGetResponses, DomainsGetErrors, ThrowOnError> =>\n (options.client ?? client).get<DomainsGetResponses, DomainsGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/domains/{id}',\n ...options,\n });\n\n/**\n * Turn the catch-all on or off\n *\n * The one thing about a domain that can change. Catch-all is two gates: this switch, and a `catch_all` routing rule saying where the mail goes — so turning it on without a rule does nothing, and turning it off later does not throw away where the mail was going.\n */\nexport const domainsUpdate = <ThrowOnError extends boolean = false>(\n options: Options<DomainsUpdateData, ThrowOnError>,\n): RequestResult<DomainsUpdateResponses, DomainsUpdateErrors, ThrowOnError> =>\n (options.client ?? client).patch<DomainsUpdateResponses, DomainsUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/domains/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * List routing rules\n *\n * Every rule in the workspace, newest domain-first. `domain_id` narrows it to one domain.\n */\nexport const routingList = <ThrowOnError extends boolean = false>(\n options?: Options<RoutingListData, ThrowOnError>,\n): RequestResult<RoutingListResponses, RoutingListErrors, ThrowOnError> =>\n (options?.client ?? client).get<RoutingListResponses, RoutingListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/routing-rules',\n ...options,\n });\n\n/**\n * Route an address somewhere\n *\n * An address always beats a rule, so a rule for an address that already exists is refused rather than silently ignored. Name exactly one destination: an address you could already send from, or a webhook — a webhook destination has no inbox, so the message is handed to the endpoint and then gone.\n */\nexport const routingCreate = <ThrowOnError extends boolean = false>(\n options: Options<RoutingCreateData, ThrowOnError>,\n): RequestResult<RoutingCreateResponses, RoutingCreateErrors, ThrowOnError> =>\n (options.client ?? client).post<RoutingCreateResponses, RoutingCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/routing-rules',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Delete a routing rule\n */\nexport const routingDelete = <ThrowOnError extends boolean = false>(\n options: Options<RoutingDeleteData, ThrowOnError>,\n): RequestResult<RoutingDeleteResponses, RoutingDeleteErrors, ThrowOnError> =>\n (options.client ?? client).delete<RoutingDeleteResponses, RoutingDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/routing-rules/{id}',\n ...options,\n });\n\n/**\n * Enable or disable a rule\n *\n * A disabled rule still says where that address was going, which is what you want during an incident. What it matches and where it points are the rule itself and cannot be edited — create the replacement and delete this one.\n */\nexport const routingUpdate = <ThrowOnError extends boolean = false>(\n options: Options<RoutingUpdateData, ThrowOnError>,\n): RequestResult<RoutingUpdateResponses, RoutingUpdateErrors, ThrowOnError> =>\n (options.client ?? client).patch<RoutingUpdateResponses, RoutingUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/routing-rules/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * List the folders of one mailbox\n *\n * The shape of a sidebar. `identity_id` is required — there is no cross-mailbox view, because merging the folders of several addresses would invent a mailbox nobody has.\n */\nexport const mailboxesList = <ThrowOnError extends boolean = false>(\n options: Options<MailboxesListData, ThrowOnError>,\n): RequestResult<MailboxesListResponses, MailboxesListErrors, ThrowOnError> =>\n (options.client ?? client).get<MailboxesListResponses, MailboxesListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/mailboxes',\n ...options,\n });\n\n/**\n * What changed since you last looked\n *\n * Per mailbox, not per folder: a message moving from the inbox to the archive is one event, and the row says where it went. Arrivals are included, so this is the only thing to poll. `since` is the `sync_cursor` from a listing or the `next_cursor` from a previous delta — **not** a page cursor, which walks a different order and is refused rather than guessed at. A cursor older than the window in which we keep the record of what was deleted returns `410 resync`, because an empty delta would be indistinguishable from \"nothing changed\".\n */\nexport const mailboxesChanges = <ThrowOnError extends boolean = false>(\n options: Options<MailboxesChangesData, ThrowOnError>,\n): RequestResult<MailboxesChangesResponses, MailboxesChangesErrors, ThrowOnError> =>\n (options.client ?? client).get<MailboxesChangesResponses, MailboxesChangesErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/mailboxes/changes',\n ...options,\n });\n\n/**\n * Empty the trash\n *\n * Only `trash`; every other folder refuses. Permanent, and it takes attachments and archived originals with it — there is no undo, because the snapshot `POST /messages/undo` replays is a set of column values and these rows are gone. `delete_forever` on `POST /messages/actions` does the same to a list you name, and caps at 200; this needs no ids.\n */\nexport const mailboxesEmptyTrash = <ThrowOnError extends boolean = false>(\n options: Options<MailboxesEmptyTrashData, ThrowOnError>,\n): RequestResult<MailboxesEmptyTrashResponses, MailboxesEmptyTrashErrors, ThrowOnError> =>\n (options.client ?? client).delete<\n MailboxesEmptyTrashResponses,\n MailboxesEmptyTrashErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/mailboxes/{folder}',\n ...options,\n });\n\n/**\n * List one folder\n *\n * A row is a conversation — the newest message in each thread — not a message. Paged by an opaque `cursor`, which is the `next_cursor` of the page before it: it carries a sort key and an id together, because several messages can share a millisecond. Do not construct one.\n */\nexport const mailboxesListFolder = <ThrowOnError extends boolean = false>(\n options: Options<MailboxesListFolderData, ThrowOnError>,\n): RequestResult<MailboxesListFolderResponses, MailboxesListFolderErrors, ThrowOnError> =>\n (options.client ?? client).get<\n MailboxesListFolderResponses,\n MailboxesListFolderErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/mailboxes/{folder}',\n ...options,\n });\n\n/**\n * List the keys in this workspace\n *\n * Names, prefixes, what each reaches and when it was last used — never a secret. The list is what you read before revoking something. `pod_id` narrows it to one pod’s keys, revoked ones included.\n */\nexport const keysList = <ThrowOnError extends boolean = false>(\n options?: Options<KeysListData, ThrowOnError>,\n): RequestResult<KeysListResponses, KeysListErrors, ThrowOnError> =>\n (options?.client ?? client).get<KeysListResponses, KeysListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/api-keys',\n ...options,\n });\n\n/**\n * Mint a key\n *\n * Say what the key reaches and what it may do: one of `identity_ids` or `pod_id`, and `access`. `identity_ids` must be addresses the calling key administers, at no more than its own `access`: a key cannot delegate reach it does not have, and `reaches_all` is refused to a key.\n *\n * Until 26 November 2026 a request without `access` still works — the new key takes the calling key’s level — and is answered with `Deprecation`, `Sunset` and a `warnings` entry. From that date it is a 400 with `field: \"access\"`.\n *\n * The `token` is in this response and nowhere else, ever.\n */\nexport const keysCreate = <ThrowOnError extends boolean = false>(\n options: Options<KeysCreateData, ThrowOnError>,\n): RequestResult<KeysCreateResponses, KeysCreateErrors, ThrowOnError> =>\n (options.client ?? client).post<KeysCreateResponses, KeysCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/api-keys',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Revoke a key, and everything it minted\n *\n * Transitive, and that is the point: a leaked key would otherwise mint a second one and survive its own rotation. A key may revoke itself and keys it made — not a sibling, and not its parent.\n */\nexport const keysRevoke = <ThrowOnError extends boolean = false>(\n options: Options<KeysRevokeData, ThrowOnError>,\n): RequestResult<KeysRevokeResponses, KeysRevokeErrors, ThrowOnError> =>\n (options.client ?? client).delete<KeysRevokeResponses, KeysRevokeErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/api-keys/{id}',\n ...options,\n });\n\n/**\n * Fetch one key\n *\n * What it reaches and when it was last used. Never the secret — that is shown once at creation and nothing can produce it again.\n */\nexport const keysGet = <ThrowOnError extends boolean = false>(\n options: Options<KeysGetData, ThrowOnError>,\n): RequestResult<KeysGetResponses, KeysGetErrors, ThrowOnError> =>\n (options.client ?? client).get<KeysGetResponses, KeysGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/api-keys/{id}',\n ...options,\n });\n\n/**\n * Rename a key\n *\n * Its name and its secret (`POST /api-keys/{id}/rotate`) are the only things about a key that can change. Not its scope — a key's reach is what somebody granted when they made it, and widening that in place would let a credential already in circulation reach further than whoever issued it agreed to.\n */\nexport const keysUpdate = <ThrowOnError extends boolean = false>(\n options: Options<KeysUpdateData, ThrowOnError>,\n): RequestResult<KeysUpdateResponses, KeysUpdateErrors, ThrowOnError> =>\n (options.client ?? client).patch<KeysUpdateResponses, KeysUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/api-keys/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Give a key a new secret\n *\n * A new secret for the same key id. Everything that hangs off the id is unchanged — its scope, its ceiling, its expiry, and **every key it minted**, which keep working — so rotating an admin key does not take its children down. Revoking is still how a key and its children end together.\n *\n * The old secret stops now, or after `grace_period_seconds` (at most 86400, a day), so the servers that hold it can move over. One previous secret at a time: rotating again inside the window ends the older one immediately.\n *\n * A key may rotate itself and keys it minted; a person must own the workspace. The `token` is in this response and nowhere else, ever.\n */\nexport const keysRotate = <ThrowOnError extends boolean = false>(\n options: Options<KeysRotateData, ThrowOnError>,\n): RequestResult<KeysRotateResponses, KeysRotateErrors, ThrowOnError> =>\n (options.client ?? client).post<KeysRotateResponses, KeysRotateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/api-keys/{id}/rotate',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Simulate an inbound message (test keys only)\n *\n * Delivers a message to one of this **test key**’s addresses as though it had arrived from outside, through the real inbound pipeline — routing, sender rules, spam, the Firewall, threading, `message.received` and its webhooks — marked `test`. Pass `in_reply_to` with a message id to have it arrive as a reply in that thread, which is how a test plays the customer answering your agent.\n *\n * A live key gets `403`. The address must be one the key reaches at `send`. Nothing is sent to `from`, and the message counts against nothing on your plan.\n */\nexport const testInbound = <ThrowOnError extends boolean = false>(\n options: Options<TestInboundData, ThrowOnError>,\n): RequestResult<TestInboundResponses, TestInboundErrors, ThrowOnError> =>\n (options.client ?? client).post<TestInboundResponses, TestInboundErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/test/inbound',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * List the devices that reach one address\n */\nexport const appPasswordsList = <ThrowOnError extends boolean = false>(\n options: Options<AppPasswordsListData, ThrowOnError>,\n): RequestResult<AppPasswordsListResponses, AppPasswordsListErrors, ThrowOnError> =>\n (options.client ?? client).get<AppPasswordsListResponses, AppPasswordsListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/app-passwords',\n ...options,\n });\n\n/**\n * Issue IMAP and SMTP credentials for one address\n *\n * What lets you hand a customer a mailbox they can open in a mail client. Only for an address this key can already **send** from — the credential reads the inbox and sends as the address, so issuing one is handing over exactly that. `username` and `password` are returned together and are useless apart.\n */\nexport const appPasswordsCreate = <ThrowOnError extends boolean = false>(\n options: Options<AppPasswordsCreateData, ThrowOnError>,\n): RequestResult<AppPasswordsCreateResponses, AppPasswordsCreateErrors, ThrowOnError> =>\n (options.client ?? client).post<\n AppPasswordsCreateResponses,\n AppPasswordsCreateErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/app-passwords',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Revoke an app password\n */\nexport const appPasswordsRevoke = <ThrowOnError extends boolean = false>(\n options: Options<AppPasswordsRevokeData, ThrowOnError>,\n): RequestResult<AppPasswordsRevokeResponses, AppPasswordsRevokeErrors, ThrowOnError> =>\n (options.client ?? client).delete<\n AppPasswordsRevokeResponses,\n AppPasswordsRevokeErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/app-passwords/{id}',\n ...options,\n });\n\n/**\n * What this key is, and what it may do\n *\n * The one question a credential could not ask. Everything else here answers what is *in* the account, so the only way to learn your own access was to try something and read the refusal — and a key that reaches nothing looks exactly like a key that is broken. Free: no write, no side effect, and the three facts that decide whether your next call works.\n */\nexport const meGet = <ThrowOnError extends boolean = false>(\n options?: Options<MeGetData, ThrowOnError>,\n): RequestResult<MeGetResponses, MeGetErrors, ThrowOnError> =>\n (options?.client ?? client).get<MeGetResponses, MeGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/me',\n ...options,\n });\n\n/**\n * Which account this key is for\n *\n * Read-only. Renaming is a settings field and deleting takes the calling credential with it; neither belongs to a bearer token. `plan` is here so a caller can say \"your plan allows N\" rather than discovering it from a 402.\n */\nexport const workspaceGet = <ThrowOnError extends boolean = false>(\n options?: Options<WorkspaceGetData, ThrowOnError>,\n): RequestResult<WorkspaceGetResponses, WorkspaceGetErrors, ThrowOnError> =>\n (options?.client ?? client).get<WorkspaceGetResponses, WorkspaceGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace',\n ...options,\n });\n\n/**\n * List the people in this workspace\n *\n * Read-only, and workspace-level: a key with no mailbox grants can still read it, for the same reason it can list domains. Assigning a conversation needs an id from here. Inviting and removing people stay in the dashboard — an invitation is mail to a person, and removing somebody hands on their mailboxes.\n */\nexport const workspaceMembers = <ThrowOnError extends boolean = false>(\n options?: Options<WorkspaceMembersData, ThrowOnError>,\n): RequestResult<WorkspaceMembersResponses, WorkspaceMembersErrors, ThrowOnError> =>\n (options?.client ?? client).get<WorkspaceMembersResponses, WorkspaceMembersErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/workspace/members',\n ...options,\n });\n\n/**\n * List events\n *\n * The same events a webhook delivers, readable after the fact — so a missed delivery is recoverable without replaying anything.\n *\n * **Two directions.** `cursor` pages backwards through history, newest first, which is what a dashboard shows. `after` tails the log forwards, oldest first, which is what a caller that cannot receive a webhook does: ask for everything since the last event you saw, act on it, and keep the last `created_at` as the next cursor. Naming both is refused — they are different reads.\n *\n * **Starting from nothing: pass `after=1970-01-01T00:00:00Z`.** With neither parameter this answers newest first, so a first-time consumer that takes the last row as its high-water mark stores the *oldest* event in the log and never advances. Any timestamp at or before the oldest event you hold will do; the epoch is the one nobody has to think about.\n *\n * A forward page is ordered oldest first precisely so its **last** row is the high-water mark to resume from; `next_cursor` is that row either way.\n */\nexport const eventsList = <ThrowOnError extends boolean = false>(\n options?: Options<EventsListData, ThrowOnError>,\n): RequestResult<EventsListResponses, EventsListErrors, ThrowOnError> =>\n (options?.client ?? client).get<EventsListResponses, EventsListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/events',\n ...options,\n });\n\n/**\n * Events over a WebSocket\n *\n * The event log over a WebSocket — `wss://pidgeon.ai/api/v1/events/socket` — with the same `type`, `identity_id` and `after` as `GET /events/stream`. All frames are JSON text.\n *\n * **Authenticate** with the `Authorization` header on the upgrade, or — from a browser, which cannot set one — send `{\"type\":\"auth\",\"api_key\":\"pgn_live_…\"}` as the first message within ten seconds. Never put the key in the URL.\n *\n * **The server sends** `{\"type\":\"ready\",\"cursor\"}`, then `{\"type\":\"event\",\"event\":Event}` per event, oldest first. Before about 280 seconds it sends `{\"type\":\"reconnect\",\"cursor\"}` and closes with 4000: reconnect with `after` set to that cursor and nothing is missed. 4401 means no key or a bad one; 4500 means the read failed — reconnect with the last cursor you saw.\n *\n * Like the stream, it polls the log on our side of the wire every two seconds.\n */\nexport const eventsSocket = <ThrowOnError extends boolean = false>(\n options?: Options<EventsSocketData, ThrowOnError>,\n): RequestResult<unknown, EventsSocketErrors, ThrowOnError> =>\n (options?.client ?? client).get<unknown, EventsSocketErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/events/socket',\n ...options,\n });\n\n/**\n * Stream events as they happen\n *\n * The event log held open, for a caller that cannot host a webhook endpoint — a script on a laptop, a notebook, an agent runtime with no public address.\n *\n * **Server-sent events.** Each message carries the event as `data`, the event type as `event:`, and the cursor to resume from as `id:`. Authentication, filtering by `type` and `identity_id`, and the `after` cursor are all exactly as on `GET /events` — this is that read, held open.\n *\n * **Reconnection is automatic and lossless.** A compliant client resends the last `id:` it saw as `Last-Event-ID`, which is preferred over `after`, so a dropped connection resumes with no gap and no repeat. The connection closes itself after about 280 seconds so that the last thing you receive is a cursor rather than a socket error; reconnect and carry on.\n *\n * **It polls, every two seconds, on our side of the wire.** No push exists in the database. What this buys is one held connection instead of a request from your network on a timer, and being woken only when something happened.\n */\nexport const eventsStream = <ThrowOnError extends boolean = false>(\n options?: Options<EventsStreamData, ThrowOnError, EventsStreamResponse>,\n): Promise<ServerSentEventsResult<EventsStreamResponses>> =>\n (options?.client ?? client).sse.get<EventsStreamResponses, EventsStreamErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/events/stream',\n ...options,\n });\n\n/**\n * Fetch one event\n */\nexport const eventsGet = <ThrowOnError extends boolean = false>(\n options: Options<EventsGetData, ThrowOnError>,\n): RequestResult<EventsGetResponses, EventsGetErrors, ThrowOnError> =>\n (options.client ?? client).get<EventsGetResponses, EventsGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/events/{id}',\n ...options,\n });\n\n/**\n * List webhooks\n */\nexport const webhooksList = <ThrowOnError extends boolean = false>(\n options?: Options<WebhooksListData, ThrowOnError>,\n): RequestResult<WebhooksListResponses, WebhooksListErrors, ThrowOnError> =>\n (options?.client ?? client).get<WebhooksListResponses, WebhooksListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks',\n ...options,\n });\n\n/**\n * Create a webhook\n *\n * The signing secret is returned once, here, and never again. Every delivery is signed with it as HMAC-SHA256.\n */\nexport const webhooksCreate = <ThrowOnError extends boolean = false>(\n options: Options<WebhooksCreateData, ThrowOnError>,\n): RequestResult<WebhooksCreateResponses, WebhooksCreateErrors, ThrowOnError> =>\n (options.client ?? client).post<WebhooksCreateResponses, WebhooksCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Delete a webhook\n */\nexport const webhooksDelete = <ThrowOnError extends boolean = false>(\n options: Options<WebhooksDeleteData, ThrowOnError>,\n): RequestResult<WebhooksDeleteResponses, WebhooksDeleteErrors, ThrowOnError> =>\n (options.client ?? client).delete<WebhooksDeleteResponses, WebhooksDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/{id}',\n ...options,\n });\n\n/**\n * Fetch one endpoint\n */\nexport const webhooksGet = <ThrowOnError extends boolean = false>(\n options: Options<WebhooksGetData, ThrowOnError>,\n): RequestResult<WebhooksGetResponses, WebhooksGetErrors, ThrowOnError> =>\n (options.client ?? client).get<WebhooksGetResponses, WebhooksGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/{id}',\n ...options,\n });\n\n/**\n * Turn an endpoint off, or back on\n *\n * We disable one ourselves after enough consecutive failures. Without this you would have to delete and recreate it, which changes the signing secret every receiver is verifying against. Re-enabling forgives the failure count.\n */\nexport const webhooksUpdate = <ThrowOnError extends boolean = false>(\n options: Options<WebhooksUpdateData, ThrowOnError>,\n): RequestResult<WebhooksUpdateResponses, WebhooksUpdateErrors, ThrowOnError> =>\n (options.client ?? client).patch<WebhooksUpdateResponses, WebhooksUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * The headers this endpoint carries\n *\n * Returned in full. Our signing secret never is, and the difference is whose credential it is: the secret is ours, and these are your own token for your own endpoint.\n */\nexport const webhooksGetHeaders = <ThrowOnError extends boolean = false>(\n options: Options<WebhooksGetHeadersData, ThrowOnError>,\n): RequestResult<WebhooksGetHeadersResponses, WebhooksGetHeadersErrors, ThrowOnError> =>\n (options.client ?? client).get<\n WebhooksGetHeadersResponses,\n WebhooksGetHeadersErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/{id}/headers',\n ...options,\n });\n\n/**\n * Replace the headers this endpoint carries\n *\n * We sign every delivery, and a signature answers *is this from Pidgeon*. It does not answer the question a gateway asks, which is *does this request carry the token we issued*. PUT, not PATCH: what you send is what the endpoint has afterwards, and `{}` clears them — a merge could not remove one, and removing one is what rotating a token is. The headers we set ourselves are refused by name.\n */\nexport const webhooksUpdateHeaders = <ThrowOnError extends boolean = false>(\n options: Options<WebhooksUpdateHeadersData, ThrowOnError>,\n): RequestResult<WebhooksUpdateHeadersResponses, WebhooksUpdateHeadersErrors, ThrowOnError> =>\n (options.client ?? client).put<\n WebhooksUpdateHeadersResponses,\n WebhooksUpdateHeadersErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/webhooks/{id}/headers',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * What happened to each event we tried to hand you\n *\n * `webhook_id` is required — the question is always about one endpoint. The ids here are what the replay below takes.\n */\nexport const webhooksDeliveries = <ThrowOnError extends boolean = false>(\n options: Options<WebhooksDeliveriesData, ThrowOnError>,\n): RequestResult<WebhooksDeliveriesResponses, WebhooksDeliveriesErrors, ThrowOnError> =>\n (options.client ?? client).get<\n WebhooksDeliveriesResponses,\n WebhooksDeliveriesErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/deliveries',\n ...options,\n });\n\n/**\n * Send it again\n *\n * Re-queues one attempt and resets its count. A verb rather than a status field, because the other statuses are ours to write and mean nothing coming from outside.\n */\nexport const webhooksReplay = <ThrowOnError extends boolean = false>(\n options: Options<WebhooksReplayData, ThrowOnError>,\n): RequestResult<WebhooksReplayResponses, WebhooksReplayErrors, ThrowOnError> =>\n (options.client ?? client).post<WebhooksReplayResponses, WebhooksReplayErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/deliveries/{id}/replay',\n ...options,\n });\n\n/**\n * Accept, decline or tentatively accept a meeting\n *\n * The one call here that changes something in somebody else's calendar: an iCalendar `REPLY` goes to the organiser, which is how Google, Outlook and Calendly learn about an acceptance. The message must be carrying an `invitation`, and one of this mailbox's own addresses must be on it — including an address routed to it, which is the half you cannot work out from the message. Idempotent on the answer: the same answer to the same `sequence` sends once and returns `already_sent`.\n */\nexport const messagesRespondToInvitation = <ThrowOnError extends boolean = false>(\n options: Options<MessagesRespondToInvitationData, ThrowOnError>,\n): RequestResult<\n MessagesRespondToInvitationResponses,\n MessagesRespondToInvitationErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n MessagesRespondToInvitationResponses,\n MessagesRespondToInvitationErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/messages/{id}/invitation/respond',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * A mailbox’s calendar\n *\n * Every mailbox has exactly one, from the moment it exists, so there is nothing to create. `created_at` is the mailbox’s, because the calendar is the mailbox.\n */\nexport const calendarGet = <ThrowOnError extends boolean = false>(\n options: Options<CalendarGetData, ThrowOnError>,\n): RequestResult<CalendarGetResponses, CalendarGetErrors, ThrowOnError> =>\n (options.client ?? client).get<CalendarGetResponses, CalendarGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/calendar',\n ...options,\n });\n\n/**\n * Set the default time zone\n *\n * The zone an event created without one gets. **Changing it does not move existing events**: an event stores the wall time it was given, so \"every Tuesday at 09:00\" is still 09:00 afterwards.\n */\nexport const calendarUpdate = <ThrowOnError extends boolean = false>(\n options: Options<CalendarUpdateData, ThrowOnError>,\n): RequestResult<CalendarUpdateResponses, CalendarUpdateErrors, ThrowOnError> =>\n (options.client ?? client).patch<CalendarUpdateResponses, CalendarUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/calendar',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Everything on the calendar\n *\n * Ordered by when it last changed. `GET /agenda` is the other read and the one you usually want: this answers *what is on this calendar*, that answers *what is on between these two moments*.\n */\nexport const calendarListEvents = <ThrowOnError extends boolean = false>(\n options: Options<CalendarListEventsData, ThrowOnError>,\n): RequestResult<CalendarListEventsResponses, CalendarListEventsErrors, ThrowOnError> =>\n (options.client ?? client).get<\n CalendarListEventsResponses,\n CalendarListEventsErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/calendar/events',\n ...options,\n });\n\n/**\n * Put something on the calendar\n *\n * `start` and `end` are **local wall times with no zone on them** — `2026-10-20T14:00:00` — and `timezone` is a field of its own. That pair is the truth; `starts_at` is the same moment as an instant, derived from it, and it is what survives a daylight-saving change. For an all-day event, `end` is the last day, inclusive.\n */\nexport const calendarCreateEvent = <ThrowOnError extends boolean = false>(\n options: Options<CalendarCreateEventData, ThrowOnError>,\n): RequestResult<CalendarCreateEventResponses, CalendarCreateEventErrors, ThrowOnError> =>\n (options.client ?? client).post<\n CalendarCreateEventResponses,\n CalendarCreateEventErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/calendar/events',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Answer a meeting from the calendar\n *\n * The same act as `POST /messages/{id}/invitation/respond`, reached from the other end — an agent working from an agenda holds an event id and not a message id. When the meeting came from mail and `send_reply` is true (the default), an iCalendar `REPLY` goes to the organiser and the answer is written onto the event. When it did not — a meeting this mailbox created itself — there is nobody to reply to, so the answer is recorded and `reply_sent` is false. One of this mailbox’s own addresses must be on the attendee list, including an address routed to it.\n */\nexport const calendarRespondToEvent = <ThrowOnError extends boolean = false>(\n options: Options<CalendarRespondToEventData, ThrowOnError>,\n): RequestResult<CalendarRespondToEventResponses, CalendarRespondToEventErrors, ThrowOnError> =>\n (options.client ?? client).post<\n CalendarRespondToEventResponses,\n CalendarRespondToEventErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/calendar/events/{eventId}/respond',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * The dates a series actually happens\n *\n * Most of them have no row — they are expanded from the rule, which is what makes a weekly meeting cheap to store. An id here is `{seriesId}::{originalStart}`, derived rather than allocated, and it does **not** change when you edit that date. A date somebody edited comes back in place of the one the rule generated, under that id.\n */\nexport const calendarListEventInstances = <ThrowOnError extends boolean = false>(\n options: Options<CalendarListEventInstancesData, ThrowOnError>,\n): RequestResult<\n CalendarListEventInstancesResponses,\n CalendarListEventInstancesErrors,\n ThrowOnError\n> =>\n (options.client ?? client).get<\n CalendarListEventInstancesResponses,\n CalendarListEventInstancesErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/calendar/events/{eventId}/instances',\n ...options,\n });\n\n/**\n * What is on, in a window, in order\n *\n * `include_overlapping` defaults to true, which is the difference between *what starts today* and *what is on today*: a meeting that began last night and runs into this morning is on today, and a naive `starts_at between` misses it. Cancelled events are left out — an agenda is what you are doing.\n */\nexport const calendarGetAgenda = <ThrowOnError extends boolean = false>(\n options: Options<CalendarGetAgendaData, ThrowOnError>,\n): RequestResult<CalendarGetAgendaResponses, CalendarGetAgendaErrors, ThrowOnError> =>\n (options.client ?? client).get<CalendarGetAgendaResponses, CalendarGetAgendaErrors, ThrowOnError>(\n {\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/calendar/agenda',\n ...options,\n },\n );\n\n/**\n * When several addresses are all free\n *\n * The stretches in a window when every address in `identity_ids` is free, at least `duration_minutes` long. Busy is a timed event that is not cancelled and that the address has not declined; tentative counts as busy, all-day events do not. `day_start` and `day_end` limit it to working hours, read in `timezone` (the first address’s calendar zone by default), and each slot carries its wall times in that zone too. Needs `read` on every address. It books nothing.\n */\nexport const calendarFreeTime = <ThrowOnError extends boolean = false>(\n options: Options<CalendarFreeTimeData, ThrowOnError>,\n): RequestResult<CalendarFreeTimeResponses, CalendarFreeTimeErrors, ThrowOnError> =>\n (options.client ?? client).get<CalendarFreeTimeResponses, CalendarFreeTimeErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/calendar/free-time',\n ...options,\n });\n\n/**\n * Take it off the calendar\n *\n * On one date of a series this records that the date does not happen rather than removing a row — the rule still generates it, so a removal would bring it straight back. `mode=future` ends the series there and leaves every earlier date alone.\n */\nexport const calendarDeleteEvent = <ThrowOnError extends boolean = false>(\n options: Options<CalendarDeleteEventData, ThrowOnError>,\n): RequestResult<CalendarDeleteEventResponses, CalendarDeleteEventErrors, ThrowOnError> =>\n (options.client ?? client).delete<\n CalendarDeleteEventResponses,\n CalendarDeleteEventErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/calendar/events/{eventId}',\n ...options,\n });\n\n/**\n * One event\n */\nexport const calendarGetEvent = <ThrowOnError extends boolean = false>(\n options: Options<CalendarGetEventData, ThrowOnError>,\n): RequestResult<CalendarGetEventResponses, CalendarGetEventErrors, ThrowOnError> =>\n (options.client ?? client).get<CalendarGetEventResponses, CalendarGetEventErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/calendar/events/{eventId}',\n ...options,\n });\n\n/**\n * Change an event\n *\n * An omitted field survives. `sequence` rises only when the change is one attendees see — the time, the title, the place, the status, the list. A `metadata` edit moves the `etag` and not the sequence, because nobody is ever told about it.\n */\nexport const calendarUpdateEvent = <ThrowOnError extends boolean = false>(\n options: Options<CalendarUpdateEventData, ThrowOnError>,\n): RequestResult<CalendarUpdateEventResponses, CalendarUpdateEventErrors, ThrowOnError> =>\n (options.client ?? client).patch<\n CalendarUpdateEventResponses,\n CalendarUpdateEventErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/identities/{id}/calendar/events/{eventId}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Every draft in one mailbox\n *\n * Newest first, and including scheduled ones — a scheduled message is a draft with `send_at` set. `GET /mailboxes/drafts` lists the same rows as a mail client draws them: sender, subject, preview. This gives the recipients and the body, because a caller here is coming back to finish writing.\n */\nexport const draftsList = <ThrowOnError extends boolean = false>(\n options: Options<DraftsListData, ThrowOnError>,\n): RequestResult<DraftsListResponses, DraftsListErrors, ThrowOnError> =>\n (options.client ?? client).get<DraftsListResponses, DraftsListErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/drafts',\n ...options,\n });\n\n/**\n * Write one without sending it\n *\n * An agent that drafts a reply, waits for a human to approve it and sends it an hour later is ordinary supervised automation, and this is where the half-written message lives in the meantime. Idempotent with `Idempotency-Key`.\n */\nexport const draftsCreate = <ThrowOnError extends boolean = false>(\n options: Options<DraftsCreateData, ThrowOnError>,\n): RequestResult<DraftsCreateResponses, DraftsCreateErrors, ThrowOnError> =>\n (options.client ?? client).post<DraftsCreateResponses, DraftsCreateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/drafts',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Throw it away\n */\nexport const draftsDelete = <ThrowOnError extends boolean = false>(\n options: Options<DraftsDeleteData, ThrowOnError>,\n): RequestResult<DraftsDeleteResponses, DraftsDeleteErrors, ThrowOnError> =>\n (options.client ?? client).delete<DraftsDeleteResponses, DraftsDeleteErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/drafts/{id}',\n ...options,\n });\n\n/**\n * Fetch one draft\n */\nexport const draftsGet = <ThrowOnError extends boolean = false>(\n options: Options<DraftsGetData, ThrowOnError>,\n): RequestResult<DraftsGetResponses, DraftsGetErrors, ThrowOnError> =>\n (options.client ?? client).get<DraftsGetResponses, DraftsGetErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/drafts/{id}',\n ...options,\n });\n\n/**\n * Change some of it, and leave the rest\n *\n * An omitted field survives; `null` clears it. Both are needed, because \"I am not touching the subject\" and \"there is no subject\" are different instructions.\n */\nexport const draftsUpdate = <ThrowOnError extends boolean = false>(\n options: Options<DraftsUpdateData, ThrowOnError>,\n): RequestResult<DraftsUpdateResponses, DraftsUpdateErrors, ThrowOnError> =>\n (options.client ?? client).patch<DraftsUpdateResponses, DraftsUpdateErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/drafts/{id}',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Send what is stored\n *\n * No body: the row is the message. The browser passes the composer contents and the draft id together, because the composer *is* the draft; a caller here saved it an hour ago and may be a different process. `PATCH` first to change anything. The id that comes back is the draft's, because a send converts the row.\n */\nexport const draftsSend = <ThrowOnError extends boolean = false>(\n options: Options<DraftsSendData, ThrowOnError>,\n): RequestResult<DraftsSendResponses, DraftsSendErrors, ThrowOnError> =>\n (options.client ?? client).post<DraftsSendResponses, DraftsSendErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/drafts/{id}/send',\n ...options,\n });\n\n/**\n * Where a held send stands\n *\n * A send answered `status: \"pending_approval\"` is a draft waiting for a person: a first message to someone new on an address that asks first, or a reply on a conversation where a message tried to give the agent instructions. Poll this, or subscribe to `draft.approved`, `draft.rejected` and `draft.expired`. Only a person approves, in the dashboard; no key can, including the one that asked. Unanswered for 24 hours, it expires unsent and stays a draft. After approval `message_id` is the sent message.\n */\nexport const draftsApproval = <ThrowOnError extends boolean = false>(\n options: Options<DraftsApprovalData, ThrowOnError>,\n): RequestResult<DraftsApprovalResponses, DraftsApprovalErrors, ThrowOnError> =>\n (options.client ?? client).get<DraftsApprovalResponses, DraftsApprovalErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/drafts/{id}/approval',\n ...options,\n });\n\n/**\n * Back to being an ordinary draft\n */\nexport const draftsCancelSchedule = <ThrowOnError extends boolean = false>(\n options: Options<DraftsCancelScheduleData, ThrowOnError>,\n): RequestResult<DraftsCancelScheduleResponses, DraftsCancelScheduleErrors, ThrowOnError> =>\n (options.client ?? client).delete<\n DraftsCancelScheduleResponses,\n DraftsCancelScheduleErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/drafts/{id}/schedule',\n ...options,\n });\n\n/**\n * Send it later\n *\n * A minute from now at the earliest, thirty days at the latest. A refused send unschedules rather than retrying forever, so a draft can come back on its own with `failed_reason` set — read that before scheduling the same message again.\n */\nexport const draftsSchedule = <ThrowOnError extends boolean = false>(\n options: Options<DraftsScheduleData, ThrowOnError>,\n): RequestResult<DraftsScheduleResponses, DraftsScheduleErrors, ThrowOnError> =>\n (options.client ?? client).post<DraftsScheduleResponses, DraftsScheduleErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/drafts/{id}/schedule',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Take a file off a draft\n *\n * The object goes with the row. An attachment belongs to its draft rather than being shared, so leaving the bytes behind would be storage nobody can reach and everybody is billed for. `POST /attachments` is how one gets on.\n */\nexport const draftsRemoveAttachment = <ThrowOnError extends boolean = false>(\n options: Options<DraftsRemoveAttachmentData, ThrowOnError>,\n): RequestResult<DraftsRemoveAttachmentResponses, DraftsRemoveAttachmentErrors, ThrowOnError> =>\n (options.client ?? client).delete<\n DraftsRemoveAttachmentResponses,\n DraftsRemoveAttachmentErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/drafts/{id}/attachments/{attachmentId}',\n ...options,\n });\n\n/**\n * What happened to the mail\n *\n * Counted from the event log rather than from the messages: a message row says what was sent, and whether it bounced is something the provider told us afterwards. `identity_id` narrows it to one mailbox, which is the question worth asking when you run several — reputation belongs to the address that sent the mail. `pod_id` narrows it to one pod, which is the question a platform asks: sending reputation is isolated per pod, so this is the scope that isolation is claimed at, and the response carries `reputation.sending` — `paused` is the provider having suspended that pod and nobody else. `delivery_rate` is null rather than zero when nothing was sent. An unknown parameter is refused rather than ignored.\n */\nexport const metricsQuery = <ThrowOnError extends boolean = false>(\n options?: Options<MetricsQueryData, ThrowOnError>,\n): RequestResult<MetricsQueryResponses, MetricsQueryErrors, ThrowOnError> =>\n (options?.client ?? client).get<MetricsQueryResponses, MetricsQueryErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/metrics',\n ...options,\n });\n\n/**\n * Upload a file to send\n *\n * Multipart, with `identity_id` and `file` parts — not base64 in JSON, because a ten-megabyte PDF is thirteen megabytes of base64 and every proxy in between would have to be told. **Under 4 MB only**: the platform refuses a request body over 4.5 MB with its own `413`, whatever your plan allows, so use `POST /attachments/uploads` for anything larger. Name the returned id in `attachment_ids` on a send. An upload expires in a day: it is a file no message refers to yet.\n */\nexport const attachmentsUpload = <ThrowOnError extends boolean = false>(\n options: Options<AttachmentsUploadData, ThrowOnError>,\n): RequestResult<AttachmentsUploadResponses, AttachmentsUploadErrors, ThrowOnError> =>\n (options.client ?? client).post<\n AttachmentsUploadResponses,\n AttachmentsUploadErrors,\n ThrowOnError\n >({\n ...formDataBodySerializer,\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/attachments',\n ...options,\n headers: {\n 'Content-Type': null,\n ...options.headers,\n },\n });\n\n/**\n * Upload a large file straight to storage\n *\n * For a file of any size up to your plan’s limit. Say what it is — `identity_id`, `filename`, `content_type` and `size` in bytes — and the answer’s `upload` is a signed URL: `PUT` the bytes there with the `headers` it lists, within 15 minutes. The size and type are signed, so a body of another length or type is refused. Then call `POST /attachments/{id}/complete`; until then a send naming the id is a `409`. The same checks as `POST /attachments`: `draft` on the address, the allowed types, the plan’s per-file size. Expires in a day if never sent.\n */\nexport const attachmentsCreateUpload = <ThrowOnError extends boolean = false>(\n options: Options<AttachmentsCreateUploadData, ThrowOnError>,\n): RequestResult<AttachmentsCreateUploadResponses, AttachmentsCreateUploadErrors, ThrowOnError> =>\n (options.client ?? client).post<\n AttachmentsCreateUploadResponses,\n AttachmentsCreateUploadErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/attachments/uploads',\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n/**\n * Finish a large upload\n *\n * After the `PUT` to the URL `POST /attachments/uploads` gave you. Checks that the file arrived at the size and type declared and makes the id sendable. A `409` means nothing has arrived yet. Safe to repeat.\n */\nexport const attachmentsCompleteUpload = <ThrowOnError extends boolean = false>(\n options: Options<AttachmentsCompleteUploadData, ThrowOnError>,\n): RequestResult<\n AttachmentsCompleteUploadResponses,\n AttachmentsCompleteUploadErrors,\n ThrowOnError\n> =>\n (options.client ?? client).post<\n AttachmentsCompleteUploadResponses,\n AttachmentsCompleteUploadErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/attachments/{id}/complete',\n ...options,\n });\n\n/**\n * Get a download link for an attachment\n *\n * A signed URL rather than the bytes: streaming a 25 MB file through the API costs the transfer twice and gains the caller nothing. The link expires.\n */\nexport const attachmentsDownloadUrl = <ThrowOnError extends boolean = false>(\n options: Options<AttachmentsDownloadUrlData, ThrowOnError>,\n): RequestResult<AttachmentsDownloadUrlResponses, AttachmentsDownloadUrlErrors, ThrowOnError> =>\n (options.client ?? client).get<\n AttachmentsDownloadUrlResponses,\n AttachmentsDownloadUrlErrors,\n ThrowOnError\n >({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/attachments/{id}',\n ...options,\n });\n\n/**\n * Read an attachment as text\n *\n * A CSV, a log, JSON or another text format (up to 5 MB), or a PDF, a `.docx` or an `.xlsx` (up to 10 MB), as text: the first 200,000 characters of it. Screened by Pidgeon Firewall with the sender of the message it came with, because a file in an email is mail a model reads: `firewall` says whether it tries to steer you, and `body=clean` returns it with hidden content removed. Text a document hides from a person (a hidden Word run, a hidden sheet, row or column) counts as hidden text. Where the address holds suspicious mail, a flagged attachment holds its message, and a key is answered `403 held`. A scanned or password-protected PDF, `.doc`, `.xls`, PowerPoint, HTML and images are refused; `GET /attachments/{id}` gives a link to those.\n */\nexport const attachmentsText = <ThrowOnError extends boolean = false>(\n options: Options<AttachmentsTextData, ThrowOnError>,\n): RequestResult<AttachmentsTextResponses, AttachmentsTextErrors, ThrowOnError> =>\n (options.client ?? client).get<AttachmentsTextResponses, AttachmentsTextErrors, ThrowOnError>({\n security: [{ scheme: 'bearer', type: 'http' }],\n url: '/attachments/{id}/text',\n ...options,\n });\n","/**\n * Verifying a delivery.\n *\n * The only part of this package with a security contract: it is what a\n * customer runs to decide whether a request claiming a message arrived\n * actually came from us. Everything else here is a typed `fetch`.\n *\n * Two properties carry that contract, and both are tested against payloads\n * signed by the server's own implementation — see\n * `tests/unit/sdk-webhook-verifier.test.ts`. Testing this file against\n * itself would prove only that it agrees with itself, which is exactly the\n * bug two implementations of one scheme produce.\n */\n\nexport const SIGNATURE_HEADER = 'x-pidgeon-signature';\nexport const TIMESTAMP_HEADER = 'x-pidgeon-timestamp';\n\nexport interface WebhookEnvelope {\n id: string;\n type: string;\n created_at: string;\n data: Record<string, unknown>;\n}\n\n/**\n * Verifies a delivery and returns its payload.\n *\n * Throws rather than returning false, because the one thing this must not\n * allow is a caller who forgets to check the boolean. Uses `crypto.subtle`,\n * so it works unchanged in Node, Bun, Deno, Workers and Vercel functions.\n *\n * `rawBody` must be the exact bytes we sent. Re-serialising parsed JSON\n * changes key order and whitespace, and the signature will not match — read\n * the body as text before you parse it.\n */\nexport async function verifyWebhook(input: {\n rawBody: string;\n headers: Headers | Record<string, string | undefined>;\n secret: string;\n toleranceSeconds?: number;\n now?: Date;\n}): Promise<WebhookEnvelope> {\n /*\n * **However the framework spells it**, which this did not do.\n *\n * It read `headers[name] ?? headers[name.toLowerCase()]`, and `name` is\n * already one of the lowercase constants above — so the fallback lowercased\n * a string that was lowercase and looked up the same key twice. A plain\n * object keyed `X-Pidgeon-Signature` was rejected as unsigned.\n *\n * It survived every test and every local run because `Headers` and Node's\n * `req.headers` both lowercase their keys for you, so the broken branch is\n * only reached by a plain object somebody built themselves — which is what\n * API Gateway hands a Lambda, and what any test fixture written by hand\n * looks like. `pidgeon` on PyPI has done this correctly at the same version\n * number, and that module's docstring says keeping the two in step is the\n * point of writing it twice.\n *\n * The rejection made it worse: *\"This request is not signed.\"* is the same\n * sentence `/docs/webhooks/verifying` tells you means *you parsed the body\n * first*, so the documentation sent you to the wrong cause. Found by a\n * field test on 15 October, against docs that promise case-insensitive\n * matching in both clients.\n */\n const get = (name: string): string | undefined => {\n if (input.headers instanceof Headers) return input.headers.get(name) ?? undefined;\n\n const direct = input.headers[name];\n if (direct !== undefined) return direct;\n\n const wanted = name.toLowerCase();\n for (const [key, value] of Object.entries(input.headers)) {\n if (key.toLowerCase() === wanted) return value;\n }\n\n return undefined;\n };\n\n const timestamp = get(TIMESTAMP_HEADER);\n const signature = get(SIGNATURE_HEADER);\n\n if (!timestamp || !signature) throw new Error('This request is not signed.');\n\n const seconds = Number(timestamp);\n if (!Number.isFinite(seconds)) throw new Error('The signature timestamp is not a number.');\n\n const now = Math.floor((input.now ?? new Date()).getTime() / 1000);\n const tolerance = input.toleranceSeconds ?? 300;\n\n if (Math.abs(now - seconds) > tolerance) {\n throw new Error('This request is too old to trust. It may be a replay.');\n }\n\n const key = await crypto.subtle.importKey(\n 'raw',\n new TextEncoder().encode(input.secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n\n const mac = await crypto.subtle.sign(\n 'HMAC',\n key,\n new TextEncoder().encode(`${seconds}.${input.rawBody}`),\n );\n\n const expected = `v1=${[...new Uint8Array(mac)].map((byte) => byte.toString(16).padStart(2, '0')).join('')}`;\n\n if (!constantTimeEqual(expected, signature)) {\n throw new Error('The signature does not match.');\n }\n\n return JSON.parse(input.rawBody) as WebhookEnvelope;\n}\n\n/** Length-independent compare. Not `===`, which returns on the first byte. */\nfunction constantTimeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n\n let difference = 0;\n for (let index = 0; index < a.length; index += 1) {\n difference |= a.charCodeAt(index) ^ b.charCodeAt(index);\n }\n\n return difference === 0;\n}\n","/**\n * Holding the event log open.\n *\n * **The second thing a generator cannot produce**, for the same reason as\n * `webhooks.ts`: `GET /events/stream` answers `text/event-stream` and\n * `openapi-ts` builds a typed `fetch` that resolves once with a body. There\n * is nowhere in a generated client to put a connection that stays open, so\n * `eventsStream` exists in the types and does nothing useful, and the\n * endpoint the documentation recommends for *\"a caller that cannot host a\n * webhook endpoint — a script on a laptop, a notebook, an agent runtime with\n * no public address\"* was the one endpoint every customer hand-rolled.\n *\n * A field test on 15 October wrote forty lines of it and they worked first\n * try, which is the argument both ways: the protocol is simple, and nobody\n * should write it twice. These are those forty lines, once.\n *\n * `EventSource` is not used. It cannot send an `Authorization` header — the\n * browser API takes a URL and nothing else — and putting an API key in a\n * query string is the one place it must never go. So this is `fetch` with a\n * reader, which also works unchanged in Node, Bun, Deno, Workers and Vercel\n * functions.\n */\n\n/** A row of `GET /events`, delivered as it happens. The same shape either way. */\nexport interface StreamedEvent {\n id: string;\n type: string;\n identity: string | null;\n message_id: string | null;\n thread_id: string | null;\n data: Record<string, unknown>;\n created_at: string;\n}\n\nexport interface StreamOptions {\n /** `https://pidgeon.ai/api/v1` unless you are pointing at something else. */\n baseUrl?: string;\n apiKey: string;\n /** Narrow to one mailbox. Omitted, the stream spans every one the key reaches. */\n identityId?: string;\n /** A comma-separated list, exactly as `GET /events` takes it. */\n type?: string;\n /**\n * Where to start, as an ISO timestamp.\n *\n * **`1970-01-01T00:00:00Z` reads the whole log from the beginning**, which\n * is the answer to a question the API otherwise makes you guess at: with\n * no cursor at all the plain listing pages *backwards*, so a first-time\n * consumer that stores its last row stores the oldest event and never\n * advances. Omit this and the stream starts from now.\n */\n after?: string;\n /** Stop the stream. Aborting mid-event drops that event rather than half of it. */\n signal?: AbortSignal;\n}\n\n/**\n * Every event, as it happens, until you stop asking.\n *\n * ```ts\n * for await (const event of streamEvents({ apiKey })) {\n * if (event.type === 'message.received' && !event.data.from_self) {\n * await answer(event.data.message_id as string);\n * }\n * }\n * ```\n *\n * **Reconnection is this function's job and it is lossless.** The server\n * closes the connection itself after about 280 seconds so that the last\n * thing you receive is a cursor rather than a socket error; this reconnects\n * with `Last-Event-ID`, which the server prefers over `after`, so there is\n * no gap and no repeat. A network failure is retried the same way with a\n * short backoff. The loop ends when `signal` aborts and in no other case —\n * a stream that gave up quietly would be worse than one that never started.\n */\nexport async function* streamEvents(options: StreamOptions): AsyncGenerator<StreamedEvent> {\n const base = (options.baseUrl ?? 'https://pidgeon.ai/api/v1').replace(/\\/$/, '');\n let lastEventId: string | undefined;\n let backoffMs = 1_000;\n\n while (!options.signal?.aborted) {\n const url = new URL(`${base}/events/stream`);\n if (options.identityId) url.searchParams.set('identity_id', options.identityId);\n if (options.type) url.searchParams.set('type', options.type);\n if (options.after && !lastEventId) url.searchParams.set('after', options.after);\n\n let response: Response;\n\n try {\n response = await fetch(url, {\n headers: {\n authorization: `Bearer ${options.apiKey}`,\n accept: 'text/event-stream',\n ...(lastEventId ? { 'last-event-id': lastEventId } : {}),\n },\n signal: options.signal,\n });\n } catch {\n if (options.signal?.aborted) return;\n await sleep(backoffMs, options.signal);\n backoffMs = Math.min(backoffMs * 2, 30_000);\n continue;\n }\n\n /*\n * A refusal is not a blip. `401` on a revoked key and `403` on a\n * mailbox the key cannot reach will answer the same way for ever, so\n * retrying is a loop that never ends and never says why. `429` and the\n * 5xx family are temporary and are retried.\n */\n if (response.status === 401 || response.status === 403 || response.status === 404) {\n throw new Error(\n `Pidgeon refused the stream: ${response.status} ${await response.text().catch(() => '')}`.trim(),\n );\n }\n\n if (!response.ok || !response.body) {\n await sleep(backoffMs, options.signal);\n backoffMs = Math.min(backoffMs * 2, 30_000);\n continue;\n }\n\n // Connected. Anything after this is an ordinary close, not a failure.\n backoffMs = 1_000;\n\n /*\n * A connection cut mid-response is a blip like a failed connect: the\n * read throws (`TypeError: terminated` in Node), and the loop backs off\n * and reconnects from the cursor. It escaped the generator before\n * (6 November, found porting this to Python), which broke the promise\n * above that only `signal` ends the loop.\n */\n try {\n for await (const frame of frames(response.body, options.signal)) {\n /*\n * **The frame's `id:` is a cursor, not the event's id.** It is the\n * event's `created_at`, because `Last-Event-ID` is handed back in\n * place of `after` and `after` takes a timestamp — sending the event\n * id would produce a reconnect that silently restarts from the\n * beginning. The event's own id is inside `data`.\n */\n if (frame.id) lastEventId = frame.id;\n if (!frame.data) continue;\n\n /*\n * The server sends one of these before it gives up, and then closes.\n * It is not an event and must not be yielded as one — the loop\n * reconnects from the cursor, which is what it says to do.\n */\n if (frame.event === 'error') continue;\n\n let parsed: StreamedEvent;\n\n try {\n parsed = JSON.parse(frame.data) as StreamedEvent;\n } catch {\n // A frame we cannot read is one event lost, not a reason to drop the\n // connection and re-read from a cursor we have already passed.\n continue;\n }\n\n yield parsed;\n }\n } catch {\n if (options.signal?.aborted) return;\n await sleep(backoffMs, options.signal);\n backoffMs = Math.min(backoffMs * 2, 30_000);\n }\n }\n}\n\ninterface Frame {\n id?: string;\n event?: string;\n data?: string;\n}\n\n/**\n * The wire format, which is four lines and two rules.\n *\n * A frame ends at a blank line; a line starting `:` is a comment and the\n * server sends one on connect so proxies do not buffer the first event.\n * `data:` may repeat, and the pieces join with a newline — our events never\n * do, and handling it is two characters.\n */\nasync function* frames(body: ReadableStream<Uint8Array>, signal?: AbortSignal) {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (!signal?.aborted) {\n const { done, value } = await reader.read();\n if (done) return;\n\n buffer += decoder.decode(value, { stream: true });\n\n let boundary = buffer.indexOf('\\n\\n');\n\n while (boundary !== -1) {\n const block = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n boundary = buffer.indexOf('\\n\\n');\n\n const frame: Frame = {};\n const data: string[] = [];\n\n for (const line of block.split('\\n')) {\n if (line.startsWith(':')) continue;\n\n const colon = line.indexOf(':');\n if (colon === -1) continue;\n\n const field = line.slice(0, colon);\n // One optional space after the colon, per the spec.\n const value = line.slice(colon + 1).replace(/^ /, '');\n\n if (field === 'id') frame.id = value;\n else if (field === 'event') frame.event = value;\n else if (field === 'data') data.push(value);\n }\n\n if (data.length > 0) frame.data = data.join('\\n');\n if (frame.id || frame.data) yield frame;\n }\n }\n } finally {\n await reader.cancel().catch(() => undefined);\n }\n}\n\n/** Waits, and returns early if the caller gives up while we are waiting. */\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer);\n resolve();\n },\n { once: true },\n );\n });\n}\n","import { createHash } from 'node:crypto';\nimport { chmod, mkdir, readFile, readdir, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\n// post-core, the protocol's Rust core, through the same WebAssembly the server runs.\nimport { wasmBase64 } from '../../../src/lib/post/wasm/bytes';\nimport * as core from '../../../src/lib/post/wasm/post_core_wasm.js';\n\n/**\n * An operator's signing key for one domain: Ed25519, made on this machine\n * and never sent anywhere. Pidgeon holds only the public half.\n *\n * `kid` is the key's RFC 8037 JWK thumbprint, which is what Web Bot Auth\n * calls a `keyid` and what the domain's `post.json` lists, so one name\n * finds the key from an email, an HTTP request and the policy alike.\n */\n\nlet ready = false;\nfunction wasm(): typeof core {\n if (!ready) {\n core.initSync({ module: Buffer.from(wasmBase64, 'base64') });\n ready = true;\n }\n return core;\n}\n\nexport interface Identity {\n domain: string;\n kid: string;\n /** 32 bytes. */\n publicKey: Uint8Array;\n /** Ed25519 over exactly these bytes. */\n sign(message: Uint8Array): Uint8Array;\n}\n\nexport interface StoredIdentity extends Identity {\n /** The private key. Kept in the identity file, mode 0600, and nowhere else. */\n seed: Uint8Array;\n /** The key this one replaced, while receivers may still hold it. */\n previous?: { kid: string; publicKey: Uint8Array } | null;\n}\n\nexport const b64url = (bytes: Uint8Array) => Buffer.from(bytes).toString('base64url');\nexport const fromB64url = (text: string) => new Uint8Array(Buffer.from(text, 'base64url'));\n\n/** RFC 8037 §A.3. */\nexport function jwkThumbprint(publicKey: Uint8Array): string {\n return createHash('sha256')\n .update(`{\"crv\":\"Ed25519\",\"kty\":\"OKP\",\"x\":\"${b64url(publicKey)}\"}`)\n .digest('base64url');\n}\n\nexport function verifyBytes(publicKey: Uint8Array, message: Uint8Array, signature: Uint8Array) {\n try {\n return wasm().verify(publicKey, message, signature);\n } catch {\n return false;\n }\n}\n\nexport function identityFromSeed(input: { domain: string; seed: Uint8Array }): StoredIdentity {\n const seed = new Uint8Array(input.seed);\n const publicKey = wasm().publicKey(seed);\n return {\n domain: input.domain.toLowerCase(),\n kid: jwkThumbprint(publicKey),\n publicKey,\n seed,\n sign: (message) => wasm().sign(seed, message),\n };\n}\n\nexport function generateIdentity(domain: string): StoredIdentity {\n return identityFromSeed({ domain, seed: wasm().generateSeed() });\n}\n\n// --- On disk ------------------------------------------------------------------\n\n/** `$PIDGEON_ID_DIR`, else `~/.config/pidgeon/id`. One file per domain. */\nexport function identityDir(env: Record<string, string | undefined> = process.env): string {\n return (\n env.PIDGEON_ID_DIR || join(env.XDG_CONFIG_HOME || join(homedir(), '.config'), 'pidgeon', 'id')\n );\n}\n\ninterface IdentityFile {\n v: 1;\n domain: string;\n kid: string;\n seed: string;\n previous?: { kid: string; public_key: string } | null;\n}\n\nexport async function saveIdentity(identity: StoredIdentity, dir = identityDir()): Promise<string> {\n await mkdir(dir, { recursive: true, mode: 0o700 });\n const path = join(dir, `${identity.domain}.json`);\n const file: IdentityFile = {\n v: 1,\n domain: identity.domain,\n kid: identity.kid,\n seed: b64url(identity.seed),\n previous: identity.previous\n ? { kid: identity.previous.kid, public_key: b64url(identity.previous.publicKey) }\n : null,\n };\n await writeFile(path, `${JSON.stringify(file, null, 2)}\\n`, { mode: 0o600 });\n await chmod(path, 0o600);\n return path;\n}\n\n/**\n * The identity for `domain`, from `PIDGEON_ID_KEY` (`<domain>:<seed>`, for a\n * server the operator deploys to) or the identity file.\n */\nexport async function loadIdentity(\n domain: string,\n options: { dir?: string; env?: Record<string, string | undefined> } = {},\n): Promise<StoredIdentity> {\n const env = options.env ?? process.env;\n const name = domain.toLowerCase();\n const fromEnv = env.PIDGEON_ID_KEY?.split(':');\n if (fromEnv?.length === 2 && fromEnv[0]!.toLowerCase() === name) {\n return identityFromSeed({ domain: name, seed: fromB64url(fromEnv[1]!) });\n }\n\n const path = join(options.dir ?? identityDir(env), `${name}.json`);\n let file: IdentityFile;\n try {\n file = JSON.parse(await readFile(path, 'utf8')) as IdentityFile;\n } catch {\n throw new Error(\n `No identity for ${name} on this machine. Run \\`pidgeon id init ${name}\\` first.`,\n );\n }\n const identity = identityFromSeed({ domain: file.domain, seed: fromB64url(file.seed) });\n if (identity.kid !== file.kid)\n throw new Error(`${path} is damaged: its key does not match its kid.`);\n identity.previous = file.previous\n ? { kid: file.previous.kid, publicKey: fromB64url(file.previous.public_key) }\n : null;\n return identity;\n}\n\n/** The domains with an identity file here. */\nexport async function listIdentities(dir = identityDir()): Promise<string[]> {\n try {\n return (await readdir(dir))\n .filter((name) => name.endsWith('.json'))\n .map((name) => name.slice(0, -5));\n } catch {\n return [];\n }\n}\n","// Generated by scripts/post-core-wasm.sh from crates/post-core-wasm. Do not edit.\n// SPDX-License-Identifier: Apache-2.0\nexport const wasmBase64 =\n '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akEYaiAFQZgEaikAADcDACAFQfAFakEIaiAFQdEIaikAADcDACAFQfAFakEQaiAFQdkIaikAADcDACAFQYcGaiAFQcgIakEYaikAADcAACAFIAUpAIAENwPQBSAFIAUpAMkINwPwBSAFLQDICCEDQQAhAgNAIAVBkAZqIAJqQQA6AAAgAkEBaiICQSBHDQALQSAhAgNAIAVBkAZqIAJqQQA6AAAgAkEBaiICQcAARw0ACyAFQbAKakEIaiAFQfAFakEIaikDADcDACAFQbAKakEQaiAFQfAFakEQaikDADcDACAFQbAKakEXaiAFQfAFakEXaikAADcAACAFQdcKaiAFQdAFakEIaikDADcAACAFQd8KaiAFQdAFakEQaikDADcAACAFQecKaiAFQegFaikDADcAACAFIAUpA/AFNwOwCiAFIAUpA9AFNwDPCkHAASECA0AgBUEcaiACakEAOgAAIAJBAWoiAkHgAUcNAAsCQEHAABAEIgINAEEBQcAAEE8ACyACIAM6AAACQEE/RQ0AIAJBAWogBUGwCmpBP/wKAAALQcAAIQMLAkAgBEUNACAHIARBARA6CwJAIAFFDQAgBiABQQEQOgsCQAJAIAhFDQBBASEEQQAhAUEAIQMMAQsgBUHAADYC6AMgBSACNgLkAyAFIAM2AuADIAUgBUHgA2oQOEEAIQIgBSgCACEBIAUoAgQhA0EAIQQLIAAgBDYCDCAAIAI2AgggACADNgIEIAAgATYCACAFQfAKaiQAC84LAgp/JH4jAEEwayIDJAAgAyACKAIAIgStIg0gASgCACIFrSIOfiIPQpv80ZIBfkL/////AYMiEELSscwEfiABKAIEIgatIhEgDX4gAigCBCIHrSISIA5+fCITfCAQQu2n1+cBfiAPfEIdiHwiFEKb/NGSAX5C/////wGDIhVCFIYgASgCFCIIIAVqrSIWIAI1AhAiF358IAIoAhQiBSAEaq0iGCABNQIQIhl+fCACKAIMIgStIhogEX4gASgCCCIJrSIbIAIoAggiCq0iHH58IAEoAgwiC60iHSASfnwgFyAOfnwgGSANfnwiHn0gASgCHCIMIAlqrSIfIAIoAhwiCSAKaq0iIH58IAIoAiAiCiAEaq0iISABKAIYIgQgBmqtIiJ+fCABKAIgIgEgC2qtIiMgAigCGCICIAdqrSIkfnwgCq0iJSAErSImfiAMrSInIAmtIih+fCABrSIpIAKtIip+fCIrfSAVQs0CfiAPfSAdIBx+IBogG358IBcgEX58IBkgEn58IAWtIiwgCK0iLX59Ii58IBggFn58IBwgDn4gESASfnwgGyANfnwiLyAQQpbrnO8BfnwgFULSscwEfnwgFULtp9fnAX4gFHxCHYh8IhRCm/zRkgF+Qv////8BgyIPQsX6zu8BfnwgGyASfiAcIBF+fCAaIA5+fCAdIA1+fCIwIBBCxfrO7wF+fCAVQpbrnO8BfnwgD0LSscwEfnwgD0Ltp9fnAX4gFHxCHYh8Ig5Cm/zRkgF+Qv////8BgyINQpbrnO8BfnwgFULF+s7vAX4gEELNAn58IB58IA9Cluuc7wF+fCANQtKxzAR+fCANQu2n1+cBfiAOfEIdiHwiDkKb/NGSAX5C/////wGDIhVC0rHMBH58IBVC7afX5wF+IA58Qh2IfCIRQpv80ZIBfkL/////AYMiDkLNAn58ICQgFn4gE30gIiAYfnwgFyAbfiAdIBp+fCAZIBx+fCAmICx+ICogLX58fSIbfCAPQs0CfnwgDULF+s7vAX58IBVCluuc7wF+fCAOQtKxzAR+fCAOQu2n1+cBfiARfEIdiHwiEkKb/NGSAX5C/////wGDIhFCxfrO7wF+fCAiICR+IC99ICAgFn58IB8gGH58IBkgGn4gFyAdfnwgKCAtfiAmICp+fCAnICx+fH0iGnwgDULNAn58IBVCxfrO7wF+fCAOQpbrnO8BfnwgEULSscwEfnwgEULtp9fnAX4gEnxCHYh8IhxCm/zRkgF+Qv////8BgyISQpbrnO8BfnwgEEIUhiAwfSAZIBd+fCAgICJ+fCAfICR+fCAhIBZ+fCAjIBh+fCAnICp+ICggJn58ICUgLX58ICkgLH58IhZ9IBVCzQJ+fCAOQsX6zu8BfnwgEUKW65zvAX58IBJC0rHMBH58IBJC7afX5wF+IBx8Qh2IfCIYQpv80ZIBfkL/////AYMiEELSscwEfnwgEELtp9fnAX4gGHxCHYh8IhinQf////8BcTYCDCADICQgGX4gLn0gIiAXfnwgISAffnwgIyAgfnwgKSAofiAlICd+fCIcfSAPQhSGfCARQs0CfnwgEkLF+s7vAX58IBBCluuc7wF+fCAYQh2IfCIPp0H/////AXE2AhAgAyAgIBl+IB8gF358IBsgKSAlfiIYfH0gIyAhfnwgDUIUhnwgEkLNAn58IBBCxfrO7wF+fCAPQh2IfCIPp0H/////AXE2AhQgAyAjIBd+ICEgGX58IBp9IBVCFIZ8IBBCzQJ+fCAPQh2IfCIXp0H/////AXE2AhggAyAOQhSGIBZ8IBdCHYh8IhenQf////8BcTYCHCADIBFCFIYgK3wgF0IdiHwiF6dB/////wFxNgIgIAMgEkIUhiAcfCAXQh2IfCIXp0H/////AXE2AiQgAyAQQhSGIBh8IBdCHYh8IhdCHYg+AiwgAyAXp0H/////AXE2AiggACADQQxqECogA0EwaiQAC9AMAgV/G34jAEHwAGsiAiQAIAJBBGogARAgIAIgAjUCFCIHQuzzt4oDfiACKAIIIgGtIghC5+LkswF+IAIoAgQiA60iCULuyvX/AX58IAIoAgwiBK0iCkKMk/D7AH58IAIoAhAiBa0iC0KD5oXTAX58IAdC7fO3igF+fCIMfSACKAIYIgYgA2qtIg1C7sr1/wF+fCACKAIcIgMgAWqtIg5C5uKktAF+fCACKAIgIgEgBGqtIg9Ci5Pw+wJ+fCACKAIkIgQgBWqtIhBCguaF0wN+fCAErSIRQv////8BfiISIAGtIhNC/////wF+IhR8IhUgA60iFkL//z9+fCIXfSAJQv8DfkL/////AYMiGELSscwEfiAIQu3zt4oBfiAJQoPmhdMBfnwiGXwgGELtp9fnAX4gCULt87eKAX4iGnxCHYh8IhtCm/zRkgF+Qv////8BgyIcQhSGfCAKQufi5LMBfiAIQu7K9f8BfnwgC0KMk/D7AH58IAdCg+aF0wF+fCAGrSIdQv////8BfiIefSIfIBp9IA1C7PO3igN+fCAcQs0CfnwgCEKD5oXTAX4gCUKMk/D7AH58IApC7fO3igF+fCIgIBhCluuc7wF+fCAcQtKxzAR+fCAcQu2n1+cBfiAbfEIdiHwiG0Kb/NGSAX5C/////wGDIhpCxfrO7wF+fCAIQoyT8PsAfiAJQufi5LMBfnwgCkKD5oXTAX58IAtC7fO3igF+fCIhIBhCxfrO7wF+fCAcQpbrnO8BfnwgGkLSscwEfnwgGkLtp9fnAX4gG3xCHYh8IghCm/zRkgF+Qv////8BgyIJQpbrnO8BfnwgDCAYQs0CfnwgHELF+s7vAX58IBpCluuc7wF+fCAJQtKxzAR+fCAJQu2n1+cBfiAIfEIdiHwiCEKb/NGSAX5C/////wGDIhxC0rHMBH58IBxC7afX5wF+IAh8Qh2IfCIMQpv80ZIBfkL/////AYMiCELNAn58IA1CguaF0wN+IBl9IA5C7PO3igN+fCALQufi5LMBfiAKQu7K9f8BfnwgB0KMk/D7AH58IBZC/////wF+IhYgHnwiGX0iG3wgGkLNAn58IAlCxfrO7wF+fCAcQpbrnO8BfnwgCELSscwEfnwgCELtp9fnAX4gDHxCHYh8IgxCm/zRkgF+Qv////8BgyIKQsX6zu8BfnwgDUKLk/D7An4gIH0gDkKC5oXTA358IA9C7PO3igN+fCAHQufi5LMBfiALQu7K9f8BfnwgFCAZfH0iFHwgCULNAn58IBxCxfrO7wF+fCAIQpbrnO8BfnwgCkLSscwEfnwgCkLtp9fnAX4gDHxCHYh8IgxCm/zRkgF+Qv////8BgyILQpbrnO8BfnwgGEIUhiAhfSAHQu7K9f8BfnwgDULm4qS0AX58IA5Ci5Pw+wJ+fCAPQoLmhdMDfnwgEELs87eKA358IBUgHUL//z9+fCAWfCINfSAcQs0CfnwgCELF+s7vAX58IApCluuc7wF+fCALQtKxzAR+fCALQu2n1+cBfiAMfEIdiHwiDEKb/NGSAX5C/////wGDIhhC0rHMBH58IBhC7afX5wF+IAx8Qh2IfCIMp0H/////AXE2AkwgAiAHQoLmhdMDfiAffSAOQu7K9f8BfnwgD0Lm4qS0AX58IBBCi5Pw+wJ+fCASIBNC//8/fnwiDn0gGkIUhnwgCkLNAn58IAtCxfrO7wF+fCAYQpbrnO8BfnwgDEIdiHwiGqdB/////wFxNgJQIAIgD0LuyvX/AX4gB0KLk/D7An58IBsgEUL//z9+Ig98fSAQQubipLQBfnwgCUIUhnwgC0LNAn58IBhCxfrO7wF+fCAaQh2IfCIJp0H/////AXE2AlQgAiAQQu7K9f8BfiAHQubipLQBfnwgFH0gHEIUhnwgGELNAn58IAlCHYh8IgenQf////8BcTYCWCACIAhCFIYgDXwgB0IdiHwiB6dB/////wFxNgJcIAIgCkIUhiAXfCAHQh2IfCIHp0H/////AXE2AmAgAiALQhSGIA58IAdCHYh8IgenQf////8BcTYCZCACIBhCFIYgD3wgB0IdiHwiB0IdiD4CbCACIAenQf////8BcTYCaCACQShqIAJBzABqECogACACQShqEB0gAkHwAGokAAvGCgIGfwR+IwBB8AJrIgIkAAJAQcAARQ0AIAJBxABqQQBBwAD8CwALIAEgAS0AfyIDaiIEQYABOgAAIAEpA8ABIQggASkDyAEhCQJAIANB/wBzIgVFDQAgBEEBakEAIAX8CwALIAhCNogiCkI4hiAJQgqGIgsgCoQiCkKA/gODQiiGhCAKQoCA/AeDQhiGIApCgICA+A+DQgiGhIQgCUIChkKAgID4D4MgCUIOiEKAgPwHg4QgCUIeiEKA/gODIAtCOIiEhIQhCiADrSIJQjuGIAhCCoYiCyAJQgOGhCIJQoD+A4NCKIaEIAlCgID8B4NCGIYgCUKAgID4D4NCCIaEhCAIQgKGQoCAgPgPgyAIQg6IQoCA/AeDhCAIQh6IQoD+A4MgC0I4iISEhCEIIAFBgAFqIQMCQCAFQQ9LDQACQEGAAUUNACACQYQBaiABQYAB/AoAAAsgAyACQYQBakEBEANB8ABFDQAgAUEAQfAA/AsACyABIAo3A3AgASAINwN4AkBBgAFFDQAgAkGEAWogAUGAAfwKAAALIAMgAkGEAWpBARADQQAhAQNAIAJBxABqIAFqIAMgAWopAwAiCEI4hiAIQoD+A4NCKIaEIAhCgID8B4NCGIYgCEKAgID4D4NCCIaEhCAIQgiIQoCAgPgPgyAIQhiIQoCA/AeDhCAIQiiIQoD+A4MgCEI4iISEhDcAACABQQhqIgFBwABHDQALAkBBwABFIgENACACQQRqIAJBxABqQcAA/AoAAAsCQCABDQAgAkHEAGogAkEEakHAAPwKAAALQQAhBAJAIAENACACQYQBakEAQcAA/AsACyACQcQAaiEGA0AgAkGEAWogBEECdGoiBygCACEFQQAhASAGIQMDQCADLQAAIAF0IAVyIQUgA0EBaiEDIAFBCGoiAUEgRw0ACyAHIAU2AgAgBkEEaiEGIARBAWoiBEEQRw0ACyACIAIoAoQBIgFB/////wFxNgKEAiACIAIoAogBIgNBA3QgAUEddnJB/////wFxNgKIAiACIAIoAowBIgFBBnQgA0EadnJB/////wFxNgKMAiACIAIoApABIgNBCXQgAUEXdnJB/////wFxNgKQAiACIAIoApQBIgFBDHQgA0EUdnJB/////wFxNgKUAiACIAIoApgBIgNBD3QgAUERdnJB/////wFxNgKYAiACIAIoApwBIgFBEnQgA0EOdnJB/////wFxNgKcAiACIAIoAqABIgNBFXQgAUELdnJB/////wFxNgKgAiACIAIoAqQBIgVBGHQgA0EIdnJB/////wFxNgKkAiACIAIoAsABIgNBDXY2AsgCIAIgAigCqAEiAUECdkH/////AXE2AqwCIAIgAUEbdCAFQQV2ckH/////AXE2AqgCIAIgAigCrAEiBUEBdCABQR92ckH/////AXE2ArACIAIgAigCsAEiAUEEdCAFQRx2ckH/////AXE2ArQCIAIgAigCtAEiBUEHdCABQRl2ckH/////AXE2ArgCIAIgAigCuAEiAUEKdCAFQRZ2ckH/////AXE2ArwCIAIgAigCvAEiBUENdCABQRN2ckH/////AXE2AsACIAIgA0EQdCAFQRB2ckH/////AXE2AsQCIAJBzAJqIAJBhAJqQcyIwAAQCAJAQSRFIgENACACQYQCaiACQcwCakEk/AoAAAsgAkHMAmogAkGoAmpBkMXAABAIAkAgAQ0AIAJBqAJqIAJBzAJqQST8CgAACyACQcwCaiACQagCaiACQYQCahAwIAAgAkHMAmoQHSACQfACaiQAC4wKAQV/IwBBsAVrIgIkACACIAE1AAA3A1AgAiABMQAFQg6GIAExAARCBoaEIAExAAZCFoaENwNYIAIgATEACEINhiABMQAHQgWGhCABMQAJQhWGhDcDYCACIAExAAtCC4YgATEACkIDhoQgATEADEIThoQ3A2ggAiABMQAOQgqGIAExAA1CAoaEIAExAA9CEoaENwNwIAIgATUAEDcDeCACIAExABVCD4YgATEAFEIHhoQgATEAFkIXhoQ3A4ABIAIgATEAGEINhiABMQAXQgWGhCABMQAZQhWGhDcDiAEgAiABMQAbQgyGIAExABpCBIaEIAExABxCFIaENwOQASACIAExAB5CCoYgATEAHUIChoQgAS0AHyIDQRJ0rUKAgPAPg4Q3A5gBIAJB9AFqIAJB0ABqECYgAkHQAGogAkH0AWoQEiACQZwCaiACQdAAahAmAkBBKEUNACACQfACaiACQZwCakEo/AoAAAsg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DQALIANByAFqIAFBCGopAAA3AgAgA0HQAWogAUEQaikAADcCACADQdgBaiABQRhqKQAANwIAIAMgASkAADcCwAECQEHgAUUNACAAQQRqIANB4AH8CgAAC0EAIQILIAAgAjoAACADQYAEaiQAC+gEAQR/IwBBgARrIgIkAEEAIQMCQEHAAEUNACACQQhqQQBBwAD8CwALA0AgAkEIaiADaiIEQQFqIAEtAAAiBUEEdjoAACAEIAVBD3E6AAAgAUEBaiEBIANBAmoiA0HAAEcNAAtBACEBA0AgAkEIaiABaiIDIAMtAAAiBCAEQQhqIgRB8AFxazoAACADQQFqIgMgAy0AACAEwEEEdmo6AAAgAUEBaiIBQT9HDQALQQAhAQJAQShFIgMNACACQcgAakEAQSj8CwALAkAgAw0AIAJByABqQShqQcSHwABBKPwKAAALAkAgAw0AIAJBmAFqQcSHwABBKPwKAAALAkAgAw0AIAJBwAFqQQBBKPwLAAsDQAJAAkACQCABQcAARg0AIAFBAXENAQwCCyACQegBaiACQcgAakEEEC4CQEGgAUUNACACQcgAaiACQegBakGgAfwKAAALQQAhAQNAAkACQAJAIAFBwABGDQAgAUEBcQ0CIAFBAXYhAyABQcAATw0BIAJBiANqIANBwAdsQdjFwABqIAJBCGogAWotAAAQIiACQegBaiACQcgAaiACQYgDahAWIAJByABqIAJB6AFqED4MAgsCQEGgAUUNACAAIAJByABqQaAB/AoAAAsgAkGABGokAA8LIANBIEHsh8AAEDsACyABQQFqIQEMAAsLIAFBAXYhAwJAIAFBwABPDQAgAkGIA2ogA0HAB2xB2MXAAGogAkEIaiABai0AABAiIAJB6AFqIAJByABqIAJBiANqEBYgAkHIAGogAkHoAWoQPgwBCyADQSBB7IfAABA7AAsgAUEBaiEBDAALC6wEAQR/IwBB8AJrIgMkACABQShqIQQCQEEoRQ0AIANBqAFqIARBKPwKAAALQQAhBQNAIANBqAFqIAVqIgYgBigCACABIAVqKAIAajYCACAFQQRqIgVBKEcNAAsCQEEoRSIFDQAgA0HQAWogBEEo/AoAAAsgA0HQAWogARAhIANBCGogA0GoAWogAhAMIANBMGogA0HQAWogAkEoahAMIANB2ABqIAFB+ABqIAJB+ABqEAwgA0GAAWogAUHQAGogAkHQAGoQDAJAIAUNACADQfgBaiADQYABakEo/AoAAAtBACEFA0AgA0H4AWogBWoiBiAGKAIAIANBgAFqIAVqKAIAajYCACAFQQRqIgVBKEcNAAsCQEEoRQ0AIANBoAJqIANBCGpBKPwKAAALIANBoAJqIANBMGoQIUEAIQUDQCADQQhqIAVqIgYgBigCACADQTBqIAVqKAIAajYCACAFQQRqIgVBKEcNAAsCQEEoRQ0AIANByAJqIANB+AFqQSj8CgAAC0EAIQUDQCADQcgCaiAFaiIGIAYoAgAgA0HYAGogBWooAgBqNgIAIAVBBGoiBUEoRw0ACyADQfgBaiADQdgAahAhAkBBKEUiBQ0AIAAgA0GgAmpBKPwKAAALAkAgBQ0AIABBKGogA0EIakEo/AoAAAsCQCAFDQAgAEHQAGogA0HIAmpBKPwKAAALAkAgBQ0AIABB+ABqIANB+AFqQSj8CgAACyADQfACaiQAC4wEAQR/IwBBwAJrIgMkACABQShqIQQCQEEoRQ0AIANB+ABqIARBKPwKAAALQQAhBQNAIANB+ABqIAVqIgYgBigCACABIAVqKAIAajYCACAFQQRqIgVBKEcNAAsCQEEoRSIFDQAgA0GgAWogBEEo/AoAAAsgA0GgAWogARAhIAMgA0H4AGogAhAMIANBKGogA0GgAWogAkEoahAMIANB0ABqIAFB+ABqIAJB0ABqEAwgAUHQAGohAQJAIAUNACADQcgBaiABQSj8CgAAC0EAIQUDQCADQcgBaiAFaiIGIAYoAgAgASAFaigCAGo2AgAgBUEEaiIFQShHDQALAkBBKEUNACADQfABaiADQSj8CgAACyADQfABaiADQShqECFBACEFA0AgAyAFaiIGIAYoAgAgA0EoaiAFaigCAGo2AgAgBUEEaiIFQShHDQALAkBBKEUNACADQZgCaiADQcgBakEo/AoAAAtBACEFA0AgA0GYAmogBWoiBiAGKAIAIANB0ABqIAVqKAIAajYCACAFQQRqIgVBKEcNAAsgA0HIAWogA0HQAGoQIQJAQShFIgUNACAAIANB8AFqQSj8CgAACwJAIAUNACAAQShqIANBKPwKAAALAkAgBQ0AIABB0ABqIANBmAJqQSj8CgAACwJAIAUNACAAQfgAaiADQcgBakEo/AoAAAsgA0HAAmokAAv/AwIGfwF+IwBB0ABrIgEkACABQcgAakIANwMAIAFBwABqQgA3AwAgAUE4akIANwMAIAFCADcDMEEgIQIgAUEwaiEDAkACQAJAAkADQCACRQ0BIAMgAkGAgAQgAkGAgARJGyIEEABBACkDoMFCIQdBAEIANwOgwUIgAiAEayECIAMgBGohAyAHp0EBRw0ACwJAIAdCgICAgMCAAVQNACAHQiCIpxABC0EAIQIgAUEANgI4IAFCgICAgBA3AjBBAyABQTBqEDcNAiABKAIwIQQgASgCNCIFIAEoAjgQAiEDIAQgBRA2QQEhBEEAIQUMAQsgAUEYaiIDIAFBMGpBCWopAAA3AwAgAUEgaiIEIAFBMGpBEWopAAA3AwAgAUEnaiIFIAFBMGpBGGopAAA3AAAgASABKQAxNwMQIAEtADAhBkEgEAQiAkUNAiACIAY6AAAgAiABKQMQNwABIAJBCWogAykDADcAACACQRFqIAQpAwA3AAAgAkEYaiAFKQAANwAAIAFBIDYCOCABIAI2AjQgAUEgNgIwIAFBCGogAUEwahA4IAEoAgwhBSABKAIIIQJBACEDQQAhBAsgACAENgIMIAAgAzYCCCAAIAU2AgQgACACNgIAIAFB0ABqJAAPC0HQgMAAQTcgAUEQakHAgMAAQZCFwAAQOQALQQFBIBBPAAuXBAEFfyMAQYAEayIDJAAgAyACNgKkAiADIAE2AqACIAMgAjYCnAIgA0EQaiADQZwCahA4IANBnAJqIAMoAhAiBCADKAIUIgEQEwJAAkACQAJAIAMtAJwCIgUNACADQYACaiADQakCaikAADcDACADQYgCaiADQbECaikAADcDACADQY8CaiADQbgCaikAADcAACADIAMpAKECNwP4ASADLQCgAiEGQcABIQIDQCADQRhqIAJqQQA6AAAgAkEBaiICQeABRw0AC0EgIQdBIBAEIgINAUEBQSAQTwALIAMtAJ0CIQIgA0EANgKkAiADQoCAgIAQNwKcAiACIANBnAJqEDcNAiADKAKcAiEHIAMoAqACIgYgAygCpAIQAiECIAcgBhA2QYCAgIB4IQcMAQsgAiAGOgAAIAIgAykD+AE3AAEgAkEJaiADQYACaikDADcAACACQRFqIANBiAJqKQMANwAAIAJBGGogA0GPAmopAAA3AAALAkAgAUUNACAEIAFBARA6CwJAAkAgBUUNAEEBIQFBACEFQQAhBAwBCyADQSA2AqQCIAMgAjYCoAIgAyAHNgKcAiADQQhqIANBnAJqEDhBACECIAMoAgghBSADKAIMIQRBACEBCyAAIAE2AgwgACACNgIIIAAgBDYCBCAAIAU2AgAgA0GABGokAA8LQdCAwABBNyADQRhqQcCAwABBkIXAABA5AAuFBAECfyAAIAFqIQICQAJAIAAoAgQiA0EBcQ0AIANBAnFFDQEgACgCACIDIAFqIQECQCAAIANrIgBBACgC8MBCRw0AIAIoAgRBA3FBA0cNAUEAIAE2AujAQiACIAIoAgRBfnE2AgQgACABQQFyNgIEIAIgATYCAAwCCyAAIAMQHwsCQAJAAkACQCACKAIEIgNBAnENACACQQAoAvTAQkYNAiACQQAoAvDAQkYNAyACIANBeHEiAxAfIAAgAyABaiIBQQFyNgIEIAAgAWogATYCACAAQQAoAvDAQkcNAUEAIAE2AujAQg8LIAIgA0F+cTYCBCAAIAFBAXI2AgQgACABaiABNgIACwJAIAFBgAJJDQAgACABECMPCwJAAkBBACgC4MBCIgJBASABQQN2dCIDcQ0AQQAgAiADcjYC4MBCIAFB+AFxQdi+wgBqIgEhAgwBCyABQfgBcSIBQdi+wgBqIQIgAUHgvsIAaigCACEBCyACIAA2AgggASAANgIMIAAgAjYCDCAAIAE2AggPC0EAIAA2AvTAQkEAQQAoAuzAQiABaiIBNgLswEIgACABQQFyNgIEIABBACgC8MBCRw0BQQBBADYC6MBCQQBBADYC8MBCDwtBACAANgLwwEJBAEEAKALowEIgAWoiATYC6MBCIAAgAUEBcjYCBCAAIAFqIAE2AgAPCwv6AwIEfwJ+IwBBMGsiCiQAQYCAgIB4IQsCQAJAIAUNAEGAgICAeCEFDAELIAogBjYCLCAKIAU2AiggCiAGNgIkIApBGGogCkEkahA4IAooAhwhBSAKKAIYIQwLAkACQCAHDQAMAQsgCiAINgIsIAogBzYCKCAKIAg2AiQgCkEQaiAKQSRqEDggCigCFCELIAooAhAhDQsCQAJAAkAgAg0AIAtBgICAgHhGIQZBACEHDAELIAtBgICAgHhGIQYCQEIAIAH8ByIOIAP8B30iDyAPIA5WGyIOIAT8B1QNAEEBIQcMAQsCQAJAAkACQCALQYCAgIB4Rg0AQQIhB0EAIAwgBUGAgICAeEYbIghFDQQgCyAFRw0EIAkgDSAIIAUQPSIHcg0BDAMLIAlFDQIMAQsgB0UNAEECQQQgBxshBwwCC0GAgMAAIQJBBiEHDAILAkAgDkI7Vg0AQbmAwAAhAkEGIQcMAgtBAyEHCyAHQQJ0IggoAqiFQCEHIAgoAriFQCECCwJAIAcQBCIIRQ0AAkAgB0UNACAIIAIgB/wKAAALAkAgBg0AIAsgDRA2CwJAIAVBgICAgHhGDQAgBSAMEDYLIAogBzYCLCAKIAg2AiggCiAHNgIkIApBCGogCkEkahA4IAAgCikDCDcCACAKQTBqJAAPC0EBIAcQRgALvgMBAX8jAEGgBmsiAiQAIAJB0AVqIAEQEiACIAJB0AVqECYgAkHQBWogAhASIAJBqAVqIAJB0AVqECYgAkHQBWogAkGoBWoQEiACQShqIAJB0AVqECYgAkHQAGogASACQShqEAwgAkH4AGogAiACQdAAahAMIAJB0AVqIAJB+ABqEBIgAkGgAWogAkHQBWoQJiACQcgBaiACQdAAaiACQaABahAMIAJB8AFqIAJByAFqQQUQMiACQZgCaiACQfABaiACQcgBahAMIAJBwAJqIAJBmAJqQQoQMiACQegCaiACQcACaiACQZgCahAMIAJBkANqIAJB6AJqQRQQMiACQbgDaiACQZADaiACQegCahAMIAJB4ANqIAJBuANqQQoQMiACQYgEaiACQeADaiACQZgCahAMIAJBsARqIAJBiARqQTIQMiACQdgEaiACQbAEaiACQYgEahAMIAJBgAVqIAJB2ARqQeQAEDIgAkGoBWogAkGABWogAkHYBGoQDCACQdAFaiACQagFakEyEDIgACACQdAFaiACQYgEahAMAkBBKEUNACAAQShqIAJB+ABqQSj8CgAACyACQaAGaiQAC7oDAQR/IwBBwAJrIgIkACACQfABaiABEBIgAiACQfABahAmIAJB8AFqIAFBKGoiAxASIAJBKGogAkHwAWoQJiACQfABaiABQdAAahASQQAhBANAIAJB8AFqIARqIgUgBSkDAEIBhjcDACAEQQhqIgRB0ABHDQALIAJB0ABqIAJB8AFqECYCQEEoRQ0AIAJBoAFqIAFBKPwKAAALQQAhBANAIAJBoAFqIARqIgUgBSgCACADIARqKAIAajYCACAEQQRqIgRBKEcNAAsgAkHwAWogAkGgAWoQEiACQfgAaiACQfABahAmAkBBKEUNACACQcgBaiACQShqQSj8CgAAC0EAIQQDQCACQcgBaiAEaiIFIAUoAgAgAiAEaigCAGo2AgAgBEEEaiIEQShHDQALIAJBKGogAhAhIAJB+ABqIAJByAFqECEgAkHQAGogAkEoahAhAkBBKEUiBA0AIAAgAkH4AGpBKPwKAAALAkAgBA0AIABBKGogAkHIAWpBKPwKAAALAkAgBA0AIABB0ABqIAJBKGpBKPwKAAALAkAgBA0AIABB+ABqIAJB0ABqQSj8CgAACyACQcACaiQAC5UDAQd/IAAgASgCICICOgAdIAAgASgCACIDOgAAIAAgAkEQdjoAHyAAIAJBCHY6AB4gACABKAIcIgRBFXY6ABwgACAEQQ12OgAbIAAgBEEFdjoAGiAAIAEoAhgiAkESdjoAGCAAIAJBCnY6ABcgACACQQJ2OgAWIAAgASgCFCIFQQ92OgAUIAAgBUEHdjoAEyAAIAEoAhAiBkEUdjoAESAAIAZBDHY6ABAgACAGQQR2OgAPIAAgASgCDCIHQRF2OgANIAAgB0EJdjoADCAAIAdBAXY6AAsgACABKAIIIghBDnY6AAkgACAIQQZ2OgAIIAAgASgCBCIBQRN2OgAGIAAgAUELdjoABSAAIAFBA3Y6AAQgACADQRB2OgACIAAgA0EIdjoAASAAIARBA3QgAkEadnI6ABkgACACQQZ0IAVBF3ZyOgAVIAAgBUEBdCAGQRx2cjoAEiAAIAZBBHQgB0EZdnI6AA4gACAHQQd0IAhBFnZyOgAKIAAgCEECdCABQRt2cjoAByAAIAFBBXQgA0EYdnI6AAML7wIBBX9BACECAkAgAUHN/3sgAEEQIABBEEsbIgBrTw0AIABBECABQQtqQXhxIAFBC0kbIgNqQQxqEAQiAUUNACABQXhqIQICQAJAIABBf2oiBCABcQ0AIAIhAAwBCyABQXxqIgUoAgAiBkF4cSAEIAFqQQAgAGtxQXhqIgFBACAAIAEgAmtBEEsbaiIAIAJrIgFrIQQCQCAGQQNxRQ0AIAAgBCAAKAIEQQFxckECcjYCBCAAIARqIgQgBCgCBEEBcjYCBCAFIAEgBSgCAEEBcXJBAnI2AgAgAiABaiIEIAQoAgRBAXI2AgQgAiABEBkMAQsgAigCACECIAAgBDYCBCAAIAIgAWo2AgALAkAgACgCBCIBQQNxRQ0AIAFBeHEiAiADQRBqTQ0AIAAgAyABQQFxckECcjYCBCAAIANqIgEgAiADayIDQQNyNgIEIAAgAmoiAiACKAIEQQFyNgIEIAEgAxAZCyAAQQhqIQILIAILiQMBBH8gACgCDCECAkACQAJAAkAgAUGAAkkNACAAKAIYIQMCQAJAAkAgAiAARw0AIABBFEEQIAAoAhQiAhtqKAIAIgENAUEAIQIMAgsgACgCCCIBIAI2AgwgAiABNgIIDAELIABBFGogAEEQaiACGyEEA0AgBCEFIAEiAkEUaiACQRBqIAIoAhQiARshBCACQRRBECABG2ooAgAiAQ0ACyAFQQA2AgALIANFDQICQAJAIAAgACgCHEECdEHIvcIAaiIBKAIARg0AIAMoAhAgAEYNASADIAI2AhQgAg0DDAQLIAEgAjYCACACRQ0EDAILIAMgAjYCECACDQEMAgsCQCACIAAoAggiBEYNACAEIAI2AgwgAiAENgIIDwtBAEEAKALgwEJBfiABQQN2d3E2AuDAQg8LIAIgAzYCGAJAIAAoAhAiAUUNACACIAE2AhAgASACNgIYCyAAKAIUIgFFDQAgAiABNgIUIAEgAjYCGA8LDwtBAEEAKALkwEJBfiAAKAIcd3E2AuTAQgvqAgEGfyMAQSBrIgJBGGpCADcDACACQRBqQgA3AwAgAkEIakIANwMAIAJCADcDAEEAIQMDQCACIANBAnRqIgQoAgAhBSABIQZBACEHA0AgBi0AACAHdCAFciEFIAZBAWohBiAHQQhqIgdBIEcNAAsgBCAFNgIAIAFBBGohASADQQFqIgNBCEcNAAsgACACKAIcIgZBCHY2AiAgACACKAIAIgdB/////wFxNgIAIAAgBkEVdCACKAIYIgZBC3ZyQf////8BcTYCHCAAIAZBEnQgAigCFCIGQQ52ckH/////AXE2AhggACAGQQ90IAIoAhAiBkERdnJB/////wFxNgIUIAAgBkEMdCACKAIMIgZBFHZyQf////8BcTYCECAAIAZBCXQgAigCCCIGQRd2ckH/////AXE2AgwgACAGQQZ0IAIoAgQiBkEadnJB/////wFxNgIIIAAgBkEDdCAHQR12ckH/////AXE2AgQL7wIBE38jAEGAAWsiAiQAIAEoAgAhAyAAKAIAIQQgASgCBCEFIAAoAgQhBiABKAIIIQcgACgCCCEIIAEoAgwhCSAAKAIMIQogASgCECELIAAoAhAhDCABKAIUIQ0gACgCFCEOIAEoAhghDyAAKAIYIRAgASgCHCERIAAoAhwhEiABKAIgIRMgACgCICEUIAIgACgCJCABKAIka0Hw////AWqtNwN4IAIgFCATa0Hw////A2qtNwNwIAIgEiARa0Hw////AWqtNwNoIAIgECAPa0Hw////A2qtNwNgIAIgDiANa0Hw////AWqtNwNYIAIgDCALa0Hw////A2qtNwNQIAIgCiAJa0Hw////AWqtNwNIIAIgCCAHa0Hw////A2qtNwNAIAIgBiAFa0Hw////AWqtNwM4IAIgBCADa0HQ/f//A2qtNwMwIAJBCGogAkEwahAmAkBBKEUNACAAIAJBCGpBKPwKAAALIAJBgAFqJAALxwIBBn8jAEGgAmsiAyQAAkBBKEUiBA0AIANBCGpBxIfAAEEo/AoAAAsgA0EIakEoaiEFAkAgBA0AIAVBxIfAAEEo/AoAAAsgA0HYAGohBgJAIAQNACAGQQBBKPwLAAsgAsAiBEEHdSIHIARqIAdzIQhBASEEA0AgA0EIaiABIAQgCHMiAkEAIAJrcsFBf0oQSBBEIAFB+ABqIQEgBEEBaiIEQQlHDQALIAdBAXEQSCEEAkBBKEUiAQ0AIANBgAFqIAVBKPwKAAALAkAgAQ0AIANB+AFqIAZBKPwKAAALIANB+AFqECsCQCABDQAgA0GAAWpBKGogA0EIakEo/AoAAAsCQCABDQAgA0HQAWogA0H4AWpBKPwKAAALIANBCGogA0GAAWogBBBEAkBB+ABFDQAgACADQQhqQfgA/AoAAAsgA0GgAmokAAu8AgEEf0EfIQICQCABQf///wdLDQAgAUEmIAFBCHZnIgJrdkEBcSACQQF0a0E+aiECCyAAQgA3AhAgACACNgIcIAJBAnRByL3CAGohAwJAQQAoAuTAQkEBIAJ0IgRxDQAgAyAANgIAIAAgAzYCGCAAIAA2AgwgACAANgIIQQBBACgC5MBCIARyNgLkwEIPCwJAAkACQCADKAIAIgQoAgRBeHEgAUcNACAEIQIMAQsgAUEAQRkgAkEBdmsgAkEfRht0IQMDQCAEIANBHXZBBHFqIgUoAhAiAkUNAiADQQF0IQMgAiEEIAIoAgRBeHEgAUcNAAsLIAIoAggiAyAANgIMIAIgADYCCCAAQQA2AhggACACNgIMIAAgAzYCCA8LIAVBEGogADYCACAAIAQ2AhggACAANgIMIAAgADYCCAuUAgIFfwR+IwBBMGshA0EAIQQCQEGAAkUNACAAQQBBgAL8CwALAkBBKEUNACADQQhqQQBBKPwLAAsDQCADQQhqIARqIAEgBGopAAA3AwAgBEEIaiIEQSBHDQALQcAAIAJrIQVCASACrYYiCEIBiCEJIAhCf3whCiAIpyEGQgAhC0EAIQQDQCADQQhqIARBA3ZB+P///wFxaiIHKQMAIARBP3EiAa2IIQgCQCABIAVJDQAgBykDCEHAACABa62GIAiEIQgLAkACQCAIIAqDIAt8IginIgFBAXENACAEQQFqIgRBgAJHDQIMAQsgACAEaiABIAZBACAIIAlaIgcbazoAACAHrSELIAQgAmoiBEGAAkkNAQsLC5QCAQN/IwBB0AFrIgIkACACQYABaiABQdAAahAbAkBBKEUiAw0AIAJBMGogAkGAAWpBKPwKAAALIAJBgAFqQShqIQQCQCADDQAgAkHYAGogBEEo/AoAAAsgAkGAAWogAkEwakEFEDIgAkEIaiACQYABaiACQdgAahAMIAJBgAFqIAEgAkEIahAMIAQgAUEoaiACQQhqEAwgAkEwaiAEEBAgAkHYAGogAkGAAWoQECACLQBYQQFxEEghASAAIAIpADA3AAAgAEEIaiACQTBqQQhqKQAANwAAIABBEGogAkEwakEQaikAADcAACACIAItAE8gAUEHdHM6AE8gAEEYaiACQTBqQRhqKQAANwAAIAJB0AFqJAALmwIBBn4gACABKQMwIAEpAyggASkDICICQhqIfCIDQhmIfCIEp0H///8fcTYCGCAAIAEpAxAgASkDCCABKQMAIgVCGoh8IgZCGYh8IgenQf///x9xNgIIIAAgASkDOCAEQhqIfCIEp0H///8PcTYCHCAAIAEpAxggB0IaiHwiB6dB////D3E2AgwgACABKQNAIARCGYh8IgSnQf///x9xNgIgIAAgA0L///8PgyACQv///x+DIAdCGYh8IgJCGoh8PgIUIAAgAqdB////H3E2AhAgACABKQNIIARCGoh8IgKnQf///w9xNgIkIAAgAkIZiEITfiAFQv///x+DfCICQhqIIAZC////D4N8PgIEIAAgAqdB////H3E2AgAL/QEBAX8gACABKAIAIAAoAgAiA3NBACACQf8BcWsiAnEgA3M2AgAgACABKAIEIAAoAgQiA3MgAnEgA3M2AgQgACABKAIIIAAoAggiA3MgAnEgA3M2AgggACABKAIMIAAoAgwiA3MgAnEgA3M2AgwgACABKAIQIAAoAhAiA3MgAnEgA3M2AhAgACABKAIUIAAoAhQiA3MgAnEgA3M2AhQgACABKAIYIAAoAhgiA3MgAnEgA3M2AhggACABKAIcIAAoAhwiA3MgAnEgA3M2AhwgACABKAIgIAAoAiAiA3MgAnEgA3M2AiAgACABKAIkIAAoAiQiAXMgAnEgAXM2AiQLgQICA38BfiMAQRBrIgYkAEEBIQdBBCEIAkACQCAEIAVqQX9qQQAgBGtxrSADrX4iCUIgiKcNACAJpyIDQYCAgIB4IARrSw0AAkACQCABDQBBACEIIAZBDGohBQwBCyAGIAQ2AgwgASAFbCEIIAZBCGohBQsgBSAINgIAAkACQAJAAkACQCAGKAIMRQ0AAkAgBigCCCIIDQAgAw0CIAQhCAwDCyACIAggBCADEA4hCAwCCyADDQAgBCEIDAILIAMQBCEICyAIDQAgACAENgIEDAELIAAgCDYCBEEAIQcLQQghCAwBC0EAIQMLIAAgCGogAzYCACAAIAc2AgAgBkEQaiQAC/MBAQR/IwBB4ANrIgEkACABIABBAxAuAkBBKEUiAA0AIAFBoAFqQQBBKPwLAAsgAUGgAWpBKGohAgJAIAANACACQcSHwABBKPwKAAALIAFBoAFqQdAAaiEDAkAgAA0AIANBxIfAAEEo/AoAAAsCQCAADQAgAUGYAmpBAEEo/AsACyABQcACaiABIAMQDCABQegCaiABQaABaiABQdAAaiIAEAwgAUHAAmogAUHoAmoQMSEEIAFBkANqIAFBKGogAxAMIAFBuANqIAIgABAMIAQgAUGQA2ogAUG4A2oQMXEQSCEAIAFB4ANqJAAgAEH/AXFBAEcL2QEBBH8jAEEwayICJABBACEDAkBBJEUNACACQQxqQQBBJPwLAAtBACEEA0AgAkEMaiADaiABIANqKAIAIARBH3VqIANBtMXAAGooAgBrIgRB/////wFxNgIAIANBBGoiA0EkRw0AC0EAIQNBACAEQR92EEhB/wFxayEFQQAhBANAIAJBDGogA2oiASABKAIAIARBHXZqIANBtMXAAGooAgAgBXFqIgRB/////wFxNgIAIANBBGoiA0EkRw0ACwJAQSRFDQAgACACQQxqQST8CgAACyACQTBqJAAL7QEBAX8jAEGAAWsiASQAIAFB8P///wEgACgCJGutNwNQIAFB8P///wMgACgCIGutNwNIIAFB8P///wEgACgCHGutNwNAIAFB8P///wMgACgCGGutNwM4IAFB8P///wEgACgCFGutNwMwIAFB8P///wMgACgCEGutNwMoIAFB8P///wEgACgCDGutNwMgIAFB8P///wMgACgCCGutNwMYIAFB8P///wEgACgCBGutNwMQIAFB0P3//wMgACgCAGutNwMIIAFB2ABqIAFBCGoQJgJAQShFDQAgACABQdgAakEo/AoAAAsgAUGAAWokAAvOAQEEfyMAQdAAayICJAAgAUEoaiEDAkBBKEUNACACIANBKPwKAAALQQAhBANAIAIgBGoiBSAFKAIAIAEgBGooAgBqNgIAIARBBGoiBEEoRw0ACwJAQShFIgQNACACQShqIANBKPwKAAALIAJBKGogARAhAkAgBA0AIABB0ABqIAFB0ABqQSj8CgAACyAAQfgAaiABQfgAakHYtcIAEAwCQCAEDQAgACACQSj8CgAACwJAIAQNACAAQShqIAJBKGpBKPwKAAALIAJB0ABqJAALsQEBAn8jAEEgayICJAAgAS0AACEDIAJBF2ogAUEXaikAADcAACACQRFqIAFBEWopAAA3AAAgAkEJaiABQQlqKQAANwAAIAIgA0H4AXE6AAAgAiABKQABNwABIAIgAS0AH0E/cUHAAHI6AB8gACACEAkgAEE4aiABQThqKQAANwAAIABBMGogAUEwaikAADcAACAAQShqIAFBKGopAAA3AAAgACABKQAgNwAgIAJBIGokAAurAQECfyMAQcADayIDJAACQEEoRSIEDQAgA0GoAWpBKGogAUEoakEo/AoAAAsCQCAEDQAgA0GoAWpB0ABqIAFB0ABqQSj8CgAACwJAIAQNACADQagBaiABQSj8CgAACyACQX9qIQQDQCADQQhqIANBqAFqEBwgA0GoAWogA0EIahBBIARBf2oiBA0ACyADQaACaiADQagBahAcIAAgA0GgAmoQPiADQcADaiQAC5UBAQF/IwBBEGsiAyQAAkACQAJAIAIgAWoiASACTw0AQQAhAwwBCyADQQRqIAAoAgAiAiAAKAIEIAEgAkEBdCICIAEgAksbIgJBCCACQQhLGyICQQFBARAoIAMoAgRBAUcNASADKAIMIQAgAygCCCEDCyADIAAQRgALIAMoAgghASAAIAI2AgAgACABNgIEIANBEGokAAtzAQN/IwBBMGsiAyQAQQAhBAJAQSRFDQAgA0EMakEAQST8CwALQQAhBQNAIANBDGogBGogASAEaigCACAFQR12aiACIARqKAIAaiIFQf////8BcTYCACAEQQRqIgRBJEcNAAsgACADQQxqECogA0EwaiQAC2sBAn8jAEHAAGsiAiQAIAIgABAQIAJBIGogARAQQQEhAUEAIQADQCACQSBqIABqLQAAIAIgAGotAABzIgNBACADa3LAQX9KEEggAXEhASAAQQFqIgBBIEcNAAsgARBIIQAgAkHAAGokACAAC2sBAX8jAEGAAWsiAyQAIANBMGogARASIAJBf2ohASADQQhqIANBMGoQJgNAIANBMGogA0EIahASIANBCGogA0EwahAmIAFBf2oiAQ0ACwJAQShFDQAgACADQQhqQSj8CgAACyADQYABaiQAC3gBA38jAEEQayIBJAACQCAAKAIAIgIoAgQiA0EBcUUNACACKAIAIQIgASADQQF2NgIEIAEgAjYCACABQQQgACgCCCIALQAIIAAtAAkQNAALIAFBgICAgHg2AgAgASAANgIMIAFBBSAAKAIIIgAtAAggAC0ACRA0AAt3AQJ/IwBBEGsiBCQAQQBBACgCmMFCIgVBAWo2ApjBQgJAIAVBAEgNAAJAAkBBAC0AlMFCDQBBAEEAKAKQwUJBAWo2ApDBQkEAKAKcwUJBf0oNAQwCCyAEQQhqIAAgAREDAAALQQBBADoAlMFCIAJFDQAQVgALAAuLAQICfgF8IAH8ByICQjwgAkI8VhsiAkKA9SQgAkKA9SRUG7oiBCAERAAAAAAAGPVAIAQgAb0iAkIAUxtEAAAAAAAY9UAgAkL///////////8AgyIDQoCAgICAgIB4fEKAgICAgICA8P8AVBsgAkJ/fEL/////////B1QbIANQ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';\n","/* @ts-self-types=\"./post_core_wasm.d.ts\" */\n\n/**\n * A new 32-byte private key seed.\n * @returns {Uint8Array}\n */\nexport function generateSeed() {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.generateSeed(retptr);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);\n if (r3) {\n throw takeObject(r2);\n }\n var v1 = getArrayU8FromWasm0(r0, r1).slice();\n wasm.__wbindgen_export2(r0, r1 * 1, 1);\n return v1;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n}\n\n/**\n * What a receiver does with a signature before checking it\n * (`post_core::discovery::decide`): `verify`, `refuse`, or\n * `refetch-missing`, `refetch-expired`, `refetch-id`, `refetch-kid`.\n * Times are whole seconds since the epoch; `fetched_at` is absent when\n * nothing is held.\n * @param {number} now\n * @param {number | null | undefined} fetched_at\n * @param {number} max_age\n * @param {string | null | undefined} cached_id\n * @param {string | null | undefined} txt_id\n * @param {boolean} kid_known\n * @returns {string}\n */\nexport function policyDecision(now, fetched_at, max_age, cached_id, txt_id, kid_known) {\n let deferred3_0;\n let deferred3_1;\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n var ptr0 = isLikeNone(cached_id) ? 0 : passStringToWasm0(cached_id, wasm.__wbindgen_export3, wasm.__wbindgen_export4);\n var len0 = WASM_VECTOR_LEN;\n var ptr1 = isLikeNone(txt_id) ? 0 : passStringToWasm0(txt_id, wasm.__wbindgen_export3, wasm.__wbindgen_export4);\n var len1 = WASM_VECTOR_LEN;\n wasm.policyDecision(retptr, now, !isLikeNone(fetched_at), isLikeNone(fetched_at) ? 0 : fetched_at, max_age, ptr0, len0, ptr1, len1, kid_known);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n deferred3_0 = r0;\n deferred3_1 = r1;\n return getStringFromWasm0(r0, r1);\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n wasm.__wbindgen_export2(deferred3_0, deferred3_1, 1);\n }\n}\n\n/**\n * The `max_age` to cache a policy for, from the value it published\n * (`post_core::discovery::max_age`). Seconds.\n * @param {number | null} [published]\n * @returns {number}\n */\nexport function policyMaxAge(published) {\n const ret = wasm.policyMaxAge(!isLikeNone(published), isLikeNone(published) ? 0 : published);\n return ret;\n}\n\n/**\n * The 32-byte public key for a seed.\n * @param {Uint8Array} seed\n * @returns {Uint8Array}\n */\nexport function publicKey(seed) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passArray8ToWasm0(seed, wasm.__wbindgen_export3);\n const len0 = WASM_VECTOR_LEN;\n wasm.publicKey(retptr, ptr0, len0);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);\n if (r3) {\n throw takeObject(r2);\n }\n var v2 = getArrayU8FromWasm0(r0, r1).slice();\n wasm.__wbindgen_export2(r0, r1 * 1, 1);\n return v2;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n}\n\n/**\n * The 64-byte Ed25519 signature over `message` exactly as given.\n * @param {Uint8Array} seed\n * @param {Uint8Array} message\n * @returns {Uint8Array}\n */\nexport function sign(seed, message) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passArray8ToWasm0(seed, wasm.__wbindgen_export3);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passArray8ToWasm0(message, wasm.__wbindgen_export3);\n const len1 = WASM_VECTOR_LEN;\n wasm.sign(retptr, ptr0, len0, ptr1, len1);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);\n if (r3) {\n throw takeObject(r2);\n }\n var v3 = getArrayU8FromWasm0(r0, r1).slice();\n wasm.__wbindgen_export2(r0, r1 * 1, 1);\n return v3;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n}\n\n/**\n * Whether `signature` is `public_key`'s strict Ed25519 signature over `message`.\n * @param {Uint8Array} public_key\n * @param {Uint8Array} message\n * @param {Uint8Array} signature\n * @returns {boolean}\n */\nexport function verify(public_key, message, signature) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n const ptr0 = passArray8ToWasm0(public_key, wasm.__wbindgen_export3);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passArray8ToWasm0(message, wasm.__wbindgen_export3);\n const len1 = WASM_VECTOR_LEN;\n const ptr2 = passArray8ToWasm0(signature, wasm.__wbindgen_export3);\n const len2 = WASM_VECTOR_LEN;\n wasm.verify(retptr, ptr0, len0, ptr1, len1, ptr2, len2);\n var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);\n var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);\n var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);\n if (r2) {\n throw takeObject(r1);\n }\n return r0 !== 0;\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n }\n}\nfunction __wbg_get_imports() {\n const import0 = {\n __proto__: null,\n __wbg_Error_30c8987f7c2ed4e2: function(arg0, arg1) {\n const ret = Error(getStringFromWasm0(arg0, arg1));\n return addHeapObject(ret);\n },\n __wbg_getRandomValues_436a51d0629d84e1: function() { return handleError(function (arg0, arg1) {\n globalThis.crypto.getRandomValues(getArrayU8FromWasm0(arg0, arg1));\n }, arguments); },\n __wbindgen_object_drop_ref: function(arg0) {\n takeObject(arg0);\n },\n };\n return {\n __proto__: null,\n \"./post_core_wasm_bg.js\": import0,\n };\n}\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n\nfunction dropObject(idx) {\n if (idx < 1028) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction getArrayU8FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);\n}\n\nlet cachedDataViewMemory0 = null;\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return decodeText(ptr >>> 0, len);\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction getObject(idx) { return heap[idx]; }\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n wasm.__wbindgen_export(addHeapObject(e));\n }\n}\n\nlet heap = new Array(1024).fill(undefined);\nheap.push(undefined, null, true, false);\n\nlet heap_next = heap.length;\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction passArray8ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 1, 1) >>> 0;\n getUint8ArrayMemory0().set(arg, ptr / 1);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = cachedTextEncoder.encodeInto(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nconst MAX_SAFARI_DECODE_BYTES = 2146435072;\nlet numBytesDecoded = 0;\nfunction decodeText(ptr, len) {\n numBytesDecoded += len;\n if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {\n cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n cachedTextDecoder.decode();\n numBytesDecoded = len;\n }\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nconst cachedTextEncoder = new TextEncoder();\n\nif (!('encodeInto' in cachedTextEncoder)) {\n cachedTextEncoder.encodeInto = function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n };\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nlet wasmModule, wasmInstance, wasm;\nfunction __wbg_finalize_init(instance, module) {\n wasmInstance = instance;\n wasm = instance.exports;\n wasmModule = module;\n cachedDataViewMemory0 = null;\n cachedUint8ArrayMemory0 = null;\n return wasm;\n}\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (!module.ok) {\n throw new Error(`failed to fetch Wasm: ${module.status} ${module.statusText} fetching '${module.url}'`);\n }\n\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n } catch (e) {\n const validResponse = expectedResponseType(module.type);\n\n if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else { throw e; }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n } else {\n return instance;\n }\n }\n\n function expectedResponseType(type) {\n switch (type) {\n case 'basic': case 'cors': case 'default': return true;\n }\n return false;\n }\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (module !== undefined) {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n const instance = new WebAssembly.Instance(module, imports);\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (module_or_path !== undefined) {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync, __wbg_init as default };\n","import { createHash, randomBytes } from 'node:crypto';\n\nimport { type Identity, verifyBytes } from './keys';\n\n/**\n * Signing an agent's HTTP requests: RFC 9421 HTTP Message Signatures as\n * Web Bot Auth profiles them (draft-ietf-webbotauth-httpsig-protocol-01),\n * in the form Cloudflare verifies today.\n *\n * - `keyid` is the key's JWK thumbprint; `alg=\"ed25519\"`; `tag=\"web-bot-auth\"`.\n * - `Signature-Agent` names `https://post.<domain>`, which serves the key\n * directory (`/.well-known/http-message-signatures-directory`) and the\n * domain's agent cards. Sent as the bare string Cloudflare reads, not\n * the draft's dictionary, until Cloudflare reads that (both verify at\n * Pidgeon).\n * - Covered: `@method`, `@authority`, `@path`, `@query` when there is one,\n * `signature-agent`, `from` (the agent's address, the header RFC 9110\n * gives a robot's operator), `post-grant` when it carries grants, and\n * `content-digest` when there is a body.\n * So a signature holds for this request only, not for any request to\n * the host.\n * - Valid for five minutes. Cloudflare suggests a minute; an agent behind a\n * queue needs more.\n *\n * An MCP call over Streamable HTTP is an HTTP request, so `signedFetch` is\n * also how an agent signs MCP: give it to the transport as `fetch`.\n */\n\nexport const TAG = 'web-bot-auth';\nexport const SIGNATURE_SECONDS = 300;\n\nexport interface SignRequestInput {\n method: string;\n url: string;\n headers?: Record<string, string>;\n body?: string | Uint8Array | null;\n /** The agent's address, `support-agent@acme.com`: sent and covered as `From`. */\n agent?: string | null;\n /** Override the clock, for tests. Milliseconds. */\n now?: number;\n /** The signature's label. */\n label?: string;\n /** The tag. Pidgeon's issuance API uses its own, so an agent's signature is never an operator's. */\n tag?: string;\n /**\n * Grants the agent was given (compact JWS): sent as `Post-Grant`,\n * comma-separated, and covered like `From`, so the receiver sees what it\n * may do. A grant holds only for the agent it names, whoever forwards it.\n */\n grants?: string[];\n seconds?: number;\n}\n\nconst quote = (value: string) => `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n\nfunction authority(url: URL): string {\n const defaultPort =\n (url.protocol === 'https:' && url.port === '443') ||\n (url.protocol === 'http:' && url.port === '80');\n return `${url.hostname.toLowerCase()}${url.port && !defaultPort ? `:${url.port}` : ''}`;\n}\n\nfunction bytesOf(body: string | Uint8Array): Uint8Array {\n return typeof body === 'string' ? new TextEncoder().encode(body) : body;\n}\n\nexport function contentDigest(body: string | Uint8Array): string {\n return `sha-256=:${createHash('sha256').update(bytesOf(body)).digest('base64')}:`;\n}\n\n/**\n * The headers that sign this request, lower-cased: `signature-agent`,\n * `from`, `content-digest` (with a body), `signature-input`, `signature`.\n * Add them to the request as they are; change nothing they cover after.\n */\nexport async function signRequest(\n identity: Identity,\n input: SignRequestInput,\n): Promise<Record<string, string>> {\n const url = new URL(input.url);\n const label = input.label ?? 'sig1';\n const created = Math.floor((input.now ?? Date.now()) / 1000);\n const expires = created + (input.seconds ?? SIGNATURE_SECONDS);\n const agent = input.agent?.trim().toLowerCase() ?? null;\n if (agent && !agent.endsWith(`@${identity.domain}`)) {\n throw new Error(`${agent} is not an address at ${identity.domain}, whose key this is.`);\n }\n\n const added: Record<string, string> = {\n 'signature-agent': quote(`https://post.${identity.domain}`),\n ...(agent ? { from: agent } : {}),\n ...(input.grants?.length\n ? { 'post-grant': input.grants.map((jws) => jws.replace(/\\s+/g, '')).join(', ') }\n : {}),\n };\n const body = input.body === undefined || input.body === null ? null : bytesOf(input.body);\n if (body && body.length > 0) added['content-digest'] = contentDigest(body);\n\n const values: [string, string][] = [\n ['@method', input.method.toUpperCase()],\n ['@authority', authority(url)],\n ['@path', url.pathname || '/'],\n ...(url.search ? ([['@query', url.search]] as [string, string][]) : []),\n ['signature-agent', added['signature-agent']!],\n ...(added.from ? ([['from', added.from]] as [string, string][]) : []),\n ...(added['post-grant'] ? ([['post-grant', added['post-grant']]] as [string, string][]) : []),\n ...(added['content-digest']\n ? ([['content-digest', added['content-digest']]] as [string, string][])\n : []),\n ];\n\n const params =\n `(${values.map(([name]) => quote(name)).join(' ')})` +\n `;created=${created};expires=${expires};keyid=${quote(identity.kid)};alg=\"ed25519\"` +\n `;nonce=${quote(randomBytes(32).toString('base64'))};tag=${quote(input.tag ?? TAG)}`;\n const base = [\n ...values.map(([name, value]) => `${quote(name)}: ${value}`),\n `\"@signature-params\": ${params}`,\n ].join('\\n');\n\n const signature = identity.sign(new TextEncoder().encode(base));\n return {\n ...added,\n 'signature-input': `${label}=${params}`,\n signature: `${label}=:${Buffer.from(signature).toString('base64')}:`,\n };\n}\n\ntype Fetch = typeof globalThis.fetch;\n\n/**\n * `fetch`, signing every request as `agent`. For MCP:\n *\n * ```ts\n * new StreamableHTTPClientTransport(new URL(server), { fetch: signedFetch(identity, { agent }) })\n * ```\n */\nexport function signedFetch(\n identity: Identity,\n options: { agent: string; fetch?: Fetch; grants?: string[] },\n): Fetch {\n const base = options.fetch ?? globalThis.fetch;\n return async (resource, init) => {\n const request = new Request(resource, init);\n const body = request.body ? new Uint8Array(await request.arrayBuffer()) : null;\n const headers: Record<string, string> = {};\n request.headers.forEach((value, name) => {\n headers[name] = value;\n });\n const signature = await signRequest(identity, {\n method: request.method,\n url: request.url,\n headers,\n body,\n agent: options.agent,\n grants: options.grants,\n });\n const signedHeaders = new Headers(request.headers);\n for (const [name, value] of Object.entries(signature)) signedHeaders.set(name, value);\n return base(request.url, {\n method: request.method,\n headers: signedHeaders,\n body: body && body.length > 0 ? body : undefined,\n redirect: request.redirect,\n signal: request.signal,\n });\n };\n}\n\n// --- Verifying, for a receiver ---------------------------------------------------\n\nexport interface VerifyRequestInput {\n method: string;\n url: string;\n headers: Record<string, string> | Headers;\n body?: string | Uint8Array | null;\n}\n\nexport type RequestCheck =\n | {\n ok: true;\n keyid: string;\n agent: string | null;\n from: string | null;\n created: number;\n /** What the signature covers, by name: a receiver insists on the ones it needs. */\n components: string[];\n nonce: string | null;\n }\n | { ok: false; reason: string };\n\n/**\n * Checks a request signed by `signRequest` or any Web Bot Auth signer that\n * covers what it does: the components it names, inside its window, under\n * the key `key` returns. A receiver that wants who the agent is and whose\n * it is asks Pidgeon instead (`POST /v1/verify` with `request`), which looks\n * the key up and attaches the card.\n */\nexport async function verifyRequest(\n input: VerifyRequestInput,\n options: {\n key: (keyid: string, agent: string | null) => Promise<Uint8Array | null>;\n now?: number;\n tag?: string;\n },\n): Promise<RequestCheck> {\n const headers = new Map<string, string>();\n if (input.headers instanceof Headers)\n input.headers.forEach((value, name) => headers.set(name, value));\n else\n for (const [name, value] of Object.entries(input.headers))\n headers.set(name.toLowerCase(), value);\n\n const signatureInput = headers.get('signature-input') ?? '';\n const tag = options.tag ?? TAG;\n // `label=(components);params`, one per comma outside quotes and parentheses.\n const members = splitTopLevel(signatureInput);\n const member = members.find((entry) => entry.includes(`tag=${quote(tag)}`));\n if (!member) return { ok: false, reason: 'unsigned' };\n\n const eq = member.indexOf('=');\n const label = member.slice(0, eq).trim();\n const params = member.slice(eq + 1).trim();\n const list = /^\\(([^)]*)\\)/.exec(params)?.[1];\n if (list === undefined) return { ok: false, reason: 'malformed' };\n const components = [...list.matchAll(/\"([^\"]+)\"((?:;[a-z]+(?:=\"[^\"]*\")?)*)/g)].map((match) => ({\n name: match[1]!,\n params: match[2] ?? '',\n }));\n const number = (name: string) => Number(new RegExp(`;${name}=(\\\\d+)`).exec(params)?.[1] ?? NaN);\n const keyid = /;keyid=\"([^\"]+)\"/.exec(params)?.[1];\n const created = number('created');\n const expires = number('expires');\n if (!keyid || Number.isNaN(created) || Number.isNaN(expires))\n return { ok: false, reason: 'missing_parameters' };\n\n const now = Math.floor((options.now ?? Date.now()) / 1000);\n if (expires <= now) return { ok: false, reason: 'expired' };\n if (created > now + 60 || expires - created > 86_400) return { ok: false, reason: 'window' };\n\n const signature = new RegExp(`(?:^|,)\\\\s*${label}=:([^:]+):`).exec(\n headers.get('signature') ?? '',\n )?.[1];\n if (!signature) return { ok: false, reason: 'malformed' };\n\n const url = new URL(input.url);\n const value = (name: string, componentParams: string): string | null => {\n switch (name) {\n case '@method':\n return input.method.toUpperCase();\n case '@authority':\n return authority(url);\n case '@path':\n return url.pathname || '/';\n case '@query':\n return url.search || '?';\n case '@target-uri':\n return url.href;\n }\n const raw = headers.get(name)?.trim();\n if (raw === undefined) return null;\n const key = /;key=\"([^\"]+)\"/.exec(componentParams)?.[1];\n if (!key) return raw;\n return new RegExp(`(?:^|,)\\\\s*${key}=(\"[^\"]*\")`).exec(raw)?.[1] ?? null;\n };\n\n const lines: string[] = [];\n for (const component of components) {\n const found = value(component.name, component.params);\n if (found === null) return { ok: false, reason: 'missing_component' };\n lines.push(`${quote(component.name)}${component.params}: ${found}`);\n }\n lines.push(`\"@signature-params\": ${params}`);\n\n const agentRaw = headers.get('signature-agent')?.trim() ?? null;\n const agent = agentRaw ? (/\"([^\"]+)\"/.exec(agentRaw)?.[1] ?? null) : null;\n const publicKey = await options.key(keyid, agent);\n if (!publicKey) return { ok: false, reason: 'unknown_key' };\n if (\n !verifyBytes(\n publicKey,\n new TextEncoder().encode(lines.join('\\n')),\n new Uint8Array(Buffer.from(signature, 'base64')),\n )\n ) {\n return { ok: false, reason: 'bad_signature' };\n }\n\n if (components.some((component) => component.name === 'content-digest') && input.body) {\n if (headers.get('content-digest') !== contentDigest(input.body))\n return { ok: false, reason: 'body_changed' };\n }\n\n const from = components.some((component) => component.name === 'from')\n ? (headers.get('from')?.trim().toLowerCase() ?? null)\n : null;\n const nonce = /;nonce=\"([^\"]+)\"/.exec(params)?.[1] ?? null;\n return {\n ok: true,\n keyid,\n agent,\n from,\n created,\n components: components.map((component) => component.name),\n nonce,\n };\n}\n\nfunction splitTopLevel(value: string): string[] {\n const out: string[] = [];\n let depth = 0;\n let quoted = false;\n let start = 0;\n for (let i = 0; i < value.length; i++) {\n const c = value[i];\n if (c === '\"' && value[i - 1] !== '\\\\') quoted = !quoted;\n else if (!quoted && c === '(') depth++;\n else if (!quoted && c === ')') depth--;\n else if (!quoted && depth === 0 && c === ',') {\n out.push(value.slice(start, i).trim());\n start = i + 1;\n }\n }\n if (value.slice(start).trim()) out.push(value.slice(start).trim());\n return out;\n}\n","import { signRequest } from './http';\nimport { b64url, type Identity } from './keys';\n\n/**\n * Pidgeon's issuance API (`/api/id`), for an operator with no account.\n *\n * **The key is the account.** Every request is signed with the operator's\n * key — HTTP Message Signatures with the tag `pidgeon-id`, never\n * `web-bot-auth`, so a signature an agent made for somebody's API is never\n * one the issuance API accepts — and the server finds the domain from the\n * `keyid`. Nothing to sign up for and no token to leak.\n */\n\nexport const ISSUANCE_TAG = 'pidgeon-id';\nexport const DEFAULT_ID_URL = 'https://pidgeon.ai/api/id';\n\nexport interface DnsRecord {\n purpose: 'proof' | 'host';\n type: 'TXT' | 'CNAME';\n /** Relative to the domain: `_post`, `post`. */\n name: string;\n value: string;\n /** Whether it is in place now. */\n found: boolean;\n}\n\nexport interface IdDomain {\n object: 'id_domain';\n domain: string;\n status: 'pending' | 'verified' | 'lapsed';\n kid: string;\n /** `_post` proves the domain; `post` serves its keys and cards at `post.<domain>`. */\n records: DnsRecord[];\n /** One click at the DNS provider, when it offers Domain Connect. */\n setup_url: string | null;\n}\n\nexport interface AgentCardDocument {\n object: 'agent_card';\n url: string;\n jws: string;\n card: Record<string, unknown> & { address: string; exp: number };\n}\n\nexport interface IdAgent {\n object: 'id_agent';\n address: string;\n kind: 'agent' | 'service';\n on_behalf_of: string | null;\n created_at: string;\n card_url: string;\n}\n\nexport interface IdGrant {\n object: 'grant';\n id: string;\n status: string;\n agent: string;\n grantor: { type: 'organisation'; domain: string } | { type: 'person'; email: string };\n scope: { name: string; label: string; limit?: { amount: number; currency: string } };\n audience: string | null;\n subject: { type: string; id: string };\n expires_at: string;\n revoked_at: string | null;\n /** What the agent carries, while the grant is in force. */\n jws: string | null;\n /** Where the person asked answers, on the answer that asked them. */\n consent_url?: string;\n}\n\nexport class IdApiError extends Error {\n constructor(\n readonly status: number,\n readonly code: string | undefined,\n message: string,\n ) {\n super(message);\n }\n}\n\nexport class IdClient {\n constructor(\n private readonly identity: Identity,\n private readonly baseUrl: string = DEFAULT_ID_URL,\n private readonly fetcher: typeof fetch = fetch,\n ) {}\n\n private async call<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl.replace(/\\/$/, '')}${path}`;\n const text = body === undefined ? null : JSON.stringify(body);\n const headers: Record<string, string> = text ? { 'content-type': 'application/json' } : {};\n Object.assign(\n headers,\n await signRequest(this.identity, { method, url, headers, body: text, tag: ISSUANCE_TAG }),\n );\n\n const response = await this.fetcher(url, { method, headers, body: text ?? undefined });\n const json = (await response.json().catch(() => null)) as {\n data?: T;\n error?: { code?: string; message?: string };\n } | null;\n if (!response.ok || !json || json.data === undefined) {\n throw new IdApiError(\n response.status,\n json?.error?.code,\n json?.error?.message ?? `Pidgeon answered ${response.status}.`,\n );\n }\n return json.data;\n }\n\n /** Claim the domain with this key. Idempotent: a second call returns the same records. */\n claim(): Promise<IdDomain> {\n return this.call('POST', '/domains', {\n domain: this.identity.domain,\n public_key: b64url(this.identity.publicKey),\n });\n }\n\n /** Look at DNS now; `verified` once `_post` says this key's id. */\n check(): Promise<IdDomain> {\n return this.call('POST', '/domains/check', { domain: this.identity.domain });\n }\n\n issue(input: {\n name: string;\n kind?: 'agent' | 'service';\n on_behalf_of?: string;\n }): Promise<AgentCardDocument> {\n return this.call('POST', '/agents', input);\n }\n\n list(): Promise<IdAgent[]> {\n return this.call('GET', '/agents');\n }\n\n revoke(name: string): Promise<{ object: 'id_agent'; address: string; revoked: true }> {\n return this.call('DELETE', `/agents/${encodeURIComponent(name)}`);\n }\n\n /**\n * The domain grants one of its own agents, at once: what it may do, for\n * which customer, account or order, where, until when (at most 90 days).\n */\n grant(input: {\n agent: string;\n scope: { name: string; label: string; limit?: { amount: number; currency: string } };\n subject: { type: 'customer' | 'account' | 'order'; id: string };\n audience?: string;\n expires_at?: string;\n /** Ask a person instead of granting as the domain: the answer has a `consent_url` for them. */\n grantor?: { email: string };\n }): Promise<IdGrant> {\n return this.call('POST', '/grants', input);\n }\n\n /** Every token Sign in with Pidgeon issued `name`, taken back; its card and grants stand. */\n revokeSignIns(name: string): Promise<{ object: 'id_agent'; address: string; revoked: number }> {\n return this.call('DELETE', `/agents/${encodeURIComponent(name)}/sign-ins`);\n }\n\n revokeGrant(id: string): Promise<IdGrant> {\n return this.call('DELETE', `/grants/${encodeURIComponent(id)}`);\n }\n\n /**\n * Publish `next` as the domain's key, signed by the current one. `proof`\n * is `next`'s own signature over the rotation, so nobody can rotate a\n * domain onto a key they do not hold.\n */\n rotate(next: Identity): Promise<IdDomain> {\n const statement = rotationStatement(this.identity.domain, this.identity.kid, next.kid);\n return this.call('POST', '/keys', {\n public_key: b64url(next.publicKey),\n proof: b64url(next.sign(new TextEncoder().encode(statement))),\n });\n }\n}\n\n/** What a new key signs to show it is held by whoever asks for it. The server builds the same. */\nexport function rotationStatement(domain: string, from: string, to: string): string {\n return `pidgeon id rotate\\n${domain}\\n${from}\\n${to}`;\n}\n","import { randomBytes } from 'node:crypto';\n\nimport { signRequest } from './http';\nimport { b64url, generateIdentity, type Identity } from './keys';\n\n/**\n * Sign in with Pidgeon, from the agent's side: no browser, no password, no\n * person present.\n *\n * 1. **At Pidgeon**, an RFC 8693 token exchange signed with the agent's key:\n * its card as the subject token, the site's `client_id` as the audience,\n * and its grant, when it acts under one, in `Post-Grant`. Out comes an ID\n * token for that site, bound to this key.\n * 2. **At the site**, the ID token as an RFC 7523 JWT-bearer grant, signed\n * again with the same key, so a copy of the token is no use to anyone\n * else. The site answers with its own session.\n *\n * The site says where both are: `GET` on its token endpoint answers its\n * issuer and `client_id` (`@pidgeon-ai/sign-in` serves it).\n *\n * An agent whose address is in a Pidgeon account holds no signing key of its\n * own: we sign its mail. It signs in with `signInWithApiKey` instead, sending\n * an API key that can send as the address. That key goes only to the issuer\n * the agent names, never to one a site names, and the ID token is bound to a\n * key made for this one sign-in, shown to Pidgeon with a DPoP proof\n * (RFC 9449).\n */\n\n/** Pidgeon's issuer, the only one an API key is sent to unless the agent says otherwise. */\nexport const PIDGEON_ISSUER = 'https://post.pidgeon.email';\n\nexport const TOKEN_EXCHANGE = 'urn:ietf:params:oauth:grant-type:token-exchange';\nexport const JWT_BEARER = 'urn:ietf:params:oauth:grant-type:jwt-bearer';\nconst TOKEN_TYPE_JWT = 'urn:ietf:params:oauth:token-type:jwt';\n\ntype Fetch = typeof globalThis.fetch;\n\nexport interface SignInWithPidgeonInput {\n /** The agent's address, `support-agent@acme.com`. */\n agent: string;\n /** The site's token endpoint for agents, as its button or docs give it. */\n site: string;\n /** A grant the agent acts under (its JWS), when it has one for this site. */\n grant?: string;\n /** The card's compact JWS. Fetched from `post.<domain>` when not given. */\n card?: string;\n /** Where a domain's protocol host answers. Default `https://post.<domain>`; a laptop's differs. */\n postHost?: (domain: string) => string;\n /**\n * Ask for the access token as a JWT that says the agent acts for its\n * grantor (RFC 8693 §4.1: `sub` the grantor, `act` the agent), for an API\n * to read. Needs `grant`.\n */\n delegation?: boolean;\n fetch?: Fetch;\n}\n\nexport interface SiteMetadata {\n issuer: string;\n client_id: string;\n token_endpoint: string;\n}\n\nexport interface PidgeonSignIn {\n /** What the site answered: its session, and what it learned. */\n site: Record<string, unknown>;\n /** The ID token Pidgeon issued, for reading; the site checked it. */\n idToken: string;\n /** Pidgeon's userinfo token, for as long as the grant lasts and ten minutes at most. */\n accessToken: string;\n}\n\nexport class SignInError extends Error {\n constructor(\n readonly step: 'site' | 'card' | 'pidgeon',\n readonly status: number,\n readonly code: string | undefined,\n message: string,\n ) {\n super(message);\n }\n}\n\nasync function json(response: Response): Promise<Record<string, unknown>> {\n return ((await response.json().catch(() => null)) ?? {}) as Record<string, unknown>;\n}\n\nfunction form(values: Record<string, string>): string {\n return new URLSearchParams(values).toString();\n}\n\n/** The site's issuer and `client_id`, from `GET` on its token endpoint. */\nexport async function siteMetadata(site: string, fetcher: Fetch = fetch): Promise<SiteMetadata> {\n const response = await fetcher(site, { headers: { accept: 'application/json' } });\n const body = await json(response);\n if (!response.ok || typeof body.issuer !== 'string' || typeof body.client_id !== 'string') {\n throw new SignInError(\n 'site',\n response.status,\n undefined,\n `${site} does not offer Sign in with Pidgeon.`,\n );\n }\n return { issuer: body.issuer, client_id: body.client_id, token_endpoint: site };\n}\n\n/** The agent's card, from its domain's protocol host. */\nexport async function fetchCard(\n agent: string,\n fetcher: Fetch = fetch,\n postHost: (domain: string) => string = (domain) => `https://post.${domain}`,\n): Promise<string> {\n const domain = agent.split('@')[1] ?? '';\n const response = await fetcher(\n `${postHost(domain)}/.well-known/post/card?address=${encodeURIComponent(agent)}`,\n );\n const body = await json(response);\n if (!response.ok || typeof body.jws !== 'string') {\n throw new SignInError(\n 'card',\n response.status,\n undefined,\n `${agent} has no card to sign in with.`,\n );\n }\n return body.jws;\n}\n\n/** Signs in to `site` as `agent`, with its own key, in the two steps above. */\nexport function signInWithPidgeon(\n identity: Identity,\n input: SignInWithPidgeonInput,\n): Promise<PidgeonSignIn> {\n return signIn(identity, input, async ({ tokenEndpoint, exchange, headers, agent }) =>\n signRequest(identity, {\n method: 'POST',\n url: tokenEndpoint,\n headers,\n body: exchange,\n agent,\n grants: input.grant ? [input.grant] : undefined,\n }),\n );\n}\n\nexport interface SignInWithApiKeyInput extends SignInWithPidgeonInput {\n /** A key that can send as `agent`. */\n apiKey: string;\n /** The issuer the key may go to. Default `PIDGEON_ISSUER`; a site naming another is refused. */\n issuer?: string;\n}\n\n/**\n * Signs in to `site` as an address in a Pidgeon account, with an API key\n * that can send as it. The key is sent to `issuer` and nowhere else.\n */\nexport function signInWithApiKey(input: SignInWithApiKeyInput): Promise<PidgeonSignIn> {\n const agent = input.agent.trim().toLowerCase();\n const domain = agent.split('@')[1] ?? '';\n // A key for this sign-in only. It never leaves this process.\n const ephemeral = generateIdentity(domain);\n const issuer = (input.issuer ?? PIDGEON_ISSUER).replace(/\\/$/, '');\n\n return signIn(ephemeral, input, async ({ tokenEndpoint, site }) => {\n if (\n site.issuer.replace(/\\/$/, '') !== issuer ||\n new URL(tokenEndpoint).origin !== new URL(issuer).origin\n ) {\n throw new SignInError(\n 'site',\n 0,\n 'unknown_issuer',\n `${site.token_endpoint} signs in with ${site.issuer}, not ${issuer}, so your API key is not sent there.`,\n );\n }\n return {\n authorization: `Bearer ${input.apiKey}`,\n dpop: dpopProof(ephemeral, 'POST', tokenEndpoint),\n ...(input.grant ? { 'post-grant': input.grant.replace(/\\s+/g, '') } : {}),\n };\n });\n}\n\n/** RFC 9449 §4.2: a proof that this request comes from whoever holds `identity`'s key. */\nexport function dpopProof(identity: Identity, method: string, url: string): string {\n const encode = (value: unknown) => Buffer.from(JSON.stringify(value)).toString('base64url');\n const target = new URL(url);\n const header = encode({\n typ: 'dpop+jwt',\n alg: 'EdDSA',\n jwk: { kty: 'OKP', crv: 'Ed25519', x: b64url(identity.publicKey) },\n });\n const payload = encode({\n jti: randomBytes(16).toString('base64url'),\n htm: method.toUpperCase(),\n htu: `${target.origin}${target.pathname}`,\n iat: Math.floor(Date.now() / 1000),\n });\n const signature = identity.sign(new TextEncoder().encode(`${header}.${payload}`));\n return `${header}.${payload}.${b64url(signature)}`;\n}\n\ntype Authenticate = (request: {\n tokenEndpoint: string;\n exchange: string;\n headers: Record<string, string>;\n agent: string;\n site: SiteMetadata;\n}) => Promise<Record<string, string>>;\n\nasync function signIn(\n identity: Identity,\n input: SignInWithPidgeonInput,\n authenticate: Authenticate,\n): Promise<PidgeonSignIn> {\n const fetcher = input.fetch ?? fetch;\n const agent = input.agent.trim().toLowerCase();\n const site = await siteMetadata(input.site, fetcher);\n const card = input.card ?? (await fetchCard(agent, fetcher, input.postHost));\n\n // 1. Pidgeon: the card and the grant, for this site, from whoever can show they are the agent.\n const discovery = await json(\n await fetcher(`${site.issuer.replace(/\\/$/, '')}/.well-known/openid-configuration`),\n );\n const tokenEndpoint = discovery.token_endpoint;\n if (typeof tokenEndpoint !== 'string') {\n throw new SignInError('pidgeon', 0, undefined, `${site.issuer} has no token endpoint.`);\n }\n const exchange = form({\n grant_type: TOKEN_EXCHANGE,\n subject_token: card,\n subject_token_type: TOKEN_TYPE_JWT,\n audience: site.client_id,\n ...(input.delegation ? { requested_token_type: TOKEN_TYPE_JWT } : {}),\n });\n const headers = { 'content-type': 'application/x-www-form-urlencoded' };\n const issued = await fetcher(tokenEndpoint, {\n method: 'POST',\n headers: {\n ...headers,\n ...(await authenticate({ tokenEndpoint, exchange, headers, agent, site })),\n },\n body: exchange,\n });\n const tokens = await json(issued);\n if (!issued.ok || typeof tokens.id_token !== 'string') {\n throw new SignInError(\n 'pidgeon',\n issued.status,\n tokens.error as string | undefined,\n (tokens.error_description as string | undefined) ?? `Pidgeon answered ${issued.status}.`,\n );\n }\n\n // 2. The site: the ID token as a JWT-bearer grant, signed with the same key.\n const bearer = form({ grant_type: JWT_BEARER, assertion: tokens.id_token });\n const answered = await fetcher(site.token_endpoint, {\n method: 'POST',\n headers: {\n ...headers,\n ...(await signRequest(identity, {\n method: 'POST',\n url: site.token_endpoint,\n headers,\n body: bearer,\n agent,\n })),\n },\n body: bearer,\n });\n const session = await json(answered);\n if (!answered.ok) {\n throw new SignInError(\n 'site',\n answered.status,\n session.error as string | undefined,\n (session.error_description as string | undefined) ?? `The site answered ${answered.status}.`,\n );\n }\n return {\n site: session,\n idToken: tokens.id_token,\n accessToken: tokens.access_token as string,\n };\n}\n","import { DEFAULT_ID_URL, IdApiError, IdClient, type IdDomain } from './api';\nimport { signedFetch } from './http';\nimport { SignInError, signInWithPidgeon } from './sign-in';\nimport {\n generateIdentity,\n identityDir,\n listIdentities,\n loadIdentity,\n saveIdentity,\n type StoredIdentity,\n} from './keys';\n\n/**\n * `pidgeon id`: an agent identity on your own domain, no account.\n *\n * pidgeon id init acme.com key made here, domain proved over DNS\n * pidgeon id issue support-agent card live at post.acme.com\n * pidgeon id list | revoke <name> | rotate | check\n * pidgeon id grant <name> … what an agent may do, for whom, until when\n * pidgeon id sign-in <site> --as <name> Sign in with Pidgeon, as the agent\n * pidgeon id verify < message.eml ask the public verifier about a message\n * pidgeon id curl -I <url> --as <name> a request signed as the agent\n *\n * Also `npx @pidgeon-ai/id <command>`, which is this without the `id`.\n * Cards renew themselves: each is signed for a day when it is read, for as\n * long as the domain's `_post` record stands.\n */\n\nexport class UsageError extends Error {}\n\nexport interface IdRunOptions {\n /** Progress, while `init` waits for DNS. Never the answer. */\n stderr?: (line: string) => void;\n fetch?: typeof fetch;\n sleep?: (ms: number) => Promise<void>;\n /** The message for `verify` when no file is named: standard input. */\n stdin?: () => Promise<string>;\n}\n\nconst HELP = `pidgeon id — a signed identity for your agents, on your own domain. No account.\n\n init <domain> Make a key on this machine and prove the domain over DNS\n check [<domain>] Look at DNS again\n issue <name> Give <name>@<domain> a card --kind agent|service --on-behalf-of <who>\n list Agents on the domain\n revoke <name> Withdraw an agent's card now\n rotate Replace the domain's key; the old one verifies for another day\n grant <name> Grant <name> what it may do, as the domain\n --scope bookings.change --label \"manage bookings\"\n --subject customer:42 --audience delta.com --days 30\n --grantor maria@example.com ask a person instead\n revoke-grant <id> Take a grant back now\n revoke-sign-ins <name> End every token <name> signed in with; its card and grants stand\n sign-in <site> Sign in to a site as an agent --as <name> --grant <jws>\n verify [<file>] Check a message's signatures (a file, or standard input). No key\n curl [-I] <url> Send a request signed as an agent --as <name>\n\n --domain <domain> Which domain, when this machine holds more than one\n --json Print the API's answer as JSON\n --no-wait init: print the records and return\n\nKeys live in ${'$'}PIDGEON_ID_DIR (default ~/.config/pidgeon/id). They never leave this machine.`;\n\ninterface Args {\n positional: string[];\n flags: Map<string, string | true>;\n}\n\nfunction parse(argv: string[]): Args {\n const positional: string[] = [];\n const flags = new Map<string, string | true>();\n for (let i = 0; i < argv.length; i++) {\n const token = argv[i]!;\n if (!token.startsWith('--')) {\n positional.push(token);\n continue;\n }\n const [name, inline] = token.slice(2).split('=', 2) as [string, string | undefined];\n if (['json', 'no-wait', 'help'].includes(name)) flags.set(name, true);\n else {\n const value = inline ?? argv[++i];\n if (value === undefined) throw new UsageError(`--${name} needs a value.`);\n flags.set(name, value);\n }\n }\n return { positional, flags };\n}\n\nconst DOMAIN = /^(?=.{4,253}$)([a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,63}$/;\n\nfunction baseUrl(env: Record<string, string | undefined>): string {\n if (env.PIDGEON_ID_URL) return env.PIDGEON_ID_URL;\n // The main CLI's base, `…/api/v1`, names the same host.\n if (env.PIDGEON_BASE_URL) return env.PIDGEON_BASE_URL.replace(/\\/v1\\/?$/, '/id');\n return DEFAULT_ID_URL;\n}\n\nfunction describeRecords(domain: IdDomain): string[] {\n const lines = domain.records.map(\n (record) =>\n ` ${record.found ? '✓' : '·'} ${record.type.padEnd(5)} ${`${record.name}.${domain.domain}`.padEnd(28)} ${record.value}`,\n );\n return lines;\n}\n\nexport async function runId(\n argv: string[],\n env: Record<string, string | undefined> = process.env,\n options: IdRunOptions = {},\n): Promise<string> {\n const { positional, flags } = parse(argv);\n const [command, ...rest] = positional;\n if (!command || flags.has('help') || command === 'help') return HELP;\n\n const dir = identityDir(env);\n const json = flags.has('json');\n const say = options.stderr ?? (() => {});\n const sleep =\n options.sleep ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms)));\n const client = (identity: StoredIdentity) => new IdClient(identity, baseUrl(env), options.fetch);\n\n async function which(): Promise<StoredIdentity> {\n const named = flags.get('domain');\n if (typeof named === 'string') return loadIdentity(named, { dir, env });\n if (env.PIDGEON_ID_KEY) return loadIdentity(env.PIDGEON_ID_KEY.split(':')[0]!, { dir, env });\n const held = await listIdentities(dir);\n if (held.length === 1) return loadIdentity(held[0]!, { dir, env });\n if (held.length === 0)\n throw new UsageError('No domain here yet. Start with `pidgeon id init <domain>`.');\n throw new UsageError(`This machine holds ${held.join(', ')}. Say which with --domain.`);\n }\n\n try {\n switch (command) {\n case 'init': {\n const domain = rest[0]?.trim().toLowerCase().replace(/\\.$/, '');\n if (!domain || !DOMAIN.test(domain))\n throw new UsageError('Name the domain: `pidgeon id init acme.com`.');\n\n let identity: StoredIdentity;\n let made = false;\n try {\n identity = await loadIdentity(domain, { dir, env });\n } catch {\n identity = generateIdentity(domain);\n await saveIdentity(identity, dir);\n made = true;\n }\n\n let state = await client(identity).claim();\n if (json && (state.status === 'verified' || flags.has('no-wait')))\n return JSON.stringify(state, null, 2);\n\n const lines = [\n made\n ? `Made a signing key for ${domain} on this machine (${identity.kid}).`\n : `Using the key for ${domain} on this machine.`,\n ];\n if (state.status !== 'verified') {\n lines.push(\n '',\n state.setup_url\n ? `Add the records in one click: ${state.setup_url}\\n\\nOr add them by hand:`\n : 'Add these records at your DNS provider:',\n ...describeRecords(state),\n '',\n 'The first proves the domain is yours. The second serves its keys and cards at',\n `post.${domain}; without it Pidgeon still verifies your agents, and nobody else can.`,\n );\n if (flags.has('no-wait')) return [...lines, '', 'Then: pidgeon id check'].join('\\n');\n\n say(lines.join('\\n'));\n say('\\nWaiting for DNS…');\n const deadline = Date.now() + Number(flags.get('timeout') ?? 600) * 1000;\n while (state.status !== 'verified' && Date.now() < deadline) {\n await sleep(5000);\n state = await client(identity).check();\n }\n if (state.status !== 'verified') {\n return 'Not yet. DNS can take a while; run `pidgeon id check` once the record is in.';\n }\n lines.length = 0;\n }\n if (json) return JSON.stringify(state, null, 2);\n return [...lines, `${domain} is proved. Next: pidgeon id issue support-agent`]\n .join('\\n')\n .trim();\n }\n\n case 'check': {\n const identity = rest[0] ? await loadIdentity(rest[0], { dir, env }) : await which();\n const state = await client(identity).check();\n if (json) return JSON.stringify(state, null, 2);\n return [\n `${state.domain}: ${state.status === 'verified' ? 'proved' : state.status}`,\n ...describeRecords(state),\n ].join('\\n');\n }\n\n case 'issue': {\n const name = rest[0]?.trim().toLowerCase();\n if (!name) throw new UsageError('Name the agent: `pidgeon id issue support-agent`.');\n const identity = await which();\n const kind = flags.get('kind');\n if (kind !== undefined && kind !== 'agent' && kind !== 'service') {\n throw new UsageError('--kind is agent or service.');\n }\n const onBehalfOf = flags.get('on-behalf-of');\n const card = await client(identity).issue({\n name,\n ...(kind ? { kind } : {}),\n ...(typeof onBehalfOf === 'string' ? { on_behalf_of: onBehalfOf } : {}),\n });\n if (json) return JSON.stringify(card, null, 2);\n return [\n `${card.card.address} has a card: ${card.url}`,\n `Found from the address at https://post.${identity.domain}/.well-known/post/card?address=${card.card.address}`,\n 'It renews itself. Sign with it: import { loadIdentity, signEmail, signedFetch } from \"@pidgeon-ai/id\".',\n ].join('\\n');\n }\n\n case 'verify': {\n // The public verifier, which needs no key: whoever received the mail asks.\n const file = rest[0];\n const message = file\n ? await (await import('node:fs/promises')).readFile(file, 'utf8')\n : await (options.stdin ?? readStdin)();\n if (!message.trim()) {\n throw new UsageError('Give it a message: `pidgeon id verify < message.eml`.');\n }\n const response = await (options.fetch ?? fetch)(\n `${new URL(baseUrl(env)).origin}/api/v1/verify`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ message }),\n },\n );\n const answer = (await response.json()) as {\n data?: Verification;\n error?: { message?: string };\n };\n if (!response.ok || !answer.data) {\n throw new UsageError(\n answer.error?.message ?? `The verifier answered ${response.status}.`,\n );\n }\n if (json) return JSON.stringify(answer.data, null, 2);\n return describeVerification(answer.data);\n }\n\n case 'curl': {\n // `-I` as curl spells it: a HEAD request, and only the answer's head.\n const head = rest[0] === '-I';\n const target = (head ? rest[1] : rest[0])?.trim();\n if (!target) throw new UsageError('Name a URL: `pidgeon id curl -I shop.example`.');\n const url = /^https?:\\/\\//.test(target) ? target : `https://${target}`;\n const identity = await which();\n const named = flags.get('as');\n let agent: string;\n if (typeof named === 'string') {\n agent = named.includes('@') ? named : `${named}@${identity.domain}`;\n } else {\n const agents = await client(identity).list();\n if (agents.length !== 1) {\n throw new UsageError('Say which agent signs, with --as <name>.');\n }\n agent = agents[0]!.address;\n }\n\n const sent: Record<string, string> = {};\n const signed = signedFetch(identity, {\n agent,\n fetch: async (resource, init) => {\n new Headers(init?.headers).forEach((value, name) => {\n if (/^(signature|signature-input|signature-agent|from|content-digest)$/.test(name)) {\n sent[name] = value;\n }\n });\n return (options.fetch ?? fetch)(resource, init);\n },\n });\n const response = await signed(url, { method: head ? 'HEAD' : 'GET' });\n const lines = Object.entries(sent).map(\n ([name, value]) => `> ${capitalise(name)}: ${value}`,\n );\n lines.push(`< ${response.status} ${response.statusText}`.trimEnd());\n if (head) {\n response.headers.forEach((value, name) => lines.push(`< ${capitalise(name)}: ${value}`));\n return lines.join('\\n');\n }\n return [...lines, '', await response.text()].join('\\n');\n }\n\n case 'list': {\n const agents = await client(await which()).list();\n if (json) return JSON.stringify(agents, null, 2);\n if (agents.length === 0)\n return 'No agents yet. `pidgeon id issue <name>` gives one a card.';\n return agents\n .map((agent) => `${agent.address} ${agent.kind} ${agent.card_url}`)\n .join('\\n');\n }\n\n case 'revoke': {\n const name = rest[0]?.trim().toLowerCase();\n if (!name) throw new UsageError('Name the agent: `pidgeon id revoke support-agent`.');\n const revoked = await client(await which()).revoke(name);\n if (json) return JSON.stringify(revoked, null, 2);\n return `${revoked.address} has no card from now on. Copies already fetched lapse within a day.`;\n }\n\n case 'rotate': {\n const current = await which();\n const next = generateIdentity(current.domain);\n const state = await client(current).rotate(next);\n next.previous = { kid: current.kid, publicKey: current.publicKey };\n await saveIdentity(next, dir);\n if (json) return JSON.stringify(state, null, 2);\n return `${current.domain} signs with ${next.kid} now. ${current.kid} still verifies for a day.`;\n }\n\n case 'grant': {\n const name = rest[0]?.trim().toLowerCase();\n const scope = flags.get('scope');\n const label = flags.get('label');\n const subject = flags.get('subject');\n if (!name || typeof scope !== 'string' || typeof label !== 'string') {\n throw new UsageError(\n 'Name the agent and the scope: `pidgeon id grant support-agent --scope bookings.change --label \"manage bookings\" --subject customer:42`.',\n );\n }\n const [type, ...idParts] = typeof subject === 'string' ? subject.split(':') : [];\n if (!type || idParts.length === 0 || !['customer', 'account', 'order'].includes(type)) {\n throw new UsageError('--subject is customer:<id>, account:<id> or order:<id>.');\n }\n const days = flags.get('days');\n const audience = flags.get('audience');\n const grantor = flags.get('grantor');\n const grant = await client(await which()).grant({\n agent: name,\n scope: { name: scope, label },\n subject: { type: type as 'customer' | 'account' | 'order', id: idParts.join(':') },\n ...(typeof audience === 'string' ? { audience } : {}),\n ...(typeof grantor === 'string' ? { grantor: { email: grantor } } : {}),\n ...(typeof days === 'string'\n ? { expires_at: new Date(Date.now() + Number(days) * 86_400_000).toISOString() }\n : {}),\n });\n if (json) return JSON.stringify(grant, null, 2);\n if (grant.consent_url) {\n return [\n `Asked ${typeof grantor === 'string' ? grantor : 'them'} to let ${grant.agent} ${grant.scope.label} for ${grant.subject.type} ${grant.subject.id}.`,\n `Send them this link; nothing is allowed until they answer it: ${grant.consent_url}`,\n `Grant ${grant.id}. \\`pidgeon id revoke-grant ${grant.id}\\` withdraws the request.`,\n ].join('\\n');\n }\n return [\n `${grant.agent} may ${grant.scope.label} for ${grant.subject.type} ${grant.subject.id}${grant.audience ? ` at ${grant.audience}` : ''}, until ${grant.expires_at}.`,\n `Grant ${grant.id}. The agent carries it as Post-Grant; --json prints the JWS.`,\n ].join('\\n');\n }\n\n case 'revoke-grant': {\n const grantId = rest[0]?.trim();\n if (!grantId) throw new UsageError('Name the grant: `pidgeon id revoke-grant <id>`.');\n const revoked = await client(await which()).revokeGrant(grantId);\n if (json) return JSON.stringify(revoked, null, 2);\n return `Grant ${revoked.id} is revoked. The next check of it fails.`;\n }\n\n case 'revoke-sign-ins': {\n const name = rest[0]?.trim().toLowerCase();\n if (!name)\n throw new UsageError('Name the agent: `pidgeon id revoke-sign-ins support-agent`.');\n const done = await client(await which()).revokeSignIns(name);\n if (json) return JSON.stringify(done, null, 2);\n return `${done.address}: ${done.revoked} token${done.revoked === 1 ? '' : 's'} taken back. Its card and grants stand.`;\n }\n\n case 'sign-in': {\n const site = rest[0];\n const name = flags.get('as');\n if (!site || typeof name !== 'string') {\n throw new UsageError(\n 'Name the site and the agent: `pidgeon id sign-in https://site.example/api/auth/pidgeon/token --as support-agent`.',\n );\n }\n const identity = await which();\n // `issue` answers a live agent's card as it is, so this is also how the agent reads its card.\n const card = await client(identity).issue({ name: name.trim().toLowerCase() });\n const grant = flags.get('grant');\n try {\n const signedIn = await signInWithPidgeon(identity, {\n agent: card.card.address,\n site,\n card: card.jws,\n ...(typeof grant === 'string' ? { grant } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n });\n if (json) return JSON.stringify(signedIn.site, null, 2);\n return `Signed in to ${new URL(site).host} as ${card.card.address}.\\n${JSON.stringify(signedIn.site, null, 2)}`;\n } catch (error) {\n if (error instanceof SignInError) throw new Error(`${error.step}: ${error.message}`);\n throw error;\n }\n }\n\n default:\n throw new UsageError(`No such command \"${command}\".\\n\\n${HELP}`);\n }\n } catch (error) {\n if (error instanceof IdApiError) {\n throw new Error(error.code ? `${error.code}: ${error.message}` : error.message);\n }\n throw error;\n }\n}\n\n// --- verify and curl ----------------------------------------------------------\n\ninterface Verification {\n verdict: string;\n advice: string;\n sender: { address: string; on_behalf_of: string | null } | null;\n is_agent: boolean | null;\n body: 'intact' | 'changed' | 'not_checked';\n signatures: {\n declaration: { result: string; domain: string | null };\n envelope: { result: string; domain: string | null };\n };\n}\n\n/** The verifier's answer as the homepage shows it: a line a check, ✓ or ✗. */\nfunction describeVerification(v: Verification): string {\n const signer = v.signatures.envelope.domain ?? v.signatures.declaration.domain;\n const signed =\n v.signatures.envelope.result === 'pass' || v.signatures.declaration.result === 'pass';\n const broken =\n v.signatures.envelope.result === 'fail' || v.signatures.declaration.result === 'fail';\n const row = (ok: boolean | null, label: string, value: string) =>\n `${ok === null ? '·' : ok ? '✓' : '✗'} ${label.padEnd(10)} ${value}`;\n return [\n row(\n signed && !broken,\n 'signature',\n signed && !broken\n ? `valid, ${signer}`\n : broken\n ? `broken${signer ? `, ${signer}` : ''}`\n : 'none',\n ),\n row(v.is_agent, 'agent', v.sender?.address ?? 'not declared'),\n row(v.sender?.on_behalf_of ? true : null, 'acts for', v.sender?.on_behalf_of ?? 'not said'),\n row(\n v.body === 'not_checked' ? null : v.body === 'intact',\n 'body',\n v.body === 'intact'\n ? 'as it was sent'\n : v.body === 'changed'\n ? 'changed since'\n : 'not checked',\n ),\n '',\n v.advice,\n ].join('\\n');\n}\n\nfunction capitalise(name: string): string {\n return name.replace(\n /(^|-)([a-z])/g,\n (_, dash: string, letter: string) => dash + letter.toUpperCase(),\n );\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(chunk as Buffer);\n return Buffer.concat(chunks).toString('utf8');\n}\n","import { client, createConfig } from '@pidgeon-ai/sdk';\nimport * as sdk from '@pidgeon-ai/sdk';\n\nimport { runId, UsageError as IdUsageError } from '@pidgeon-ai/id';\n\nimport { COMMANDS, type Command, type Flag } from './commands.gen.js';\n\n/**\n * `pidgeon <group> <command> --flags`, for every operation the API has.\n *\n * The table is generated from `public/openapi.json` (`pnpm cli:commands`)\n * and the calls go through `@pidgeon-ai/sdk`, which is generated from the\n * same document — so a command exists here because an operation exists\n * there, and it sends what that operation takes. Nothing in this file\n * knows the name of a single endpoint.\n *\n * `prd/one-source-of-capability.md`. The Python client, the TypeScript\n * client, the MCP server and this are four readings of one description.\n */\n\nconst DEFAULT_BASE_URL = 'https://pidgeon.ai/api/v1';\n\nexport interface Parsed {\n path: Record<string, string>;\n query: Record<string, unknown>;\n body: Record<string, unknown>;\n /** By the flag's name; `run` sends each under the header's own spelling. */\n header: Record<string, unknown>;\n}\n\n/** Where `--verbose` lines go. Never stdout, which carries the answer a script parses. */\nexport interface RunOptions {\n stderr?: (line: string) => void;\n}\n\nexport class UsageError extends Error {}\n\n/**\n * The API said no. Not a `UsageError`: the command was well-formed and the\n * answer is the API's, so it exits 1 and leads with the API's `code`, which\n * is what a script or an agent branches on. A refused send used to exit 2\n * with only the sentence, which reads like a typo in the flags.\n */\nexport class ApiError extends Error {\n constructor(\n readonly status: number,\n readonly code: string | undefined,\n message: string,\n ) {\n super(code ? `${status} ${code}: ${message}` : `${status}: ${message}`);\n }\n}\n\n/** One flag's value, in the shape the API declared. */\nfunction coerce(flag: Flag, raw: string): unknown {\n if (flag.kind === 'number') {\n const value = Number(raw);\n if (Number.isNaN(value)) throw new UsageError(`--${flag.name} takes a number, not \"${raw}\".`);\n return value;\n }\n\n if (flag.kind === 'json') {\n try {\n return JSON.parse(raw);\n } catch {\n throw new UsageError(`--${flag.name} takes JSON, and that did not parse.`);\n }\n }\n\n return raw;\n}\n\n/**\n * `--flag value`, `--flag=value`, and `--flag` alone for a boolean.\n *\n * Hand-rolled rather than a parser dependency, which is worth the forty\n * lines: the flags are not known until the table is read, so a declarative\n * parser would be configured from the same loop this is.\n */\nexport function parse(command: Command, argv: string[]): Parsed {\n const byName = new Map(command.flags.map((flag) => [flag.name, flag]));\n const out: Parsed = { path: {}, query: {}, body: {}, header: {} };\n\n for (let i = 0; i < argv.length; i++) {\n const token = argv[i]!;\n\n if (!token.startsWith('--')) throw new UsageError(`Unexpected argument \"${token}\".`);\n\n /*\n * Split on the first `=` only, keeping everything after it — a subject\n * may contain one. `[\\s\\S]` rather than the `s` flag, which the root\n * tsconfig's target does not allow.\n */\n const [name, inline] = token.slice(2).split(/=([\\s\\S]*)/, 2) as [string, string | undefined];\n const flag = byName.get(name);\n\n if (!flag) {\n throw new UsageError(\n `\\`${command.group} ${command.name}\\` has no --${name}. Try \\`pidgeon ${command.group} ${command.name} --help\\`.`,\n );\n }\n\n if (flag.kind === 'boolean') {\n out[flag.where][name] = inline === undefined ? true : inline === 'true';\n continue;\n }\n\n const raw = inline ?? argv[++i];\n if (raw === undefined) throw new UsageError(`--${name} needs a value.`);\n\n if (flag.kind === 'list') {\n /* Repeatable: `--to a@b.test --to c@d.test`. */\n const existing = (out[flag.where][name] as unknown[] | undefined) ?? [];\n out[flag.where][name] = [...existing, raw];\n continue;\n }\n\n out[flag.where][name] = coerce(flag, raw);\n }\n\n const missing = command.flags\n .filter((flag) => flag.required)\n .filter((flag) => out[flag.where][flag.name] === undefined)\n .map((flag) => `--${flag.name}`);\n\n if (missing.length > 0) {\n throw new UsageError(`\\`${command.group} ${command.name}\\` needs ${missing.join(', ')}.`);\n }\n\n return out;\n}\n\nexport function help(command?: Command): string {\n if (!command) {\n const groups = [...new Set(COMMANDS.map((c) => c.group))].sort();\n return [\n 'pidgeon <group> <command> [--flags]',\n '',\n 'Groups:',\n ...groups.map((group) => {\n const names = COMMANDS.filter((c) => c.group === group).map((c) => c.name);\n return ` ${group.padEnd(14)}${names.join(', ')}`;\n }),\n '',\n 'An API key goes in PIDGEON_API_KEY. `pidgeon <group> <command> --help`',\n 'describes one command; --verbose prints what was sent, on stderr.',\n '',\n '`pidgeon id` gives agents on your own domain a signed identity, with no',\n 'account and no key: `pidgeon id help`.',\n ].join('\\n');\n }\n\n const flags = command.flags.map((flag) => {\n /*\n * The values, where there are values — `<open|reply_only|list>` rather\n * than `<string>`. They are in the contract and the generated table\n * dropped them, so help described three legal answers as \"a string\" and\n * the only way to find `reply_only` was to read `openapi.json`.\n */\n const takes = flag.choices?.length ? flag.choices.join('|') : flag.kind;\n const label = ` --${flag.name}${flag.kind === 'boolean' ? '' : ` <${takes}>`}`;\n const note = [flag.required ? 'required' : null, flag.describe].filter(Boolean).join(' — ');\n if (!note) return label;\n\n /*\n * Two spaces when the label is already past the column, rather than\n * none. `padEnd` returns the string unchanged when it is longer than the\n * width, so a long enum — `--type <human|team|application|workflow|agent>`\n * — ran straight into its own description with nothing between them.\n */\n return `${label.padEnd(34)}${label.length >= 34 ? ' ' : ''}${note}`;\n });\n\n return [\n `pidgeon ${command.group} ${command.name} [--flags]`,\n '',\n ` ${command.summary}`,\n ` ${command.method} ${command.path}`,\n '',\n ...(flags.length > 0 ? ['Flags:', ...flags] : ['Takes no flags.']),\n ].join('\\n');\n}\n\n/**\n * The headers a command sends, by their own spelling.\n *\n * **An `Idempotency-Key` is made up when none is given**, one per\n * invocation. Unlike the SDK, which makes up none (a key the caller never\n * sees protects nothing), the CLI can show it: `--verbose` prints it before\n * the call and a failure that may have sent says it, so a script retries\n * with it and the message goes out once. `docs/email.md`.\n */\nfunction headersFor(command: Command, parsed: Parsed): Record<string, string> {\n const headers: Record<string, string> = {};\n\n for (const flag of command.flags) {\n if (flag.where !== 'header' || !flag.header) continue;\n\n const given = parsed.header[flag.name];\n if (typeof given === 'string') headers[flag.header] = given;\n else if (flag.header === 'Idempotency-Key') headers[flag.header] = crypto.randomUUID();\n }\n\n return headers;\n}\n\nexport function find(group?: string, name?: string): Command | undefined {\n return COMMANDS.find((c) => c.group === group && c.name === name);\n}\n\nexport async function run(\n argv: string[],\n env: NodeJS.ProcessEnv,\n options: RunOptions = {},\n): Promise<string> {\n const verbose = argv.includes('--verbose');\n const [group, name, ...rest] = argv.filter((token) => token !== '--verbose');\n\n if (!group || group === '--help' || group === 'help') return help();\n\n /*\n * `pidgeon id` is not an API operation: it signs with the operator's own\n * key, not PIDGEON_API_KEY, and talks to the issuance API (`@pidgeon-ai/id`,\n * which is also `npx @pidgeon-ai/id`).\n */\n if (group === 'id') {\n try {\n return await runId(argv.slice(1), env, { stderr: options.stderr });\n } catch (error) {\n if (error instanceof IdUsageError) throw new UsageError(error.message);\n throw error;\n }\n }\n\n const command = find(group, name);\n\n if (!command) {\n const known = COMMANDS.filter((c) => c.group === group);\n if (known.length === 0) throw new UsageError(`No such group \"${group}\".\\n\\n${help()}`);\n\n throw new UsageError(\n `\\`${group}\\` has no \"${name ?? ''}\" command. It has: ${known.map((c) => c.name).join(', ')}.`,\n );\n }\n\n if (rest.includes('--help')) return help(command);\n\n const apiKey = env.PIDGEON_API_KEY;\n if (!apiKey) {\n throw new UsageError(\n 'PIDGEON_API_KEY is not set. Create a key at https://pidgeon.ai/app/developers/keys.',\n );\n }\n\n const parsed = parse(command, rest);\n const headers = headersFor(command, parsed);\n const idempotencyKey = headers['Idempotency-Key'];\n\n /*\n * Before the call, so a script still has the key when the call never\n * answers — which is the case the key is for.\n */\n if (verbose && idempotencyKey) options.stderr?.(`Idempotency-Key: ${idempotencyKey}`);\n\n client.setConfig(\n createConfig({\n baseUrl: env.PIDGEON_BASE_URL ?? DEFAULT_BASE_URL,\n auth: () => apiKey,\n // Ours by name, so an account made from a terminal reads as the CLI\n // rather than as the SDK it bundles (`src/lib/analytics/client.ts`).\n headers: { 'User-Agent': '@pidgeon-ai/cli' },\n }),\n );\n\n /*\n * By `operationId`, which is the SDK's exported name — §343's whole\n * point. A table of endpoint strings here would be a second place a path\n * can be spelled wrong.\n */\n const call = (sdk as unknown as Record<string, unknown>)[command.operationId];\n if (typeof call !== 'function') {\n throw new Error(`The SDK does not export \\`${command.operationId}\\`. Run \\`pnpm sdk\\`.`);\n }\n\n const retry = idempotencyKey\n ? ` It may have been sent: retry with --idempotency-key ${idempotencyKey} and it goes out at most once.`\n : '';\n\n let answer: { data?: unknown; error?: unknown; response: Response };\n\n try {\n answer = await (\n call as (options: unknown) => Promise<{ data?: unknown; error?: unknown; response: Response }>\n )({\n ...(Object.keys(parsed.path).length > 0 ? { path: parsed.path } : {}),\n ...(Object.keys(parsed.query).length > 0 ? { query: parsed.query } : {}),\n ...(Object.keys(parsed.body).length > 0 ? { body: parsed.body } : {}),\n ...(Object.keys(headers).length > 0 ? { headers } : {}),\n });\n } catch (thrown) {\n /* No answer at all: the request may or may not have arrived. */\n const reason = thrown instanceof Error ? thrown.message : 'The request failed.';\n throw new Error(`${reason}${retry ? `\\n${retry.trim()}` : ''}`);\n }\n\n const { data, error, response } = answer;\n\n if (verbose && response.headers.get('Idempotent-Replay') === 'true') {\n options.stderr?.('Idempotent-Replay: true — answered from the first send; nothing sent again.');\n }\n\n /*\n * Any status that is not a success, declared in the contract or not: the\n * client puts every one of them in `error`, so an undeclared refusal fails\n * here the same as a declared one.\n */\n if (error !== undefined) {\n const detail = (error as { error?: { message?: string; code?: string } } | undefined)?.error;\n const message =\n detail?.message ??\n (typeof error === 'string' && error ? error.slice(0, 500) : 'The request failed.');\n\n /*\n * A 5xx may have come after the send (a gateway timing out on a send\n * that finished), so it says how to retry safely. A 4xx is the API's\n * refusal and nothing went out; a retry would only be refused again.\n */\n throw new ApiError(\n response.status,\n detail?.code,\n response.status >= 500 ? message + retry : message,\n );\n }\n\n return JSON.stringify(data, null, 2);\n}\n"],"mappings":"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","names":["sleep","joinedValues","baseUrl","config","request","url","key","value","createHash","__export","ptr","wasm","publicKey","publicKey","wasm","createHash","baseUrl","json","json","sleep","client","UsageError","parse","error"]}