@wassist/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/LICENSE +21 -0
- package/README.md +282 -0
- package/dist/index.cjs +1134 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1626 -0
- package/dist/index.d.ts +1626 -0
- package/dist/index.js +1113 -0
- package/dist/index.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +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.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"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@wassist/sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Wassist SDK – the TypeScript client for the Wassist API",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
},
|
|
15
|
+
"./package.json": "./package.json"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"dev": "tsup --watch",
|
|
19
|
+
"build": "tsup",
|
|
20
|
+
"typecheck": "tsc --noEmit",
|
|
21
|
+
"prepublishOnly": "npm run build",
|
|
22
|
+
"push": "cd ../../ && git subtree push --prefix=packages/sdk git@github.com:Wassist/sdk.git main",
|
|
23
|
+
"publish": "npm publish --access public"
|
|
24
|
+
},
|
|
25
|
+
"repository": {
|
|
26
|
+
"type": "git",
|
|
27
|
+
"url": "git+https://github.com/wassist/sdk.git"
|
|
28
|
+
},
|
|
29
|
+
"homepage": "https://github.com/wassist/sdk#readme",
|
|
30
|
+
"bugs": {
|
|
31
|
+
"url": "https://github.com/wassist/sdk/issues"
|
|
32
|
+
},
|
|
33
|
+
"keywords": [
|
|
34
|
+
"whatsapp",
|
|
35
|
+
"wassist",
|
|
36
|
+
"sdk",
|
|
37
|
+
"api",
|
|
38
|
+
"whatsapp-api",
|
|
39
|
+
"messaging",
|
|
40
|
+
"chatbot",
|
|
41
|
+
"ai-agent"
|
|
42
|
+
],
|
|
43
|
+
"author": "Wassist",
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"sideEffects": false,
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/node": "^22",
|
|
48
|
+
"tsup": "^8",
|
|
49
|
+
"tsx": "^4",
|
|
50
|
+
"typescript": "^5"
|
|
51
|
+
},
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=18"
|
|
54
|
+
},
|
|
55
|
+
"files": [
|
|
56
|
+
"dist",
|
|
57
|
+
"README.md",
|
|
58
|
+
"LICENSE",
|
|
59
|
+
"CHANGELOG.md"
|
|
60
|
+
]
|
|
61
|
+
}
|