@getnexorai/sdk 0.1.0 → 0.1.1

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/errors.ts","../src/http.ts","../src/client.ts","../src/chat/config.ts","../src/chat/session.ts","../src/chat/styles.ts","../src/chat/dom.ts","../src/chat/index.ts","../src/index.ts","../src/browser.ts"],"names":["NexorError","message","NexorAPIError","opts","_a","statusToCode","NexorAuthError","NexorValidationError","NexorNetworkError","cause","status","DEFAULT_BASE_URL","DEFAULT_TIMEOUT_MS","DEFAULT_MAX_RETRIES","SDK_VERSION","resolveConfig","_b","_c","_d","fetchImpl","ua","stripTrailingSlash","request","cfg","req","_e","_f","_g","url","buildUrl","headers","body","timeoutMs","lastErr","attempt","controller","externalSignal","onAbort","timeoutId","res","requestId","text","e","errBody","safeJson","pickMessage","err","makeError","shouldRetry","sleep","backoffMs","isAbort","b","txt","ra","n","ms","r","s","baseUrl","path","query","p","qs","encodeQuery","parts","k","v","PUBLIC_PREFIX","NexorClient","input","options","inputs","leadId","updates","params","channel","applyDefaults","o","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","_r","_s","needsCapture","have","f","SESSION_KEY","ensureSessionId","now","rec","readRecord","writeRecord","id","randomHex","touchSession","raw","ts","bytes","arr","i","widgetCss","accent","accentText","STYLE_ATTR","injectStyles","style","buildLauncher","el","badge","buildPanel","header","closeBtn","buildHeader","captureForm","captureInputs","buildBody","form","send","buildComposer","footer","buildFooter","subtitleHtml","escapeHtml","buildCaptureForm","inputsOut","label","fields","row","makeInput","submit","buildMessage","role","locale","time","formatRelativeTime","diff","min","hr","day","rtf","buildTypingIndicator","name","placeholder","type","value","TYPING_DELAY_MS","initChat","client","ensureBrowser","sessionId","historyKey","root","buildRoot","launcher","panel","state","toggle","close","onComposerSubmit","onCaptureSubmit","syncComposerLock","restored","loadHistory","m","appendBubble","scrollToBottom","open","clearUnread","appendBot","collected","readCaptureFields","required","queueMessage","appendUser","scheduleFlush","flush","appendNode","reply","appendSystem","saveHistory","bumpUnread","refreshTimer","node","lock","out","createClient","_client","getClient","init","isInitialized","reset","nexor","args","createLead","createLeadsBulk","updateLead","getLead","getLeadHistory","isLeadPaused","stopAutomation","resumeAutomation","syncLeadTags","listLeadMeetings","listWorkflows","listCampaigns","listTemplates","sendMessage","createMeeting","createMeetingNotes"],"mappings":"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","file":"nexor.iife.js","sourcesContent":["export class NexorError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NexorError\";\n }\n}\n\nexport class NexorAPIError extends NexorError {\n status: number;\n code: string;\n body: unknown;\n requestId?: string;\n\n constructor(opts: {\n status: number;\n code?: string;\n message: string;\n body?: unknown;\n requestId?: string;\n }) {\n super(opts.message);\n this.name = \"NexorAPIError\";\n this.status = opts.status;\n this.code = opts.code ?? statusToCode(opts.status);\n this.body = opts.body;\n this.requestId = opts.requestId;\n }\n}\n\nexport class NexorAuthError extends NexorAPIError {\n constructor(opts: { message: string; body?: unknown; requestId?: string }) {\n super({ status: 401, code: \"unauthorized\", ...opts });\n this.name = \"NexorAuthError\";\n }\n}\n\nexport class NexorValidationError extends NexorAPIError {\n constructor(opts: { message: string; body?: unknown; requestId?: string }) {\n super({ status: 400, code: \"validation_error\", ...opts });\n this.name = \"NexorValidationError\";\n }\n}\n\nexport class NexorNetworkError extends NexorError {\n cause?: unknown;\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"NexorNetworkError\";\n this.cause = cause;\n }\n}\n\nfunction statusToCode(status: number): string {\n if (status === 400) return \"validation_error\";\n if (status === 401) return \"unauthorized\";\n if (status === 403) return \"forbidden\";\n if (status === 404) return \"not_found\";\n if (status === 409) return \"conflict\";\n if (status === 422) return \"unprocessable_entity\";\n if (status === 429) return \"rate_limited\";\n if (status >= 500) return \"server_error\";\n return \"http_error\";\n}\n","import {\n NexorAPIError,\n NexorAuthError,\n NexorNetworkError,\n NexorValidationError,\n} from \"./errors\";\nimport type { ClientOptions, RequestOptions } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api.getnexor.ai\";\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst SDK_VERSION = \"0.1.0\";\n\nexport interface ResolvedConfig {\n apiKey: string;\n baseUrl: string;\n timeoutMs: number;\n maxRetries: number;\n fetchImpl: typeof fetch;\n userAgent: string;\n}\n\nexport function resolveConfig(opts: ClientOptions): ResolvedConfig {\n if (!opts || typeof opts.apiKey !== \"string\" || opts.apiKey.trim() === \"\") {\n throw new Error(\n \"Nexor SDK: `apiKey` is required. Get one in the dashboard at https://app.getnexor.ai\",\n );\n }\n const fetchImpl =\n opts.fetch ??\n (typeof globalThis !== \"undefined\" && typeof globalThis.fetch === \"function\"\n ? globalThis.fetch.bind(globalThis)\n : (undefined as unknown as typeof fetch));\n if (!fetchImpl) {\n throw new Error(\n \"Nexor SDK: no global fetch found. Pass a `fetch` implementation via init() or upgrade to Node 18+.\",\n );\n }\n const ua = `nexor-sdk-js/${SDK_VERSION}${opts.userAgentSuffix ? ` ${opts.userAgentSuffix}` : \"\"}`;\n return {\n apiKey: opts.apiKey.trim(),\n baseUrl: stripTrailingSlash(opts.baseUrl ?? DEFAULT_BASE_URL),\n timeoutMs: opts.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n maxRetries: opts.maxRetries ?? DEFAULT_MAX_RETRIES,\n fetchImpl,\n userAgent: ua,\n };\n}\n\ninterface HttpRequest {\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n path: string;\n query?: Record<string, string | number | boolean | string[] | undefined | null>;\n body?: unknown;\n options?: RequestOptions;\n}\n\nexport async function request<T>(\n cfg: ResolvedConfig,\n req: HttpRequest,\n): Promise<T> {\n const url = buildUrl(cfg.baseUrl, req.path, req.query);\n const headers: Record<string, string> = {\n \"X-API-Key\": cfg.apiKey,\n Accept: \"application/json\",\n \"User-Agent\": cfg.userAgent,\n };\n if (req.options?.idempotencyKey) {\n headers[\"Idempotency-Key\"] = req.options.idempotencyKey;\n }\n let body: BodyInit | undefined;\n if (req.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(req.body);\n }\n\n const timeoutMs = req.options?.timeoutMs ?? cfg.timeoutMs;\n let lastErr: unknown;\n\n for (let attempt = 0; attempt <= cfg.maxRetries; attempt++) {\n const controller = new AbortController();\n const externalSignal = req.options?.signal;\n const onAbort = () => controller.abort();\n if (externalSignal) {\n if (externalSignal.aborted) controller.abort();\n else externalSignal.addEventListener(\"abort\", onAbort);\n }\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const res = await cfg.fetchImpl(url, {\n method: req.method,\n headers,\n body,\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n externalSignal?.removeEventListener(\"abort\", onAbort);\n\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n\n if (res.ok) {\n if (res.status === 204) return undefined as T;\n const text = await res.text();\n if (!text) return undefined as T;\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new NexorAPIError({\n status: res.status,\n message: \"Failed to parse JSON response\",\n body: text,\n requestId,\n });\n }\n }\n\n // Non-2xx: parse and throw a typed error.\n const errBody = await safeJson(res);\n const message = pickMessage(errBody) ?? `HTTP ${res.status}`;\n const err = makeError(res.status, message, errBody, requestId);\n\n // Retry on 429 + 5xx with exponential backoff.\n if (shouldRetry(res.status) && attempt < cfg.maxRetries) {\n await sleep(backoffMs(attempt, res));\n lastErr = err;\n continue;\n }\n throw err;\n } catch (err) {\n clearTimeout(timeoutId);\n externalSignal?.removeEventListener(\"abort\", onAbort);\n if (err instanceof NexorAPIError) throw err;\n const isAbort =\n err instanceof Error &&\n (err.name === \"AbortError\" || /abort/i.test(err.message));\n if (isAbort && externalSignal?.aborted) throw err;\n // Network or timeout: retry.\n lastErr = err;\n if (attempt < cfg.maxRetries) {\n await sleep(backoffMs(attempt));\n continue;\n }\n throw new NexorNetworkError(\n isAbort ? `Request timed out after ${timeoutMs}ms` : `Network error: ${(err as Error)?.message ?? String(err)}`,\n err,\n );\n }\n }\n throw lastErr ?? new NexorNetworkError(\"Request failed\");\n}\n\nfunction makeError(\n status: number,\n message: string,\n body: unknown,\n requestId?: string,\n): NexorAPIError {\n if (status === 401 || status === 403) {\n return new NexorAuthError({ message, body, requestId });\n }\n if (status === 400 || status === 422) {\n return new NexorValidationError({ message, body, requestId });\n }\n return new NexorAPIError({ status, message, body, requestId });\n}\n\nfunction pickMessage(body: unknown): string | undefined {\n if (!body || typeof body !== \"object\") return undefined;\n const b = body as Record<string, unknown>;\n if (typeof b.message === \"string\") return b.message;\n if (typeof b.error === \"string\") return b.error;\n return undefined;\n}\n\nasync function safeJson(res: Response): Promise<unknown> {\n try {\n const txt = await res.text();\n if (!txt) return null;\n try {\n return JSON.parse(txt);\n } catch {\n return txt;\n }\n } catch {\n return null;\n }\n}\n\nfunction shouldRetry(status: number): boolean {\n return status === 429 || (status >= 500 && status <= 599);\n}\n\nfunction backoffMs(attempt: number, res?: Response): number {\n if (res) {\n const ra = res.headers.get(\"retry-after\");\n if (ra) {\n const n = Number(ra);\n if (!Number.isNaN(n) && n > 0) return Math.min(n * 1000, 10_000);\n }\n }\n const base = 300 * 2 ** attempt;\n return base + Math.floor(Math.random() * 200);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction stripTrailingSlash(s: string): string {\n return s.endsWith(\"/\") ? s.slice(0, -1) : s;\n}\n\nfunction buildUrl(\n baseUrl: string,\n path: string,\n query?: HttpRequest[\"query\"],\n): string {\n const p = path.startsWith(\"/\") ? path : `/${path}`;\n const qs = encodeQuery(query);\n return `${baseUrl}${p}${qs ? `?${qs}` : \"\"}`;\n}\n\nfunction encodeQuery(query?: HttpRequest[\"query\"]): string {\n if (!query) return \"\";\n const parts: string[] = [];\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n if (Array.isArray(v)) {\n if (v.length === 0) continue;\n parts.push(`${encodeURIComponent(k)}=${encodeURIComponent(v.join(\",\"))}`);\n } else {\n parts.push(`${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`);\n }\n }\n return parts.join(\"&\");\n}\n","import { request, resolveConfig, type ResolvedConfig } from \"./http\";\nimport type {\n AutomationInput,\n Campaign,\n ClientOptions,\n CreateLeadBulkResponse,\n CreateLeadInput,\n CreateLeadResponse,\n CreateMeetingInput,\n GetLeadHistoryParams,\n GetLeadHistoryResponse,\n GetLeadResponse,\n IsPausedResponse,\n Lead,\n ListTemplatesParams,\n MeetingNotesInput,\n RequestOptions,\n ResumeAutomationInput,\n SendMessageInput,\n SyncTagsInput,\n SyncTagsResponse,\n UUID,\n WhatsAppTemplate,\n Workflow,\n} from \"./types\";\n\nconst PUBLIC_PREFIX = \"/api/public\";\n\n/**\n * Low-level Nexor API client.\n *\n * Most users should call `init()` / `createClient()` instead of instantiating\n * this directly, but it's exported for advanced cases (DI, mocking).\n */\nexport class NexorClient {\n private cfg: ResolvedConfig;\n\n constructor(opts: ClientOptions) {\n this.cfg = resolveConfig(opts);\n }\n\n // ─── Leads ───────────────────────────────────────────────────────────────\n\n /** Create a single lead, optionally assigning it to a workflow. */\n createLead(\n input: CreateLeadInput,\n options?: RequestOptions,\n ): Promise<CreateLeadResponse> {\n return request<CreateLeadResponse>(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/leads`,\n body: input,\n options,\n });\n }\n\n /** Create many leads in one request (max 1000). */\n createLeadsBulk(\n inputs: CreateLeadInput[],\n options?: RequestOptions,\n ): Promise<CreateLeadBulkResponse> {\n return request<CreateLeadBulkResponse>(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/leads`,\n body: inputs,\n options,\n });\n }\n\n /** Update an existing lead. metadata is shallow-merged server-side. */\n updateLead(\n leadId: UUID,\n updates: Partial<CreateLeadInput>,\n options?: RequestOptions,\n ): Promise<{ success: true; lead: Lead }> {\n return request(this.cfg, {\n method: \"PUT\",\n path: `${PUBLIC_PREFIX}/leads/${encodeURIComponent(leadId)}`,\n body: updates,\n options,\n });\n }\n\n /** Fetch a lead with its captured variables and per-channel engagement. */\n getLead(leadId: UUID, options?: RequestOptions): Promise<GetLeadResponse> {\n return request<GetLeadResponse>(this.cfg, {\n method: \"GET\",\n path: `${PUBLIC_PREFIX}/leads/${encodeURIComponent(leadId)}`,\n options,\n });\n }\n\n /** Full chronological history: messages, transcripts, activity. */\n getLeadHistory(\n leadId: UUID,\n params: GetLeadHistoryParams = {},\n options?: RequestOptions,\n ): Promise<GetLeadHistoryResponse> {\n const channel = Array.isArray(params.channel)\n ? params.channel\n : params.channel\n ? [params.channel]\n : undefined;\n return request<GetLeadHistoryResponse>(this.cfg, {\n method: \"GET\",\n path: `${PUBLIC_PREFIX}/leads/${encodeURIComponent(leadId)}/history`,\n query: { channel, limit: params.limit, offset: params.offset },\n options,\n });\n }\n\n /** Has automation been paused (human takeover) for this lead? */\n isLeadPaused(\n leadId: UUID,\n params: { workflow_id?: UUID } = {},\n options?: RequestOptions,\n ): Promise<IsPausedResponse> {\n return request<IsPausedResponse>(this.cfg, {\n method: \"GET\",\n path: `${PUBLIC_PREFIX}/leads/${encodeURIComponent(leadId)}/is_paused`,\n query: { workflow_id: params.workflow_id },\n options,\n });\n }\n\n /** Pause automation (engage human takeover) on a specific workflow run. */\n stopAutomation(\n leadId: UUID,\n input: AutomationInput,\n options?: RequestOptions,\n ): Promise<unknown> {\n return request(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/leads/${encodeURIComponent(leadId)}/automation/stop`,\n body: input,\n options,\n });\n }\n\n /** Resume automation; pass resume_cadence: true to restart scheduled touches. */\n resumeAutomation(\n leadId: UUID,\n input: ResumeAutomationInput,\n options?: RequestOptions,\n ): Promise<unknown> {\n return request(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/leads/${encodeURIComponent(leadId)}/automation/resume`,\n body: input,\n options,\n });\n }\n\n /**\n * Replace the tag set on a lead (identified by lead_id OR email).\n * Tags missing from the input are unassigned; new tags are find-or-created.\n */\n syncLeadTags(\n input: SyncTagsInput,\n options?: RequestOptions,\n ): Promise<SyncTagsResponse> {\n return request<SyncTagsResponse>(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/leads/tags`,\n body: input,\n options,\n });\n }\n\n /** All meetings on file for a lead (optionally filter by status). */\n listLeadMeetings(\n leadId: UUID,\n params: { status?: string | string[] } = {},\n options?: RequestOptions,\n ): Promise<unknown> {\n const status = Array.isArray(params.status)\n ? params.status.join(\",\")\n : params.status;\n return request(this.cfg, {\n method: \"GET\",\n path: `${PUBLIC_PREFIX}/leads/${encodeURIComponent(leadId)}/meetings`,\n query: { status },\n options,\n });\n }\n\n // ─── Workflows / Campaigns / Templates ──────────────────────────────────\n\n /** Active workflows in your account. */\n listWorkflows(\n options?: RequestOptions,\n ): Promise<{ success: true; workflows: Workflow[] }> {\n return request(this.cfg, {\n method: \"GET\",\n path: `${PUBLIC_PREFIX}/workflows`,\n options,\n });\n }\n\n /** Campaigns in your account. */\n listCampaigns(\n options?: RequestOptions,\n ): Promise<{ success: true; campaigns: Campaign[] }> {\n return request(this.cfg, {\n method: \"GET\",\n path: `${PUBLIC_PREFIX}/campaigns`,\n options,\n });\n }\n\n /** Approved WhatsApp templates. */\n listTemplates(\n params: ListTemplatesParams = {},\n options?: RequestOptions,\n ): Promise<{ success: true; templates: WhatsAppTemplate[] }> {\n return request(this.cfg, {\n method: \"GET\",\n path: `${PUBLIC_PREFIX}/templates`,\n query: { status: params.status, category: params.category },\n options,\n });\n }\n\n // ─── Messages ───────────────────────────────────────────────────────────\n\n /** Send a one-off message (WhatsApp/email) or trigger a call. */\n sendMessage(\n input: SendMessageInput,\n options?: RequestOptions,\n ): Promise<unknown> {\n return request(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/messages`,\n body: input,\n options,\n });\n }\n\n // ─── Meetings ───────────────────────────────────────────────────────────\n\n /** Log a booked meeting against an existing lead (matched by email). */\n createMeeting(\n input: CreateMeetingInput,\n options?: RequestOptions,\n ): Promise<unknown> {\n return request(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/meetings`,\n body: input,\n options,\n });\n }\n\n /** Push a note-taker transcript / summary / action items to a meeting. */\n createMeetingNotes(\n input: MeetingNotesInput,\n options?: RequestOptions,\n ): Promise<unknown> {\n return request(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/meeting-notes`,\n body: input,\n options,\n });\n }\n\n // ─── Chat (used by initChat widget) ─────────────────────────────────────\n\n /**\n * Send a turn in a browser-embedded chat session. Backed by\n * POST /api/public/chat on the Nexor API.\n *\n * Most users will not call this directly — `initChat()` handles it.\n */\n chat(\n input: {\n workflow_id: UUID;\n session_id: string;\n message: string;\n system_prompt?: string;\n client_prompt?: string;\n lead?: {\n first_name?: string;\n last_name?: string;\n email?: string;\n phone?: string;\n metadata?: Record<string, unknown>;\n };\n metadata?: Record<string, unknown>;\n },\n options?: RequestOptions,\n ): Promise<{\n success: true;\n reply: string;\n session_id: string;\n lead_id?: UUID;\n workflow_run_id?: UUID;\n }> {\n return request(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/chat`,\n body: input,\n options,\n });\n }\n}\n","/**\n * Chat widget configuration types + defaults.\n *\n * Kept separate from the widget's runtime code so other modules (and the\n * top-level `nexor.initChat()` re-export) can pull types without dragging in\n * the DOM construction code.\n */\nimport type { UUID } from \"../types\";\n\n// ─── Public option / handle types ──────────────────────────────────────────\n\nexport interface ChatLeadCapture {\n /** Which fields to ask for before chatting. Defaults to [\"first_name\", \"email\"]. */\n fields?: Array<\"first_name\" | \"last_name\" | \"email\" | \"phone\">;\n /** \"before\" gates chat behind the form; \"skip\" never asks. Default \"before\". */\n mode?: \"before\" | \"skip\";\n /** Label rendered above the form. */\n label?: string;\n /** Submit button label. */\n submitLabel?: string;\n}\n\nexport interface ChatInitOptions {\n /** Workflow that handles this chat conversation. Required. */\n workflowId: UUID;\n\n // ── Identity / branding ──\n title?: string;\n subtitle?: string;\n greeting?: string;\n /** Shown when a turn fails or the server returns no reply. */\n errorText?: string;\n /** BCP-47 locale for timestamps (e.g. \"es\", \"en-US\"). Defaults to the browser. */\n locale?: string;\n /** Hex colour for bubble + accents. Defaults to #111827. */\n accentColor?: string;\n /** Text colour rendered on top of the accent. Defaults to white. */\n accentTextColor?: string;\n /** Show the \"Powered by Nexor\" footer. Defaults to true. */\n showBranding?: boolean;\n\n // ── Behaviour ──\n position?: \"bottom-right\" | \"bottom-left\";\n /** Auto-open the panel on first load. Defaults to false. */\n openOnLoad?: boolean;\n /** Coalesce rapid-fire messages: wait this many ms of quiet, then send the\n * buffered messages as one combined turn. Defaults to 700. 0 = per message. */\n debounceMs?: number;\n /** Append the widget to a custom element. Defaults to document.body. */\n container?: HTMLElement;\n\n // ── Prompt overrides forwarded to the agent for THIS widget instance ──\n systemPrompt?: string;\n clientPrompt?: string;\n\n // ── Lead linking ──\n /** Pre-known lead info (e.g. a logged-in user). Skips capture if complete. */\n lead?: {\n first_name?: string;\n last_name?: string;\n email?: string;\n phone?: string;\n metadata?: Record<string, unknown>;\n };\n capture?: ChatLeadCapture;\n /** Arbitrary metadata passed with each turn (page URL, UTM, …). */\n metadata?: Record<string, unknown>;\n\n // ── Callbacks ──\n onOpen?: () => void;\n onClose?: () => void;\n onMessage?: (msg: { role: \"user\" | \"bot\"; text: string }) => void;\n onLeadCaptured?: (leadId: UUID) => void;\n onError?: (err: Error) => void;\n}\n\nexport interface ChatHandle {\n open(): void;\n close(): void;\n toggle(): void;\n /** Programmatically send a user message. */\n send(text: string): Promise<void>;\n /** Tear down the widget and remove all DOM. */\n destroy(): void;\n /** Read the current session id (auto-generated on first open). */\n getSessionId(): string;\n}\n\n// ─── Internal resolved-config type ─────────────────────────────────────────\n\nexport interface ResolvedCfg {\n workflowId: UUID;\n title: string;\n subtitle: string;\n greeting: string;\n errorText: string;\n locale?: string;\n accentColor: string;\n accentTextColor: string;\n showBranding: boolean;\n position: \"bottom-right\" | \"bottom-left\";\n openOnLoad: boolean;\n debounceMs: number;\n container?: HTMLElement;\n systemPrompt?: string;\n clientPrompt?: string;\n lead?: ChatInitOptions[\"lead\"];\n capture: Required<ChatLeadCapture>;\n metadata?: Record<string, unknown>;\n onOpen?: () => void;\n onClose?: () => void;\n onMessage?: (msg: { role: \"user\" | \"bot\"; text: string }) => void;\n onLeadCaptured?: (leadId: UUID) => void;\n onError?: (err: Error) => void;\n}\n\n/**\n * Normalize user-provided options into a complete config object with every\n * field set. Downstream code reads from ResolvedCfg and never has to deal\n * with `undefined` for branding / behaviour fields.\n */\nexport function applyDefaults(o: ChatInitOptions): ResolvedCfg {\n return {\n workflowId: o.workflowId,\n title: o.title ?? \"Chat with us\",\n subtitle: o.subtitle ?? \"We typically reply in a few minutes\",\n greeting: o.greeting ?? \"Hi there! 👋 How can we help?\",\n errorText:\n o.errorText ?? \"Sorry, something went wrong. Please try again in a moment.\",\n locale:\n o.locale ??\n (typeof navigator !== \"undefined\" ? navigator.language : undefined),\n accentColor: o.accentColor ?? \"#111827\",\n accentTextColor: o.accentTextColor ?? \"#ffffff\",\n showBranding: o.showBranding ?? true,\n position: o.position ?? \"bottom-right\",\n openOnLoad: o.openOnLoad ?? false,\n debounceMs: o.debounceMs ?? 700,\n container: o.container,\n systemPrompt: o.systemPrompt,\n clientPrompt: o.clientPrompt,\n lead: o.lead,\n capture: {\n fields: o.capture?.fields ?? [\"first_name\", \"email\"],\n mode: o.capture?.mode ?? \"before\",\n label: o.capture?.label ?? \"Tell us a bit about you to get started:\",\n submitLabel: o.capture?.submitLabel ?? \"Start chat\",\n },\n metadata: o.metadata,\n onOpen: o.onOpen,\n onClose: o.onClose,\n onMessage: o.onMessage,\n onLeadCaptured: o.onLeadCaptured,\n onError: o.onError,\n };\n}\n\n/**\n * Does this widget need to show a lead-capture form before chat?\n * - \"skip\" mode → no\n * - Pre-known lead already covers every required field → no\n * - Otherwise → yes\n */\nexport function needsCapture(cfg: ResolvedCfg): boolean {\n if (cfg.capture.mode === \"skip\") return false;\n if (cfg.lead) {\n const have = cfg.lead;\n return cfg.capture.fields.some((f) => !have[f]);\n }\n return true;\n}\n","/**\n * Browser-side session-id management for the chat widget.\n *\n * The session id links anonymous turns to the same lead across page reloads.\n * It's persisted in localStorage with a last-activity timestamp and a sliding\n * retention window: a conversation is kept for at least SESSION_RETENTION_MS\n * after the last activity, after which a fresh session (and transcript) starts.\n * If storage is unavailable (private mode, sandboxed iframe) we fall back to a\n * per-tab id and accept that a refresh starts a new conversation.\n */\n\nconst SESSION_KEY = \"nexor.chat.session_id\";\n\n/** Keep a conversation (session + transcript) this long after the last\n * activity, so a returning visitor can resume it. Reused by the transcript\n * cache in `./index`. The host (e.g. the landing widget) decides when to\n * auto-resume vs. prompt \"continue or start new\". */\nexport const SESSION_RETENTION_MS = 30 * 24 * 60 * 60 * 1000; // 30 days\n\n/**\n * Return the persisted session id, generating one on first use or once the\n * retention window has lapsed. Reading it slides the window forward.\n */\nexport function ensureSessionId(): string {\n const now = Date.now();\n try {\n const rec = readRecord();\n if (rec && now - rec.ts < SESSION_RETENTION_MS) {\n writeRecord(rec.id, now); // slide the window on activity\n return rec.id;\n }\n } catch {\n /* localStorage may be unavailable (private mode, sandboxed iframe). */\n }\n const id = `sess_${randomHex(16)}`;\n try {\n writeRecord(id, now);\n } catch {\n /* ignore — id is still valid for this page load. */\n }\n return id;\n}\n\n/** Bump the session's last-activity timestamp (slides the retention window). */\nexport function touchSession(): void {\n try {\n const rec = readRecord();\n if (rec) writeRecord(rec.id, Date.now());\n } catch {\n /* ignore */\n }\n}\n\nfunction readRecord(): { id: string; ts: number } | null {\n const raw = window.localStorage.getItem(SESSION_KEY);\n if (!raw) return null;\n try {\n const o = JSON.parse(raw);\n if (o && typeof o.id === \"string\" && typeof o.ts === \"number\") return o;\n } catch {\n /* legacy value was a plain \"sess_…\" string — adopt it below. */\n }\n if (raw.startsWith(\"sess_\")) return { id: raw, ts: Date.now() };\n return null;\n}\n\nfunction writeRecord(id: string, ts: number): void {\n window.localStorage.setItem(SESSION_KEY, JSON.stringify({ id, ts }));\n}\n\n/**\n * Hex string from cryptographically-strong randomness when available, with\n * a Math.random() fallback for very old browsers.\n */\nfunction randomHex(bytes: number): string {\n const arr = new Uint8Array(bytes);\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < bytes; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n","/**\n * Scoped CSS for the chat widget.\n *\n * Everything is namespaced under `.nexor-chat` so it cannot leak into the host\n * page, and properties that hosts commonly override (color, font, line-height)\n * are set explicitly here so the host's reset can't bleed in.\n *\n * Animations are GPU-friendly (transform + opacity only — no layout-trashing\n * properties like top/left) and use modest durations so the widget feels\n * responsive on low-end devices.\n */\nexport const widgetCss = (accent: string, accentText: string): string => `\n.nexor-chat,\n.nexor-chat * {\n box-sizing: border-box;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n}\n\n.nexor-chat {\n position: fixed;\n z-index: 2147483640;\n bottom: 20px;\n right: 20px;\n font-size: 14px;\n line-height: 1.4;\n color: #111;\n}\n\n.nexor-chat[data-position=\"bottom-left\"] {\n right: auto;\n left: 20px;\n}\n\n/* ── Launcher bubble ─────────────────────────────────────────────── */\n.nexor-chat__launcher {\n width: 56px;\n height: 56px;\n border-radius: 9999px;\n background: ${accent};\n color: ${accentText};\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 6px 18px rgba(0, 0, 0, 0.18);\n transition: transform 160ms cubic-bezier(.2,.7,.2,1.1),\n box-shadow 160ms ease,\n background 200ms ease;\n padding: 0;\n position: relative;\n animation: nexor-launcher-in 360ms cubic-bezier(.2,.7,.2,1.1) both;\n}\n.nexor-chat__launcher:hover {\n transform: translateY(-2px) scale(1.04);\n box-shadow: 0 10px 24px rgba(0, 0, 0, 0.24);\n}\n.nexor-chat__launcher:active {\n transform: translateY(0) scale(0.97);\n transition-duration: 80ms;\n}\n.nexor-chat__launcher:focus-visible {\n outline: 2px solid ${accent};\n outline-offset: 2px;\n}\n.nexor-chat[data-open=\"true\"] .nexor-chat__launcher {\n transform: scale(0.85);\n opacity: 0.75;\n}\n.nexor-chat__launcher svg { width: 24px; height: 24px; transition: transform 200ms ease; }\n.nexor-chat[data-open=\"true\"] .nexor-chat__launcher svg { transform: rotate(8deg); }\n\n.nexor-chat__unread {\n position: absolute;\n top: -4px;\n right: -4px;\n min-width: 18px;\n height: 18px;\n background: #ef4444;\n color: #fff;\n border-radius: 9999px;\n font-size: 11px;\n font-weight: 600;\n padding: 0 5px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid #fff;\n animation: nexor-pop-in 300ms cubic-bezier(.2,.7,.2,1.1) both;\n}\n\n@keyframes nexor-launcher-in {\n from { transform: translateY(20px) scale(0.6); opacity: 0; }\n to { transform: translateY(0) scale(1); opacity: 1; }\n}\n@keyframes nexor-pop-in {\n from { transform: scale(0); }\n to { transform: scale(1); }\n}\n\n/* ── Panel ────────────────────────────────────────────────────────── */\n.nexor-chat__panel {\n position: absolute;\n bottom: 72px;\n right: 0;\n width: 360px;\n max-width: calc(100vw - 32px);\n height: 540px;\n max-height: calc(100vh - 120px);\n background: #fff;\n border-radius: 14px;\n box-shadow: 0 24px 60px rgba(0, 0, 0, 0.22);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transform: translateY(14px) scale(0.96);\n opacity: 0;\n pointer-events: none;\n transition: transform 220ms cubic-bezier(.2,.7,.2,1.1),\n opacity 220ms ease;\n border: 1px solid rgba(0, 0, 0, 0.06);\n /* Use visibility so screen readers don't read collapsed content */\n visibility: hidden;\n}\n.nexor-chat[data-position=\"bottom-left\"] .nexor-chat__panel {\n right: auto;\n left: 0;\n}\n.nexor-chat[data-open=\"true\"] .nexor-chat__panel {\n transform: translateY(0) scale(1);\n opacity: 1;\n pointer-events: auto;\n visibility: visible;\n}\n\n.nexor-chat__header {\n background: ${accent};\n color: ${accentText};\n padding: 14px 16px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n.nexor-chat__title {\n font-weight: 600;\n font-size: 15px;\n margin: 0;\n}\n.nexor-chat__subtitle {\n font-size: 12px;\n opacity: 0.85;\n margin: 2px 0 0;\n}\n.nexor-chat__status-dot {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 9999px;\n background: #34d399;\n margin-right: 6px;\n vertical-align: 1px;\n animation: nexor-pulse 2.4s ease-in-out infinite;\n box-shadow: 0 0 0 0 rgba(52, 211, 153, 0.6);\n}\n@keyframes nexor-pulse {\n 0%, 100% { box-shadow: 0 0 0 0 rgba(52, 211, 153, 0.55); }\n 50% { box-shadow: 0 0 0 6px rgba(52, 211, 153, 0); }\n}\n.nexor-chat__close {\n background: transparent;\n border: none;\n color: inherit;\n cursor: pointer;\n padding: 4px;\n border-radius: 6px;\n opacity: 0.9;\n transition: background 140ms ease, transform 140ms ease;\n}\n.nexor-chat__close:hover { background: rgba(255,255,255,0.18); opacity: 1; }\n.nexor-chat__close:active { transform: scale(0.92); }\n.nexor-chat__close svg { width: 18px; height: 18px; display: block; }\n\n/* ── Body / messages ──────────────────────────────────────────────── */\n.nexor-chat__body {\n flex: 1;\n overflow-y: auto;\n padding: 14px;\n background: #f6f7f9;\n display: flex;\n flex-direction: column;\n gap: 8px;\n scroll-behavior: smooth;\n /* Prevent layout shift when scrollbar appears */\n scrollbar-gutter: stable;\n}\n.nexor-chat__body::-webkit-scrollbar { width: 6px; }\n.nexor-chat__body::-webkit-scrollbar-thumb {\n background: rgba(0,0,0,0.15);\n border-radius: 9999px;\n}\n\n.nexor-chat__msg {\n max-width: 80%;\n padding: 8px 12px;\n border-radius: 14px;\n white-space: pre-wrap;\n word-wrap: break-word;\n animation: nexor-msg-in 240ms cubic-bezier(.2,.7,.2,1.1) both;\n will-change: transform, opacity;\n}\n.nexor-chat__msg--bot {\n background: #fff;\n align-self: flex-start;\n border: 1px solid rgba(0,0,0,0.06);\n border-bottom-left-radius: 4px;\n box-shadow: 0 1px 2px rgba(0,0,0,0.04);\n}\n.nexor-chat__msg--user {\n background: ${accent};\n color: ${accentText};\n align-self: flex-end;\n border-bottom-right-radius: 4px;\n animation-name: nexor-msg-in-user;\n}\n.nexor-chat__msg--system {\n background: transparent;\n color: #6b7280;\n font-size: 12px;\n align-self: center;\n text-align: center;\n max-width: 100%;\n animation-name: nexor-fade-in;\n}\n.nexor-chat__msg-time {\n display: block;\n margin-top: 4px;\n font-size: 10px;\n line-height: 1;\n opacity: 0.55;\n text-align: right;\n}\n.nexor-chat__msg--bot .nexor-chat__msg-time { text-align: left; }\n\n@keyframes nexor-msg-in {\n from { transform: translateY(8px) scale(0.96); opacity: 0; }\n to { transform: translateY(0) scale(1); opacity: 1; }\n}\n@keyframes nexor-msg-in-user {\n from { transform: translateY(8px) translateX(8px) scale(0.96); opacity: 0; }\n to { transform: translateY(0) translateX(0) scale(1); opacity: 1; }\n}\n@keyframes nexor-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.nexor-chat__typing {\n align-self: flex-start;\n background: #fff;\n border: 1px solid rgba(0,0,0,0.06);\n border-radius: 14px;\n border-bottom-left-radius: 4px;\n padding: 10px 14px;\n display: inline-flex;\n gap: 4px;\n animation: nexor-msg-in 240ms cubic-bezier(.2,.7,.2,1.1) both;\n}\n.nexor-chat__typing span {\n width: 6px; height: 6px; border-radius: 9999px;\n background: #9ca3af;\n display: inline-block;\n animation: nexor-blink 1.2s infinite ease-in-out;\n}\n.nexor-chat__typing span:nth-child(2) { animation-delay: 0.15s; }\n.nexor-chat__typing span:nth-child(3) { animation-delay: 0.30s; }\n@keyframes nexor-blink {\n 0%, 60%, 100% { opacity: 0.3; transform: translateY(0); }\n 30% { opacity: 1; transform: translateY(-3px); }\n}\n\n/* ── Lead capture form ────────────────────────────────────────────── */\n.nexor-chat__capture {\n background: #fff;\n border: 1px solid rgba(0,0,0,0.06);\n border-radius: 12px;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 4px;\n animation: nexor-msg-in 280ms cubic-bezier(.2,.7,.2,1.1) both;\n box-shadow: 0 2px 8px rgba(0,0,0,0.05);\n}\n.nexor-chat__capture-label {\n font-size: 12px;\n color: #6b7280;\n margin: 0;\n}\n.nexor-chat__capture-row {\n display: flex;\n gap: 8px;\n}\n.nexor-chat__capture-row > * { flex: 1; }\n.nexor-chat__input,\n.nexor-chat__capture input {\n font: inherit;\n padding: 8px 10px;\n border: 1px solid #d1d5db;\n border-radius: 8px;\n background: #fff;\n color: #111;\n outline: none;\n width: 100%;\n transition: border-color 140ms ease, box-shadow 140ms ease;\n}\n.nexor-chat__input:focus,\n.nexor-chat__capture input:focus {\n border-color: ${accent};\n box-shadow: 0 0 0 3px ${accent}33;\n}\n.nexor-chat__capture-submit {\n background: ${accent};\n color: ${accentText};\n border: none;\n border-radius: 8px;\n padding: 8px 12px;\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n transition: transform 140ms ease, filter 140ms ease;\n}\n.nexor-chat__capture-submit:hover { filter: brightness(1.08); }\n.nexor-chat__capture-submit:active { transform: scale(0.97); }\n.nexor-chat__capture-submit[disabled] { opacity: 0.6; cursor: not-allowed; }\n\n/* ── Composer ─────────────────────────────────────────────────────── */\n.nexor-chat__composer {\n display: flex;\n gap: 8px;\n padding: 10px;\n background: #fff;\n border-top: 1px solid rgba(0,0,0,0.06);\n align-items: stretch;\n}\n.nexor-chat__send {\n background: ${accent};\n color: ${accentText};\n border: none;\n border-radius: 8px;\n padding: 0 14px;\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n min-width: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform 140ms ease, filter 140ms ease;\n}\n.nexor-chat__send:hover { filter: brightness(1.08); }\n.nexor-chat__send:active { transform: scale(0.95); }\n.nexor-chat__send[disabled] {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n.nexor-chat__send svg {\n width: 18px;\n height: 18px;\n transition: transform 200ms ease;\n}\n.nexor-chat__send:not([disabled]):hover svg { transform: translateX(2px); }\n\n/* Small spinner inside the send button while a turn is in flight */\n.nexor-chat__send--loading svg { display: none; }\n.nexor-chat__send--loading::after {\n content: \"\";\n width: 14px;\n height: 14px;\n border-radius: 9999px;\n border: 2px solid currentColor;\n border-top-color: transparent;\n animation: nexor-spin 700ms linear infinite;\n}\n@keyframes nexor-spin {\n to { transform: rotate(360deg); }\n}\n\n.nexor-chat__footer {\n text-align: center;\n font-size: 11px;\n color: #9ca3af;\n padding: 6px;\n background: #fff;\n border-top: 1px solid rgba(0,0,0,0.04);\n}\n.nexor-chat__footer a {\n color: inherit;\n text-decoration: none;\n font-weight: 600;\n}\n.nexor-chat__footer a:hover { text-decoration: underline; }\n\n/* Respect users who request reduced motion. */\n@media (prefers-reduced-motion: reduce) {\n .nexor-chat,\n .nexor-chat * {\n animation-duration: 0.001ms !important;\n transition-duration: 0.001ms !important;\n }\n .nexor-chat__status-dot { animation: none; }\n}\n`;\n","/**\n * Pure DOM construction for the chat widget.\n *\n * Each `build*` function returns a fully-formed sub-tree plus refs to the\n * inner nodes the orchestrator (initChat) wires events to. No side effects\n * here other than calling `injectStyles()` once per page.\n *\n * Why split this out from index.ts?\n * - The DOM layer doesn't depend on the NexorClient or sessionId — keeping\n * it pure makes the widget easy to reason about and easy to dry-run in\n * unit tests by mocking `document`.\n * - The orchestrator becomes a 150-line state machine instead of a\n * 600-line god-function.\n */\nimport { needsCapture, type ResolvedCfg } from \"./config\";\nimport { widgetCss } from \"./styles\";\n\nconst STYLE_ATTR = \"data-nexor-chat-styles\";\n\n// ─── Stylesheet (singleton per page) ───────────────────────────────────────\n\n/**\n * Inject the widget's stylesheet once per page. If multiple widgets mount,\n * they share styles and the first widget's accent colour wins. Two widgets\n * with different accents on one page is an unsupported use case.\n */\nexport function injectStyles(accent: string, accentText: string): void {\n if (document.querySelector(`style[${STYLE_ATTR}]`)) return;\n const style = document.createElement(\"style\");\n style.setAttribute(STYLE_ATTR, \"1\");\n style.textContent = widgetCss(accent, accentText);\n document.head.appendChild(style);\n}\n\n// ─── Launcher ──────────────────────────────────────────────────────────────\n\nexport interface LauncherRefs {\n el: HTMLButtonElement;\n badge: HTMLSpanElement;\n}\n\nexport function buildLauncher(): LauncherRefs {\n const el = document.createElement(\"button\");\n el.type = \"button\";\n el.className = \"nexor-chat__launcher\";\n el.setAttribute(\"aria-label\", \"Open chat\");\n // Speech-bubble icon — SVG rather than emoji for crisp rendering at any DPR.\n el.innerHTML = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M4 5.5C4 4.67 4.67 4 5.5 4h13c.83 0 1.5.67 1.5 1.5v9c0 .83-.67 1.5-1.5 1.5H9l-4 4V5.5Z\"\n stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\n </svg>\n `;\n const badge = document.createElement(\"span\");\n badge.className = \"nexor-chat__unread\";\n badge.style.display = \"none\";\n el.appendChild(badge);\n return { el, badge };\n}\n\n// ─── Panel ─────────────────────────────────────────────────────────────────\n\ntype CaptureField = \"first_name\" | \"last_name\" | \"email\" | \"phone\";\n\nexport interface PanelRefs {\n el: HTMLDivElement;\n closeBtn: HTMLButtonElement;\n body: HTMLDivElement;\n form: HTMLFormElement;\n input: HTMLInputElement;\n send: HTMLButtonElement;\n captureForm: HTMLFormElement | null;\n captureInputs: Partial<Record<CaptureField, HTMLInputElement>>;\n}\n\nexport function buildPanel(cfg: ResolvedCfg): PanelRefs {\n const el = document.createElement(\"div\");\n el.className = \"nexor-chat__panel\";\n el.setAttribute(\"role\", \"dialog\");\n el.setAttribute(\"aria-label\", cfg.title);\n\n const { header, closeBtn } = buildHeader(cfg);\n const { body, captureForm, captureInputs } = buildBody(cfg);\n const { form, input, send } = buildComposer();\n const footer = cfg.showBranding ? buildFooter() : null;\n\n el.appendChild(header);\n el.appendChild(body);\n el.appendChild(form);\n if (footer) el.appendChild(footer);\n\n return { el, closeBtn, body, form, input, send, captureForm, captureInputs };\n}\n\nfunction buildHeader(cfg: ResolvedCfg): {\n header: HTMLDivElement;\n closeBtn: HTMLButtonElement;\n} {\n const header = document.createElement(\"div\");\n header.className = \"nexor-chat__header\";\n\n // The status dot signals \"we're live and listening\" — purely cosmetic, but\n // a strong UX signal. Hidden from assistive tech because the title carries\n // the meaning already.\n const subtitleHtml = cfg.subtitle\n ? `<p class=\"nexor-chat__subtitle\">\n <span class=\"nexor-chat__status-dot\" aria-hidden=\"true\"></span>${escapeHtml(cfg.subtitle)}\n </p>`\n : \"\";\n\n header.innerHTML = `\n <div>\n <p class=\"nexor-chat__title\">${escapeHtml(cfg.title)}</p>\n ${subtitleHtml}\n </div>\n `;\n\n const closeBtn = document.createElement(\"button\");\n closeBtn.type = \"button\";\n closeBtn.className = \"nexor-chat__close\";\n closeBtn.setAttribute(\"aria-label\", \"Close chat\");\n closeBtn.innerHTML = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M6 6l12 12M6 18L18 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n </svg>\n `;\n header.appendChild(closeBtn);\n return { header, closeBtn };\n}\n\nfunction buildBody(cfg: ResolvedCfg): {\n body: HTMLDivElement;\n captureForm: HTMLFormElement | null;\n captureInputs: Partial<Record<CaptureField, HTMLInputElement>>;\n} {\n const body = document.createElement(\"div\");\n body.className = \"nexor-chat__body\";\n const captureInputs: Partial<Record<CaptureField, HTMLInputElement>> = {};\n let captureForm: HTMLFormElement | null = null;\n\n if (needsCapture(cfg)) {\n captureForm = buildCaptureForm(cfg, captureInputs);\n body.appendChild(captureForm);\n }\n return { body, captureForm, captureInputs };\n}\n\nfunction buildCaptureForm(\n cfg: ResolvedCfg,\n inputsOut: Partial<Record<CaptureField, HTMLInputElement>>,\n): HTMLFormElement {\n const form = document.createElement(\"form\");\n form.className = \"nexor-chat__capture\";\n form.noValidate = true;\n\n const label = document.createElement(\"p\");\n label.className = \"nexor-chat__capture-label\";\n label.textContent = cfg.capture.label;\n form.appendChild(label);\n\n const fields = cfg.capture.fields;\n\n // first_name + last_name share a row to feel like a single \"your name\" prompt.\n if (fields.includes(\"first_name\") || fields.includes(\"last_name\")) {\n const row = document.createElement(\"div\");\n row.className = \"nexor-chat__capture-row\";\n if (fields.includes(\"first_name\")) {\n inputsOut.first_name = makeInput(\"first_name\", \"First name\", \"text\", cfg.lead?.first_name);\n row.appendChild(inputsOut.first_name);\n }\n if (fields.includes(\"last_name\")) {\n inputsOut.last_name = makeInput(\"last_name\", \"Last name\", \"text\", cfg.lead?.last_name);\n row.appendChild(inputsOut.last_name);\n }\n if (row.childElementCount > 0) form.appendChild(row);\n }\n if (fields.includes(\"email\")) {\n inputsOut.email = makeInput(\"email\", \"Email\", \"email\", cfg.lead?.email);\n form.appendChild(inputsOut.email);\n }\n if (fields.includes(\"phone\")) {\n inputsOut.phone = makeInput(\"phone\", \"Phone\", \"tel\", cfg.lead?.phone);\n form.appendChild(inputsOut.phone);\n }\n\n const submit = document.createElement(\"button\");\n submit.type = \"submit\";\n submit.className = \"nexor-chat__capture-submit\";\n submit.textContent = cfg.capture.submitLabel;\n form.appendChild(submit);\n\n return form;\n}\n\nfunction buildComposer(): {\n form: HTMLFormElement;\n input: HTMLInputElement;\n send: HTMLButtonElement;\n} {\n const form = document.createElement(\"form\");\n form.className = \"nexor-chat__composer\";\n\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.className = \"nexor-chat__input\";\n input.placeholder = \"Type a message…\";\n input.autocomplete = \"off\";\n\n const send = document.createElement(\"button\");\n send.type = \"submit\";\n send.className = \"nexor-chat__send\";\n send.setAttribute(\"aria-label\", \"Send message\");\n // Paper-airplane icon — language-agnostic, recognisable, replaces \"Send\" text.\n send.innerHTML = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M3.4 11.2 20.5 4.3c.7-.3 1.4.4 1.1 1.1l-6.9 17.1c-.3.8-1.4.8-1.8 0L10 14l-7.5-3c-.8-.3-.8-1.5 0-1.8Z\"\n stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linejoin=\"round\" fill=\"currentColor\"/>\n </svg>\n `;\n\n form.appendChild(input);\n form.appendChild(send);\n return { form, input, send };\n}\n\nfunction buildFooter(): HTMLDivElement {\n const el = document.createElement(\"div\");\n el.className = \"nexor-chat__footer\";\n el.innerHTML = `Powered by <a href=\"https://www.getnexor.ai\" target=\"_blank\" rel=\"noopener noreferrer\">Nexor</a>`;\n return el;\n}\n\n// ─── Message bubbles ───────────────────────────────────────────────────────\n\nexport type MessageRole = \"user\" | \"bot\" | \"system\";\n\n/**\n * Build a chat bubble. `textContent` is used (never innerHTML) so user input\n * is rendered as plain text — no XSS surface from message payloads.\n */\nexport function buildMessage(\n role: MessageRole,\n text: string,\n ts?: number,\n locale?: string,\n): HTMLDivElement {\n const el = document.createElement(\"div\");\n el.className = `nexor-chat__msg nexor-chat__msg--${role}`;\n const body = document.createElement(\"span\");\n body.className = \"nexor-chat__msg-text\";\n body.textContent = text;\n el.appendChild(body);\n // Relative time under user/bot messages (not system notices). `data-ts` lets\n // the widget refresh the label as time passes (see index.ts).\n if (role !== \"system\" && ts) {\n const time = document.createElement(\"time\");\n time.className = \"nexor-chat__msg-time\";\n time.dataset.ts = String(ts);\n time.textContent = formatRelativeTime(ts, locale);\n el.appendChild(time);\n }\n return el;\n}\n\n/**\n * Relative within the last week (\"ahora\", \"hace 3 minutos\", \"hace 2 horas\",\n * \"ayer\"), then an absolute date (\"12 may\"). Localized via Intl; falls back to\n * a plain clock time if Intl.RelativeTimeFormat is unavailable.\n */\nexport function formatRelativeTime(\n ts: number,\n locale?: string,\n now: number = Date.now(),\n): string {\n try {\n const diff = Math.max(0, now - ts);\n const min = Math.round(diff / 60000);\n const hr = Math.round(diff / 3600000);\n const day = Math.round(diff / 86400000);\n const rtf = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n if (diff < 45000) return rtf.format(0, \"second\"); // \"ahora\" / \"now\"\n if (min < 60) return rtf.format(-min, \"minute\");\n if (hr < 24) return rtf.format(-hr, \"hour\");\n if (day < 7) return rtf.format(-day, \"day\"); // includes \"ayer\"/\"yesterday\"\n return new Date(ts).toLocaleDateString(locale, {\n day: \"numeric\",\n month: \"short\",\n });\n } catch {\n try {\n return new Date(ts).toLocaleTimeString(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n } catch {\n return \"\";\n }\n }\n}\n\n/** Three-dot typing indicator. Animation lives in styles.ts. */\nexport function buildTypingIndicator(): HTMLDivElement {\n const el = document.createElement(\"div\");\n el.className = \"nexor-chat__typing\";\n el.innerHTML = \"<span></span><span></span><span></span>\";\n return el;\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\nfunction makeInput(\n name: string,\n placeholder: string,\n type: string,\n value?: string,\n): HTMLInputElement {\n const i = document.createElement(\"input\");\n i.name = name;\n i.type = type;\n i.placeholder = placeholder;\n if (value) i.value = value;\n return i;\n}\n\n/**\n * Escape strings before interpolation into innerHTML. Used only for\n * SDK-controlled config values (title, subtitle) — user-typed messages\n * always go through textContent, which doesn't need escaping.\n */\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n}\n","/**\n * Chat widget orchestrator.\n *\n * Responsibilities (everything else lives in sibling files):\n * - apply defaults / validate options (`./config`)\n * - manage session id (`./session`)\n * - build DOM (`./dom`)\n * - inject CSS (`./dom`)\n *\n * What stays here:\n * - the open/close state machine\n * - wiring DOM events to the NexorClient.chat() call\n * - lead-capture submission flow\n * - the public ChatHandle returned to callers\n */\nimport type { NexorClient } from \"../client\";\nimport type { UUID } from \"../types\";\nimport {\n applyDefaults,\n needsCapture,\n type ChatInitOptions,\n type ChatHandle,\n type ResolvedCfg,\n} from \"./config\";\nimport { ensureSessionId, touchSession, SESSION_RETENTION_MS } from \"./session\";\nimport {\n buildLauncher,\n buildMessage,\n buildPanel,\n buildTypingIndicator,\n formatRelativeTime,\n injectStyles,\n type LauncherRefs,\n type MessageRole,\n type PanelRefs,\n} from \"./dom\";\n\n// Re-export the public types so consumers can `import type { ChatHandle } from \"@getnexorai/sdk\"`.\nexport type { ChatInitOptions, ChatHandle, ChatLeadCapture } from \"./config\";\n\n// Delay before showing the typing indicator. Short replies arrive before this\n// fires and never show the dots, which feels snappier than always flashing them.\nconst TYPING_DELAY_MS = 220;\n\n/**\n * Mount the chat widget and return a handle for programmatic control.\n *\n * @param client The NexorClient instance that will send turns.\n * @param options User-facing widget configuration. See ChatInitOptions.\n * @throws If called outside a browser, or without a workflowId.\n */\nexport function initChat(\n client: NexorClient,\n options: ChatInitOptions,\n): ChatHandle {\n ensureBrowser();\n if (!options || !options.workflowId) {\n throw new Error(\"Nexor SDK: initChat() requires `workflowId`.\");\n }\n\n const cfg = applyDefaults(options);\n injectStyles(cfg.accentColor, cfg.accentTextColor);\n\n const sessionId = ensureSessionId();\n const historyKey = `nexor.chat.history.${sessionId}`;\n const root = buildRoot(cfg);\n const launcher = buildLauncher();\n const panel = buildPanel(cfg);\n root.appendChild(launcher.el);\n root.appendChild(panel.el);\n (cfg.container ?? document.body).appendChild(root);\n\n // ─── State (closure-private — no external observers needed) ─────────────\n const state = {\n isOpen: false,\n unread: 0,\n leadId: undefined as UUID | undefined,\n captured: !needsCapture(cfg),\n pendingLead: { ...(cfg.lead ?? {}) },\n history: [] as Array<{ role: \"user\" | \"bot\"; text: string; ts?: number }>,\n };\n\n // ─── DOM event wiring ───────────────────────────────────────────────────\n launcher.el.addEventListener(\"click\", toggle);\n panel.closeBtn.addEventListener(\"click\", close);\n panel.form.addEventListener(\"submit\", onComposerSubmit);\n panel.captureForm?.addEventListener(\"submit\", onCaptureSubmit);\n\n syncComposerLock();\n\n // Restore a prior transcript (persisted up to SESSION_RETENTION_MS) so a\n // page reload keeps the conversation. Rendered into the (possibly closed)\n // panel; the greeting is then skipped because history is non-empty.\n const restored = loadHistory();\n if (restored.length) {\n state.history = restored;\n for (const m of restored) appendBubble(m.role === \"user\" ? \"user\" : \"bot\", m.text, m.ts);\n scrollToBottom();\n }\n\n if (cfg.openOnLoad) open();\n\n // ─── State machine ──────────────────────────────────────────────────────\n\n function open(): void {\n if (state.isOpen) return;\n state.isOpen = true;\n root.setAttribute(\"data-open\", \"true\");\n clearUnread();\n // Lazy-greet: first time the panel opens, drop the greeting message.\n if (state.history.length === 0 && cfg.greeting && state.captured) {\n appendBot(cfg.greeting);\n }\n panel.input.focus();\n cfg.onOpen?.();\n }\n\n function close(): void {\n if (!state.isOpen) return;\n state.isOpen = false;\n root.setAttribute(\"data-open\", \"false\");\n cfg.onClose?.();\n }\n\n function toggle(): void {\n state.isOpen ? close() : open();\n }\n\n // ─── Capture flow ───────────────────────────────────────────────────────\n\n function onCaptureSubmit(e: Event): void {\n e.preventDefault();\n const collected = readCaptureFields(panel);\n // Validate that all required fields are filled before unlocking the chat.\n const required = cfg.capture.fields;\n for (const f of required) {\n if (!collected[f]) {\n panel.captureInputs[f]?.focus();\n return;\n }\n }\n state.pendingLead = { ...state.pendingLead, ...collected };\n state.captured = true;\n panel.captureForm?.remove();\n syncComposerLock();\n panel.input.focus();\n // Greet once capture clears, so the greeting feels like a response to \"I'm ready\".\n if (cfg.greeting && state.history.length === 0) appendBot(cfg.greeting);\n }\n\n // ─── Composer / send (debounced + coalesced) ────────────────────────────\n //\n // Visitors fire several short messages in a row (WhatsApp-style). We mirror\n // the WhatsApp contract — batch at the source, one LLM call per batch — by\n // buffering rapid messages in the browser and POSTing them as a SINGLE\n // combined turn after a short quiet window. The composer never locks, so the\n // user can keep typing and sending freely; messages that land mid-request are\n // sent in the next batch.\n\n const send = {\n pending: [] as string[],\n timer: 0,\n typingTimer: 0,\n inFlight: false,\n typing: null as HTMLElement | null,\n };\n\n function onComposerSubmit(e: Event): void {\n e.preventDefault();\n const text = panel.input.value.trim();\n if (!text) return;\n panel.input.value = \"\";\n queueMessage(text);\n }\n\n function queueMessage(text: string): void {\n if (!state.captured) {\n panel.captureInputs.first_name?.focus();\n return;\n }\n appendUser(text);\n send.pending.push(text);\n scheduleFlush();\n }\n\n function scheduleFlush(): void {\n if (send.timer) window.clearTimeout(send.timer);\n send.timer = window.setTimeout(() => void flush(), cfg.debounceMs);\n }\n\n async function flush(): Promise<void> {\n if (send.inFlight || send.pending.length === 0) return;\n const batch = send.pending.splice(0, send.pending.length);\n const message = batch.join(\"\\n\");\n send.inFlight = true;\n\n // Delay the typing dots so fast replies don't flash them.\n send.typingTimer = window.setTimeout(() => {\n send.typing = appendNode(buildTypingIndicator());\n }, TYPING_DELAY_MS);\n\n try {\n const res = await client.chat({\n workflow_id: cfg.workflowId,\n session_id: sessionId,\n message,\n system_prompt: cfg.systemPrompt,\n client_prompt: cfg.clientPrompt,\n lead: Object.keys(state.pendingLead).length ? state.pendingLead : undefined,\n metadata: cfg.metadata,\n });\n if (res.lead_id && !state.leadId) {\n state.leadId = res.lead_id;\n cfg.onLeadCaptured?.(state.leadId);\n }\n const reply = (res.reply ?? \"\").trim();\n if (reply) {\n appendBot(reply);\n } else {\n // No text came back (empty completion / tool-only turn). Never render a\n // blank bubble — show the fallback and surface it to the host.\n appendSystem(cfg.errorText);\n cfg.onError?.(new Error(\"Nexor SDK: empty reply from server\"));\n }\n } catch (err) {\n appendSystem(cfg.errorText);\n cfg.onError?.(err as Error);\n } finally {\n window.clearTimeout(send.typingTimer);\n send.typing?.remove();\n send.typing = null;\n send.inFlight = false;\n panel.input.focus();\n // Anything queued while the request was in flight goes out next.\n if (send.pending.length) scheduleFlush();\n }\n }\n\n // ─── Message rendering ──────────────────────────────────────────────────\n\n function appendUser(text: string): void {\n const ts = Date.now();\n appendBubble(\"user\", text, ts);\n state.history.push({ role: \"user\", text, ts });\n saveHistory();\n cfg.onMessage?.({ role: \"user\", text });\n }\n\n function appendBot(text: string): void {\n const ts = Date.now();\n appendBubble(\"bot\", text, ts);\n state.history.push({ role: \"bot\", text, ts });\n saveHistory();\n if (!state.isOpen) bumpUnread();\n cfg.onMessage?.({ role: \"bot\", text });\n }\n\n // ─── Transcript persistence (survives reloads up to SESSION_RETENTION_MS) ──\n\n function saveHistory(): void {\n try {\n window.localStorage.setItem(\n historyKey,\n JSON.stringify({ ts: Date.now(), history: state.history }),\n );\n touchSession(); // keep the session alive in step with the transcript\n } catch {\n /* storage unavailable — in-memory history still works for this load. */\n }\n }\n\n function loadHistory(): Array<{ role: \"user\" | \"bot\"; text: string; ts?: number }> {\n try {\n const raw = window.localStorage.getItem(historyKey);\n if (!raw) return [];\n const o = JSON.parse(raw);\n if (!o || !Array.isArray(o.history)) return [];\n if (Date.now() - (o.ts || 0) > SESSION_RETENTION_MS) {\n window.localStorage.removeItem(historyKey);\n return [];\n }\n return o.history;\n } catch {\n return [];\n }\n }\n\n function appendSystem(text: string): void {\n appendBubble(\"system\", text);\n }\n\n function appendBubble(\n role: MessageRole,\n text: string,\n ts?: number,\n ): HTMLDivElement {\n return appendNode(buildMessage(role, text, ts, cfg.locale));\n }\n\n // Keep relative timestamps (\"hace 3 minutos\") fresh while the panel is open.\n const refreshTimer = window.setInterval(() => {\n panel.body\n .querySelectorAll<HTMLTimeElement>(\".nexor-chat__msg-time[data-ts]\")\n .forEach((el) => {\n const ts = Number(el.dataset.ts);\n if (ts) el.textContent = formatRelativeTime(ts, cfg.locale);\n });\n }, 60_000);\n\n function appendNode<T extends HTMLElement>(node: T): T {\n panel.body.appendChild(node);\n scrollToBottom();\n return node;\n }\n\n function scrollToBottom(): void {\n panel.body.scrollTop = panel.body.scrollHeight;\n }\n\n // ─── Unread badge ───────────────────────────────────────────────────────\n\n function bumpUnread(): void {\n state.unread++;\n launcher.badge.textContent = String(state.unread);\n launcher.badge.style.display = \"flex\";\n }\n function clearUnread(): void {\n state.unread = 0;\n launcher.badge.style.display = \"none\";\n }\n\n // ─── Composer lock (used while capture form is visible) ─────────────────\n\n function syncComposerLock(): void {\n const lock = !state.captured;\n panel.input.disabled = lock;\n panel.send.disabled = lock;\n panel.input.placeholder = lock\n ? \"Complete the form above to start…\"\n : \"Type a message…\";\n }\n\n // ─── Public handle ──────────────────────────────────────────────────────\n\n return {\n open,\n close,\n toggle,\n // Programmatic send goes through the same debounce/coalesce path. Resolves\n // immediately — the message is queued, not necessarily sent yet.\n send: (text: string) => {\n queueMessage(text);\n return Promise.resolve();\n },\n destroy: () => {\n if (send.timer) window.clearTimeout(send.timer);\n if (send.typingTimer) window.clearTimeout(send.typingTimer);\n window.clearInterval(refreshTimer);\n root.remove();\n },\n getSessionId: () => sessionId,\n };\n}\n\n// ─── Module-scoped helpers ────────────────────────────────────────────────\n\nfunction ensureBrowser(): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new Error(\"Nexor SDK: initChat() requires a browser environment.\");\n }\n}\n\nfunction buildRoot(cfg: ResolvedCfg): HTMLDivElement {\n const root = document.createElement(\"div\");\n root.className = \"nexor-chat\";\n root.setAttribute(\"data-position\", cfg.position);\n root.setAttribute(\"data-open\", \"false\");\n return root;\n}\n\nfunction readCaptureFields(panel: PanelRefs): Record<string, string> {\n const out: Record<string, string> = {};\n const inputs = panel.captureInputs;\n if (inputs.first_name) out.first_name = inputs.first_name.value.trim();\n if (inputs.last_name) out.last_name = inputs.last_name.value.trim();\n if (inputs.email) out.email = inputs.email.value.trim();\n if (inputs.phone) out.phone = inputs.phone.value.trim();\n return out;\n}\n\n// Used by initChat's launcher → keeps the ref objects in scope for TS.\ntype _Refs = LauncherRefs & PanelRefs;\nvoid (null as unknown as _Refs);\n","import { NexorClient } from \"./client\";\nimport { initChat as initChatImpl, type ChatInitOptions, type ChatHandle } from \"./chat\";\nimport type { ClientOptions } from \"./types\";\n\nexport { NexorClient } from \"./client\";\nexport {\n NexorError,\n NexorAPIError,\n NexorAuthError,\n NexorValidationError,\n NexorNetworkError,\n} from \"./errors\";\nexport * from \"./types\";\nexport type { ChatInitOptions, ChatHandle } from \"./chat\";\n\n/**\n * Singleton API. After `init({apiKey})`, call top-level helpers like\n * `createLead`, `getLead`, `initChat`, etc.\n *\n * import nexor from \"@getnexorai/sdk\";\n * nexor.init({ apiKey: \"nx_live_…\" });\n * await nexor.createLead({ first_name: \"Ada\", email: \"ada@example.com\" });\n *\n * For multi-tenant / server-side use where a singleton doesn't fit, instantiate\n * the underlying client directly:\n *\n * import { NexorClient } from \"@getnexorai/sdk\";\n * const client = new NexorClient({ apiKey });\n */\nexport function createClient(opts: ClientOptions): NexorClient {\n return new NexorClient(opts);\n}\n\nlet _client: NexorClient | null = null;\n\nfunction getClient(): NexorClient {\n if (!_client) {\n throw new Error(\n \"Nexor SDK: call `nexor.init({ apiKey })` before using the API.\",\n );\n }\n return _client;\n}\n\nfunction init(opts: ClientOptions): NexorClient {\n _client = new NexorClient(opts);\n return _client;\n}\n\nfunction isInitialized(): boolean {\n return _client !== null;\n}\n\nfunction reset(): void {\n _client = null;\n}\n\n/**\n * The default export — a ready-to-use, lazily-initialized singleton.\n *\n * Every method below proxies to the underlying NexorClient created by `init()`,\n * so the surface mirrors NexorClient one-for-one with no boilerplate.\n */\nexport const nexor = {\n init,\n isInitialized,\n reset,\n get client(): NexorClient {\n return getClient();\n },\n\n // Leads\n createLead: ((...args) => getClient().createLead(...args)) as NexorClient[\"createLead\"],\n createLeadsBulk: ((...args) =>\n getClient().createLeadsBulk(...args)) as NexorClient[\"createLeadsBulk\"],\n updateLead: ((...args) => getClient().updateLead(...args)) as NexorClient[\"updateLead\"],\n getLead: ((...args) => getClient().getLead(...args)) as NexorClient[\"getLead\"],\n getLeadHistory: ((...args) =>\n getClient().getLeadHistory(...args)) as NexorClient[\"getLeadHistory\"],\n isLeadPaused: ((...args) => getClient().isLeadPaused(...args)) as NexorClient[\"isLeadPaused\"],\n stopAutomation: ((...args) => getClient().stopAutomation(...args)) as NexorClient[\"stopAutomation\"],\n resumeAutomation: ((...args) =>\n getClient().resumeAutomation(...args)) as NexorClient[\"resumeAutomation\"],\n syncLeadTags: ((...args) => getClient().syncLeadTags(...args)) as NexorClient[\"syncLeadTags\"],\n listLeadMeetings: ((...args) =>\n getClient().listLeadMeetings(...args)) as NexorClient[\"listLeadMeetings\"],\n\n // Workflows / Campaigns / Templates\n listWorkflows: ((...args) => getClient().listWorkflows(...args)) as NexorClient[\"listWorkflows\"],\n listCampaigns: ((...args) => getClient().listCampaigns(...args)) as NexorClient[\"listCampaigns\"],\n listTemplates: ((...args) => getClient().listTemplates(...args)) as NexorClient[\"listTemplates\"],\n\n // Messages\n sendMessage: ((...args) => getClient().sendMessage(...args)) as NexorClient[\"sendMessage\"],\n\n // Meetings\n createMeeting: ((...args) => getClient().createMeeting(...args)) as NexorClient[\"createMeeting\"],\n createMeetingNotes: ((...args) =>\n getClient().createMeetingNotes(...args)) as NexorClient[\"createMeetingNotes\"],\n\n // Chat widget\n initChat: (options: ChatInitOptions): ChatHandle =>\n initChatImpl(getClient(), options),\n};\n\nexport default nexor;\n","/**\n * IIFE entry — bundles everything into a single global `Nexor` for script-tag\n * embeds. Each method of the singleton is re-exported so that the IIFE format\n * exposes them directly on the global (e.g. `Nexor.init`, `Nexor.initChat`)\n * without consumers having to dig into `.default`.\n *\n * <script src=\"https://unpkg.com/@getnexor/sdk/dist/nexor.iife.js\"></script>\n * <script>\n * Nexor.init({ apiKey: \"nx_live_…\" });\n * Nexor.initChat({ workflowId: \"…\" });\n * </script>\n */\nimport { nexor } from \"./index\";\n\nexport {\n NexorClient,\n NexorError,\n NexorAPIError,\n NexorAuthError,\n NexorValidationError,\n NexorNetworkError,\n createClient,\n} from \"./index\";\n\nexport const init = nexor.init;\nexport const isInitialized = nexor.isInitialized;\nexport const reset = nexor.reset;\nexport const initChat = nexor.initChat;\n\n// Lead methods\nexport const createLead = nexor.createLead;\nexport const createLeadsBulk = nexor.createLeadsBulk;\nexport const updateLead = nexor.updateLead;\nexport const getLead = nexor.getLead;\nexport const getLeadHistory = nexor.getLeadHistory;\nexport const isLeadPaused = nexor.isLeadPaused;\nexport const stopAutomation = nexor.stopAutomation;\nexport const resumeAutomation = nexor.resumeAutomation;\nexport const syncLeadTags = nexor.syncLeadTags;\nexport const listLeadMeetings = nexor.listLeadMeetings;\n\n// Workflows / Campaigns / Templates\nexport const listWorkflows = nexor.listWorkflows;\nexport const listCampaigns = nexor.listCampaigns;\nexport const listTemplates = nexor.listTemplates;\n\n// Messages\nexport const sendMessage = nexor.sendMessage;\n\n// Meetings\nexport const createMeeting = nexor.createMeeting;\nexport const createMeetingNotes = nexor.createMeetingNotes;\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/client.ts","../src/chat/config.ts","../src/chat/session.ts","../src/chat/styles.ts","../src/chat/dom.ts","../src/chat/index.ts","../src/index.ts","../src/browser.ts"],"names":["NexorError","message","NexorAPIError","opts","_a","statusToCode","NexorAuthError","NexorValidationError","NexorNetworkError","cause","status","DEFAULT_BASE_URL","DEFAULT_TIMEOUT_MS","DEFAULT_MAX_RETRIES","SDK_VERSION","resolveConfig","_b","_c","_d","fetchImpl","ua","stripTrailingSlash","request","cfg","req","_e","_f","_g","url","buildUrl","headers","body","timeoutMs","lastErr","attempt","controller","externalSignal","onAbort","timeoutId","res","requestId","text","e","errBody","safeJson","pickMessage","err","makeError","shouldRetry","sleep","backoffMs","isAbort","b","txt","ra","n","ms","r","s","baseUrl","path","query","p","qs","encodeQuery","parts","k","v","PUBLIC_PREFIX","NexorClient","input","options","inputs","leadId","updates","params","channel","applyDefaults","o","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","_r","_s","needsCapture","have","f","SESSION_KEY","ensureSessionId","now","rec","readRecord","writeRecord","id","randomHex","touchSession","raw","ts","bytes","arr","i","widgetCss","accent","accentText","STYLE_ATTR","injectStyles","style","buildLauncher","el","badge","buildPanel","header","closeBtn","buildHeader","captureForm","captureInputs","buildBody","form","send","buildComposer","footer","buildFooter","subtitleHtml","escapeHtml","buildCaptureForm","inputsOut","label","fields","row","makeInput","submit","buildMessage","role","locale","time","formatRelativeTime","diff","min","hr","day","rtf","buildTypingIndicator","name","placeholder","type","value","TYPING_DELAY_MS","initChat","client","ensureBrowser","sessionId","historyKey","root","buildRoot","launcher","panel","state","toggle","close","onComposerSubmit","onCaptureSubmit","syncComposerLock","restored","loadHistory","m","appendBubble","scrollToBottom","open","clearUnread","appendBot","collected","readCaptureFields","required","queueMessage","appendUser","scheduleFlush","flush","appendNode","reply","appendSystem","saveHistory","bumpUnread","refreshTimer","node","lock","out","createClient","_client","getClient","init","isInitialized","reset","nexor","args","createLead","createLeadsBulk","updateLead","getLead","getLeadHistory","isLeadPaused","stopAutomation","resumeAutomation","syncLeadTags","listLeadMeetings","listWorkflows","listCampaigns","listTemplates","sendMessage","createMeeting","createMeetingNotes"],"mappings":"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","file":"nexor.iife.js","sourcesContent":["export class NexorError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NexorError\";\n }\n}\n\nexport class NexorAPIError extends NexorError {\n status: number;\n code: string;\n body: unknown;\n requestId?: string;\n\n constructor(opts: {\n status: number;\n code?: string;\n message: string;\n body?: unknown;\n requestId?: string;\n }) {\n super(opts.message);\n this.name = \"NexorAPIError\";\n this.status = opts.status;\n this.code = opts.code ?? statusToCode(opts.status);\n this.body = opts.body;\n this.requestId = opts.requestId;\n }\n}\n\nexport class NexorAuthError extends NexorAPIError {\n constructor(opts: { message: string; body?: unknown; requestId?: string }) {\n super({ status: 401, code: \"unauthorized\", ...opts });\n this.name = \"NexorAuthError\";\n }\n}\n\nexport class NexorValidationError extends NexorAPIError {\n constructor(opts: { message: string; body?: unknown; requestId?: string }) {\n super({ status: 400, code: \"validation_error\", ...opts });\n this.name = \"NexorValidationError\";\n }\n}\n\nexport class NexorNetworkError extends NexorError {\n cause?: unknown;\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = \"NexorNetworkError\";\n this.cause = cause;\n }\n}\n\nfunction statusToCode(status: number): string {\n if (status === 400) return \"validation_error\";\n if (status === 401) return \"unauthorized\";\n if (status === 403) return \"forbidden\";\n if (status === 404) return \"not_found\";\n if (status === 409) return \"conflict\";\n if (status === 422) return \"unprocessable_entity\";\n if (status === 429) return \"rate_limited\";\n if (status >= 500) return \"server_error\";\n return \"http_error\";\n}\n","import {\n NexorAPIError,\n NexorAuthError,\n NexorNetworkError,\n NexorValidationError,\n} from \"./errors\";\nimport type { ClientOptions, RequestOptions } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api.getnexor.ai\";\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst SDK_VERSION = \"0.1.0\";\n\nexport interface ResolvedConfig {\n apiKey: string;\n baseUrl: string;\n timeoutMs: number;\n maxRetries: number;\n fetchImpl: typeof fetch;\n userAgent: string;\n}\n\nexport function resolveConfig(opts: ClientOptions): ResolvedConfig {\n if (!opts || typeof opts.apiKey !== \"string\" || opts.apiKey.trim() === \"\") {\n throw new Error(\n \"Nexor SDK: `apiKey` is required. Get one in the dashboard at https://app.getnexor.ai\",\n );\n }\n const fetchImpl =\n opts.fetch ??\n (typeof globalThis !== \"undefined\" && typeof globalThis.fetch === \"function\"\n ? globalThis.fetch.bind(globalThis)\n : (undefined as unknown as typeof fetch));\n if (!fetchImpl) {\n throw new Error(\n \"Nexor SDK: no global fetch found. Pass a `fetch` implementation via init() or upgrade to Node 18+.\",\n );\n }\n const ua = `nexor-sdk-js/${SDK_VERSION}${opts.userAgentSuffix ? ` ${opts.userAgentSuffix}` : \"\"}`;\n return {\n apiKey: opts.apiKey.trim(),\n baseUrl: stripTrailingSlash(opts.baseUrl ?? DEFAULT_BASE_URL),\n timeoutMs: opts.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n maxRetries: opts.maxRetries ?? DEFAULT_MAX_RETRIES,\n fetchImpl,\n userAgent: ua,\n };\n}\n\ninterface HttpRequest {\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n path: string;\n query?: Record<string, string | number | boolean | string[] | undefined | null>;\n body?: unknown;\n options?: RequestOptions;\n}\n\nexport async function request<T>(\n cfg: ResolvedConfig,\n req: HttpRequest,\n): Promise<T> {\n const url = buildUrl(cfg.baseUrl, req.path, req.query);\n const headers: Record<string, string> = {\n \"X-API-Key\": cfg.apiKey,\n Accept: \"application/json\",\n \"User-Agent\": cfg.userAgent,\n };\n if (req.options?.idempotencyKey) {\n headers[\"Idempotency-Key\"] = req.options.idempotencyKey;\n }\n let body: BodyInit | undefined;\n if (req.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(req.body);\n }\n\n const timeoutMs = req.options?.timeoutMs ?? cfg.timeoutMs;\n let lastErr: unknown;\n\n for (let attempt = 0; attempt <= cfg.maxRetries; attempt++) {\n const controller = new AbortController();\n const externalSignal = req.options?.signal;\n const onAbort = () => controller.abort();\n if (externalSignal) {\n if (externalSignal.aborted) controller.abort();\n else externalSignal.addEventListener(\"abort\", onAbort);\n }\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const res = await cfg.fetchImpl(url, {\n method: req.method,\n headers,\n body,\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n externalSignal?.removeEventListener(\"abort\", onAbort);\n\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n\n if (res.ok) {\n if (res.status === 204) return undefined as T;\n const text = await res.text();\n if (!text) return undefined as T;\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new NexorAPIError({\n status: res.status,\n message: \"Failed to parse JSON response\",\n body: text,\n requestId,\n });\n }\n }\n\n // Non-2xx: parse and throw a typed error.\n const errBody = await safeJson(res);\n const message = pickMessage(errBody) ?? `HTTP ${res.status}`;\n const err = makeError(res.status, message, errBody, requestId);\n\n // Retry on 429 + 5xx with exponential backoff.\n if (shouldRetry(res.status) && attempt < cfg.maxRetries) {\n await sleep(backoffMs(attempt, res));\n lastErr = err;\n continue;\n }\n throw err;\n } catch (err) {\n clearTimeout(timeoutId);\n externalSignal?.removeEventListener(\"abort\", onAbort);\n if (err instanceof NexorAPIError) throw err;\n const isAbort =\n err instanceof Error &&\n (err.name === \"AbortError\" || /abort/i.test(err.message));\n if (isAbort && externalSignal?.aborted) throw err;\n // Network or timeout: retry.\n lastErr = err;\n if (attempt < cfg.maxRetries) {\n await sleep(backoffMs(attempt));\n continue;\n }\n throw new NexorNetworkError(\n isAbort ? `Request timed out after ${timeoutMs}ms` : `Network error: ${(err as Error)?.message ?? String(err)}`,\n err,\n );\n }\n }\n throw lastErr ?? new NexorNetworkError(\"Request failed\");\n}\n\nfunction makeError(\n status: number,\n message: string,\n body: unknown,\n requestId?: string,\n): NexorAPIError {\n if (status === 401 || status === 403) {\n return new NexorAuthError({ message, body, requestId });\n }\n if (status === 400 || status === 422) {\n return new NexorValidationError({ message, body, requestId });\n }\n return new NexorAPIError({ status, message, body, requestId });\n}\n\nfunction pickMessage(body: unknown): string | undefined {\n if (!body || typeof body !== \"object\") return undefined;\n const b = body as Record<string, unknown>;\n if (typeof b.message === \"string\") return b.message;\n if (typeof b.error === \"string\") return b.error;\n return undefined;\n}\n\nasync function safeJson(res: Response): Promise<unknown> {\n try {\n const txt = await res.text();\n if (!txt) return null;\n try {\n return JSON.parse(txt);\n } catch {\n return txt;\n }\n } catch {\n return null;\n }\n}\n\nfunction shouldRetry(status: number): boolean {\n return status === 429 || (status >= 500 && status <= 599);\n}\n\nfunction backoffMs(attempt: number, res?: Response): number {\n if (res) {\n const ra = res.headers.get(\"retry-after\");\n if (ra) {\n const n = Number(ra);\n if (!Number.isNaN(n) && n > 0) return Math.min(n * 1000, 10_000);\n }\n }\n const base = 300 * 2 ** attempt;\n return base + Math.floor(Math.random() * 200);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction stripTrailingSlash(s: string): string {\n return s.endsWith(\"/\") ? s.slice(0, -1) : s;\n}\n\nfunction buildUrl(\n baseUrl: string,\n path: string,\n query?: HttpRequest[\"query\"],\n): string {\n const p = path.startsWith(\"/\") ? path : `/${path}`;\n const qs = encodeQuery(query);\n return `${baseUrl}${p}${qs ? `?${qs}` : \"\"}`;\n}\n\nfunction encodeQuery(query?: HttpRequest[\"query\"]): string {\n if (!query) return \"\";\n const parts: string[] = [];\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n if (Array.isArray(v)) {\n if (v.length === 0) continue;\n parts.push(`${encodeURIComponent(k)}=${encodeURIComponent(v.join(\",\"))}`);\n } else {\n parts.push(`${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`);\n }\n }\n return parts.join(\"&\");\n}\n","import { request, resolveConfig, type ResolvedConfig } from \"./http\";\nimport type {\n AutomationInput,\n Campaign,\n ClientOptions,\n CreateLeadBulkResponse,\n CreateLeadInput,\n CreateLeadResponse,\n CreateMeetingInput,\n GetLeadHistoryParams,\n GetLeadHistoryResponse,\n GetLeadResponse,\n IsPausedResponse,\n Lead,\n ListTemplatesParams,\n MeetingNotesInput,\n RequestOptions,\n ResumeAutomationInput,\n SendMessageInput,\n SyncTagsInput,\n SyncTagsResponse,\n UUID,\n WhatsAppTemplate,\n Workflow,\n} from \"./types\";\n\nconst PUBLIC_PREFIX = \"/api/public\";\n\n/**\n * Low-level Nexor API client.\n *\n * Most users should call `init()` / `createClient()` instead of instantiating\n * this directly, but it's exported for advanced cases (DI, mocking).\n */\nexport class NexorClient {\n private cfg: ResolvedConfig;\n\n constructor(opts: ClientOptions) {\n this.cfg = resolveConfig(opts);\n }\n\n // ─── Leads ───────────────────────────────────────────────────────────────\n\n /** Create a single lead, optionally assigning it to a workflow. */\n createLead(\n input: CreateLeadInput,\n options?: RequestOptions,\n ): Promise<CreateLeadResponse> {\n return request<CreateLeadResponse>(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/leads`,\n body: input,\n options,\n });\n }\n\n /** Create many leads in one request (max 1000). */\n createLeadsBulk(\n inputs: CreateLeadInput[],\n options?: RequestOptions,\n ): Promise<CreateLeadBulkResponse> {\n return request<CreateLeadBulkResponse>(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/leads`,\n body: inputs,\n options,\n });\n }\n\n /** Update an existing lead. metadata is shallow-merged server-side. */\n updateLead(\n leadId: UUID,\n updates: Partial<CreateLeadInput>,\n options?: RequestOptions,\n ): Promise<{ success: true; lead: Lead }> {\n return request(this.cfg, {\n method: \"PUT\",\n path: `${PUBLIC_PREFIX}/leads/${encodeURIComponent(leadId)}`,\n body: updates,\n options,\n });\n }\n\n /** Fetch a lead with its captured variables and per-channel engagement. */\n getLead(leadId: UUID, options?: RequestOptions): Promise<GetLeadResponse> {\n return request<GetLeadResponse>(this.cfg, {\n method: \"GET\",\n path: `${PUBLIC_PREFIX}/leads/${encodeURIComponent(leadId)}`,\n options,\n });\n }\n\n /** Full chronological history: messages, transcripts, activity. */\n getLeadHistory(\n leadId: UUID,\n params: GetLeadHistoryParams = {},\n options?: RequestOptions,\n ): Promise<GetLeadHistoryResponse> {\n const channel = Array.isArray(params.channel)\n ? params.channel\n : params.channel\n ? [params.channel]\n : undefined;\n return request<GetLeadHistoryResponse>(this.cfg, {\n method: \"GET\",\n path: `${PUBLIC_PREFIX}/leads/${encodeURIComponent(leadId)}/history`,\n query: { channel, limit: params.limit, offset: params.offset },\n options,\n });\n }\n\n /** Has automation been paused (human takeover) for this lead? */\n isLeadPaused(\n leadId: UUID,\n params: { workflow_id?: UUID } = {},\n options?: RequestOptions,\n ): Promise<IsPausedResponse> {\n return request<IsPausedResponse>(this.cfg, {\n method: \"GET\",\n path: `${PUBLIC_PREFIX}/leads/${encodeURIComponent(leadId)}/is_paused`,\n query: { workflow_id: params.workflow_id },\n options,\n });\n }\n\n /** Pause automation (engage human takeover) on a specific workflow run. */\n stopAutomation(\n leadId: UUID,\n input: AutomationInput,\n options?: RequestOptions,\n ): Promise<unknown> {\n return request(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/leads/${encodeURIComponent(leadId)}/automation/stop`,\n body: input,\n options,\n });\n }\n\n /** Resume automation; pass resume_cadence: true to restart scheduled touches. */\n resumeAutomation(\n leadId: UUID,\n input: ResumeAutomationInput,\n options?: RequestOptions,\n ): Promise<unknown> {\n return request(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/leads/${encodeURIComponent(leadId)}/automation/resume`,\n body: input,\n options,\n });\n }\n\n /**\n * Replace the tag set on a lead (identified by lead_id OR email).\n * Tags missing from the input are unassigned; new tags are find-or-created.\n */\n syncLeadTags(\n input: SyncTagsInput,\n options?: RequestOptions,\n ): Promise<SyncTagsResponse> {\n return request<SyncTagsResponse>(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/leads/tags`,\n body: input,\n options,\n });\n }\n\n /** All meetings on file for a lead (optionally filter by status). */\n listLeadMeetings(\n leadId: UUID,\n params: { status?: string | string[] } = {},\n options?: RequestOptions,\n ): Promise<unknown> {\n const status = Array.isArray(params.status)\n ? params.status.join(\",\")\n : params.status;\n return request(this.cfg, {\n method: \"GET\",\n path: `${PUBLIC_PREFIX}/leads/${encodeURIComponent(leadId)}/meetings`,\n query: { status },\n options,\n });\n }\n\n // ─── Workflows / Campaigns / Templates ──────────────────────────────────\n\n /** Active workflows in your account. */\n listWorkflows(\n options?: RequestOptions,\n ): Promise<{ success: true; workflows: Workflow[] }> {\n return request(this.cfg, {\n method: \"GET\",\n path: `${PUBLIC_PREFIX}/workflows`,\n options,\n });\n }\n\n /** Campaigns in your account. */\n listCampaigns(\n options?: RequestOptions,\n ): Promise<{ success: true; campaigns: Campaign[] }> {\n return request(this.cfg, {\n method: \"GET\",\n path: `${PUBLIC_PREFIX}/campaigns`,\n options,\n });\n }\n\n /** Approved WhatsApp templates. */\n listTemplates(\n params: ListTemplatesParams = {},\n options?: RequestOptions,\n ): Promise<{ success: true; templates: WhatsAppTemplate[] }> {\n return request(this.cfg, {\n method: \"GET\",\n path: `${PUBLIC_PREFIX}/templates`,\n query: { status: params.status, category: params.category },\n options,\n });\n }\n\n // ─── Messages ───────────────────────────────────────────────────────────\n\n /** Send a one-off message (WhatsApp/email) or trigger a call. */\n sendMessage(\n input: SendMessageInput,\n options?: RequestOptions,\n ): Promise<unknown> {\n return request(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/messages`,\n body: input,\n options,\n });\n }\n\n // ─── Meetings ───────────────────────────────────────────────────────────\n\n /** Log a booked meeting against an existing lead (matched by email). */\n createMeeting(\n input: CreateMeetingInput,\n options?: RequestOptions,\n ): Promise<unknown> {\n return request(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/meetings`,\n body: input,\n options,\n });\n }\n\n /** Push a note-taker transcript / summary / action items to a meeting. */\n createMeetingNotes(\n input: MeetingNotesInput,\n options?: RequestOptions,\n ): Promise<unknown> {\n return request(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/meeting-notes`,\n body: input,\n options,\n });\n }\n\n // ─── Chat (used by initChat widget) ─────────────────────────────────────\n\n /**\n * Send a turn in a browser-embedded chat session. Backed by\n * POST /api/public/chat on the Nexor API.\n *\n * Most users will not call this directly — `initChat()` handles it.\n */\n chat(\n input: {\n workflow_id: UUID;\n session_id: string;\n message: string;\n system_prompt?: string;\n client_prompt?: string;\n lead?: {\n first_name?: string;\n last_name?: string;\n email?: string;\n phone?: string;\n metadata?: Record<string, unknown>;\n };\n metadata?: Record<string, unknown>;\n },\n options?: RequestOptions,\n ): Promise<{\n success: true;\n reply: string;\n session_id: string;\n lead_id?: UUID;\n workflow_run_id?: UUID;\n }> {\n return request(this.cfg, {\n method: \"POST\",\n path: `${PUBLIC_PREFIX}/chat`,\n body: input,\n options,\n });\n }\n}\n","/**\n * Chat widget configuration types + defaults.\n *\n * Kept separate from the widget's runtime code so other modules (and the\n * top-level `nexor.initChat()` re-export) can pull types without dragging in\n * the DOM construction code.\n */\nimport type { UUID } from \"../types\";\n\n// ─── Public option / handle types ──────────────────────────────────────────\n\nexport interface ChatLeadCapture {\n /** Which fields to ask for before chatting. Defaults to [\"first_name\", \"email\"]. */\n fields?: Array<\"first_name\" | \"last_name\" | \"email\" | \"phone\">;\n /** \"before\" gates chat behind the form; \"skip\" never asks. Default \"before\". */\n mode?: \"before\" | \"skip\";\n /** Label rendered above the form. */\n label?: string;\n /** Submit button label. */\n submitLabel?: string;\n}\n\nexport interface ChatInitOptions {\n /** Workflow that handles this chat conversation. Required. */\n workflowId: UUID;\n\n // ── Identity / branding ──\n title?: string;\n subtitle?: string;\n greeting?: string;\n /** Shown when a turn fails or the server returns no reply. */\n errorText?: string;\n /** BCP-47 locale for timestamps (e.g. \"es\", \"en-US\"). Defaults to the browser. */\n locale?: string;\n /** Hex colour for bubble + accents. Defaults to #111827. */\n accentColor?: string;\n /** Text colour rendered on top of the accent. Defaults to white. */\n accentTextColor?: string;\n /** Show the \"Powered by Nexor\" footer. Defaults to true. */\n showBranding?: boolean;\n\n // ── Behaviour ──\n position?: \"bottom-right\" | \"bottom-left\";\n /** Auto-open the panel on first load. Defaults to false. */\n openOnLoad?: boolean;\n /** Coalesce rapid-fire messages: wait this many ms of quiet, then send the\n * buffered messages as one combined turn. Defaults to 700. 0 = per message. */\n debounceMs?: number;\n /** Append the widget to a custom element. Defaults to document.body. */\n container?: HTMLElement;\n\n // ── Prompt overrides forwarded to the agent for THIS widget instance ──\n systemPrompt?: string;\n clientPrompt?: string;\n\n // ── Lead linking ──\n /** Pre-known lead info (e.g. a logged-in user). Skips capture if complete. */\n lead?: {\n first_name?: string;\n last_name?: string;\n email?: string;\n phone?: string;\n metadata?: Record<string, unknown>;\n };\n capture?: ChatLeadCapture;\n /** Arbitrary metadata passed with each turn (page URL, UTM, …). */\n metadata?: Record<string, unknown>;\n\n // ── Callbacks ──\n onOpen?: () => void;\n onClose?: () => void;\n onMessage?: (msg: { role: \"user\" | \"bot\"; text: string }) => void;\n onLeadCaptured?: (leadId: UUID) => void;\n onError?: (err: Error) => void;\n}\n\nexport interface ChatHandle {\n open(): void;\n close(): void;\n toggle(): void;\n /** Programmatically send a user message. */\n send(text: string): Promise<void>;\n /** Tear down the widget and remove all DOM. */\n destroy(): void;\n /** Read the current session id (auto-generated on first open). */\n getSessionId(): string;\n}\n\n// ─── Internal resolved-config type ─────────────────────────────────────────\n\nexport interface ResolvedCfg {\n workflowId: UUID;\n title: string;\n subtitle: string;\n greeting: string;\n errorText: string;\n locale?: string;\n accentColor: string;\n accentTextColor: string;\n showBranding: boolean;\n position: \"bottom-right\" | \"bottom-left\";\n openOnLoad: boolean;\n debounceMs: number;\n container?: HTMLElement;\n systemPrompt?: string;\n clientPrompt?: string;\n lead?: ChatInitOptions[\"lead\"];\n capture: Required<ChatLeadCapture>;\n metadata?: Record<string, unknown>;\n onOpen?: () => void;\n onClose?: () => void;\n onMessage?: (msg: { role: \"user\" | \"bot\"; text: string }) => void;\n onLeadCaptured?: (leadId: UUID) => void;\n onError?: (err: Error) => void;\n}\n\n/**\n * Normalize user-provided options into a complete config object with every\n * field set. Downstream code reads from ResolvedCfg and never has to deal\n * with `undefined` for branding / behaviour fields.\n */\nexport function applyDefaults(o: ChatInitOptions): ResolvedCfg {\n return {\n workflowId: o.workflowId,\n title: o.title ?? \"Chat with us\",\n subtitle: o.subtitle ?? \"We typically reply in a few minutes\",\n greeting: o.greeting ?? \"Hi there! 👋 How can we help?\",\n errorText:\n o.errorText ?? \"Sorry, something went wrong. Please try again in a moment.\",\n locale:\n o.locale ??\n (typeof navigator !== \"undefined\" ? navigator.language : undefined),\n accentColor: o.accentColor ?? \"#111827\",\n accentTextColor: o.accentTextColor ?? \"#ffffff\",\n showBranding: o.showBranding ?? true,\n position: o.position ?? \"bottom-right\",\n openOnLoad: o.openOnLoad ?? false,\n debounceMs: o.debounceMs ?? 700,\n container: o.container,\n systemPrompt: o.systemPrompt,\n clientPrompt: o.clientPrompt,\n lead: o.lead,\n capture: {\n fields: o.capture?.fields ?? [\"first_name\", \"email\"],\n mode: o.capture?.mode ?? \"before\",\n label: o.capture?.label ?? \"Tell us a bit about you to get started:\",\n submitLabel: o.capture?.submitLabel ?? \"Start chat\",\n },\n metadata: o.metadata,\n onOpen: o.onOpen,\n onClose: o.onClose,\n onMessage: o.onMessage,\n onLeadCaptured: o.onLeadCaptured,\n onError: o.onError,\n };\n}\n\n/**\n * Does this widget need to show a lead-capture form before chat?\n * - \"skip\" mode → no\n * - Pre-known lead already covers every required field → no\n * - Otherwise → yes\n */\nexport function needsCapture(cfg: ResolvedCfg): boolean {\n if (cfg.capture.mode === \"skip\") return false;\n if (cfg.lead) {\n const have = cfg.lead;\n return cfg.capture.fields.some((f) => !have[f]);\n }\n return true;\n}\n","/**\n * Browser-side session-id management for the chat widget.\n *\n * The session id links anonymous turns to the same lead across page reloads.\n * It's persisted in localStorage with a last-activity timestamp and a sliding\n * retention window: a conversation is kept for at least SESSION_RETENTION_MS\n * after the last activity, after which a fresh session (and transcript) starts.\n * If storage is unavailable (private mode, sandboxed iframe) we fall back to a\n * per-tab id and accept that a refresh starts a new conversation.\n */\n\nconst SESSION_KEY = \"nexor.chat.session_id\";\n\n/** Keep a conversation (session + transcript) this long after the last\n * activity, so a returning visitor can resume it. Reused by the transcript\n * cache in `./index`. The host (e.g. the landing widget) decides when to\n * auto-resume vs. prompt \"continue or start new\". */\nexport const SESSION_RETENTION_MS = 30 * 24 * 60 * 60 * 1000; // 30 days\n\n/**\n * Return the persisted session id, generating one on first use or once the\n * retention window has lapsed. Reading it slides the window forward.\n */\nexport function ensureSessionId(): string {\n const now = Date.now();\n try {\n const rec = readRecord();\n if (rec && now - rec.ts < SESSION_RETENTION_MS) {\n writeRecord(rec.id, now); // slide the window on activity\n return rec.id;\n }\n } catch {\n /* localStorage may be unavailable (private mode, sandboxed iframe). */\n }\n const id = `sess_${randomHex(16)}`;\n try {\n writeRecord(id, now);\n } catch {\n /* ignore — id is still valid for this page load. */\n }\n return id;\n}\n\n/** Bump the session's last-activity timestamp (slides the retention window). */\nexport function touchSession(): void {\n try {\n const rec = readRecord();\n if (rec) writeRecord(rec.id, Date.now());\n } catch {\n /* ignore */\n }\n}\n\nfunction readRecord(): { id: string; ts: number } | null {\n const raw = window.localStorage.getItem(SESSION_KEY);\n if (!raw) return null;\n try {\n const o = JSON.parse(raw);\n if (o && typeof o.id === \"string\" && typeof o.ts === \"number\") return o;\n } catch {\n /* legacy value was a plain \"sess_…\" string — adopt it below. */\n }\n if (raw.startsWith(\"sess_\")) return { id: raw, ts: Date.now() };\n return null;\n}\n\nfunction writeRecord(id: string, ts: number): void {\n window.localStorage.setItem(SESSION_KEY, JSON.stringify({ id, ts }));\n}\n\n/**\n * Hex string from cryptographically-strong randomness when available, with\n * a Math.random() fallback for very old browsers.\n */\nfunction randomHex(bytes: number): string {\n const arr = new Uint8Array(bytes);\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n crypto.getRandomValues(arr);\n } else {\n for (let i = 0; i < bytes; i++) arr[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(arr, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n","/**\n * Scoped CSS for the chat widget.\n *\n * Everything is namespaced under `.nexor-chat` so it cannot leak into the host\n * page, and properties that hosts commonly override (color, font, line-height)\n * are set explicitly here so the host's reset can't bleed in.\n *\n * Animations are GPU-friendly (transform + opacity only — no layout-trashing\n * properties like top/left) and use modest durations so the widget feels\n * responsive on low-end devices.\n */\nexport const widgetCss = (accent: string, accentText: string): string => `\n.nexor-chat,\n.nexor-chat * {\n box-sizing: border-box;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n}\n\n.nexor-chat {\n position: fixed;\n z-index: 2147483640;\n bottom: 20px;\n right: 20px;\n font-size: 14px;\n line-height: 1.4;\n color: #111;\n}\n\n.nexor-chat[data-position=\"bottom-left\"] {\n right: auto;\n left: 20px;\n}\n\n/* ── Launcher bubble ─────────────────────────────────────────────── */\n.nexor-chat__launcher {\n width: 56px;\n height: 56px;\n border-radius: 9999px;\n background: ${accent};\n color: ${accentText};\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 6px 18px rgba(0, 0, 0, 0.18);\n transition: transform 160ms cubic-bezier(.2,.7,.2,1.1),\n box-shadow 160ms ease,\n background 200ms ease;\n padding: 0;\n position: relative;\n animation: nexor-launcher-in 360ms cubic-bezier(.2,.7,.2,1.1) both;\n}\n.nexor-chat__launcher:hover {\n transform: translateY(-2px) scale(1.04);\n box-shadow: 0 10px 24px rgba(0, 0, 0, 0.24);\n}\n.nexor-chat__launcher:active {\n transform: translateY(0) scale(0.97);\n transition-duration: 80ms;\n}\n.nexor-chat__launcher:focus-visible {\n outline: 2px solid ${accent};\n outline-offset: 2px;\n}\n.nexor-chat[data-open=\"true\"] .nexor-chat__launcher {\n transform: scale(0.85);\n opacity: 0.75;\n}\n.nexor-chat__launcher svg { width: 24px; height: 24px; transition: transform 200ms ease; }\n.nexor-chat[data-open=\"true\"] .nexor-chat__launcher svg { transform: rotate(8deg); }\n\n.nexor-chat__unread {\n position: absolute;\n top: -4px;\n right: -4px;\n min-width: 18px;\n height: 18px;\n background: #ef4444;\n color: #fff;\n border-radius: 9999px;\n font-size: 11px;\n font-weight: 600;\n padding: 0 5px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid #fff;\n animation: nexor-pop-in 300ms cubic-bezier(.2,.7,.2,1.1) both;\n}\n\n@keyframes nexor-launcher-in {\n from { transform: translateY(20px) scale(0.6); opacity: 0; }\n to { transform: translateY(0) scale(1); opacity: 1; }\n}\n@keyframes nexor-pop-in {\n from { transform: scale(0); }\n to { transform: scale(1); }\n}\n\n/* ── Panel ────────────────────────────────────────────────────────── */\n.nexor-chat__panel {\n position: absolute;\n bottom: 72px;\n right: 0;\n width: 360px;\n max-width: calc(100vw - 32px);\n height: 540px;\n max-height: calc(100vh - 120px);\n background: #fff;\n border-radius: 14px;\n box-shadow: 0 24px 60px rgba(0, 0, 0, 0.22);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transform: translateY(14px) scale(0.96);\n opacity: 0;\n pointer-events: none;\n transition: transform 220ms cubic-bezier(.2,.7,.2,1.1),\n opacity 220ms ease;\n border: 1px solid rgba(0, 0, 0, 0.06);\n /* Use visibility so screen readers don't read collapsed content */\n visibility: hidden;\n}\n.nexor-chat[data-position=\"bottom-left\"] .nexor-chat__panel {\n right: auto;\n left: 0;\n}\n.nexor-chat[data-open=\"true\"] .nexor-chat__panel {\n transform: translateY(0) scale(1);\n opacity: 1;\n pointer-events: auto;\n visibility: visible;\n}\n\n.nexor-chat__header {\n background: ${accent};\n color: ${accentText};\n padding: 14px 16px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n.nexor-chat__title {\n font-weight: 600;\n font-size: 15px;\n margin: 0;\n}\n.nexor-chat__subtitle {\n font-size: 12px;\n opacity: 0.85;\n margin: 2px 0 0;\n}\n.nexor-chat__status-dot {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 9999px;\n background: #34d399;\n margin-right: 6px;\n vertical-align: 1px;\n animation: nexor-pulse 2.4s ease-in-out infinite;\n box-shadow: 0 0 0 0 rgba(52, 211, 153, 0.6);\n}\n@keyframes nexor-pulse {\n 0%, 100% { box-shadow: 0 0 0 0 rgba(52, 211, 153, 0.55); }\n 50% { box-shadow: 0 0 0 6px rgba(52, 211, 153, 0); }\n}\n.nexor-chat__close {\n background: transparent;\n border: none;\n color: inherit;\n cursor: pointer;\n padding: 4px;\n border-radius: 6px;\n opacity: 0.9;\n transition: background 140ms ease, transform 140ms ease;\n}\n.nexor-chat__close:hover { background: rgba(255,255,255,0.18); opacity: 1; }\n.nexor-chat__close:active { transform: scale(0.92); }\n.nexor-chat__close svg { width: 18px; height: 18px; display: block; }\n\n/* ── Body / messages ──────────────────────────────────────────────── */\n.nexor-chat__body {\n flex: 1;\n overflow-y: auto;\n padding: 14px;\n background: #f6f7f9;\n display: flex;\n flex-direction: column;\n gap: 8px;\n scroll-behavior: smooth;\n /* Prevent layout shift when scrollbar appears */\n scrollbar-gutter: stable;\n}\n.nexor-chat__body::-webkit-scrollbar { width: 6px; }\n.nexor-chat__body::-webkit-scrollbar-thumb {\n background: rgba(0,0,0,0.15);\n border-radius: 9999px;\n}\n\n.nexor-chat__msg {\n max-width: 80%;\n padding: 8px 12px;\n border-radius: 14px;\n white-space: pre-wrap;\n word-wrap: break-word;\n animation: nexor-msg-in 240ms cubic-bezier(.2,.7,.2,1.1) both;\n will-change: transform, opacity;\n}\n.nexor-chat__msg--bot {\n background: #fff;\n align-self: flex-start;\n border: 1px solid rgba(0,0,0,0.06);\n border-bottom-left-radius: 4px;\n box-shadow: 0 1px 2px rgba(0,0,0,0.04);\n}\n.nexor-chat__msg--user {\n background: ${accent};\n color: ${accentText};\n align-self: flex-end;\n border-bottom-right-radius: 4px;\n animation-name: nexor-msg-in-user;\n}\n.nexor-chat__msg--system {\n background: transparent;\n color: #6b7280;\n font-size: 12px;\n align-self: center;\n text-align: center;\n max-width: 100%;\n animation-name: nexor-fade-in;\n}\n.nexor-chat__msg-time {\n display: block;\n margin-top: 4px;\n font-size: 10px;\n line-height: 1;\n opacity: 0.55;\n text-align: right;\n}\n.nexor-chat__msg--bot .nexor-chat__msg-time { text-align: left; }\n\n@keyframes nexor-msg-in {\n from { transform: translateY(8px) scale(0.96); opacity: 0; }\n to { transform: translateY(0) scale(1); opacity: 1; }\n}\n@keyframes nexor-msg-in-user {\n from { transform: translateY(8px) translateX(8px) scale(0.96); opacity: 0; }\n to { transform: translateY(0) translateX(0) scale(1); opacity: 1; }\n}\n@keyframes nexor-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.nexor-chat__typing {\n align-self: flex-start;\n background: #fff;\n border: 1px solid rgba(0,0,0,0.06);\n border-radius: 14px;\n border-bottom-left-radius: 4px;\n padding: 10px 14px;\n display: inline-flex;\n gap: 4px;\n animation: nexor-msg-in 240ms cubic-bezier(.2,.7,.2,1.1) both;\n}\n.nexor-chat__typing span {\n width: 6px; height: 6px; border-radius: 9999px;\n background: #9ca3af;\n display: inline-block;\n animation: nexor-blink 1.2s infinite ease-in-out;\n}\n.nexor-chat__typing span:nth-child(2) { animation-delay: 0.15s; }\n.nexor-chat__typing span:nth-child(3) { animation-delay: 0.30s; }\n@keyframes nexor-blink {\n 0%, 60%, 100% { opacity: 0.3; transform: translateY(0); }\n 30% { opacity: 1; transform: translateY(-3px); }\n}\n\n/* ── Lead capture form ────────────────────────────────────────────── */\n.nexor-chat__capture {\n background: #fff;\n border: 1px solid rgba(0,0,0,0.06);\n border-radius: 12px;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 4px;\n animation: nexor-msg-in 280ms cubic-bezier(.2,.7,.2,1.1) both;\n box-shadow: 0 2px 8px rgba(0,0,0,0.05);\n}\n.nexor-chat__capture-label {\n font-size: 12px;\n color: #6b7280;\n margin: 0;\n}\n.nexor-chat__capture-row {\n display: flex;\n gap: 8px;\n}\n.nexor-chat__capture-row > * { flex: 1; }\n.nexor-chat__input,\n.nexor-chat__capture input {\n font: inherit;\n padding: 8px 10px;\n border: 1px solid #d1d5db;\n border-radius: 8px;\n background: #fff;\n color: #111;\n outline: none;\n width: 100%;\n transition: border-color 140ms ease, box-shadow 140ms ease;\n}\n.nexor-chat__input:focus,\n.nexor-chat__capture input:focus {\n border-color: ${accent};\n box-shadow: 0 0 0 3px ${accent}33;\n}\n.nexor-chat__capture-submit {\n background: ${accent};\n color: ${accentText};\n border: none;\n border-radius: 8px;\n padding: 8px 12px;\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n transition: transform 140ms ease, filter 140ms ease;\n}\n.nexor-chat__capture-submit:hover { filter: brightness(1.08); }\n.nexor-chat__capture-submit:active { transform: scale(0.97); }\n.nexor-chat__capture-submit[disabled] { opacity: 0.6; cursor: not-allowed; }\n\n/* ── Composer ─────────────────────────────────────────────────────── */\n.nexor-chat__composer {\n display: flex;\n gap: 8px;\n padding: 10px;\n background: #fff;\n border-top: 1px solid rgba(0,0,0,0.06);\n align-items: stretch;\n}\n.nexor-chat__send {\n background: ${accent};\n color: ${accentText};\n border: none;\n border-radius: 8px;\n padding: 0 14px;\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n min-width: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform 140ms ease, filter 140ms ease;\n}\n.nexor-chat__send:hover { filter: brightness(1.08); }\n.nexor-chat__send:active { transform: scale(0.95); }\n.nexor-chat__send[disabled] {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n.nexor-chat__send svg {\n width: 18px;\n height: 18px;\n transition: transform 200ms ease;\n}\n.nexor-chat__send:not([disabled]):hover svg { transform: translateX(2px); }\n\n/* Small spinner inside the send button while a turn is in flight */\n.nexor-chat__send--loading svg { display: none; }\n.nexor-chat__send--loading::after {\n content: \"\";\n width: 14px;\n height: 14px;\n border-radius: 9999px;\n border: 2px solid currentColor;\n border-top-color: transparent;\n animation: nexor-spin 700ms linear infinite;\n}\n@keyframes nexor-spin {\n to { transform: rotate(360deg); }\n}\n\n.nexor-chat__footer {\n text-align: center;\n font-size: 11px;\n color: #9ca3af;\n padding: 6px;\n background: #fff;\n border-top: 1px solid rgba(0,0,0,0.04);\n}\n.nexor-chat__footer a {\n color: inherit;\n text-decoration: none;\n font-weight: 600;\n}\n.nexor-chat__footer a:hover { text-decoration: underline; }\n\n/* Respect users who request reduced motion. */\n@media (prefers-reduced-motion: reduce) {\n .nexor-chat,\n .nexor-chat * {\n animation-duration: 0.001ms !important;\n transition-duration: 0.001ms !important;\n }\n .nexor-chat__status-dot { animation: none; }\n}\n`;\n","/**\n * Pure DOM construction for the chat widget.\n *\n * Each `build*` function returns a fully-formed sub-tree plus refs to the\n * inner nodes the orchestrator (initChat) wires events to. No side effects\n * here other than calling `injectStyles()` once per page.\n *\n * Why split this out from index.ts?\n * - The DOM layer doesn't depend on the NexorClient or sessionId — keeping\n * it pure makes the widget easy to reason about and easy to dry-run in\n * unit tests by mocking `document`.\n * - The orchestrator becomes a 150-line state machine instead of a\n * 600-line god-function.\n */\nimport { needsCapture, type ResolvedCfg } from \"./config\";\nimport { widgetCss } from \"./styles\";\n\nconst STYLE_ATTR = \"data-nexor-chat-styles\";\n\n// ─── Stylesheet (singleton per page) ───────────────────────────────────────\n\n/**\n * Inject the widget's stylesheet once per page. If multiple widgets mount,\n * they share styles and the first widget's accent colour wins. Two widgets\n * with different accents on one page is an unsupported use case.\n */\nexport function injectStyles(accent: string, accentText: string): void {\n if (document.querySelector(`style[${STYLE_ATTR}]`)) return;\n const style = document.createElement(\"style\");\n style.setAttribute(STYLE_ATTR, \"1\");\n style.textContent = widgetCss(accent, accentText);\n document.head.appendChild(style);\n}\n\n// ─── Launcher ──────────────────────────────────────────────────────────────\n\nexport interface LauncherRefs {\n el: HTMLButtonElement;\n badge: HTMLSpanElement;\n}\n\nexport function buildLauncher(): LauncherRefs {\n const el = document.createElement(\"button\");\n el.type = \"button\";\n el.className = \"nexor-chat__launcher\";\n el.setAttribute(\"aria-label\", \"Open chat\");\n // Speech-bubble icon — SVG rather than emoji for crisp rendering at any DPR.\n el.innerHTML = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M4 5.5C4 4.67 4.67 4 5.5 4h13c.83 0 1.5.67 1.5 1.5v9c0 .83-.67 1.5-1.5 1.5H9l-4 4V5.5Z\"\n stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\n </svg>\n `;\n const badge = document.createElement(\"span\");\n badge.className = \"nexor-chat__unread\";\n badge.style.display = \"none\";\n el.appendChild(badge);\n return { el, badge };\n}\n\n// ─── Panel ─────────────────────────────────────────────────────────────────\n\ntype CaptureField = \"first_name\" | \"last_name\" | \"email\" | \"phone\";\n\nexport interface PanelRefs {\n el: HTMLDivElement;\n closeBtn: HTMLButtonElement;\n body: HTMLDivElement;\n form: HTMLFormElement;\n input: HTMLInputElement;\n send: HTMLButtonElement;\n captureForm: HTMLFormElement | null;\n captureInputs: Partial<Record<CaptureField, HTMLInputElement>>;\n}\n\nexport function buildPanel(cfg: ResolvedCfg): PanelRefs {\n const el = document.createElement(\"div\");\n el.className = \"nexor-chat__panel\";\n el.setAttribute(\"role\", \"dialog\");\n el.setAttribute(\"aria-label\", cfg.title);\n\n const { header, closeBtn } = buildHeader(cfg);\n const { body, captureForm, captureInputs } = buildBody(cfg);\n const { form, input, send } = buildComposer();\n const footer = cfg.showBranding ? buildFooter() : null;\n\n el.appendChild(header);\n el.appendChild(body);\n el.appendChild(form);\n if (footer) el.appendChild(footer);\n\n return { el, closeBtn, body, form, input, send, captureForm, captureInputs };\n}\n\nfunction buildHeader(cfg: ResolvedCfg): {\n header: HTMLDivElement;\n closeBtn: HTMLButtonElement;\n} {\n const header = document.createElement(\"div\");\n header.className = \"nexor-chat__header\";\n\n // The status dot signals \"we're live and listening\" — purely cosmetic, but\n // a strong UX signal. Hidden from assistive tech because the title carries\n // the meaning already.\n const subtitleHtml = cfg.subtitle\n ? `<p class=\"nexor-chat__subtitle\">\n <span class=\"nexor-chat__status-dot\" aria-hidden=\"true\"></span>${escapeHtml(cfg.subtitle)}\n </p>`\n : \"\";\n\n header.innerHTML = `\n <div>\n <p class=\"nexor-chat__title\">${escapeHtml(cfg.title)}</p>\n ${subtitleHtml}\n </div>\n `;\n\n const closeBtn = document.createElement(\"button\");\n closeBtn.type = \"button\";\n closeBtn.className = \"nexor-chat__close\";\n closeBtn.setAttribute(\"aria-label\", \"Close chat\");\n closeBtn.innerHTML = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M6 6l12 12M6 18L18 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n </svg>\n `;\n header.appendChild(closeBtn);\n return { header, closeBtn };\n}\n\nfunction buildBody(cfg: ResolvedCfg): {\n body: HTMLDivElement;\n captureForm: HTMLFormElement | null;\n captureInputs: Partial<Record<CaptureField, HTMLInputElement>>;\n} {\n const body = document.createElement(\"div\");\n body.className = \"nexor-chat__body\";\n const captureInputs: Partial<Record<CaptureField, HTMLInputElement>> = {};\n let captureForm: HTMLFormElement | null = null;\n\n if (needsCapture(cfg)) {\n captureForm = buildCaptureForm(cfg, captureInputs);\n body.appendChild(captureForm);\n }\n return { body, captureForm, captureInputs };\n}\n\nfunction buildCaptureForm(\n cfg: ResolvedCfg,\n inputsOut: Partial<Record<CaptureField, HTMLInputElement>>,\n): HTMLFormElement {\n const form = document.createElement(\"form\");\n form.className = \"nexor-chat__capture\";\n form.noValidate = true;\n\n const label = document.createElement(\"p\");\n label.className = \"nexor-chat__capture-label\";\n label.textContent = cfg.capture.label;\n form.appendChild(label);\n\n const fields = cfg.capture.fields;\n\n // first_name + last_name share a row to feel like a single \"your name\" prompt.\n if (fields.includes(\"first_name\") || fields.includes(\"last_name\")) {\n const row = document.createElement(\"div\");\n row.className = \"nexor-chat__capture-row\";\n if (fields.includes(\"first_name\")) {\n inputsOut.first_name = makeInput(\"first_name\", \"First name\", \"text\", cfg.lead?.first_name);\n row.appendChild(inputsOut.first_name);\n }\n if (fields.includes(\"last_name\")) {\n inputsOut.last_name = makeInput(\"last_name\", \"Last name\", \"text\", cfg.lead?.last_name);\n row.appendChild(inputsOut.last_name);\n }\n if (row.childElementCount > 0) form.appendChild(row);\n }\n if (fields.includes(\"email\")) {\n inputsOut.email = makeInput(\"email\", \"Email\", \"email\", cfg.lead?.email);\n form.appendChild(inputsOut.email);\n }\n if (fields.includes(\"phone\")) {\n inputsOut.phone = makeInput(\"phone\", \"Phone\", \"tel\", cfg.lead?.phone);\n form.appendChild(inputsOut.phone);\n }\n\n const submit = document.createElement(\"button\");\n submit.type = \"submit\";\n submit.className = \"nexor-chat__capture-submit\";\n submit.textContent = cfg.capture.submitLabel;\n form.appendChild(submit);\n\n return form;\n}\n\nfunction buildComposer(): {\n form: HTMLFormElement;\n input: HTMLInputElement;\n send: HTMLButtonElement;\n} {\n const form = document.createElement(\"form\");\n form.className = \"nexor-chat__composer\";\n\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.className = \"nexor-chat__input\";\n input.placeholder = \"Type a message…\";\n input.autocomplete = \"off\";\n\n const send = document.createElement(\"button\");\n send.type = \"submit\";\n send.className = \"nexor-chat__send\";\n send.setAttribute(\"aria-label\", \"Send message\");\n // Paper-airplane icon — language-agnostic, recognisable, replaces \"Send\" text.\n send.innerHTML = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M3.4 11.2 20.5 4.3c.7-.3 1.4.4 1.1 1.1l-6.9 17.1c-.3.8-1.4.8-1.8 0L10 14l-7.5-3c-.8-.3-.8-1.5 0-1.8Z\"\n stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linejoin=\"round\" fill=\"currentColor\"/>\n </svg>\n `;\n\n form.appendChild(input);\n form.appendChild(send);\n return { form, input, send };\n}\n\nfunction buildFooter(): HTMLDivElement {\n const el = document.createElement(\"div\");\n el.className = \"nexor-chat__footer\";\n el.innerHTML = `Powered by <a href=\"https://www.getnexor.ai\" target=\"_blank\" rel=\"noopener noreferrer\">Nexor</a>`;\n return el;\n}\n\n// ─── Message bubbles ───────────────────────────────────────────────────────\n\nexport type MessageRole = \"user\" | \"bot\" | \"system\";\n\n/**\n * Build a chat bubble. `textContent` is used (never innerHTML) so user input\n * is rendered as plain text — no XSS surface from message payloads.\n */\nexport function buildMessage(\n role: MessageRole,\n text: string,\n ts?: number,\n locale?: string,\n): HTMLDivElement {\n const el = document.createElement(\"div\");\n el.className = `nexor-chat__msg nexor-chat__msg--${role}`;\n const body = document.createElement(\"span\");\n body.className = \"nexor-chat__msg-text\";\n body.textContent = text;\n el.appendChild(body);\n // Relative time under user/bot messages (not system notices). `data-ts` lets\n // the widget refresh the label as time passes (see index.ts).\n if (role !== \"system\" && ts) {\n const time = document.createElement(\"time\");\n time.className = \"nexor-chat__msg-time\";\n time.dataset.ts = String(ts);\n time.textContent = formatRelativeTime(ts, locale);\n el.appendChild(time);\n }\n return el;\n}\n\n/**\n * Relative within the last week (\"ahora\", \"hace 3 minutos\", \"hace 2 horas\",\n * \"ayer\"), then an absolute date (\"12 may\"). Localized via Intl; falls back to\n * a plain clock time if Intl.RelativeTimeFormat is unavailable.\n */\nexport function formatRelativeTime(\n ts: number,\n locale?: string,\n now: number = Date.now(),\n): string {\n try {\n const diff = Math.max(0, now - ts);\n const min = Math.round(diff / 60000);\n const hr = Math.round(diff / 3600000);\n const day = Math.round(diff / 86400000);\n const rtf = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n if (diff < 45000) return rtf.format(0, \"second\"); // \"ahora\" / \"now\"\n if (min < 60) return rtf.format(-min, \"minute\");\n if (hr < 24) return rtf.format(-hr, \"hour\");\n if (day < 7) return rtf.format(-day, \"day\"); // includes \"ayer\"/\"yesterday\"\n return new Date(ts).toLocaleDateString(locale, {\n day: \"numeric\",\n month: \"short\",\n });\n } catch {\n try {\n return new Date(ts).toLocaleTimeString(locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n } catch {\n return \"\";\n }\n }\n}\n\n/** Three-dot typing indicator. Animation lives in styles.ts. */\nexport function buildTypingIndicator(): HTMLDivElement {\n const el = document.createElement(\"div\");\n el.className = \"nexor-chat__typing\";\n el.innerHTML = \"<span></span><span></span><span></span>\";\n return el;\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\nfunction makeInput(\n name: string,\n placeholder: string,\n type: string,\n value?: string,\n): HTMLInputElement {\n const i = document.createElement(\"input\");\n i.name = name;\n i.type = type;\n i.placeholder = placeholder;\n if (value) i.value = value;\n return i;\n}\n\n/**\n * Escape strings before interpolation into innerHTML. Used only for\n * SDK-controlled config values (title, subtitle) — user-typed messages\n * always go through textContent, which doesn't need escaping.\n */\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n}\n","/**\n * Chat widget orchestrator.\n *\n * Responsibilities (everything else lives in sibling files):\n * - apply defaults / validate options (`./config`)\n * - manage session id (`./session`)\n * - build DOM (`./dom`)\n * - inject CSS (`./dom`)\n *\n * What stays here:\n * - the open/close state machine\n * - wiring DOM events to the NexorClient.chat() call\n * - lead-capture submission flow\n * - the public ChatHandle returned to callers\n */\nimport type { NexorClient } from \"../client\";\nimport type { UUID } from \"../types\";\nimport {\n applyDefaults,\n needsCapture,\n type ChatInitOptions,\n type ChatHandle,\n type ResolvedCfg,\n} from \"./config\";\nimport { ensureSessionId, touchSession, SESSION_RETENTION_MS } from \"./session\";\nimport {\n buildLauncher,\n buildMessage,\n buildPanel,\n buildTypingIndicator,\n formatRelativeTime,\n injectStyles,\n type LauncherRefs,\n type MessageRole,\n type PanelRefs,\n} from \"./dom\";\n\n// Re-export the public types so consumers can `import type { ChatHandle } from \"@getnexorai/sdk\"`.\nexport type { ChatInitOptions, ChatHandle, ChatLeadCapture } from \"./config\";\n\n// Delay before showing the typing indicator. Short replies arrive before this\n// fires and never show the dots, which feels snappier than always flashing them.\nconst TYPING_DELAY_MS = 220;\n\n/**\n * Mount the chat widget and return a handle for programmatic control.\n *\n * @param client The NexorClient instance that will send turns.\n * @param options User-facing widget configuration. See ChatInitOptions.\n * @throws If called outside a browser, or without a workflowId.\n */\nexport function initChat(\n client: NexorClient,\n options: ChatInitOptions,\n): ChatHandle {\n ensureBrowser();\n if (!options || !options.workflowId) {\n throw new Error(\"Nexor SDK: initChat() requires `workflowId`.\");\n }\n\n const cfg = applyDefaults(options);\n injectStyles(cfg.accentColor, cfg.accentTextColor);\n\n const sessionId = ensureSessionId();\n const historyKey = `nexor.chat.history.${sessionId}`;\n const root = buildRoot(cfg);\n const launcher = buildLauncher();\n const panel = buildPanel(cfg);\n root.appendChild(launcher.el);\n root.appendChild(panel.el);\n (cfg.container ?? document.body).appendChild(root);\n\n // ─── State (closure-private — no external observers needed) ─────────────\n const state = {\n isOpen: false,\n unread: 0,\n leadId: undefined as UUID | undefined,\n captured: !needsCapture(cfg),\n pendingLead: { ...(cfg.lead ?? {}) },\n history: [] as Array<{ role: \"user\" | \"bot\"; text: string; ts?: number }>,\n };\n\n // ─── DOM event wiring ───────────────────────────────────────────────────\n launcher.el.addEventListener(\"click\", toggle);\n panel.closeBtn.addEventListener(\"click\", close);\n panel.form.addEventListener(\"submit\", onComposerSubmit);\n panel.captureForm?.addEventListener(\"submit\", onCaptureSubmit);\n\n syncComposerLock();\n\n // Restore a prior transcript (persisted up to SESSION_RETENTION_MS) so a\n // page reload keeps the conversation. Rendered into the (possibly closed)\n // panel; the greeting is then skipped because history is non-empty.\n const restored = loadHistory();\n if (restored.length) {\n state.history = restored;\n for (const m of restored) appendBubble(m.role === \"user\" ? \"user\" : \"bot\", m.text, m.ts);\n scrollToBottom();\n }\n\n if (cfg.openOnLoad) open();\n\n // ─── State machine ──────────────────────────────────────────────────────\n\n function open(): void {\n if (state.isOpen) return;\n state.isOpen = true;\n root.setAttribute(\"data-open\", \"true\");\n clearUnread();\n // Lazy-greet: first time the panel opens, drop the greeting message.\n if (state.history.length === 0 && cfg.greeting && state.captured) {\n appendBot(cfg.greeting);\n }\n panel.input.focus();\n cfg.onOpen?.();\n }\n\n function close(): void {\n if (!state.isOpen) return;\n state.isOpen = false;\n root.setAttribute(\"data-open\", \"false\");\n cfg.onClose?.();\n }\n\n function toggle(): void {\n state.isOpen ? close() : open();\n }\n\n // ─── Capture flow ───────────────────────────────────────────────────────\n\n function onCaptureSubmit(e: Event): void {\n e.preventDefault();\n const collected = readCaptureFields(panel);\n // Validate that all required fields are filled before unlocking the chat.\n const required = cfg.capture.fields;\n for (const f of required) {\n if (!collected[f]) {\n panel.captureInputs[f]?.focus();\n return;\n }\n }\n state.pendingLead = { ...state.pendingLead, ...collected };\n state.captured = true;\n panel.captureForm?.remove();\n syncComposerLock();\n panel.input.focus();\n // Greet once capture clears, so the greeting feels like a response to \"I'm ready\".\n if (cfg.greeting && state.history.length === 0) appendBot(cfg.greeting);\n }\n\n // ─── Composer / send (debounced + coalesced) ────────────────────────────\n //\n // Visitors fire several short messages in a row (WhatsApp-style). We mirror\n // the WhatsApp contract — batch at the source, one LLM call per batch — by\n // buffering rapid messages in the browser and POSTing them as a SINGLE\n // combined turn after a short quiet window. The composer never locks, so the\n // user can keep typing and sending freely; messages that land mid-request are\n // sent in the next batch.\n\n const send = {\n pending: [] as string[],\n timer: 0,\n typingTimer: 0,\n inFlight: false,\n typing: null as HTMLElement | null,\n };\n\n function onComposerSubmit(e: Event): void {\n e.preventDefault();\n const text = panel.input.value.trim();\n if (!text) return;\n panel.input.value = \"\";\n queueMessage(text);\n }\n\n function queueMessage(text: string): void {\n if (!state.captured) {\n panel.captureInputs.first_name?.focus();\n return;\n }\n appendUser(text);\n send.pending.push(text);\n scheduleFlush();\n }\n\n function scheduleFlush(): void {\n if (send.timer) window.clearTimeout(send.timer);\n send.timer = window.setTimeout(() => void flush(), cfg.debounceMs);\n }\n\n async function flush(): Promise<void> {\n if (send.inFlight || send.pending.length === 0) return;\n const batch = send.pending.splice(0, send.pending.length);\n const message = batch.join(\"\\n\");\n send.inFlight = true;\n\n // Delay the typing dots so fast replies don't flash them.\n send.typingTimer = window.setTimeout(() => {\n send.typing = appendNode(buildTypingIndicator());\n }, TYPING_DELAY_MS);\n\n try {\n const res = await client.chat({\n workflow_id: cfg.workflowId,\n session_id: sessionId,\n message,\n system_prompt: cfg.systemPrompt,\n client_prompt: cfg.clientPrompt,\n lead: Object.keys(state.pendingLead).length ? state.pendingLead : undefined,\n metadata: cfg.metadata,\n });\n if (res.lead_id && !state.leadId) {\n state.leadId = res.lead_id;\n cfg.onLeadCaptured?.(state.leadId);\n }\n const reply = (res.reply ?? \"\").trim();\n if (reply) {\n appendBot(reply);\n } else {\n // No text came back (empty completion / tool-only turn). Never render a\n // blank bubble — show the fallback and surface it to the host.\n appendSystem(cfg.errorText);\n cfg.onError?.(new Error(\"Nexor SDK: empty reply from server\"));\n }\n } catch (err) {\n appendSystem(cfg.errorText);\n cfg.onError?.(err as Error);\n } finally {\n window.clearTimeout(send.typingTimer);\n send.typing?.remove();\n send.typing = null;\n send.inFlight = false;\n panel.input.focus();\n // Anything queued while the request was in flight goes out next.\n if (send.pending.length) scheduleFlush();\n }\n }\n\n // ─── Message rendering ──────────────────────────────────────────────────\n\n function appendUser(text: string): void {\n const ts = Date.now();\n appendBubble(\"user\", text, ts);\n state.history.push({ role: \"user\", text, ts });\n saveHistory();\n cfg.onMessage?.({ role: \"user\", text });\n }\n\n function appendBot(text: string): void {\n const ts = Date.now();\n appendBubble(\"bot\", text, ts);\n state.history.push({ role: \"bot\", text, ts });\n saveHistory();\n if (!state.isOpen) bumpUnread();\n cfg.onMessage?.({ role: \"bot\", text });\n }\n\n // ─── Transcript persistence (survives reloads up to SESSION_RETENTION_MS) ──\n\n function saveHistory(): void {\n try {\n window.localStorage.setItem(\n historyKey,\n JSON.stringify({ ts: Date.now(), history: state.history }),\n );\n touchSession(); // keep the session alive in step with the transcript\n } catch {\n /* storage unavailable — in-memory history still works for this load. */\n }\n }\n\n function loadHistory(): Array<{ role: \"user\" | \"bot\"; text: string; ts?: number }> {\n try {\n const raw = window.localStorage.getItem(historyKey);\n if (!raw) return [];\n const o = JSON.parse(raw);\n if (!o || !Array.isArray(o.history)) return [];\n if (Date.now() - (o.ts || 0) > SESSION_RETENTION_MS) {\n window.localStorage.removeItem(historyKey);\n return [];\n }\n return o.history;\n } catch {\n return [];\n }\n }\n\n function appendSystem(text: string): void {\n appendBubble(\"system\", text);\n }\n\n function appendBubble(\n role: MessageRole,\n text: string,\n ts?: number,\n ): HTMLDivElement {\n return appendNode(buildMessage(role, text, ts, cfg.locale));\n }\n\n // Keep relative timestamps (\"hace 3 minutos\") fresh while the panel is open.\n const refreshTimer = window.setInterval(() => {\n panel.body\n .querySelectorAll<HTMLTimeElement>(\".nexor-chat__msg-time[data-ts]\")\n .forEach((el) => {\n const ts = Number(el.dataset.ts);\n if (ts) el.textContent = formatRelativeTime(ts, cfg.locale);\n });\n }, 60_000);\n\n function appendNode<T extends HTMLElement>(node: T): T {\n panel.body.appendChild(node);\n // Keep the typing indicator pinned to the bottom: if the visitor fires\n // another message while we're awaiting a reply, the dots must stay BELOW\n // it (the bot hasn't \"typed\" yet), not stranded between messages.\n if (send.typing && send.typing !== node) panel.body.appendChild(send.typing);\n scrollToBottom();\n return node;\n }\n\n function scrollToBottom(): void {\n panel.body.scrollTop = panel.body.scrollHeight;\n }\n\n // ─── Unread badge ───────────────────────────────────────────────────────\n\n function bumpUnread(): void {\n state.unread++;\n launcher.badge.textContent = String(state.unread);\n launcher.badge.style.display = \"flex\";\n }\n function clearUnread(): void {\n state.unread = 0;\n launcher.badge.style.display = \"none\";\n }\n\n // ─── Composer lock (used while capture form is visible) ─────────────────\n\n function syncComposerLock(): void {\n const lock = !state.captured;\n panel.input.disabled = lock;\n panel.send.disabled = lock;\n panel.input.placeholder = lock\n ? \"Complete the form above to start…\"\n : \"Type a message…\";\n }\n\n // ─── Public handle ──────────────────────────────────────────────────────\n\n return {\n open,\n close,\n toggle,\n // Programmatic send goes through the same debounce/coalesce path. Resolves\n // immediately — the message is queued, not necessarily sent yet.\n send: (text: string) => {\n queueMessage(text);\n return Promise.resolve();\n },\n destroy: () => {\n if (send.timer) window.clearTimeout(send.timer);\n if (send.typingTimer) window.clearTimeout(send.typingTimer);\n window.clearInterval(refreshTimer);\n root.remove();\n },\n getSessionId: () => sessionId,\n };\n}\n\n// ─── Module-scoped helpers ────────────────────────────────────────────────\n\nfunction ensureBrowser(): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new Error(\"Nexor SDK: initChat() requires a browser environment.\");\n }\n}\n\nfunction buildRoot(cfg: ResolvedCfg): HTMLDivElement {\n const root = document.createElement(\"div\");\n root.className = \"nexor-chat\";\n root.setAttribute(\"data-position\", cfg.position);\n root.setAttribute(\"data-open\", \"false\");\n return root;\n}\n\nfunction readCaptureFields(panel: PanelRefs): Record<string, string> {\n const out: Record<string, string> = {};\n const inputs = panel.captureInputs;\n if (inputs.first_name) out.first_name = inputs.first_name.value.trim();\n if (inputs.last_name) out.last_name = inputs.last_name.value.trim();\n if (inputs.email) out.email = inputs.email.value.trim();\n if (inputs.phone) out.phone = inputs.phone.value.trim();\n return out;\n}\n\n// Used by initChat's launcher → keeps the ref objects in scope for TS.\ntype _Refs = LauncherRefs & PanelRefs;\nvoid (null as unknown as _Refs);\n","import { NexorClient } from \"./client\";\nimport { initChat as initChatImpl, type ChatInitOptions, type ChatHandle } from \"./chat\";\nimport type { ClientOptions } from \"./types\";\n\nexport { NexorClient } from \"./client\";\nexport {\n NexorError,\n NexorAPIError,\n NexorAuthError,\n NexorValidationError,\n NexorNetworkError,\n} from \"./errors\";\nexport * from \"./types\";\nexport type { ChatInitOptions, ChatHandle } from \"./chat\";\n\n/**\n * Singleton API. After `init({apiKey})`, call top-level helpers like\n * `createLead`, `getLead`, `initChat`, etc.\n *\n * import nexor from \"@getnexorai/sdk\";\n * nexor.init({ apiKey: \"nx_live_…\" });\n * await nexor.createLead({ first_name: \"Ada\", email: \"ada@example.com\" });\n *\n * For multi-tenant / server-side use where a singleton doesn't fit, instantiate\n * the underlying client directly:\n *\n * import { NexorClient } from \"@getnexorai/sdk\";\n * const client = new NexorClient({ apiKey });\n */\nexport function createClient(opts: ClientOptions): NexorClient {\n return new NexorClient(opts);\n}\n\nlet _client: NexorClient | null = null;\n\nfunction getClient(): NexorClient {\n if (!_client) {\n throw new Error(\n \"Nexor SDK: call `nexor.init({ apiKey })` before using the API.\",\n );\n }\n return _client;\n}\n\nfunction init(opts: ClientOptions): NexorClient {\n _client = new NexorClient(opts);\n return _client;\n}\n\nfunction isInitialized(): boolean {\n return _client !== null;\n}\n\nfunction reset(): void {\n _client = null;\n}\n\n/**\n * The default export — a ready-to-use, lazily-initialized singleton.\n *\n * Every method below proxies to the underlying NexorClient created by `init()`,\n * so the surface mirrors NexorClient one-for-one with no boilerplate.\n */\nexport const nexor = {\n init,\n isInitialized,\n reset,\n get client(): NexorClient {\n return getClient();\n },\n\n // Leads\n createLead: ((...args) => getClient().createLead(...args)) as NexorClient[\"createLead\"],\n createLeadsBulk: ((...args) =>\n getClient().createLeadsBulk(...args)) as NexorClient[\"createLeadsBulk\"],\n updateLead: ((...args) => getClient().updateLead(...args)) as NexorClient[\"updateLead\"],\n getLead: ((...args) => getClient().getLead(...args)) as NexorClient[\"getLead\"],\n getLeadHistory: ((...args) =>\n getClient().getLeadHistory(...args)) as NexorClient[\"getLeadHistory\"],\n isLeadPaused: ((...args) => getClient().isLeadPaused(...args)) as NexorClient[\"isLeadPaused\"],\n stopAutomation: ((...args) => getClient().stopAutomation(...args)) as NexorClient[\"stopAutomation\"],\n resumeAutomation: ((...args) =>\n getClient().resumeAutomation(...args)) as NexorClient[\"resumeAutomation\"],\n syncLeadTags: ((...args) => getClient().syncLeadTags(...args)) as NexorClient[\"syncLeadTags\"],\n listLeadMeetings: ((...args) =>\n getClient().listLeadMeetings(...args)) as NexorClient[\"listLeadMeetings\"],\n\n // Workflows / Campaigns / Templates\n listWorkflows: ((...args) => getClient().listWorkflows(...args)) as NexorClient[\"listWorkflows\"],\n listCampaigns: ((...args) => getClient().listCampaigns(...args)) as NexorClient[\"listCampaigns\"],\n listTemplates: ((...args) => getClient().listTemplates(...args)) as NexorClient[\"listTemplates\"],\n\n // Messages\n sendMessage: ((...args) => getClient().sendMessage(...args)) as NexorClient[\"sendMessage\"],\n\n // Meetings\n createMeeting: ((...args) => getClient().createMeeting(...args)) as NexorClient[\"createMeeting\"],\n createMeetingNotes: ((...args) =>\n getClient().createMeetingNotes(...args)) as NexorClient[\"createMeetingNotes\"],\n\n // Chat widget\n initChat: (options: ChatInitOptions): ChatHandle =>\n initChatImpl(getClient(), options),\n};\n\nexport default nexor;\n","/**\n * IIFE entry — bundles everything into a single global `Nexor` for script-tag\n * embeds. Each method of the singleton is re-exported so that the IIFE format\n * exposes them directly on the global (e.g. `Nexor.init`, `Nexor.initChat`)\n * without consumers having to dig into `.default`.\n *\n * <script src=\"https://unpkg.com/@getnexor/sdk/dist/nexor.iife.js\"></script>\n * <script>\n * Nexor.init({ apiKey: \"nx_live_…\" });\n * Nexor.initChat({ workflowId: \"…\" });\n * </script>\n */\nimport { nexor } from \"./index\";\n\nexport {\n NexorClient,\n NexorError,\n NexorAPIError,\n NexorAuthError,\n NexorValidationError,\n NexorNetworkError,\n createClient,\n} from \"./index\";\n\nexport const init = nexor.init;\nexport const isInitialized = nexor.isInitialized;\nexport const reset = nexor.reset;\nexport const initChat = nexor.initChat;\n\n// Lead methods\nexport const createLead = nexor.createLead;\nexport const createLeadsBulk = nexor.createLeadsBulk;\nexport const updateLead = nexor.updateLead;\nexport const getLead = nexor.getLead;\nexport const getLeadHistory = nexor.getLeadHistory;\nexport const isLeadPaused = nexor.isLeadPaused;\nexport const stopAutomation = nexor.stopAutomation;\nexport const resumeAutomation = nexor.resumeAutomation;\nexport const syncLeadTags = nexor.syncLeadTags;\nexport const listLeadMeetings = nexor.listLeadMeetings;\n\n// Workflows / Campaigns / Templates\nexport const listWorkflows = nexor.listWorkflows;\nexport const listCampaigns = nexor.listCampaigns;\nexport const listTemplates = nexor.listTemplates;\n\n// Messages\nexport const sendMessage = nexor.sendMessage;\n\n// Meetings\nexport const createMeeting = nexor.createMeeting;\nexport const createMeetingNotes = nexor.createMeetingNotes;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getnexorai/sdk",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Official JavaScript SDK for Nexor — AI-led omni-channel contactability for your leads. REST client + embeddable chat widget.",
5
5
  "keywords": [
6
6
  "nexor",