@pidgeon-ai/sdk 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/webhooks.ts"],"sourcesContent":["/**\n * `@pidgeon-ai/sdk` — a thin typed client for the Pidgeon email API.\n *\n * Three things and no more: typed `fetch` wrappers, one error class, and a\n * webhook verifier.\n *\n * import { Pidgeon, verifyWebhook } from '@pidgeon-ai/sdk';\n *\n * The module split follows what can be wrong on its own. `wire.ts` is the\n * shape of every response and is the single definition the application\n * checks its own DTOs against. `client.ts` is transport. `webhooks.ts` is\n * the only part with a security contract.\n */\n\nexport { Pidgeon, PidgeonError, type PidgeonOptions } from './client';\n\nexport {\n verifyWebhook,\n SIGNATURE_HEADER,\n TIMESTAMP_HEADER,\n type WebhookEnvelope,\n} from './webhooks';\n\nexport type {\n Address,\n Attachment,\n Domain,\n Event,\n Identity,\n Mailbox,\n MailboxChange,\n Member,\n Message,\n MessageActionName,\n MessageListItem,\n Page,\n ApiKey,\n AppPassword,\n Delivery,\n DnsRecord,\n RoutingRule,\n Workspace,\n Thread,\n UploadedAttachment,\n Webhook,\n} from './wire';\n","import type {\n ApiKey,\n AppPassword,\n Delivery,\n DnsRecord,\n Domain,\n Event,\n Identity,\n Mailbox,\n MailboxChange,\n Member,\n Message,\n MessageActionName,\n MessageListItem,\n Page,\n RoutingRule,\n UploadedAttachment,\n Thread,\n Webhook,\n Workspace,\n} from './wire';\n\n/**\n * The Pidgeon client.\n *\n * Deliberately thin: typed wrappers over `fetch`, one error class, and\n * nothing else. No retry policy, no queue, no caching, no ambient state —\n * those are decisions that belong to the application, and an SDK that makes\n * them for you is an SDK you eventually have to work around.\n *\n * Zero dependencies. The only runtime requirements are `fetch` and\n * `crypto.subtle`, both standard in Node 18+, Bun, Deno and every edge\n * runtime.\n */\n\nexport interface PidgeonOptions {\n apiKey: string;\n /** Defaults to the hosted API. Point this at a local dev server to test. */\n baseUrl?: string;\n /** Injected in tests. Defaults to the global. */\n fetch?: typeof globalThis.fetch;\n}\n\nexport class PidgeonError extends Error {\n readonly code: string;\n readonly status: number;\n readonly field?: string;\n readonly requestId?: string;\n\n constructor(input: {\n code: string;\n message: string;\n status: number;\n field?: string;\n requestId?: string;\n }) {\n super(input.message);\n this.name = 'PidgeonError';\n this.code = input.code;\n this.status = input.status;\n this.field = input.field;\n this.requestId = input.requestId;\n }\n}\n\nconst DEFAULT_BASE_URL = 'https://pidgeon.ai/api/v1';\n\nexport class Pidgeon {\n #apiKey: string;\n #baseUrl: string;\n #fetch: typeof globalThis.fetch;\n\n constructor(options: PidgeonOptions) {\n if (!options.apiKey) throw new Error('An API key is required.');\n\n this.#apiKey = options.apiKey;\n this.#baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '');\n this.#fetch = options.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n async #request<T>(\n method: string,\n path: string,\n options: { query?: Record<string, string | number | undefined>; body?: unknown } = {},\n ): Promise<T> {\n const url = new URL(`${this.#baseUrl}${path}`);\n\n for (const [key, value] of Object.entries(options.query ?? {})) {\n if (value !== undefined) url.searchParams.set(key, String(value));\n }\n\n const response = await this.#fetch(url, {\n method,\n headers: {\n Authorization: `Bearer ${this.#apiKey}`,\n ...(options.body ? { 'Content-Type': 'application/json' } : {}),\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n const requestId = response.headers.get('x-request-id') ?? undefined;\n const payload = (await response.json().catch(() => null)) as {\n data?: unknown;\n error?: { code: string; message: string; field?: string };\n } | null;\n\n if (!response.ok || payload?.error) {\n throw new PidgeonError({\n code: payload?.error?.code ?? 'internal',\n message: payload?.error?.message ?? `Request failed with ${response.status}.`,\n status: response.status,\n field: payload?.error?.field,\n requestId,\n });\n }\n\n return payload?.data as T;\n }\n\n // --- identities ---------------------------------------------------------\n\n identities = {\n /**\n * A page of addresses, alphabetically.\n *\n * `cursor` is the last address on the page before it, not a timestamp —\n * this is the one list that is not ordered by time, because it is read\n * by somebody looking for a particular address.\n *\n * It returned every address and no page before this, which made\n * `const { data } = await pidgeon.identities.list()` — the line in our\n * own quickstart — resolve to `undefined`.\n */\n list: (options: { limit?: number; cursor?: string } = {}) =>\n this.#requestPage<Identity>('GET', '/identities', options),\n get: (id: string) => this.#request<Identity>('GET', `/identities/${id}`),\n create: (input: {\n domain_id: string;\n local_part: string;\n display_name?: string | null;\n type?: 'human' | 'team' | 'application' | 'workflow' | 'agent';\n mode?: 'human' | 'automated' | 'hybrid';\n }) => this.#request<Identity>('POST', '/identities', { body: input }),\n update: (\n id: string,\n input: {\n display_name?: string | null;\n mode?: 'human' | 'automated' | 'hybrid';\n capabilities?: Record<string, boolean>;\n status?: 'active' | 'suspended' | 'archived';\n },\n ) => this.#request<Identity>('PATCH', `/identities/${id}`, { body: input }),\n delete: (id: string) => this.#request<{ id: string }>('DELETE', `/identities/${id}`),\n };\n\n // --- messages -----------------------------------------------------------\n\n messages = {\n get: (id: string) => this.#request<Message>('GET', `/messages/${id}`),\n listInThread: (threadId: string, options: { limit?: number } = {}) =>\n this.#requestPage<Message>('GET', '/messages', {\n thread_id: threadId,\n limit: options.limit,\n }),\n /**\n * Change one conversation: read, starred, or which folder it is in.\n *\n * Returns an `undo` you can hand to `messages.undo`.\n */\n update: (\n id: string,\n input: {\n /**\n * Readable, and **not writable with an API key**. Read state belongs\n * to a person; setting it here is refused rather than silently\n * dropped. Archive the conversation, or track what you have seen\n * with `mailboxes.changes`.\n */\n is_read?: boolean;\n is_starred?: boolean;\n folder?: 'inbox' | 'archive' | 'spam' | 'trash';\n },\n ) =>\n this.#request<{ id: string; undo: unknown[] }>('PATCH', `/messages/${id}`, { body: input }),\n\n /** One action, up to 200 conversations. */\n act: (messageIds: string[], action: MessageActionName) =>\n this.#request<{ applied: number; undo: unknown[] }>('POST', '/messages/actions', {\n body: { message_ids: messageIds, action },\n }),\n\n /**\n * Put an action back.\n *\n * Unusual for an API to have, and the argument is that software makes\n * mistakes at a speed a person does not: an agent that archived the\n * wrong forty conversations should be able to say so.\n */\n undo: (undo: unknown[]) =>\n this.#request<{ restored: number }>('POST', '/messages/undo', { body: { undo } }),\n\n /**\n * Search one mailbox, narrowed.\n *\n * Full text in `q`, and six filters beside it. Everything is optional\n * except having *something*: a filter with no words is a legitimate\n * search — \"everything unread from Marcus\" is a question — and neither\n * words nor filters is not.\n *\n * `in` is the only way to look in Trash, which a plain search skips on\n * purpose. Results say which folder each hit is in.\n */\n search: (\n identityId: string,\n options: {\n q?: string;\n /** One folder. Omit for everywhere except Trash. */\n in?: string;\n /** Substring of the sender's address or display name. */\n from?: string;\n /** Substring of any recipient. */\n to?: string;\n has_attachment?: boolean;\n is_unread?: boolean;\n is_starred?: boolean;\n limit?: number;\n } = {},\n ) =>\n this.#requestPage<MessageListItem & { folder: string }>('GET', '/messages/search', {\n identity_id: identityId,\n ...options,\n }),\n\n send: (input: {\n from: string;\n to: string | string[];\n cc?: string | string[];\n bcc?: string | string[];\n subject?: string;\n text?: string;\n /** An HTML body. `text` stays required — see the docs for why. */\n html?: string;\n /** Ids from `attachments.upload`. */\n attachment_ids?: string[];\n in_reply_to?: string | null;\n }) =>\n this.#request<{ id: string; thread_id: string; rejected: { address: string }[] }>(\n 'POST',\n '/messages',\n { body: input },\n ),\n };\n\n attachments = {\n /** A short-lived signed URL. Fetch it when you need it, don't store it. */\n downloadUrl: (id: string) =>\n this.#request<{ id: string; url: string }>('GET', `/attachments/${id}`),\n\n /**\n * Upload a file, then name its id in `messages.send`.\n *\n * An upload expires in a day: it is a file no message refers to yet, so\n * the window is long enough for a retry and short enough that a crashed\n * client does not leave its files with us.\n */\n upload: async (identityId: string, file: File | Blob, filename?: string) => {\n const form = new FormData();\n form.set('identity_id', identityId);\n form.set('file', file, filename);\n\n const response = await this.#fetch(new URL(`${this.#baseUrl}/attachments`), {\n method: 'POST',\n headers: { Authorization: `Bearer ${this.#apiKey}` },\n body: form,\n });\n\n const payload = (await response.json().catch(() => null)) as {\n data?: UploadedAttachment;\n error?: { code: string; message: string; field?: string };\n } | null;\n\n if (!response.ok || payload?.error) {\n throw new PidgeonError({\n code: payload?.error?.code ?? 'internal',\n message: payload?.error?.message ?? `Request failed with ${response.status}.`,\n status: response.status,\n field: payload?.error?.field,\n requestId: response.headers.get('x-request-id') ?? undefined,\n });\n }\n\n return payload!.data!;\n },\n };\n\n // --- mailboxes ----------------------------------------------------------\n\n mailboxes = {\n /** The folders of one address, with their counts. */\n list: (identityId: string) =>\n this.#requestPage<Mailbox>('GET', '/mailboxes', { identity_id: identityId }),\n\n /**\n * One folder, a page at a time.\n *\n * `cursor` is the `next_cursor` of the page before it and is opaque —\n * it carries the sort key and the id together, because several messages\n * can share a millisecond. Do not construct one.\n */\n list_folder: (\n folder: Mailbox['folder'],\n identityId: string,\n options: { limit?: number; cursor?: string } = {},\n ) =>\n this.#requestPage<MessageListItem>('GET', `/mailboxes/${folder}`, {\n identity_id: identityId,\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\n * archive is one event, and the row says where it went. Arrivals are in\n * it too, so this is the only thing you need to poll.\n *\n * `since` is the `sync_cursor` from a listing, or the `next_cursor` from\n * a previous call to this. It is **not** a page cursor — the two are\n * different orders and passing one for the other is refused rather than\n * guessed at.\n *\n * Throws `resync` when the cursor is older than the window in which we\n * keep the record of what was deleted. List the folders again.\n */\n changes: (identityId: string, since: string, options: { limit?: number } = {}) =>\n this.#requestPage<MailboxChange>('GET', '/mailboxes/changes', {\n identity_id: identityId,\n since,\n ...options,\n }),\n\n /**\n * Empty the trash, permanently.\n *\n * Only the trash. It takes attachments and archived originals with it and\n * there is no undo — `messages.undo` replays column values, and these\n * rows are gone.\n *\n * `messages.act(ids, 'delete_forever')` does the same to a list you name,\n * and caps at 200. This needs no ids.\n */\n empty_trash: (identityId: string) =>\n this.#request<{ folder: string; deleted: number }>(\n 'DELETE',\n `/mailboxes/trash?identity_id=${identityId}`,\n ),\n };\n\n // --- workspace ----------------------------------------------------------\n\n workspace = {\n /** Which account this key is for, and which plan sets its limits. */\n get: () => this.#request<Workspace>('GET', '/workspace'),\n /**\n * The people here, so a conversation can be assigned to one of them.\n *\n * Read-only. Inviting somebody is mail to a person and removing somebody\n * hands on their mailboxes; neither is a thing to do without a human\n * deciding it.\n */\n members: () => this.#requestPage<Member>('GET', '/workspace/members', {}),\n };\n\n // --- credentials --------------------------------------------------------\n\n /**\n * A credential per customer, minted by this one.\n *\n * `identity_ids` is required and must be a subset of what this key already\n * reaches — a key cannot delegate reach it does not have. Hand the new key\n * to the tenant it was scoped for, and revoke it when they leave.\n *\n * **Revoking takes the keys it made with it**, transitively. That is what\n * makes rotating a leaked key true: its first useful move would otherwise\n * be to mint a second one and keep it.\n */\n keys = {\n list: () => this.#request<ApiKey[]>('GET', '/api-keys'),\n /** The response carries `token`, once. Store it before you discard it. */\n create: (input: { name: string; identity_ids: string[] }) =>\n this.#request<ApiKey & { token: string }>('POST', '/api-keys', { body: input }),\n /** Revokes it and everything it minted. A key may revoke itself. */\n revoke: (id: string) => this.#request<{ id: string }>('DELETE', `/api-keys/${id}`),\n };\n\n /**\n * Working IMAP and SMTP credentials for one address.\n *\n * What lets you hand a customer a mailbox they can open in Apple Mail. The\n * address you may issue one for is an address this key can already send\n * from — the credential reads the inbox and sends as it, so issuing one is\n * handing over exactly that.\n *\n * `username` and `password` are useless apart: a password presented for the\n * wrong address is a failed login, not a successful one.\n */\n appPasswords = {\n list: (identityId: string) =>\n this.#request<AppPassword[]>('GET', `/app-passwords?identity_id=${identityId}`),\n create: (input: { identity_id: string; name: string }) =>\n this.#request<AppPassword & { username: string; password: string }>(\n 'POST',\n '/app-passwords',\n { body: input },\n ),\n revoke: (id: string) => this.#request<{ id: string }>('DELETE', `/app-passwords/${id}`),\n };\n\n // --- threads ------------------------------------------------------------\n\n threads = {\n list: (\n options: {\n identity_id?: string;\n status?: string;\n /** A person's id, or `'unassigned'` for the queue nobody has taken. */\n assignee_id?: string;\n limit?: number;\n cursor?: string;\n } = {},\n ) => this.#requestPage<Thread>('GET', '/threads', options),\n get: (id: string) => this.#request<Thread>('GET', `/threads/${id}`),\n update: (\n id: string,\n input: {\n status?: 'open' | 'waiting' | 'resolved' | 'human_review';\n owner_type?: 'human' | 'automation' | 'agent';\n /** A person's id to hand it to, or `null` to put it back in the queue. */\n assignee_id?: string | null;\n },\n ) => this.#request<Thread>('PATCH', `/threads/${id}`, { body: input }),\n /** Hand the conversation to a person. The takeover primitive, named. */\n handOff: (id: string) =>\n this.#request<Thread>('PATCH', `/threads/${id}`, {\n body: { owner_type: 'human', status: 'human_review' },\n }),\n };\n\n // --- webhooks -----------------------------------------------------------\n\n webhooks = {\n list: () => this.#request<Webhook[]>('GET', '/webhooks'),\n /** The response carries `secret`, once. Store it before you discard it. */\n create: (input: { url: string; identity_id?: string | null; event_types?: string[] }) =>\n this.#request<Webhook & { secret: string }>('POST', '/webhooks', { body: input }),\n delete: (id: string) => this.#request<{ id: string }>('DELETE', `/webhooks/${id}`),\n /**\n * Turn an endpoint off, or back on.\n *\n * We disable one ourselves after enough consecutive failures. Without\n * this you would have to delete and recreate it, which changes the\n * signing secret every receiver is verifying against.\n */\n update: (id: string, input: { status: 'active' | 'disabled' }) =>\n this.#request<Webhook>('PATCH', `/webhooks/${id}`, { body: input }),\n /** What happened to each event we tried to hand this endpoint. */\n deliveries: (webhookId: string, options: { limit?: number } = {}) =>\n this.#request<Delivery[]>(\n 'GET',\n `/deliveries?webhook_id=${webhookId}` +\n (options.limit === undefined ? '' : `&limit=${options.limit}`),\n ),\n /** Queue one up again. Not idempotent — sending twice is the point. */\n replay: (deliveryId: string) =>\n this.#request<{ id: string; status: string }>('POST', `/deliveries/${deliveryId}/replay`),\n };\n\n // --- events -------------------------------------------------------------\n\n events = {\n list: (\n options: { type?: string; identity_id?: string; limit?: number; cursor?: string } = {},\n ) => this.#requestPage<Event>('GET', '/events', options),\n get: (id: string) => this.#request<Event>('GET', `/events/${id}`),\n };\n\n /**\n * Domains, and the one step this API cannot perform for you.\n *\n * We cannot write records in somebody else's zone. What we can do is make\n * the human step **delegable**: `create` hands back the records alongside\n * the domain, so you show them to your own customer in your own interface\n * and never send anybody to a Pidgeon screen. Then poll `verify`, or\n * subscribe to `domain.verified` and do not poll at all.\n *\n * `dns_complete` is not a detail: the DKIM records come from what the mail\n * provider issued, so a list returned before provisioning finished looks\n * complete and is missing three CNAMEs. Publishing that gives you a domain\n * that verifies and cannot sign mail.\n */\n domains = {\n list: () => this.#request<Domain[]>('GET', '/domains'),\n get: (id: string) =>\n this.#request<Domain & { dns_records: DnsRecord[]; dns_complete: boolean }>(\n 'GET',\n `/domains/${id}`,\n ),\n create: (input: { domain: string }) =>\n this.#request<Domain & { dns_records: DnsRecord[]; dns_complete: boolean }>(\n 'POST',\n '/domains',\n { body: input },\n ),\n /** Idempotent and safe to poll. Calling it on a verified domain re-checks. */\n verify: (id: string) =>\n this.#request<{\n verified: boolean;\n mail_configured: boolean;\n message: string;\n dns_records: DnsRecord[];\n dns_complete: boolean;\n }>('POST', `/domains/${id}/verify`),\n /** Takes its addresses, their mail, their rules and their webhooks with it. */\n delete: (id: string) => this.#request<{ id: string }>('DELETE', `/domains/${id}`),\n /**\n * The catch-all switch — the one thing about a domain that can change.\n *\n * Catch-all is two gates: this, and a `catch_all` routing rule saying\n * where the mail goes. Turning this on without the rule does nothing, so\n * that turning it off later does not throw away where the mail was going.\n */\n update: (id: string, input: { catch_all_enabled: boolean }) =>\n this.#request<Domain>('PATCH', `/domains/${id}`, { body: input }),\n };\n\n // --- routing ------------------------------------------------------------\n\n /**\n * Where mail to an address goes.\n *\n * The piece that makes per-customer addresses work without a person in the\n * loop: `acme@yourdomain.com` routed into one inbox you already have, or\n * into a webhook with no inbox at all. An address always beats a rule, so a\n * rule never shadows a real address — creating one that would is refused.\n *\n * The destination must be an address you could already send from, because\n * routing an address to a mailbox also lets that mailbox send as it.\n */\n routing = {\n list: (options: { domain_id?: string } = {}) =>\n this.#request<RoutingRule[]>(\n 'GET',\n options.domain_id ? `/routing-rules?domain_id=${options.domain_id}` : '/routing-rules',\n ),\n create: (\n input:\n | {\n match_type: 'address';\n local_part: string;\n destination_identity_id?: string;\n destination_webhook_id?: string;\n }\n | {\n match_type: 'catch_all';\n domain_id: string;\n destination_identity_id?: string;\n destination_webhook_id?: string;\n },\n ) => this.#request<RoutingRule>('POST', '/routing-rules', { body: input }),\n /** Stop a rule firing without forgetting where it pointed. */\n update: (id: string, input: { status: 'active' | 'disabled' }) =>\n this.#request<RoutingRule>('PATCH', `/routing-rules/${id}`, { body: input }),\n delete: (id: string) => this.#request<{ id: string }>('DELETE', `/routing-rules/${id}`),\n };\n\n async #requestPage<T>(\n method: string,\n path: string,\n // Booleans are here for the search filters, which are flags on the wire.\n // `String(false)` is `\"false\"`, which is what the API's schema reads.\n query: Record<string, string | number | boolean | undefined>,\n ): Promise<Page<T>> {\n const url = new URL(`${this.#baseUrl}${path}`);\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) url.searchParams.set(key, String(value));\n }\n\n const response = await this.#fetch(url, {\n method,\n headers: { Authorization: `Bearer ${this.#apiKey}` },\n });\n\n const payload = (await response.json().catch(() => null)) as\n (Page<T> & { error?: { code: string; message: string; field?: string } }) | null;\n\n if (!response.ok || payload?.error) {\n throw new PidgeonError({\n code: payload?.error?.code ?? 'internal',\n message: payload?.error?.message ?? `Request failed with ${response.status}.`,\n status: response.status,\n field: payload?.error?.field,\n requestId: response.headers.get('x-request-id') ?? undefined,\n });\n }\n\n return {\n data: payload?.data ?? [],\n has_more: payload?.has_more ?? false,\n next_cursor: payload?.next_cursor ?? null,\n };\n }\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 const get = (name: string): string | undefined =>\n input.headers instanceof Headers\n ? (input.headers.get(name) ?? undefined)\n : (input.headers[name] ?? input.headers[name.toLowerCase()]);\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"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/generated/core/bodySerializer.gen.ts","../src/generated/core/serverSentEvents.gen.ts","../src/generated/core/pathSerializer.gen.ts","../src/generated/core/utils.gen.ts","../src/generated/core/auth.gen.ts","../src/generated/client/utils.gen.ts","../src/generated/client/client.gen.ts","../src/generated/client.gen.ts","../src/generated/sdk.gen.ts","../src/webhooks.ts"],"sourcesContent":["/**\n * `@pidgeon-ai/sdk` — a typed client for the Pidgeon email API.\n *\n * import { client, messagesSend, verifyWebhook } from '@pidgeon-ai/sdk';\n *\n * client.setConfig({ baseUrl: 'https://pidgeon.ai/api/v1', auth: () => key });\n * await messagesSend({ body: { from: 'hi@yours.test', to: ['a@b.test'] } });\n *\n * **Everything above `verifyWebhook` is generated** from\n * `public/openapi.json`, which is itself generated from the Zod schemas the\n * routes validate with and checked against real routes by\n * `tests/integration/api-contract.test.ts`. Adding an endpoint means editing\n * those schemas; this package is wrong until `pnpm sdk` regenerates it, and\n * `pnpm sdk:check` fails the build while it is.\n * `prd/one-source-of-capability.md` has the chain.\n *\n * **`messagesSend` rather than `messages.send`**, and the stutter is\n * deliberate: `openapi-python-client` builds `messages/messages_send.py`\n * from the same `operationId` and offers no way to rename it, so a prettier\n * TypeScript surface would cost the property that the two clients name every\n * operation the same thing. §343.\n *\n * `webhooks.ts` is the exception and always will be. HMAC over\n * `timestamp.body` is a security contract, not an endpoint; OpenAPI has\n * nothing to say about it, and a generator cannot produce it.\n */\n\nexport * from './generated';\n\n/*\n * The client itself, which the generated index does not export.\n *\n * Without it there is no way to set a base URL or an API key, so every\n * function in the package would call `https://pidgeon.ai/api/v1`\n * unauthenticated. Re-exported here rather than patched into the generated\n * file, because that file is overwritten on every `pnpm sdk`.\n */\nexport { client, type CreateClientConfig } from './generated/client.gen';\nexport { createClient, createConfig } from './generated/client';\n\nexport {\n verifyWebhook,\n SIGNATURE_HEADER,\n TIMESTAMP_HEADER,\n type WebhookEnvelope,\n} from './webhooks';\n","// 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","// This file is auto-generated by @hey-api/openapi-ts\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 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 TDataShape,\n} from './client';\nimport { client } from './client.gen';\nimport type {\n AgentAttachHumanData,\n AgentAttachHumanErrors,\n AgentAttachHumanResponses,\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 AttachmentsDownloadUrlData,\n AttachmentsDownloadUrlErrors,\n AttachmentsDownloadUrlResponses,\n AttachmentsUploadData,\n AttachmentsUploadErrors,\n AttachmentsUploadResponses,\n CalendarCreateEventData,\n CalendarCreateEventErrors,\n CalendarCreateEventResponses,\n CalendarDeleteEventData,\n CalendarDeleteEventErrors,\n CalendarDeleteEventResponses,\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 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 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 IdentitiesAccessCreateData,\n IdentitiesAccessCreateErrors,\n IdentitiesAccessCreateResponses,\n IdentitiesAccessDeleteData,\n IdentitiesAccessDeleteErrors,\n IdentitiesAccessDeleteResponses,\n IdentitiesAccessGetData,\n IdentitiesAccessGetErrors,\n IdentitiesAccessGetResponses,\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 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 MailboxesChangesData,\n MailboxesChangesErrors,\n MailboxesChangesResponses,\n MailboxesEmptyTrashData,\n MailboxesEmptyTrashErrors,\n MailboxesEmptyTrashResponses,\n MailboxesListData,\n MailboxesListErrors,\n MailboxesListFolderData,\n MailboxesListFolderErrors,\n MailboxesListFolderResponses,\n MailboxesListResponses,\n MessagesActData,\n MessagesActErrors,\n MessagesActResponses,\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 RoutingCreateData,\n RoutingCreateErrors,\n RoutingCreateResponses,\n RoutingDeleteData,\n RoutingDeleteErrors,\n RoutingDeleteResponses,\n RoutingListData,\n RoutingListErrors,\n RoutingListResponses,\n RoutingUpdateData,\n RoutingUpdateErrors,\n RoutingUpdateResponses,\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 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 and the address. Ten wrong codes spend the signup, whatever comes next. It returns no key: the agent asks for one through the account it now belongs to, which is how every other key is made.\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 * 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 */\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 * 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 classify this sender as spam*.\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 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 * 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.\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 * Search one mailbox\n *\n * Full-text, ranked by relevance, one mailbox at a time. Results carry the folder they were found in. 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 * 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 it arrived\n *\n * `message/rfc822`, not JSON — the point is bytes nobody re-encoded. It 404s when the original has aged out of storage, which leaves a normal parsed message.\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 * 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.\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.\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.\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 * `identity_ids` is required and must be a subset of what the calling key already reaches: a key cannot delegate reach it does not have. 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 * The only thing 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 * 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 * 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 * 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 * 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 * 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 * 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. `delivery_rate` is null rather than zero when nothing was sent.\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. 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 * 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 * 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 const get = (name: string): string | undefined =>\n input.headers instanceof Headers\n ? (input.headers.get(name) ?? undefined)\n : (input.headers[name] ?? input.headers[name.toLowerCase()]);\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"],"mappings":"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","names":["joinedValues","config","request","url"]}