@wassist/sdk 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -1
- package/README.md +15 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +58 -7
- package/dist/index.d.ts +58 -7
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.2
|
|
4
|
+
|
|
5
|
+
- **New event**: `subscription.message.received` is now part of the `WassistEvent` discriminated union as `SubscriptionMessageReceivedEvent`. It fires for inbound user messages on conversations whose routing has been switched to `webhook` (via `phoneNumbers.subscribe` or `conversations.subscribe`) — delivery goes only to the assigned webhook, with no agent pipeline and no fan-out. Same envelope as `message.received`, plus `routing: "webhook"` and `webhookId`. See the [routing guide](https://docs.wassist.app/guides/webhooks/routing) for the full lifecycle.
|
|
6
|
+
- `SDK_VERSION` now correctly tracks `package.json` (was stuck at `0.1.0`).
|
|
7
|
+
|
|
8
|
+
## 0.1.1
|
|
9
|
+
|
|
10
|
+
- **Fix**: `WassistEvent` is now a clean discriminated union — `switch (event.event)` correctly narrows every known case to its specific event type, so fields like `event.message.body` and `event.conversationId` are typed inside the branch (previously they collapsed to `unknown` because the catch-all `WassistEventBase<string> & Record<string, unknown>` member was part of the union). The catch-all has been split out into a separate, opt-in `UnrecognizedWassistEvent` type for forward-compat handling of future event names.
|
|
11
|
+
- Runnable [examples](./examples) for a quickstart agent setup script, a Next.js / Vercel webhook receiver, and a Cloudflare Workers webhook receiver — each with a one-click deploy button where applicable.
|
|
12
|
+
|
|
13
|
+
## 0.1.0
|
|
4
14
|
|
|
5
15
|
Initial release.
|
|
6
16
|
|
package/README.md
CHANGED
|
@@ -48,6 +48,16 @@ for await (const c of wassist.conversations.list()) {
|
|
|
48
48
|
|
|
49
49
|
Get your API key at [wassist.app/settings](https://wassist.app/settings).
|
|
50
50
|
|
|
51
|
+
## Examples
|
|
52
|
+
|
|
53
|
+
Runnable, self-contained examples live in [`examples/`](https://github.com/wassist/sdk/tree/main/examples). Each one is its own mini-package — `cd` in, install, and go.
|
|
54
|
+
|
|
55
|
+
| Example | What it shows | Deploy |
|
|
56
|
+
|---------|---------------|--------|
|
|
57
|
+
| [`quickstart-setup-agent`](https://github.com/wassist/sdk/tree/main/examples/quickstart-setup-agent) | One-shot script: create an agent, configure prompts and icebreakers, optionally connect a phone number. | — |
|
|
58
|
+
| [`webhook-receiver-vercel`](https://github.com/wassist/sdk/tree/main/examples/webhook-receiver-vercel) | Next.js App Router route that verifies Wassist webhooks and echoes inbound messages. | [](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fwassist%2Fsdk&root-directory=examples%2Fwebhook-receiver-vercel&project-name=wassist-webhook-vercel&env=WASSIST_API_KEY,WASSIST_WEBHOOK_SECRET) |
|
|
59
|
+
| [`webhook-receiver-cloudflare`](https://github.com/wassist/sdk/tree/main/examples/webhook-receiver-cloudflare) | Cloudflare Worker that verifies Wassist webhooks via Web Crypto and echoes inbound messages. | [](https://deploy.workers.cloudflare.com/?url=https://github.com/wassist/sdk/tree/main/examples/webhook-receiver-cloudflare&secrets=WASSIST_API_KEY,WASSIST_WEBHOOK_SECRET) |
|
|
60
|
+
|
|
51
61
|
## Configuration
|
|
52
62
|
|
|
53
63
|
```ts
|
|
@@ -194,6 +204,11 @@ app.post(
|
|
|
194
204
|
case 'message.received':
|
|
195
205
|
// event.message, event.from, event.conversationId, ...
|
|
196
206
|
break;
|
|
207
|
+
case 'subscription.message.received':
|
|
208
|
+
// Same shape as message.received plus event.routing ('webhook')
|
|
209
|
+
// and event.webhookId. Fires for conversations routed to a webhook
|
|
210
|
+
// instead of an agent — see https://docs.wassist.app/guides/webhooks/routing
|
|
211
|
+
break;
|
|
197
212
|
case 'subscription.activated':
|
|
198
213
|
case 'subscription.revoked':
|
|
199
214
|
// event.webhookId, event.conversationId
|
package/dist/index.cjs
CHANGED
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/http.ts","../src/pagination.ts","../src/resources/agents.ts","../src/resources/messages.ts","../src/resources/conversations.ts","../src/resources/phone-numbers.ts","../src/resources/whatsapp-accounts.ts","../src/resources/whatsapp-link-sessions.ts","../src/resources/whatsapp-templates.ts","../src/webhooks.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Error hierarchy for the Wassist SDK.\n *\n * Every network response and webhook signature failure surfaces as a subclass\n * of {@link WassistError}, so consumers can branch on `instanceof` (Stripe\n * convention) and read `statusCode`, `code`, `requestId`, and the raw body.\n */\n\nexport interface WassistErrorOptions {\n message: string;\n statusCode?: number;\n code?: string;\n requestId?: string;\n raw?: unknown;\n cause?: unknown;\n}\n\nexport class WassistError extends Error {\n /** HTTP status code if this error originated from an API response. */\n readonly statusCode?: number;\n /** Machine-readable error code (e.g. `not_found`) when the API provides one. */\n readonly code?: string;\n /**\n * Request ID surfaced by the Wassist API in the `X-Request-Id` response\n * header. Include this when filing support tickets.\n */\n readonly requestId?: string;\n /** Raw response body, parsed as JSON when possible. */\n readonly raw?: unknown;\n\n constructor(opts: WassistErrorOptions) {\n super(opts.message);\n this.name = new.target.name;\n this.statusCode = opts.statusCode;\n this.code = opts.code;\n this.requestId = opts.requestId;\n this.raw = opts.raw;\n if (opts.cause !== undefined) {\n (this as { cause?: unknown }).cause = opts.cause;\n }\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 401 Unauthorized — the API key was missing, malformed, or revoked. */\nexport class WassistAuthenticationError extends WassistError {}\n\n/** 403 Forbidden — the API key lacks permission for this resource. */\nexport class WassistPermissionError extends WassistError {}\n\n/** 400 / 422 — the request body or parameters were invalid. */\nexport class WassistInvalidRequestError extends WassistError {}\n\n/** 404 Not Found — the requested resource does not exist. */\nexport class WassistNotFoundError extends WassistError {}\n\n/** 409 Conflict — the request conflicts with the current state. */\nexport class WassistConflictError extends WassistError {}\n\n/** 429 Too Many Requests — slow down or wait `retryAfter` seconds. */\nexport class WassistRateLimitError extends WassistError {\n /** Suggested wait in seconds, from the `Retry-After` response header. */\n readonly retryAfter?: number;\n\n constructor(opts: WassistErrorOptions & { retryAfter?: number }) {\n super(opts);\n this.retryAfter = opts.retryAfter;\n }\n}\n\n/** 5xx — something is wrong on Wassist's side. The SDK retries these automatically. */\nexport class WassistAPIError extends WassistError {}\n\n/** A network-level failure (DNS, TCP, TLS, abort, etc.) — never made it to the server. */\nexport class WassistConnectionError extends WassistError {}\n\n/** The request exceeded the configured `timeout`. */\nexport class WassistTimeoutError extends WassistError {}\n\n/**\n * Webhook signature could not be verified.\n *\n * Thrown by {@link Wassist.webhooks.constructEvent} when the header is\n * malformed, the HMAC doesn't match, or the timestamp falls outside the\n * tolerance window.\n */\nexport class WassistSignatureVerificationError extends WassistError {\n /** The raw `X-Wassist-Signature` header value as received. */\n readonly header?: string;\n /** The payload that was verified, as the SDK saw it. */\n readonly payload?: string;\n\n constructor(\n opts: WassistErrorOptions & { header?: string; payload?: string }\n ) {\n super(opts);\n this.header = opts.header;\n this.payload = opts.payload;\n }\n}\n\n/**\n * Map an HTTP status code + response body to the most specific error class.\n *\n * @internal\n */\nexport function errorFromResponse(args: {\n status: number;\n body: unknown;\n requestId?: string;\n retryAfter?: number;\n}): WassistError {\n const { status, body, requestId, retryAfter } = args;\n\n const message = extractMessage(body) ?? `HTTP ${status}`;\n const code = extractCode(body);\n const base = { message, statusCode: status, code, requestId, raw: body };\n\n if (status === 401) return new WassistAuthenticationError(base);\n if (status === 403) return new WassistPermissionError(base);\n if (status === 404) return new WassistNotFoundError(base);\n if (status === 409) return new WassistConflictError(base);\n if (status === 429) return new WassistRateLimitError({ ...base, retryAfter });\n if (status === 400 || status === 422) {\n return new WassistInvalidRequestError(base);\n }\n if (status >= 500 && status < 600) return new WassistAPIError(base);\n return new WassistError(base);\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const b = body as Record<string, unknown>;\n if (typeof b.error === 'string') return b.error;\n if (typeof b.message === 'string') return b.message;\n if (typeof b.detail === 'string') return b.detail;\n if (b.error && typeof b.error === 'object') {\n const inner = (b.error as Record<string, unknown>).message;\n if (typeof inner === 'string') return inner;\n }\n return undefined;\n}\n\nfunction extractCode(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const b = body as Record<string, unknown>;\n if (typeof b.code === 'string') return b.code;\n return undefined;\n}\n","/**\n * The package version, embedded into the `User-Agent` header on every\n * outbound request so Wassist can correlate API traffic with SDK versions.\n *\n * Updated in lockstep with `package.json`'s `version` field.\n */\nexport const SDK_VERSION = '0.1.0';\n","/**\n * Low-level HTTP transport used by every resource module.\n *\n * Wraps `fetch` with:\n * - `X-API-Key` authentication\n * - `/api/v1/` path prefix handling\n * - Per-request timeout (cancels via `AbortController`)\n * - Exponential-backoff retries on `429` and `5xx` (honors `Retry-After`)\n * - `Idempotency-Key` opt-in for safe `POST` retries\n * - Typed error mapping via {@link errorFromResponse}\n * - `requestId` extraction from the `X-Request-Id` response header\n */\n\nimport {\n WassistConnectionError,\n WassistError,\n WassistRateLimitError,\n WassistTimeoutError,\n errorFromResponse,\n} from './errors';\nimport type { RequestOptions } from './types/common';\nimport { SDK_VERSION } from './version';\n\n/**\n * The minimal `fetch` signature this SDK depends on. Any spec-compliant\n * implementation will satisfy it — Node 18+, edge runtimes, browsers, Bun.\n */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\n/**\n * Configuration for {@link Wassist}.\n */\nexport interface WassistClientConfig {\n /**\n * Your Wassist API key. Find it at\n * https://wassist.app/settings → API Keys.\n */\n apiKey: string;\n /**\n * Base URL of the Wassist API.\n *\n * @default 'https://backend.wassist.app'\n */\n baseUrl?: string;\n /**\n * Default request timeout in milliseconds. Individual calls can override\n * via the per-call `timeout` option.\n *\n * @default 60_000\n */\n timeout?: number;\n /**\n * Maximum number of retry attempts on `429` / `5xx` / network errors.\n * The total number of requests is `maxRetries + 1`.\n *\n * @default 2\n */\n maxRetries?: number;\n /**\n * Custom `fetch` implementation. Useful for tests, mocking, or runtimes\n * that don't expose `globalThis.fetch`.\n *\n * @default globalThis.fetch\n */\n fetch?: FetchLike;\n}\n\nconst DEFAULT_BASE_URL = 'https://backend.wassist.app';\nconst DEFAULT_TIMEOUT_MS = 60_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst API_VERSION_PREFIX = '/api/v1';\nconst RETRY_STATUSES: ReadonlySet<number> = new Set([408, 425, 429, 500, 502, 503, 504]);\n\n/** Query-string values supported on every request. */\nexport type QueryValue = string | number | boolean | undefined | null;\n\n/** A loose-record shape for query strings — every field is optional and stringly-typed. */\nexport type QueryParams = { readonly [key: string]: QueryValue };\n\ninterface RequestArgs {\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n query?: object;\n body?: unknown;\n options?: RequestOptions;\n}\n\n/**\n * @internal\n */\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: FetchLike;\n\n constructor(config: WassistClientConfig) {\n if (!config.apiKey) {\n throw new WassistError({\n message:\n 'A Wassist `apiKey` is required. Create one at https://wassist.app/settings.',\n });\n }\n this.apiKey = config.apiKey;\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT_MS;\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n const provided = config.fetch ?? globalThis.fetch?.bind(globalThis);\n if (!provided) {\n throw new WassistError({\n message:\n 'No `fetch` implementation found. Pass one via `fetch` in the Wassist constructor, or run on Node 18+ / a runtime with a global `fetch`.',\n });\n }\n this.fetchImpl = provided;\n }\n\n get<T>(path: string, args?: Omit<RequestArgs, 'method' | 'path' | 'body'>): Promise<T> {\n return this.request<T>({ ...args, method: 'GET', path });\n }\n post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>({ method: 'POST', path, body, options });\n }\n put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>({ method: 'PUT', path, body, options });\n }\n patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>({ method: 'PATCH', path, body, options });\n }\n delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>({ method: 'DELETE', path, options });\n }\n\n private async request<T>(args: RequestArgs): Promise<T> {\n const url = this.buildUrl(args.path, args.query);\n const headers = this.buildHeaders(args);\n const body = args.body === undefined ? undefined : JSON.stringify(args.body);\n const maxRetries = args.options?.maxRetries ?? this.maxRetries;\n const timeout = args.options?.timeout ?? this.timeout;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const response = await this.doFetch({\n url,\n method: args.method,\n headers,\n body,\n timeout,\n signal: args.options?.signal,\n });\n\n if (response.ok) {\n if (response.status === 204) return undefined as T;\n // Some endpoints return empty bodies — handle gracefully.\n const text = await response.text();\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n }\n\n // Build a typed error and decide whether to retry.\n const requestId = response.headers.get('x-request-id') ?? undefined;\n const retryAfter = parseRetryAfter(response.headers.get('retry-after'));\n const parsedBody = await safeJson(response);\n const apiError = errorFromResponse({\n status: response.status,\n body: parsedBody,\n requestId,\n retryAfter,\n });\n\n const isRetryable = RETRY_STATUSES.has(response.status);\n if (isRetryable && attempt < maxRetries) {\n await sleep(computeBackoff(attempt, apiError));\n lastError = apiError;\n continue;\n }\n throw apiError;\n } catch (err) {\n if (err instanceof WassistError) {\n // Already a typed SDK error from the branch above.\n if (\n attempt < maxRetries &&\n (err instanceof WassistRateLimitError || isRetryableApiError(err))\n ) {\n await sleep(computeBackoff(attempt, err));\n lastError = err;\n continue;\n }\n throw err;\n }\n\n // Map fetch-level failures.\n const mapped = mapFetchError(err);\n if (attempt < maxRetries && isRetryableTransport(mapped)) {\n await sleep(computeBackoff(attempt));\n lastError = mapped;\n continue;\n }\n throw mapped;\n }\n }\n // Should be unreachable — every path above either returns or throws.\n throw lastError instanceof Error\n ? lastError\n : new WassistError({ message: 'Wassist request failed after retries.' });\n }\n\n private buildUrl(path: string, query?: object): string {\n const prefixedPath = path.startsWith('/') ? path : `/${path}`;\n const fullPath = prefixedPath.startsWith(API_VERSION_PREFIX)\n ? prefixedPath\n : `${API_VERSION_PREFIX}${prefixedPath}`;\n const url = new URL(this.baseUrl + fullPath);\n if (query) {\n for (const [key, value] of Object.entries(query as Record<string, QueryValue>)) {\n if (value === undefined || value === null) continue;\n url.searchParams.append(key, String(value));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(args: RequestArgs): Record<string, string> {\n const headers: Record<string, string> = {\n 'X-API-Key': this.apiKey,\n 'Accept': 'application/json',\n 'User-Agent': `wassist-sdk-node/${SDK_VERSION}`,\n 'X-Wassist-Client': `wassist-sdk-node/${SDK_VERSION}`,\n };\n if (args.body !== undefined) headers['Content-Type'] = 'application/json';\n if (args.options?.idempotencyKey) {\n headers['Idempotency-Key'] = args.options.idempotencyKey;\n }\n if (args.options?.headers) {\n for (const [k, v] of Object.entries(args.options.headers)) headers[k] = v;\n }\n return headers;\n }\n\n private async doFetch(args: {\n url: string;\n method: string;\n headers: Record<string, string>;\n body?: string;\n timeout: number;\n signal?: AbortSignal;\n }): Promise<Response> {\n const controller = new AbortController();\n const onAbort = () => controller.abort();\n if (args.signal) {\n if (args.signal.aborted) controller.abort();\n else args.signal.addEventListener('abort', onAbort, { once: true });\n }\n const timeoutId = setTimeout(() => controller.abort(), args.timeout);\n try {\n return await this.fetchImpl(args.url, {\n method: args.method,\n headers: args.headers,\n body: args.body,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n if (args.signal) args.signal.removeEventListener('abort', onAbort);\n }\n }\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction safeJson(response: Response): Promise<unknown> {\n return response\n .text()\n .then((text) => {\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n })\n .catch(() => undefined);\n}\n\nfunction parseRetryAfter(value: string | null): number | undefined {\n if (!value) return undefined;\n const asNum = Number(value);\n if (Number.isFinite(asNum) && asNum >= 0) return asNum;\n const asDate = Date.parse(value);\n if (Number.isNaN(asDate)) return undefined;\n return Math.max(0, Math.floor((asDate - Date.now()) / 1000));\n}\n\nfunction computeBackoff(attempt: number, err?: WassistError): number {\n // Honor server-supplied Retry-After (seconds) when present.\n if (err instanceof WassistRateLimitError && typeof err.retryAfter === 'number') {\n return err.retryAfter * 1000;\n }\n // Exponential backoff with full jitter: random in [base, 2 * base).\n const base = 500 * Math.pow(2, attempt);\n const jitter = base * Math.random();\n return Math.min(base + jitter, 8_000);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isRetryableApiError(err: WassistError): boolean {\n return err.statusCode !== undefined && RETRY_STATUSES.has(err.statusCode);\n}\n\nfunction isRetryableTransport(err: WassistError): boolean {\n return err instanceof WassistConnectionError;\n}\n\nfunction mapFetchError(err: unknown): WassistError {\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n return new WassistTimeoutError({\n message: 'Request timed out.',\n cause: err,\n });\n }\n return new WassistConnectionError({\n message: `Network error: ${err.message}`,\n cause: err,\n });\n }\n return new WassistConnectionError({ message: 'Unknown network error.' });\n}\n","import type { PageParams, PaginatedResponse, RequestOptions } from './types/common';\n\n/**\n * The shape of a single fetched page, returned by {@link AutoPaginatedList.firstPage}.\n */\nexport interface Page<T> {\n /** The items on this page. */\n data: T[];\n /** Total number of items across all pages. */\n totalCount: number;\n /** Whether there is at least one more page after this one. */\n hasMore: boolean;\n /** Offset to pass to the next call to continue from this page. */\n nextOffset: number;\n}\n\n/**\n * Lazy auto-paginating wrapper around any Wassist list endpoint.\n *\n * Iteration is lazy — pages are fetched on demand as you consume them, so\n * `for await` over a million-item list never has the whole result set in\n * memory.\n *\n * @example Iterate every item\n * ```ts\n * for await (const conv of wassist.conversations.list({ limit: 100 })) {\n * console.log(conv.id);\n * }\n * ```\n *\n * @example Just the first page\n * ```ts\n * const { data, hasMore } = await wassist.conversations.list().firstPage();\n * ```\n *\n * @example Collect everything into an array (small lists only)\n * ```ts\n * const all = await wassist.agents.list().all();\n * ```\n */\nexport class AutoPaginatedList<T> implements AsyncIterable<T> {\n private readonly fetchPage: (params: PageParams) => Promise<PaginatedResponse<T>>;\n private readonly params: PageParams;\n private readonly options: RequestOptions | undefined;\n\n /** @internal */\n constructor(\n fetchPage: (params: PageParams) => Promise<PaginatedResponse<T>>,\n params: PageParams = {},\n options?: RequestOptions\n ) {\n this.fetchPage = fetchPage;\n this.params = params;\n this.options = options;\n }\n\n /**\n * Async iterator over every item across every page, fetched lazily.\n */\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n const limit = this.params.limit ?? 50;\n let offset = this.params.offset ?? 0;\n let hasMore = true;\n\n while (hasMore) {\n const page = await this.fetchPage({ limit, offset });\n for (const item of page.results) yield item;\n hasMore = page.next !== null && page.results.length > 0;\n offset += page.results.length || limit;\n }\n }\n\n /**\n * Fetch the first page only and return it as a {@link Page}.\n */\n async firstPage(): Promise<Page<T>> {\n const limit = this.params.limit ?? 50;\n const offset = this.params.offset ?? 0;\n const page = await this.fetchPage({ limit, offset });\n return {\n data: page.results,\n totalCount: page.count,\n hasMore: page.next !== null,\n nextOffset: offset + page.results.length,\n };\n }\n\n /**\n * Walk every page and collect every item into a single array.\n *\n * Convenient for small lists; for large ones prefer `for await`.\n */\n async all(): Promise<T[]> {\n const out: T[] = [];\n for await (const item of this) out.push(item);\n return out;\n }\n}\n\n// Re-export for resource modules.\nexport type { RequestOptions };\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n Agent,\n CreateAgentInput,\n CreateBYOAAgentInput,\n UpdateAgentInput,\n} from '../types/agents';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Methods for managing agents — the AI personas you connect to WhatsApp.\n *\n * Documented at https://docs.wassist.app/api-reference/agents/list.\n */\nexport class AgentsResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every agent on your account.\n *\n * Returns a lazily-fetched paginated list. Use `for await` to walk all\n * pages, or `.firstPage()` for just the first.\n *\n * `GET /agents/`\n *\n * @example\n * ```ts\n * for await (const agent of wassist.agents.list()) {\n * console.log(agent.id, agent.name);\n * }\n * ```\n */\n list(params: PageParams = {}, options?: RequestOptions): AutoPaginatedList<Agent> {\n return new AutoPaginatedList<Agent>(\n (p) => this.http.get<PaginatedResponse<Agent>>('/agents/', { query: p, options }),\n params,\n options\n );\n }\n\n /**\n * Retrieve a single agent by ID.\n *\n * `GET /agents/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<Agent> {\n return this.http.get<Agent>(`/agents/${encodeURIComponent(id)}/`, { options });\n }\n\n /**\n * Create a new agent with the given display name. Configure it further\n * with {@link AgentsResource.update}.\n *\n * `POST /agents/`\n */\n create(input: CreateAgentInput, options?: RequestOptions): Promise<Agent> {\n return this.http.post<Agent>('/agents/', input, options);\n }\n\n /**\n * Create a Bring-Your-Own-Agent (BYOA) — Wassist forwards inbound\n * messages to your webhook and posts back replies you author yourself.\n *\n * `POST /agents/byoa/`\n */\n createBYOA(input: CreateBYOAAgentInput, options?: RequestOptions): Promise<Agent> {\n return this.http.post<Agent>('/agents/byoa/', input, options);\n }\n\n /**\n * Partially update an agent. Only the fields you pass are modified.\n *\n * Nested sub-resource arrays (tools, memory keys, etc.) are diffed\n * server-side by `id`: include an `id` to update an existing entry,\n * omit it to create one.\n *\n * `PATCH /agents/{id}/`\n */\n update(id: UUID, input: UpdateAgentInput, options?: RequestOptions): Promise<Agent> {\n return this.http.patch<Agent>(`/agents/${encodeURIComponent(id)}/`, input, options);\n }\n\n /**\n * Soft-delete an agent. The agent stops responding immediately;\n * conversation history is retained.\n *\n * `DELETE /agents/{id}/`\n */\n delete(id: UUID, options?: RequestOptions): Promise<void> {\n return this.http.delete<void>(`/agents/${encodeURIComponent(id)}/`, options);\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type { Message, SendMessageInput } from '../types/messages';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Messages within a conversation. Reached via `wassist.conversations.messages`.\n *\n * Documented at https://docs.wassist.app/api-reference/conversations/messages/list\n * and https://docs.wassist.app/api-reference/conversations/messages/send.\n */\nexport class MessagesResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List messages in a conversation, newest first.\n *\n * `GET /conversations/{id}/messages/`\n */\n list(\n conversationId: UUID,\n params: PageParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<Message> {\n const path = `/conversations/${encodeURIComponent(conversationId)}/messages/`;\n return new AutoPaginatedList<Message>(\n (p) => this.http.get<PaginatedResponse<Message>>(path, { query: p, options }),\n params,\n options\n );\n }\n\n /**\n * Send a message in a conversation.\n *\n * The input is a discriminated union — set `type` and populate the\n * matching field (`text`, `template`, `cta`, or `unified`).\n *\n * `POST /conversations/{id}/messages/`\n *\n * @example Plain text\n * ```ts\n * await wassist.conversations.messages.send(conv.id, {\n * type: 'text',\n * text: { body: 'Hello!' },\n * });\n * ```\n *\n * @example Approved template\n * ```ts\n * await wassist.conversations.messages.send(conv.id, {\n * type: 'template',\n * template: { name: 'order_update', variables: { body: ['Alex', '#1234'] } },\n * });\n * ```\n */\n send(\n conversationId: UUID,\n input: SendMessageInput,\n options?: RequestOptions\n ): Promise<Message> {\n const path = `/conversations/${encodeURIComponent(conversationId)}/messages/`;\n return this.http.post<Message>(path, input, options);\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n Conversation,\n CreateConversationInput,\n ListConversationsParams,\n SubscribeConversationInput,\n} from '../types/conversations';\nimport type { PromptAgentInput } from '../types/messages';\nimport type { PaginatedResponse, RequestOptions, UUID } from '../types/common';\nimport { MessagesResource } from './messages';\n\n/**\n * Methods for managing conversations — ongoing WhatsApp chats between\n * your numbers and a contact.\n *\n * Nested namespace: `wassist.conversations.messages` (see {@link MessagesResource}).\n */\nexport class ConversationsResource {\n /** Send and list messages within a conversation. */\n readonly messages: MessagesResource;\n\n /** @internal */\n constructor(private readonly http: HttpClient) {\n this.messages = new MessagesResource(http);\n }\n\n /**\n * List conversations on your account with rich filtering.\n *\n * `GET /conversations/`\n *\n * @example\n * ```ts\n * const recent = await wassist.conversations\n * .list({ ordering: '-last_message_time', limit: 20 })\n * .firstPage();\n * ```\n */\n list(\n params: ListConversationsParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<Conversation> {\n const { limit, offset, ...filters } = params;\n return new AutoPaginatedList<Conversation>(\n (p) =>\n this.http.get<PaginatedResponse<Conversation>>('/conversations/', {\n query: { ...filters, ...p },\n options,\n }),\n { limit, offset },\n options\n );\n }\n\n /**\n * Retrieve a single conversation by ID.\n *\n * `GET /conversations/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<Conversation> {\n return this.http.get<Conversation>(`/conversations/${encodeURIComponent(id)}/`, {\n options,\n });\n }\n\n /**\n * Create a new conversation with a contact.\n *\n * If the WhatsApp 24-hour reply window is closed for this contact, you\n * must include a `template` message to open it.\n *\n * `POST /conversations/`\n */\n create(input: CreateConversationInput, options?: RequestOptions): Promise<Conversation> {\n return this.http.post<Conversation>('/conversations/', input, options);\n }\n\n /**\n * Prompt the agent in this conversation with a custom instruction.\n * Equivalent to \"wake the agent up and have it say this\" — useful for\n * outbound triggers and follow-ups.\n *\n * `POST /conversations/{id}/prompt/`\n */\n prompt(id: UUID, input: PromptAgentInput, options?: RequestOptions): Promise<void> {\n return this.http.post<void>(\n `/conversations/${encodeURIComponent(id)}/prompt/`,\n input,\n options\n );\n }\n\n /**\n * Send a WhatsApp read receipt for the most recent inbound message.\n *\n * `POST /conversations/{id}/read/`\n */\n read(id: UUID, options?: RequestOptions): Promise<Conversation> {\n return this.http.post<Conversation>(\n `/conversations/${encodeURIComponent(id)}/read/`,\n undefined,\n options\n );\n }\n\n /**\n * Display the WhatsApp typing indicator on the contact's device.\n *\n * Note: WhatsApp also marks the most recent inbound message as read as\n * a side effect — this is a platform limitation.\n *\n * `POST /conversations/{id}/typing/`\n */\n typing(id: UUID, options?: RequestOptions): Promise<Conversation> {\n return this.http.post<Conversation>(\n `/conversations/${encodeURIComponent(id)}/typing/`,\n undefined,\n options\n );\n }\n\n /**\n * Route this conversation to a webhook. The agent pipeline is skipped\n * while the override is active.\n *\n * Fires a `subscription.activated` event on the target webhook.\n *\n * `POST /conversations/{id}/subscribe/`\n */\n subscribe(\n id: UUID,\n input: SubscribeConversationInput,\n options?: RequestOptions\n ): Promise<Conversation> {\n return this.http.post<Conversation>(\n `/conversations/${encodeURIComponent(id)}/subscribe/`,\n input,\n options\n );\n }\n\n /**\n * Clear the per-conversation routing override and fall back to the\n * phone number's default routing.\n *\n * Fires a `subscription.revoked` event on the previously-subscribed\n * webhook (if any).\n *\n * `POST /conversations/{id}/unsubscribe/`\n */\n unsubscribe(id: UUID, options?: RequestOptions): Promise<Conversation> {\n return this.http.post<Conversation>(\n `/conversations/${encodeURIComponent(id)}/unsubscribe/`,\n undefined,\n options\n );\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n ConnectAgentInput,\n PhoneNumber,\n PhoneNumberBusinessProfile,\n SubscribePhoneNumberInput,\n UnsubscribePhoneNumberInput,\n} from '../types/phone-numbers';\nimport type { PageParams, PaginatedResponse, RequestOptions } from '../types/common';\n\n/**\n * Methods for managing your connected WhatsApp phone numbers and their\n * default routing.\n *\n * The `number` argument throughout is the E.164-format number without a\n * leading `+` (matches the {@link PhoneNumber.number} field).\n */\nexport class PhoneNumbersResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every WhatsApp number on your account.\n *\n * `GET /phone-numbers/`\n */\n list(params: PageParams = {}, options?: RequestOptions): AutoPaginatedList<PhoneNumber> {\n return new AutoPaginatedList<PhoneNumber>(\n (p) =>\n this.http.get<PaginatedResponse<PhoneNumber>>('/phone-numbers/', {\n query: p,\n options,\n }),\n params,\n options\n );\n }\n\n /**\n * View the WhatsApp Business Profile (about, address, websites, etc.)\n * attached to this number.\n *\n * `GET /phone-numbers/{number}/business-profile/`\n */\n getBusinessProfile(\n number: string,\n options?: RequestOptions\n ): Promise<PhoneNumberBusinessProfile> {\n return this.http.get<PhoneNumberBusinessProfile>(\n `/phone-numbers/${encodeURIComponent(number)}/business-profile/`,\n { options }\n );\n }\n\n /**\n * Route inbound messages on this number to a webhook by default. Drops\n * any agent previously connected to the number.\n *\n * Phone-number routing changes do **not** fire\n * `subscription.activated` / `.revoked` webhook events — those are\n * reserved for per-conversation\n * {@link ConversationsResource.subscribe} /\n * {@link ConversationsResource.unsubscribe}.\n *\n * `POST /phone-numbers/{number}/subscribe/`\n */\n subscribe(\n number: string,\n input: SubscribePhoneNumberInput,\n options?: RequestOptions\n ): Promise<PhoneNumber> {\n return this.http.post<PhoneNumber>(\n `/phone-numbers/${encodeURIComponent(number)}/subscribe/`,\n input,\n options\n );\n }\n\n /**\n * Assign an agent as the default for this number. Drops any subscribed\n * webhook.\n *\n * The agent must already be owned by or shared with the authenticated\n * user.\n *\n * `POST /phone-numbers/{number}/connect-agent/`\n */\n connectAgent(\n number: string,\n input: ConnectAgentInput,\n options?: RequestOptions\n ): Promise<PhoneNumber> {\n return this.http.post<PhoneNumber>(\n `/phone-numbers/${encodeURIComponent(number)}/connect-agent/`,\n input,\n options\n );\n }\n\n /**\n * Clear default routing on this number entirely. Drops both the agent\n * and the webhook.\n *\n * `POST /phone-numbers/{number}/unsubscribe/`\n */\n unsubscribe(\n number: string,\n input: UnsubscribePhoneNumberInput = {},\n options?: RequestOptions\n ): Promise<PhoneNumber> {\n return this.http.post<PhoneNumber>(\n `/phone-numbers/${encodeURIComponent(number)}/unsubscribe/`,\n input,\n options\n );\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n AddNumberInput,\n AvailableNumbersResponse,\n WhatsAppAccount,\n} from '../types/whatsapp-accounts';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Methods for managing WhatsApp Business Accounts (WABAs) connected to\n * your Wassist account.\n */\nexport class WhatsAppAccountsResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every WhatsApp Business Account on your Wassist account.\n *\n * `GET /whatsapp-accounts/`\n */\n list(\n params: PageParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<WhatsAppAccount> {\n return new AutoPaginatedList<WhatsAppAccount>(\n (p) =>\n this.http.get<PaginatedResponse<WhatsAppAccount>>('/whatsapp-accounts/', {\n query: p,\n options,\n }),\n params,\n options\n );\n }\n\n /**\n * Retrieve a single WhatsApp Business Account by ID.\n *\n * `GET /whatsapp-accounts/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<WhatsAppAccount> {\n return this.http.get<WhatsAppAccount>(\n `/whatsapp-accounts/${encodeURIComponent(id)}/`,\n { options }\n );\n }\n\n /**\n * Add a pre-verified phone number (purchased via Meta's embedded\n * signup flow) to a WhatsApp Business Account.\n *\n * `POST /whatsapp-accounts/{id}/add-number/`\n */\n addNumber(\n id: UUID,\n input: AddNumberInput,\n options?: RequestOptions\n ): Promise<WhatsAppAccount> {\n return this.http.post<WhatsAppAccount>(\n `/whatsapp-accounts/${encodeURIComponent(id)}/add-number/`,\n input,\n options\n );\n }\n\n /**\n * List Twilio phone numbers available for purchase + verification.\n *\n * `GET /available-numbers/`\n */\n availableNumbers(options?: RequestOptions): Promise<AvailableNumbersResponse> {\n return this.http.get<AvailableNumbersResponse>('/available-numbers/', { options });\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n CreateWhatsAppLinkSessionInput,\n WhatsAppLinkSession,\n} from '../types/whatsapp-link-sessions';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Methods for managing WhatsApp account-linking sessions — the hosted\n * flow that lets your customers connect their own WABA to your platform.\n */\nexport class WhatsAppLinkSessionsResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every link session you've created.\n *\n * `GET /whatsapp-link-sessions/`\n */\n list(\n params: PageParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<WhatsAppLinkSession> {\n return new AutoPaginatedList<WhatsAppLinkSession>(\n (p) =>\n this.http.get<PaginatedResponse<WhatsAppLinkSession>>(\n '/whatsapp-link-sessions/',\n { query: p, options }\n ),\n params,\n options\n );\n }\n\n /**\n * Retrieve a single link session by ID.\n *\n * `GET /whatsapp-link-sessions/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<WhatsAppLinkSession> {\n return this.http.get<WhatsAppLinkSession>(\n `/whatsapp-link-sessions/${encodeURIComponent(id)}/`,\n { options }\n );\n }\n\n /**\n * Create a new link session. Direct the user to the returned `linkUrl`.\n *\n * `POST /whatsapp-link-sessions/`\n */\n create(\n input: CreateWhatsAppLinkSessionInput,\n options?: RequestOptions\n ): Promise<WhatsAppLinkSession> {\n return this.http.post<WhatsAppLinkSession>(\n '/whatsapp-link-sessions/',\n input,\n options\n );\n }\n\n /**\n * Expire a pending link session early. Useful for invalidating stale\n * URLs you've handed out to customers.\n *\n * `POST /whatsapp-link-sessions/{id}/expire/`\n */\n expire(id: UUID, options?: RequestOptions): Promise<WhatsAppLinkSession> {\n return this.http.post<WhatsAppLinkSession>(\n `/whatsapp-link-sessions/${encodeURIComponent(id)}/expire/`,\n undefined,\n options\n );\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n CreateWhatsAppTemplateInput,\n PublishWhatsAppTemplateInput,\n UnpublishWhatsAppTemplateInput,\n UpdateWhatsAppTemplateInput,\n WhatsAppTemplate,\n WhatsAppTemplateWithPublishResults,\n} from '../types/whatsapp-templates';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Methods for managing Wassist-side WhatsApp templates and publishing them\n * to your connected WABAs.\n */\nexport class WhatsAppTemplatesResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every template you've created in Wassist.\n *\n * `GET /whatsapp-templates/`\n */\n list(\n params: PageParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<WhatsAppTemplate> {\n return new AutoPaginatedList<WhatsAppTemplate>(\n (p) =>\n this.http.get<PaginatedResponse<WhatsAppTemplate>>('/whatsapp-templates/', {\n query: p,\n options,\n }),\n params,\n options\n );\n }\n\n /**\n * Retrieve a single template by ID.\n *\n * `GET /whatsapp-templates/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<WhatsAppTemplate> {\n return this.http.get<WhatsAppTemplate>(\n `/whatsapp-templates/${encodeURIComponent(id)}/`,\n { options }\n );\n }\n\n /**\n * Create a new template. Published per-WABA separately via {@link publish}.\n *\n * `POST /whatsapp-templates/`\n */\n create(\n input: CreateWhatsAppTemplateInput,\n options?: RequestOptions\n ): Promise<WhatsAppTemplate> {\n return this.http.post<WhatsAppTemplate>('/whatsapp-templates/', input, options);\n }\n\n /**\n * Update an existing template's metadata and components.\n *\n * `PATCH /whatsapp-templates/{id}/`\n */\n update(\n id: UUID,\n input: UpdateWhatsAppTemplateInput,\n options?: RequestOptions\n ): Promise<WhatsAppTemplate> {\n return this.http.patch<WhatsAppTemplate>(\n `/whatsapp-templates/${encodeURIComponent(id)}/`,\n input,\n options\n );\n }\n\n /**\n * Delete a template (and unpublish from every WABA it was published to).\n *\n * `DELETE /whatsapp-templates/{id}/`\n */\n delete(id: UUID, options?: RequestOptions): Promise<void> {\n return this.http.delete<void>(\n `/whatsapp-templates/${encodeURIComponent(id)}/`,\n options\n );\n }\n\n /**\n * Submit this template to one or more WABAs for approval.\n *\n * Returns the updated template, plus per-account `publishResults` /\n * `publishErrors`.\n *\n * `POST /whatsapp-templates/{id}/publish/`\n */\n publish(\n id: UUID,\n input: PublishWhatsAppTemplateInput,\n options?: RequestOptions\n ): Promise<WhatsAppTemplateWithPublishResults> {\n return this.http.post<WhatsAppTemplateWithPublishResults>(\n `/whatsapp-templates/${encodeURIComponent(id)}/publish/`,\n input,\n options\n );\n }\n\n /**\n * Remove this template from one or more WABAs.\n *\n * `POST /whatsapp-templates/{id}/unpublish/`\n */\n unpublish(\n id: UUID,\n input: UnpublishWhatsAppTemplateInput,\n options?: RequestOptions\n ): Promise<WhatsAppTemplateWithPublishResults> {\n return this.http.post<WhatsAppTemplateWithPublishResults>(\n `/whatsapp-templates/${encodeURIComponent(id)}/unpublish/`,\n input,\n options\n );\n }\n}\n","/**\n * Webhook signature verification.\n *\n * Implements the Stripe-style `t=<unix>,v1=<hex hmac sha256>` scheme\n * documented at https://docs.wassist.app/concepts/webhooks. Compute the HMAC of\n * `<timestamp>.<raw body>` with your webhook's signing secret and compare\n * it (in constant time) to the `v1` component of `X-Wassist-Signature`.\n *\n * This module exposes two helpers:\n *\n * - {@link Webhooks.constructEvent} — synchronous, uses `node:crypto` when\n * available (Node 18+).\n * - {@link Webhooks.constructEventAsync} — uses Web Crypto (`crypto.subtle`)\n * for runtimes that lack `node:crypto` (Cloudflare Workers, Deno, the\n * browser).\n */\n\nimport { WassistSignatureVerificationError } from './errors';\nimport type { WassistEvent } from './types/events';\n\nconst DEFAULT_TOLERANCE_SECONDS = 300;\n\ninterface VerifyOptions {\n /**\n * Maximum allowed difference between the server timestamp and `now`, in\n * seconds. Pass `0` to disable replay protection (not recommended).\n *\n * @default 300\n */\n tolerance?: number;\n /**\n * Override `now` for testing — defaults to `Date.now() / 1000`.\n * @internal\n */\n currentTimestamp?: number;\n}\n\n/**\n * Stripe-style webhook helpers.\n *\n * Use via the SDK class:\n *\n * ```ts\n * import { Wassist } from '@wassist/sdk';\n *\n * const wassist = new Wassist({ apiKey: process.env.WASSIST_API_KEY! });\n * const event = wassist.webhooks.constructEvent(rawBody, sigHeader, secret);\n * ```\n *\n * Or statically — no instance required for verification:\n *\n * ```ts\n * import { Wassist } from '@wassist/sdk';\n * const event = Wassist.webhooks.constructEvent(rawBody, sigHeader, secret);\n * ```\n */\nexport class Webhooks {\n /**\n * Verify the signature on a webhook delivery, parse the body, and return\n * the typed event.\n *\n * @param payload The raw request body, exactly as received — `string`,\n * `Buffer`, or `Uint8Array`. **Do not parse it first;**\n * even whitespace differences will break verification.\n * @param header The `X-Wassist-Signature` header value.\n * @param secret Your webhook signing secret. Find it in the\n * [Wassist dashboard](https://wassist.app/developers/webhooks).\n * @param options.tolerance Replay-protection window in seconds (default 300).\n * @throws {WassistSignatureVerificationError} When the header is malformed,\n * the HMAC doesn't match, or the timestamp is outside the tolerance window.\n */\n constructEvent(\n payload: string | Uint8Array,\n header: string | null | undefined,\n secret: string,\n options: VerifyOptions = {}\n ): WassistEvent {\n const { signedPayload, parts } = this.prepare(payload, header);\n const expected = this.signSync(signedPayload, secret);\n this.assertValid(parts, expected, header ?? '', signedPayload, options);\n return this.parseEvent(payload);\n }\n\n /**\n * Async variant of {@link constructEvent} that uses Web Crypto, for\n * runtimes that don't expose `node:crypto` (Cloudflare Workers, Deno,\n * the browser).\n */\n async constructEventAsync(\n payload: string | Uint8Array,\n header: string | null | undefined,\n secret: string,\n options: VerifyOptions = {}\n ): Promise<WassistEvent> {\n const { signedPayload, parts } = this.prepare(payload, header);\n const expected = await this.signAsync(signedPayload, secret);\n this.assertValid(parts, expected, header ?? '', signedPayload, options);\n return this.parseEvent(payload);\n }\n\n /**\n * Compute the v1 signature for a `t.<body>` payload — exported as a\n * convenience for testing.\n */\n signSync(signedPayload: string, secret: string): string {\n const nodeCrypto = loadNodeCrypto();\n if (!nodeCrypto) {\n throw new WassistSignatureVerificationError({\n message:\n 'node:crypto is unavailable in this runtime. Use `constructEventAsync` instead.',\n });\n }\n return nodeCrypto.createHmac('sha256', secret).update(signedPayload).digest('hex');\n }\n\n /**\n * Web Crypto variant of {@link signSync}.\n */\n async signAsync(signedPayload: string, secret: string): Promise<string> {\n const subtle = globalThis.crypto?.subtle;\n if (!subtle) {\n throw new WassistSignatureVerificationError({\n message:\n 'Web Crypto (`globalThis.crypto.subtle`) is unavailable in this runtime.',\n });\n }\n const enc = new TextEncoder();\n const key = await subtle.importKey(\n 'raw',\n enc.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n const sig = await subtle.sign('HMAC', key, enc.encode(signedPayload));\n return toHex(new Uint8Array(sig));\n }\n\n // =============================================================================\n // Internals\n // =============================================================================\n\n private prepare(\n payload: string | Uint8Array,\n header: string | null | undefined\n ): { signedPayload: string; parts: { t: string; v1: string } } {\n if (!header) {\n throw new WassistSignatureVerificationError({\n message: 'Missing X-Wassist-Signature header.',\n header: header ?? undefined,\n });\n }\n const parts = parseHeader(header);\n if (!parts.t || !parts.v1) {\n throw new WassistSignatureVerificationError({\n message:\n 'Malformed X-Wassist-Signature header — expected `t=<unix>,v1=<hex>`.',\n header,\n });\n }\n const bodyText = typeof payload === 'string' ? payload : new TextDecoder().decode(payload);\n return { signedPayload: `${parts.t}.${bodyText}`, parts: parts as { t: string; v1: string } };\n }\n\n private assertValid(\n parts: { t: string; v1: string },\n expected: string,\n header: string,\n signedPayload: string,\n options: VerifyOptions\n ): void {\n if (!constantTimeEqualsHex(parts.v1, expected)) {\n throw new WassistSignatureVerificationError({\n message: 'Webhook signature did not match the expected value.',\n header,\n payload: signedPayload,\n });\n }\n const tolerance = options.tolerance ?? DEFAULT_TOLERANCE_SECONDS;\n if (tolerance > 0) {\n const now = options.currentTimestamp ?? Math.floor(Date.now() / 1000);\n const ts = Number(parts.t);\n if (!Number.isFinite(ts)) {\n throw new WassistSignatureVerificationError({\n message: `Invalid timestamp in X-Wassist-Signature: ${parts.t}`,\n header,\n });\n }\n if (Math.abs(now - ts) > tolerance) {\n throw new WassistSignatureVerificationError({\n message: `Webhook timestamp is outside the ${tolerance}s tolerance window (received ${ts}, now ${now}).`,\n header,\n });\n }\n }\n }\n\n private parseEvent(payload: string | Uint8Array): WassistEvent {\n const text =\n typeof payload === 'string' ? payload : new TextDecoder().decode(payload);\n try {\n return JSON.parse(text) as WassistEvent;\n } catch (err) {\n throw new WassistSignatureVerificationError({\n message: 'Failed to parse webhook payload as JSON.',\n payload: text,\n cause: err,\n });\n }\n }\n}\n\n// =============================================================================\n// Module-level helpers\n// =============================================================================\n\nfunction parseHeader(header: string): Partial<{ t: string; v1: string }> {\n const parts: Partial<Record<string, string>> = {};\n for (const segment of header.split(',')) {\n const eq = segment.indexOf('=');\n if (eq === -1) continue;\n const key = segment.slice(0, eq).trim();\n const value = segment.slice(eq + 1).trim();\n if (key === 't' || key === 'v1') parts[key] = value;\n }\n return parts as Partial<{ t: string; v1: string }>;\n}\n\nfunction constantTimeEqualsHex(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) {\n diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return diff === 0;\n}\n\nfunction toHex(bytes: Uint8Array): string {\n let out = '';\n for (let i = 0; i < bytes.length; i++) {\n const v = bytes[i] ?? 0;\n out += v.toString(16).padStart(2, '0');\n }\n return out;\n}\n\n/**\n * The singleton `webhooks` namespace exposed on the {@link Wassist} class.\n * Statically importable for stateless use.\n */\nexport const webhooks = new Webhooks();\n\n// =============================================================================\n// node:crypto loader\n// =============================================================================\n\ntype NodeCrypto = {\n createHmac: (alg: string, key: string) => {\n update: (data: string) => { digest: (enc: 'hex') => string };\n };\n};\n\nlet cachedNodeCrypto: NodeCrypto | null | undefined;\n\n/**\n * `__sdkRequire` is injected by the tsup banner — see `tsup.config.ts`.\n * In ESM it's a `createRequire(import.meta.url)`; in CJS it's the\n * ambient `require`. Both can resolve `node:crypto` synchronously.\n *\n * @internal\n */\ndeclare const __sdkRequire: ((id: string) => unknown) | undefined;\n\n/**\n * Lazily load `node:crypto` without forcing it into the dep graph for\n * runtimes that lack it (Cloudflare Workers, the browser). Returns\n * `undefined` if `node:crypto` cannot be resolved; the caller falls back\n * to {@link Webhooks.constructEventAsync}.\n *\n * @internal\n */\nfunction loadNodeCrypto(): NodeCrypto | undefined {\n if (cachedNodeCrypto !== undefined) return cachedNodeCrypto ?? undefined;\n try {\n const req: ((id: string) => unknown) | undefined =\n typeof __sdkRequire === 'function'\n ? __sdkRequire\n : (globalThis as { require?: (id: string) => unknown }).require;\n cachedNodeCrypto = (req?.('node:crypto') as NodeCrypto | undefined) ?? null;\n } catch {\n cachedNodeCrypto = null;\n }\n return cachedNodeCrypto ?? undefined;\n}\n","import { HttpClient, type WassistClientConfig } from './http';\nimport { AgentsResource } from './resources/agents';\nimport { ConversationsResource } from './resources/conversations';\nimport { PhoneNumbersResource } from './resources/phone-numbers';\nimport { WhatsAppAccountsResource } from './resources/whatsapp-accounts';\nimport { WhatsAppLinkSessionsResource } from './resources/whatsapp-link-sessions';\nimport { WhatsAppTemplatesResource } from './resources/whatsapp-templates';\nimport { Webhooks, webhooks as webhooksSingleton } from './webhooks';\n\n/**\n * The Wassist API client.\n *\n * @example\n * ```ts\n * import { Wassist } from '@wassist/sdk';\n *\n * const wassist = new Wassist({ apiKey: process.env.WASSIST_API_KEY! });\n *\n * const agent = await wassist.agents.create({ name: 'Sales Assistant' });\n *\n * for await (const conv of wassist.conversations.list()) {\n * console.log(conv.id);\n * }\n * ```\n */\nexport class Wassist {\n /** Create and manage AI agents. */\n readonly agents: AgentsResource;\n /** Send messages and manage conversations (with nested `messages` resource). */\n readonly conversations: ConversationsResource;\n /** Manage your connected WhatsApp phone numbers and their routing. */\n readonly phoneNumbers: PhoneNumbersResource;\n /** Manage WhatsApp Business Accounts. */\n readonly whatsappAccounts: WhatsAppAccountsResource;\n /** Manage hosted WhatsApp account-linking sessions. */\n readonly whatsappLinkSessions: WhatsAppLinkSessionsResource;\n /** Manage WhatsApp message templates. */\n readonly whatsappTemplates: WhatsAppTemplatesResource;\n /** Verify inbound webhook signatures. */\n readonly webhooks: Webhooks = webhooksSingleton;\n\n /**\n * Webhook helpers — usable without instantiating a client.\n *\n * @example\n * ```ts\n * const event = Wassist.webhooks.constructEvent(body, header, secret);\n * ```\n */\n static readonly webhooks: Webhooks = webhooksSingleton;\n\n constructor(config: WassistClientConfig) {\n const http = new HttpClient(config);\n this.agents = new AgentsResource(http);\n this.conversations = new ConversationsResource(http);\n this.phoneNumbers = new PhoneNumbersResource(http);\n this.whatsappAccounts = new WhatsAppAccountsResource(http);\n this.whatsappLinkSessions = new WhatsAppLinkSessionsResource(http);\n this.whatsappTemplates = new WhatsAppTemplatesResource(http);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/http.ts","../src/pagination.ts","../src/resources/agents.ts","../src/resources/messages.ts","../src/resources/conversations.ts","../src/resources/phone-numbers.ts","../src/resources/whatsapp-accounts.ts","../src/resources/whatsapp-link-sessions.ts","../src/resources/whatsapp-templates.ts","../src/webhooks.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Error hierarchy for the Wassist SDK.\n *\n * Every network response and webhook signature failure surfaces as a subclass\n * of {@link WassistError}, so consumers can branch on `instanceof` (Stripe\n * convention) and read `statusCode`, `code`, `requestId`, and the raw body.\n */\n\nexport interface WassistErrorOptions {\n message: string;\n statusCode?: number;\n code?: string;\n requestId?: string;\n raw?: unknown;\n cause?: unknown;\n}\n\nexport class WassistError extends Error {\n /** HTTP status code if this error originated from an API response. */\n readonly statusCode?: number;\n /** Machine-readable error code (e.g. `not_found`) when the API provides one. */\n readonly code?: string;\n /**\n * Request ID surfaced by the Wassist API in the `X-Request-Id` response\n * header. Include this when filing support tickets.\n */\n readonly requestId?: string;\n /** Raw response body, parsed as JSON when possible. */\n readonly raw?: unknown;\n\n constructor(opts: WassistErrorOptions) {\n super(opts.message);\n this.name = new.target.name;\n this.statusCode = opts.statusCode;\n this.code = opts.code;\n this.requestId = opts.requestId;\n this.raw = opts.raw;\n if (opts.cause !== undefined) {\n (this as { cause?: unknown }).cause = opts.cause;\n }\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 401 Unauthorized — the API key was missing, malformed, or revoked. */\nexport class WassistAuthenticationError extends WassistError {}\n\n/** 403 Forbidden — the API key lacks permission for this resource. */\nexport class WassistPermissionError extends WassistError {}\n\n/** 400 / 422 — the request body or parameters were invalid. */\nexport class WassistInvalidRequestError extends WassistError {}\n\n/** 404 Not Found — the requested resource does not exist. */\nexport class WassistNotFoundError extends WassistError {}\n\n/** 409 Conflict — the request conflicts with the current state. */\nexport class WassistConflictError extends WassistError {}\n\n/** 429 Too Many Requests — slow down or wait `retryAfter` seconds. */\nexport class WassistRateLimitError extends WassistError {\n /** Suggested wait in seconds, from the `Retry-After` response header. */\n readonly retryAfter?: number;\n\n constructor(opts: WassistErrorOptions & { retryAfter?: number }) {\n super(opts);\n this.retryAfter = opts.retryAfter;\n }\n}\n\n/** 5xx — something is wrong on Wassist's side. The SDK retries these automatically. */\nexport class WassistAPIError extends WassistError {}\n\n/** A network-level failure (DNS, TCP, TLS, abort, etc.) — never made it to the server. */\nexport class WassistConnectionError extends WassistError {}\n\n/** The request exceeded the configured `timeout`. */\nexport class WassistTimeoutError extends WassistError {}\n\n/**\n * Webhook signature could not be verified.\n *\n * Thrown by {@link Wassist.webhooks.constructEvent} when the header is\n * malformed, the HMAC doesn't match, or the timestamp falls outside the\n * tolerance window.\n */\nexport class WassistSignatureVerificationError extends WassistError {\n /** The raw `X-Wassist-Signature` header value as received. */\n readonly header?: string;\n /** The payload that was verified, as the SDK saw it. */\n readonly payload?: string;\n\n constructor(\n opts: WassistErrorOptions & { header?: string; payload?: string }\n ) {\n super(opts);\n this.header = opts.header;\n this.payload = opts.payload;\n }\n}\n\n/**\n * Map an HTTP status code + response body to the most specific error class.\n *\n * @internal\n */\nexport function errorFromResponse(args: {\n status: number;\n body: unknown;\n requestId?: string;\n retryAfter?: number;\n}): WassistError {\n const { status, body, requestId, retryAfter } = args;\n\n const message = extractMessage(body) ?? `HTTP ${status}`;\n const code = extractCode(body);\n const base = { message, statusCode: status, code, requestId, raw: body };\n\n if (status === 401) return new WassistAuthenticationError(base);\n if (status === 403) return new WassistPermissionError(base);\n if (status === 404) return new WassistNotFoundError(base);\n if (status === 409) return new WassistConflictError(base);\n if (status === 429) return new WassistRateLimitError({ ...base, retryAfter });\n if (status === 400 || status === 422) {\n return new WassistInvalidRequestError(base);\n }\n if (status >= 500 && status < 600) return new WassistAPIError(base);\n return new WassistError(base);\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const b = body as Record<string, unknown>;\n if (typeof b.error === 'string') return b.error;\n if (typeof b.message === 'string') return b.message;\n if (typeof b.detail === 'string') return b.detail;\n if (b.error && typeof b.error === 'object') {\n const inner = (b.error as Record<string, unknown>).message;\n if (typeof inner === 'string') return inner;\n }\n return undefined;\n}\n\nfunction extractCode(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const b = body as Record<string, unknown>;\n if (typeof b.code === 'string') return b.code;\n return undefined;\n}\n","/**\n * The package version, embedded into the `User-Agent` header on every\n * outbound request so Wassist can correlate API traffic with SDK versions.\n *\n * Updated in lockstep with `package.json`'s `version` field.\n */\nexport const SDK_VERSION = '0.1.2';\n","/**\n * Low-level HTTP transport used by every resource module.\n *\n * Wraps `fetch` with:\n * - `X-API-Key` authentication\n * - `/api/v1/` path prefix handling\n * - Per-request timeout (cancels via `AbortController`)\n * - Exponential-backoff retries on `429` and `5xx` (honors `Retry-After`)\n * - `Idempotency-Key` opt-in for safe `POST` retries\n * - Typed error mapping via {@link errorFromResponse}\n * - `requestId` extraction from the `X-Request-Id` response header\n */\n\nimport {\n WassistConnectionError,\n WassistError,\n WassistRateLimitError,\n WassistTimeoutError,\n errorFromResponse,\n} from './errors';\nimport type { RequestOptions } from './types/common';\nimport { SDK_VERSION } from './version';\n\n/**\n * The minimal `fetch` signature this SDK depends on. Any spec-compliant\n * implementation will satisfy it — Node 18+, edge runtimes, browsers, Bun.\n */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\n/**\n * Configuration for {@link Wassist}.\n */\nexport interface WassistClientConfig {\n /**\n * Your Wassist API key. Find it at\n * https://wassist.app/settings → API Keys.\n */\n apiKey: string;\n /**\n * Base URL of the Wassist API.\n *\n * @default 'https://backend.wassist.app'\n */\n baseUrl?: string;\n /**\n * Default request timeout in milliseconds. Individual calls can override\n * via the per-call `timeout` option.\n *\n * @default 60_000\n */\n timeout?: number;\n /**\n * Maximum number of retry attempts on `429` / `5xx` / network errors.\n * The total number of requests is `maxRetries + 1`.\n *\n * @default 2\n */\n maxRetries?: number;\n /**\n * Custom `fetch` implementation. Useful for tests, mocking, or runtimes\n * that don't expose `globalThis.fetch`.\n *\n * @default globalThis.fetch\n */\n fetch?: FetchLike;\n}\n\nconst DEFAULT_BASE_URL = 'https://backend.wassist.app';\nconst DEFAULT_TIMEOUT_MS = 60_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst API_VERSION_PREFIX = '/api/v1';\nconst RETRY_STATUSES: ReadonlySet<number> = new Set([408, 425, 429, 500, 502, 503, 504]);\n\n/** Query-string values supported on every request. */\nexport type QueryValue = string | number | boolean | undefined | null;\n\n/** A loose-record shape for query strings — every field is optional and stringly-typed. */\nexport type QueryParams = { readonly [key: string]: QueryValue };\n\ninterface RequestArgs {\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n query?: object;\n body?: unknown;\n options?: RequestOptions;\n}\n\n/**\n * @internal\n */\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: FetchLike;\n\n constructor(config: WassistClientConfig) {\n if (!config.apiKey) {\n throw new WassistError({\n message:\n 'A Wassist `apiKey` is required. Create one at https://wassist.app/settings.',\n });\n }\n this.apiKey = config.apiKey;\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT_MS;\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n const provided = config.fetch ?? globalThis.fetch?.bind(globalThis);\n if (!provided) {\n throw new WassistError({\n message:\n 'No `fetch` implementation found. Pass one via `fetch` in the Wassist constructor, or run on Node 18+ / a runtime with a global `fetch`.',\n });\n }\n this.fetchImpl = provided;\n }\n\n get<T>(path: string, args?: Omit<RequestArgs, 'method' | 'path' | 'body'>): Promise<T> {\n return this.request<T>({ ...args, method: 'GET', path });\n }\n post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>({ method: 'POST', path, body, options });\n }\n put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>({ method: 'PUT', path, body, options });\n }\n patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>({ method: 'PATCH', path, body, options });\n }\n delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>({ method: 'DELETE', path, options });\n }\n\n private async request<T>(args: RequestArgs): Promise<T> {\n const url = this.buildUrl(args.path, args.query);\n const headers = this.buildHeaders(args);\n const body = args.body === undefined ? undefined : JSON.stringify(args.body);\n const maxRetries = args.options?.maxRetries ?? this.maxRetries;\n const timeout = args.options?.timeout ?? this.timeout;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const response = await this.doFetch({\n url,\n method: args.method,\n headers,\n body,\n timeout,\n signal: args.options?.signal,\n });\n\n if (response.ok) {\n if (response.status === 204) return undefined as T;\n // Some endpoints return empty bodies — handle gracefully.\n const text = await response.text();\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n }\n\n // Build a typed error and decide whether to retry.\n const requestId = response.headers.get('x-request-id') ?? undefined;\n const retryAfter = parseRetryAfter(response.headers.get('retry-after'));\n const parsedBody = await safeJson(response);\n const apiError = errorFromResponse({\n status: response.status,\n body: parsedBody,\n requestId,\n retryAfter,\n });\n\n const isRetryable = RETRY_STATUSES.has(response.status);\n if (isRetryable && attempt < maxRetries) {\n await sleep(computeBackoff(attempt, apiError));\n lastError = apiError;\n continue;\n }\n throw apiError;\n } catch (err) {\n if (err instanceof WassistError) {\n // Already a typed SDK error from the branch above.\n if (\n attempt < maxRetries &&\n (err instanceof WassistRateLimitError || isRetryableApiError(err))\n ) {\n await sleep(computeBackoff(attempt, err));\n lastError = err;\n continue;\n }\n throw err;\n }\n\n // Map fetch-level failures.\n const mapped = mapFetchError(err);\n if (attempt < maxRetries && isRetryableTransport(mapped)) {\n await sleep(computeBackoff(attempt));\n lastError = mapped;\n continue;\n }\n throw mapped;\n }\n }\n // Should be unreachable — every path above either returns or throws.\n throw lastError instanceof Error\n ? lastError\n : new WassistError({ message: 'Wassist request failed after retries.' });\n }\n\n private buildUrl(path: string, query?: object): string {\n const prefixedPath = path.startsWith('/') ? path : `/${path}`;\n const fullPath = prefixedPath.startsWith(API_VERSION_PREFIX)\n ? prefixedPath\n : `${API_VERSION_PREFIX}${prefixedPath}`;\n const url = new URL(this.baseUrl + fullPath);\n if (query) {\n for (const [key, value] of Object.entries(query as Record<string, QueryValue>)) {\n if (value === undefined || value === null) continue;\n url.searchParams.append(key, String(value));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(args: RequestArgs): Record<string, string> {\n const headers: Record<string, string> = {\n 'X-API-Key': this.apiKey,\n 'Accept': 'application/json',\n 'User-Agent': `wassist-sdk-node/${SDK_VERSION}`,\n 'X-Wassist-Client': `wassist-sdk-node/${SDK_VERSION}`,\n };\n if (args.body !== undefined) headers['Content-Type'] = 'application/json';\n if (args.options?.idempotencyKey) {\n headers['Idempotency-Key'] = args.options.idempotencyKey;\n }\n if (args.options?.headers) {\n for (const [k, v] of Object.entries(args.options.headers)) headers[k] = v;\n }\n return headers;\n }\n\n private async doFetch(args: {\n url: string;\n method: string;\n headers: Record<string, string>;\n body?: string;\n timeout: number;\n signal?: AbortSignal;\n }): Promise<Response> {\n const controller = new AbortController();\n const onAbort = () => controller.abort();\n if (args.signal) {\n if (args.signal.aborted) controller.abort();\n else args.signal.addEventListener('abort', onAbort, { once: true });\n }\n const timeoutId = setTimeout(() => controller.abort(), args.timeout);\n try {\n return await this.fetchImpl(args.url, {\n method: args.method,\n headers: args.headers,\n body: args.body,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n if (args.signal) args.signal.removeEventListener('abort', onAbort);\n }\n }\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction safeJson(response: Response): Promise<unknown> {\n return response\n .text()\n .then((text) => {\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n })\n .catch(() => undefined);\n}\n\nfunction parseRetryAfter(value: string | null): number | undefined {\n if (!value) return undefined;\n const asNum = Number(value);\n if (Number.isFinite(asNum) && asNum >= 0) return asNum;\n const asDate = Date.parse(value);\n if (Number.isNaN(asDate)) return undefined;\n return Math.max(0, Math.floor((asDate - Date.now()) / 1000));\n}\n\nfunction computeBackoff(attempt: number, err?: WassistError): number {\n // Honor server-supplied Retry-After (seconds) when present.\n if (err instanceof WassistRateLimitError && typeof err.retryAfter === 'number') {\n return err.retryAfter * 1000;\n }\n // Exponential backoff with full jitter: random in [base, 2 * base).\n const base = 500 * Math.pow(2, attempt);\n const jitter = base * Math.random();\n return Math.min(base + jitter, 8_000);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isRetryableApiError(err: WassistError): boolean {\n return err.statusCode !== undefined && RETRY_STATUSES.has(err.statusCode);\n}\n\nfunction isRetryableTransport(err: WassistError): boolean {\n return err instanceof WassistConnectionError;\n}\n\nfunction mapFetchError(err: unknown): WassistError {\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n return new WassistTimeoutError({\n message: 'Request timed out.',\n cause: err,\n });\n }\n return new WassistConnectionError({\n message: `Network error: ${err.message}`,\n cause: err,\n });\n }\n return new WassistConnectionError({ message: 'Unknown network error.' });\n}\n","import type { PageParams, PaginatedResponse, RequestOptions } from './types/common';\n\n/**\n * The shape of a single fetched page, returned by {@link AutoPaginatedList.firstPage}.\n */\nexport interface Page<T> {\n /** The items on this page. */\n data: T[];\n /** Total number of items across all pages. */\n totalCount: number;\n /** Whether there is at least one more page after this one. */\n hasMore: boolean;\n /** Offset to pass to the next call to continue from this page. */\n nextOffset: number;\n}\n\n/**\n * Lazy auto-paginating wrapper around any Wassist list endpoint.\n *\n * Iteration is lazy — pages are fetched on demand as you consume them, so\n * `for await` over a million-item list never has the whole result set in\n * memory.\n *\n * @example Iterate every item\n * ```ts\n * for await (const conv of wassist.conversations.list({ limit: 100 })) {\n * console.log(conv.id);\n * }\n * ```\n *\n * @example Just the first page\n * ```ts\n * const { data, hasMore } = await wassist.conversations.list().firstPage();\n * ```\n *\n * @example Collect everything into an array (small lists only)\n * ```ts\n * const all = await wassist.agents.list().all();\n * ```\n */\nexport class AutoPaginatedList<T> implements AsyncIterable<T> {\n private readonly fetchPage: (params: PageParams) => Promise<PaginatedResponse<T>>;\n private readonly params: PageParams;\n private readonly options: RequestOptions | undefined;\n\n /** @internal */\n constructor(\n fetchPage: (params: PageParams) => Promise<PaginatedResponse<T>>,\n params: PageParams = {},\n options?: RequestOptions\n ) {\n this.fetchPage = fetchPage;\n this.params = params;\n this.options = options;\n }\n\n /**\n * Async iterator over every item across every page, fetched lazily.\n */\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n const limit = this.params.limit ?? 50;\n let offset = this.params.offset ?? 0;\n let hasMore = true;\n\n while (hasMore) {\n const page = await this.fetchPage({ limit, offset });\n for (const item of page.results) yield item;\n hasMore = page.next !== null && page.results.length > 0;\n offset += page.results.length || limit;\n }\n }\n\n /**\n * Fetch the first page only and return it as a {@link Page}.\n */\n async firstPage(): Promise<Page<T>> {\n const limit = this.params.limit ?? 50;\n const offset = this.params.offset ?? 0;\n const page = await this.fetchPage({ limit, offset });\n return {\n data: page.results,\n totalCount: page.count,\n hasMore: page.next !== null,\n nextOffset: offset + page.results.length,\n };\n }\n\n /**\n * Walk every page and collect every item into a single array.\n *\n * Convenient for small lists; for large ones prefer `for await`.\n */\n async all(): Promise<T[]> {\n const out: T[] = [];\n for await (const item of this) out.push(item);\n return out;\n }\n}\n\n// Re-export for resource modules.\nexport type { RequestOptions };\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n Agent,\n CreateAgentInput,\n CreateBYOAAgentInput,\n UpdateAgentInput,\n} from '../types/agents';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Methods for managing agents — the AI personas you connect to WhatsApp.\n *\n * Documented at https://docs.wassist.app/api-reference/agents/list.\n */\nexport class AgentsResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every agent on your account.\n *\n * Returns a lazily-fetched paginated list. Use `for await` to walk all\n * pages, or `.firstPage()` for just the first.\n *\n * `GET /agents/`\n *\n * @example\n * ```ts\n * for await (const agent of wassist.agents.list()) {\n * console.log(agent.id, agent.name);\n * }\n * ```\n */\n list(params: PageParams = {}, options?: RequestOptions): AutoPaginatedList<Agent> {\n return new AutoPaginatedList<Agent>(\n (p) => this.http.get<PaginatedResponse<Agent>>('/agents/', { query: p, options }),\n params,\n options\n );\n }\n\n /**\n * Retrieve a single agent by ID.\n *\n * `GET /agents/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<Agent> {\n return this.http.get<Agent>(`/agents/${encodeURIComponent(id)}/`, { options });\n }\n\n /**\n * Create a new agent with the given display name. Configure it further\n * with {@link AgentsResource.update}.\n *\n * `POST /agents/`\n */\n create(input: CreateAgentInput, options?: RequestOptions): Promise<Agent> {\n return this.http.post<Agent>('/agents/', input, options);\n }\n\n /**\n * Create a Bring-Your-Own-Agent (BYOA) — Wassist forwards inbound\n * messages to your webhook and posts back replies you author yourself.\n *\n * `POST /agents/byoa/`\n */\n createBYOA(input: CreateBYOAAgentInput, options?: RequestOptions): Promise<Agent> {\n return this.http.post<Agent>('/agents/byoa/', input, options);\n }\n\n /**\n * Partially update an agent. Only the fields you pass are modified.\n *\n * Nested sub-resource arrays (tools, memory keys, etc.) are diffed\n * server-side by `id`: include an `id` to update an existing entry,\n * omit it to create one.\n *\n * `PATCH /agents/{id}/`\n */\n update(id: UUID, input: UpdateAgentInput, options?: RequestOptions): Promise<Agent> {\n return this.http.patch<Agent>(`/agents/${encodeURIComponent(id)}/`, input, options);\n }\n\n /**\n * Soft-delete an agent. The agent stops responding immediately;\n * conversation history is retained.\n *\n * `DELETE /agents/{id}/`\n */\n delete(id: UUID, options?: RequestOptions): Promise<void> {\n return this.http.delete<void>(`/agents/${encodeURIComponent(id)}/`, options);\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type { Message, SendMessageInput } from '../types/messages';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Messages within a conversation. Reached via `wassist.conversations.messages`.\n *\n * Documented at https://docs.wassist.app/api-reference/conversations/messages/list\n * and https://docs.wassist.app/api-reference/conversations/messages/send.\n */\nexport class MessagesResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List messages in a conversation, newest first.\n *\n * `GET /conversations/{id}/messages/`\n */\n list(\n conversationId: UUID,\n params: PageParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<Message> {\n const path = `/conversations/${encodeURIComponent(conversationId)}/messages/`;\n return new AutoPaginatedList<Message>(\n (p) => this.http.get<PaginatedResponse<Message>>(path, { query: p, options }),\n params,\n options\n );\n }\n\n /**\n * Send a message in a conversation.\n *\n * The input is a discriminated union — set `type` and populate the\n * matching field (`text`, `template`, `cta`, or `unified`).\n *\n * `POST /conversations/{id}/messages/`\n *\n * @example Plain text\n * ```ts\n * await wassist.conversations.messages.send(conv.id, {\n * type: 'text',\n * text: { body: 'Hello!' },\n * });\n * ```\n *\n * @example Approved template\n * ```ts\n * await wassist.conversations.messages.send(conv.id, {\n * type: 'template',\n * template: { name: 'order_update', variables: { body: ['Alex', '#1234'] } },\n * });\n * ```\n */\n send(\n conversationId: UUID,\n input: SendMessageInput,\n options?: RequestOptions\n ): Promise<Message> {\n const path = `/conversations/${encodeURIComponent(conversationId)}/messages/`;\n return this.http.post<Message>(path, input, options);\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n Conversation,\n CreateConversationInput,\n ListConversationsParams,\n SubscribeConversationInput,\n} from '../types/conversations';\nimport type { PromptAgentInput } from '../types/messages';\nimport type { PaginatedResponse, RequestOptions, UUID } from '../types/common';\nimport { MessagesResource } from './messages';\n\n/**\n * Methods for managing conversations — ongoing WhatsApp chats between\n * your numbers and a contact.\n *\n * Nested namespace: `wassist.conversations.messages` (see {@link MessagesResource}).\n */\nexport class ConversationsResource {\n /** Send and list messages within a conversation. */\n readonly messages: MessagesResource;\n\n /** @internal */\n constructor(private readonly http: HttpClient) {\n this.messages = new MessagesResource(http);\n }\n\n /**\n * List conversations on your account with rich filtering.\n *\n * `GET /conversations/`\n *\n * @example\n * ```ts\n * const recent = await wassist.conversations\n * .list({ ordering: '-last_message_time', limit: 20 })\n * .firstPage();\n * ```\n */\n list(\n params: ListConversationsParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<Conversation> {\n const { limit, offset, ...filters } = params;\n return new AutoPaginatedList<Conversation>(\n (p) =>\n this.http.get<PaginatedResponse<Conversation>>('/conversations/', {\n query: { ...filters, ...p },\n options,\n }),\n { limit, offset },\n options\n );\n }\n\n /**\n * Retrieve a single conversation by ID.\n *\n * `GET /conversations/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<Conversation> {\n return this.http.get<Conversation>(`/conversations/${encodeURIComponent(id)}/`, {\n options,\n });\n }\n\n /**\n * Create a new conversation with a contact.\n *\n * If the WhatsApp 24-hour reply window is closed for this contact, you\n * must include a `template` message to open it.\n *\n * `POST /conversations/`\n */\n create(input: CreateConversationInput, options?: RequestOptions): Promise<Conversation> {\n return this.http.post<Conversation>('/conversations/', input, options);\n }\n\n /**\n * Prompt the agent in this conversation with a custom instruction.\n * Equivalent to \"wake the agent up and have it say this\" — useful for\n * outbound triggers and follow-ups.\n *\n * `POST /conversations/{id}/prompt/`\n */\n prompt(id: UUID, input: PromptAgentInput, options?: RequestOptions): Promise<void> {\n return this.http.post<void>(\n `/conversations/${encodeURIComponent(id)}/prompt/`,\n input,\n options\n );\n }\n\n /**\n * Send a WhatsApp read receipt for the most recent inbound message.\n *\n * `POST /conversations/{id}/read/`\n */\n read(id: UUID, options?: RequestOptions): Promise<Conversation> {\n return this.http.post<Conversation>(\n `/conversations/${encodeURIComponent(id)}/read/`,\n undefined,\n options\n );\n }\n\n /**\n * Display the WhatsApp typing indicator on the contact's device.\n *\n * Note: WhatsApp also marks the most recent inbound message as read as\n * a side effect — this is a platform limitation.\n *\n * `POST /conversations/{id}/typing/`\n */\n typing(id: UUID, options?: RequestOptions): Promise<Conversation> {\n return this.http.post<Conversation>(\n `/conversations/${encodeURIComponent(id)}/typing/`,\n undefined,\n options\n );\n }\n\n /**\n * Route this conversation to a webhook. The agent pipeline is skipped\n * while the override is active.\n *\n * Fires a `subscription.activated` event on the target webhook.\n *\n * `POST /conversations/{id}/subscribe/`\n */\n subscribe(\n id: UUID,\n input: SubscribeConversationInput,\n options?: RequestOptions\n ): Promise<Conversation> {\n return this.http.post<Conversation>(\n `/conversations/${encodeURIComponent(id)}/subscribe/`,\n input,\n options\n );\n }\n\n /**\n * Clear the per-conversation routing override and fall back to the\n * phone number's default routing.\n *\n * Fires a `subscription.revoked` event on the previously-subscribed\n * webhook (if any).\n *\n * `POST /conversations/{id}/unsubscribe/`\n */\n unsubscribe(id: UUID, options?: RequestOptions): Promise<Conversation> {\n return this.http.post<Conversation>(\n `/conversations/${encodeURIComponent(id)}/unsubscribe/`,\n undefined,\n options\n );\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n ConnectAgentInput,\n PhoneNumber,\n PhoneNumberBusinessProfile,\n SubscribePhoneNumberInput,\n UnsubscribePhoneNumberInput,\n} from '../types/phone-numbers';\nimport type { PageParams, PaginatedResponse, RequestOptions } from '../types/common';\n\n/**\n * Methods for managing your connected WhatsApp phone numbers and their\n * default routing.\n *\n * The `number` argument throughout is the E.164-format number without a\n * leading `+` (matches the {@link PhoneNumber.number} field).\n */\nexport class PhoneNumbersResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every WhatsApp number on your account.\n *\n * `GET /phone-numbers/`\n */\n list(params: PageParams = {}, options?: RequestOptions): AutoPaginatedList<PhoneNumber> {\n return new AutoPaginatedList<PhoneNumber>(\n (p) =>\n this.http.get<PaginatedResponse<PhoneNumber>>('/phone-numbers/', {\n query: p,\n options,\n }),\n params,\n options\n );\n }\n\n /**\n * View the WhatsApp Business Profile (about, address, websites, etc.)\n * attached to this number.\n *\n * `GET /phone-numbers/{number}/business-profile/`\n */\n getBusinessProfile(\n number: string,\n options?: RequestOptions\n ): Promise<PhoneNumberBusinessProfile> {\n return this.http.get<PhoneNumberBusinessProfile>(\n `/phone-numbers/${encodeURIComponent(number)}/business-profile/`,\n { options }\n );\n }\n\n /**\n * Route inbound messages on this number to a webhook by default. Drops\n * any agent previously connected to the number.\n *\n * Phone-number routing changes do **not** fire\n * `subscription.activated` / `.revoked` webhook events — those are\n * reserved for per-conversation\n * {@link ConversationsResource.subscribe} /\n * {@link ConversationsResource.unsubscribe}.\n *\n * `POST /phone-numbers/{number}/subscribe/`\n */\n subscribe(\n number: string,\n input: SubscribePhoneNumberInput,\n options?: RequestOptions\n ): Promise<PhoneNumber> {\n return this.http.post<PhoneNumber>(\n `/phone-numbers/${encodeURIComponent(number)}/subscribe/`,\n input,\n options\n );\n }\n\n /**\n * Assign an agent as the default for this number. Drops any subscribed\n * webhook.\n *\n * The agent must already be owned by or shared with the authenticated\n * user.\n *\n * `POST /phone-numbers/{number}/connect-agent/`\n */\n connectAgent(\n number: string,\n input: ConnectAgentInput,\n options?: RequestOptions\n ): Promise<PhoneNumber> {\n return this.http.post<PhoneNumber>(\n `/phone-numbers/${encodeURIComponent(number)}/connect-agent/`,\n input,\n options\n );\n }\n\n /**\n * Clear default routing on this number entirely. Drops both the agent\n * and the webhook.\n *\n * `POST /phone-numbers/{number}/unsubscribe/`\n */\n unsubscribe(\n number: string,\n input: UnsubscribePhoneNumberInput = {},\n options?: RequestOptions\n ): Promise<PhoneNumber> {\n return this.http.post<PhoneNumber>(\n `/phone-numbers/${encodeURIComponent(number)}/unsubscribe/`,\n input,\n options\n );\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n AddNumberInput,\n AvailableNumbersResponse,\n WhatsAppAccount,\n} from '../types/whatsapp-accounts';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Methods for managing WhatsApp Business Accounts (WABAs) connected to\n * your Wassist account.\n */\nexport class WhatsAppAccountsResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every WhatsApp Business Account on your Wassist account.\n *\n * `GET /whatsapp-accounts/`\n */\n list(\n params: PageParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<WhatsAppAccount> {\n return new AutoPaginatedList<WhatsAppAccount>(\n (p) =>\n this.http.get<PaginatedResponse<WhatsAppAccount>>('/whatsapp-accounts/', {\n query: p,\n options,\n }),\n params,\n options\n );\n }\n\n /**\n * Retrieve a single WhatsApp Business Account by ID.\n *\n * `GET /whatsapp-accounts/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<WhatsAppAccount> {\n return this.http.get<WhatsAppAccount>(\n `/whatsapp-accounts/${encodeURIComponent(id)}/`,\n { options }\n );\n }\n\n /**\n * Add a pre-verified phone number (purchased via Meta's embedded\n * signup flow) to a WhatsApp Business Account.\n *\n * `POST /whatsapp-accounts/{id}/add-number/`\n */\n addNumber(\n id: UUID,\n input: AddNumberInput,\n options?: RequestOptions\n ): Promise<WhatsAppAccount> {\n return this.http.post<WhatsAppAccount>(\n `/whatsapp-accounts/${encodeURIComponent(id)}/add-number/`,\n input,\n options\n );\n }\n\n /**\n * List Twilio phone numbers available for purchase + verification.\n *\n * `GET /available-numbers/`\n */\n availableNumbers(options?: RequestOptions): Promise<AvailableNumbersResponse> {\n return this.http.get<AvailableNumbersResponse>('/available-numbers/', { options });\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n CreateWhatsAppLinkSessionInput,\n WhatsAppLinkSession,\n} from '../types/whatsapp-link-sessions';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Methods for managing WhatsApp account-linking sessions — the hosted\n * flow that lets your customers connect their own WABA to your platform.\n */\nexport class WhatsAppLinkSessionsResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every link session you've created.\n *\n * `GET /whatsapp-link-sessions/`\n */\n list(\n params: PageParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<WhatsAppLinkSession> {\n return new AutoPaginatedList<WhatsAppLinkSession>(\n (p) =>\n this.http.get<PaginatedResponse<WhatsAppLinkSession>>(\n '/whatsapp-link-sessions/',\n { query: p, options }\n ),\n params,\n options\n );\n }\n\n /**\n * Retrieve a single link session by ID.\n *\n * `GET /whatsapp-link-sessions/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<WhatsAppLinkSession> {\n return this.http.get<WhatsAppLinkSession>(\n `/whatsapp-link-sessions/${encodeURIComponent(id)}/`,\n { options }\n );\n }\n\n /**\n * Create a new link session. Direct the user to the returned `linkUrl`.\n *\n * `POST /whatsapp-link-sessions/`\n */\n create(\n input: CreateWhatsAppLinkSessionInput,\n options?: RequestOptions\n ): Promise<WhatsAppLinkSession> {\n return this.http.post<WhatsAppLinkSession>(\n '/whatsapp-link-sessions/',\n input,\n options\n );\n }\n\n /**\n * Expire a pending link session early. Useful for invalidating stale\n * URLs you've handed out to customers.\n *\n * `POST /whatsapp-link-sessions/{id}/expire/`\n */\n expire(id: UUID, options?: RequestOptions): Promise<WhatsAppLinkSession> {\n return this.http.post<WhatsAppLinkSession>(\n `/whatsapp-link-sessions/${encodeURIComponent(id)}/expire/`,\n undefined,\n options\n );\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n CreateWhatsAppTemplateInput,\n PublishWhatsAppTemplateInput,\n UnpublishWhatsAppTemplateInput,\n UpdateWhatsAppTemplateInput,\n WhatsAppTemplate,\n WhatsAppTemplateWithPublishResults,\n} from '../types/whatsapp-templates';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Methods for managing Wassist-side WhatsApp templates and publishing them\n * to your connected WABAs.\n */\nexport class WhatsAppTemplatesResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every template you've created in Wassist.\n *\n * `GET /whatsapp-templates/`\n */\n list(\n params: PageParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<WhatsAppTemplate> {\n return new AutoPaginatedList<WhatsAppTemplate>(\n (p) =>\n this.http.get<PaginatedResponse<WhatsAppTemplate>>('/whatsapp-templates/', {\n query: p,\n options,\n }),\n params,\n options\n );\n }\n\n /**\n * Retrieve a single template by ID.\n *\n * `GET /whatsapp-templates/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<WhatsAppTemplate> {\n return this.http.get<WhatsAppTemplate>(\n `/whatsapp-templates/${encodeURIComponent(id)}/`,\n { options }\n );\n }\n\n /**\n * Create a new template. Published per-WABA separately via {@link publish}.\n *\n * `POST /whatsapp-templates/`\n */\n create(\n input: CreateWhatsAppTemplateInput,\n options?: RequestOptions\n ): Promise<WhatsAppTemplate> {\n return this.http.post<WhatsAppTemplate>('/whatsapp-templates/', input, options);\n }\n\n /**\n * Update an existing template's metadata and components.\n *\n * `PATCH /whatsapp-templates/{id}/`\n */\n update(\n id: UUID,\n input: UpdateWhatsAppTemplateInput,\n options?: RequestOptions\n ): Promise<WhatsAppTemplate> {\n return this.http.patch<WhatsAppTemplate>(\n `/whatsapp-templates/${encodeURIComponent(id)}/`,\n input,\n options\n );\n }\n\n /**\n * Delete a template (and unpublish from every WABA it was published to).\n *\n * `DELETE /whatsapp-templates/{id}/`\n */\n delete(id: UUID, options?: RequestOptions): Promise<void> {\n return this.http.delete<void>(\n `/whatsapp-templates/${encodeURIComponent(id)}/`,\n options\n );\n }\n\n /**\n * Submit this template to one or more WABAs for approval.\n *\n * Returns the updated template, plus per-account `publishResults` /\n * `publishErrors`.\n *\n * `POST /whatsapp-templates/{id}/publish/`\n */\n publish(\n id: UUID,\n input: PublishWhatsAppTemplateInput,\n options?: RequestOptions\n ): Promise<WhatsAppTemplateWithPublishResults> {\n return this.http.post<WhatsAppTemplateWithPublishResults>(\n `/whatsapp-templates/${encodeURIComponent(id)}/publish/`,\n input,\n options\n );\n }\n\n /**\n * Remove this template from one or more WABAs.\n *\n * `POST /whatsapp-templates/{id}/unpublish/`\n */\n unpublish(\n id: UUID,\n input: UnpublishWhatsAppTemplateInput,\n options?: RequestOptions\n ): Promise<WhatsAppTemplateWithPublishResults> {\n return this.http.post<WhatsAppTemplateWithPublishResults>(\n `/whatsapp-templates/${encodeURIComponent(id)}/unpublish/`,\n input,\n options\n );\n }\n}\n","/**\n * Webhook signature verification.\n *\n * Implements the Stripe-style `t=<unix>,v1=<hex hmac sha256>` scheme\n * documented at https://docs.wassist.app/concepts/webhooks. Compute the HMAC of\n * `<timestamp>.<raw body>` with your webhook's signing secret and compare\n * it (in constant time) to the `v1` component of `X-Wassist-Signature`.\n *\n * This module exposes two helpers:\n *\n * - {@link Webhooks.constructEvent} — synchronous, uses `node:crypto` when\n * available (Node 18+).\n * - {@link Webhooks.constructEventAsync} — uses Web Crypto (`crypto.subtle`)\n * for runtimes that lack `node:crypto` (Cloudflare Workers, Deno, the\n * browser).\n */\n\nimport { WassistSignatureVerificationError } from './errors';\nimport type { WassistEvent } from './types/events';\n\nconst DEFAULT_TOLERANCE_SECONDS = 300;\n\ninterface VerifyOptions {\n /**\n * Maximum allowed difference between the server timestamp and `now`, in\n * seconds. Pass `0` to disable replay protection (not recommended).\n *\n * @default 300\n */\n tolerance?: number;\n /**\n * Override `now` for testing — defaults to `Date.now() / 1000`.\n * @internal\n */\n currentTimestamp?: number;\n}\n\n/**\n * Stripe-style webhook helpers.\n *\n * Use via the SDK class:\n *\n * ```ts\n * import { Wassist } from '@wassist/sdk';\n *\n * const wassist = new Wassist({ apiKey: process.env.WASSIST_API_KEY! });\n * const event = wassist.webhooks.constructEvent(rawBody, sigHeader, secret);\n * ```\n *\n * Or statically — no instance required for verification:\n *\n * ```ts\n * import { Wassist } from '@wassist/sdk';\n * const event = Wassist.webhooks.constructEvent(rawBody, sigHeader, secret);\n * ```\n */\nexport class Webhooks {\n /**\n * Verify the signature on a webhook delivery, parse the body, and return\n * the typed event.\n *\n * @param payload The raw request body, exactly as received — `string`,\n * `Buffer`, or `Uint8Array`. **Do not parse it first;**\n * even whitespace differences will break verification.\n * @param header The `X-Wassist-Signature` header value.\n * @param secret Your webhook signing secret. Find it in the\n * [Wassist dashboard](https://wassist.app/developers/webhooks).\n * @param options.tolerance Replay-protection window in seconds (default 300).\n * @throws {WassistSignatureVerificationError} When the header is malformed,\n * the HMAC doesn't match, or the timestamp is outside the tolerance window.\n */\n constructEvent(\n payload: string | Uint8Array,\n header: string | null | undefined,\n secret: string,\n options: VerifyOptions = {}\n ): WassistEvent {\n const { signedPayload, parts } = this.prepare(payload, header);\n const expected = this.signSync(signedPayload, secret);\n this.assertValid(parts, expected, header ?? '', signedPayload, options);\n return this.parseEvent(payload);\n }\n\n /**\n * Async variant of {@link constructEvent} that uses Web Crypto, for\n * runtimes that don't expose `node:crypto` (Cloudflare Workers, Deno,\n * the browser).\n */\n async constructEventAsync(\n payload: string | Uint8Array,\n header: string | null | undefined,\n secret: string,\n options: VerifyOptions = {}\n ): Promise<WassistEvent> {\n const { signedPayload, parts } = this.prepare(payload, header);\n const expected = await this.signAsync(signedPayload, secret);\n this.assertValid(parts, expected, header ?? '', signedPayload, options);\n return this.parseEvent(payload);\n }\n\n /**\n * Compute the v1 signature for a `t.<body>` payload — exported as a\n * convenience for testing.\n */\n signSync(signedPayload: string, secret: string): string {\n const nodeCrypto = loadNodeCrypto();\n if (!nodeCrypto) {\n throw new WassistSignatureVerificationError({\n message:\n 'node:crypto is unavailable in this runtime. Use `constructEventAsync` instead.',\n });\n }\n return nodeCrypto.createHmac('sha256', secret).update(signedPayload).digest('hex');\n }\n\n /**\n * Web Crypto variant of {@link signSync}.\n */\n async signAsync(signedPayload: string, secret: string): Promise<string> {\n const subtle = globalThis.crypto?.subtle;\n if (!subtle) {\n throw new WassistSignatureVerificationError({\n message:\n 'Web Crypto (`globalThis.crypto.subtle`) is unavailable in this runtime.',\n });\n }\n const enc = new TextEncoder();\n const key = await subtle.importKey(\n 'raw',\n enc.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n const sig = await subtle.sign('HMAC', key, enc.encode(signedPayload));\n return toHex(new Uint8Array(sig));\n }\n\n // =============================================================================\n // Internals\n // =============================================================================\n\n private prepare(\n payload: string | Uint8Array,\n header: string | null | undefined\n ): { signedPayload: string; parts: { t: string; v1: string } } {\n if (!header) {\n throw new WassistSignatureVerificationError({\n message: 'Missing X-Wassist-Signature header.',\n header: header ?? undefined,\n });\n }\n const parts = parseHeader(header);\n if (!parts.t || !parts.v1) {\n throw new WassistSignatureVerificationError({\n message:\n 'Malformed X-Wassist-Signature header — expected `t=<unix>,v1=<hex>`.',\n header,\n });\n }\n const bodyText = typeof payload === 'string' ? payload : new TextDecoder().decode(payload);\n return { signedPayload: `${parts.t}.${bodyText}`, parts: parts as { t: string; v1: string } };\n }\n\n private assertValid(\n parts: { t: string; v1: string },\n expected: string,\n header: string,\n signedPayload: string,\n options: VerifyOptions\n ): void {\n if (!constantTimeEqualsHex(parts.v1, expected)) {\n throw new WassistSignatureVerificationError({\n message: 'Webhook signature did not match the expected value.',\n header,\n payload: signedPayload,\n });\n }\n const tolerance = options.tolerance ?? DEFAULT_TOLERANCE_SECONDS;\n if (tolerance > 0) {\n const now = options.currentTimestamp ?? Math.floor(Date.now() / 1000);\n const ts = Number(parts.t);\n if (!Number.isFinite(ts)) {\n throw new WassistSignatureVerificationError({\n message: `Invalid timestamp in X-Wassist-Signature: ${parts.t}`,\n header,\n });\n }\n if (Math.abs(now - ts) > tolerance) {\n throw new WassistSignatureVerificationError({\n message: `Webhook timestamp is outside the ${tolerance}s tolerance window (received ${ts}, now ${now}).`,\n header,\n });\n }\n }\n }\n\n private parseEvent(payload: string | Uint8Array): WassistEvent {\n const text =\n typeof payload === 'string' ? payload : new TextDecoder().decode(payload);\n try {\n return JSON.parse(text) as WassistEvent;\n } catch (err) {\n throw new WassistSignatureVerificationError({\n message: 'Failed to parse webhook payload as JSON.',\n payload: text,\n cause: err,\n });\n }\n }\n}\n\n// =============================================================================\n// Module-level helpers\n// =============================================================================\n\nfunction parseHeader(header: string): Partial<{ t: string; v1: string }> {\n const parts: Partial<Record<string, string>> = {};\n for (const segment of header.split(',')) {\n const eq = segment.indexOf('=');\n if (eq === -1) continue;\n const key = segment.slice(0, eq).trim();\n const value = segment.slice(eq + 1).trim();\n if (key === 't' || key === 'v1') parts[key] = value;\n }\n return parts as Partial<{ t: string; v1: string }>;\n}\n\nfunction constantTimeEqualsHex(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) {\n diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return diff === 0;\n}\n\nfunction toHex(bytes: Uint8Array): string {\n let out = '';\n for (let i = 0; i < bytes.length; i++) {\n const v = bytes[i] ?? 0;\n out += v.toString(16).padStart(2, '0');\n }\n return out;\n}\n\n/**\n * The singleton `webhooks` namespace exposed on the {@link Wassist} class.\n * Statically importable for stateless use.\n */\nexport const webhooks = new Webhooks();\n\n// =============================================================================\n// node:crypto loader\n// =============================================================================\n\ntype NodeCrypto = {\n createHmac: (alg: string, key: string) => {\n update: (data: string) => { digest: (enc: 'hex') => string };\n };\n};\n\nlet cachedNodeCrypto: NodeCrypto | null | undefined;\n\n/**\n * `__sdkRequire` is injected by the tsup banner — see `tsup.config.ts`.\n * In ESM it's a `createRequire(import.meta.url)`; in CJS it's the\n * ambient `require`. Both can resolve `node:crypto` synchronously.\n *\n * @internal\n */\ndeclare const __sdkRequire: ((id: string) => unknown) | undefined;\n\n/**\n * Lazily load `node:crypto` without forcing it into the dep graph for\n * runtimes that lack it (Cloudflare Workers, the browser). Returns\n * `undefined` if `node:crypto` cannot be resolved; the caller falls back\n * to {@link Webhooks.constructEventAsync}.\n *\n * @internal\n */\nfunction loadNodeCrypto(): NodeCrypto | undefined {\n if (cachedNodeCrypto !== undefined) return cachedNodeCrypto ?? undefined;\n try {\n const req: ((id: string) => unknown) | undefined =\n typeof __sdkRequire === 'function'\n ? __sdkRequire\n : (globalThis as { require?: (id: string) => unknown }).require;\n cachedNodeCrypto = (req?.('node:crypto') as NodeCrypto | undefined) ?? null;\n } catch {\n cachedNodeCrypto = null;\n }\n return cachedNodeCrypto ?? undefined;\n}\n","import { HttpClient, type WassistClientConfig } from './http';\nimport { AgentsResource } from './resources/agents';\nimport { ConversationsResource } from './resources/conversations';\nimport { PhoneNumbersResource } from './resources/phone-numbers';\nimport { WhatsAppAccountsResource } from './resources/whatsapp-accounts';\nimport { WhatsAppLinkSessionsResource } from './resources/whatsapp-link-sessions';\nimport { WhatsAppTemplatesResource } from './resources/whatsapp-templates';\nimport { Webhooks, webhooks as webhooksSingleton } from './webhooks';\n\n/**\n * The Wassist API client.\n *\n * @example\n * ```ts\n * import { Wassist } from '@wassist/sdk';\n *\n * const wassist = new Wassist({ apiKey: process.env.WASSIST_API_KEY! });\n *\n * const agent = await wassist.agents.create({ name: 'Sales Assistant' });\n *\n * for await (const conv of wassist.conversations.list()) {\n * console.log(conv.id);\n * }\n * ```\n */\nexport class Wassist {\n /** Create and manage AI agents. */\n readonly agents: AgentsResource;\n /** Send messages and manage conversations (with nested `messages` resource). */\n readonly conversations: ConversationsResource;\n /** Manage your connected WhatsApp phone numbers and their routing. */\n readonly phoneNumbers: PhoneNumbersResource;\n /** Manage WhatsApp Business Accounts. */\n readonly whatsappAccounts: WhatsAppAccountsResource;\n /** Manage hosted WhatsApp account-linking sessions. */\n readonly whatsappLinkSessions: WhatsAppLinkSessionsResource;\n /** Manage WhatsApp message templates. */\n readonly whatsappTemplates: WhatsAppTemplatesResource;\n /** Verify inbound webhook signatures. */\n readonly webhooks: Webhooks = webhooksSingleton;\n\n /**\n * Webhook helpers — usable without instantiating a client.\n *\n * @example\n * ```ts\n * const event = Wassist.webhooks.constructEvent(body, header, secret);\n * ```\n */\n static readonly webhooks: Webhooks = webhooksSingleton;\n\n constructor(config: WassistClientConfig) {\n const http = new HttpClient(config);\n this.agents = new AgentsResource(http);\n this.conversations = new ConversationsResource(http);\n this.phoneNumbers = new PhoneNumbersResource(http);\n this.whatsappAccounts = new WhatsAppAccountsResource(http);\n this.whatsappLinkSessions = new WhatsAppLinkSessionsResource(http);\n this.whatsappTemplates = new WhatsAppTemplatesResource(http);\n }\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1394,18 +1394,69 @@ interface SubscriptionRevokedEvent extends WassistEventBase<'subscription.revoke
|
|
|
1394
1394
|
phoneNumber: PhoneNumberString;
|
|
1395
1395
|
};
|
|
1396
1396
|
}
|
|
1397
|
+
/**
|
|
1398
|
+
* Fired when an inbound user message lands on a conversation whose
|
|
1399
|
+
* routing has been switched to `webhook` (either at the number level via
|
|
1400
|
+
* `phoneNumbers.subscribe` or at the conversation level via
|
|
1401
|
+
* `conversations.subscribe`). The agent pipeline is skipped — delivery
|
|
1402
|
+
* goes **only** to the assigned webhook, with no fan-out.
|
|
1403
|
+
*
|
|
1404
|
+
* The envelope is identical to {@link MessageReceivedEvent} with two
|
|
1405
|
+
* extra fields ({@link routing} and {@link webhookId}) so you can tell
|
|
1406
|
+
* subscription-routed traffic apart from the legacy broadcast event.
|
|
1407
|
+
*
|
|
1408
|
+
* @see https://docs.wassist.app/guides/webhooks/routing
|
|
1409
|
+
*/
|
|
1410
|
+
interface SubscriptionMessageReceivedEvent extends WassistEventBase<'subscription.message.received'> {
|
|
1411
|
+
/** Your phone number that received the message. */
|
|
1412
|
+
phoneNumber: PhoneNumberString;
|
|
1413
|
+
/** The contact's phone number. */
|
|
1414
|
+
from: PhoneNumberString;
|
|
1415
|
+
contact: {
|
|
1416
|
+
name: string | null;
|
|
1417
|
+
phoneNumber: PhoneNumberString;
|
|
1418
|
+
};
|
|
1419
|
+
message: MessageReceivedMessage;
|
|
1420
|
+
conversationId: UUID;
|
|
1421
|
+
/** Always `"webhook"` for this event — included for symmetry with the lifecycle events. */
|
|
1422
|
+
routing: 'webhook';
|
|
1423
|
+
/** The webhook the conversation is subscribed to. */
|
|
1424
|
+
webhookId: UUID;
|
|
1425
|
+
}
|
|
1397
1426
|
interface TestPingEvent extends WassistEventBase<'test.ping'> {
|
|
1398
1427
|
/** Stub payload — used by the dashboard "Send test event" button. */
|
|
1399
1428
|
message: string;
|
|
1400
1429
|
}
|
|
1401
1430
|
/**
|
|
1402
|
-
* Discriminated union of every documented Wassist webhook event.
|
|
1431
|
+
* Discriminated union of every documented Wassist webhook event. Designed
|
|
1432
|
+
* for clean narrowing in a `switch (event.event)`:
|
|
1433
|
+
*
|
|
1434
|
+
* ```ts
|
|
1435
|
+
* switch (event.event) {
|
|
1436
|
+
* case 'message.received': event.message.body; // typed
|
|
1437
|
+
* case 'subscription.activated': event.webhookId; // typed
|
|
1438
|
+
* case 'subscription.message.received': event.webhookId; // typed
|
|
1439
|
+
* }
|
|
1440
|
+
* ```
|
|
1403
1441
|
*
|
|
1404
|
-
*
|
|
1405
|
-
*
|
|
1406
|
-
|
|
1442
|
+
* For forward-compatibility with new event types Wassist may ship before
|
|
1443
|
+
* you upgrade the SDK, see {@link UnrecognizedWassistEvent}.
|
|
1444
|
+
*/
|
|
1445
|
+
type WassistEvent = MessageReceivedEvent | SubscriptionActivatedEvent | SubscriptionMessageReceivedEvent | SubscriptionRevokedEvent | TestPingEvent;
|
|
1446
|
+
/**
|
|
1447
|
+
* Catch-all shape for events whose name {@link WassistEvent} doesn't yet
|
|
1448
|
+
* know about. `constructEvent` never throws on an unrecognized event name
|
|
1449
|
+
* at runtime — cast to this type when you need to inspect a future event:
|
|
1450
|
+
*
|
|
1451
|
+
* ```ts
|
|
1452
|
+
* const event = Wassist.webhooks.constructEvent(...);
|
|
1453
|
+
* if ((event.event as string).startsWith('beta.')) {
|
|
1454
|
+
* const unknown = event as UnrecognizedWassistEvent;
|
|
1455
|
+
* console.log(unknown.event, unknown.timestamp);
|
|
1456
|
+
* }
|
|
1457
|
+
* ```
|
|
1407
1458
|
*/
|
|
1408
|
-
type
|
|
1459
|
+
type UnrecognizedWassistEvent = WassistEventBase<string> & Record<string, unknown>;
|
|
1409
1460
|
|
|
1410
1461
|
/**
|
|
1411
1462
|
* Webhook signature verification.
|
|
@@ -1621,6 +1672,6 @@ declare class WassistSignatureVerificationError extends WassistError {
|
|
|
1621
1672
|
*
|
|
1622
1673
|
* Updated in lockstep with `package.json`'s `version` field.
|
|
1623
1674
|
*/
|
|
1624
|
-
declare const SDK_VERSION = "0.1.
|
|
1675
|
+
declare const SDK_VERSION = "0.1.2";
|
|
1625
1676
|
|
|
1626
|
-
export { type AddNumberInput, type Agent, type AgentCreditSettings, type AgentCreditSettingsInput, type AgentDocument, type AgentHandoffTool, type AgentHandoffToolInput, type AgentImageGenerateTool, type AgentImageGenerateToolInput, type AgentMcpConfig, type AgentMcpConfigInput, type AgentMemoryKey, type AgentMemoryKeyInput, type AgentOutboundTrigger, type AgentOutboundTriggerInput, type AgentPaywallConfig, type AgentPaywallConfigInput, type AgentTool, type AgentToolInput, type AgentWakeUpConfig, type AgentWakeUpConfigInput, type AgentWebsiteTool, type AgentWebsiteToolInput, type AgentWhatsAppPhoneNumber, AgentsResource, AutoPaginatedList, type AvailableNumber, type AvailableNumbersResponse, type CTAButtonMessage, type ConnectAgentInput, type Conversation, type ConversationContact, type ConversationLastMessage, ConversationsResource, type CreateAgentInput, type CreateBYOAAgentInput, type CreateConversationInput, type CreateConversationMessageInput, type CreateWhatsAppLinkSessionInput, type CreateWhatsAppTemplateInput, type FetchLike, type FileInfo, type ISODateTime, type ImageInfo, type ImageMessage, type ListConversationsParams, type ListSelectionMessage, type Message, type MessageReceivedEvent, type MessageReceivedMessage, type MessageRole, type MessageStatus, type MessageType, MessagesResource, type Page, type PageParams, type PaginatedResponse, type PhoneNumber, type PhoneNumberBusinessProfile, type PhoneNumberRoutingMode, type PhoneNumberString, PhoneNumbersResource, type PromptAgentInput, type PublicUser, type PublishWhatsAppTemplateInput, type QuickReplyMessage, type RequestOptions, SDK_VERSION, type SendMessageCtaImageInput, type SendMessageCtaInput, type SendMessageInput, type SendMessageTemplateInput, type SendMessageTextInput, type SendUnifiedMessageButtonInput, type SendUnifiedMessageInput, type SendUnifiedMessageMediaInput, type SubscribeConversationInput, type SubscribePhoneNumberInput, type SubscriptionActivatedEvent, type SubscriptionRevokedEvent, type TemplateMessage, type TestPingEvent, type TextMessage, type UUID, type UnifiedMessage, type UnifiedMessageButton, type UnifiedMessageButtonType, type UnifiedMessageMedia, type UnpublishWhatsAppTemplateInput, type UnsubscribePhoneNumberInput, type UpdateAgentInput, type UpdateWhatsAppTemplateInput, Wassist, WassistAPIError, WassistAuthenticationError, type WassistClientConfig, WassistConflictError, WassistConnectionError, WassistError, type WassistErrorOptions, type WassistEvent, type WassistEventBase, WassistInvalidRequestError, WassistNotFoundError, WassistPermissionError, WassistRateLimitError, WassistSignatureVerificationError, WassistTimeoutError, Webhooks, type WhatsAppAccount, type WhatsAppAccountPhoneNumber, WhatsAppAccountsResource, type WhatsAppLinkSession, type WhatsAppLinkSessionStatus, WhatsAppLinkSessionsResource, type WhatsAppTemplate, type WhatsAppTemplateAccountLink, type WhatsAppTemplateButton, type WhatsAppTemplateButtonType, type WhatsAppTemplateCategory, type WhatsAppTemplateComponent, type WhatsAppTemplateComponentExample, type WhatsAppTemplateNamedParam, type WhatsAppTemplateParameterFormat, type WhatsAppTemplatePublishResult, type WhatsAppTemplateQuality, type WhatsAppTemplateStatus, type WhatsAppTemplateUnpublishResult, type WhatsAppTemplateWithPublishResults, WhatsAppTemplatesResource };
|
|
1677
|
+
export { type AddNumberInput, type Agent, type AgentCreditSettings, type AgentCreditSettingsInput, type AgentDocument, type AgentHandoffTool, type AgentHandoffToolInput, type AgentImageGenerateTool, type AgentImageGenerateToolInput, type AgentMcpConfig, type AgentMcpConfigInput, type AgentMemoryKey, type AgentMemoryKeyInput, type AgentOutboundTrigger, type AgentOutboundTriggerInput, type AgentPaywallConfig, type AgentPaywallConfigInput, type AgentTool, type AgentToolInput, type AgentWakeUpConfig, type AgentWakeUpConfigInput, type AgentWebsiteTool, type AgentWebsiteToolInput, type AgentWhatsAppPhoneNumber, AgentsResource, AutoPaginatedList, type AvailableNumber, type AvailableNumbersResponse, type CTAButtonMessage, type ConnectAgentInput, type Conversation, type ConversationContact, type ConversationLastMessage, ConversationsResource, type CreateAgentInput, type CreateBYOAAgentInput, type CreateConversationInput, type CreateConversationMessageInput, type CreateWhatsAppLinkSessionInput, type CreateWhatsAppTemplateInput, type FetchLike, type FileInfo, type ISODateTime, type ImageInfo, type ImageMessage, type ListConversationsParams, type ListSelectionMessage, type Message, type MessageReceivedEvent, type MessageReceivedMessage, type MessageRole, type MessageStatus, type MessageType, MessagesResource, type Page, type PageParams, type PaginatedResponse, type PhoneNumber, type PhoneNumberBusinessProfile, type PhoneNumberRoutingMode, type PhoneNumberString, PhoneNumbersResource, type PromptAgentInput, type PublicUser, type PublishWhatsAppTemplateInput, type QuickReplyMessage, type RequestOptions, SDK_VERSION, type SendMessageCtaImageInput, type SendMessageCtaInput, type SendMessageInput, type SendMessageTemplateInput, type SendMessageTextInput, type SendUnifiedMessageButtonInput, type SendUnifiedMessageInput, type SendUnifiedMessageMediaInput, type SubscribeConversationInput, type SubscribePhoneNumberInput, type SubscriptionActivatedEvent, type SubscriptionMessageReceivedEvent, type SubscriptionRevokedEvent, type TemplateMessage, type TestPingEvent, type TextMessage, type UUID, type UnifiedMessage, type UnifiedMessageButton, type UnifiedMessageButtonType, type UnifiedMessageMedia, type UnpublishWhatsAppTemplateInput, type UnrecognizedWassistEvent, type UnsubscribePhoneNumberInput, type UpdateAgentInput, type UpdateWhatsAppTemplateInput, Wassist, WassistAPIError, WassistAuthenticationError, type WassistClientConfig, WassistConflictError, WassistConnectionError, WassistError, type WassistErrorOptions, type WassistEvent, type WassistEventBase, WassistInvalidRequestError, WassistNotFoundError, WassistPermissionError, WassistRateLimitError, WassistSignatureVerificationError, WassistTimeoutError, Webhooks, type WhatsAppAccount, type WhatsAppAccountPhoneNumber, WhatsAppAccountsResource, type WhatsAppLinkSession, type WhatsAppLinkSessionStatus, WhatsAppLinkSessionsResource, type WhatsAppTemplate, type WhatsAppTemplateAccountLink, type WhatsAppTemplateButton, type WhatsAppTemplateButtonType, type WhatsAppTemplateCategory, type WhatsAppTemplateComponent, type WhatsAppTemplateComponentExample, type WhatsAppTemplateNamedParam, type WhatsAppTemplateParameterFormat, type WhatsAppTemplatePublishResult, type WhatsAppTemplateQuality, type WhatsAppTemplateStatus, type WhatsAppTemplateUnpublishResult, type WhatsAppTemplateWithPublishResults, WhatsAppTemplatesResource };
|
package/dist/index.d.ts
CHANGED
|
@@ -1394,18 +1394,69 @@ interface SubscriptionRevokedEvent extends WassistEventBase<'subscription.revoke
|
|
|
1394
1394
|
phoneNumber: PhoneNumberString;
|
|
1395
1395
|
};
|
|
1396
1396
|
}
|
|
1397
|
+
/**
|
|
1398
|
+
* Fired when an inbound user message lands on a conversation whose
|
|
1399
|
+
* routing has been switched to `webhook` (either at the number level via
|
|
1400
|
+
* `phoneNumbers.subscribe` or at the conversation level via
|
|
1401
|
+
* `conversations.subscribe`). The agent pipeline is skipped — delivery
|
|
1402
|
+
* goes **only** to the assigned webhook, with no fan-out.
|
|
1403
|
+
*
|
|
1404
|
+
* The envelope is identical to {@link MessageReceivedEvent} with two
|
|
1405
|
+
* extra fields ({@link routing} and {@link webhookId}) so you can tell
|
|
1406
|
+
* subscription-routed traffic apart from the legacy broadcast event.
|
|
1407
|
+
*
|
|
1408
|
+
* @see https://docs.wassist.app/guides/webhooks/routing
|
|
1409
|
+
*/
|
|
1410
|
+
interface SubscriptionMessageReceivedEvent extends WassistEventBase<'subscription.message.received'> {
|
|
1411
|
+
/** Your phone number that received the message. */
|
|
1412
|
+
phoneNumber: PhoneNumberString;
|
|
1413
|
+
/** The contact's phone number. */
|
|
1414
|
+
from: PhoneNumberString;
|
|
1415
|
+
contact: {
|
|
1416
|
+
name: string | null;
|
|
1417
|
+
phoneNumber: PhoneNumberString;
|
|
1418
|
+
};
|
|
1419
|
+
message: MessageReceivedMessage;
|
|
1420
|
+
conversationId: UUID;
|
|
1421
|
+
/** Always `"webhook"` for this event — included for symmetry with the lifecycle events. */
|
|
1422
|
+
routing: 'webhook';
|
|
1423
|
+
/** The webhook the conversation is subscribed to. */
|
|
1424
|
+
webhookId: UUID;
|
|
1425
|
+
}
|
|
1397
1426
|
interface TestPingEvent extends WassistEventBase<'test.ping'> {
|
|
1398
1427
|
/** Stub payload — used by the dashboard "Send test event" button. */
|
|
1399
1428
|
message: string;
|
|
1400
1429
|
}
|
|
1401
1430
|
/**
|
|
1402
|
-
* Discriminated union of every documented Wassist webhook event.
|
|
1431
|
+
* Discriminated union of every documented Wassist webhook event. Designed
|
|
1432
|
+
* for clean narrowing in a `switch (event.event)`:
|
|
1433
|
+
*
|
|
1434
|
+
* ```ts
|
|
1435
|
+
* switch (event.event) {
|
|
1436
|
+
* case 'message.received': event.message.body; // typed
|
|
1437
|
+
* case 'subscription.activated': event.webhookId; // typed
|
|
1438
|
+
* case 'subscription.message.received': event.webhookId; // typed
|
|
1439
|
+
* }
|
|
1440
|
+
* ```
|
|
1403
1441
|
*
|
|
1404
|
-
*
|
|
1405
|
-
*
|
|
1406
|
-
|
|
1442
|
+
* For forward-compatibility with new event types Wassist may ship before
|
|
1443
|
+
* you upgrade the SDK, see {@link UnrecognizedWassistEvent}.
|
|
1444
|
+
*/
|
|
1445
|
+
type WassistEvent = MessageReceivedEvent | SubscriptionActivatedEvent | SubscriptionMessageReceivedEvent | SubscriptionRevokedEvent | TestPingEvent;
|
|
1446
|
+
/**
|
|
1447
|
+
* Catch-all shape for events whose name {@link WassistEvent} doesn't yet
|
|
1448
|
+
* know about. `constructEvent` never throws on an unrecognized event name
|
|
1449
|
+
* at runtime — cast to this type when you need to inspect a future event:
|
|
1450
|
+
*
|
|
1451
|
+
* ```ts
|
|
1452
|
+
* const event = Wassist.webhooks.constructEvent(...);
|
|
1453
|
+
* if ((event.event as string).startsWith('beta.')) {
|
|
1454
|
+
* const unknown = event as UnrecognizedWassistEvent;
|
|
1455
|
+
* console.log(unknown.event, unknown.timestamp);
|
|
1456
|
+
* }
|
|
1457
|
+
* ```
|
|
1407
1458
|
*/
|
|
1408
|
-
type
|
|
1459
|
+
type UnrecognizedWassistEvent = WassistEventBase<string> & Record<string, unknown>;
|
|
1409
1460
|
|
|
1410
1461
|
/**
|
|
1411
1462
|
* Webhook signature verification.
|
|
@@ -1621,6 +1672,6 @@ declare class WassistSignatureVerificationError extends WassistError {
|
|
|
1621
1672
|
*
|
|
1622
1673
|
* Updated in lockstep with `package.json`'s `version` field.
|
|
1623
1674
|
*/
|
|
1624
|
-
declare const SDK_VERSION = "0.1.
|
|
1675
|
+
declare const SDK_VERSION = "0.1.2";
|
|
1625
1676
|
|
|
1626
|
-
export { type AddNumberInput, type Agent, type AgentCreditSettings, type AgentCreditSettingsInput, type AgentDocument, type AgentHandoffTool, type AgentHandoffToolInput, type AgentImageGenerateTool, type AgentImageGenerateToolInput, type AgentMcpConfig, type AgentMcpConfigInput, type AgentMemoryKey, type AgentMemoryKeyInput, type AgentOutboundTrigger, type AgentOutboundTriggerInput, type AgentPaywallConfig, type AgentPaywallConfigInput, type AgentTool, type AgentToolInput, type AgentWakeUpConfig, type AgentWakeUpConfigInput, type AgentWebsiteTool, type AgentWebsiteToolInput, type AgentWhatsAppPhoneNumber, AgentsResource, AutoPaginatedList, type AvailableNumber, type AvailableNumbersResponse, type CTAButtonMessage, type ConnectAgentInput, type Conversation, type ConversationContact, type ConversationLastMessage, ConversationsResource, type CreateAgentInput, type CreateBYOAAgentInput, type CreateConversationInput, type CreateConversationMessageInput, type CreateWhatsAppLinkSessionInput, type CreateWhatsAppTemplateInput, type FetchLike, type FileInfo, type ISODateTime, type ImageInfo, type ImageMessage, type ListConversationsParams, type ListSelectionMessage, type Message, type MessageReceivedEvent, type MessageReceivedMessage, type MessageRole, type MessageStatus, type MessageType, MessagesResource, type Page, type PageParams, type PaginatedResponse, type PhoneNumber, type PhoneNumberBusinessProfile, type PhoneNumberRoutingMode, type PhoneNumberString, PhoneNumbersResource, type PromptAgentInput, type PublicUser, type PublishWhatsAppTemplateInput, type QuickReplyMessage, type RequestOptions, SDK_VERSION, type SendMessageCtaImageInput, type SendMessageCtaInput, type SendMessageInput, type SendMessageTemplateInput, type SendMessageTextInput, type SendUnifiedMessageButtonInput, type SendUnifiedMessageInput, type SendUnifiedMessageMediaInput, type SubscribeConversationInput, type SubscribePhoneNumberInput, type SubscriptionActivatedEvent, type SubscriptionRevokedEvent, type TemplateMessage, type TestPingEvent, type TextMessage, type UUID, type UnifiedMessage, type UnifiedMessageButton, type UnifiedMessageButtonType, type UnifiedMessageMedia, type UnpublishWhatsAppTemplateInput, type UnsubscribePhoneNumberInput, type UpdateAgentInput, type UpdateWhatsAppTemplateInput, Wassist, WassistAPIError, WassistAuthenticationError, type WassistClientConfig, WassistConflictError, WassistConnectionError, WassistError, type WassistErrorOptions, type WassistEvent, type WassistEventBase, WassistInvalidRequestError, WassistNotFoundError, WassistPermissionError, WassistRateLimitError, WassistSignatureVerificationError, WassistTimeoutError, Webhooks, type WhatsAppAccount, type WhatsAppAccountPhoneNumber, WhatsAppAccountsResource, type WhatsAppLinkSession, type WhatsAppLinkSessionStatus, WhatsAppLinkSessionsResource, type WhatsAppTemplate, type WhatsAppTemplateAccountLink, type WhatsAppTemplateButton, type WhatsAppTemplateButtonType, type WhatsAppTemplateCategory, type WhatsAppTemplateComponent, type WhatsAppTemplateComponentExample, type WhatsAppTemplateNamedParam, type WhatsAppTemplateParameterFormat, type WhatsAppTemplatePublishResult, type WhatsAppTemplateQuality, type WhatsAppTemplateStatus, type WhatsAppTemplateUnpublishResult, type WhatsAppTemplateWithPublishResults, WhatsAppTemplatesResource };
|
|
1677
|
+
export { type AddNumberInput, type Agent, type AgentCreditSettings, type AgentCreditSettingsInput, type AgentDocument, type AgentHandoffTool, type AgentHandoffToolInput, type AgentImageGenerateTool, type AgentImageGenerateToolInput, type AgentMcpConfig, type AgentMcpConfigInput, type AgentMemoryKey, type AgentMemoryKeyInput, type AgentOutboundTrigger, type AgentOutboundTriggerInput, type AgentPaywallConfig, type AgentPaywallConfigInput, type AgentTool, type AgentToolInput, type AgentWakeUpConfig, type AgentWakeUpConfigInput, type AgentWebsiteTool, type AgentWebsiteToolInput, type AgentWhatsAppPhoneNumber, AgentsResource, AutoPaginatedList, type AvailableNumber, type AvailableNumbersResponse, type CTAButtonMessage, type ConnectAgentInput, type Conversation, type ConversationContact, type ConversationLastMessage, ConversationsResource, type CreateAgentInput, type CreateBYOAAgentInput, type CreateConversationInput, type CreateConversationMessageInput, type CreateWhatsAppLinkSessionInput, type CreateWhatsAppTemplateInput, type FetchLike, type FileInfo, type ISODateTime, type ImageInfo, type ImageMessage, type ListConversationsParams, type ListSelectionMessage, type Message, type MessageReceivedEvent, type MessageReceivedMessage, type MessageRole, type MessageStatus, type MessageType, MessagesResource, type Page, type PageParams, type PaginatedResponse, type PhoneNumber, type PhoneNumberBusinessProfile, type PhoneNumberRoutingMode, type PhoneNumberString, PhoneNumbersResource, type PromptAgentInput, type PublicUser, type PublishWhatsAppTemplateInput, type QuickReplyMessage, type RequestOptions, SDK_VERSION, type SendMessageCtaImageInput, type SendMessageCtaInput, type SendMessageInput, type SendMessageTemplateInput, type SendMessageTextInput, type SendUnifiedMessageButtonInput, type SendUnifiedMessageInput, type SendUnifiedMessageMediaInput, type SubscribeConversationInput, type SubscribePhoneNumberInput, type SubscriptionActivatedEvent, type SubscriptionMessageReceivedEvent, type SubscriptionRevokedEvent, type TemplateMessage, type TestPingEvent, type TextMessage, type UUID, type UnifiedMessage, type UnifiedMessageButton, type UnifiedMessageButtonType, type UnifiedMessageMedia, type UnpublishWhatsAppTemplateInput, type UnrecognizedWassistEvent, type UnsubscribePhoneNumberInput, type UpdateAgentInput, type UpdateWhatsAppTemplateInput, Wassist, WassistAPIError, WassistAuthenticationError, type WassistClientConfig, WassistConflictError, WassistConnectionError, WassistError, type WassistErrorOptions, type WassistEvent, type WassistEventBase, WassistInvalidRequestError, WassistNotFoundError, WassistPermissionError, WassistRateLimitError, WassistSignatureVerificationError, WassistTimeoutError, Webhooks, type WhatsAppAccount, type WhatsAppAccountPhoneNumber, WhatsAppAccountsResource, type WhatsAppLinkSession, type WhatsAppLinkSessionStatus, WhatsAppLinkSessionsResource, type WhatsAppTemplate, type WhatsAppTemplateAccountLink, type WhatsAppTemplateButton, type WhatsAppTemplateButtonType, type WhatsAppTemplateCategory, type WhatsAppTemplateComponent, type WhatsAppTemplateComponentExample, type WhatsAppTemplateNamedParam, type WhatsAppTemplateParameterFormat, type WhatsAppTemplatePublishResult, type WhatsAppTemplateQuality, type WhatsAppTemplateStatus, type WhatsAppTemplateUnpublishResult, type WhatsAppTemplateWithPublishResults, WhatsAppTemplatesResource };
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/http.ts","../src/pagination.ts","../src/resources/agents.ts","../src/resources/messages.ts","../src/resources/conversations.ts","../src/resources/phone-numbers.ts","../src/resources/whatsapp-accounts.ts","../src/resources/whatsapp-link-sessions.ts","../src/resources/whatsapp-templates.ts","../src/webhooks.ts","../src/client.ts"],"names":[],"mappings":";;;;;AAiBO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA;AAAA,EAE7B,UAAA;AAAA;AAAA,EAEA,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA;AAAA;AAAA,EAEA,GAAA;AAAA,EAET,YAAY,IAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,IAAA,IAAA,CAAK,OAAO,GAAA,CAAA,MAAA,CAAW,IAAA;AACvB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AACvB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AACtB,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA;AAChB,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,MAAC,IAAA,CAA6B,QAAQ,IAAA,CAAK,KAAA;AAAA,IAC7C;AACA,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;AAGO,IAAM,0BAAA,GAAN,cAAyC,YAAA,CAAa;AAAC;AAGvD,IAAM,sBAAA,GAAN,cAAqC,YAAA,CAAa;AAAC;AAGnD,IAAM,0BAAA,GAAN,cAAyC,YAAA,CAAa;AAAC;AAGvD,IAAM,oBAAA,GAAN,cAAmC,YAAA,CAAa;AAAC;AAGjD,IAAM,oBAAA,GAAN,cAAmC,YAAA,CAAa;AAAC;AAGjD,IAAM,qBAAA,GAAN,cAAoC,YAAA,CAAa;AAAA;AAAA,EAE7C,UAAA;AAAA,EAET,YAAY,IAAA,EAAqD;AAC/D,IAAA,KAAA,CAAM,IAAI,CAAA;AACV,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AAAA,EACzB;AACF;AAGO,IAAM,eAAA,GAAN,cAA8B,YAAA,CAAa;AAAC;AAG5C,IAAM,sBAAA,GAAN,cAAqC,YAAA,CAAa;AAAC;AAGnD,IAAM,mBAAA,GAAN,cAAkC,YAAA,CAAa;AAAC;AAShD,IAAM,iCAAA,GAAN,cAAgD,YAAA,CAAa;AAAA;AAAA,EAEzD,MAAA;AAAA;AAAA,EAEA,OAAA;AAAA,EAET,YACE,IAAA,EACA;AACA,IAAA,KAAA,CAAM,IAAI,CAAA;AACV,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AAAA,EACtB;AACF;AAOO,SAAS,kBAAkB,IAAA,EAKjB;AACf,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,YAAW,GAAI,IAAA;AAEhD,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,IAAI,CAAA,IAAK,QAAQ,MAAM,CAAA,CAAA;AACtD,EAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,EAAE,OAAA,EAAS,UAAA,EAAY,QAAQ,IAAA,EAAM,SAAA,EAAW,KAAK,IAAA,EAAK;AAEvE,EAAA,IAAI,MAAA,KAAW,GAAA,EAAK,OAAO,IAAI,2BAA2B,IAAI,CAAA;AAC9D,EAAA,IAAI,MAAA,KAAW,GAAA,EAAK,OAAO,IAAI,uBAAuB,IAAI,CAAA;AAC1D,EAAA,IAAI,MAAA,KAAW,GAAA,EAAK,OAAO,IAAI,qBAAqB,IAAI,CAAA;AACxD,EAAA,IAAI,MAAA,KAAW,GAAA,EAAK,OAAO,IAAI,qBAAqB,IAAI,CAAA;AACxD,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,IAAI,sBAAsB,EAAE,GAAG,IAAA,EAAM,UAAA,EAAY,CAAA;AAC5E,EAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,EAAK;AACpC,IAAA,OAAO,IAAI,2BAA2B,IAAI,CAAA;AAAA,EAC5C;AACA,EAAA,IAAI,UAAU,GAAA,IAAO,MAAA,GAAS,KAAK,OAAO,IAAI,gBAAgB,IAAI,CAAA;AAClE,EAAA,OAAO,IAAI,aAAa,IAAI,CAAA;AAC9B;AAEA,SAAS,eAAe,IAAA,EAAmC;AACzD,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,MAAA;AAC9C,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,IAAI,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,SAAiB,CAAA,CAAE,KAAA;AAC1C,EAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,SAAiB,CAAA,CAAE,OAAA;AAC5C,EAAA,IAAI,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,SAAiB,CAAA,CAAE,MAAA;AAC3C,EAAA,IAAI,CAAA,CAAE,KAAA,IAAS,OAAO,CAAA,CAAE,UAAU,QAAA,EAAU;AAC1C,IAAA,MAAM,KAAA,GAAS,EAAE,KAAA,CAAkC,OAAA;AACnD,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AAAA,EACxC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAY,IAAA,EAAmC;AACtD,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,MAAA;AAC9C,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,SAAiB,CAAA,CAAE,IAAA;AACzC,EAAA,OAAO,MAAA;AACT;;;AC9IO,IAAM,WAAA,GAAc;;;AC6D3B,IAAM,gBAAA,GAAmB,6BAAA;AACzB,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,mBAAA,GAAsB,CAAA;AAC5B,IAAM,kBAAA,GAAqB,SAAA;AAC3B,IAAM,cAAA,mBAAsC,IAAI,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAmBhF,IAAM,aAAN,MAAiB;AAAA,EACL,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EAEjB,YAAY,MAAA,EAA6B;AACvC,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,MAAA,MAAM,IAAI,YAAA,CAAa;AAAA,QACrB,OAAA,EACE;AAAA,OACH,CAAA;AAAA,IACH;AACA,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,OAAA,IAAW,gBAAA,EAAkB,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACtE,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,kBAAA;AACjC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,IAAc,mBAAA;AACvC,IAAA,MAAM,WAAW,MAAA,CAAO,KAAA,IAAS,UAAA,CAAW,KAAA,EAAO,KAAK,UAAU,CAAA;AAClE,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,YAAA,CAAa;AAAA,QACrB,OAAA,EACE;AAAA,OACH,CAAA;AAAA,IACH;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AAAA,EACnB;AAAA,EAEA,GAAA,CAAO,MAAc,IAAA,EAAkE;AACrF,IAAA,OAAO,IAAA,CAAK,QAAW,EAAE,GAAG,MAAM,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA;AAAA,EACzD;AAAA,EACA,IAAA,CAAQ,IAAA,EAAc,IAAA,EAAgB,OAAA,EAAsC;AAC1E,IAAA,OAAO,IAAA,CAAK,QAAW,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,IAAA,EAAM,SAAS,CAAA;AAAA,EAChE;AAAA,EACA,GAAA,CAAO,IAAA,EAAc,IAAA,EAAgB,OAAA,EAAsC;AACzE,IAAA,OAAO,IAAA,CAAK,QAAW,EAAE,MAAA,EAAQ,OAAO,IAAA,EAAM,IAAA,EAAM,SAAS,CAAA;AAAA,EAC/D;AAAA,EACA,KAAA,CAAS,IAAA,EAAc,IAAA,EAAgB,OAAA,EAAsC;AAC3E,IAAA,OAAO,IAAA,CAAK,QAAW,EAAE,MAAA,EAAQ,SAAS,IAAA,EAAM,IAAA,EAAM,SAAS,CAAA;AAAA,EACjE;AAAA,EACA,MAAA,CAAU,MAAc,OAAA,EAAsC;AAC5D,IAAA,OAAO,KAAK,OAAA,CAAW,EAAE,QAAQ,QAAA,EAAU,IAAA,EAAM,SAAS,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAc,QAAW,IAAA,EAA+B;AACtD,IAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,KAAK,KAAK,CAAA;AAC/C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AACtC,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,KAAS,MAAA,GAAY,SAAY,IAAA,CAAK,SAAA,CAAU,KAAK,IAAI,CAAA;AAC3E,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,EAAS,UAAA,IAAc,IAAA,CAAK,UAAA;AACpD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,EAAS,OAAA,IAAW,IAAA,CAAK,OAAA;AAE9C,IAAA,IAAI,SAAA;AACJ,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,UAAA,EAAY,OAAA,EAAA,EAAW;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ;AAAA,UAClC,GAAA;AAAA,UACA,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,OAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA;AAAA,UACA,MAAA,EAAQ,KAAK,OAAA,EAAS;AAAA,SACvB,CAAA;AAED,QAAA,IAAI,SAAS,EAAA,EAAI;AACf,UAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,EAAK,OAAO,KAAA,CAAA;AAEpC,UAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,UAAA,IAAI,CAAC,MAAM,OAAO,KAAA,CAAA;AAClB,UAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,QACxB;AAGA,QAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,KAAA,CAAA;AAC1D,QAAA,MAAM,aAAa,eAAA,CAAgB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAC,CAAA;AACtE,QAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,QAAQ,CAAA;AAC1C,QAAA,MAAM,WAAW,iBAAA,CAAkB;AAAA,UACjC,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,IAAA,EAAM,UAAA;AAAA,UACN,SAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,MAAM,WAAA,GAAc,cAAA,CAAe,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA;AACtD,QAAA,IAAI,WAAA,IAAe,UAAU,UAAA,EAAY;AACvC,UAAA,MAAM,KAAA,CAAM,cAAA,CAAe,OAAA,EAAS,QAAQ,CAAC,CAAA;AAC7C,UAAA,SAAA,GAAY,QAAA;AACZ,UAAA;AAAA,QACF;AACA,QAAA,MAAM,QAAA;AAAA,MACR,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,eAAe,YAAA,EAAc;AAE/B,UAAA,IACE,UAAU,UAAA,KACT,GAAA,YAAe,qBAAA,IAAyB,mBAAA,CAAoB,GAAG,CAAA,CAAA,EAChE;AACA,YAAA,MAAM,KAAA,CAAM,cAAA,CAAe,OAAA,EAAS,GAAG,CAAC,CAAA;AACxC,YAAA,SAAA,GAAY,GAAA;AACZ,YAAA;AAAA,UACF;AACA,UAAA,MAAM,GAAA;AAAA,QACR;AAGA,QAAA,MAAM,MAAA,GAAS,cAAc,GAAG,CAAA;AAChC,QAAA,IAAI,OAAA,GAAU,UAAA,IAAc,oBAAA,CAAqB,MAAM,CAAA,EAAG;AACxD,UAAA,MAAM,KAAA,CAAM,cAAA,CAAe,OAAO,CAAC,CAAA;AACnC,UAAA,SAAA,GAAY,MAAA;AACZ,UAAA;AAAA,QACF;AACA,QAAA,MAAM,MAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,YAAqB,QACvB,SAAA,GACA,IAAI,aAAa,EAAE,OAAA,EAAS,yCAAyC,CAAA;AAAA,EAC3E;AAAA,EAEQ,QAAA,CAAS,MAAc,KAAA,EAAwB;AACrD,IAAA,MAAM,eAAe,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,GAAO,IAAI,IAAI,CAAA,CAAA;AAC3D,IAAA,MAAM,QAAA,GAAW,aAAa,UAAA,CAAW,kBAAkB,IACvD,YAAA,GACA,CAAA,EAAG,kBAAkB,CAAA,EAAG,YAAY,CAAA,CAAA;AACxC,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,CAAK,UAAU,QAAQ,CAAA;AAC3C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAmC,CAAA,EAAG;AAC9E,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAC3C,QAAA,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MAC5C;AAAA,IACF;AACA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA,EAEQ,aAAa,IAAA,EAA2C;AAC9D,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,aAAa,IAAA,CAAK,MAAA;AAAA,MAClB,QAAA,EAAU,kBAAA;AAAA,MACV,YAAA,EAAc,oBAAoB,WAAW,CAAA,CAAA;AAAA,MAC7C,kBAAA,EAAoB,oBAAoB,WAAW,CAAA;AAAA,KACrD;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AACvD,IAAA,IAAI,IAAA,CAAK,SAAS,cAAA,EAAgB;AAChC,MAAA,OAAA,CAAQ,iBAAiB,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,cAAA;AAAA,IAC5C;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA;AAAA,IAC1E;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,QAAQ,IAAA,EAOA;AACpB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,KAAA,EAAM;AACvC,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,UAAA,CAAW,KAAA,EAAM;AAAA,WACrC,IAAA,CAAK,OAAO,gBAAA,CAAiB,OAAA,EAAS,SAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,OAAO,CAAA;AACnE,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,GAAA,EAAK;AAAA,QACpC,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,IAAI,KAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,IACnE;AAAA,EACF;AACF,CAAA;AAMA,SAAS,SAAS,QAAA,EAAsC;AACtD,EAAA,OAAO,QAAA,CACJ,IAAA,EAAK,CACL,IAAA,CAAK,CAAC,IAAA,KAAS;AACd,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM,MAAS,CAAA;AAC1B;AAEA,SAAS,gBAAgB,KAAA,EAA0C;AACjE,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1B,EAAA,IAAI,OAAO,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,IAAS,GAAG,OAAO,KAAA;AACjD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC/B,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG,OAAO,MAAA;AACjC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAA,CAAO,SAAS,IAAA,CAAK,GAAA,EAAI,IAAK,GAAI,CAAC,CAAA;AAC7D;AAEA,SAAS,cAAA,CAAe,SAAiB,GAAA,EAA4B;AAEnE,EAAA,IAAI,GAAA,YAAe,qBAAA,IAAyB,OAAO,GAAA,CAAI,eAAe,QAAA,EAAU;AAC9E,IAAA,OAAO,IAAI,UAAA,GAAa,GAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,IAAA,GAAO,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA;AACtC,EAAA,MAAM,MAAA,GAAS,IAAA,GAAO,IAAA,CAAK,MAAA,EAAO;AAClC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,MAAA,EAAQ,GAAK,CAAA;AACtC;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAEA,SAAS,oBAAoB,GAAA,EAA4B;AACvD,EAAA,OAAO,IAAI,UAAA,KAAe,MAAA,IAAa,cAAA,CAAe,GAAA,CAAI,IAAI,UAAU,CAAA;AAC1E;AAEA,SAAS,qBAAqB,GAAA,EAA4B;AACxD,EAAA,OAAO,GAAA,YAAe,sBAAA;AACxB;AAEA,SAAS,cAAc,GAAA,EAA4B;AACjD,EAAA,IAAI,eAAe,KAAA,EAAO;AACxB,IAAA,IAAI,GAAA,CAAI,SAAS,YAAA,EAAc;AAC7B,MAAA,OAAO,IAAI,mBAAA,CAAoB;AAAA,QAC7B,OAAA,EAAS,oBAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAI,sBAAA,CAAuB;AAAA,MAChC,OAAA,EAAS,CAAA,eAAA,EAAkB,GAAA,CAAI,OAAO,CAAA,CAAA;AAAA,MACtC,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AACA,EAAA,OAAO,IAAI,sBAAA,CAAuB,EAAE,OAAA,EAAS,0BAA0B,CAAA;AACzE;;;ACtSO,IAAM,oBAAN,MAAuD;AAAA,EAC3C,SAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA;AAAA,EAGjB,WAAA,CACE,SAAA,EACA,MAAA,GAAqB,IACrB,OAAA,EACA;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAAA,CAAO,aAAa,CAAA,GAAsB;AAChD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,EAAA;AACnC,IAAA,IAAI,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,CAAA;AACnC,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,OAAO,OAAA,EAAS;AACd,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,UAAU,EAAE,KAAA,EAAO,QAAQ,CAAA;AACnD,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,OAAA,EAAS,MAAM,IAAA;AACvC,MAAA,OAAA,GAAU,IAAA,CAAK,IAAA,KAAS,IAAA,IAAQ,IAAA,CAAK,QAAQ,MAAA,GAAS,CAAA;AACtD,MAAA,MAAA,IAAU,IAAA,CAAK,QAAQ,MAAA,IAAU,KAAA;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,GAA8B;AAClC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,EAAA;AACnC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,CAAA;AACrC,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,UAAU,EAAE,KAAA,EAAO,QAAQ,CAAA;AACnD,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,OAAA;AAAA,MACX,YAAY,IAAA,CAAK,KAAA;AAAA,MACjB,OAAA,EAAS,KAAK,IAAA,KAAS,IAAA;AAAA,MACvB,UAAA,EAAY,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ;AAAA,KACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,GAAA,GAAoB;AACxB,IAAA,MAAM,MAAW,EAAC;AAClB,IAAA,WAAA,MAAiB,IAAA,IAAQ,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,OAAO,GAAA;AAAA,EACT;AACF;;;AClFO,IAAM,iBAAN,MAAqB;AAAA;AAAA,EAE1B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiB7B,IAAA,CAAK,MAAA,GAAqB,EAAC,EAAG,OAAA,EAAoD;AAChF,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,CAAC,CAAA,KAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAA8B,YAAY,EAAE,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,CAAA;AAAA,MAChF,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAA,CAAI,IAAU,OAAA,EAA0C;AACtD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAW,CAAA,QAAA,EAAW,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,CAAA,EAAK,EAAE,OAAA,EAAS,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CAAO,OAAyB,OAAA,EAA0C;AACxE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAY,UAAA,EAAY,OAAO,OAAO,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAA,CAAW,OAA6B,OAAA,EAA0C;AAChF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAY,eAAA,EAAiB,OAAO,OAAO,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAA,CAAO,EAAA,EAAU,KAAA,EAAyB,OAAA,EAA0C;AAClF,IAAA,OAAO,IAAA,CAAK,KAAK,KAAA,CAAa,CAAA,QAAA,EAAW,mBAAmB,EAAE,CAAC,CAAA,CAAA,CAAA,EAAK,KAAA,EAAO,OAAO,CAAA;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CAAO,IAAU,OAAA,EAAyC;AACxD,IAAA,OAAO,IAAA,CAAK,KAAK,MAAA,CAAa,CAAA,QAAA,EAAW,mBAAmB,EAAE,CAAC,KAAK,OAAO,CAAA;AAAA,EAC7E;AACF;;;AClFO,IAAM,mBAAN,MAAuB;AAAA;AAAA,EAE5B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,IAAA,CACE,cAAA,EACA,MAAA,GAAqB,IACrB,OAAA,EAC4B;AAC5B,IAAA,MAAM,IAAA,GAAO,CAAA,eAAA,EAAkB,kBAAA,CAAmB,cAAc,CAAC,CAAA,UAAA,CAAA;AACjE,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,CAAC,CAAA,KAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgC,MAAM,EAAE,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,CAAA;AAAA,MAC5E,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,IAAA,CACE,cAAA,EACA,KAAA,EACA,OAAA,EACkB;AAClB,IAAA,MAAM,IAAA,GAAO,CAAA,eAAA,EAAkB,kBAAA,CAAmB,cAAc,CAAC,CAAA,UAAA,CAAA;AACjE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAc,IAAA,EAAM,OAAO,OAAO,CAAA;AAAA,EACrD;AACF;;;AC/CO,IAAM,wBAAN,MAA4B;AAAA;AAAA,EAKjC,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAC3B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB,IAAI,CAAA;AAAA,EAC3C;AAAA,EAF6B,IAAA;AAAA;AAAA,EAHpB,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBT,IAAA,CACE,MAAA,GAAkC,EAAC,EACnC,OAAA,EACiC;AACjC,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,GAAG,SAAQ,GAAI,MAAA;AACtC,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,CAAC,CAAA,KACC,IAAA,CAAK,IAAA,CAAK,IAAqC,iBAAA,EAAmB;AAAA,QAChE,KAAA,EAAO,EAAE,GAAG,OAAA,EAAS,GAAG,CAAA,EAAE;AAAA,QAC1B;AAAA,OACD,CAAA;AAAA,MACH,EAAE,OAAO,MAAA,EAAO;AAAA,MAChB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAA,CAAI,IAAU,OAAA,EAAiD;AAC7D,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAkB,kBAAkB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,CAAA,EAAK;AAAA,MAC9E;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAA,CAAO,OAAgC,OAAA,EAAiD;AACtF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAmB,iBAAA,EAAmB,OAAO,OAAO,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAA,CAAO,EAAA,EAAU,KAAA,EAAyB,OAAA,EAAyC;AACjF,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,eAAA,EAAkB,kBAAA,CAAmB,EAAE,CAAC,CAAA,QAAA,CAAA;AAAA,MACxC,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAA,CAAK,IAAU,OAAA,EAAiD;AAC9D,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,eAAA,EAAkB,kBAAA,CAAmB,EAAE,CAAC,CAAA,MAAA,CAAA;AAAA,MACxC,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAA,CAAO,IAAU,OAAA,EAAiD;AAChE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,eAAA,EAAkB,kBAAA,CAAmB,EAAE,CAAC,CAAA,QAAA,CAAA;AAAA,MACxC,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,SAAA,CACE,EAAA,EACA,KAAA,EACA,OAAA,EACuB;AACvB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,eAAA,EAAkB,kBAAA,CAAmB,EAAE,CAAC,CAAA,WAAA,CAAA;AAAA,MACxC,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,WAAA,CAAY,IAAU,OAAA,EAAiD;AACrE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,eAAA,EAAkB,kBAAA,CAAmB,EAAE,CAAC,CAAA,aAAA,CAAA;AAAA,MACxC,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;AC5IO,IAAM,uBAAN,MAA2B;AAAA;AAAA,EAEhC,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,IAAA,CAAK,MAAA,GAAqB,EAAC,EAAG,OAAA,EAA0D;AACtF,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,CAAC,CAAA,KACC,IAAA,CAAK,IAAA,CAAK,IAAoC,iBAAA,EAAmB;AAAA,QAC/D,KAAA,EAAO,CAAA;AAAA,QACP;AAAA,OACD,CAAA;AAAA,MACH,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,kBAAA,CACE,QACA,OAAA,EACqC;AACrC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,eAAA,EAAkB,kBAAA,CAAmB,MAAM,CAAC,CAAA,kBAAA,CAAA;AAAA,MAC5C,EAAE,OAAA;AAAQ,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,SAAA,CACE,MAAA,EACA,KAAA,EACA,OAAA,EACsB;AACtB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,eAAA,EAAkB,kBAAA,CAAmB,MAAM,CAAC,CAAA,WAAA,CAAA;AAAA,MAC5C,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,YAAA,CACE,MAAA,EACA,KAAA,EACA,OAAA,EACsB;AACtB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,eAAA,EAAkB,kBAAA,CAAmB,MAAM,CAAC,CAAA,eAAA,CAAA;AAAA,MAC5C,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAA,CACE,MAAA,EACA,KAAA,GAAqC,IACrC,OAAA,EACsB;AACtB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,eAAA,EAAkB,kBAAA,CAAmB,MAAM,CAAC,CAAA,aAAA,CAAA;AAAA,MAC5C,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;ACxGO,IAAM,2BAAN,MAA+B;AAAA;AAAA,EAEpC,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,IAAA,CACE,MAAA,GAAqB,EAAC,EACtB,OAAA,EACoC;AACpC,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,CAAC,CAAA,KACC,IAAA,CAAK,IAAA,CAAK,IAAwC,qBAAA,EAAuB;AAAA,QACvE,KAAA,EAAO,CAAA;AAAA,QACP;AAAA,OACD,CAAA;AAAA,MACH,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAA,CAAI,IAAU,OAAA,EAAoD;AAChE,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,mBAAA,EAAsB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,CAAA;AAAA,MAC5C,EAAE,OAAA;AAAQ,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAA,CACE,EAAA,EACA,KAAA,EACA,OAAA,EAC0B;AAC1B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,mBAAA,EAAsB,kBAAA,CAAmB,EAAE,CAAC,CAAA,YAAA,CAAA;AAAA,MAC5C,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,OAAA,EAA6D;AAC5E,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAA8B,qBAAA,EAAuB,EAAE,SAAS,CAAA;AAAA,EACnF;AACF;;;AC/DO,IAAM,+BAAN,MAAmC;AAAA;AAAA,EAExC,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,IAAA,CACE,MAAA,GAAqB,EAAC,EACtB,OAAA,EACwC;AACxC,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,CAAC,CAAA,KACC,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,QACR,0BAAA;AAAA,QACA,EAAE,KAAA,EAAO,CAAA,EAAG,OAAA;AAAQ,OACtB;AAAA,MACF,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAA,CAAI,IAAU,OAAA,EAAwD;AACpE,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,wBAAA,EAA2B,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,CAAA;AAAA,MACjD,EAAE,OAAA;AAAQ,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,CACE,OACA,OAAA,EAC8B;AAC9B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,0BAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CAAO,IAAU,OAAA,EAAwD;AACvE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,wBAAA,EAA2B,kBAAA,CAAmB,EAAE,CAAC,CAAA,QAAA,CAAA;AAAA,MACjD,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;AC7DO,IAAM,4BAAN,MAAgC;AAAA;AAAA,EAErC,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,IAAA,CACE,MAAA,GAAqB,EAAC,EACtB,OAAA,EACqC;AACrC,IAAA,OAAO,IAAI,iBAAA;AAAA,MACT,CAAC,CAAA,KACC,IAAA,CAAK,IAAA,CAAK,IAAyC,sBAAA,EAAwB;AAAA,QACzE,KAAA,EAAO,CAAA;AAAA,QACP;AAAA,OACD,CAAA;AAAA,MACH,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAA,CAAI,IAAU,OAAA,EAAqD;AACjE,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,CAAA;AAAA,MAC7C,EAAE,OAAA;AAAQ,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,CACE,OACA,OAAA,EAC2B;AAC3B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAuB,sBAAA,EAAwB,OAAO,OAAO,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,CACE,EAAA,EACA,KAAA,EACA,OAAA,EAC2B;AAC3B,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA;AAAA,MACf,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,CAAA;AAAA,MAC7C,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,CAAO,IAAU,OAAA,EAAyC;AACxD,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA;AAAA,MACf,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,CAAA;AAAA,MAC7C;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAA,CACE,EAAA,EACA,KAAA,EACA,OAAA,EAC6C;AAC7C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,EAAE,CAAC,CAAA,SAAA,CAAA;AAAA,MAC7C,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAA,CACE,EAAA,EACA,KAAA,EACA,OAAA,EAC6C;AAC7C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,EAAE,CAAC,CAAA,WAAA,CAAA;AAAA,MAC7C,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;AC7GA,IAAM,yBAAA,GAA4B,GAAA;AAoC3B,IAAM,WAAN,MAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAepB,eACE,OAAA,EACA,MAAA,EACA,MAAA,EACA,OAAA,GAAyB,EAAC,EACZ;AACd,IAAA,MAAM,EAAE,aAAA,EAAe,KAAA,KAAU,IAAA,CAAK,OAAA,CAAQ,SAAS,MAAM,CAAA;AAC7D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,aAAA,EAAe,MAAM,CAAA;AACpD,IAAA,IAAA,CAAK,YAAY,KAAA,EAAO,QAAA,EAAU,MAAA,IAAU,EAAA,EAAI,eAAe,OAAO,CAAA;AACtE,IAAA,OAAO,IAAA,CAAK,WAAW,OAAO,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,mBAAA,CACJ,OAAA,EACA,QACA,MAAA,EACA,OAAA,GAAyB,EAAC,EACH;AACvB,IAAA,MAAM,EAAE,aAAA,EAAe,KAAA,KAAU,IAAA,CAAK,OAAA,CAAQ,SAAS,MAAM,CAAA;AAC7D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,eAAe,MAAM,CAAA;AAC3D,IAAA,IAAA,CAAK,YAAY,KAAA,EAAO,QAAA,EAAU,MAAA,IAAU,EAAA,EAAI,eAAe,OAAO,CAAA;AACtE,IAAA,OAAO,IAAA,CAAK,WAAW,OAAO,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,CAAS,eAAuB,MAAA,EAAwB;AACtD,IAAA,MAAM,aAAa,cAAA,EAAe;AAClC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,iCAAA,CAAkC;AAAA,QAC1C,OAAA,EACE;AAAA,OACH,CAAA;AAAA,IACH;AACA,IAAA,OAAO,UAAA,CAAW,WAAW,QAAA,EAAU,MAAM,EAAE,MAAA,CAAO,aAAa,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,CAAU,aAAA,EAAuB,MAAA,EAAiC;AACtE,IAAA,MAAM,MAAA,GAAS,WAAW,MAAA,EAAQ,MAAA;AAClC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,iCAAA,CAAkC;AAAA,QAC1C,OAAA,EACE;AAAA,OACH,CAAA;AAAA,IACH;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,EAAY;AAC5B,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,SAAA;AAAA,MACvB,KAAA;AAAA,MACA,GAAA,CAAI,OAAO,MAAM,CAAA;AAAA,MACjB,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,MAChC,KAAA;AAAA,MACA,CAAC,MAAM;AAAA,KACT;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,IAAA,CAAK,QAAQ,GAAA,EAAK,GAAA,CAAI,MAAA,CAAO,aAAa,CAAC,CAAA;AACpE,IAAA,OAAO,KAAA,CAAM,IAAI,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAMQ,OAAA,CACN,SACA,MAAA,EAC6D;AAC7D,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,iCAAA,CAAkC;AAAA,QAC1C,OAAA,EAAS,qCAAA;AAAA,QACT,QAAQ,MAAA,IAAU;AAAA,OACnB,CAAA;AAAA,IACH;AACA,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,CAAM,CAAA,IAAK,CAAC,MAAM,EAAA,EAAI;AACzB,MAAA,MAAM,IAAI,iCAAA,CAAkC;AAAA,QAC1C,OAAA,EACE,2EAAA;AAAA,QACF;AAAA,OACD,CAAA;AAAA,IACH;AACA,IAAA,MAAM,QAAA,GAAW,OAAO,OAAA,KAAY,QAAA,GAAW,UAAU,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,OAAO,CAAA;AACzF,IAAA,OAAO,EAAE,eAAe,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,CAAA,EAAI,QAAQ,IAAI,KAAA,EAA0C;AAAA,EAC9F;AAAA,EAEQ,WAAA,CACN,KAAA,EACA,QAAA,EACA,MAAA,EACA,eACA,OAAA,EACM;AACN,IAAA,IAAI,CAAC,qBAAA,CAAsB,KAAA,CAAM,EAAA,EAAI,QAAQ,CAAA,EAAG;AAC9C,MAAA,MAAM,IAAI,iCAAA,CAAkC;AAAA,QAC1C,OAAA,EAAS,qDAAA;AAAA,QACT,MAAA;AAAA,QACA,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AACA,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,yBAAA;AACvC,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,MAAM,GAAA,GAAM,QAAQ,gBAAA,IAAoB,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACpE,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AACzB,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,EAAG;AACxB,QAAA,MAAM,IAAI,iCAAA,CAAkC;AAAA,UAC1C,OAAA,EAAS,CAAA,0CAAA,EAA6C,KAAA,CAAM,CAAC,CAAA,CAAA;AAAA,UAC7D;AAAA,SACD,CAAA;AAAA,MACH;AACA,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,EAAE,IAAI,SAAA,EAAW;AAClC,QAAA,MAAM,IAAI,iCAAA,CAAkC;AAAA,UAC1C,SAAS,CAAA,iCAAA,EAAoC,SAAS,CAAA,6BAAA,EAAgC,EAAE,SAAS,GAAG,CAAA,EAAA,CAAA;AAAA,UACpG;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,WAAW,OAAA,EAA4C;AAC7D,IAAA,MAAM,IAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GAAW,UAAU,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,OAAO,CAAA;AAC1E,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,iCAAA,CAAkC;AAAA,QAC1C,OAAA,EAAS,0CAAA;AAAA,QACT,OAAA,EAAS,IAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,EACF;AACF;AAMA,SAAS,YAAY,MAAA,EAAoD;AACvE,EAAA,MAAM,QAAyC,EAAC;AAChD,EAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACvC,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,IAAI,OAAO,EAAA,EAAI;AACf,IAAA,MAAM,MAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACtC,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,EAAA,GAAK,CAAC,EAAE,IAAA,EAAK;AACzC,IAAA,IAAI,QAAQ,GAAA,IAAO,GAAA,KAAQ,IAAA,EAAM,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,EAChD;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,qBAAA,CAAsB,GAAW,CAAA,EAAoB;AAC5D,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,IAAA,IAAQ,EAAE,UAAA,CAAW,CAAC,CAAA,GAAI,CAAA,CAAE,WAAW,CAAC,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,IAAA,KAAS,CAAA;AAClB;AAEA,SAAS,MAAM,KAAA,EAA2B;AACxC,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AACtB,IAAA,GAAA,IAAO,EAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,GAAA;AACT;AAMO,IAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAYrC,IAAI,gBAAA;AAmBJ,SAAS,cAAA,GAAyC;AAChD,EAAA,IAAI,gBAAA,KAAqB,MAAA,EAAW,OAAO,gBAAA,IAAoB,MAAA;AAC/D,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GACJ,OAAO,YAAA,KAAiB,UAAA,GACpB,eACC,UAAA,CAAqD,OAAA;AAC5D,IAAA,gBAAA,GAAoB,GAAA,GAAM,aAAa,CAAA,IAAgC,IAAA;AAAA,EACzE,CAAA,CAAA,MAAQ;AACN,IAAA,gBAAA,GAAmB,IAAA;AAAA,EACrB;AACA,EAAA,OAAO,gBAAA,IAAoB,MAAA;AAC7B;;;AC5QO,IAAM,UAAN,MAAc;AAAA;AAAA,EAEV,MAAA;AAAA;AAAA,EAEA,aAAA;AAAA;AAAA,EAEA,YAAA;AAAA;AAAA,EAEA,gBAAA;AAAA;AAAA,EAEA,oBAAA;AAAA;AAAA,EAEA,iBAAA;AAAA;AAAA,EAEA,QAAA,GAAqB,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU9B,OAAgB,QAAA,GAAqB,QAAA;AAAA,EAErC,YAAY,MAAA,EAA6B;AACvC,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,MAAM,CAAA;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,cAAA,CAAe,IAAI,CAAA;AACrC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,qBAAA,CAAsB,IAAI,CAAA;AACnD,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,oBAAA,CAAqB,IAAI,CAAA;AACjD,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,wBAAA,CAAyB,IAAI,CAAA;AACzD,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAI,4BAAA,CAA6B,IAAI,CAAA;AACjE,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAI,yBAAA,CAA0B,IAAI,CAAA;AAAA,EAC7D;AACF","file":"index.js","sourcesContent":["/**\n * Error hierarchy for the Wassist SDK.\n *\n * Every network response and webhook signature failure surfaces as a subclass\n * of {@link WassistError}, so consumers can branch on `instanceof` (Stripe\n * convention) and read `statusCode`, `code`, `requestId`, and the raw body.\n */\n\nexport interface WassistErrorOptions {\n message: string;\n statusCode?: number;\n code?: string;\n requestId?: string;\n raw?: unknown;\n cause?: unknown;\n}\n\nexport class WassistError extends Error {\n /** HTTP status code if this error originated from an API response. */\n readonly statusCode?: number;\n /** Machine-readable error code (e.g. `not_found`) when the API provides one. */\n readonly code?: string;\n /**\n * Request ID surfaced by the Wassist API in the `X-Request-Id` response\n * header. Include this when filing support tickets.\n */\n readonly requestId?: string;\n /** Raw response body, parsed as JSON when possible. */\n readonly raw?: unknown;\n\n constructor(opts: WassistErrorOptions) {\n super(opts.message);\n this.name = new.target.name;\n this.statusCode = opts.statusCode;\n this.code = opts.code;\n this.requestId = opts.requestId;\n this.raw = opts.raw;\n if (opts.cause !== undefined) {\n (this as { cause?: unknown }).cause = opts.cause;\n }\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 401 Unauthorized — the API key was missing, malformed, or revoked. */\nexport class WassistAuthenticationError extends WassistError {}\n\n/** 403 Forbidden — the API key lacks permission for this resource. */\nexport class WassistPermissionError extends WassistError {}\n\n/** 400 / 422 — the request body or parameters were invalid. */\nexport class WassistInvalidRequestError extends WassistError {}\n\n/** 404 Not Found — the requested resource does not exist. */\nexport class WassistNotFoundError extends WassistError {}\n\n/** 409 Conflict — the request conflicts with the current state. */\nexport class WassistConflictError extends WassistError {}\n\n/** 429 Too Many Requests — slow down or wait `retryAfter` seconds. */\nexport class WassistRateLimitError extends WassistError {\n /** Suggested wait in seconds, from the `Retry-After` response header. */\n readonly retryAfter?: number;\n\n constructor(opts: WassistErrorOptions & { retryAfter?: number }) {\n super(opts);\n this.retryAfter = opts.retryAfter;\n }\n}\n\n/** 5xx — something is wrong on Wassist's side. The SDK retries these automatically. */\nexport class WassistAPIError extends WassistError {}\n\n/** A network-level failure (DNS, TCP, TLS, abort, etc.) — never made it to the server. */\nexport class WassistConnectionError extends WassistError {}\n\n/** The request exceeded the configured `timeout`. */\nexport class WassistTimeoutError extends WassistError {}\n\n/**\n * Webhook signature could not be verified.\n *\n * Thrown by {@link Wassist.webhooks.constructEvent} when the header is\n * malformed, the HMAC doesn't match, or the timestamp falls outside the\n * tolerance window.\n */\nexport class WassistSignatureVerificationError extends WassistError {\n /** The raw `X-Wassist-Signature` header value as received. */\n readonly header?: string;\n /** The payload that was verified, as the SDK saw it. */\n readonly payload?: string;\n\n constructor(\n opts: WassistErrorOptions & { header?: string; payload?: string }\n ) {\n super(opts);\n this.header = opts.header;\n this.payload = opts.payload;\n }\n}\n\n/**\n * Map an HTTP status code + response body to the most specific error class.\n *\n * @internal\n */\nexport function errorFromResponse(args: {\n status: number;\n body: unknown;\n requestId?: string;\n retryAfter?: number;\n}): WassistError {\n const { status, body, requestId, retryAfter } = args;\n\n const message = extractMessage(body) ?? `HTTP ${status}`;\n const code = extractCode(body);\n const base = { message, statusCode: status, code, requestId, raw: body };\n\n if (status === 401) return new WassistAuthenticationError(base);\n if (status === 403) return new WassistPermissionError(base);\n if (status === 404) return new WassistNotFoundError(base);\n if (status === 409) return new WassistConflictError(base);\n if (status === 429) return new WassistRateLimitError({ ...base, retryAfter });\n if (status === 400 || status === 422) {\n return new WassistInvalidRequestError(base);\n }\n if (status >= 500 && status < 600) return new WassistAPIError(base);\n return new WassistError(base);\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const b = body as Record<string, unknown>;\n if (typeof b.error === 'string') return b.error;\n if (typeof b.message === 'string') return b.message;\n if (typeof b.detail === 'string') return b.detail;\n if (b.error && typeof b.error === 'object') {\n const inner = (b.error as Record<string, unknown>).message;\n if (typeof inner === 'string') return inner;\n }\n return undefined;\n}\n\nfunction extractCode(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const b = body as Record<string, unknown>;\n if (typeof b.code === 'string') return b.code;\n return undefined;\n}\n","/**\n * The package version, embedded into the `User-Agent` header on every\n * outbound request so Wassist can correlate API traffic with SDK versions.\n *\n * Updated in lockstep with `package.json`'s `version` field.\n */\nexport const SDK_VERSION = '0.1.0';\n","/**\n * Low-level HTTP transport used by every resource module.\n *\n * Wraps `fetch` with:\n * - `X-API-Key` authentication\n * - `/api/v1/` path prefix handling\n * - Per-request timeout (cancels via `AbortController`)\n * - Exponential-backoff retries on `429` and `5xx` (honors `Retry-After`)\n * - `Idempotency-Key` opt-in for safe `POST` retries\n * - Typed error mapping via {@link errorFromResponse}\n * - `requestId` extraction from the `X-Request-Id` response header\n */\n\nimport {\n WassistConnectionError,\n WassistError,\n WassistRateLimitError,\n WassistTimeoutError,\n errorFromResponse,\n} from './errors';\nimport type { RequestOptions } from './types/common';\nimport { SDK_VERSION } from './version';\n\n/**\n * The minimal `fetch` signature this SDK depends on. Any spec-compliant\n * implementation will satisfy it — Node 18+, edge runtimes, browsers, Bun.\n */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\n/**\n * Configuration for {@link Wassist}.\n */\nexport interface WassistClientConfig {\n /**\n * Your Wassist API key. Find it at\n * https://wassist.app/settings → API Keys.\n */\n apiKey: string;\n /**\n * Base URL of the Wassist API.\n *\n * @default 'https://backend.wassist.app'\n */\n baseUrl?: string;\n /**\n * Default request timeout in milliseconds. Individual calls can override\n * via the per-call `timeout` option.\n *\n * @default 60_000\n */\n timeout?: number;\n /**\n * Maximum number of retry attempts on `429` / `5xx` / network errors.\n * The total number of requests is `maxRetries + 1`.\n *\n * @default 2\n */\n maxRetries?: number;\n /**\n * Custom `fetch` implementation. Useful for tests, mocking, or runtimes\n * that don't expose `globalThis.fetch`.\n *\n * @default globalThis.fetch\n */\n fetch?: FetchLike;\n}\n\nconst DEFAULT_BASE_URL = 'https://backend.wassist.app';\nconst DEFAULT_TIMEOUT_MS = 60_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst API_VERSION_PREFIX = '/api/v1';\nconst RETRY_STATUSES: ReadonlySet<number> = new Set([408, 425, 429, 500, 502, 503, 504]);\n\n/** Query-string values supported on every request. */\nexport type QueryValue = string | number | boolean | undefined | null;\n\n/** A loose-record shape for query strings — every field is optional and stringly-typed. */\nexport type QueryParams = { readonly [key: string]: QueryValue };\n\ninterface RequestArgs {\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n query?: object;\n body?: unknown;\n options?: RequestOptions;\n}\n\n/**\n * @internal\n */\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: FetchLike;\n\n constructor(config: WassistClientConfig) {\n if (!config.apiKey) {\n throw new WassistError({\n message:\n 'A Wassist `apiKey` is required. Create one at https://wassist.app/settings.',\n });\n }\n this.apiKey = config.apiKey;\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT_MS;\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n const provided = config.fetch ?? globalThis.fetch?.bind(globalThis);\n if (!provided) {\n throw new WassistError({\n message:\n 'No `fetch` implementation found. Pass one via `fetch` in the Wassist constructor, or run on Node 18+ / a runtime with a global `fetch`.',\n });\n }\n this.fetchImpl = provided;\n }\n\n get<T>(path: string, args?: Omit<RequestArgs, 'method' | 'path' | 'body'>): Promise<T> {\n return this.request<T>({ ...args, method: 'GET', path });\n }\n post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>({ method: 'POST', path, body, options });\n }\n put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>({ method: 'PUT', path, body, options });\n }\n patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>({ method: 'PATCH', path, body, options });\n }\n delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>({ method: 'DELETE', path, options });\n }\n\n private async request<T>(args: RequestArgs): Promise<T> {\n const url = this.buildUrl(args.path, args.query);\n const headers = this.buildHeaders(args);\n const body = args.body === undefined ? undefined : JSON.stringify(args.body);\n const maxRetries = args.options?.maxRetries ?? this.maxRetries;\n const timeout = args.options?.timeout ?? this.timeout;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const response = await this.doFetch({\n url,\n method: args.method,\n headers,\n body,\n timeout,\n signal: args.options?.signal,\n });\n\n if (response.ok) {\n if (response.status === 204) return undefined as T;\n // Some endpoints return empty bodies — handle gracefully.\n const text = await response.text();\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n }\n\n // Build a typed error and decide whether to retry.\n const requestId = response.headers.get('x-request-id') ?? undefined;\n const retryAfter = parseRetryAfter(response.headers.get('retry-after'));\n const parsedBody = await safeJson(response);\n const apiError = errorFromResponse({\n status: response.status,\n body: parsedBody,\n requestId,\n retryAfter,\n });\n\n const isRetryable = RETRY_STATUSES.has(response.status);\n if (isRetryable && attempt < maxRetries) {\n await sleep(computeBackoff(attempt, apiError));\n lastError = apiError;\n continue;\n }\n throw apiError;\n } catch (err) {\n if (err instanceof WassistError) {\n // Already a typed SDK error from the branch above.\n if (\n attempt < maxRetries &&\n (err instanceof WassistRateLimitError || isRetryableApiError(err))\n ) {\n await sleep(computeBackoff(attempt, err));\n lastError = err;\n continue;\n }\n throw err;\n }\n\n // Map fetch-level failures.\n const mapped = mapFetchError(err);\n if (attempt < maxRetries && isRetryableTransport(mapped)) {\n await sleep(computeBackoff(attempt));\n lastError = mapped;\n continue;\n }\n throw mapped;\n }\n }\n // Should be unreachable — every path above either returns or throws.\n throw lastError instanceof Error\n ? lastError\n : new WassistError({ message: 'Wassist request failed after retries.' });\n }\n\n private buildUrl(path: string, query?: object): string {\n const prefixedPath = path.startsWith('/') ? path : `/${path}`;\n const fullPath = prefixedPath.startsWith(API_VERSION_PREFIX)\n ? prefixedPath\n : `${API_VERSION_PREFIX}${prefixedPath}`;\n const url = new URL(this.baseUrl + fullPath);\n if (query) {\n for (const [key, value] of Object.entries(query as Record<string, QueryValue>)) {\n if (value === undefined || value === null) continue;\n url.searchParams.append(key, String(value));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(args: RequestArgs): Record<string, string> {\n const headers: Record<string, string> = {\n 'X-API-Key': this.apiKey,\n 'Accept': 'application/json',\n 'User-Agent': `wassist-sdk-node/${SDK_VERSION}`,\n 'X-Wassist-Client': `wassist-sdk-node/${SDK_VERSION}`,\n };\n if (args.body !== undefined) headers['Content-Type'] = 'application/json';\n if (args.options?.idempotencyKey) {\n headers['Idempotency-Key'] = args.options.idempotencyKey;\n }\n if (args.options?.headers) {\n for (const [k, v] of Object.entries(args.options.headers)) headers[k] = v;\n }\n return headers;\n }\n\n private async doFetch(args: {\n url: string;\n method: string;\n headers: Record<string, string>;\n body?: string;\n timeout: number;\n signal?: AbortSignal;\n }): Promise<Response> {\n const controller = new AbortController();\n const onAbort = () => controller.abort();\n if (args.signal) {\n if (args.signal.aborted) controller.abort();\n else args.signal.addEventListener('abort', onAbort, { once: true });\n }\n const timeoutId = setTimeout(() => controller.abort(), args.timeout);\n try {\n return await this.fetchImpl(args.url, {\n method: args.method,\n headers: args.headers,\n body: args.body,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n if (args.signal) args.signal.removeEventListener('abort', onAbort);\n }\n }\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction safeJson(response: Response): Promise<unknown> {\n return response\n .text()\n .then((text) => {\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n })\n .catch(() => undefined);\n}\n\nfunction parseRetryAfter(value: string | null): number | undefined {\n if (!value) return undefined;\n const asNum = Number(value);\n if (Number.isFinite(asNum) && asNum >= 0) return asNum;\n const asDate = Date.parse(value);\n if (Number.isNaN(asDate)) return undefined;\n return Math.max(0, Math.floor((asDate - Date.now()) / 1000));\n}\n\nfunction computeBackoff(attempt: number, err?: WassistError): number {\n // Honor server-supplied Retry-After (seconds) when present.\n if (err instanceof WassistRateLimitError && typeof err.retryAfter === 'number') {\n return err.retryAfter * 1000;\n }\n // Exponential backoff with full jitter: random in [base, 2 * base).\n const base = 500 * Math.pow(2, attempt);\n const jitter = base * Math.random();\n return Math.min(base + jitter, 8_000);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isRetryableApiError(err: WassistError): boolean {\n return err.statusCode !== undefined && RETRY_STATUSES.has(err.statusCode);\n}\n\nfunction isRetryableTransport(err: WassistError): boolean {\n return err instanceof WassistConnectionError;\n}\n\nfunction mapFetchError(err: unknown): WassistError {\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n return new WassistTimeoutError({\n message: 'Request timed out.',\n cause: err,\n });\n }\n return new WassistConnectionError({\n message: `Network error: ${err.message}`,\n cause: err,\n });\n }\n return new WassistConnectionError({ message: 'Unknown network error.' });\n}\n","import type { PageParams, PaginatedResponse, RequestOptions } from './types/common';\n\n/**\n * The shape of a single fetched page, returned by {@link AutoPaginatedList.firstPage}.\n */\nexport interface Page<T> {\n /** The items on this page. */\n data: T[];\n /** Total number of items across all pages. */\n totalCount: number;\n /** Whether there is at least one more page after this one. */\n hasMore: boolean;\n /** Offset to pass to the next call to continue from this page. */\n nextOffset: number;\n}\n\n/**\n * Lazy auto-paginating wrapper around any Wassist list endpoint.\n *\n * Iteration is lazy — pages are fetched on demand as you consume them, so\n * `for await` over a million-item list never has the whole result set in\n * memory.\n *\n * @example Iterate every item\n * ```ts\n * for await (const conv of wassist.conversations.list({ limit: 100 })) {\n * console.log(conv.id);\n * }\n * ```\n *\n * @example Just the first page\n * ```ts\n * const { data, hasMore } = await wassist.conversations.list().firstPage();\n * ```\n *\n * @example Collect everything into an array (small lists only)\n * ```ts\n * const all = await wassist.agents.list().all();\n * ```\n */\nexport class AutoPaginatedList<T> implements AsyncIterable<T> {\n private readonly fetchPage: (params: PageParams) => Promise<PaginatedResponse<T>>;\n private readonly params: PageParams;\n private readonly options: RequestOptions | undefined;\n\n /** @internal */\n constructor(\n fetchPage: (params: PageParams) => Promise<PaginatedResponse<T>>,\n params: PageParams = {},\n options?: RequestOptions\n ) {\n this.fetchPage = fetchPage;\n this.params = params;\n this.options = options;\n }\n\n /**\n * Async iterator over every item across every page, fetched lazily.\n */\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n const limit = this.params.limit ?? 50;\n let offset = this.params.offset ?? 0;\n let hasMore = true;\n\n while (hasMore) {\n const page = await this.fetchPage({ limit, offset });\n for (const item of page.results) yield item;\n hasMore = page.next !== null && page.results.length > 0;\n offset += page.results.length || limit;\n }\n }\n\n /**\n * Fetch the first page only and return it as a {@link Page}.\n */\n async firstPage(): Promise<Page<T>> {\n const limit = this.params.limit ?? 50;\n const offset = this.params.offset ?? 0;\n const page = await this.fetchPage({ limit, offset });\n return {\n data: page.results,\n totalCount: page.count,\n hasMore: page.next !== null,\n nextOffset: offset + page.results.length,\n };\n }\n\n /**\n * Walk every page and collect every item into a single array.\n *\n * Convenient for small lists; for large ones prefer `for await`.\n */\n async all(): Promise<T[]> {\n const out: T[] = [];\n for await (const item of this) out.push(item);\n return out;\n }\n}\n\n// Re-export for resource modules.\nexport type { RequestOptions };\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n Agent,\n CreateAgentInput,\n CreateBYOAAgentInput,\n UpdateAgentInput,\n} from '../types/agents';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Methods for managing agents — the AI personas you connect to WhatsApp.\n *\n * Documented at https://docs.wassist.app/api-reference/agents/list.\n */\nexport class AgentsResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every agent on your account.\n *\n * Returns a lazily-fetched paginated list. Use `for await` to walk all\n * pages, or `.firstPage()` for just the first.\n *\n * `GET /agents/`\n *\n * @example\n * ```ts\n * for await (const agent of wassist.agents.list()) {\n * console.log(agent.id, agent.name);\n * }\n * ```\n */\n list(params: PageParams = {}, options?: RequestOptions): AutoPaginatedList<Agent> {\n return new AutoPaginatedList<Agent>(\n (p) => this.http.get<PaginatedResponse<Agent>>('/agents/', { query: p, options }),\n params,\n options\n );\n }\n\n /**\n * Retrieve a single agent by ID.\n *\n * `GET /agents/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<Agent> {\n return this.http.get<Agent>(`/agents/${encodeURIComponent(id)}/`, { options });\n }\n\n /**\n * Create a new agent with the given display name. Configure it further\n * with {@link AgentsResource.update}.\n *\n * `POST /agents/`\n */\n create(input: CreateAgentInput, options?: RequestOptions): Promise<Agent> {\n return this.http.post<Agent>('/agents/', input, options);\n }\n\n /**\n * Create a Bring-Your-Own-Agent (BYOA) — Wassist forwards inbound\n * messages to your webhook and posts back replies you author yourself.\n *\n * `POST /agents/byoa/`\n */\n createBYOA(input: CreateBYOAAgentInput, options?: RequestOptions): Promise<Agent> {\n return this.http.post<Agent>('/agents/byoa/', input, options);\n }\n\n /**\n * Partially update an agent. Only the fields you pass are modified.\n *\n * Nested sub-resource arrays (tools, memory keys, etc.) are diffed\n * server-side by `id`: include an `id` to update an existing entry,\n * omit it to create one.\n *\n * `PATCH /agents/{id}/`\n */\n update(id: UUID, input: UpdateAgentInput, options?: RequestOptions): Promise<Agent> {\n return this.http.patch<Agent>(`/agents/${encodeURIComponent(id)}/`, input, options);\n }\n\n /**\n * Soft-delete an agent. The agent stops responding immediately;\n * conversation history is retained.\n *\n * `DELETE /agents/{id}/`\n */\n delete(id: UUID, options?: RequestOptions): Promise<void> {\n return this.http.delete<void>(`/agents/${encodeURIComponent(id)}/`, options);\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type { Message, SendMessageInput } from '../types/messages';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Messages within a conversation. Reached via `wassist.conversations.messages`.\n *\n * Documented at https://docs.wassist.app/api-reference/conversations/messages/list\n * and https://docs.wassist.app/api-reference/conversations/messages/send.\n */\nexport class MessagesResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List messages in a conversation, newest first.\n *\n * `GET /conversations/{id}/messages/`\n */\n list(\n conversationId: UUID,\n params: PageParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<Message> {\n const path = `/conversations/${encodeURIComponent(conversationId)}/messages/`;\n return new AutoPaginatedList<Message>(\n (p) => this.http.get<PaginatedResponse<Message>>(path, { query: p, options }),\n params,\n options\n );\n }\n\n /**\n * Send a message in a conversation.\n *\n * The input is a discriminated union — set `type` and populate the\n * matching field (`text`, `template`, `cta`, or `unified`).\n *\n * `POST /conversations/{id}/messages/`\n *\n * @example Plain text\n * ```ts\n * await wassist.conversations.messages.send(conv.id, {\n * type: 'text',\n * text: { body: 'Hello!' },\n * });\n * ```\n *\n * @example Approved template\n * ```ts\n * await wassist.conversations.messages.send(conv.id, {\n * type: 'template',\n * template: { name: 'order_update', variables: { body: ['Alex', '#1234'] } },\n * });\n * ```\n */\n send(\n conversationId: UUID,\n input: SendMessageInput,\n options?: RequestOptions\n ): Promise<Message> {\n const path = `/conversations/${encodeURIComponent(conversationId)}/messages/`;\n return this.http.post<Message>(path, input, options);\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n Conversation,\n CreateConversationInput,\n ListConversationsParams,\n SubscribeConversationInput,\n} from '../types/conversations';\nimport type { PromptAgentInput } from '../types/messages';\nimport type { PaginatedResponse, RequestOptions, UUID } from '../types/common';\nimport { MessagesResource } from './messages';\n\n/**\n * Methods for managing conversations — ongoing WhatsApp chats between\n * your numbers and a contact.\n *\n * Nested namespace: `wassist.conversations.messages` (see {@link MessagesResource}).\n */\nexport class ConversationsResource {\n /** Send and list messages within a conversation. */\n readonly messages: MessagesResource;\n\n /** @internal */\n constructor(private readonly http: HttpClient) {\n this.messages = new MessagesResource(http);\n }\n\n /**\n * List conversations on your account with rich filtering.\n *\n * `GET /conversations/`\n *\n * @example\n * ```ts\n * const recent = await wassist.conversations\n * .list({ ordering: '-last_message_time', limit: 20 })\n * .firstPage();\n * ```\n */\n list(\n params: ListConversationsParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<Conversation> {\n const { limit, offset, ...filters } = params;\n return new AutoPaginatedList<Conversation>(\n (p) =>\n this.http.get<PaginatedResponse<Conversation>>('/conversations/', {\n query: { ...filters, ...p },\n options,\n }),\n { limit, offset },\n options\n );\n }\n\n /**\n * Retrieve a single conversation by ID.\n *\n * `GET /conversations/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<Conversation> {\n return this.http.get<Conversation>(`/conversations/${encodeURIComponent(id)}/`, {\n options,\n });\n }\n\n /**\n * Create a new conversation with a contact.\n *\n * If the WhatsApp 24-hour reply window is closed for this contact, you\n * must include a `template` message to open it.\n *\n * `POST /conversations/`\n */\n create(input: CreateConversationInput, options?: RequestOptions): Promise<Conversation> {\n return this.http.post<Conversation>('/conversations/', input, options);\n }\n\n /**\n * Prompt the agent in this conversation with a custom instruction.\n * Equivalent to \"wake the agent up and have it say this\" — useful for\n * outbound triggers and follow-ups.\n *\n * `POST /conversations/{id}/prompt/`\n */\n prompt(id: UUID, input: PromptAgentInput, options?: RequestOptions): Promise<void> {\n return this.http.post<void>(\n `/conversations/${encodeURIComponent(id)}/prompt/`,\n input,\n options\n );\n }\n\n /**\n * Send a WhatsApp read receipt for the most recent inbound message.\n *\n * `POST /conversations/{id}/read/`\n */\n read(id: UUID, options?: RequestOptions): Promise<Conversation> {\n return this.http.post<Conversation>(\n `/conversations/${encodeURIComponent(id)}/read/`,\n undefined,\n options\n );\n }\n\n /**\n * Display the WhatsApp typing indicator on the contact's device.\n *\n * Note: WhatsApp also marks the most recent inbound message as read as\n * a side effect — this is a platform limitation.\n *\n * `POST /conversations/{id}/typing/`\n */\n typing(id: UUID, options?: RequestOptions): Promise<Conversation> {\n return this.http.post<Conversation>(\n `/conversations/${encodeURIComponent(id)}/typing/`,\n undefined,\n options\n );\n }\n\n /**\n * Route this conversation to a webhook. The agent pipeline is skipped\n * while the override is active.\n *\n * Fires a `subscription.activated` event on the target webhook.\n *\n * `POST /conversations/{id}/subscribe/`\n */\n subscribe(\n id: UUID,\n input: SubscribeConversationInput,\n options?: RequestOptions\n ): Promise<Conversation> {\n return this.http.post<Conversation>(\n `/conversations/${encodeURIComponent(id)}/subscribe/`,\n input,\n options\n );\n }\n\n /**\n * Clear the per-conversation routing override and fall back to the\n * phone number's default routing.\n *\n * Fires a `subscription.revoked` event on the previously-subscribed\n * webhook (if any).\n *\n * `POST /conversations/{id}/unsubscribe/`\n */\n unsubscribe(id: UUID, options?: RequestOptions): Promise<Conversation> {\n return this.http.post<Conversation>(\n `/conversations/${encodeURIComponent(id)}/unsubscribe/`,\n undefined,\n options\n );\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n ConnectAgentInput,\n PhoneNumber,\n PhoneNumberBusinessProfile,\n SubscribePhoneNumberInput,\n UnsubscribePhoneNumberInput,\n} from '../types/phone-numbers';\nimport type { PageParams, PaginatedResponse, RequestOptions } from '../types/common';\n\n/**\n * Methods for managing your connected WhatsApp phone numbers and their\n * default routing.\n *\n * The `number` argument throughout is the E.164-format number without a\n * leading `+` (matches the {@link PhoneNumber.number} field).\n */\nexport class PhoneNumbersResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every WhatsApp number on your account.\n *\n * `GET /phone-numbers/`\n */\n list(params: PageParams = {}, options?: RequestOptions): AutoPaginatedList<PhoneNumber> {\n return new AutoPaginatedList<PhoneNumber>(\n (p) =>\n this.http.get<PaginatedResponse<PhoneNumber>>('/phone-numbers/', {\n query: p,\n options,\n }),\n params,\n options\n );\n }\n\n /**\n * View the WhatsApp Business Profile (about, address, websites, etc.)\n * attached to this number.\n *\n * `GET /phone-numbers/{number}/business-profile/`\n */\n getBusinessProfile(\n number: string,\n options?: RequestOptions\n ): Promise<PhoneNumberBusinessProfile> {\n return this.http.get<PhoneNumberBusinessProfile>(\n `/phone-numbers/${encodeURIComponent(number)}/business-profile/`,\n { options }\n );\n }\n\n /**\n * Route inbound messages on this number to a webhook by default. Drops\n * any agent previously connected to the number.\n *\n * Phone-number routing changes do **not** fire\n * `subscription.activated` / `.revoked` webhook events — those are\n * reserved for per-conversation\n * {@link ConversationsResource.subscribe} /\n * {@link ConversationsResource.unsubscribe}.\n *\n * `POST /phone-numbers/{number}/subscribe/`\n */\n subscribe(\n number: string,\n input: SubscribePhoneNumberInput,\n options?: RequestOptions\n ): Promise<PhoneNumber> {\n return this.http.post<PhoneNumber>(\n `/phone-numbers/${encodeURIComponent(number)}/subscribe/`,\n input,\n options\n );\n }\n\n /**\n * Assign an agent as the default for this number. Drops any subscribed\n * webhook.\n *\n * The agent must already be owned by or shared with the authenticated\n * user.\n *\n * `POST /phone-numbers/{number}/connect-agent/`\n */\n connectAgent(\n number: string,\n input: ConnectAgentInput,\n options?: RequestOptions\n ): Promise<PhoneNumber> {\n return this.http.post<PhoneNumber>(\n `/phone-numbers/${encodeURIComponent(number)}/connect-agent/`,\n input,\n options\n );\n }\n\n /**\n * Clear default routing on this number entirely. Drops both the agent\n * and the webhook.\n *\n * `POST /phone-numbers/{number}/unsubscribe/`\n */\n unsubscribe(\n number: string,\n input: UnsubscribePhoneNumberInput = {},\n options?: RequestOptions\n ): Promise<PhoneNumber> {\n return this.http.post<PhoneNumber>(\n `/phone-numbers/${encodeURIComponent(number)}/unsubscribe/`,\n input,\n options\n );\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n AddNumberInput,\n AvailableNumbersResponse,\n WhatsAppAccount,\n} from '../types/whatsapp-accounts';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Methods for managing WhatsApp Business Accounts (WABAs) connected to\n * your Wassist account.\n */\nexport class WhatsAppAccountsResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every WhatsApp Business Account on your Wassist account.\n *\n * `GET /whatsapp-accounts/`\n */\n list(\n params: PageParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<WhatsAppAccount> {\n return new AutoPaginatedList<WhatsAppAccount>(\n (p) =>\n this.http.get<PaginatedResponse<WhatsAppAccount>>('/whatsapp-accounts/', {\n query: p,\n options,\n }),\n params,\n options\n );\n }\n\n /**\n * Retrieve a single WhatsApp Business Account by ID.\n *\n * `GET /whatsapp-accounts/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<WhatsAppAccount> {\n return this.http.get<WhatsAppAccount>(\n `/whatsapp-accounts/${encodeURIComponent(id)}/`,\n { options }\n );\n }\n\n /**\n * Add a pre-verified phone number (purchased via Meta's embedded\n * signup flow) to a WhatsApp Business Account.\n *\n * `POST /whatsapp-accounts/{id}/add-number/`\n */\n addNumber(\n id: UUID,\n input: AddNumberInput,\n options?: RequestOptions\n ): Promise<WhatsAppAccount> {\n return this.http.post<WhatsAppAccount>(\n `/whatsapp-accounts/${encodeURIComponent(id)}/add-number/`,\n input,\n options\n );\n }\n\n /**\n * List Twilio phone numbers available for purchase + verification.\n *\n * `GET /available-numbers/`\n */\n availableNumbers(options?: RequestOptions): Promise<AvailableNumbersResponse> {\n return this.http.get<AvailableNumbersResponse>('/available-numbers/', { options });\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n CreateWhatsAppLinkSessionInput,\n WhatsAppLinkSession,\n} from '../types/whatsapp-link-sessions';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Methods for managing WhatsApp account-linking sessions — the hosted\n * flow that lets your customers connect their own WABA to your platform.\n */\nexport class WhatsAppLinkSessionsResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every link session you've created.\n *\n * `GET /whatsapp-link-sessions/`\n */\n list(\n params: PageParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<WhatsAppLinkSession> {\n return new AutoPaginatedList<WhatsAppLinkSession>(\n (p) =>\n this.http.get<PaginatedResponse<WhatsAppLinkSession>>(\n '/whatsapp-link-sessions/',\n { query: p, options }\n ),\n params,\n options\n );\n }\n\n /**\n * Retrieve a single link session by ID.\n *\n * `GET /whatsapp-link-sessions/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<WhatsAppLinkSession> {\n return this.http.get<WhatsAppLinkSession>(\n `/whatsapp-link-sessions/${encodeURIComponent(id)}/`,\n { options }\n );\n }\n\n /**\n * Create a new link session. Direct the user to the returned `linkUrl`.\n *\n * `POST /whatsapp-link-sessions/`\n */\n create(\n input: CreateWhatsAppLinkSessionInput,\n options?: RequestOptions\n ): Promise<WhatsAppLinkSession> {\n return this.http.post<WhatsAppLinkSession>(\n '/whatsapp-link-sessions/',\n input,\n options\n );\n }\n\n /**\n * Expire a pending link session early. Useful for invalidating stale\n * URLs you've handed out to customers.\n *\n * `POST /whatsapp-link-sessions/{id}/expire/`\n */\n expire(id: UUID, options?: RequestOptions): Promise<WhatsAppLinkSession> {\n return this.http.post<WhatsAppLinkSession>(\n `/whatsapp-link-sessions/${encodeURIComponent(id)}/expire/`,\n undefined,\n options\n );\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n CreateWhatsAppTemplateInput,\n PublishWhatsAppTemplateInput,\n UnpublishWhatsAppTemplateInput,\n UpdateWhatsAppTemplateInput,\n WhatsAppTemplate,\n WhatsAppTemplateWithPublishResults,\n} from '../types/whatsapp-templates';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Methods for managing Wassist-side WhatsApp templates and publishing them\n * to your connected WABAs.\n */\nexport class WhatsAppTemplatesResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every template you've created in Wassist.\n *\n * `GET /whatsapp-templates/`\n */\n list(\n params: PageParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<WhatsAppTemplate> {\n return new AutoPaginatedList<WhatsAppTemplate>(\n (p) =>\n this.http.get<PaginatedResponse<WhatsAppTemplate>>('/whatsapp-templates/', {\n query: p,\n options,\n }),\n params,\n options\n );\n }\n\n /**\n * Retrieve a single template by ID.\n *\n * `GET /whatsapp-templates/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<WhatsAppTemplate> {\n return this.http.get<WhatsAppTemplate>(\n `/whatsapp-templates/${encodeURIComponent(id)}/`,\n { options }\n );\n }\n\n /**\n * Create a new template. Published per-WABA separately via {@link publish}.\n *\n * `POST /whatsapp-templates/`\n */\n create(\n input: CreateWhatsAppTemplateInput,\n options?: RequestOptions\n ): Promise<WhatsAppTemplate> {\n return this.http.post<WhatsAppTemplate>('/whatsapp-templates/', input, options);\n }\n\n /**\n * Update an existing template's metadata and components.\n *\n * `PATCH /whatsapp-templates/{id}/`\n */\n update(\n id: UUID,\n input: UpdateWhatsAppTemplateInput,\n options?: RequestOptions\n ): Promise<WhatsAppTemplate> {\n return this.http.patch<WhatsAppTemplate>(\n `/whatsapp-templates/${encodeURIComponent(id)}/`,\n input,\n options\n );\n }\n\n /**\n * Delete a template (and unpublish from every WABA it was published to).\n *\n * `DELETE /whatsapp-templates/{id}/`\n */\n delete(id: UUID, options?: RequestOptions): Promise<void> {\n return this.http.delete<void>(\n `/whatsapp-templates/${encodeURIComponent(id)}/`,\n options\n );\n }\n\n /**\n * Submit this template to one or more WABAs for approval.\n *\n * Returns the updated template, plus per-account `publishResults` /\n * `publishErrors`.\n *\n * `POST /whatsapp-templates/{id}/publish/`\n */\n publish(\n id: UUID,\n input: PublishWhatsAppTemplateInput,\n options?: RequestOptions\n ): Promise<WhatsAppTemplateWithPublishResults> {\n return this.http.post<WhatsAppTemplateWithPublishResults>(\n `/whatsapp-templates/${encodeURIComponent(id)}/publish/`,\n input,\n options\n );\n }\n\n /**\n * Remove this template from one or more WABAs.\n *\n * `POST /whatsapp-templates/{id}/unpublish/`\n */\n unpublish(\n id: UUID,\n input: UnpublishWhatsAppTemplateInput,\n options?: RequestOptions\n ): Promise<WhatsAppTemplateWithPublishResults> {\n return this.http.post<WhatsAppTemplateWithPublishResults>(\n `/whatsapp-templates/${encodeURIComponent(id)}/unpublish/`,\n input,\n options\n );\n }\n}\n","/**\n * Webhook signature verification.\n *\n * Implements the Stripe-style `t=<unix>,v1=<hex hmac sha256>` scheme\n * documented at https://docs.wassist.app/concepts/webhooks. Compute the HMAC of\n * `<timestamp>.<raw body>` with your webhook's signing secret and compare\n * it (in constant time) to the `v1` component of `X-Wassist-Signature`.\n *\n * This module exposes two helpers:\n *\n * - {@link Webhooks.constructEvent} — synchronous, uses `node:crypto` when\n * available (Node 18+).\n * - {@link Webhooks.constructEventAsync} — uses Web Crypto (`crypto.subtle`)\n * for runtimes that lack `node:crypto` (Cloudflare Workers, Deno, the\n * browser).\n */\n\nimport { WassistSignatureVerificationError } from './errors';\nimport type { WassistEvent } from './types/events';\n\nconst DEFAULT_TOLERANCE_SECONDS = 300;\n\ninterface VerifyOptions {\n /**\n * Maximum allowed difference between the server timestamp and `now`, in\n * seconds. Pass `0` to disable replay protection (not recommended).\n *\n * @default 300\n */\n tolerance?: number;\n /**\n * Override `now` for testing — defaults to `Date.now() / 1000`.\n * @internal\n */\n currentTimestamp?: number;\n}\n\n/**\n * Stripe-style webhook helpers.\n *\n * Use via the SDK class:\n *\n * ```ts\n * import { Wassist } from '@wassist/sdk';\n *\n * const wassist = new Wassist({ apiKey: process.env.WASSIST_API_KEY! });\n * const event = wassist.webhooks.constructEvent(rawBody, sigHeader, secret);\n * ```\n *\n * Or statically — no instance required for verification:\n *\n * ```ts\n * import { Wassist } from '@wassist/sdk';\n * const event = Wassist.webhooks.constructEvent(rawBody, sigHeader, secret);\n * ```\n */\nexport class Webhooks {\n /**\n * Verify the signature on a webhook delivery, parse the body, and return\n * the typed event.\n *\n * @param payload The raw request body, exactly as received — `string`,\n * `Buffer`, or `Uint8Array`. **Do not parse it first;**\n * even whitespace differences will break verification.\n * @param header The `X-Wassist-Signature` header value.\n * @param secret Your webhook signing secret. Find it in the\n * [Wassist dashboard](https://wassist.app/developers/webhooks).\n * @param options.tolerance Replay-protection window in seconds (default 300).\n * @throws {WassistSignatureVerificationError} When the header is malformed,\n * the HMAC doesn't match, or the timestamp is outside the tolerance window.\n */\n constructEvent(\n payload: string | Uint8Array,\n header: string | null | undefined,\n secret: string,\n options: VerifyOptions = {}\n ): WassistEvent {\n const { signedPayload, parts } = this.prepare(payload, header);\n const expected = this.signSync(signedPayload, secret);\n this.assertValid(parts, expected, header ?? '', signedPayload, options);\n return this.parseEvent(payload);\n }\n\n /**\n * Async variant of {@link constructEvent} that uses Web Crypto, for\n * runtimes that don't expose `node:crypto` (Cloudflare Workers, Deno,\n * the browser).\n */\n async constructEventAsync(\n payload: string | Uint8Array,\n header: string | null | undefined,\n secret: string,\n options: VerifyOptions = {}\n ): Promise<WassistEvent> {\n const { signedPayload, parts } = this.prepare(payload, header);\n const expected = await this.signAsync(signedPayload, secret);\n this.assertValid(parts, expected, header ?? '', signedPayload, options);\n return this.parseEvent(payload);\n }\n\n /**\n * Compute the v1 signature for a `t.<body>` payload — exported as a\n * convenience for testing.\n */\n signSync(signedPayload: string, secret: string): string {\n const nodeCrypto = loadNodeCrypto();\n if (!nodeCrypto) {\n throw new WassistSignatureVerificationError({\n message:\n 'node:crypto is unavailable in this runtime. Use `constructEventAsync` instead.',\n });\n }\n return nodeCrypto.createHmac('sha256', secret).update(signedPayload).digest('hex');\n }\n\n /**\n * Web Crypto variant of {@link signSync}.\n */\n async signAsync(signedPayload: string, secret: string): Promise<string> {\n const subtle = globalThis.crypto?.subtle;\n if (!subtle) {\n throw new WassistSignatureVerificationError({\n message:\n 'Web Crypto (`globalThis.crypto.subtle`) is unavailable in this runtime.',\n });\n }\n const enc = new TextEncoder();\n const key = await subtle.importKey(\n 'raw',\n enc.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n const sig = await subtle.sign('HMAC', key, enc.encode(signedPayload));\n return toHex(new Uint8Array(sig));\n }\n\n // =============================================================================\n // Internals\n // =============================================================================\n\n private prepare(\n payload: string | Uint8Array,\n header: string | null | undefined\n ): { signedPayload: string; parts: { t: string; v1: string } } {\n if (!header) {\n throw new WassistSignatureVerificationError({\n message: 'Missing X-Wassist-Signature header.',\n header: header ?? undefined,\n });\n }\n const parts = parseHeader(header);\n if (!parts.t || !parts.v1) {\n throw new WassistSignatureVerificationError({\n message:\n 'Malformed X-Wassist-Signature header — expected `t=<unix>,v1=<hex>`.',\n header,\n });\n }\n const bodyText = typeof payload === 'string' ? payload : new TextDecoder().decode(payload);\n return { signedPayload: `${parts.t}.${bodyText}`, parts: parts as { t: string; v1: string } };\n }\n\n private assertValid(\n parts: { t: string; v1: string },\n expected: string,\n header: string,\n signedPayload: string,\n options: VerifyOptions\n ): void {\n if (!constantTimeEqualsHex(parts.v1, expected)) {\n throw new WassistSignatureVerificationError({\n message: 'Webhook signature did not match the expected value.',\n header,\n payload: signedPayload,\n });\n }\n const tolerance = options.tolerance ?? DEFAULT_TOLERANCE_SECONDS;\n if (tolerance > 0) {\n const now = options.currentTimestamp ?? Math.floor(Date.now() / 1000);\n const ts = Number(parts.t);\n if (!Number.isFinite(ts)) {\n throw new WassistSignatureVerificationError({\n message: `Invalid timestamp in X-Wassist-Signature: ${parts.t}`,\n header,\n });\n }\n if (Math.abs(now - ts) > tolerance) {\n throw new WassistSignatureVerificationError({\n message: `Webhook timestamp is outside the ${tolerance}s tolerance window (received ${ts}, now ${now}).`,\n header,\n });\n }\n }\n }\n\n private parseEvent(payload: string | Uint8Array): WassistEvent {\n const text =\n typeof payload === 'string' ? payload : new TextDecoder().decode(payload);\n try {\n return JSON.parse(text) as WassistEvent;\n } catch (err) {\n throw new WassistSignatureVerificationError({\n message: 'Failed to parse webhook payload as JSON.',\n payload: text,\n cause: err,\n });\n }\n }\n}\n\n// =============================================================================\n// Module-level helpers\n// =============================================================================\n\nfunction parseHeader(header: string): Partial<{ t: string; v1: string }> {\n const parts: Partial<Record<string, string>> = {};\n for (const segment of header.split(',')) {\n const eq = segment.indexOf('=');\n if (eq === -1) continue;\n const key = segment.slice(0, eq).trim();\n const value = segment.slice(eq + 1).trim();\n if (key === 't' || key === 'v1') parts[key] = value;\n }\n return parts as Partial<{ t: string; v1: string }>;\n}\n\nfunction constantTimeEqualsHex(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) {\n diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return diff === 0;\n}\n\nfunction toHex(bytes: Uint8Array): string {\n let out = '';\n for (let i = 0; i < bytes.length; i++) {\n const v = bytes[i] ?? 0;\n out += v.toString(16).padStart(2, '0');\n }\n return out;\n}\n\n/**\n * The singleton `webhooks` namespace exposed on the {@link Wassist} class.\n * Statically importable for stateless use.\n */\nexport const webhooks = new Webhooks();\n\n// =============================================================================\n// node:crypto loader\n// =============================================================================\n\ntype NodeCrypto = {\n createHmac: (alg: string, key: string) => {\n update: (data: string) => { digest: (enc: 'hex') => string };\n };\n};\n\nlet cachedNodeCrypto: NodeCrypto | null | undefined;\n\n/**\n * `__sdkRequire` is injected by the tsup banner — see `tsup.config.ts`.\n * In ESM it's a `createRequire(import.meta.url)`; in CJS it's the\n * ambient `require`. Both can resolve `node:crypto` synchronously.\n *\n * @internal\n */\ndeclare const __sdkRequire: ((id: string) => unknown) | undefined;\n\n/**\n * Lazily load `node:crypto` without forcing it into the dep graph for\n * runtimes that lack it (Cloudflare Workers, the browser). Returns\n * `undefined` if `node:crypto` cannot be resolved; the caller falls back\n * to {@link Webhooks.constructEventAsync}.\n *\n * @internal\n */\nfunction loadNodeCrypto(): NodeCrypto | undefined {\n if (cachedNodeCrypto !== undefined) return cachedNodeCrypto ?? undefined;\n try {\n const req: ((id: string) => unknown) | undefined =\n typeof __sdkRequire === 'function'\n ? __sdkRequire\n : (globalThis as { require?: (id: string) => unknown }).require;\n cachedNodeCrypto = (req?.('node:crypto') as NodeCrypto | undefined) ?? null;\n } catch {\n cachedNodeCrypto = null;\n }\n return cachedNodeCrypto ?? undefined;\n}\n","import { HttpClient, type WassistClientConfig } from './http';\nimport { AgentsResource } from './resources/agents';\nimport { ConversationsResource } from './resources/conversations';\nimport { PhoneNumbersResource } from './resources/phone-numbers';\nimport { WhatsAppAccountsResource } from './resources/whatsapp-accounts';\nimport { WhatsAppLinkSessionsResource } from './resources/whatsapp-link-sessions';\nimport { WhatsAppTemplatesResource } from './resources/whatsapp-templates';\nimport { Webhooks, webhooks as webhooksSingleton } from './webhooks';\n\n/**\n * The Wassist API client.\n *\n * @example\n * ```ts\n * import { Wassist } from '@wassist/sdk';\n *\n * const wassist = new Wassist({ apiKey: process.env.WASSIST_API_KEY! });\n *\n * const agent = await wassist.agents.create({ name: 'Sales Assistant' });\n *\n * for await (const conv of wassist.conversations.list()) {\n * console.log(conv.id);\n * }\n * ```\n */\nexport class Wassist {\n /** Create and manage AI agents. */\n readonly agents: AgentsResource;\n /** Send messages and manage conversations (with nested `messages` resource). */\n readonly conversations: ConversationsResource;\n /** Manage your connected WhatsApp phone numbers and their routing. */\n readonly phoneNumbers: PhoneNumbersResource;\n /** Manage WhatsApp Business Accounts. */\n readonly whatsappAccounts: WhatsAppAccountsResource;\n /** Manage hosted WhatsApp account-linking sessions. */\n readonly whatsappLinkSessions: WhatsAppLinkSessionsResource;\n /** Manage WhatsApp message templates. */\n readonly whatsappTemplates: WhatsAppTemplatesResource;\n /** Verify inbound webhook signatures. */\n readonly webhooks: Webhooks = webhooksSingleton;\n\n /**\n * Webhook helpers — usable without instantiating a client.\n *\n * @example\n * ```ts\n * const event = Wassist.webhooks.constructEvent(body, header, secret);\n * ```\n */\n static readonly webhooks: Webhooks = webhooksSingleton;\n\n constructor(config: WassistClientConfig) {\n const http = new HttpClient(config);\n this.agents = new AgentsResource(http);\n this.conversations = new ConversationsResource(http);\n this.phoneNumbers = new PhoneNumbersResource(http);\n this.whatsappAccounts = new WhatsAppAccountsResource(http);\n this.whatsappLinkSessions = new WhatsAppLinkSessionsResource(http);\n this.whatsappTemplates = new WhatsAppTemplatesResource(http);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/http.ts","../src/pagination.ts","../src/resources/agents.ts","../src/resources/messages.ts","../src/resources/conversations.ts","../src/resources/phone-numbers.ts","../src/resources/whatsapp-accounts.ts","../src/resources/whatsapp-link-sessions.ts","../src/resources/whatsapp-templates.ts","../src/webhooks.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Error hierarchy for the Wassist SDK.\n *\n * Every network response and webhook signature failure surfaces as a subclass\n * of {@link WassistError}, so consumers can branch on `instanceof` (Stripe\n * convention) and read `statusCode`, `code`, `requestId`, and the raw body.\n */\n\nexport interface WassistErrorOptions {\n message: string;\n statusCode?: number;\n code?: string;\n requestId?: string;\n raw?: unknown;\n cause?: unknown;\n}\n\nexport class WassistError extends Error {\n /** HTTP status code if this error originated from an API response. */\n readonly statusCode?: number;\n /** Machine-readable error code (e.g. `not_found`) when the API provides one. */\n readonly code?: string;\n /**\n * Request ID surfaced by the Wassist API in the `X-Request-Id` response\n * header. Include this when filing support tickets.\n */\n readonly requestId?: string;\n /** Raw response body, parsed as JSON when possible. */\n readonly raw?: unknown;\n\n constructor(opts: WassistErrorOptions) {\n super(opts.message);\n this.name = new.target.name;\n this.statusCode = opts.statusCode;\n this.code = opts.code;\n this.requestId = opts.requestId;\n this.raw = opts.raw;\n if (opts.cause !== undefined) {\n (this as { cause?: unknown }).cause = opts.cause;\n }\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 401 Unauthorized — the API key was missing, malformed, or revoked. */\nexport class WassistAuthenticationError extends WassistError {}\n\n/** 403 Forbidden — the API key lacks permission for this resource. */\nexport class WassistPermissionError extends WassistError {}\n\n/** 400 / 422 — the request body or parameters were invalid. */\nexport class WassistInvalidRequestError extends WassistError {}\n\n/** 404 Not Found — the requested resource does not exist. */\nexport class WassistNotFoundError extends WassistError {}\n\n/** 409 Conflict — the request conflicts with the current state. */\nexport class WassistConflictError extends WassistError {}\n\n/** 429 Too Many Requests — slow down or wait `retryAfter` seconds. */\nexport class WassistRateLimitError extends WassistError {\n /** Suggested wait in seconds, from the `Retry-After` response header. */\n readonly retryAfter?: number;\n\n constructor(opts: WassistErrorOptions & { retryAfter?: number }) {\n super(opts);\n this.retryAfter = opts.retryAfter;\n }\n}\n\n/** 5xx — something is wrong on Wassist's side. The SDK retries these automatically. */\nexport class WassistAPIError extends WassistError {}\n\n/** A network-level failure (DNS, TCP, TLS, abort, etc.) — never made it to the server. */\nexport class WassistConnectionError extends WassistError {}\n\n/** The request exceeded the configured `timeout`. */\nexport class WassistTimeoutError extends WassistError {}\n\n/**\n * Webhook signature could not be verified.\n *\n * Thrown by {@link Wassist.webhooks.constructEvent} when the header is\n * malformed, the HMAC doesn't match, or the timestamp falls outside the\n * tolerance window.\n */\nexport class WassistSignatureVerificationError extends WassistError {\n /** The raw `X-Wassist-Signature` header value as received. */\n readonly header?: string;\n /** The payload that was verified, as the SDK saw it. */\n readonly payload?: string;\n\n constructor(\n opts: WassistErrorOptions & { header?: string; payload?: string }\n ) {\n super(opts);\n this.header = opts.header;\n this.payload = opts.payload;\n }\n}\n\n/**\n * Map an HTTP status code + response body to the most specific error class.\n *\n * @internal\n */\nexport function errorFromResponse(args: {\n status: number;\n body: unknown;\n requestId?: string;\n retryAfter?: number;\n}): WassistError {\n const { status, body, requestId, retryAfter } = args;\n\n const message = extractMessage(body) ?? `HTTP ${status}`;\n const code = extractCode(body);\n const base = { message, statusCode: status, code, requestId, raw: body };\n\n if (status === 401) return new WassistAuthenticationError(base);\n if (status === 403) return new WassistPermissionError(base);\n if (status === 404) return new WassistNotFoundError(base);\n if (status === 409) return new WassistConflictError(base);\n if (status === 429) return new WassistRateLimitError({ ...base, retryAfter });\n if (status === 400 || status === 422) {\n return new WassistInvalidRequestError(base);\n }\n if (status >= 500 && status < 600) return new WassistAPIError(base);\n return new WassistError(base);\n}\n\nfunction extractMessage(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const b = body as Record<string, unknown>;\n if (typeof b.error === 'string') return b.error;\n if (typeof b.message === 'string') return b.message;\n if (typeof b.detail === 'string') return b.detail;\n if (b.error && typeof b.error === 'object') {\n const inner = (b.error as Record<string, unknown>).message;\n if (typeof inner === 'string') return inner;\n }\n return undefined;\n}\n\nfunction extractCode(body: unknown): string | undefined {\n if (!body || typeof body !== 'object') return undefined;\n const b = body as Record<string, unknown>;\n if (typeof b.code === 'string') return b.code;\n return undefined;\n}\n","/**\n * The package version, embedded into the `User-Agent` header on every\n * outbound request so Wassist can correlate API traffic with SDK versions.\n *\n * Updated in lockstep with `package.json`'s `version` field.\n */\nexport const SDK_VERSION = '0.1.2';\n","/**\n * Low-level HTTP transport used by every resource module.\n *\n * Wraps `fetch` with:\n * - `X-API-Key` authentication\n * - `/api/v1/` path prefix handling\n * - Per-request timeout (cancels via `AbortController`)\n * - Exponential-backoff retries on `429` and `5xx` (honors `Retry-After`)\n * - `Idempotency-Key` opt-in for safe `POST` retries\n * - Typed error mapping via {@link errorFromResponse}\n * - `requestId` extraction from the `X-Request-Id` response header\n */\n\nimport {\n WassistConnectionError,\n WassistError,\n WassistRateLimitError,\n WassistTimeoutError,\n errorFromResponse,\n} from './errors';\nimport type { RequestOptions } from './types/common';\nimport { SDK_VERSION } from './version';\n\n/**\n * The minimal `fetch` signature this SDK depends on. Any spec-compliant\n * implementation will satisfy it — Node 18+, edge runtimes, browsers, Bun.\n */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\n/**\n * Configuration for {@link Wassist}.\n */\nexport interface WassistClientConfig {\n /**\n * Your Wassist API key. Find it at\n * https://wassist.app/settings → API Keys.\n */\n apiKey: string;\n /**\n * Base URL of the Wassist API.\n *\n * @default 'https://backend.wassist.app'\n */\n baseUrl?: string;\n /**\n * Default request timeout in milliseconds. Individual calls can override\n * via the per-call `timeout` option.\n *\n * @default 60_000\n */\n timeout?: number;\n /**\n * Maximum number of retry attempts on `429` / `5xx` / network errors.\n * The total number of requests is `maxRetries + 1`.\n *\n * @default 2\n */\n maxRetries?: number;\n /**\n * Custom `fetch` implementation. Useful for tests, mocking, or runtimes\n * that don't expose `globalThis.fetch`.\n *\n * @default globalThis.fetch\n */\n fetch?: FetchLike;\n}\n\nconst DEFAULT_BASE_URL = 'https://backend.wassist.app';\nconst DEFAULT_TIMEOUT_MS = 60_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst API_VERSION_PREFIX = '/api/v1';\nconst RETRY_STATUSES: ReadonlySet<number> = new Set([408, 425, 429, 500, 502, 503, 504]);\n\n/** Query-string values supported on every request. */\nexport type QueryValue = string | number | boolean | undefined | null;\n\n/** A loose-record shape for query strings — every field is optional and stringly-typed. */\nexport type QueryParams = { readonly [key: string]: QueryValue };\n\ninterface RequestArgs {\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n query?: object;\n body?: unknown;\n options?: RequestOptions;\n}\n\n/**\n * @internal\n */\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly fetchImpl: FetchLike;\n\n constructor(config: WassistClientConfig) {\n if (!config.apiKey) {\n throw new WassistError({\n message:\n 'A Wassist `apiKey` is required. Create one at https://wassist.app/settings.',\n });\n }\n this.apiKey = config.apiKey;\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT_MS;\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n const provided = config.fetch ?? globalThis.fetch?.bind(globalThis);\n if (!provided) {\n throw new WassistError({\n message:\n 'No `fetch` implementation found. Pass one via `fetch` in the Wassist constructor, or run on Node 18+ / a runtime with a global `fetch`.',\n });\n }\n this.fetchImpl = provided;\n }\n\n get<T>(path: string, args?: Omit<RequestArgs, 'method' | 'path' | 'body'>): Promise<T> {\n return this.request<T>({ ...args, method: 'GET', path });\n }\n post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>({ method: 'POST', path, body, options });\n }\n put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>({ method: 'PUT', path, body, options });\n }\n patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>({ method: 'PATCH', path, body, options });\n }\n delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>({ method: 'DELETE', path, options });\n }\n\n private async request<T>(args: RequestArgs): Promise<T> {\n const url = this.buildUrl(args.path, args.query);\n const headers = this.buildHeaders(args);\n const body = args.body === undefined ? undefined : JSON.stringify(args.body);\n const maxRetries = args.options?.maxRetries ?? this.maxRetries;\n const timeout = args.options?.timeout ?? this.timeout;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const response = await this.doFetch({\n url,\n method: args.method,\n headers,\n body,\n timeout,\n signal: args.options?.signal,\n });\n\n if (response.ok) {\n if (response.status === 204) return undefined as T;\n // Some endpoints return empty bodies — handle gracefully.\n const text = await response.text();\n if (!text) return undefined as T;\n return JSON.parse(text) as T;\n }\n\n // Build a typed error and decide whether to retry.\n const requestId = response.headers.get('x-request-id') ?? undefined;\n const retryAfter = parseRetryAfter(response.headers.get('retry-after'));\n const parsedBody = await safeJson(response);\n const apiError = errorFromResponse({\n status: response.status,\n body: parsedBody,\n requestId,\n retryAfter,\n });\n\n const isRetryable = RETRY_STATUSES.has(response.status);\n if (isRetryable && attempt < maxRetries) {\n await sleep(computeBackoff(attempt, apiError));\n lastError = apiError;\n continue;\n }\n throw apiError;\n } catch (err) {\n if (err instanceof WassistError) {\n // Already a typed SDK error from the branch above.\n if (\n attempt < maxRetries &&\n (err instanceof WassistRateLimitError || isRetryableApiError(err))\n ) {\n await sleep(computeBackoff(attempt, err));\n lastError = err;\n continue;\n }\n throw err;\n }\n\n // Map fetch-level failures.\n const mapped = mapFetchError(err);\n if (attempt < maxRetries && isRetryableTransport(mapped)) {\n await sleep(computeBackoff(attempt));\n lastError = mapped;\n continue;\n }\n throw mapped;\n }\n }\n // Should be unreachable — every path above either returns or throws.\n throw lastError instanceof Error\n ? lastError\n : new WassistError({ message: 'Wassist request failed after retries.' });\n }\n\n private buildUrl(path: string, query?: object): string {\n const prefixedPath = path.startsWith('/') ? path : `/${path}`;\n const fullPath = prefixedPath.startsWith(API_VERSION_PREFIX)\n ? prefixedPath\n : `${API_VERSION_PREFIX}${prefixedPath}`;\n const url = new URL(this.baseUrl + fullPath);\n if (query) {\n for (const [key, value] of Object.entries(query as Record<string, QueryValue>)) {\n if (value === undefined || value === null) continue;\n url.searchParams.append(key, String(value));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(args: RequestArgs): Record<string, string> {\n const headers: Record<string, string> = {\n 'X-API-Key': this.apiKey,\n 'Accept': 'application/json',\n 'User-Agent': `wassist-sdk-node/${SDK_VERSION}`,\n 'X-Wassist-Client': `wassist-sdk-node/${SDK_VERSION}`,\n };\n if (args.body !== undefined) headers['Content-Type'] = 'application/json';\n if (args.options?.idempotencyKey) {\n headers['Idempotency-Key'] = args.options.idempotencyKey;\n }\n if (args.options?.headers) {\n for (const [k, v] of Object.entries(args.options.headers)) headers[k] = v;\n }\n return headers;\n }\n\n private async doFetch(args: {\n url: string;\n method: string;\n headers: Record<string, string>;\n body?: string;\n timeout: number;\n signal?: AbortSignal;\n }): Promise<Response> {\n const controller = new AbortController();\n const onAbort = () => controller.abort();\n if (args.signal) {\n if (args.signal.aborted) controller.abort();\n else args.signal.addEventListener('abort', onAbort, { once: true });\n }\n const timeoutId = setTimeout(() => controller.abort(), args.timeout);\n try {\n return await this.fetchImpl(args.url, {\n method: args.method,\n headers: args.headers,\n body: args.body,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n if (args.signal) args.signal.removeEventListener('abort', onAbort);\n }\n }\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction safeJson(response: Response): Promise<unknown> {\n return response\n .text()\n .then((text) => {\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n })\n .catch(() => undefined);\n}\n\nfunction parseRetryAfter(value: string | null): number | undefined {\n if (!value) return undefined;\n const asNum = Number(value);\n if (Number.isFinite(asNum) && asNum >= 0) return asNum;\n const asDate = Date.parse(value);\n if (Number.isNaN(asDate)) return undefined;\n return Math.max(0, Math.floor((asDate - Date.now()) / 1000));\n}\n\nfunction computeBackoff(attempt: number, err?: WassistError): number {\n // Honor server-supplied Retry-After (seconds) when present.\n if (err instanceof WassistRateLimitError && typeof err.retryAfter === 'number') {\n return err.retryAfter * 1000;\n }\n // Exponential backoff with full jitter: random in [base, 2 * base).\n const base = 500 * Math.pow(2, attempt);\n const jitter = base * Math.random();\n return Math.min(base + jitter, 8_000);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isRetryableApiError(err: WassistError): boolean {\n return err.statusCode !== undefined && RETRY_STATUSES.has(err.statusCode);\n}\n\nfunction isRetryableTransport(err: WassistError): boolean {\n return err instanceof WassistConnectionError;\n}\n\nfunction mapFetchError(err: unknown): WassistError {\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n return new WassistTimeoutError({\n message: 'Request timed out.',\n cause: err,\n });\n }\n return new WassistConnectionError({\n message: `Network error: ${err.message}`,\n cause: err,\n });\n }\n return new WassistConnectionError({ message: 'Unknown network error.' });\n}\n","import type { PageParams, PaginatedResponse, RequestOptions } from './types/common';\n\n/**\n * The shape of a single fetched page, returned by {@link AutoPaginatedList.firstPage}.\n */\nexport interface Page<T> {\n /** The items on this page. */\n data: T[];\n /** Total number of items across all pages. */\n totalCount: number;\n /** Whether there is at least one more page after this one. */\n hasMore: boolean;\n /** Offset to pass to the next call to continue from this page. */\n nextOffset: number;\n}\n\n/**\n * Lazy auto-paginating wrapper around any Wassist list endpoint.\n *\n * Iteration is lazy — pages are fetched on demand as you consume them, so\n * `for await` over a million-item list never has the whole result set in\n * memory.\n *\n * @example Iterate every item\n * ```ts\n * for await (const conv of wassist.conversations.list({ limit: 100 })) {\n * console.log(conv.id);\n * }\n * ```\n *\n * @example Just the first page\n * ```ts\n * const { data, hasMore } = await wassist.conversations.list().firstPage();\n * ```\n *\n * @example Collect everything into an array (small lists only)\n * ```ts\n * const all = await wassist.agents.list().all();\n * ```\n */\nexport class AutoPaginatedList<T> implements AsyncIterable<T> {\n private readonly fetchPage: (params: PageParams) => Promise<PaginatedResponse<T>>;\n private readonly params: PageParams;\n private readonly options: RequestOptions | undefined;\n\n /** @internal */\n constructor(\n fetchPage: (params: PageParams) => Promise<PaginatedResponse<T>>,\n params: PageParams = {},\n options?: RequestOptions\n ) {\n this.fetchPage = fetchPage;\n this.params = params;\n this.options = options;\n }\n\n /**\n * Async iterator over every item across every page, fetched lazily.\n */\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n const limit = this.params.limit ?? 50;\n let offset = this.params.offset ?? 0;\n let hasMore = true;\n\n while (hasMore) {\n const page = await this.fetchPage({ limit, offset });\n for (const item of page.results) yield item;\n hasMore = page.next !== null && page.results.length > 0;\n offset += page.results.length || limit;\n }\n }\n\n /**\n * Fetch the first page only and return it as a {@link Page}.\n */\n async firstPage(): Promise<Page<T>> {\n const limit = this.params.limit ?? 50;\n const offset = this.params.offset ?? 0;\n const page = await this.fetchPage({ limit, offset });\n return {\n data: page.results,\n totalCount: page.count,\n hasMore: page.next !== null,\n nextOffset: offset + page.results.length,\n };\n }\n\n /**\n * Walk every page and collect every item into a single array.\n *\n * Convenient for small lists; for large ones prefer `for await`.\n */\n async all(): Promise<T[]> {\n const out: T[] = [];\n for await (const item of this) out.push(item);\n return out;\n }\n}\n\n// Re-export for resource modules.\nexport type { RequestOptions };\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n Agent,\n CreateAgentInput,\n CreateBYOAAgentInput,\n UpdateAgentInput,\n} from '../types/agents';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Methods for managing agents — the AI personas you connect to WhatsApp.\n *\n * Documented at https://docs.wassist.app/api-reference/agents/list.\n */\nexport class AgentsResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every agent on your account.\n *\n * Returns a lazily-fetched paginated list. Use `for await` to walk all\n * pages, or `.firstPage()` for just the first.\n *\n * `GET /agents/`\n *\n * @example\n * ```ts\n * for await (const agent of wassist.agents.list()) {\n * console.log(agent.id, agent.name);\n * }\n * ```\n */\n list(params: PageParams = {}, options?: RequestOptions): AutoPaginatedList<Agent> {\n return new AutoPaginatedList<Agent>(\n (p) => this.http.get<PaginatedResponse<Agent>>('/agents/', { query: p, options }),\n params,\n options\n );\n }\n\n /**\n * Retrieve a single agent by ID.\n *\n * `GET /agents/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<Agent> {\n return this.http.get<Agent>(`/agents/${encodeURIComponent(id)}/`, { options });\n }\n\n /**\n * Create a new agent with the given display name. Configure it further\n * with {@link AgentsResource.update}.\n *\n * `POST /agents/`\n */\n create(input: CreateAgentInput, options?: RequestOptions): Promise<Agent> {\n return this.http.post<Agent>('/agents/', input, options);\n }\n\n /**\n * Create a Bring-Your-Own-Agent (BYOA) — Wassist forwards inbound\n * messages to your webhook and posts back replies you author yourself.\n *\n * `POST /agents/byoa/`\n */\n createBYOA(input: CreateBYOAAgentInput, options?: RequestOptions): Promise<Agent> {\n return this.http.post<Agent>('/agents/byoa/', input, options);\n }\n\n /**\n * Partially update an agent. Only the fields you pass are modified.\n *\n * Nested sub-resource arrays (tools, memory keys, etc.) are diffed\n * server-side by `id`: include an `id` to update an existing entry,\n * omit it to create one.\n *\n * `PATCH /agents/{id}/`\n */\n update(id: UUID, input: UpdateAgentInput, options?: RequestOptions): Promise<Agent> {\n return this.http.patch<Agent>(`/agents/${encodeURIComponent(id)}/`, input, options);\n }\n\n /**\n * Soft-delete an agent. The agent stops responding immediately;\n * conversation history is retained.\n *\n * `DELETE /agents/{id}/`\n */\n delete(id: UUID, options?: RequestOptions): Promise<void> {\n return this.http.delete<void>(`/agents/${encodeURIComponent(id)}/`, options);\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type { Message, SendMessageInput } from '../types/messages';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Messages within a conversation. Reached via `wassist.conversations.messages`.\n *\n * Documented at https://docs.wassist.app/api-reference/conversations/messages/list\n * and https://docs.wassist.app/api-reference/conversations/messages/send.\n */\nexport class MessagesResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List messages in a conversation, newest first.\n *\n * `GET /conversations/{id}/messages/`\n */\n list(\n conversationId: UUID,\n params: PageParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<Message> {\n const path = `/conversations/${encodeURIComponent(conversationId)}/messages/`;\n return new AutoPaginatedList<Message>(\n (p) => this.http.get<PaginatedResponse<Message>>(path, { query: p, options }),\n params,\n options\n );\n }\n\n /**\n * Send a message in a conversation.\n *\n * The input is a discriminated union — set `type` and populate the\n * matching field (`text`, `template`, `cta`, or `unified`).\n *\n * `POST /conversations/{id}/messages/`\n *\n * @example Plain text\n * ```ts\n * await wassist.conversations.messages.send(conv.id, {\n * type: 'text',\n * text: { body: 'Hello!' },\n * });\n * ```\n *\n * @example Approved template\n * ```ts\n * await wassist.conversations.messages.send(conv.id, {\n * type: 'template',\n * template: { name: 'order_update', variables: { body: ['Alex', '#1234'] } },\n * });\n * ```\n */\n send(\n conversationId: UUID,\n input: SendMessageInput,\n options?: RequestOptions\n ): Promise<Message> {\n const path = `/conversations/${encodeURIComponent(conversationId)}/messages/`;\n return this.http.post<Message>(path, input, options);\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n Conversation,\n CreateConversationInput,\n ListConversationsParams,\n SubscribeConversationInput,\n} from '../types/conversations';\nimport type { PromptAgentInput } from '../types/messages';\nimport type { PaginatedResponse, RequestOptions, UUID } from '../types/common';\nimport { MessagesResource } from './messages';\n\n/**\n * Methods for managing conversations — ongoing WhatsApp chats between\n * your numbers and a contact.\n *\n * Nested namespace: `wassist.conversations.messages` (see {@link MessagesResource}).\n */\nexport class ConversationsResource {\n /** Send and list messages within a conversation. */\n readonly messages: MessagesResource;\n\n /** @internal */\n constructor(private readonly http: HttpClient) {\n this.messages = new MessagesResource(http);\n }\n\n /**\n * List conversations on your account with rich filtering.\n *\n * `GET /conversations/`\n *\n * @example\n * ```ts\n * const recent = await wassist.conversations\n * .list({ ordering: '-last_message_time', limit: 20 })\n * .firstPage();\n * ```\n */\n list(\n params: ListConversationsParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<Conversation> {\n const { limit, offset, ...filters } = params;\n return new AutoPaginatedList<Conversation>(\n (p) =>\n this.http.get<PaginatedResponse<Conversation>>('/conversations/', {\n query: { ...filters, ...p },\n options,\n }),\n { limit, offset },\n options\n );\n }\n\n /**\n * Retrieve a single conversation by ID.\n *\n * `GET /conversations/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<Conversation> {\n return this.http.get<Conversation>(`/conversations/${encodeURIComponent(id)}/`, {\n options,\n });\n }\n\n /**\n * Create a new conversation with a contact.\n *\n * If the WhatsApp 24-hour reply window is closed for this contact, you\n * must include a `template` message to open it.\n *\n * `POST /conversations/`\n */\n create(input: CreateConversationInput, options?: RequestOptions): Promise<Conversation> {\n return this.http.post<Conversation>('/conversations/', input, options);\n }\n\n /**\n * Prompt the agent in this conversation with a custom instruction.\n * Equivalent to \"wake the agent up and have it say this\" — useful for\n * outbound triggers and follow-ups.\n *\n * `POST /conversations/{id}/prompt/`\n */\n prompt(id: UUID, input: PromptAgentInput, options?: RequestOptions): Promise<void> {\n return this.http.post<void>(\n `/conversations/${encodeURIComponent(id)}/prompt/`,\n input,\n options\n );\n }\n\n /**\n * Send a WhatsApp read receipt for the most recent inbound message.\n *\n * `POST /conversations/{id}/read/`\n */\n read(id: UUID, options?: RequestOptions): Promise<Conversation> {\n return this.http.post<Conversation>(\n `/conversations/${encodeURIComponent(id)}/read/`,\n undefined,\n options\n );\n }\n\n /**\n * Display the WhatsApp typing indicator on the contact's device.\n *\n * Note: WhatsApp also marks the most recent inbound message as read as\n * a side effect — this is a platform limitation.\n *\n * `POST /conversations/{id}/typing/`\n */\n typing(id: UUID, options?: RequestOptions): Promise<Conversation> {\n return this.http.post<Conversation>(\n `/conversations/${encodeURIComponent(id)}/typing/`,\n undefined,\n options\n );\n }\n\n /**\n * Route this conversation to a webhook. The agent pipeline is skipped\n * while the override is active.\n *\n * Fires a `subscription.activated` event on the target webhook.\n *\n * `POST /conversations/{id}/subscribe/`\n */\n subscribe(\n id: UUID,\n input: SubscribeConversationInput,\n options?: RequestOptions\n ): Promise<Conversation> {\n return this.http.post<Conversation>(\n `/conversations/${encodeURIComponent(id)}/subscribe/`,\n input,\n options\n );\n }\n\n /**\n * Clear the per-conversation routing override and fall back to the\n * phone number's default routing.\n *\n * Fires a `subscription.revoked` event on the previously-subscribed\n * webhook (if any).\n *\n * `POST /conversations/{id}/unsubscribe/`\n */\n unsubscribe(id: UUID, options?: RequestOptions): Promise<Conversation> {\n return this.http.post<Conversation>(\n `/conversations/${encodeURIComponent(id)}/unsubscribe/`,\n undefined,\n options\n );\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n ConnectAgentInput,\n PhoneNumber,\n PhoneNumberBusinessProfile,\n SubscribePhoneNumberInput,\n UnsubscribePhoneNumberInput,\n} from '../types/phone-numbers';\nimport type { PageParams, PaginatedResponse, RequestOptions } from '../types/common';\n\n/**\n * Methods for managing your connected WhatsApp phone numbers and their\n * default routing.\n *\n * The `number` argument throughout is the E.164-format number without a\n * leading `+` (matches the {@link PhoneNumber.number} field).\n */\nexport class PhoneNumbersResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every WhatsApp number on your account.\n *\n * `GET /phone-numbers/`\n */\n list(params: PageParams = {}, options?: RequestOptions): AutoPaginatedList<PhoneNumber> {\n return new AutoPaginatedList<PhoneNumber>(\n (p) =>\n this.http.get<PaginatedResponse<PhoneNumber>>('/phone-numbers/', {\n query: p,\n options,\n }),\n params,\n options\n );\n }\n\n /**\n * View the WhatsApp Business Profile (about, address, websites, etc.)\n * attached to this number.\n *\n * `GET /phone-numbers/{number}/business-profile/`\n */\n getBusinessProfile(\n number: string,\n options?: RequestOptions\n ): Promise<PhoneNumberBusinessProfile> {\n return this.http.get<PhoneNumberBusinessProfile>(\n `/phone-numbers/${encodeURIComponent(number)}/business-profile/`,\n { options }\n );\n }\n\n /**\n * Route inbound messages on this number to a webhook by default. Drops\n * any agent previously connected to the number.\n *\n * Phone-number routing changes do **not** fire\n * `subscription.activated` / `.revoked` webhook events — those are\n * reserved for per-conversation\n * {@link ConversationsResource.subscribe} /\n * {@link ConversationsResource.unsubscribe}.\n *\n * `POST /phone-numbers/{number}/subscribe/`\n */\n subscribe(\n number: string,\n input: SubscribePhoneNumberInput,\n options?: RequestOptions\n ): Promise<PhoneNumber> {\n return this.http.post<PhoneNumber>(\n `/phone-numbers/${encodeURIComponent(number)}/subscribe/`,\n input,\n options\n );\n }\n\n /**\n * Assign an agent as the default for this number. Drops any subscribed\n * webhook.\n *\n * The agent must already be owned by or shared with the authenticated\n * user.\n *\n * `POST /phone-numbers/{number}/connect-agent/`\n */\n connectAgent(\n number: string,\n input: ConnectAgentInput,\n options?: RequestOptions\n ): Promise<PhoneNumber> {\n return this.http.post<PhoneNumber>(\n `/phone-numbers/${encodeURIComponent(number)}/connect-agent/`,\n input,\n options\n );\n }\n\n /**\n * Clear default routing on this number entirely. Drops both the agent\n * and the webhook.\n *\n * `POST /phone-numbers/{number}/unsubscribe/`\n */\n unsubscribe(\n number: string,\n input: UnsubscribePhoneNumberInput = {},\n options?: RequestOptions\n ): Promise<PhoneNumber> {\n return this.http.post<PhoneNumber>(\n `/phone-numbers/${encodeURIComponent(number)}/unsubscribe/`,\n input,\n options\n );\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n AddNumberInput,\n AvailableNumbersResponse,\n WhatsAppAccount,\n} from '../types/whatsapp-accounts';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Methods for managing WhatsApp Business Accounts (WABAs) connected to\n * your Wassist account.\n */\nexport class WhatsAppAccountsResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every WhatsApp Business Account on your Wassist account.\n *\n * `GET /whatsapp-accounts/`\n */\n list(\n params: PageParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<WhatsAppAccount> {\n return new AutoPaginatedList<WhatsAppAccount>(\n (p) =>\n this.http.get<PaginatedResponse<WhatsAppAccount>>('/whatsapp-accounts/', {\n query: p,\n options,\n }),\n params,\n options\n );\n }\n\n /**\n * Retrieve a single WhatsApp Business Account by ID.\n *\n * `GET /whatsapp-accounts/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<WhatsAppAccount> {\n return this.http.get<WhatsAppAccount>(\n `/whatsapp-accounts/${encodeURIComponent(id)}/`,\n { options }\n );\n }\n\n /**\n * Add a pre-verified phone number (purchased via Meta's embedded\n * signup flow) to a WhatsApp Business Account.\n *\n * `POST /whatsapp-accounts/{id}/add-number/`\n */\n addNumber(\n id: UUID,\n input: AddNumberInput,\n options?: RequestOptions\n ): Promise<WhatsAppAccount> {\n return this.http.post<WhatsAppAccount>(\n `/whatsapp-accounts/${encodeURIComponent(id)}/add-number/`,\n input,\n options\n );\n }\n\n /**\n * List Twilio phone numbers available for purchase + verification.\n *\n * `GET /available-numbers/`\n */\n availableNumbers(options?: RequestOptions): Promise<AvailableNumbersResponse> {\n return this.http.get<AvailableNumbersResponse>('/available-numbers/', { options });\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n CreateWhatsAppLinkSessionInput,\n WhatsAppLinkSession,\n} from '../types/whatsapp-link-sessions';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Methods for managing WhatsApp account-linking sessions — the hosted\n * flow that lets your customers connect their own WABA to your platform.\n */\nexport class WhatsAppLinkSessionsResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every link session you've created.\n *\n * `GET /whatsapp-link-sessions/`\n */\n list(\n params: PageParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<WhatsAppLinkSession> {\n return new AutoPaginatedList<WhatsAppLinkSession>(\n (p) =>\n this.http.get<PaginatedResponse<WhatsAppLinkSession>>(\n '/whatsapp-link-sessions/',\n { query: p, options }\n ),\n params,\n options\n );\n }\n\n /**\n * Retrieve a single link session by ID.\n *\n * `GET /whatsapp-link-sessions/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<WhatsAppLinkSession> {\n return this.http.get<WhatsAppLinkSession>(\n `/whatsapp-link-sessions/${encodeURIComponent(id)}/`,\n { options }\n );\n }\n\n /**\n * Create a new link session. Direct the user to the returned `linkUrl`.\n *\n * `POST /whatsapp-link-sessions/`\n */\n create(\n input: CreateWhatsAppLinkSessionInput,\n options?: RequestOptions\n ): Promise<WhatsAppLinkSession> {\n return this.http.post<WhatsAppLinkSession>(\n '/whatsapp-link-sessions/',\n input,\n options\n );\n }\n\n /**\n * Expire a pending link session early. Useful for invalidating stale\n * URLs you've handed out to customers.\n *\n * `POST /whatsapp-link-sessions/{id}/expire/`\n */\n expire(id: UUID, options?: RequestOptions): Promise<WhatsAppLinkSession> {\n return this.http.post<WhatsAppLinkSession>(\n `/whatsapp-link-sessions/${encodeURIComponent(id)}/expire/`,\n undefined,\n options\n );\n }\n}\n","import type { HttpClient } from '../http';\nimport { AutoPaginatedList } from '../pagination';\nimport type {\n CreateWhatsAppTemplateInput,\n PublishWhatsAppTemplateInput,\n UnpublishWhatsAppTemplateInput,\n UpdateWhatsAppTemplateInput,\n WhatsAppTemplate,\n WhatsAppTemplateWithPublishResults,\n} from '../types/whatsapp-templates';\nimport type { PageParams, PaginatedResponse, RequestOptions, UUID } from '../types/common';\n\n/**\n * Methods for managing Wassist-side WhatsApp templates and publishing them\n * to your connected WABAs.\n */\nexport class WhatsAppTemplatesResource {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List every template you've created in Wassist.\n *\n * `GET /whatsapp-templates/`\n */\n list(\n params: PageParams = {},\n options?: RequestOptions\n ): AutoPaginatedList<WhatsAppTemplate> {\n return new AutoPaginatedList<WhatsAppTemplate>(\n (p) =>\n this.http.get<PaginatedResponse<WhatsAppTemplate>>('/whatsapp-templates/', {\n query: p,\n options,\n }),\n params,\n options\n );\n }\n\n /**\n * Retrieve a single template by ID.\n *\n * `GET /whatsapp-templates/{id}/`\n */\n get(id: UUID, options?: RequestOptions): Promise<WhatsAppTemplate> {\n return this.http.get<WhatsAppTemplate>(\n `/whatsapp-templates/${encodeURIComponent(id)}/`,\n { options }\n );\n }\n\n /**\n * Create a new template. Published per-WABA separately via {@link publish}.\n *\n * `POST /whatsapp-templates/`\n */\n create(\n input: CreateWhatsAppTemplateInput,\n options?: RequestOptions\n ): Promise<WhatsAppTemplate> {\n return this.http.post<WhatsAppTemplate>('/whatsapp-templates/', input, options);\n }\n\n /**\n * Update an existing template's metadata and components.\n *\n * `PATCH /whatsapp-templates/{id}/`\n */\n update(\n id: UUID,\n input: UpdateWhatsAppTemplateInput,\n options?: RequestOptions\n ): Promise<WhatsAppTemplate> {\n return this.http.patch<WhatsAppTemplate>(\n `/whatsapp-templates/${encodeURIComponent(id)}/`,\n input,\n options\n );\n }\n\n /**\n * Delete a template (and unpublish from every WABA it was published to).\n *\n * `DELETE /whatsapp-templates/{id}/`\n */\n delete(id: UUID, options?: RequestOptions): Promise<void> {\n return this.http.delete<void>(\n `/whatsapp-templates/${encodeURIComponent(id)}/`,\n options\n );\n }\n\n /**\n * Submit this template to one or more WABAs for approval.\n *\n * Returns the updated template, plus per-account `publishResults` /\n * `publishErrors`.\n *\n * `POST /whatsapp-templates/{id}/publish/`\n */\n publish(\n id: UUID,\n input: PublishWhatsAppTemplateInput,\n options?: RequestOptions\n ): Promise<WhatsAppTemplateWithPublishResults> {\n return this.http.post<WhatsAppTemplateWithPublishResults>(\n `/whatsapp-templates/${encodeURIComponent(id)}/publish/`,\n input,\n options\n );\n }\n\n /**\n * Remove this template from one or more WABAs.\n *\n * `POST /whatsapp-templates/{id}/unpublish/`\n */\n unpublish(\n id: UUID,\n input: UnpublishWhatsAppTemplateInput,\n options?: RequestOptions\n ): Promise<WhatsAppTemplateWithPublishResults> {\n return this.http.post<WhatsAppTemplateWithPublishResults>(\n `/whatsapp-templates/${encodeURIComponent(id)}/unpublish/`,\n input,\n options\n );\n }\n}\n","/**\n * Webhook signature verification.\n *\n * Implements the Stripe-style `t=<unix>,v1=<hex hmac sha256>` scheme\n * documented at https://docs.wassist.app/concepts/webhooks. Compute the HMAC of\n * `<timestamp>.<raw body>` with your webhook's signing secret and compare\n * it (in constant time) to the `v1` component of `X-Wassist-Signature`.\n *\n * This module exposes two helpers:\n *\n * - {@link Webhooks.constructEvent} — synchronous, uses `node:crypto` when\n * available (Node 18+).\n * - {@link Webhooks.constructEventAsync} — uses Web Crypto (`crypto.subtle`)\n * for runtimes that lack `node:crypto` (Cloudflare Workers, Deno, the\n * browser).\n */\n\nimport { WassistSignatureVerificationError } from './errors';\nimport type { WassistEvent } from './types/events';\n\nconst DEFAULT_TOLERANCE_SECONDS = 300;\n\ninterface VerifyOptions {\n /**\n * Maximum allowed difference between the server timestamp and `now`, in\n * seconds. Pass `0` to disable replay protection (not recommended).\n *\n * @default 300\n */\n tolerance?: number;\n /**\n * Override `now` for testing — defaults to `Date.now() / 1000`.\n * @internal\n */\n currentTimestamp?: number;\n}\n\n/**\n * Stripe-style webhook helpers.\n *\n * Use via the SDK class:\n *\n * ```ts\n * import { Wassist } from '@wassist/sdk';\n *\n * const wassist = new Wassist({ apiKey: process.env.WASSIST_API_KEY! });\n * const event = wassist.webhooks.constructEvent(rawBody, sigHeader, secret);\n * ```\n *\n * Or statically — no instance required for verification:\n *\n * ```ts\n * import { Wassist } from '@wassist/sdk';\n * const event = Wassist.webhooks.constructEvent(rawBody, sigHeader, secret);\n * ```\n */\nexport class Webhooks {\n /**\n * Verify the signature on a webhook delivery, parse the body, and return\n * the typed event.\n *\n * @param payload The raw request body, exactly as received — `string`,\n * `Buffer`, or `Uint8Array`. **Do not parse it first;**\n * even whitespace differences will break verification.\n * @param header The `X-Wassist-Signature` header value.\n * @param secret Your webhook signing secret. Find it in the\n * [Wassist dashboard](https://wassist.app/developers/webhooks).\n * @param options.tolerance Replay-protection window in seconds (default 300).\n * @throws {WassistSignatureVerificationError} When the header is malformed,\n * the HMAC doesn't match, or the timestamp is outside the tolerance window.\n */\n constructEvent(\n payload: string | Uint8Array,\n header: string | null | undefined,\n secret: string,\n options: VerifyOptions = {}\n ): WassistEvent {\n const { signedPayload, parts } = this.prepare(payload, header);\n const expected = this.signSync(signedPayload, secret);\n this.assertValid(parts, expected, header ?? '', signedPayload, options);\n return this.parseEvent(payload);\n }\n\n /**\n * Async variant of {@link constructEvent} that uses Web Crypto, for\n * runtimes that don't expose `node:crypto` (Cloudflare Workers, Deno,\n * the browser).\n */\n async constructEventAsync(\n payload: string | Uint8Array,\n header: string | null | undefined,\n secret: string,\n options: VerifyOptions = {}\n ): Promise<WassistEvent> {\n const { signedPayload, parts } = this.prepare(payload, header);\n const expected = await this.signAsync(signedPayload, secret);\n this.assertValid(parts, expected, header ?? '', signedPayload, options);\n return this.parseEvent(payload);\n }\n\n /**\n * Compute the v1 signature for a `t.<body>` payload — exported as a\n * convenience for testing.\n */\n signSync(signedPayload: string, secret: string): string {\n const nodeCrypto = loadNodeCrypto();\n if (!nodeCrypto) {\n throw new WassistSignatureVerificationError({\n message:\n 'node:crypto is unavailable in this runtime. Use `constructEventAsync` instead.',\n });\n }\n return nodeCrypto.createHmac('sha256', secret).update(signedPayload).digest('hex');\n }\n\n /**\n * Web Crypto variant of {@link signSync}.\n */\n async signAsync(signedPayload: string, secret: string): Promise<string> {\n const subtle = globalThis.crypto?.subtle;\n if (!subtle) {\n throw new WassistSignatureVerificationError({\n message:\n 'Web Crypto (`globalThis.crypto.subtle`) is unavailable in this runtime.',\n });\n }\n const enc = new TextEncoder();\n const key = await subtle.importKey(\n 'raw',\n enc.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n const sig = await subtle.sign('HMAC', key, enc.encode(signedPayload));\n return toHex(new Uint8Array(sig));\n }\n\n // =============================================================================\n // Internals\n // =============================================================================\n\n private prepare(\n payload: string | Uint8Array,\n header: string | null | undefined\n ): { signedPayload: string; parts: { t: string; v1: string } } {\n if (!header) {\n throw new WassistSignatureVerificationError({\n message: 'Missing X-Wassist-Signature header.',\n header: header ?? undefined,\n });\n }\n const parts = parseHeader(header);\n if (!parts.t || !parts.v1) {\n throw new WassistSignatureVerificationError({\n message:\n 'Malformed X-Wassist-Signature header — expected `t=<unix>,v1=<hex>`.',\n header,\n });\n }\n const bodyText = typeof payload === 'string' ? payload : new TextDecoder().decode(payload);\n return { signedPayload: `${parts.t}.${bodyText}`, parts: parts as { t: string; v1: string } };\n }\n\n private assertValid(\n parts: { t: string; v1: string },\n expected: string,\n header: string,\n signedPayload: string,\n options: VerifyOptions\n ): void {\n if (!constantTimeEqualsHex(parts.v1, expected)) {\n throw new WassistSignatureVerificationError({\n message: 'Webhook signature did not match the expected value.',\n header,\n payload: signedPayload,\n });\n }\n const tolerance = options.tolerance ?? DEFAULT_TOLERANCE_SECONDS;\n if (tolerance > 0) {\n const now = options.currentTimestamp ?? Math.floor(Date.now() / 1000);\n const ts = Number(parts.t);\n if (!Number.isFinite(ts)) {\n throw new WassistSignatureVerificationError({\n message: `Invalid timestamp in X-Wassist-Signature: ${parts.t}`,\n header,\n });\n }\n if (Math.abs(now - ts) > tolerance) {\n throw new WassistSignatureVerificationError({\n message: `Webhook timestamp is outside the ${tolerance}s tolerance window (received ${ts}, now ${now}).`,\n header,\n });\n }\n }\n }\n\n private parseEvent(payload: string | Uint8Array): WassistEvent {\n const text =\n typeof payload === 'string' ? payload : new TextDecoder().decode(payload);\n try {\n return JSON.parse(text) as WassistEvent;\n } catch (err) {\n throw new WassistSignatureVerificationError({\n message: 'Failed to parse webhook payload as JSON.',\n payload: text,\n cause: err,\n });\n }\n }\n}\n\n// =============================================================================\n// Module-level helpers\n// =============================================================================\n\nfunction parseHeader(header: string): Partial<{ t: string; v1: string }> {\n const parts: Partial<Record<string, string>> = {};\n for (const segment of header.split(',')) {\n const eq = segment.indexOf('=');\n if (eq === -1) continue;\n const key = segment.slice(0, eq).trim();\n const value = segment.slice(eq + 1).trim();\n if (key === 't' || key === 'v1') parts[key] = value;\n }\n return parts as Partial<{ t: string; v1: string }>;\n}\n\nfunction constantTimeEqualsHex(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) {\n diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return diff === 0;\n}\n\nfunction toHex(bytes: Uint8Array): string {\n let out = '';\n for (let i = 0; i < bytes.length; i++) {\n const v = bytes[i] ?? 0;\n out += v.toString(16).padStart(2, '0');\n }\n return out;\n}\n\n/**\n * The singleton `webhooks` namespace exposed on the {@link Wassist} class.\n * Statically importable for stateless use.\n */\nexport const webhooks = new Webhooks();\n\n// =============================================================================\n// node:crypto loader\n// =============================================================================\n\ntype NodeCrypto = {\n createHmac: (alg: string, key: string) => {\n update: (data: string) => { digest: (enc: 'hex') => string };\n };\n};\n\nlet cachedNodeCrypto: NodeCrypto | null | undefined;\n\n/**\n * `__sdkRequire` is injected by the tsup banner — see `tsup.config.ts`.\n * In ESM it's a `createRequire(import.meta.url)`; in CJS it's the\n * ambient `require`. Both can resolve `node:crypto` synchronously.\n *\n * @internal\n */\ndeclare const __sdkRequire: ((id: string) => unknown) | undefined;\n\n/**\n * Lazily load `node:crypto` without forcing it into the dep graph for\n * runtimes that lack it (Cloudflare Workers, the browser). Returns\n * `undefined` if `node:crypto` cannot be resolved; the caller falls back\n * to {@link Webhooks.constructEventAsync}.\n *\n * @internal\n */\nfunction loadNodeCrypto(): NodeCrypto | undefined {\n if (cachedNodeCrypto !== undefined) return cachedNodeCrypto ?? undefined;\n try {\n const req: ((id: string) => unknown) | undefined =\n typeof __sdkRequire === 'function'\n ? __sdkRequire\n : (globalThis as { require?: (id: string) => unknown }).require;\n cachedNodeCrypto = (req?.('node:crypto') as NodeCrypto | undefined) ?? null;\n } catch {\n cachedNodeCrypto = null;\n }\n return cachedNodeCrypto ?? undefined;\n}\n","import { HttpClient, type WassistClientConfig } from './http';\nimport { AgentsResource } from './resources/agents';\nimport { ConversationsResource } from './resources/conversations';\nimport { PhoneNumbersResource } from './resources/phone-numbers';\nimport { WhatsAppAccountsResource } from './resources/whatsapp-accounts';\nimport { WhatsAppLinkSessionsResource } from './resources/whatsapp-link-sessions';\nimport { WhatsAppTemplatesResource } from './resources/whatsapp-templates';\nimport { Webhooks, webhooks as webhooksSingleton } from './webhooks';\n\n/**\n * The Wassist API client.\n *\n * @example\n * ```ts\n * import { Wassist } from '@wassist/sdk';\n *\n * const wassist = new Wassist({ apiKey: process.env.WASSIST_API_KEY! });\n *\n * const agent = await wassist.agents.create({ name: 'Sales Assistant' });\n *\n * for await (const conv of wassist.conversations.list()) {\n * console.log(conv.id);\n * }\n * ```\n */\nexport class Wassist {\n /** Create and manage AI agents. */\n readonly agents: AgentsResource;\n /** Send messages and manage conversations (with nested `messages` resource). */\n readonly conversations: ConversationsResource;\n /** Manage your connected WhatsApp phone numbers and their routing. */\n readonly phoneNumbers: PhoneNumbersResource;\n /** Manage WhatsApp Business Accounts. */\n readonly whatsappAccounts: WhatsAppAccountsResource;\n /** Manage hosted WhatsApp account-linking sessions. */\n readonly whatsappLinkSessions: WhatsAppLinkSessionsResource;\n /** Manage WhatsApp message templates. */\n readonly whatsappTemplates: WhatsAppTemplatesResource;\n /** Verify inbound webhook signatures. */\n readonly webhooks: Webhooks = webhooksSingleton;\n\n /**\n * Webhook helpers — usable without instantiating a client.\n *\n * @example\n * ```ts\n * const event = Wassist.webhooks.constructEvent(body, header, secret);\n * ```\n */\n static readonly webhooks: Webhooks = webhooksSingleton;\n\n constructor(config: WassistClientConfig) {\n const http = new HttpClient(config);\n this.agents = new AgentsResource(http);\n this.conversations = new ConversationsResource(http);\n this.phoneNumbers = new PhoneNumbersResource(http);\n this.whatsappAccounts = new WhatsAppAccountsResource(http);\n this.whatsappLinkSessions = new WhatsAppLinkSessionsResource(http);\n this.whatsappTemplates = new WhatsAppTemplatesResource(http);\n }\n}\n"]}
|