@ulvio/client 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/http.ts","../src/clients/mail.ts","../src/clients/mailbox.ts","../src/clients/sms.ts","../src/clients/whatsapp.ts","../src/clients/voice.ts","../src/clients/files.ts","../src/clients/ai.ts","../src/clients/html-to-pdf.ts","../src/clients/utilities.ts"],"sourcesContent":["import { HttpClient, type UlvioConfig } from './http.js';\nimport { MailClient } from './clients/mail.js';\nimport { MailboxClient } from './clients/mailbox.js';\nimport { SmsClient } from './clients/sms.js';\nimport { WhatsAppClient } from './clients/whatsapp.js';\nimport { VoiceClient } from './clients/voice.js';\nimport { FilesClient } from './clients/files.js';\nimport { AiClient } from './clients/ai.js';\nimport { HtmlToPdfClient } from './clients/html-to-pdf.js';\nimport { UtilitiesClient } from './clients/utilities.js';\n\nexport class Ulvio {\n readonly mail: MailClient;\n readonly mailbox: MailboxClient;\n readonly sms: SmsClient;\n readonly whatsapp: WhatsAppClient;\n readonly voice: VoiceClient;\n readonly files: FilesClient;\n readonly ai: AiClient;\n readonly htmlToPdf: HtmlToPdfClient;\n readonly utilities: UtilitiesClient;\n\n constructor(config: UlvioConfig = {}) {\n const http = new HttpClient(config);\n this.mail = new MailClient(http);\n this.mailbox = new MailboxClient(http);\n this.sms = new SmsClient(http);\n this.whatsapp = new WhatsAppClient(http);\n this.voice = new VoiceClient(http);\n this.files = new FilesClient(http);\n this.ai = new AiClient(http);\n this.htmlToPdf = new HtmlToPdfClient(http);\n this.utilities = new UtilitiesClient(http);\n }\n}\n\nexport type { UlvioConfig } from './http.js';\n\n// Errors\nexport {\n UlvioError,\n CONNECTOR_UNHEALTHY_CODE,\n PLATFORM_NOT_CONFIGURED_CODE,\n HTML_TO_PDF_NOT_CONFIGURED_CODE,\n UTILITIES_NOT_CONFIGURED_CODE,\n isConnectorUnhealthyError,\n type ErrorResponseBody,\n} from './errors.js';\n\n// Sub-client classes\nexport { MailClient } from './clients/mail.js';\nexport { MailboxClient } from './clients/mailbox.js';\nexport { SmsClient } from './clients/sms.js';\nexport { WhatsAppClient } from './clients/whatsapp.js';\nexport { VoiceClient } from './clients/voice.js';\nexport { FilesClient } from './clients/files.js';\nexport { AiClient } from './clients/ai.js';\nexport { HtmlToPdfClient } from './clients/html-to-pdf.js';\nexport { UtilitiesClient } from './clients/utilities.js';\n\n// Mail types\nexport type {\n Attachment,\n TransactionalMailSendRequest,\n TransactionalMailSendResponse,\n} from './clients/mail.js';\n\n// Mailbox types\nexport type {\n MailboxSendRequest,\n MailboxSendResponse,\n MailboxAttachment,\n MailboxMessageSummary,\n MailboxMessagesListResponse,\n MailboxMessageDetail,\n MailboxMarkProcessedResponse,\n MailboxConnectorStatus,\n} from './clients/mailbox.js';\n\n// SMS types\nexport type { SmsSendRequest, SmsSendResponse } from './clients/sms.js';\n\n// WhatsApp types\nexport type {\n WhatsAppParameter,\n WhatsAppComponent,\n WhatsAppSendRequest,\n WhatsAppSendResponse,\n} from './clients/whatsapp.js';\n\n// Voice types\nexport type { VoiceTranscribeRequest, VoiceTranscribeResponse } from './clients/voice.js';\n\n// Files types\nexport type {\n FileUploadResponse,\n FileListItem,\n FileListResponse,\n PresignedUrlResponse,\n FileUploadBody,\n} from './clients/files.js';\n\n// AI types\nexport type {\n Role,\n InputMessage,\n Input,\n ParseRequest,\n ParseResponse,\n StreamEvent,\n} from './clients/ai.js';\n\n// HTML-to-PDF types\nexport type {\n PdfOptions,\n HtmlToPdfBase64Request,\n HtmlToPdfUploadRequest,\n HtmlToPdfRequest,\n HtmlToPdfBase64Response,\n HtmlToPdfUploadResponse,\n HtmlToPdfResponse,\n QueuedEvent,\n ProcessingEvent,\n HtmlToPdfCallbacks,\n} from './clients/html-to-pdf.js';\n\n// Utilities types\nexport type {\n MjmlValidationError,\n MjmlCompileRequest,\n MjmlCompileResponse,\n LiquidRenderRequest,\n LiquidRenderResponse,\n LiquidVariablesRequest,\n LiquidVariablesResponse,\n MarkdownRenderRequest,\n MarkdownRenderResponse,\n RenderEmailRequest,\n RenderEmailResponse,\n} from './clients/utilities.js';\n","export interface ErrorResponseBody {\n error: {\n code?: string;\n message: string;\n };\n}\n\nexport const CONNECTOR_UNHEALTHY_CODE = 'CONNECTOR_UNHEALTHY';\n\nexport const PLATFORM_NOT_CONFIGURED_CODE = 'platform_not_configured';\nexport const HTML_TO_PDF_NOT_CONFIGURED_CODE = 'html_to_pdf_not_configured';\nexport const UTILITIES_NOT_CONFIGURED_CODE = 'utilities_not_configured';\n\nexport class UlvioError extends Error {\n readonly code: string;\n readonly status?: number;\n readonly response?: unknown;\n\n constructor(\n code: string,\n message: string,\n options: { status?: number; response?: unknown; cause?: unknown } = {},\n ) {\n super(message, { cause: options.cause });\n this.name = 'UlvioError';\n this.code = code;\n this.status = options.status;\n this.response = options.response;\n }\n}\n\nexport function isConnectorUnhealthyError(err: unknown): boolean {\n if (err instanceof UlvioError) return err.code === CONNECTOR_UNHEALTHY_CODE;\n const response = (err as { response?: ErrorResponseBody })?.response;\n return response?.error?.code === CONNECTOR_UNHEALTHY_CODE;\n}\n","import {\n ErrorResponseBody,\n HTML_TO_PDF_NOT_CONFIGURED_CODE,\n PLATFORM_NOT_CONFIGURED_CODE,\n UTILITIES_NOT_CONFIGURED_CODE,\n UlvioError,\n} from './errors.js';\n\nexport interface UlvioConfig {\n platformApiUrl?: string;\n platformApiKey?: string;\n htmlToPdfApiUrl?: string;\n utilitiesApiUrl?: string;\n}\n\ninterface RequestOptions {\n body?: unknown;\n}\n\ninterface RequestRawOptions {\n body?: BodyInit;\n contentType?: string;\n headers?: Record<string, string>;\n}\n\nfunction trimSlash(url: string): string {\n return url.replace(/\\/$/, '');\n}\n\nasync function parseError(res: Response, fallbackCode = 'request_failed'): Promise<UlvioError> {\n let body: ErrorResponseBody | undefined;\n try {\n body = (await res.json()) as ErrorResponseBody;\n } catch {\n body = undefined;\n }\n const code = body?.error?.code ?? fallbackCode;\n const message = body?.error?.message ?? res.statusText;\n return new UlvioError(code, message, { status: res.status, response: body });\n}\n\nexport class HttpClient {\n constructor(private readonly config: UlvioConfig) {}\n\n private requirePlatform(method: string): { url: string; key: string } {\n const url = this.config.platformApiUrl;\n const key = this.config.platformApiKey;\n if (!url || !key) {\n throw new UlvioError(\n PLATFORM_NOT_CONFIGURED_CODE,\n `${method} requires platformApiUrl and platformApiKey to be set on the Ulvio client`,\n );\n }\n return { url: trimSlash(url), key };\n }\n\n private requireHtmlToPdf(method: string): string {\n const url = this.config.htmlToPdfApiUrl;\n if (!url) {\n throw new UlvioError(\n HTML_TO_PDF_NOT_CONFIGURED_CODE,\n `${method} requires htmlToPdfApiUrl to be set on the Ulvio client`,\n );\n }\n return trimSlash(url);\n }\n\n private requireUtilities(method: string): string {\n const url = this.config.utilitiesApiUrl;\n if (!url) {\n throw new UlvioError(\n UTILITIES_NOT_CONFIGURED_CODE,\n `${method} requires utilitiesApiUrl to be set on the Ulvio client`,\n );\n }\n return trimSlash(url);\n }\n\n // ── Platform (authenticated) ──────────────────────────────────────────\n\n async platformRequest<T>(\n callerName: string,\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<T> {\n const { url, key } = this.requirePlatform(callerName);\n const res = await fetch(`${url}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${key}`,\n },\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n });\n if (!res.ok) throw await parseError(res);\n return (await res.json()) as T;\n }\n\n async platformRequestRaw(\n callerName: string,\n method: string,\n path: string,\n options: RequestRawOptions = {},\n ): Promise<Response> {\n const { url, key } = this.requirePlatform(callerName);\n const headers: Record<string, string> = { ...options.headers };\n if (options.contentType) headers['Content-Type'] = options.contentType;\n headers['Authorization'] = `Bearer ${key}`;\n const res = await fetch(`${url}${path}`, {\n method,\n headers,\n body: options.body,\n });\n if (!res.ok) throw await parseError(res);\n return res;\n }\n\n // ── HTML-to-PDF (unauthenticated) ─────────────────────────────────────\n\n async htmlToPdfFetch(\n callerName: string,\n path: string,\n init: RequestInit,\n ): Promise<Response> {\n const url = this.requireHtmlToPdf(callerName);\n return fetch(`${url}${path}`, init);\n }\n\n // ── Utilities (unauthenticated) ───────────────────────────────────────\n\n async utilitiesRequest<T>(\n callerName: string,\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<T> {\n const url = this.requireUtilities(callerName);\n const res = await fetch(`${url}${path}`, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n });\n const data = (await res.json().catch(() => undefined)) as T | undefined;\n if (!res.ok) {\n const errBody = data as ErrorResponseBody | undefined;\n throw new UlvioError(\n errBody?.error?.code ?? 'request_failed',\n errBody?.error?.message ?? res.statusText,\n { status: res.status, response: data },\n );\n }\n return data as T;\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface Attachment {\n filename: string;\n /** Base64-encoded file content. */\n content: string;\n content_type: string;\n}\n\nexport interface TransactionalMailSendRequest {\n from: string;\n to: string[];\n subject: string;\n body_html?: string;\n body_text?: string;\n reply_to?: string;\n attachments?: Attachment[];\n}\n\nexport interface TransactionalMailSendResponse {\n message_id: string;\n}\n\nexport class MailClient {\n constructor(private readonly http: HttpClient) {}\n\n sendTransactional(\n params: TransactionalMailSendRequest,\n ): Promise<TransactionalMailSendResponse> {\n return this.http.platformRequest<TransactionalMailSendResponse>(\n 'client.mail.sendTransactional()',\n 'POST',\n '/v1/transactional-mail/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { Attachment } from './mail.js';\n\nexport interface MailboxSendRequest {\n to: string[];\n cc?: string[];\n bcc?: string[];\n subject: string;\n body_html?: string;\n body_text?: string;\n /** Message ID to reply to. Threads the message correctly. */\n reply_to_id?: string;\n attachments?: Attachment[];\n}\n\nexport interface MailboxSendResponse {\n message_id: string;\n}\n\nexport interface MailboxAttachment {\n id: string;\n filename: string;\n content_type: string;\n size_bytes: number;\n}\n\nexport interface MailboxMessageSummary {\n id: string;\n subject: string;\n from: string;\n to: string[];\n /** First 150 characters of the body, HTML stripped. */\n preview: string;\n received_at: string;\n has_attachments: boolean;\n is_read: boolean;\n is_processed: boolean;\n processed_at: string | null;\n}\n\nexport interface MailboxMessagesListResponse {\n messages: MailboxMessageSummary[];\n total: number;\n}\n\nexport interface MailboxMessageDetail {\n id: string;\n subject: string;\n from: string;\n to: string[];\n cc: string[];\n bcc: string[];\n body_html?: string;\n body_text?: string;\n received_at: string;\n is_read: boolean;\n is_processed: boolean;\n processed_at: string | null;\n attachments: MailboxAttachment[];\n}\n\nexport interface MailboxMarkProcessedResponse {\n ok: true;\n id: string;\n already_processed: boolean;\n processed_at: string;\n}\n\nexport interface MailboxConnectorStatus {\n healthy: boolean;\n state: 'healthy' | 'unhealthy';\n /** ISO timestamp of the last state change, or null if never changed. */\n changed_at: string | null;\n}\n\nexport class MailboxClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: MailboxSendRequest): Promise<MailboxSendResponse> {\n return this.http.platformRequest<MailboxSendResponse>(\n 'client.mailbox.send()',\n 'POST',\n '/v1/mailbox/send',\n { body: params },\n );\n }\n\n list(limit?: number): Promise<MailboxMessagesListResponse> {\n const qs = limit !== undefined ? `?limit=${limit}` : '';\n return this.http.platformRequest<MailboxMessagesListResponse>(\n 'client.mailbox.list()',\n 'GET',\n `/v1/mailbox/messages${qs}`,\n );\n }\n\n get(id: string): Promise<MailboxMessageDetail> {\n return this.http.platformRequest<MailboxMessageDetail>(\n 'client.mailbox.get()',\n 'GET',\n `/v1/mailbox/messages/${encodeURIComponent(id)}`,\n );\n }\n\n markProcessed(id: string): Promise<MailboxMarkProcessedResponse> {\n return this.http.platformRequest<MailboxMarkProcessedResponse>(\n 'client.mailbox.markProcessed()',\n 'POST',\n `/v1/mailbox/messages/${encodeURIComponent(id)}/mark-processed`,\n );\n }\n\n /**\n * Download a mailbox message attachment as a Buffer.\n */\n async getAttachment(messageId: string, attachmentId: string): Promise<Buffer> {\n const res = await this.http.platformRequestRaw(\n 'client.mailbox.getAttachment()',\n 'GET',\n `/v1/mailbox/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`,\n );\n const arrayBuffer = await res.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n\n getConnectorStatus(): Promise<MailboxConnectorStatus> {\n return this.http.platformRequest<MailboxConnectorStatus>(\n 'client.mailbox.getConnectorStatus()',\n 'GET',\n '/v1/mailbox/connector-status',\n );\n }\n\n /**\n * Dev-only: toggle the mock connector's health state.\n */\n setConnectorStatus(healthy: boolean): Promise<MailboxConnectorStatus> {\n return this.http.platformRequest<MailboxConnectorStatus>(\n 'client.mailbox.setConnectorStatus()',\n 'PATCH',\n '/v1/mailbox/connector-status',\n { body: { healthy } },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface SmsSendRequest {\n /** Sender phone number in E.164 format. */\n from: string;\n /** Recipient phone number in E.164 format. */\n to: string;\n /** SMS text content. Max 1600 characters. */\n body: string;\n}\n\nexport interface SmsSendResponse {\n message_id: string;\n status: 'queued';\n}\n\nexport class SmsClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: SmsSendRequest): Promise<SmsSendResponse> {\n return this.http.platformRequest<SmsSendResponse>(\n 'client.sms.send()',\n 'POST',\n '/v1/sms/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface WhatsAppParameter {\n type: 'text' | 'image' | 'document' | 'video';\n parameter_name?: string;\n text?: string;\n image?: { link: string };\n document?: { link: string; filename: string };\n video?: { link: string };\n}\n\nexport interface WhatsAppComponent {\n type: 'header' | 'body' | 'button';\n sub_type?: 'url' | 'quick_reply';\n index?: number;\n parameters: WhatsAppParameter[];\n}\n\nexport interface WhatsAppSendRequest {\n /** Recipient phone number in E.164 format. */\n to: string;\n /** Pre-approved WhatsApp template name. */\n template_name: string;\n /** BCP 47 language code (e.g. \"en\", \"nl\", \"fr\"). */\n language_code: string;\n components?: WhatsAppComponent[];\n}\n\nexport interface WhatsAppSendResponse {\n message_id: string;\n status: 'queued';\n}\n\nexport class WhatsAppClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: WhatsAppSendRequest): Promise<WhatsAppSendResponse> {\n return this.http.platformRequest<WhatsAppSendResponse>(\n 'client.whatsapp.send()',\n 'POST',\n '/v1/whatsapp/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface VoiceTranscribeRequest {\n /** Base64-encoded audio buffer. */\n file: string;\n file_name: string;\n /** Optional BCP-47 language code (e.g. \"en\", \"nl\"). */\n language_code?: string;\n}\n\nexport interface VoiceTranscribeResponse {\n job_id: string;\n status: string;\n text: string;\n}\n\nexport class VoiceClient {\n constructor(private readonly http: HttpClient) {}\n\n transcribe(params: VoiceTranscribeRequest): Promise<VoiceTranscribeResponse> {\n return this.http.platformRequest<VoiceTranscribeResponse>(\n 'client.voice.transcribe()',\n 'POST',\n '/v1/voice/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface FileUploadResponse {\n key: string;\n content_type: string;\n size_bytes: number;\n}\n\nexport interface FileListItem {\n key: string;\n is_folder: boolean;\n content_type: string | null;\n size_bytes: number;\n created_at: string | null;\n}\n\nexport interface FileListResponse {\n files: FileListItem[];\n next_cursor: string | null;\n}\n\nexport interface PresignedUrlResponse {\n url: string;\n expires_in: number;\n}\n\nexport type FileUploadBody = Buffer | Uint8Array | ReadableStream | string;\n\nexport class FilesClient {\n constructor(private readonly http: HttpClient) {}\n\n async upload(\n key: string,\n file: FileUploadBody,\n contentType: string = 'application/octet-stream',\n ): Promise<FileUploadResponse> {\n const res = await this.http.platformRequestRaw(\n 'client.files.upload()',\n 'PUT',\n `/v1/files/${encodeURI(key)}`,\n { body: file as BodyInit, contentType },\n );\n return (await res.json()) as FileUploadResponse;\n }\n\n /**\n * Download a file. Returns the raw Response for streaming.\n */\n get(key: string): Promise<Response> {\n return this.http.platformRequestRaw(\n 'client.files.get()',\n 'GET',\n `/v1/files/${encodeURI(key)}`,\n );\n }\n\n list(prefix?: string, limit?: number, cursor?: string): Promise<FileListResponse> {\n const params = new URLSearchParams();\n if (prefix) params.set('prefix', prefix);\n if (limit !== undefined) params.set('limit', String(limit));\n if (cursor) params.set('cursor', cursor);\n const qs = params.toString();\n return this.http.platformRequest<FileListResponse>(\n 'client.files.list()',\n 'GET',\n `/v1/files${qs ? `?${qs}` : ''}`,\n );\n }\n\n delete(key: string): Promise<{ ok: true }> {\n return this.http.platformRequest<{ ok: true }>(\n 'client.files.delete()',\n 'DELETE',\n `/v1/files/${encodeURI(key)}`,\n );\n }\n\n deleteMany(prefix: string): Promise<{ ok: true; deleted: number }> {\n return this.http.platformRequest<{ ok: true; deleted: number }>(\n 'client.files.deleteMany()',\n 'DELETE',\n `/v1/files?prefix=${encodeURIComponent(prefix)}`,\n );\n }\n\n /**\n * Generate a time-limited download URL for a file.\n * @param expiresIn TTL in seconds (default 3600, min 60, max 86400)\n */\n presignedDownloadUrl(key: string, expiresIn?: number): Promise<PresignedUrlResponse> {\n return this.http.platformRequest<PresignedUrlResponse>(\n 'client.files.presignedDownloadUrl()',\n 'POST',\n '/v1/files/presigned-download',\n { body: { key, expires_in: expiresIn } },\n );\n }\n\n /**\n * Generate a time-limited upload URL for a file.\n * @param expiresIn TTL in seconds (default 3600, min 60, max 86400)\n * @param maxSize Max file size in bytes (default 50MB)\n */\n presignedUploadUrl(\n key: string,\n contentType: string,\n expiresIn?: number,\n maxSize?: number,\n ): Promise<PresignedUrlResponse> {\n return this.http.platformRequest<PresignedUrlResponse>(\n 'client.files.presignedUploadUrl()',\n 'POST',\n '/v1/files/presigned-upload',\n {\n body: { key, content_type: contentType, expires_in: expiresIn, max_size: maxSize },\n },\n );\n }\n}\n","import { z } from 'zod';\nimport type { HttpClient } from '../http.js';\nimport { UlvioError, type ErrorResponseBody } from '../errors.js';\n\nexport type Role = 'user' | 'assistant' | 'system';\n\nexport interface InputMessage {\n role: Role;\n content: string;\n}\n\nexport type Input = string | InputMessage[];\n\nexport interface ParseRequest<TSchema extends z.ZodType> {\n /** Model identifier, e.g. \"claude-opus-4-7\", \"claude-sonnet-4-6\". */\n model: string;\n input: Input;\n /** Zod schema describing the structured output shape. */\n schema: TSchema;\n}\n\nexport interface ParseResponse<T> {\n data: T;\n}\n\nexport type StreamEvent<T> =\n | { type: 'partial'; data: Partial<T> }\n | { type: 'complete'; data: T }\n | { type: 'error'; message: string };\n\ninterface WirePayload {\n model: string;\n input: Input;\n /** JSON Schema serialized from the supplied Zod schema. */\n schema: unknown;\n}\n\nfunction buildPayload<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n): WirePayload {\n return {\n model: params.model,\n input: params.input,\n schema: z.toJSONSchema(params.schema),\n };\n}\n\nfunction parseSseEvents(chunk: string): Array<{ event: string; data: string }> {\n const events: Array<{ event: string; data: string }> = [];\n let currentEvent = '';\n let currentData = '';\n\n for (const line of chunk.split('\\n')) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7);\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6);\n } else if (line === '' && currentEvent) {\n events.push({ event: currentEvent, data: currentData });\n currentEvent = '';\n currentData = '';\n }\n }\n\n return events;\n}\n\nexport class AiClient {\n constructor(private readonly http: HttpClient) {}\n\n async parse<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n ): Promise<z.infer<TSchema>> {\n const wire = buildPayload(params);\n const response = await this.http.platformRequest<ParseResponse<unknown>>(\n 'client.ai.parse()',\n 'POST',\n '/v1/ai/parse',\n { body: wire },\n );\n return params.schema.parse(response.data) as z.infer<TSchema>;\n }\n\n async *stream<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n ): AsyncGenerator<StreamEvent<z.infer<TSchema>>, void, void> {\n const wire = buildPayload(params);\n const res = await this.http.platformRequestRaw(\n 'client.ai.stream()',\n 'POST',\n '/v1/ai/stream',\n {\n body: JSON.stringify(wire),\n contentType: 'application/json',\n headers: { Accept: 'text/event-stream' },\n },\n );\n\n if (!res.body) {\n throw new UlvioError('stream_no_body', 'AI stream returned no response body', {\n status: res.status,\n });\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n const events = parseSseEvents(buffer);\n const lastBoundary = buffer.lastIndexOf('\\n\\n');\n buffer = lastBoundary >= 0 ? buffer.slice(lastBoundary + 2) : buffer;\n\n for (const { event, data } of events) {\n switch (event) {\n case 'partial':\n yield { type: 'partial', data: JSON.parse(data) as Partial<z.infer<TSchema>> };\n break;\n case 'complete': {\n const parsed = params.schema.parse(JSON.parse(data));\n yield { type: 'complete', data: parsed as z.infer<TSchema> };\n return;\n }\n case 'error': {\n const errBody = JSON.parse(data) as ErrorResponseBody['error'] | { message: string };\n throw new UlvioError(\n ('code' in errBody && errBody.code) || 'ai_stream_error',\n errBody.message,\n );\n }\n }\n }\n }\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { UlvioError, type ErrorResponseBody } from '../errors.js';\n\nexport interface PdfOptions {\n format?: string;\n printBackground?: boolean;\n margin?: {\n top?: string;\n right?: string;\n bottom?: string;\n left?: string;\n };\n}\n\nexport interface HtmlToPdfBase64Request {\n /** Base64-encoded HTML content. Provide either `html` or `sourceUrl`. */\n html?: string;\n sourceUrl?: string;\n outputMode: 'base64';\n options?: PdfOptions;\n}\n\nexport interface HtmlToPdfUploadRequest {\n html?: string;\n sourceUrl?: string;\n /** Pre-signed URL the service will PUT the rendered PDF to. */\n uploadUrl: string;\n options?: PdfOptions;\n}\n\nexport type HtmlToPdfRequest = HtmlToPdfBase64Request | HtmlToPdfUploadRequest;\n\nexport interface HtmlToPdfBase64Response {\n pdf: string;\n}\n\nexport interface HtmlToPdfUploadResponse {\n uploaded: true;\n bytes: number;\n}\n\nexport type HtmlToPdfResponse = HtmlToPdfBase64Response | HtmlToPdfUploadResponse;\n\nexport interface QueuedEvent {\n position: number;\n}\n\nexport interface ProcessingEvent {\n step: string;\n progress: number;\n}\n\nexport interface HtmlToPdfCallbacks {\n onQueued?: (data: QueuedEvent) => void;\n onProcessing?: (data: ProcessingEvent) => void;\n}\n\nfunction parseSseEvents(chunk: string): Array<{ event: string; data: string }> {\n const events: Array<{ event: string; data: string }> = [];\n let currentEvent = '';\n let currentData = '';\n\n for (const line of chunk.split('\\n')) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7);\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6);\n } else if (line === '' && currentEvent) {\n events.push({ event: currentEvent, data: currentData });\n currentEvent = '';\n currentData = '';\n }\n }\n\n return events;\n}\n\nexport class HtmlToPdfClient {\n constructor(private readonly http: HttpClient) {}\n\n async convert(\n params: HtmlToPdfBase64Request,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfBase64Response>;\n async convert(\n params: HtmlToPdfUploadRequest,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfUploadResponse>;\n async convert(\n params: HtmlToPdfRequest,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfResponse> {\n const res = await this.http.htmlToPdfFetch('client.htmlToPdf.convert()', '/api/html-to-pdf', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n });\n\n if (!res.ok) {\n const data = (await res.json().catch(() => undefined)) as\n | ErrorResponseBody\n | undefined;\n throw new UlvioError(\n data?.error?.code ?? 'html_to_pdf_failed',\n data?.error?.message ?? res.statusText,\n { status: res.status, response: data },\n );\n }\n\n if (!res.body) {\n throw new UlvioError('html_to_pdf_no_body', 'html-to-pdf service returned no body', {\n status: res.status,\n });\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const events = parseSseEvents(buffer);\n const lastBoundary = buffer.lastIndexOf('\\n\\n');\n buffer = lastBoundary >= 0 ? buffer.slice(lastBoundary + 2) : buffer;\n\n for (const { event, data } of events) {\n switch (event) {\n case 'queued':\n callbacks?.onQueued?.(JSON.parse(data) as QueuedEvent);\n break;\n case 'processing':\n callbacks?.onProcessing?.(JSON.parse(data) as ProcessingEvent);\n break;\n case 'complete':\n return JSON.parse(data) as HtmlToPdfResponse;\n case 'error': {\n const errBody = JSON.parse(data) as { code?: string; message: string };\n throw new UlvioError(\n errBody.code ?? 'html_to_pdf_error',\n errBody.message,\n );\n }\n }\n }\n }\n\n throw new UlvioError(\n 'html_to_pdf_truncated',\n 'SSE stream ended without a complete event',\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\n// MJML\n\nexport interface MjmlValidationError {\n line: number;\n message: string;\n tagName: string;\n formattedMessage: string;\n}\n\nexport interface MjmlCompileRequest {\n mjml: string;\n options?: {\n minify?: boolean;\n beautify?: boolean;\n validationLevel?: 'strict' | 'soft' | 'skip';\n };\n}\n\nexport interface MjmlCompileResponse {\n html: string;\n errors: MjmlValidationError[];\n}\n\n// LiquidJS\n\nexport interface LiquidRenderRequest {\n template: string;\n data: Record<string, unknown>;\n}\n\nexport interface LiquidRenderResponse {\n result: string;\n}\n\nexport interface LiquidVariablesRequest {\n template: string;\n}\n\nexport interface LiquidVariablesResponse {\n variables: string[];\n}\n\n// Markdown\n\nexport interface MarkdownRenderRequest {\n markdown: string;\n}\n\nexport interface MarkdownRenderResponse {\n html: string;\n}\n\n// Combined Liquid → MJML pipeline\n\nexport interface RenderEmailRequest {\n mjml: string;\n data: Record<string, unknown>;\n options?: {\n minify?: boolean;\n beautify?: boolean;\n validationLevel?: 'strict' | 'soft' | 'skip';\n };\n}\n\nexport interface RenderEmailResponse {\n html: string;\n errors: MjmlValidationError[];\n}\n\nexport class UtilitiesClient {\n constructor(private readonly http: HttpClient) {}\n\n compileMjml(params: MjmlCompileRequest): Promise<MjmlCompileResponse> {\n return this.http.utilitiesRequest<MjmlCompileResponse>(\n 'client.utilities.compileMjml()',\n 'POST',\n '/api/mjml/compile',\n { body: params },\n );\n }\n\n renderLiquid(params: LiquidRenderRequest): Promise<LiquidRenderResponse> {\n return this.http.utilitiesRequest<LiquidRenderResponse>(\n 'client.utilities.renderLiquid()',\n 'POST',\n '/api/liquidjs/render',\n { body: params },\n );\n }\n\n extractLiquidVariables(\n params: LiquidVariablesRequest,\n ): Promise<LiquidVariablesResponse> {\n return this.http.utilitiesRequest<LiquidVariablesResponse>(\n 'client.utilities.extractLiquidVariables()',\n 'POST',\n '/api/liquidjs/variables',\n { body: params },\n );\n }\n\n renderMarkdown(params: MarkdownRenderRequest): Promise<MarkdownRenderResponse> {\n return this.http.utilitiesRequest<MarkdownRenderResponse>(\n 'client.utilities.renderMarkdown()',\n 'POST',\n '/api/markdown/render',\n { body: params },\n );\n }\n\n renderEmail(params: RenderEmailRequest): Promise<RenderEmailResponse> {\n return this.http.utilitiesRequest<RenderEmailResponse>(\n 'client.utilities.renderEmail()',\n 'POST',\n '/api/render-email',\n { body: params },\n );\n }\n}\n"],"mappings":"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","names":["parseSseEvents"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/http.ts","../src/clients/mail.ts","../src/clients/mailbox.ts","../src/clients/sms.ts","../src/clients/whatsapp.ts","../src/clients/voice.ts","../src/clients/files.ts","../src/clients/ai.ts","../src/clients/html-to-pdf.ts","../src/clients/utilities.ts"],"sourcesContent":["import { HttpClient, type UlvioConfig } from './http.js';\nimport { MailClient } from './clients/mail.js';\nimport { MailboxClient } from './clients/mailbox.js';\nimport { SmsClient } from './clients/sms.js';\nimport { WhatsAppClient } from './clients/whatsapp.js';\nimport { VoiceClient } from './clients/voice.js';\nimport { FilesClient } from './clients/files.js';\nimport { AiClient } from './clients/ai.js';\nimport { HtmlToPdfClient } from './clients/html-to-pdf.js';\nimport { UtilitiesClient } from './clients/utilities.js';\n\nexport class Ulvio {\n readonly mail: MailClient;\n readonly mailbox: MailboxClient;\n readonly sms: SmsClient;\n readonly whatsapp: WhatsAppClient;\n readonly voice: VoiceClient;\n readonly files: FilesClient;\n readonly ai: AiClient;\n readonly htmlToPdf: HtmlToPdfClient;\n readonly utilities: UtilitiesClient;\n\n constructor(config: UlvioConfig = {}) {\n const http = new HttpClient(config);\n this.mail = new MailClient(http);\n this.mailbox = new MailboxClient(http);\n this.sms = new SmsClient(http);\n this.whatsapp = new WhatsAppClient(http);\n this.voice = new VoiceClient(http);\n this.files = new FilesClient(http);\n this.ai = new AiClient(http);\n this.htmlToPdf = new HtmlToPdfClient(http);\n this.utilities = new UtilitiesClient(http);\n }\n}\n\nexport type { UlvioConfig } from './http.js';\n\n// Errors\nexport {\n UlvioError,\n CONNECTOR_UNHEALTHY_CODE,\n PLATFORM_NOT_CONFIGURED_CODE,\n HTML_TO_PDF_NOT_CONFIGURED_CODE,\n UTILITIES_NOT_CONFIGURED_CODE,\n isConnectorUnhealthyError,\n type ErrorResponseBody,\n} from './errors.js';\n\n// Sub-client classes\nexport { MailClient } from './clients/mail.js';\nexport { MailboxClient } from './clients/mailbox.js';\nexport { SmsClient } from './clients/sms.js';\nexport { WhatsAppClient } from './clients/whatsapp.js';\nexport { VoiceClient } from './clients/voice.js';\nexport { FilesClient } from './clients/files.js';\nexport { AiClient } from './clients/ai.js';\nexport { HtmlToPdfClient } from './clients/html-to-pdf.js';\nexport { UtilitiesClient } from './clients/utilities.js';\n\n// Mail types\nexport type {\n Attachment,\n TransactionalMailSendRequest,\n TransactionalMailSendResponse,\n} from './clients/mail.js';\n\n// Mailbox types\nexport type {\n MailboxSendRequest,\n MailboxSendResponse,\n MailboxAttachment,\n MailboxMessageSummary,\n MailboxMessagesListResponse,\n MailboxMessageDetail,\n MailboxMarkProcessedResponse,\n MailboxConnectorStatus,\n} from './clients/mailbox.js';\n\n// SMS types\nexport type { SmsSendRequest, SmsSendResponse } from './clients/sms.js';\n\n// WhatsApp types\nexport type {\n WhatsAppParameter,\n WhatsAppComponent,\n WhatsAppSendRequest,\n WhatsAppSendResponse,\n} from './clients/whatsapp.js';\n\n// Voice types\nexport type { VoiceTranscribeRequest, VoiceTranscribeResponse } from './clients/voice.js';\n\n// Files types\nexport type {\n FileUploadResponse,\n FileListItem,\n FileListResponse,\n PresignedUrlResponse,\n FileUploadBody,\n} from './clients/files.js';\n\n// AI types\nexport type {\n Role,\n InputTextPart,\n InputImagePart,\n InputFilePart,\n ContentPart,\n InputMessage,\n Input,\n ParseRequest,\n ParseResponse,\n StreamEvent,\n} from './clients/ai.js';\n\n// HTML-to-PDF types\nexport type {\n PdfOptions,\n HtmlToPdfBase64Request,\n HtmlToPdfUploadRequest,\n HtmlToPdfRequest,\n HtmlToPdfBase64Response,\n HtmlToPdfUploadResponse,\n HtmlToPdfResponse,\n QueuedEvent,\n ProcessingEvent,\n HtmlToPdfCallbacks,\n} from './clients/html-to-pdf.js';\n\n// Utilities types\nexport type {\n MjmlValidationError,\n MjmlCompileRequest,\n MjmlCompileResponse,\n LiquidRenderRequest,\n LiquidRenderResponse,\n LiquidVariablesRequest,\n LiquidVariablesResponse,\n MarkdownRenderRequest,\n MarkdownRenderResponse,\n RenderEmailRequest,\n RenderEmailResponse,\n} from './clients/utilities.js';\n","export interface ErrorResponseBody {\n error: {\n code?: string;\n message: string;\n };\n}\n\nexport const CONNECTOR_UNHEALTHY_CODE = 'CONNECTOR_UNHEALTHY';\n\nexport const PLATFORM_NOT_CONFIGURED_CODE = 'platform_not_configured';\nexport const HTML_TO_PDF_NOT_CONFIGURED_CODE = 'html_to_pdf_not_configured';\nexport const UTILITIES_NOT_CONFIGURED_CODE = 'utilities_not_configured';\n\nexport class UlvioError extends Error {\n readonly code: string;\n readonly status?: number;\n readonly response?: unknown;\n\n constructor(\n code: string,\n message: string,\n options: { status?: number; response?: unknown; cause?: unknown } = {},\n ) {\n super(message, { cause: options.cause });\n this.name = 'UlvioError';\n this.code = code;\n this.status = options.status;\n this.response = options.response;\n }\n}\n\nexport function isConnectorUnhealthyError(err: unknown): boolean {\n if (err instanceof UlvioError) return err.code === CONNECTOR_UNHEALTHY_CODE;\n const response = (err as { response?: ErrorResponseBody })?.response;\n return response?.error?.code === CONNECTOR_UNHEALTHY_CODE;\n}\n","import {\n ErrorResponseBody,\n HTML_TO_PDF_NOT_CONFIGURED_CODE,\n PLATFORM_NOT_CONFIGURED_CODE,\n UTILITIES_NOT_CONFIGURED_CODE,\n UlvioError,\n} from './errors.js';\n\nexport interface UlvioConfig {\n platformApiUrl?: string;\n platformApiKey?: string;\n htmlToPdfApiUrl?: string;\n utilitiesApiUrl?: string;\n}\n\ninterface RequestOptions {\n body?: unknown;\n}\n\ninterface RequestRawOptions {\n body?: BodyInit;\n contentType?: string;\n headers?: Record<string, string>;\n}\n\nfunction trimSlash(url: string): string {\n return url.replace(/\\/$/, '');\n}\n\nasync function parseError(res: Response, fallbackCode = 'request_failed'): Promise<UlvioError> {\n let body: ErrorResponseBody | undefined;\n try {\n body = (await res.json()) as ErrorResponseBody;\n } catch {\n body = undefined;\n }\n const code = body?.error?.code ?? fallbackCode;\n const message = body?.error?.message ?? res.statusText;\n return new UlvioError(code, message, { status: res.status, response: body });\n}\n\nexport class HttpClient {\n constructor(private readonly config: UlvioConfig) {}\n\n private requirePlatform(method: string): { url: string; key: string } {\n const url = this.config.platformApiUrl;\n const key = this.config.platformApiKey;\n if (!url || !key) {\n throw new UlvioError(\n PLATFORM_NOT_CONFIGURED_CODE,\n `${method} requires platformApiUrl and platformApiKey to be set on the Ulvio client`,\n );\n }\n return { url: trimSlash(url), key };\n }\n\n private requireHtmlToPdf(method: string): string {\n const url = this.config.htmlToPdfApiUrl;\n if (!url) {\n throw new UlvioError(\n HTML_TO_PDF_NOT_CONFIGURED_CODE,\n `${method} requires htmlToPdfApiUrl to be set on the Ulvio client`,\n );\n }\n return trimSlash(url);\n }\n\n private requireUtilities(method: string): string {\n const url = this.config.utilitiesApiUrl;\n if (!url) {\n throw new UlvioError(\n UTILITIES_NOT_CONFIGURED_CODE,\n `${method} requires utilitiesApiUrl to be set on the Ulvio client`,\n );\n }\n return trimSlash(url);\n }\n\n // ── Platform (authenticated) ──────────────────────────────────────────\n\n async platformRequest<T>(\n callerName: string,\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<T> {\n const { url, key } = this.requirePlatform(callerName);\n const res = await fetch(`${url}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${key}`,\n },\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n });\n if (!res.ok) throw await parseError(res);\n return (await res.json()) as T;\n }\n\n async platformRequestRaw(\n callerName: string,\n method: string,\n path: string,\n options: RequestRawOptions = {},\n ): Promise<Response> {\n const { url, key } = this.requirePlatform(callerName);\n const headers: Record<string, string> = { ...options.headers };\n if (options.contentType) headers['Content-Type'] = options.contentType;\n headers['Authorization'] = `Bearer ${key}`;\n const res = await fetch(`${url}${path}`, {\n method,\n headers,\n body: options.body,\n });\n if (!res.ok) throw await parseError(res);\n return res;\n }\n\n // ── HTML-to-PDF (unauthenticated) ─────────────────────────────────────\n\n async htmlToPdfFetch(\n callerName: string,\n path: string,\n init: RequestInit,\n ): Promise<Response> {\n const url = this.requireHtmlToPdf(callerName);\n return fetch(`${url}${path}`, init);\n }\n\n // ── Utilities (unauthenticated) ───────────────────────────────────────\n\n async utilitiesRequest<T>(\n callerName: string,\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<T> {\n const url = this.requireUtilities(callerName);\n const res = await fetch(`${url}${path}`, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n });\n const data = (await res.json().catch(() => undefined)) as T | undefined;\n if (!res.ok) {\n const errBody = data as ErrorResponseBody | undefined;\n throw new UlvioError(\n errBody?.error?.code ?? 'request_failed',\n errBody?.error?.message ?? res.statusText,\n { status: res.status, response: data },\n );\n }\n return data as T;\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface Attachment {\n filename: string;\n /** Base64-encoded file content. */\n content: string;\n content_type: string;\n}\n\nexport interface TransactionalMailSendRequest {\n from: string;\n to: string[];\n subject: string;\n body_html?: string;\n body_text?: string;\n reply_to?: string;\n attachments?: Attachment[];\n}\n\nexport interface TransactionalMailSendResponse {\n message_id: string;\n}\n\nexport class MailClient {\n constructor(private readonly http: HttpClient) {}\n\n sendTransactional(\n params: TransactionalMailSendRequest,\n ): Promise<TransactionalMailSendResponse> {\n return this.http.platformRequest<TransactionalMailSendResponse>(\n 'client.mail.sendTransactional()',\n 'POST',\n '/v1/transactional-mail/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { Attachment } from './mail.js';\n\nexport interface MailboxSendRequest {\n to: string[];\n cc?: string[];\n bcc?: string[];\n subject: string;\n body_html?: string;\n body_text?: string;\n /** Message ID to reply to. Threads the message correctly. */\n reply_to_id?: string;\n attachments?: Attachment[];\n}\n\nexport interface MailboxSendResponse {\n message_id: string;\n}\n\nexport interface MailboxAttachment {\n id: string;\n filename: string;\n content_type: string;\n size_bytes: number;\n}\n\nexport interface MailboxMessageSummary {\n id: string;\n subject: string;\n from: string;\n to: string[];\n /** First 150 characters of the body, HTML stripped. */\n preview: string;\n received_at: string;\n has_attachments: boolean;\n is_read: boolean;\n is_processed: boolean;\n processed_at: string | null;\n}\n\nexport interface MailboxMessagesListResponse {\n messages: MailboxMessageSummary[];\n total: number;\n}\n\nexport interface MailboxMessageDetail {\n id: string;\n subject: string;\n from: string;\n to: string[];\n cc: string[];\n bcc: string[];\n body_html?: string;\n body_text?: string;\n received_at: string;\n is_read: boolean;\n is_processed: boolean;\n processed_at: string | null;\n attachments: MailboxAttachment[];\n}\n\nexport interface MailboxMarkProcessedResponse {\n ok: true;\n id: string;\n already_processed: boolean;\n processed_at: string;\n}\n\nexport interface MailboxConnectorStatus {\n healthy: boolean;\n state: 'healthy' | 'unhealthy';\n /** ISO timestamp of the last state change, or null if never changed. */\n changed_at: string | null;\n}\n\nexport class MailboxClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: MailboxSendRequest): Promise<MailboxSendResponse> {\n return this.http.platformRequest<MailboxSendResponse>(\n 'client.mailbox.send()',\n 'POST',\n '/v1/mailbox/send',\n { body: params },\n );\n }\n\n list(limit?: number): Promise<MailboxMessagesListResponse> {\n const qs = limit !== undefined ? `?limit=${limit}` : '';\n return this.http.platformRequest<MailboxMessagesListResponse>(\n 'client.mailbox.list()',\n 'GET',\n `/v1/mailbox/messages${qs}`,\n );\n }\n\n get(id: string): Promise<MailboxMessageDetail> {\n return this.http.platformRequest<MailboxMessageDetail>(\n 'client.mailbox.get()',\n 'GET',\n `/v1/mailbox/messages/${encodeURIComponent(id)}`,\n );\n }\n\n markProcessed(id: string): Promise<MailboxMarkProcessedResponse> {\n return this.http.platformRequest<MailboxMarkProcessedResponse>(\n 'client.mailbox.markProcessed()',\n 'POST',\n `/v1/mailbox/messages/${encodeURIComponent(id)}/mark-processed`,\n );\n }\n\n /**\n * Download a mailbox message attachment as a Buffer.\n */\n async getAttachment(messageId: string, attachmentId: string): Promise<Buffer> {\n const res = await this.http.platformRequestRaw(\n 'client.mailbox.getAttachment()',\n 'GET',\n `/v1/mailbox/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`,\n );\n const arrayBuffer = await res.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n\n getConnectorStatus(): Promise<MailboxConnectorStatus> {\n return this.http.platformRequest<MailboxConnectorStatus>(\n 'client.mailbox.getConnectorStatus()',\n 'GET',\n '/v1/mailbox/connector-status',\n );\n }\n\n /**\n * Dev-only: toggle the mock connector's health state.\n */\n setConnectorStatus(healthy: boolean): Promise<MailboxConnectorStatus> {\n return this.http.platformRequest<MailboxConnectorStatus>(\n 'client.mailbox.setConnectorStatus()',\n 'PATCH',\n '/v1/mailbox/connector-status',\n { body: { healthy } },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface SmsSendRequest {\n /** Sender phone number in E.164 format. */\n from: string;\n /** Recipient phone number in E.164 format. */\n to: string;\n /** SMS text content. Max 1600 characters. */\n body: string;\n}\n\nexport interface SmsSendResponse {\n message_id: string;\n status: 'queued';\n}\n\nexport class SmsClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: SmsSendRequest): Promise<SmsSendResponse> {\n return this.http.platformRequest<SmsSendResponse>(\n 'client.sms.send()',\n 'POST',\n '/v1/sms/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface WhatsAppParameter {\n type: 'text' | 'image' | 'document' | 'video';\n parameter_name?: string;\n text?: string;\n image?: { link: string };\n document?: { link: string; filename: string };\n video?: { link: string };\n}\n\nexport interface WhatsAppComponent {\n type: 'header' | 'body' | 'button';\n sub_type?: 'url' | 'quick_reply';\n index?: number;\n parameters: WhatsAppParameter[];\n}\n\nexport interface WhatsAppSendRequest {\n /** Recipient phone number in E.164 format. */\n to: string;\n /** Pre-approved WhatsApp template name. */\n template_name: string;\n /** BCP 47 language code (e.g. \"en\", \"nl\", \"fr\"). */\n language_code: string;\n components?: WhatsAppComponent[];\n}\n\nexport interface WhatsAppSendResponse {\n message_id: string;\n status: 'queued';\n}\n\nexport class WhatsAppClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: WhatsAppSendRequest): Promise<WhatsAppSendResponse> {\n return this.http.platformRequest<WhatsAppSendResponse>(\n 'client.whatsapp.send()',\n 'POST',\n '/v1/whatsapp/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface VoiceTranscribeRequest {\n /** Base64-encoded audio buffer. */\n file: string;\n file_name: string;\n /** Optional BCP-47 language code (e.g. \"en\", \"nl\"). */\n language_code?: string;\n}\n\nexport interface VoiceTranscribeResponse {\n job_id: string;\n status: string;\n text: string;\n}\n\nexport class VoiceClient {\n constructor(private readonly http: HttpClient) {}\n\n transcribe(params: VoiceTranscribeRequest): Promise<VoiceTranscribeResponse> {\n return this.http.platformRequest<VoiceTranscribeResponse>(\n 'client.voice.transcribe()',\n 'POST',\n '/v1/voice/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface FileUploadResponse {\n key: string;\n content_type: string;\n size_bytes: number;\n}\n\nexport interface FileListItem {\n key: string;\n is_folder: boolean;\n content_type: string | null;\n size_bytes: number;\n created_at: string | null;\n}\n\nexport interface FileListResponse {\n files: FileListItem[];\n next_cursor: string | null;\n}\n\nexport interface PresignedUrlResponse {\n url: string;\n expires_in: number;\n}\n\nexport type FileUploadBody = Buffer | Uint8Array | ReadableStream | string;\n\nexport class FilesClient {\n constructor(private readonly http: HttpClient) {}\n\n async upload(\n key: string,\n file: FileUploadBody,\n contentType: string = 'application/octet-stream',\n ): Promise<FileUploadResponse> {\n const res = await this.http.platformRequestRaw(\n 'client.files.upload()',\n 'PUT',\n `/v1/files/${encodeURI(key)}`,\n { body: file as BodyInit, contentType },\n );\n return (await res.json()) as FileUploadResponse;\n }\n\n /**\n * Download a file. Returns the raw Response for streaming.\n */\n get(key: string): Promise<Response> {\n return this.http.platformRequestRaw(\n 'client.files.get()',\n 'GET',\n `/v1/files/${encodeURI(key)}`,\n );\n }\n\n list(prefix?: string, limit?: number, cursor?: string): Promise<FileListResponse> {\n const params = new URLSearchParams();\n if (prefix) params.set('prefix', prefix);\n if (limit !== undefined) params.set('limit', String(limit));\n if (cursor) params.set('cursor', cursor);\n const qs = params.toString();\n return this.http.platformRequest<FileListResponse>(\n 'client.files.list()',\n 'GET',\n `/v1/files${qs ? `?${qs}` : ''}`,\n );\n }\n\n delete(key: string): Promise<{ ok: true }> {\n return this.http.platformRequest<{ ok: true }>(\n 'client.files.delete()',\n 'DELETE',\n `/v1/files/${encodeURI(key)}`,\n );\n }\n\n deleteMany(prefix: string): Promise<{ ok: true; deleted: number }> {\n return this.http.platformRequest<{ ok: true; deleted: number }>(\n 'client.files.deleteMany()',\n 'DELETE',\n `/v1/files?prefix=${encodeURIComponent(prefix)}`,\n );\n }\n\n /**\n * Generate a time-limited download URL for a file.\n * @param expiresIn TTL in seconds (default 3600, min 60, max 86400)\n */\n presignedDownloadUrl(key: string, expiresIn?: number): Promise<PresignedUrlResponse> {\n return this.http.platformRequest<PresignedUrlResponse>(\n 'client.files.presignedDownloadUrl()',\n 'POST',\n '/v1/files/presigned-download',\n { body: { key, expires_in: expiresIn } },\n );\n }\n\n /**\n * Generate a time-limited upload URL for a file.\n * @param expiresIn TTL in seconds (default 3600, min 60, max 86400)\n * @param maxSize Max file size in bytes (default 50MB)\n */\n presignedUploadUrl(\n key: string,\n contentType: string,\n expiresIn?: number,\n maxSize?: number,\n ): Promise<PresignedUrlResponse> {\n return this.http.platformRequest<PresignedUrlResponse>(\n 'client.files.presignedUploadUrl()',\n 'POST',\n '/v1/files/presigned-upload',\n {\n body: { key, content_type: contentType, expires_in: expiresIn, max_size: maxSize },\n },\n );\n }\n}\n","import { z } from 'zod';\nimport type { HttpClient } from '../http.js';\nimport { UlvioError, type ErrorResponseBody } from '../errors.js';\n\nexport type Role = 'user' | 'assistant' | 'system';\n\nexport interface InputTextPart { type: 'input_text'; text: string }\nexport interface InputImagePart { type: 'input_image'; image_url: string }\nexport interface InputFilePart { type: 'input_file'; filename: string; file_data: string }\nexport type ContentPart = InputTextPart | InputImagePart | InputFilePart;\n\nexport interface InputMessage {\n role: Role;\n content: string | ContentPart[];\n}\n\nexport type Input = string | InputMessage[];\n\nexport interface ParseRequest<TSchema extends z.ZodType> {\n /** Model identifier, e.g. \"claude-opus-4-7\", \"claude-sonnet-4-6\". */\n model: string;\n input: Input;\n /** Zod schema describing the structured output shape. */\n schema: TSchema;\n}\n\nexport interface ParseResponse<T> {\n data: T;\n}\n\nexport type StreamEvent<T> =\n | { type: 'partial'; data: Partial<T> }\n | { type: 'complete'; data: T }\n | { type: 'error'; message: string };\n\ninterface WirePayload {\n model: string;\n input: Input;\n /** JSON Schema serialized from the supplied Zod schema. */\n schema: unknown;\n}\n\nfunction buildPayload<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n): WirePayload {\n return {\n model: params.model,\n input: params.input,\n schema: z.toJSONSchema(params.schema),\n };\n}\n\nfunction parseSseEvents(chunk: string): Array<{ event: string; data: string }> {\n const events: Array<{ event: string; data: string }> = [];\n let currentEvent = '';\n let currentData = '';\n\n for (const line of chunk.split('\\n')) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7);\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6);\n } else if (line === '' && currentEvent) {\n events.push({ event: currentEvent, data: currentData });\n currentEvent = '';\n currentData = '';\n }\n }\n\n return events;\n}\n\nexport class AiClient {\n constructor(private readonly http: HttpClient) {}\n\n async parse<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n ): Promise<z.infer<TSchema>> {\n const wire = buildPayload(params);\n const response = await this.http.platformRequest<ParseResponse<unknown>>(\n 'client.ai.parse()',\n 'POST',\n '/v1/ai/parse',\n { body: wire },\n );\n return params.schema.parse(response.data) as z.infer<TSchema>;\n }\n\n async *stream<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n ): AsyncGenerator<StreamEvent<z.infer<TSchema>>, void, void> {\n const wire = buildPayload(params);\n const res = await this.http.platformRequestRaw(\n 'client.ai.stream()',\n 'POST',\n '/v1/ai/stream',\n {\n body: JSON.stringify(wire),\n contentType: 'application/json',\n headers: { Accept: 'text/event-stream' },\n },\n );\n\n if (!res.body) {\n throw new UlvioError('stream_no_body', 'AI stream returned no response body', {\n status: res.status,\n });\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n const events = parseSseEvents(buffer);\n const lastBoundary = buffer.lastIndexOf('\\n\\n');\n buffer = lastBoundary >= 0 ? buffer.slice(lastBoundary + 2) : buffer;\n\n for (const { event, data } of events) {\n switch (event) {\n case 'partial':\n yield { type: 'partial', data: JSON.parse(data) as Partial<z.infer<TSchema>> };\n break;\n case 'complete': {\n const parsed = params.schema.parse(JSON.parse(data));\n yield { type: 'complete', data: parsed as z.infer<TSchema> };\n return;\n }\n case 'error': {\n const errBody = JSON.parse(data) as ErrorResponseBody['error'] | { message: string };\n throw new UlvioError(\n ('code' in errBody && errBody.code) || 'ai_stream_error',\n errBody.message,\n );\n }\n }\n }\n }\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { UlvioError, type ErrorResponseBody } from '../errors.js';\n\nexport interface PdfOptions {\n format?: string;\n printBackground?: boolean;\n margin?: {\n top?: string;\n right?: string;\n bottom?: string;\n left?: string;\n };\n}\n\nexport interface HtmlToPdfBase64Request {\n /** Base64-encoded HTML content. Provide either `html` or `sourceUrl`. */\n html?: string;\n sourceUrl?: string;\n outputMode: 'base64';\n options?: PdfOptions;\n}\n\nexport interface HtmlToPdfUploadRequest {\n html?: string;\n sourceUrl?: string;\n /** Pre-signed URL the service will PUT the rendered PDF to. */\n uploadUrl: string;\n options?: PdfOptions;\n}\n\nexport type HtmlToPdfRequest = HtmlToPdfBase64Request | HtmlToPdfUploadRequest;\n\nexport interface HtmlToPdfBase64Response {\n pdf: string;\n}\n\nexport interface HtmlToPdfUploadResponse {\n uploaded: true;\n bytes: number;\n}\n\nexport type HtmlToPdfResponse = HtmlToPdfBase64Response | HtmlToPdfUploadResponse;\n\nexport interface QueuedEvent {\n position: number;\n}\n\nexport interface ProcessingEvent {\n step: string;\n progress: number;\n}\n\nexport interface HtmlToPdfCallbacks {\n onQueued?: (data: QueuedEvent) => void;\n onProcessing?: (data: ProcessingEvent) => void;\n}\n\nfunction parseSseEvents(chunk: string): Array<{ event: string; data: string }> {\n const events: Array<{ event: string; data: string }> = [];\n let currentEvent = '';\n let currentData = '';\n\n for (const line of chunk.split('\\n')) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7);\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6);\n } else if (line === '' && currentEvent) {\n events.push({ event: currentEvent, data: currentData });\n currentEvent = '';\n currentData = '';\n }\n }\n\n return events;\n}\n\nexport class HtmlToPdfClient {\n constructor(private readonly http: HttpClient) {}\n\n async convert(\n params: HtmlToPdfBase64Request,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfBase64Response>;\n async convert(\n params: HtmlToPdfUploadRequest,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfUploadResponse>;\n async convert(\n params: HtmlToPdfRequest,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfResponse> {\n const res = await this.http.htmlToPdfFetch('client.htmlToPdf.convert()', '/api/html-to-pdf', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n });\n\n if (!res.ok) {\n const data = (await res.json().catch(() => undefined)) as\n | ErrorResponseBody\n | undefined;\n throw new UlvioError(\n data?.error?.code ?? 'html_to_pdf_failed',\n data?.error?.message ?? res.statusText,\n { status: res.status, response: data },\n );\n }\n\n if (!res.body) {\n throw new UlvioError('html_to_pdf_no_body', 'html-to-pdf service returned no body', {\n status: res.status,\n });\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const events = parseSseEvents(buffer);\n const lastBoundary = buffer.lastIndexOf('\\n\\n');\n buffer = lastBoundary >= 0 ? buffer.slice(lastBoundary + 2) : buffer;\n\n for (const { event, data } of events) {\n switch (event) {\n case 'queued':\n callbacks?.onQueued?.(JSON.parse(data) as QueuedEvent);\n break;\n case 'processing':\n callbacks?.onProcessing?.(JSON.parse(data) as ProcessingEvent);\n break;\n case 'complete':\n return JSON.parse(data) as HtmlToPdfResponse;\n case 'error': {\n const errBody = JSON.parse(data) as { code?: string; message: string };\n throw new UlvioError(\n errBody.code ?? 'html_to_pdf_error',\n errBody.message,\n );\n }\n }\n }\n }\n\n throw new UlvioError(\n 'html_to_pdf_truncated',\n 'SSE stream ended without a complete event',\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\n// MJML\n\nexport interface MjmlValidationError {\n line: number;\n message: string;\n tagName: string;\n formattedMessage: string;\n}\n\nexport interface MjmlCompileRequest {\n mjml: string;\n options?: {\n minify?: boolean;\n beautify?: boolean;\n validationLevel?: 'strict' | 'soft' | 'skip';\n };\n}\n\nexport interface MjmlCompileResponse {\n html: string;\n errors: MjmlValidationError[];\n}\n\n// LiquidJS\n\nexport interface LiquidRenderRequest {\n template: string;\n data: Record<string, unknown>;\n}\n\nexport interface LiquidRenderResponse {\n result: string;\n}\n\nexport interface LiquidVariablesRequest {\n template: string;\n}\n\nexport interface LiquidVariablesResponse {\n variables: string[];\n}\n\n// Markdown\n\nexport interface MarkdownRenderRequest {\n markdown: string;\n}\n\nexport interface MarkdownRenderResponse {\n html: string;\n}\n\n// Combined Liquid → MJML pipeline\n\nexport interface RenderEmailRequest {\n mjml: string;\n data: Record<string, unknown>;\n options?: {\n minify?: boolean;\n beautify?: boolean;\n validationLevel?: 'strict' | 'soft' | 'skip';\n };\n}\n\nexport interface RenderEmailResponse {\n html: string;\n errors: MjmlValidationError[];\n}\n\nexport class UtilitiesClient {\n constructor(private readonly http: HttpClient) {}\n\n compileMjml(params: MjmlCompileRequest): Promise<MjmlCompileResponse> {\n return this.http.utilitiesRequest<MjmlCompileResponse>(\n 'client.utilities.compileMjml()',\n 'POST',\n '/api/mjml/compile',\n { body: params },\n );\n }\n\n renderLiquid(params: LiquidRenderRequest): Promise<LiquidRenderResponse> {\n return this.http.utilitiesRequest<LiquidRenderResponse>(\n 'client.utilities.renderLiquid()',\n 'POST',\n '/api/liquidjs/render',\n { body: params },\n );\n }\n\n extractLiquidVariables(\n params: LiquidVariablesRequest,\n ): Promise<LiquidVariablesResponse> {\n return this.http.utilitiesRequest<LiquidVariablesResponse>(\n 'client.utilities.extractLiquidVariables()',\n 'POST',\n '/api/liquidjs/variables',\n { body: params },\n );\n }\n\n renderMarkdown(params: MarkdownRenderRequest): Promise<MarkdownRenderResponse> {\n return this.http.utilitiesRequest<MarkdownRenderResponse>(\n 'client.utilities.renderMarkdown()',\n 'POST',\n '/api/markdown/render',\n { body: params },\n );\n }\n\n renderEmail(params: RenderEmailRequest): Promise<RenderEmailResponse> {\n return this.http.utilitiesRequest<RenderEmailResponse>(\n 'client.utilities.renderEmail()',\n 'POST',\n '/api/render-email',\n { body: params },\n );\n }\n}\n"],"mappings":"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","names":["parseSseEvents"]}
package/dist/index.d.cts CHANGED
@@ -259,9 +259,23 @@ declare class FilesClient {
259
259
  }
260
260
 
261
261
  type Role = 'user' | 'assistant' | 'system';
262
+ interface InputTextPart {
263
+ type: 'input_text';
264
+ text: string;
265
+ }
266
+ interface InputImagePart {
267
+ type: 'input_image';
268
+ image_url: string;
269
+ }
270
+ interface InputFilePart {
271
+ type: 'input_file';
272
+ filename: string;
273
+ file_data: string;
274
+ }
275
+ type ContentPart = InputTextPart | InputImagePart | InputFilePart;
262
276
  interface InputMessage {
263
277
  role: Role;
264
- content: string;
278
+ content: string | ContentPart[];
265
279
  }
266
280
  type Input = string | InputMessage[];
267
281
  interface ParseRequest<TSchema extends z.ZodType> {
@@ -437,4 +451,4 @@ declare class Ulvio {
437
451
  constructor(config?: UlvioConfig);
438
452
  }
439
453
 
440
- export { AiClient, type Attachment, CONNECTOR_UNHEALTHY_CODE, type ErrorResponseBody, type FileListItem, type FileListResponse, type FileUploadBody, type FileUploadResponse, FilesClient, HTML_TO_PDF_NOT_CONFIGURED_CODE, type HtmlToPdfBase64Request, type HtmlToPdfBase64Response, type HtmlToPdfCallbacks, HtmlToPdfClient, type HtmlToPdfRequest, type HtmlToPdfResponse, type HtmlToPdfUploadRequest, type HtmlToPdfUploadResponse, type Input, type InputMessage, type LiquidRenderRequest, type LiquidRenderResponse, type LiquidVariablesRequest, type LiquidVariablesResponse, MailClient, type MailboxAttachment, MailboxClient, type MailboxConnectorStatus, type MailboxMarkProcessedResponse, type MailboxMessageDetail, type MailboxMessageSummary, type MailboxMessagesListResponse, type MailboxSendRequest, type MailboxSendResponse, type MarkdownRenderRequest, type MarkdownRenderResponse, type MjmlCompileRequest, type MjmlCompileResponse, type MjmlValidationError, PLATFORM_NOT_CONFIGURED_CODE, type ParseRequest, type ParseResponse, type PdfOptions, type PresignedUrlResponse, type ProcessingEvent, type QueuedEvent, type RenderEmailRequest, type RenderEmailResponse, type Role, SmsClient, type SmsSendRequest, type SmsSendResponse, type StreamEvent, type TransactionalMailSendRequest, type TransactionalMailSendResponse, UTILITIES_NOT_CONFIGURED_CODE, Ulvio, type UlvioConfig, UlvioError, UtilitiesClient, VoiceClient, type VoiceTranscribeRequest, type VoiceTranscribeResponse, WhatsAppClient, type WhatsAppComponent, type WhatsAppParameter, type WhatsAppSendRequest, type WhatsAppSendResponse, isConnectorUnhealthyError };
454
+ export { AiClient, type Attachment, CONNECTOR_UNHEALTHY_CODE, type ContentPart, type ErrorResponseBody, type FileListItem, type FileListResponse, type FileUploadBody, type FileUploadResponse, FilesClient, HTML_TO_PDF_NOT_CONFIGURED_CODE, type HtmlToPdfBase64Request, type HtmlToPdfBase64Response, type HtmlToPdfCallbacks, HtmlToPdfClient, type HtmlToPdfRequest, type HtmlToPdfResponse, type HtmlToPdfUploadRequest, type HtmlToPdfUploadResponse, type Input, type InputFilePart, type InputImagePart, type InputMessage, type InputTextPart, type LiquidRenderRequest, type LiquidRenderResponse, type LiquidVariablesRequest, type LiquidVariablesResponse, MailClient, type MailboxAttachment, MailboxClient, type MailboxConnectorStatus, type MailboxMarkProcessedResponse, type MailboxMessageDetail, type MailboxMessageSummary, type MailboxMessagesListResponse, type MailboxSendRequest, type MailboxSendResponse, type MarkdownRenderRequest, type MarkdownRenderResponse, type MjmlCompileRequest, type MjmlCompileResponse, type MjmlValidationError, PLATFORM_NOT_CONFIGURED_CODE, type ParseRequest, type ParseResponse, type PdfOptions, type PresignedUrlResponse, type ProcessingEvent, type QueuedEvent, type RenderEmailRequest, type RenderEmailResponse, type Role, SmsClient, type SmsSendRequest, type SmsSendResponse, type StreamEvent, type TransactionalMailSendRequest, type TransactionalMailSendResponse, UTILITIES_NOT_CONFIGURED_CODE, Ulvio, type UlvioConfig, UlvioError, UtilitiesClient, VoiceClient, type VoiceTranscribeRequest, type VoiceTranscribeResponse, WhatsAppClient, type WhatsAppComponent, type WhatsAppParameter, type WhatsAppSendRequest, type WhatsAppSendResponse, isConnectorUnhealthyError };
package/dist/index.d.ts CHANGED
@@ -259,9 +259,23 @@ declare class FilesClient {
259
259
  }
260
260
 
261
261
  type Role = 'user' | 'assistant' | 'system';
262
+ interface InputTextPart {
263
+ type: 'input_text';
264
+ text: string;
265
+ }
266
+ interface InputImagePart {
267
+ type: 'input_image';
268
+ image_url: string;
269
+ }
270
+ interface InputFilePart {
271
+ type: 'input_file';
272
+ filename: string;
273
+ file_data: string;
274
+ }
275
+ type ContentPart = InputTextPart | InputImagePart | InputFilePart;
262
276
  interface InputMessage {
263
277
  role: Role;
264
- content: string;
278
+ content: string | ContentPart[];
265
279
  }
266
280
  type Input = string | InputMessage[];
267
281
  interface ParseRequest<TSchema extends z.ZodType> {
@@ -437,4 +451,4 @@ declare class Ulvio {
437
451
  constructor(config?: UlvioConfig);
438
452
  }
439
453
 
440
- export { AiClient, type Attachment, CONNECTOR_UNHEALTHY_CODE, type ErrorResponseBody, type FileListItem, type FileListResponse, type FileUploadBody, type FileUploadResponse, FilesClient, HTML_TO_PDF_NOT_CONFIGURED_CODE, type HtmlToPdfBase64Request, type HtmlToPdfBase64Response, type HtmlToPdfCallbacks, HtmlToPdfClient, type HtmlToPdfRequest, type HtmlToPdfResponse, type HtmlToPdfUploadRequest, type HtmlToPdfUploadResponse, type Input, type InputMessage, type LiquidRenderRequest, type LiquidRenderResponse, type LiquidVariablesRequest, type LiquidVariablesResponse, MailClient, type MailboxAttachment, MailboxClient, type MailboxConnectorStatus, type MailboxMarkProcessedResponse, type MailboxMessageDetail, type MailboxMessageSummary, type MailboxMessagesListResponse, type MailboxSendRequest, type MailboxSendResponse, type MarkdownRenderRequest, type MarkdownRenderResponse, type MjmlCompileRequest, type MjmlCompileResponse, type MjmlValidationError, PLATFORM_NOT_CONFIGURED_CODE, type ParseRequest, type ParseResponse, type PdfOptions, type PresignedUrlResponse, type ProcessingEvent, type QueuedEvent, type RenderEmailRequest, type RenderEmailResponse, type Role, SmsClient, type SmsSendRequest, type SmsSendResponse, type StreamEvent, type TransactionalMailSendRequest, type TransactionalMailSendResponse, UTILITIES_NOT_CONFIGURED_CODE, Ulvio, type UlvioConfig, UlvioError, UtilitiesClient, VoiceClient, type VoiceTranscribeRequest, type VoiceTranscribeResponse, WhatsAppClient, type WhatsAppComponent, type WhatsAppParameter, type WhatsAppSendRequest, type WhatsAppSendResponse, isConnectorUnhealthyError };
454
+ export { AiClient, type Attachment, CONNECTOR_UNHEALTHY_CODE, type ContentPart, type ErrorResponseBody, type FileListItem, type FileListResponse, type FileUploadBody, type FileUploadResponse, FilesClient, HTML_TO_PDF_NOT_CONFIGURED_CODE, type HtmlToPdfBase64Request, type HtmlToPdfBase64Response, type HtmlToPdfCallbacks, HtmlToPdfClient, type HtmlToPdfRequest, type HtmlToPdfResponse, type HtmlToPdfUploadRequest, type HtmlToPdfUploadResponse, type Input, type InputFilePart, type InputImagePart, type InputMessage, type InputTextPart, type LiquidRenderRequest, type LiquidRenderResponse, type LiquidVariablesRequest, type LiquidVariablesResponse, MailClient, type MailboxAttachment, MailboxClient, type MailboxConnectorStatus, type MailboxMarkProcessedResponse, type MailboxMessageDetail, type MailboxMessageSummary, type MailboxMessagesListResponse, type MailboxSendRequest, type MailboxSendResponse, type MarkdownRenderRequest, type MarkdownRenderResponse, type MjmlCompileRequest, type MjmlCompileResponse, type MjmlValidationError, PLATFORM_NOT_CONFIGURED_CODE, type ParseRequest, type ParseResponse, type PdfOptions, type PresignedUrlResponse, type ProcessingEvent, type QueuedEvent, type RenderEmailRequest, type RenderEmailResponse, type Role, SmsClient, type SmsSendRequest, type SmsSendResponse, type StreamEvent, type TransactionalMailSendRequest, type TransactionalMailSendResponse, UTILITIES_NOT_CONFIGURED_CODE, Ulvio, type UlvioConfig, UlvioError, UtilitiesClient, VoiceClient, type VoiceTranscribeRequest, type VoiceTranscribeResponse, WhatsAppClient, type WhatsAppComponent, type WhatsAppParameter, type WhatsAppSendRequest, type WhatsAppSendResponse, isConnectorUnhealthyError };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/clients/mail.ts","../src/clients/mailbox.ts","../src/clients/sms.ts","../src/clients/whatsapp.ts","../src/clients/voice.ts","../src/clients/files.ts","../src/clients/ai.ts","../src/clients/html-to-pdf.ts","../src/clients/utilities.ts","../src/index.ts"],"sourcesContent":["export interface ErrorResponseBody {\n error: {\n code?: string;\n message: string;\n };\n}\n\nexport const CONNECTOR_UNHEALTHY_CODE = 'CONNECTOR_UNHEALTHY';\n\nexport const PLATFORM_NOT_CONFIGURED_CODE = 'platform_not_configured';\nexport const HTML_TO_PDF_NOT_CONFIGURED_CODE = 'html_to_pdf_not_configured';\nexport const UTILITIES_NOT_CONFIGURED_CODE = 'utilities_not_configured';\n\nexport class UlvioError extends Error {\n readonly code: string;\n readonly status?: number;\n readonly response?: unknown;\n\n constructor(\n code: string,\n message: string,\n options: { status?: number; response?: unknown; cause?: unknown } = {},\n ) {\n super(message, { cause: options.cause });\n this.name = 'UlvioError';\n this.code = code;\n this.status = options.status;\n this.response = options.response;\n }\n}\n\nexport function isConnectorUnhealthyError(err: unknown): boolean {\n if (err instanceof UlvioError) return err.code === CONNECTOR_UNHEALTHY_CODE;\n const response = (err as { response?: ErrorResponseBody })?.response;\n return response?.error?.code === CONNECTOR_UNHEALTHY_CODE;\n}\n","import {\n ErrorResponseBody,\n HTML_TO_PDF_NOT_CONFIGURED_CODE,\n PLATFORM_NOT_CONFIGURED_CODE,\n UTILITIES_NOT_CONFIGURED_CODE,\n UlvioError,\n} from './errors.js';\n\nexport interface UlvioConfig {\n platformApiUrl?: string;\n platformApiKey?: string;\n htmlToPdfApiUrl?: string;\n utilitiesApiUrl?: string;\n}\n\ninterface RequestOptions {\n body?: unknown;\n}\n\ninterface RequestRawOptions {\n body?: BodyInit;\n contentType?: string;\n headers?: Record<string, string>;\n}\n\nfunction trimSlash(url: string): string {\n return url.replace(/\\/$/, '');\n}\n\nasync function parseError(res: Response, fallbackCode = 'request_failed'): Promise<UlvioError> {\n let body: ErrorResponseBody | undefined;\n try {\n body = (await res.json()) as ErrorResponseBody;\n } catch {\n body = undefined;\n }\n const code = body?.error?.code ?? fallbackCode;\n const message = body?.error?.message ?? res.statusText;\n return new UlvioError(code, message, { status: res.status, response: body });\n}\n\nexport class HttpClient {\n constructor(private readonly config: UlvioConfig) {}\n\n private requirePlatform(method: string): { url: string; key: string } {\n const url = this.config.platformApiUrl;\n const key = this.config.platformApiKey;\n if (!url || !key) {\n throw new UlvioError(\n PLATFORM_NOT_CONFIGURED_CODE,\n `${method} requires platformApiUrl and platformApiKey to be set on the Ulvio client`,\n );\n }\n return { url: trimSlash(url), key };\n }\n\n private requireHtmlToPdf(method: string): string {\n const url = this.config.htmlToPdfApiUrl;\n if (!url) {\n throw new UlvioError(\n HTML_TO_PDF_NOT_CONFIGURED_CODE,\n `${method} requires htmlToPdfApiUrl to be set on the Ulvio client`,\n );\n }\n return trimSlash(url);\n }\n\n private requireUtilities(method: string): string {\n const url = this.config.utilitiesApiUrl;\n if (!url) {\n throw new UlvioError(\n UTILITIES_NOT_CONFIGURED_CODE,\n `${method} requires utilitiesApiUrl to be set on the Ulvio client`,\n );\n }\n return trimSlash(url);\n }\n\n // ── Platform (authenticated) ──────────────────────────────────────────\n\n async platformRequest<T>(\n callerName: string,\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<T> {\n const { url, key } = this.requirePlatform(callerName);\n const res = await fetch(`${url}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${key}`,\n },\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n });\n if (!res.ok) throw await parseError(res);\n return (await res.json()) as T;\n }\n\n async platformRequestRaw(\n callerName: string,\n method: string,\n path: string,\n options: RequestRawOptions = {},\n ): Promise<Response> {\n const { url, key } = this.requirePlatform(callerName);\n const headers: Record<string, string> = { ...options.headers };\n if (options.contentType) headers['Content-Type'] = options.contentType;\n headers['Authorization'] = `Bearer ${key}`;\n const res = await fetch(`${url}${path}`, {\n method,\n headers,\n body: options.body,\n });\n if (!res.ok) throw await parseError(res);\n return res;\n }\n\n // ── HTML-to-PDF (unauthenticated) ─────────────────────────────────────\n\n async htmlToPdfFetch(\n callerName: string,\n path: string,\n init: RequestInit,\n ): Promise<Response> {\n const url = this.requireHtmlToPdf(callerName);\n return fetch(`${url}${path}`, init);\n }\n\n // ── Utilities (unauthenticated) ───────────────────────────────────────\n\n async utilitiesRequest<T>(\n callerName: string,\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<T> {\n const url = this.requireUtilities(callerName);\n const res = await fetch(`${url}${path}`, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n });\n const data = (await res.json().catch(() => undefined)) as T | undefined;\n if (!res.ok) {\n const errBody = data as ErrorResponseBody | undefined;\n throw new UlvioError(\n errBody?.error?.code ?? 'request_failed',\n errBody?.error?.message ?? res.statusText,\n { status: res.status, response: data },\n );\n }\n return data as T;\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface Attachment {\n filename: string;\n /** Base64-encoded file content. */\n content: string;\n content_type: string;\n}\n\nexport interface TransactionalMailSendRequest {\n from: string;\n to: string[];\n subject: string;\n body_html?: string;\n body_text?: string;\n reply_to?: string;\n attachments?: Attachment[];\n}\n\nexport interface TransactionalMailSendResponse {\n message_id: string;\n}\n\nexport class MailClient {\n constructor(private readonly http: HttpClient) {}\n\n sendTransactional(\n params: TransactionalMailSendRequest,\n ): Promise<TransactionalMailSendResponse> {\n return this.http.platformRequest<TransactionalMailSendResponse>(\n 'client.mail.sendTransactional()',\n 'POST',\n '/v1/transactional-mail/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { Attachment } from './mail.js';\n\nexport interface MailboxSendRequest {\n to: string[];\n cc?: string[];\n bcc?: string[];\n subject: string;\n body_html?: string;\n body_text?: string;\n /** Message ID to reply to. Threads the message correctly. */\n reply_to_id?: string;\n attachments?: Attachment[];\n}\n\nexport interface MailboxSendResponse {\n message_id: string;\n}\n\nexport interface MailboxAttachment {\n id: string;\n filename: string;\n content_type: string;\n size_bytes: number;\n}\n\nexport interface MailboxMessageSummary {\n id: string;\n subject: string;\n from: string;\n to: string[];\n /** First 150 characters of the body, HTML stripped. */\n preview: string;\n received_at: string;\n has_attachments: boolean;\n is_read: boolean;\n is_processed: boolean;\n processed_at: string | null;\n}\n\nexport interface MailboxMessagesListResponse {\n messages: MailboxMessageSummary[];\n total: number;\n}\n\nexport interface MailboxMessageDetail {\n id: string;\n subject: string;\n from: string;\n to: string[];\n cc: string[];\n bcc: string[];\n body_html?: string;\n body_text?: string;\n received_at: string;\n is_read: boolean;\n is_processed: boolean;\n processed_at: string | null;\n attachments: MailboxAttachment[];\n}\n\nexport interface MailboxMarkProcessedResponse {\n ok: true;\n id: string;\n already_processed: boolean;\n processed_at: string;\n}\n\nexport interface MailboxConnectorStatus {\n healthy: boolean;\n state: 'healthy' | 'unhealthy';\n /** ISO timestamp of the last state change, or null if never changed. */\n changed_at: string | null;\n}\n\nexport class MailboxClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: MailboxSendRequest): Promise<MailboxSendResponse> {\n return this.http.platformRequest<MailboxSendResponse>(\n 'client.mailbox.send()',\n 'POST',\n '/v1/mailbox/send',\n { body: params },\n );\n }\n\n list(limit?: number): Promise<MailboxMessagesListResponse> {\n const qs = limit !== undefined ? `?limit=${limit}` : '';\n return this.http.platformRequest<MailboxMessagesListResponse>(\n 'client.mailbox.list()',\n 'GET',\n `/v1/mailbox/messages${qs}`,\n );\n }\n\n get(id: string): Promise<MailboxMessageDetail> {\n return this.http.platformRequest<MailboxMessageDetail>(\n 'client.mailbox.get()',\n 'GET',\n `/v1/mailbox/messages/${encodeURIComponent(id)}`,\n );\n }\n\n markProcessed(id: string): Promise<MailboxMarkProcessedResponse> {\n return this.http.platformRequest<MailboxMarkProcessedResponse>(\n 'client.mailbox.markProcessed()',\n 'POST',\n `/v1/mailbox/messages/${encodeURIComponent(id)}/mark-processed`,\n );\n }\n\n /**\n * Download a mailbox message attachment as a Buffer.\n */\n async getAttachment(messageId: string, attachmentId: string): Promise<Buffer> {\n const res = await this.http.platformRequestRaw(\n 'client.mailbox.getAttachment()',\n 'GET',\n `/v1/mailbox/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`,\n );\n const arrayBuffer = await res.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n\n getConnectorStatus(): Promise<MailboxConnectorStatus> {\n return this.http.platformRequest<MailboxConnectorStatus>(\n 'client.mailbox.getConnectorStatus()',\n 'GET',\n '/v1/mailbox/connector-status',\n );\n }\n\n /**\n * Dev-only: toggle the mock connector's health state.\n */\n setConnectorStatus(healthy: boolean): Promise<MailboxConnectorStatus> {\n return this.http.platformRequest<MailboxConnectorStatus>(\n 'client.mailbox.setConnectorStatus()',\n 'PATCH',\n '/v1/mailbox/connector-status',\n { body: { healthy } },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface SmsSendRequest {\n /** Sender phone number in E.164 format. */\n from: string;\n /** Recipient phone number in E.164 format. */\n to: string;\n /** SMS text content. Max 1600 characters. */\n body: string;\n}\n\nexport interface SmsSendResponse {\n message_id: string;\n status: 'queued';\n}\n\nexport class SmsClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: SmsSendRequest): Promise<SmsSendResponse> {\n return this.http.platformRequest<SmsSendResponse>(\n 'client.sms.send()',\n 'POST',\n '/v1/sms/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface WhatsAppParameter {\n type: 'text' | 'image' | 'document' | 'video';\n parameter_name?: string;\n text?: string;\n image?: { link: string };\n document?: { link: string; filename: string };\n video?: { link: string };\n}\n\nexport interface WhatsAppComponent {\n type: 'header' | 'body' | 'button';\n sub_type?: 'url' | 'quick_reply';\n index?: number;\n parameters: WhatsAppParameter[];\n}\n\nexport interface WhatsAppSendRequest {\n /** Recipient phone number in E.164 format. */\n to: string;\n /** Pre-approved WhatsApp template name. */\n template_name: string;\n /** BCP 47 language code (e.g. \"en\", \"nl\", \"fr\"). */\n language_code: string;\n components?: WhatsAppComponent[];\n}\n\nexport interface WhatsAppSendResponse {\n message_id: string;\n status: 'queued';\n}\n\nexport class WhatsAppClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: WhatsAppSendRequest): Promise<WhatsAppSendResponse> {\n return this.http.platformRequest<WhatsAppSendResponse>(\n 'client.whatsapp.send()',\n 'POST',\n '/v1/whatsapp/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface VoiceTranscribeRequest {\n /** Base64-encoded audio buffer. */\n file: string;\n file_name: string;\n /** Optional BCP-47 language code (e.g. \"en\", \"nl\"). */\n language_code?: string;\n}\n\nexport interface VoiceTranscribeResponse {\n job_id: string;\n status: string;\n text: string;\n}\n\nexport class VoiceClient {\n constructor(private readonly http: HttpClient) {}\n\n transcribe(params: VoiceTranscribeRequest): Promise<VoiceTranscribeResponse> {\n return this.http.platformRequest<VoiceTranscribeResponse>(\n 'client.voice.transcribe()',\n 'POST',\n '/v1/voice/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface FileUploadResponse {\n key: string;\n content_type: string;\n size_bytes: number;\n}\n\nexport interface FileListItem {\n key: string;\n is_folder: boolean;\n content_type: string | null;\n size_bytes: number;\n created_at: string | null;\n}\n\nexport interface FileListResponse {\n files: FileListItem[];\n next_cursor: string | null;\n}\n\nexport interface PresignedUrlResponse {\n url: string;\n expires_in: number;\n}\n\nexport type FileUploadBody = Buffer | Uint8Array | ReadableStream | string;\n\nexport class FilesClient {\n constructor(private readonly http: HttpClient) {}\n\n async upload(\n key: string,\n file: FileUploadBody,\n contentType: string = 'application/octet-stream',\n ): Promise<FileUploadResponse> {\n const res = await this.http.platformRequestRaw(\n 'client.files.upload()',\n 'PUT',\n `/v1/files/${encodeURI(key)}`,\n { body: file as BodyInit, contentType },\n );\n return (await res.json()) as FileUploadResponse;\n }\n\n /**\n * Download a file. Returns the raw Response for streaming.\n */\n get(key: string): Promise<Response> {\n return this.http.platformRequestRaw(\n 'client.files.get()',\n 'GET',\n `/v1/files/${encodeURI(key)}`,\n );\n }\n\n list(prefix?: string, limit?: number, cursor?: string): Promise<FileListResponse> {\n const params = new URLSearchParams();\n if (prefix) params.set('prefix', prefix);\n if (limit !== undefined) params.set('limit', String(limit));\n if (cursor) params.set('cursor', cursor);\n const qs = params.toString();\n return this.http.platformRequest<FileListResponse>(\n 'client.files.list()',\n 'GET',\n `/v1/files${qs ? `?${qs}` : ''}`,\n );\n }\n\n delete(key: string): Promise<{ ok: true }> {\n return this.http.platformRequest<{ ok: true }>(\n 'client.files.delete()',\n 'DELETE',\n `/v1/files/${encodeURI(key)}`,\n );\n }\n\n deleteMany(prefix: string): Promise<{ ok: true; deleted: number }> {\n return this.http.platformRequest<{ ok: true; deleted: number }>(\n 'client.files.deleteMany()',\n 'DELETE',\n `/v1/files?prefix=${encodeURIComponent(prefix)}`,\n );\n }\n\n /**\n * Generate a time-limited download URL for a file.\n * @param expiresIn TTL in seconds (default 3600, min 60, max 86400)\n */\n presignedDownloadUrl(key: string, expiresIn?: number): Promise<PresignedUrlResponse> {\n return this.http.platformRequest<PresignedUrlResponse>(\n 'client.files.presignedDownloadUrl()',\n 'POST',\n '/v1/files/presigned-download',\n { body: { key, expires_in: expiresIn } },\n );\n }\n\n /**\n * Generate a time-limited upload URL for a file.\n * @param expiresIn TTL in seconds (default 3600, min 60, max 86400)\n * @param maxSize Max file size in bytes (default 50MB)\n */\n presignedUploadUrl(\n key: string,\n contentType: string,\n expiresIn?: number,\n maxSize?: number,\n ): Promise<PresignedUrlResponse> {\n return this.http.platformRequest<PresignedUrlResponse>(\n 'client.files.presignedUploadUrl()',\n 'POST',\n '/v1/files/presigned-upload',\n {\n body: { key, content_type: contentType, expires_in: expiresIn, max_size: maxSize },\n },\n );\n }\n}\n","import { z } from 'zod';\nimport type { HttpClient } from '../http.js';\nimport { UlvioError, type ErrorResponseBody } from '../errors.js';\n\nexport type Role = 'user' | 'assistant' | 'system';\n\nexport interface InputMessage {\n role: Role;\n content: string;\n}\n\nexport type Input = string | InputMessage[];\n\nexport interface ParseRequest<TSchema extends z.ZodType> {\n /** Model identifier, e.g. \"claude-opus-4-7\", \"claude-sonnet-4-6\". */\n model: string;\n input: Input;\n /** Zod schema describing the structured output shape. */\n schema: TSchema;\n}\n\nexport interface ParseResponse<T> {\n data: T;\n}\n\nexport type StreamEvent<T> =\n | { type: 'partial'; data: Partial<T> }\n | { type: 'complete'; data: T }\n | { type: 'error'; message: string };\n\ninterface WirePayload {\n model: string;\n input: Input;\n /** JSON Schema serialized from the supplied Zod schema. */\n schema: unknown;\n}\n\nfunction buildPayload<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n): WirePayload {\n return {\n model: params.model,\n input: params.input,\n schema: z.toJSONSchema(params.schema),\n };\n}\n\nfunction parseSseEvents(chunk: string): Array<{ event: string; data: string }> {\n const events: Array<{ event: string; data: string }> = [];\n let currentEvent = '';\n let currentData = '';\n\n for (const line of chunk.split('\\n')) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7);\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6);\n } else if (line === '' && currentEvent) {\n events.push({ event: currentEvent, data: currentData });\n currentEvent = '';\n currentData = '';\n }\n }\n\n return events;\n}\n\nexport class AiClient {\n constructor(private readonly http: HttpClient) {}\n\n async parse<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n ): Promise<z.infer<TSchema>> {\n const wire = buildPayload(params);\n const response = await this.http.platformRequest<ParseResponse<unknown>>(\n 'client.ai.parse()',\n 'POST',\n '/v1/ai/parse',\n { body: wire },\n );\n return params.schema.parse(response.data) as z.infer<TSchema>;\n }\n\n async *stream<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n ): AsyncGenerator<StreamEvent<z.infer<TSchema>>, void, void> {\n const wire = buildPayload(params);\n const res = await this.http.platformRequestRaw(\n 'client.ai.stream()',\n 'POST',\n '/v1/ai/stream',\n {\n body: JSON.stringify(wire),\n contentType: 'application/json',\n headers: { Accept: 'text/event-stream' },\n },\n );\n\n if (!res.body) {\n throw new UlvioError('stream_no_body', 'AI stream returned no response body', {\n status: res.status,\n });\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n const events = parseSseEvents(buffer);\n const lastBoundary = buffer.lastIndexOf('\\n\\n');\n buffer = lastBoundary >= 0 ? buffer.slice(lastBoundary + 2) : buffer;\n\n for (const { event, data } of events) {\n switch (event) {\n case 'partial':\n yield { type: 'partial', data: JSON.parse(data) as Partial<z.infer<TSchema>> };\n break;\n case 'complete': {\n const parsed = params.schema.parse(JSON.parse(data));\n yield { type: 'complete', data: parsed as z.infer<TSchema> };\n return;\n }\n case 'error': {\n const errBody = JSON.parse(data) as ErrorResponseBody['error'] | { message: string };\n throw new UlvioError(\n ('code' in errBody && errBody.code) || 'ai_stream_error',\n errBody.message,\n );\n }\n }\n }\n }\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { UlvioError, type ErrorResponseBody } from '../errors.js';\n\nexport interface PdfOptions {\n format?: string;\n printBackground?: boolean;\n margin?: {\n top?: string;\n right?: string;\n bottom?: string;\n left?: string;\n };\n}\n\nexport interface HtmlToPdfBase64Request {\n /** Base64-encoded HTML content. Provide either `html` or `sourceUrl`. */\n html?: string;\n sourceUrl?: string;\n outputMode: 'base64';\n options?: PdfOptions;\n}\n\nexport interface HtmlToPdfUploadRequest {\n html?: string;\n sourceUrl?: string;\n /** Pre-signed URL the service will PUT the rendered PDF to. */\n uploadUrl: string;\n options?: PdfOptions;\n}\n\nexport type HtmlToPdfRequest = HtmlToPdfBase64Request | HtmlToPdfUploadRequest;\n\nexport interface HtmlToPdfBase64Response {\n pdf: string;\n}\n\nexport interface HtmlToPdfUploadResponse {\n uploaded: true;\n bytes: number;\n}\n\nexport type HtmlToPdfResponse = HtmlToPdfBase64Response | HtmlToPdfUploadResponse;\n\nexport interface QueuedEvent {\n position: number;\n}\n\nexport interface ProcessingEvent {\n step: string;\n progress: number;\n}\n\nexport interface HtmlToPdfCallbacks {\n onQueued?: (data: QueuedEvent) => void;\n onProcessing?: (data: ProcessingEvent) => void;\n}\n\nfunction parseSseEvents(chunk: string): Array<{ event: string; data: string }> {\n const events: Array<{ event: string; data: string }> = [];\n let currentEvent = '';\n let currentData = '';\n\n for (const line of chunk.split('\\n')) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7);\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6);\n } else if (line === '' && currentEvent) {\n events.push({ event: currentEvent, data: currentData });\n currentEvent = '';\n currentData = '';\n }\n }\n\n return events;\n}\n\nexport class HtmlToPdfClient {\n constructor(private readonly http: HttpClient) {}\n\n async convert(\n params: HtmlToPdfBase64Request,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfBase64Response>;\n async convert(\n params: HtmlToPdfUploadRequest,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfUploadResponse>;\n async convert(\n params: HtmlToPdfRequest,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfResponse> {\n const res = await this.http.htmlToPdfFetch('client.htmlToPdf.convert()', '/api/html-to-pdf', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n });\n\n if (!res.ok) {\n const data = (await res.json().catch(() => undefined)) as\n | ErrorResponseBody\n | undefined;\n throw new UlvioError(\n data?.error?.code ?? 'html_to_pdf_failed',\n data?.error?.message ?? res.statusText,\n { status: res.status, response: data },\n );\n }\n\n if (!res.body) {\n throw new UlvioError('html_to_pdf_no_body', 'html-to-pdf service returned no body', {\n status: res.status,\n });\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const events = parseSseEvents(buffer);\n const lastBoundary = buffer.lastIndexOf('\\n\\n');\n buffer = lastBoundary >= 0 ? buffer.slice(lastBoundary + 2) : buffer;\n\n for (const { event, data } of events) {\n switch (event) {\n case 'queued':\n callbacks?.onQueued?.(JSON.parse(data) as QueuedEvent);\n break;\n case 'processing':\n callbacks?.onProcessing?.(JSON.parse(data) as ProcessingEvent);\n break;\n case 'complete':\n return JSON.parse(data) as HtmlToPdfResponse;\n case 'error': {\n const errBody = JSON.parse(data) as { code?: string; message: string };\n throw new UlvioError(\n errBody.code ?? 'html_to_pdf_error',\n errBody.message,\n );\n }\n }\n }\n }\n\n throw new UlvioError(\n 'html_to_pdf_truncated',\n 'SSE stream ended without a complete event',\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\n// MJML\n\nexport interface MjmlValidationError {\n line: number;\n message: string;\n tagName: string;\n formattedMessage: string;\n}\n\nexport interface MjmlCompileRequest {\n mjml: string;\n options?: {\n minify?: boolean;\n beautify?: boolean;\n validationLevel?: 'strict' | 'soft' | 'skip';\n };\n}\n\nexport interface MjmlCompileResponse {\n html: string;\n errors: MjmlValidationError[];\n}\n\n// LiquidJS\n\nexport interface LiquidRenderRequest {\n template: string;\n data: Record<string, unknown>;\n}\n\nexport interface LiquidRenderResponse {\n result: string;\n}\n\nexport interface LiquidVariablesRequest {\n template: string;\n}\n\nexport interface LiquidVariablesResponse {\n variables: string[];\n}\n\n// Markdown\n\nexport interface MarkdownRenderRequest {\n markdown: string;\n}\n\nexport interface MarkdownRenderResponse {\n html: string;\n}\n\n// Combined Liquid → MJML pipeline\n\nexport interface RenderEmailRequest {\n mjml: string;\n data: Record<string, unknown>;\n options?: {\n minify?: boolean;\n beautify?: boolean;\n validationLevel?: 'strict' | 'soft' | 'skip';\n };\n}\n\nexport interface RenderEmailResponse {\n html: string;\n errors: MjmlValidationError[];\n}\n\nexport class UtilitiesClient {\n constructor(private readonly http: HttpClient) {}\n\n compileMjml(params: MjmlCompileRequest): Promise<MjmlCompileResponse> {\n return this.http.utilitiesRequest<MjmlCompileResponse>(\n 'client.utilities.compileMjml()',\n 'POST',\n '/api/mjml/compile',\n { body: params },\n );\n }\n\n renderLiquid(params: LiquidRenderRequest): Promise<LiquidRenderResponse> {\n return this.http.utilitiesRequest<LiquidRenderResponse>(\n 'client.utilities.renderLiquid()',\n 'POST',\n '/api/liquidjs/render',\n { body: params },\n );\n }\n\n extractLiquidVariables(\n params: LiquidVariablesRequest,\n ): Promise<LiquidVariablesResponse> {\n return this.http.utilitiesRequest<LiquidVariablesResponse>(\n 'client.utilities.extractLiquidVariables()',\n 'POST',\n '/api/liquidjs/variables',\n { body: params },\n );\n }\n\n renderMarkdown(params: MarkdownRenderRequest): Promise<MarkdownRenderResponse> {\n return this.http.utilitiesRequest<MarkdownRenderResponse>(\n 'client.utilities.renderMarkdown()',\n 'POST',\n '/api/markdown/render',\n { body: params },\n );\n }\n\n renderEmail(params: RenderEmailRequest): Promise<RenderEmailResponse> {\n return this.http.utilitiesRequest<RenderEmailResponse>(\n 'client.utilities.renderEmail()',\n 'POST',\n '/api/render-email',\n { body: params },\n );\n }\n}\n","import { HttpClient, type UlvioConfig } from './http.js';\nimport { MailClient } from './clients/mail.js';\nimport { MailboxClient } from './clients/mailbox.js';\nimport { SmsClient } from './clients/sms.js';\nimport { WhatsAppClient } from './clients/whatsapp.js';\nimport { VoiceClient } from './clients/voice.js';\nimport { FilesClient } from './clients/files.js';\nimport { AiClient } from './clients/ai.js';\nimport { HtmlToPdfClient } from './clients/html-to-pdf.js';\nimport { UtilitiesClient } from './clients/utilities.js';\n\nexport class Ulvio {\n readonly mail: MailClient;\n readonly mailbox: MailboxClient;\n readonly sms: SmsClient;\n readonly whatsapp: WhatsAppClient;\n readonly voice: VoiceClient;\n readonly files: FilesClient;\n readonly ai: AiClient;\n readonly htmlToPdf: HtmlToPdfClient;\n readonly utilities: UtilitiesClient;\n\n constructor(config: UlvioConfig = {}) {\n const http = new HttpClient(config);\n this.mail = new MailClient(http);\n this.mailbox = new MailboxClient(http);\n this.sms = new SmsClient(http);\n this.whatsapp = new WhatsAppClient(http);\n this.voice = new VoiceClient(http);\n this.files = new FilesClient(http);\n this.ai = new AiClient(http);\n this.htmlToPdf = new HtmlToPdfClient(http);\n this.utilities = new UtilitiesClient(http);\n }\n}\n\nexport type { UlvioConfig } from './http.js';\n\n// Errors\nexport {\n UlvioError,\n CONNECTOR_UNHEALTHY_CODE,\n PLATFORM_NOT_CONFIGURED_CODE,\n HTML_TO_PDF_NOT_CONFIGURED_CODE,\n UTILITIES_NOT_CONFIGURED_CODE,\n isConnectorUnhealthyError,\n type ErrorResponseBody,\n} from './errors.js';\n\n// Sub-client classes\nexport { MailClient } from './clients/mail.js';\nexport { MailboxClient } from './clients/mailbox.js';\nexport { SmsClient } from './clients/sms.js';\nexport { WhatsAppClient } from './clients/whatsapp.js';\nexport { VoiceClient } from './clients/voice.js';\nexport { FilesClient } from './clients/files.js';\nexport { AiClient } from './clients/ai.js';\nexport { HtmlToPdfClient } from './clients/html-to-pdf.js';\nexport { UtilitiesClient } from './clients/utilities.js';\n\n// Mail types\nexport type {\n Attachment,\n TransactionalMailSendRequest,\n TransactionalMailSendResponse,\n} from './clients/mail.js';\n\n// Mailbox types\nexport type {\n MailboxSendRequest,\n MailboxSendResponse,\n MailboxAttachment,\n MailboxMessageSummary,\n MailboxMessagesListResponse,\n MailboxMessageDetail,\n MailboxMarkProcessedResponse,\n MailboxConnectorStatus,\n} from './clients/mailbox.js';\n\n// SMS types\nexport type { SmsSendRequest, SmsSendResponse } from './clients/sms.js';\n\n// WhatsApp types\nexport type {\n WhatsAppParameter,\n WhatsAppComponent,\n WhatsAppSendRequest,\n WhatsAppSendResponse,\n} from './clients/whatsapp.js';\n\n// Voice types\nexport type { VoiceTranscribeRequest, VoiceTranscribeResponse } from './clients/voice.js';\n\n// Files types\nexport type {\n FileUploadResponse,\n FileListItem,\n FileListResponse,\n PresignedUrlResponse,\n FileUploadBody,\n} from './clients/files.js';\n\n// AI types\nexport type {\n Role,\n InputMessage,\n Input,\n ParseRequest,\n ParseResponse,\n StreamEvent,\n} from './clients/ai.js';\n\n// HTML-to-PDF types\nexport type {\n PdfOptions,\n HtmlToPdfBase64Request,\n HtmlToPdfUploadRequest,\n HtmlToPdfRequest,\n HtmlToPdfBase64Response,\n HtmlToPdfUploadResponse,\n HtmlToPdfResponse,\n QueuedEvent,\n ProcessingEvent,\n HtmlToPdfCallbacks,\n} from './clients/html-to-pdf.js';\n\n// Utilities types\nexport type {\n MjmlValidationError,\n MjmlCompileRequest,\n MjmlCompileResponse,\n LiquidRenderRequest,\n LiquidRenderResponse,\n LiquidVariablesRequest,\n LiquidVariablesResponse,\n MarkdownRenderRequest,\n MarkdownRenderResponse,\n RenderEmailRequest,\n RenderEmailResponse,\n} from './clients/utilities.js';\n"],"mappings":"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","names":["parseSseEvents"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/clients/mail.ts","../src/clients/mailbox.ts","../src/clients/sms.ts","../src/clients/whatsapp.ts","../src/clients/voice.ts","../src/clients/files.ts","../src/clients/ai.ts","../src/clients/html-to-pdf.ts","../src/clients/utilities.ts","../src/index.ts"],"sourcesContent":["export interface ErrorResponseBody {\n error: {\n code?: string;\n message: string;\n };\n}\n\nexport const CONNECTOR_UNHEALTHY_CODE = 'CONNECTOR_UNHEALTHY';\n\nexport const PLATFORM_NOT_CONFIGURED_CODE = 'platform_not_configured';\nexport const HTML_TO_PDF_NOT_CONFIGURED_CODE = 'html_to_pdf_not_configured';\nexport const UTILITIES_NOT_CONFIGURED_CODE = 'utilities_not_configured';\n\nexport class UlvioError extends Error {\n readonly code: string;\n readonly status?: number;\n readonly response?: unknown;\n\n constructor(\n code: string,\n message: string,\n options: { status?: number; response?: unknown; cause?: unknown } = {},\n ) {\n super(message, { cause: options.cause });\n this.name = 'UlvioError';\n this.code = code;\n this.status = options.status;\n this.response = options.response;\n }\n}\n\nexport function isConnectorUnhealthyError(err: unknown): boolean {\n if (err instanceof UlvioError) return err.code === CONNECTOR_UNHEALTHY_CODE;\n const response = (err as { response?: ErrorResponseBody })?.response;\n return response?.error?.code === CONNECTOR_UNHEALTHY_CODE;\n}\n","import {\n ErrorResponseBody,\n HTML_TO_PDF_NOT_CONFIGURED_CODE,\n PLATFORM_NOT_CONFIGURED_CODE,\n UTILITIES_NOT_CONFIGURED_CODE,\n UlvioError,\n} from './errors.js';\n\nexport interface UlvioConfig {\n platformApiUrl?: string;\n platformApiKey?: string;\n htmlToPdfApiUrl?: string;\n utilitiesApiUrl?: string;\n}\n\ninterface RequestOptions {\n body?: unknown;\n}\n\ninterface RequestRawOptions {\n body?: BodyInit;\n contentType?: string;\n headers?: Record<string, string>;\n}\n\nfunction trimSlash(url: string): string {\n return url.replace(/\\/$/, '');\n}\n\nasync function parseError(res: Response, fallbackCode = 'request_failed'): Promise<UlvioError> {\n let body: ErrorResponseBody | undefined;\n try {\n body = (await res.json()) as ErrorResponseBody;\n } catch {\n body = undefined;\n }\n const code = body?.error?.code ?? fallbackCode;\n const message = body?.error?.message ?? res.statusText;\n return new UlvioError(code, message, { status: res.status, response: body });\n}\n\nexport class HttpClient {\n constructor(private readonly config: UlvioConfig) {}\n\n private requirePlatform(method: string): { url: string; key: string } {\n const url = this.config.platformApiUrl;\n const key = this.config.platformApiKey;\n if (!url || !key) {\n throw new UlvioError(\n PLATFORM_NOT_CONFIGURED_CODE,\n `${method} requires platformApiUrl and platformApiKey to be set on the Ulvio client`,\n );\n }\n return { url: trimSlash(url), key };\n }\n\n private requireHtmlToPdf(method: string): string {\n const url = this.config.htmlToPdfApiUrl;\n if (!url) {\n throw new UlvioError(\n HTML_TO_PDF_NOT_CONFIGURED_CODE,\n `${method} requires htmlToPdfApiUrl to be set on the Ulvio client`,\n );\n }\n return trimSlash(url);\n }\n\n private requireUtilities(method: string): string {\n const url = this.config.utilitiesApiUrl;\n if (!url) {\n throw new UlvioError(\n UTILITIES_NOT_CONFIGURED_CODE,\n `${method} requires utilitiesApiUrl to be set on the Ulvio client`,\n );\n }\n return trimSlash(url);\n }\n\n // ── Platform (authenticated) ──────────────────────────────────────────\n\n async platformRequest<T>(\n callerName: string,\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<T> {\n const { url, key } = this.requirePlatform(callerName);\n const res = await fetch(`${url}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${key}`,\n },\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n });\n if (!res.ok) throw await parseError(res);\n return (await res.json()) as T;\n }\n\n async platformRequestRaw(\n callerName: string,\n method: string,\n path: string,\n options: RequestRawOptions = {},\n ): Promise<Response> {\n const { url, key } = this.requirePlatform(callerName);\n const headers: Record<string, string> = { ...options.headers };\n if (options.contentType) headers['Content-Type'] = options.contentType;\n headers['Authorization'] = `Bearer ${key}`;\n const res = await fetch(`${url}${path}`, {\n method,\n headers,\n body: options.body,\n });\n if (!res.ok) throw await parseError(res);\n return res;\n }\n\n // ── HTML-to-PDF (unauthenticated) ─────────────────────────────────────\n\n async htmlToPdfFetch(\n callerName: string,\n path: string,\n init: RequestInit,\n ): Promise<Response> {\n const url = this.requireHtmlToPdf(callerName);\n return fetch(`${url}${path}`, init);\n }\n\n // ── Utilities (unauthenticated) ───────────────────────────────────────\n\n async utilitiesRequest<T>(\n callerName: string,\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<T> {\n const url = this.requireUtilities(callerName);\n const res = await fetch(`${url}${path}`, {\n method,\n headers: { 'Content-Type': 'application/json' },\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n });\n const data = (await res.json().catch(() => undefined)) as T | undefined;\n if (!res.ok) {\n const errBody = data as ErrorResponseBody | undefined;\n throw new UlvioError(\n errBody?.error?.code ?? 'request_failed',\n errBody?.error?.message ?? res.statusText,\n { status: res.status, response: data },\n );\n }\n return data as T;\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface Attachment {\n filename: string;\n /** Base64-encoded file content. */\n content: string;\n content_type: string;\n}\n\nexport interface TransactionalMailSendRequest {\n from: string;\n to: string[];\n subject: string;\n body_html?: string;\n body_text?: string;\n reply_to?: string;\n attachments?: Attachment[];\n}\n\nexport interface TransactionalMailSendResponse {\n message_id: string;\n}\n\nexport class MailClient {\n constructor(private readonly http: HttpClient) {}\n\n sendTransactional(\n params: TransactionalMailSendRequest,\n ): Promise<TransactionalMailSendResponse> {\n return this.http.platformRequest<TransactionalMailSendResponse>(\n 'client.mail.sendTransactional()',\n 'POST',\n '/v1/transactional-mail/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { Attachment } from './mail.js';\n\nexport interface MailboxSendRequest {\n to: string[];\n cc?: string[];\n bcc?: string[];\n subject: string;\n body_html?: string;\n body_text?: string;\n /** Message ID to reply to. Threads the message correctly. */\n reply_to_id?: string;\n attachments?: Attachment[];\n}\n\nexport interface MailboxSendResponse {\n message_id: string;\n}\n\nexport interface MailboxAttachment {\n id: string;\n filename: string;\n content_type: string;\n size_bytes: number;\n}\n\nexport interface MailboxMessageSummary {\n id: string;\n subject: string;\n from: string;\n to: string[];\n /** First 150 characters of the body, HTML stripped. */\n preview: string;\n received_at: string;\n has_attachments: boolean;\n is_read: boolean;\n is_processed: boolean;\n processed_at: string | null;\n}\n\nexport interface MailboxMessagesListResponse {\n messages: MailboxMessageSummary[];\n total: number;\n}\n\nexport interface MailboxMessageDetail {\n id: string;\n subject: string;\n from: string;\n to: string[];\n cc: string[];\n bcc: string[];\n body_html?: string;\n body_text?: string;\n received_at: string;\n is_read: boolean;\n is_processed: boolean;\n processed_at: string | null;\n attachments: MailboxAttachment[];\n}\n\nexport interface MailboxMarkProcessedResponse {\n ok: true;\n id: string;\n already_processed: boolean;\n processed_at: string;\n}\n\nexport interface MailboxConnectorStatus {\n healthy: boolean;\n state: 'healthy' | 'unhealthy';\n /** ISO timestamp of the last state change, or null if never changed. */\n changed_at: string | null;\n}\n\nexport class MailboxClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: MailboxSendRequest): Promise<MailboxSendResponse> {\n return this.http.platformRequest<MailboxSendResponse>(\n 'client.mailbox.send()',\n 'POST',\n '/v1/mailbox/send',\n { body: params },\n );\n }\n\n list(limit?: number): Promise<MailboxMessagesListResponse> {\n const qs = limit !== undefined ? `?limit=${limit}` : '';\n return this.http.platformRequest<MailboxMessagesListResponse>(\n 'client.mailbox.list()',\n 'GET',\n `/v1/mailbox/messages${qs}`,\n );\n }\n\n get(id: string): Promise<MailboxMessageDetail> {\n return this.http.platformRequest<MailboxMessageDetail>(\n 'client.mailbox.get()',\n 'GET',\n `/v1/mailbox/messages/${encodeURIComponent(id)}`,\n );\n }\n\n markProcessed(id: string): Promise<MailboxMarkProcessedResponse> {\n return this.http.platformRequest<MailboxMarkProcessedResponse>(\n 'client.mailbox.markProcessed()',\n 'POST',\n `/v1/mailbox/messages/${encodeURIComponent(id)}/mark-processed`,\n );\n }\n\n /**\n * Download a mailbox message attachment as a Buffer.\n */\n async getAttachment(messageId: string, attachmentId: string): Promise<Buffer> {\n const res = await this.http.platformRequestRaw(\n 'client.mailbox.getAttachment()',\n 'GET',\n `/v1/mailbox/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`,\n );\n const arrayBuffer = await res.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n\n getConnectorStatus(): Promise<MailboxConnectorStatus> {\n return this.http.platformRequest<MailboxConnectorStatus>(\n 'client.mailbox.getConnectorStatus()',\n 'GET',\n '/v1/mailbox/connector-status',\n );\n }\n\n /**\n * Dev-only: toggle the mock connector's health state.\n */\n setConnectorStatus(healthy: boolean): Promise<MailboxConnectorStatus> {\n return this.http.platformRequest<MailboxConnectorStatus>(\n 'client.mailbox.setConnectorStatus()',\n 'PATCH',\n '/v1/mailbox/connector-status',\n { body: { healthy } },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface SmsSendRequest {\n /** Sender phone number in E.164 format. */\n from: string;\n /** Recipient phone number in E.164 format. */\n to: string;\n /** SMS text content. Max 1600 characters. */\n body: string;\n}\n\nexport interface SmsSendResponse {\n message_id: string;\n status: 'queued';\n}\n\nexport class SmsClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: SmsSendRequest): Promise<SmsSendResponse> {\n return this.http.platformRequest<SmsSendResponse>(\n 'client.sms.send()',\n 'POST',\n '/v1/sms/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface WhatsAppParameter {\n type: 'text' | 'image' | 'document' | 'video';\n parameter_name?: string;\n text?: string;\n image?: { link: string };\n document?: { link: string; filename: string };\n video?: { link: string };\n}\n\nexport interface WhatsAppComponent {\n type: 'header' | 'body' | 'button';\n sub_type?: 'url' | 'quick_reply';\n index?: number;\n parameters: WhatsAppParameter[];\n}\n\nexport interface WhatsAppSendRequest {\n /** Recipient phone number in E.164 format. */\n to: string;\n /** Pre-approved WhatsApp template name. */\n template_name: string;\n /** BCP 47 language code (e.g. \"en\", \"nl\", \"fr\"). */\n language_code: string;\n components?: WhatsAppComponent[];\n}\n\nexport interface WhatsAppSendResponse {\n message_id: string;\n status: 'queued';\n}\n\nexport class WhatsAppClient {\n constructor(private readonly http: HttpClient) {}\n\n send(params: WhatsAppSendRequest): Promise<WhatsAppSendResponse> {\n return this.http.platformRequest<WhatsAppSendResponse>(\n 'client.whatsapp.send()',\n 'POST',\n '/v1/whatsapp/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface VoiceTranscribeRequest {\n /** Base64-encoded audio buffer. */\n file: string;\n file_name: string;\n /** Optional BCP-47 language code (e.g. \"en\", \"nl\"). */\n language_code?: string;\n}\n\nexport interface VoiceTranscribeResponse {\n job_id: string;\n status: string;\n text: string;\n}\n\nexport class VoiceClient {\n constructor(private readonly http: HttpClient) {}\n\n transcribe(params: VoiceTranscribeRequest): Promise<VoiceTranscribeResponse> {\n return this.http.platformRequest<VoiceTranscribeResponse>(\n 'client.voice.transcribe()',\n 'POST',\n '/v1/voice/send',\n { body: params },\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\nexport interface FileUploadResponse {\n key: string;\n content_type: string;\n size_bytes: number;\n}\n\nexport interface FileListItem {\n key: string;\n is_folder: boolean;\n content_type: string | null;\n size_bytes: number;\n created_at: string | null;\n}\n\nexport interface FileListResponse {\n files: FileListItem[];\n next_cursor: string | null;\n}\n\nexport interface PresignedUrlResponse {\n url: string;\n expires_in: number;\n}\n\nexport type FileUploadBody = Buffer | Uint8Array | ReadableStream | string;\n\nexport class FilesClient {\n constructor(private readonly http: HttpClient) {}\n\n async upload(\n key: string,\n file: FileUploadBody,\n contentType: string = 'application/octet-stream',\n ): Promise<FileUploadResponse> {\n const res = await this.http.platformRequestRaw(\n 'client.files.upload()',\n 'PUT',\n `/v1/files/${encodeURI(key)}`,\n { body: file as BodyInit, contentType },\n );\n return (await res.json()) as FileUploadResponse;\n }\n\n /**\n * Download a file. Returns the raw Response for streaming.\n */\n get(key: string): Promise<Response> {\n return this.http.platformRequestRaw(\n 'client.files.get()',\n 'GET',\n `/v1/files/${encodeURI(key)}`,\n );\n }\n\n list(prefix?: string, limit?: number, cursor?: string): Promise<FileListResponse> {\n const params = new URLSearchParams();\n if (prefix) params.set('prefix', prefix);\n if (limit !== undefined) params.set('limit', String(limit));\n if (cursor) params.set('cursor', cursor);\n const qs = params.toString();\n return this.http.platformRequest<FileListResponse>(\n 'client.files.list()',\n 'GET',\n `/v1/files${qs ? `?${qs}` : ''}`,\n );\n }\n\n delete(key: string): Promise<{ ok: true }> {\n return this.http.platformRequest<{ ok: true }>(\n 'client.files.delete()',\n 'DELETE',\n `/v1/files/${encodeURI(key)}`,\n );\n }\n\n deleteMany(prefix: string): Promise<{ ok: true; deleted: number }> {\n return this.http.platformRequest<{ ok: true; deleted: number }>(\n 'client.files.deleteMany()',\n 'DELETE',\n `/v1/files?prefix=${encodeURIComponent(prefix)}`,\n );\n }\n\n /**\n * Generate a time-limited download URL for a file.\n * @param expiresIn TTL in seconds (default 3600, min 60, max 86400)\n */\n presignedDownloadUrl(key: string, expiresIn?: number): Promise<PresignedUrlResponse> {\n return this.http.platformRequest<PresignedUrlResponse>(\n 'client.files.presignedDownloadUrl()',\n 'POST',\n '/v1/files/presigned-download',\n { body: { key, expires_in: expiresIn } },\n );\n }\n\n /**\n * Generate a time-limited upload URL for a file.\n * @param expiresIn TTL in seconds (default 3600, min 60, max 86400)\n * @param maxSize Max file size in bytes (default 50MB)\n */\n presignedUploadUrl(\n key: string,\n contentType: string,\n expiresIn?: number,\n maxSize?: number,\n ): Promise<PresignedUrlResponse> {\n return this.http.platformRequest<PresignedUrlResponse>(\n 'client.files.presignedUploadUrl()',\n 'POST',\n '/v1/files/presigned-upload',\n {\n body: { key, content_type: contentType, expires_in: expiresIn, max_size: maxSize },\n },\n );\n }\n}\n","import { z } from 'zod';\nimport type { HttpClient } from '../http.js';\nimport { UlvioError, type ErrorResponseBody } from '../errors.js';\n\nexport type Role = 'user' | 'assistant' | 'system';\n\nexport interface InputTextPart { type: 'input_text'; text: string }\nexport interface InputImagePart { type: 'input_image'; image_url: string }\nexport interface InputFilePart { type: 'input_file'; filename: string; file_data: string }\nexport type ContentPart = InputTextPart | InputImagePart | InputFilePart;\n\nexport interface InputMessage {\n role: Role;\n content: string | ContentPart[];\n}\n\nexport type Input = string | InputMessage[];\n\nexport interface ParseRequest<TSchema extends z.ZodType> {\n /** Model identifier, e.g. \"claude-opus-4-7\", \"claude-sonnet-4-6\". */\n model: string;\n input: Input;\n /** Zod schema describing the structured output shape. */\n schema: TSchema;\n}\n\nexport interface ParseResponse<T> {\n data: T;\n}\n\nexport type StreamEvent<T> =\n | { type: 'partial'; data: Partial<T> }\n | { type: 'complete'; data: T }\n | { type: 'error'; message: string };\n\ninterface WirePayload {\n model: string;\n input: Input;\n /** JSON Schema serialized from the supplied Zod schema. */\n schema: unknown;\n}\n\nfunction buildPayload<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n): WirePayload {\n return {\n model: params.model,\n input: params.input,\n schema: z.toJSONSchema(params.schema),\n };\n}\n\nfunction parseSseEvents(chunk: string): Array<{ event: string; data: string }> {\n const events: Array<{ event: string; data: string }> = [];\n let currentEvent = '';\n let currentData = '';\n\n for (const line of chunk.split('\\n')) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7);\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6);\n } else if (line === '' && currentEvent) {\n events.push({ event: currentEvent, data: currentData });\n currentEvent = '';\n currentData = '';\n }\n }\n\n return events;\n}\n\nexport class AiClient {\n constructor(private readonly http: HttpClient) {}\n\n async parse<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n ): Promise<z.infer<TSchema>> {\n const wire = buildPayload(params);\n const response = await this.http.platformRequest<ParseResponse<unknown>>(\n 'client.ai.parse()',\n 'POST',\n '/v1/ai/parse',\n { body: wire },\n );\n return params.schema.parse(response.data) as z.infer<TSchema>;\n }\n\n async *stream<TSchema extends z.ZodType>(\n params: ParseRequest<TSchema>,\n ): AsyncGenerator<StreamEvent<z.infer<TSchema>>, void, void> {\n const wire = buildPayload(params);\n const res = await this.http.platformRequestRaw(\n 'client.ai.stream()',\n 'POST',\n '/v1/ai/stream',\n {\n body: JSON.stringify(wire),\n contentType: 'application/json',\n headers: { Accept: 'text/event-stream' },\n },\n );\n\n if (!res.body) {\n throw new UlvioError('stream_no_body', 'AI stream returned no response body', {\n status: res.status,\n });\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n const events = parseSseEvents(buffer);\n const lastBoundary = buffer.lastIndexOf('\\n\\n');\n buffer = lastBoundary >= 0 ? buffer.slice(lastBoundary + 2) : buffer;\n\n for (const { event, data } of events) {\n switch (event) {\n case 'partial':\n yield { type: 'partial', data: JSON.parse(data) as Partial<z.infer<TSchema>> };\n break;\n case 'complete': {\n const parsed = params.schema.parse(JSON.parse(data));\n yield { type: 'complete', data: parsed as z.infer<TSchema> };\n return;\n }\n case 'error': {\n const errBody = JSON.parse(data) as ErrorResponseBody['error'] | { message: string };\n throw new UlvioError(\n ('code' in errBody && errBody.code) || 'ai_stream_error',\n errBody.message,\n );\n }\n }\n }\n }\n }\n}\n","import type { HttpClient } from '../http.js';\nimport { UlvioError, type ErrorResponseBody } from '../errors.js';\n\nexport interface PdfOptions {\n format?: string;\n printBackground?: boolean;\n margin?: {\n top?: string;\n right?: string;\n bottom?: string;\n left?: string;\n };\n}\n\nexport interface HtmlToPdfBase64Request {\n /** Base64-encoded HTML content. Provide either `html` or `sourceUrl`. */\n html?: string;\n sourceUrl?: string;\n outputMode: 'base64';\n options?: PdfOptions;\n}\n\nexport interface HtmlToPdfUploadRequest {\n html?: string;\n sourceUrl?: string;\n /** Pre-signed URL the service will PUT the rendered PDF to. */\n uploadUrl: string;\n options?: PdfOptions;\n}\n\nexport type HtmlToPdfRequest = HtmlToPdfBase64Request | HtmlToPdfUploadRequest;\n\nexport interface HtmlToPdfBase64Response {\n pdf: string;\n}\n\nexport interface HtmlToPdfUploadResponse {\n uploaded: true;\n bytes: number;\n}\n\nexport type HtmlToPdfResponse = HtmlToPdfBase64Response | HtmlToPdfUploadResponse;\n\nexport interface QueuedEvent {\n position: number;\n}\n\nexport interface ProcessingEvent {\n step: string;\n progress: number;\n}\n\nexport interface HtmlToPdfCallbacks {\n onQueued?: (data: QueuedEvent) => void;\n onProcessing?: (data: ProcessingEvent) => void;\n}\n\nfunction parseSseEvents(chunk: string): Array<{ event: string; data: string }> {\n const events: Array<{ event: string; data: string }> = [];\n let currentEvent = '';\n let currentData = '';\n\n for (const line of chunk.split('\\n')) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7);\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6);\n } else if (line === '' && currentEvent) {\n events.push({ event: currentEvent, data: currentData });\n currentEvent = '';\n currentData = '';\n }\n }\n\n return events;\n}\n\nexport class HtmlToPdfClient {\n constructor(private readonly http: HttpClient) {}\n\n async convert(\n params: HtmlToPdfBase64Request,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfBase64Response>;\n async convert(\n params: HtmlToPdfUploadRequest,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfUploadResponse>;\n async convert(\n params: HtmlToPdfRequest,\n callbacks?: HtmlToPdfCallbacks,\n ): Promise<HtmlToPdfResponse> {\n const res = await this.http.htmlToPdfFetch('client.htmlToPdf.convert()', '/api/html-to-pdf', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n });\n\n if (!res.ok) {\n const data = (await res.json().catch(() => undefined)) as\n | ErrorResponseBody\n | undefined;\n throw new UlvioError(\n data?.error?.code ?? 'html_to_pdf_failed',\n data?.error?.message ?? res.statusText,\n { status: res.status, response: data },\n );\n }\n\n if (!res.body) {\n throw new UlvioError('html_to_pdf_no_body', 'html-to-pdf service returned no body', {\n status: res.status,\n });\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const events = parseSseEvents(buffer);\n const lastBoundary = buffer.lastIndexOf('\\n\\n');\n buffer = lastBoundary >= 0 ? buffer.slice(lastBoundary + 2) : buffer;\n\n for (const { event, data } of events) {\n switch (event) {\n case 'queued':\n callbacks?.onQueued?.(JSON.parse(data) as QueuedEvent);\n break;\n case 'processing':\n callbacks?.onProcessing?.(JSON.parse(data) as ProcessingEvent);\n break;\n case 'complete':\n return JSON.parse(data) as HtmlToPdfResponse;\n case 'error': {\n const errBody = JSON.parse(data) as { code?: string; message: string };\n throw new UlvioError(\n errBody.code ?? 'html_to_pdf_error',\n errBody.message,\n );\n }\n }\n }\n }\n\n throw new UlvioError(\n 'html_to_pdf_truncated',\n 'SSE stream ended without a complete event',\n );\n }\n}\n","import type { HttpClient } from '../http.js';\n\n// MJML\n\nexport interface MjmlValidationError {\n line: number;\n message: string;\n tagName: string;\n formattedMessage: string;\n}\n\nexport interface MjmlCompileRequest {\n mjml: string;\n options?: {\n minify?: boolean;\n beautify?: boolean;\n validationLevel?: 'strict' | 'soft' | 'skip';\n };\n}\n\nexport interface MjmlCompileResponse {\n html: string;\n errors: MjmlValidationError[];\n}\n\n// LiquidJS\n\nexport interface LiquidRenderRequest {\n template: string;\n data: Record<string, unknown>;\n}\n\nexport interface LiquidRenderResponse {\n result: string;\n}\n\nexport interface LiquidVariablesRequest {\n template: string;\n}\n\nexport interface LiquidVariablesResponse {\n variables: string[];\n}\n\n// Markdown\n\nexport interface MarkdownRenderRequest {\n markdown: string;\n}\n\nexport interface MarkdownRenderResponse {\n html: string;\n}\n\n// Combined Liquid → MJML pipeline\n\nexport interface RenderEmailRequest {\n mjml: string;\n data: Record<string, unknown>;\n options?: {\n minify?: boolean;\n beautify?: boolean;\n validationLevel?: 'strict' | 'soft' | 'skip';\n };\n}\n\nexport interface RenderEmailResponse {\n html: string;\n errors: MjmlValidationError[];\n}\n\nexport class UtilitiesClient {\n constructor(private readonly http: HttpClient) {}\n\n compileMjml(params: MjmlCompileRequest): Promise<MjmlCompileResponse> {\n return this.http.utilitiesRequest<MjmlCompileResponse>(\n 'client.utilities.compileMjml()',\n 'POST',\n '/api/mjml/compile',\n { body: params },\n );\n }\n\n renderLiquid(params: LiquidRenderRequest): Promise<LiquidRenderResponse> {\n return this.http.utilitiesRequest<LiquidRenderResponse>(\n 'client.utilities.renderLiquid()',\n 'POST',\n '/api/liquidjs/render',\n { body: params },\n );\n }\n\n extractLiquidVariables(\n params: LiquidVariablesRequest,\n ): Promise<LiquidVariablesResponse> {\n return this.http.utilitiesRequest<LiquidVariablesResponse>(\n 'client.utilities.extractLiquidVariables()',\n 'POST',\n '/api/liquidjs/variables',\n { body: params },\n );\n }\n\n renderMarkdown(params: MarkdownRenderRequest): Promise<MarkdownRenderResponse> {\n return this.http.utilitiesRequest<MarkdownRenderResponse>(\n 'client.utilities.renderMarkdown()',\n 'POST',\n '/api/markdown/render',\n { body: params },\n );\n }\n\n renderEmail(params: RenderEmailRequest): Promise<RenderEmailResponse> {\n return this.http.utilitiesRequest<RenderEmailResponse>(\n 'client.utilities.renderEmail()',\n 'POST',\n '/api/render-email',\n { body: params },\n );\n }\n}\n","import { HttpClient, type UlvioConfig } from './http.js';\nimport { MailClient } from './clients/mail.js';\nimport { MailboxClient } from './clients/mailbox.js';\nimport { SmsClient } from './clients/sms.js';\nimport { WhatsAppClient } from './clients/whatsapp.js';\nimport { VoiceClient } from './clients/voice.js';\nimport { FilesClient } from './clients/files.js';\nimport { AiClient } from './clients/ai.js';\nimport { HtmlToPdfClient } from './clients/html-to-pdf.js';\nimport { UtilitiesClient } from './clients/utilities.js';\n\nexport class Ulvio {\n readonly mail: MailClient;\n readonly mailbox: MailboxClient;\n readonly sms: SmsClient;\n readonly whatsapp: WhatsAppClient;\n readonly voice: VoiceClient;\n readonly files: FilesClient;\n readonly ai: AiClient;\n readonly htmlToPdf: HtmlToPdfClient;\n readonly utilities: UtilitiesClient;\n\n constructor(config: UlvioConfig = {}) {\n const http = new HttpClient(config);\n this.mail = new MailClient(http);\n this.mailbox = new MailboxClient(http);\n this.sms = new SmsClient(http);\n this.whatsapp = new WhatsAppClient(http);\n this.voice = new VoiceClient(http);\n this.files = new FilesClient(http);\n this.ai = new AiClient(http);\n this.htmlToPdf = new HtmlToPdfClient(http);\n this.utilities = new UtilitiesClient(http);\n }\n}\n\nexport type { UlvioConfig } from './http.js';\n\n// Errors\nexport {\n UlvioError,\n CONNECTOR_UNHEALTHY_CODE,\n PLATFORM_NOT_CONFIGURED_CODE,\n HTML_TO_PDF_NOT_CONFIGURED_CODE,\n UTILITIES_NOT_CONFIGURED_CODE,\n isConnectorUnhealthyError,\n type ErrorResponseBody,\n} from './errors.js';\n\n// Sub-client classes\nexport { MailClient } from './clients/mail.js';\nexport { MailboxClient } from './clients/mailbox.js';\nexport { SmsClient } from './clients/sms.js';\nexport { WhatsAppClient } from './clients/whatsapp.js';\nexport { VoiceClient } from './clients/voice.js';\nexport { FilesClient } from './clients/files.js';\nexport { AiClient } from './clients/ai.js';\nexport { HtmlToPdfClient } from './clients/html-to-pdf.js';\nexport { UtilitiesClient } from './clients/utilities.js';\n\n// Mail types\nexport type {\n Attachment,\n TransactionalMailSendRequest,\n TransactionalMailSendResponse,\n} from './clients/mail.js';\n\n// Mailbox types\nexport type {\n MailboxSendRequest,\n MailboxSendResponse,\n MailboxAttachment,\n MailboxMessageSummary,\n MailboxMessagesListResponse,\n MailboxMessageDetail,\n MailboxMarkProcessedResponse,\n MailboxConnectorStatus,\n} from './clients/mailbox.js';\n\n// SMS types\nexport type { SmsSendRequest, SmsSendResponse } from './clients/sms.js';\n\n// WhatsApp types\nexport type {\n WhatsAppParameter,\n WhatsAppComponent,\n WhatsAppSendRequest,\n WhatsAppSendResponse,\n} from './clients/whatsapp.js';\n\n// Voice types\nexport type { VoiceTranscribeRequest, VoiceTranscribeResponse } from './clients/voice.js';\n\n// Files types\nexport type {\n FileUploadResponse,\n FileListItem,\n FileListResponse,\n PresignedUrlResponse,\n FileUploadBody,\n} from './clients/files.js';\n\n// AI types\nexport type {\n Role,\n InputTextPart,\n InputImagePart,\n InputFilePart,\n ContentPart,\n InputMessage,\n Input,\n ParseRequest,\n ParseResponse,\n StreamEvent,\n} from './clients/ai.js';\n\n// HTML-to-PDF types\nexport type {\n PdfOptions,\n HtmlToPdfBase64Request,\n HtmlToPdfUploadRequest,\n HtmlToPdfRequest,\n HtmlToPdfBase64Response,\n HtmlToPdfUploadResponse,\n HtmlToPdfResponse,\n QueuedEvent,\n ProcessingEvent,\n HtmlToPdfCallbacks,\n} from './clients/html-to-pdf.js';\n\n// Utilities types\nexport type {\n MjmlValidationError,\n MjmlCompileRequest,\n MjmlCompileResponse,\n LiquidRenderRequest,\n LiquidRenderResponse,\n LiquidVariablesRequest,\n LiquidVariablesResponse,\n MarkdownRenderRequest,\n MarkdownRenderResponse,\n RenderEmailRequest,\n RenderEmailResponse,\n} from './clients/utilities.js';\n"],"mappings":"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","names":["parseSseEvents"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ulvio/client",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Official TypeScript client for the Ulvio platform, html-to-pdf, and utilities services.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",