@lichen-ai/chatkit-web-component 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/NOTICE +1 -0
- package/README.md +9 -0
- package/dist/xpert-chatkit.d.ts +1 -0
- package/dist/xpert-chatkit.js +3088 -0
- package/dist/xpert-chatkit.js.map +1 -0
- package/dist/xpert-chatkit.umd.cjs +3093 -0
- package/dist/xpert-chatkit.umd.cjs.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xpert-chatkit.js","sources":["../../chatkit-web-shared/src/EventEmitter.ts","../../../../../../../../../../项目/xpert/node_modules/@microsoft/fetch-event-source/lib/esm/parse.js","../../../../../../../../../../项目/xpert/node_modules/@microsoft/fetch-event-source/lib/esm/fetch.js","../../chatkit-web-shared/src/errors/WrappedError.ts","../../chatkit-web-shared/src/errors/HttpError.ts","../../chatkit-web-shared/src/requestRetry.ts","../../chatkit-web-shared/src/fetchEventSourceWithRetry.ts","../../chatkit-web-shared/src/safeRandomUUID.ts","../../chatkit-web-shared/src/errors/IntegrationError.ts","../../chatkit-web-shared/src/BaseMessenger.ts","../../chatkit-web-shared/src/frameEncoding.ts","../../chatkit-web-shared/src/types/index.ts","../../chatkit-web-shared/src/types/capabilities.types.ts","../../chatkit-web-shared/src/capabilities.ts","../src/ChatFrameMessenger.ts","../../chatkit-types-0.3.9/src/pet.ts","../src/helpers.ts","../src/PetOverlay.ts","../src/ChatKitElementBase.ts","../src/ChatKitElement.ts","../src/xpert-chatkit.ts"],"sourcesContent":["import type { AnyFunction } from './types'\n\nexport class EventEmitter<T extends Record<string, unknown> = Record<string, unknown>> {\n private callbacks = new Map<keyof T, Set<AnyFunction>>()\n\n on<E extends keyof T>(event: E, callback: (data: T[E]) => void) {\n if (!this.callbacks.has(event)) {\n this.callbacks.set(event, new Set())\n }\n this.callbacks.get(event)!.add(callback)\n }\n\n emit<E extends keyof T>(event: E, ...args: T[E] extends void ? [data?: T[E]] : [data: T[E]]) {\n // If T[E] is void, args is [], so data is undefined\n // If T[E] is not void, args is [data]\n const data = args[0] as T[E]\n this.callbacks.get(event)?.forEach((callback) => callback(data))\n }\n\n off<E extends keyof T>(event: E, callback?: (data: T[E]) => void) {\n if (!callback) {\n this.callbacks.delete(event)\n } else {\n this.callbacks.get(event)?.delete(callback)\n }\n }\n\n allOff() {\n this.callbacks.clear()\n }\n}\n","export async function getBytes(stream, onChunk) {\r\n const reader = stream.getReader();\r\n let result;\r\n while (!(result = await reader.read()).done) {\r\n onChunk(result.value);\r\n }\r\n}\r\nexport function getLines(onLine) {\r\n let buffer;\r\n let position;\r\n let fieldLength;\r\n let discardTrailingNewline = false;\r\n return function onChunk(arr) {\r\n if (buffer === undefined) {\r\n buffer = arr;\r\n position = 0;\r\n fieldLength = -1;\r\n }\r\n else {\r\n buffer = concat(buffer, arr);\r\n }\r\n const bufLength = buffer.length;\r\n let lineStart = 0;\r\n while (position < bufLength) {\r\n if (discardTrailingNewline) {\r\n if (buffer[position] === 10) {\r\n lineStart = ++position;\r\n }\r\n discardTrailingNewline = false;\r\n }\r\n let lineEnd = -1;\r\n for (; position < bufLength && lineEnd === -1; ++position) {\r\n switch (buffer[position]) {\r\n case 58:\r\n if (fieldLength === -1) {\r\n fieldLength = position - lineStart;\r\n }\r\n break;\r\n case 13:\r\n discardTrailingNewline = true;\r\n case 10:\r\n lineEnd = position;\r\n break;\r\n }\r\n }\r\n if (lineEnd === -1) {\r\n break;\r\n }\r\n onLine(buffer.subarray(lineStart, lineEnd), fieldLength);\r\n lineStart = position;\r\n fieldLength = -1;\r\n }\r\n if (lineStart === bufLength) {\r\n buffer = undefined;\r\n }\r\n else if (lineStart !== 0) {\r\n buffer = buffer.subarray(lineStart);\r\n position -= lineStart;\r\n }\r\n };\r\n}\r\nexport function getMessages(onId, onRetry, onMessage) {\r\n let message = newMessage();\r\n const decoder = new TextDecoder();\r\n return function onLine(line, fieldLength) {\r\n if (line.length === 0) {\r\n onMessage === null || onMessage === void 0 ? void 0 : onMessage(message);\r\n message = newMessage();\r\n }\r\n else if (fieldLength > 0) {\r\n const field = decoder.decode(line.subarray(0, fieldLength));\r\n const valueOffset = fieldLength + (line[fieldLength + 1] === 32 ? 2 : 1);\r\n const value = decoder.decode(line.subarray(valueOffset));\r\n switch (field) {\r\n case 'data':\r\n message.data = message.data\r\n ? message.data + '\\n' + value\r\n : value;\r\n break;\r\n case 'event':\r\n message.event = value;\r\n break;\r\n case 'id':\r\n onId(message.id = value);\r\n break;\r\n case 'retry':\r\n const retry = parseInt(value, 10);\r\n if (!isNaN(retry)) {\r\n onRetry(message.retry = retry);\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n}\r\nfunction concat(a, b) {\r\n const res = new Uint8Array(a.length + b.length);\r\n res.set(a);\r\n res.set(b, a.length);\r\n return res;\r\n}\r\nfunction newMessage() {\r\n return {\r\n data: '',\r\n event: '',\r\n id: '',\r\n retry: undefined,\r\n };\r\n}\r\n//# sourceMappingURL=parse.js.map","var __rest = (this && this.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\nimport { getBytes, getLines, getMessages } from './parse';\r\nexport const EventStreamContentType = 'text/event-stream';\r\nconst DefaultRetryInterval = 1000;\r\nconst LastEventId = 'last-event-id';\r\nexport function fetchEventSource(input, _a) {\r\n var { signal: inputSignal, headers: inputHeaders, onopen: inputOnOpen, onmessage, onclose, onerror, openWhenHidden, fetch: inputFetch } = _a, rest = __rest(_a, [\"signal\", \"headers\", \"onopen\", \"onmessage\", \"onclose\", \"onerror\", \"openWhenHidden\", \"fetch\"]);\r\n return new Promise((resolve, reject) => {\r\n const headers = Object.assign({}, inputHeaders);\r\n if (!headers.accept) {\r\n headers.accept = EventStreamContentType;\r\n }\r\n let curRequestController;\r\n function onVisibilityChange() {\r\n curRequestController.abort();\r\n if (!document.hidden) {\r\n create();\r\n }\r\n }\r\n if (!openWhenHidden) {\r\n document.addEventListener('visibilitychange', onVisibilityChange);\r\n }\r\n let retryInterval = DefaultRetryInterval;\r\n let retryTimer = 0;\r\n function dispose() {\r\n document.removeEventListener('visibilitychange', onVisibilityChange);\r\n window.clearTimeout(retryTimer);\r\n curRequestController.abort();\r\n }\r\n inputSignal === null || inputSignal === void 0 ? void 0 : inputSignal.addEventListener('abort', () => {\r\n dispose();\r\n resolve();\r\n });\r\n const fetch = inputFetch !== null && inputFetch !== void 0 ? inputFetch : window.fetch;\r\n const onopen = inputOnOpen !== null && inputOnOpen !== void 0 ? inputOnOpen : defaultOnOpen;\r\n async function create() {\r\n var _a;\r\n curRequestController = new AbortController();\r\n try {\r\n const response = await fetch(input, Object.assign(Object.assign({}, rest), { headers, signal: curRequestController.signal }));\r\n await onopen(response);\r\n await getBytes(response.body, getLines(getMessages(id => {\r\n if (id) {\r\n headers[LastEventId] = id;\r\n }\r\n else {\r\n delete headers[LastEventId];\r\n }\r\n }, retry => {\r\n retryInterval = retry;\r\n }, onmessage)));\r\n onclose === null || onclose === void 0 ? void 0 : onclose();\r\n dispose();\r\n resolve();\r\n }\r\n catch (err) {\r\n if (!curRequestController.signal.aborted) {\r\n try {\r\n const interval = (_a = onerror === null || onerror === void 0 ? void 0 : onerror(err)) !== null && _a !== void 0 ? _a : retryInterval;\r\n window.clearTimeout(retryTimer);\r\n retryTimer = window.setTimeout(create, interval);\r\n }\r\n catch (innerErr) {\r\n dispose();\r\n reject(innerErr);\r\n }\r\n }\r\n }\r\n }\r\n create();\r\n });\r\n}\r\nfunction defaultOnOpen(response) {\r\n const contentType = response.headers.get('content-type');\r\n if (!(contentType === null || contentType === void 0 ? void 0 : contentType.startsWith(EventStreamContentType))) {\r\n throw new Error(`Expected content-type to be ${EventStreamContentType}, Actual: ${contentType}`);\r\n }\r\n}\r\n//# sourceMappingURL=fetch.js.map","/// <reference path=\"../import-meta-env.d.ts\" />\n\nimport type { ChatKitResponseMetadata } from './HttpError'\n\nexport const FRAME_SAFE_ERROR_KEY = '__chatkit_error__'\n\nexport class FrameSafeWrappedError {\n [FRAME_SAFE_ERROR_KEY]: string\n message: string\n stack?: string\n\n constructor(error: Error) {\n this[FRAME_SAFE_ERROR_KEY] = error.name\n this.message = error.message\n this.stack = error.stack\n }\n}\n\n// Wraps an original with a context-aware error message and name\n// while preserving the original error stack.\nexport abstract class WrappedError extends Error {\n override cause: unknown\n eventName: string\n metadata?: ChatKitResponseMetadata;\n // TODO(jiwon): remove after Kakao moves away from referencing __chatkit_error__ directly.\n [FRAME_SAFE_ERROR_KEY]: string\n\n // Define an explicit getter for the error name so that it is not minified away.\n protected get canonicalName(): string {\n if (import.meta.env['DEV']) {\n throw new Error('Subclass must override canonicalName')\n }\n return 'AppError'\n }\n\n constructor(original: unknown, messagePrefix?: string) {\n const errorMessage = original instanceof Error ? original.message : String(original)\n const cause = original instanceof Error ? original : undefined\n super(errorMessage, { cause })\n\n // Make sure we set the name as the runtime subclass name\n this.name = this.canonicalName\n\n const prefix = messagePrefix ? messagePrefix + ': ' : ''\n if (!errorMessage.startsWith(prefix)) {\n this.message = `${prefix}${errorMessage}`\n }\n\n // TODO(jiwon): remove this once partner moves away from referencing __chatkit_error__ directly\n this[FRAME_SAFE_ERROR_KEY] = this.name\n\n // MyComponentError -> error.myComponent\n this.eventName =\n this.name.length > 0\n ? `error.${this.name.charAt(0).toLowerCase() + this.name.slice(1).replace(/Error$/i, '')}`\n : 'error.app'\n\n // Copy over original error stack and metadata (these won't get copied over by default).\n if (cause && cause.stack) {\n this.stack = cause.stack\n }\n if (cause && 'metadata' in cause && cause.metadata) {\n this.metadata = cause.metadata as ChatKitResponseMetadata\n }\n }\n\n static fromPossibleFrameSafeError(error: unknown): WrappedError | null {\n if (\n error &&\n typeof error === 'object' &&\n FRAME_SAFE_ERROR_KEY in error &&\n typeof error[FRAME_SAFE_ERROR_KEY] === 'string' &&\n NAME_TO_ERROR_CLASS[error[FRAME_SAFE_ERROR_KEY] as keyof typeof NAME_TO_ERROR_CLASS]\n ) {\n const safeError = error as FrameSafeWrappedError\n const ErrorCls = NAME_TO_ERROR_CLASS[error[FRAME_SAFE_ERROR_KEY] as keyof typeof NAME_TO_ERROR_CLASS]!\n const parsedError = new ErrorCls(safeError.message)\n parsedError.stack = safeError.stack\n parsedError.name = safeError[FRAME_SAFE_ERROR_KEY]\n // TODO(jiwon): remove this once partner moves away from referencing __chatkit_error__ directly.\n parsedError[FRAME_SAFE_ERROR_KEY] = safeError[FRAME_SAFE_ERROR_KEY]\n return parsedError\n }\n return null\n }\n}\n\n// The public error version of StreamError defined in chatkit-web-inner/src/lib/errors/StreamError.ts\nexport class StreamError extends WrappedError {\n override get canonicalName(): string {\n return 'StreamError'\n }\n}\n\nexport class StreamEventParsingError extends WrappedError {\n override get canonicalName(): string {\n return 'StreamEventParsingError'\n }\n constructor(original: unknown) {\n const messagePrefix = 'Failed to parse stream event'\n super(original, messagePrefix)\n }\n}\n\nexport class StreamEventHandlingError extends WrappedError {\n override get canonicalName(): string {\n return 'StreamEventHandlingError'\n }\n constructor(original: unknown) {\n const messagePrefix = 'Failed to handle stream event'\n super(original, messagePrefix)\n }\n}\n\nexport class StreamStopError extends WrappedError {\n override get canonicalName(): string {\n return 'StreamStopError'\n }\n constructor(original: unknown) {\n const messagePrefix = 'Failed to stop stream'\n super(original, messagePrefix)\n }\n}\nexport class ThreadRenderingError extends WrappedError {\n override get canonicalName(): string {\n return 'ThreadRenderingError'\n }\n}\n\nexport class HistoryViewError extends WrappedError {\n override get canonicalName(): string {\n return 'HistoryViewError'\n }\n constructor(original: unknown) {\n const messagePrefix = 'Failed to load conversation'\n super(original, messagePrefix)\n }\n}\n\nexport class EntitySearchError extends WrappedError {\n override get canonicalName(): string {\n return 'EntitySearchError'\n }\n static fromQuery(error: unknown, query: string) {\n const messagePrefix = `Failed to search entities for query: ${query}`\n return new EntitySearchError(error, messagePrefix)\n }\n}\n\nexport class WidgetItemError extends WrappedError {\n override get canonicalName(): string {\n return 'WidgetItemError'\n }\n}\n\nexport class InitialThreadLoadError extends WrappedError {\n override get canonicalName(): string {\n return 'InitialThreadLoadError'\n }\n constructor(original: unknown) {\n const messagePrefix = 'Failed to load initial thread'\n super(original, messagePrefix)\n }\n}\n\nexport class FileAttachmentError extends WrappedError {\n override get canonicalName(): string {\n return 'FileAttachmentError'\n }\n constructor(original: unknown) {\n const messagePrefix = 'Failed to upload file'\n super(original, messagePrefix)\n }\n}\n\nexport class UnhandledError extends WrappedError {\n override get canonicalName(): string {\n return 'UnhandledError'\n }\n}\n\nexport class UnhandledPromiseRejectionError extends WrappedError {\n override get canonicalName(): string {\n return 'UnhandledPromiseRejectionError'\n }\n}\n\nexport class IntlError extends WrappedError {\n code: string\n\n override get canonicalName(): string {\n return 'IntlError'\n }\n constructor(original: unknown) {\n const messagePrefix = 'Intl error'\n super(original, messagePrefix)\n this.code = typeof original === 'object' && original !== null && 'code' in original ? String(original.code) : ''\n }\n}\n\nexport class FatalAppError extends WrappedError {\n override get canonicalName(): string {\n return 'FatalAppError'\n }\n}\n\nexport class NetworkError extends WrappedError {\n override get canonicalName(): string {\n return 'NetworkError'\n }\n}\n\nexport class DomainVerificationRequestError extends WrappedError {\n override get canonicalName(): string {\n return 'DomainVerificationRequestError'\n }\n}\n\n/** Generic app error class for one-off errors that don't fit into other categories. */\nexport class AppError extends WrappedError {\n override get canonicalName(): string {\n return 'AppError'\n }\n}\n\nconst NAME_TO_ERROR_CLASS = {\n StreamError,\n StreamEventParsingError,\n StreamEventHandlingError,\n StreamStopError,\n ThreadRenderingError,\n HistoryViewError,\n EntitySearchError,\n WidgetItemError,\n InitialThreadLoadError,\n FileAttachmentError,\n UnhandledError,\n UnhandledPromiseRejectionError,\n IntlError,\n DomainVerificationRequestError,\n NetworkError,\n FatalAppError\n} as const\n","import { FRAME_SAFE_ERROR_KEY } from './WrappedError'\n\nexport interface ChatKitResponseMetadata {\n requestId?: string\n [key: string]: unknown\n}\n\nexport class HttpError extends Error {\n status?: number\n statusText?: string\n metadata?: ChatKitResponseMetadata\n\n constructor(\n message: string,\n res: Response | { status?: number; statusText?: string },\n metadata?: ChatKitResponseMetadata\n ) {\n super(message)\n this.name = 'HttpError'\n this.statusText = res.statusText\n this.status = res.status\n this.metadata = metadata\n }\n\n static fromPossibleFrameSafeError(error: unknown): HttpError | null {\n if (error instanceof HttpError) {\n return error\n }\n\n if (\n error &&\n typeof error === 'object' &&\n FRAME_SAFE_ERROR_KEY in error &&\n error[FRAME_SAFE_ERROR_KEY] === 'HttpError'\n ) {\n const safeError = error as FrameSafeHttpError\n const parsedError = new HttpError(\n safeError.message,\n {\n status: safeError.status,\n statusText: safeError.statusText\n },\n safeError.metadata\n )\n parsedError.stack = safeError.stack\n return parsedError\n }\n\n return null\n }\n}\n\n// does not extend Error so that it serializes correctly over structured clone\nexport class FrameSafeHttpError {\n [FRAME_SAFE_ERROR_KEY] = 'HttpError'\n message: string\n stack?: string\n status?: number\n statusText?: string\n metadata?: ChatKitResponseMetadata\n\n constructor(\n message: string,\n res: Response | { status?: number; statusText?: string },\n metadata?: ChatKitResponseMetadata\n ) {\n this.message = message\n this.stack = new Error(message).stack\n this.status = res.status\n this.statusText = res.statusText\n this.metadata = metadata\n }\n\n static fromHttpError(error: HttpError): FrameSafeHttpError {\n return new FrameSafeHttpError(\n error.message,\n {\n status: error.status,\n statusText: error.statusText\n },\n error.metadata\n )\n }\n}\n","// Retry backoff parameters.\n// TODO: consider making this configurable since this concerns API requests made to\n// the integrator's server.\nconst BASE_RETRY_DELAY_MS = 1000\nconst MAX_RETRY_DELAY_MS = 10_000\nexport const MAX_RETRY_ATTEMPTS = 5\n\n// Backoff with half jitter.\n// With the default parameters, results in the following retry delays:\n// 1st: 1–2s, 2nd: 2–4s, 3rd: 4–8s, 4th+: 5–10s (capped).\nexport const nextDelay = (attempt: number, maxRetryDelay = MAX_RETRY_DELAY_MS, baseDelayMs = BASE_RETRY_DELAY_MS) => {\n const max = Math.min(maxRetryDelay, baseDelayMs * 2 ** attempt)\n // uniform in [0.5*max, max)\n return Math.floor(max * (0.5 + Math.random() * 0.5))\n}\n","import { fetchEventSource } from '@microsoft/fetch-event-source'\n\nimport { FrameSafeHttpError } from './errors/HttpError'\nimport { MAX_RETRY_ATTEMPTS, nextDelay } from './requestRetry.js'\n\nimport type { FetchEventSourceInit } from '@microsoft/fetch-event-source'\n\nclass RetryableError extends Error {\n constructor(cause: FrameSafeHttpError) {\n super()\n this.cause = cause\n }\n}\n\nexport const fetchEventSourceWithRetry = async (\n url: string,\n params: Omit<FetchEventSourceInit, 'onerror' | 'onclose'>\n) => {\n let retryAttempt = 0\n const { onopen, ...restParams } = params\n await fetchEventSource(url, {\n ...restParams,\n onopen: async (res) => {\n onopen?.(res)\n if (res.ok && res.headers.get('content-type')?.startsWith('text/event-stream')) {\n // All is well, we can continue streaming.\n retryAttempt = 0 // reset on success\n return\n }\n\n // Throw FrameSafeHttpError so that it serializes correctly over postMessage\n const httpError = new FrameSafeHttpError(`Streaming failed: ${res.statusText}`, res)\n\n if (res.status >= 400 && res.status < 500) {\n // This is likely a fatal error, client's are supposed to send errors as SSE\n // but we can handle this gracefully by ending the streaming state. It could be\n // that this error is due to a misconfigured server or an upstream proxy returning\n // an error, etc.\n throw httpError\n } else {\n // A 5xx error, we can let the client retry.\n throw new RetryableError(httpError)\n }\n },\n onerror: (error) => {\n if (error instanceof RetryableError) {\n if (retryAttempt >= MAX_RETRY_ATTEMPTS) {\n throw error.cause\n }\n\n retryAttempt += 1\n return nextDelay(retryAttempt) // returning a number sets the retry wait\n }\n\n // All other errors are fatal and should not be retried.\n // TODO: log error for monitoring purposes\n throw error\n }\n })\n}\n","export function safeRandomUUID(): string {\n const cryptoRef = globalThis.crypto\n\n if (typeof cryptoRef?.randomUUID === 'function') {\n return cryptoRef.randomUUID()\n }\n\n if (typeof cryptoRef?.getRandomValues === 'function') {\n const bytes = new Uint8Array(16)\n cryptoRef.getRandomValues(bytes)\n\n bytes[6] = (bytes[6] & 0x0f) | 0x40\n bytes[8] = (bytes[8] & 0x3f) | 0x80\n\n return [...bytes]\n .map((byte) => byte.toString(16).padStart(2, '0'))\n .join('')\n .replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, '$1-$2-$3-$4-$5')\n }\n\n return `ck_${Date.now()}_${Math.random().toString(16).slice(2)}`\n}\n","import { FRAME_SAFE_ERROR_KEY } from './WrappedError'\n\nexport class IntegrationError extends Error {\n _name: string\n\n constructor(message: string) {\n super(message)\n this.name = 'IntegrationError'\n this._name = this.name\n }\n\n static fromPossibleFrameSafeError(error: unknown): IntegrationError | null {\n if (\n error &&\n typeof error === 'object' &&\n FRAME_SAFE_ERROR_KEY in error &&\n error[FRAME_SAFE_ERROR_KEY] === 'IntegrationError'\n ) {\n const safeError = error as FrameSafeIntegrationError\n const parsedError = new IntegrationError(safeError.message)\n parsedError.stack = safeError.stack\n return parsedError\n }\n return null\n }\n}\n\n// does not extend Error so that it serializes correctly over structured clone\nexport class FrameSafeIntegrationError {\n [FRAME_SAFE_ERROR_KEY] = 'IntegrationError'\n message: string\n stack?: string\n constructor(message: string) {\n this.message = message\n this.stack = new Error(message).stack\n }\n}\n","import type { EventSourceMessage, FetchEventSourceInit } from '@microsoft/fetch-event-source'\nimport { EventEmitter } from './EventEmitter'\nimport { fetchEventSourceWithRetry } from './fetchEventSourceWithRetry.js'\nimport { safeRandomUUID } from './safeRandomUUID.js'\nimport type { AnyFunction } from './types'\nimport { FrameSafeHttpError, HttpError } from './errors/HttpError'\nimport { FrameSafeIntegrationError, IntegrationError } from './errors/IntegrationError'\n\ntype ChatKitMessage =\n | {\n type: 'command'\n nonce: string\n command: string\n data: unknown\n }\n | {\n type: 'response'\n nonce: string\n response?: unknown\n error?: unknown\n }\n | {\n type: 'fetch'\n nonce: string\n params: RequestInit\n formData?: Record<string, unknown>\n url: string\n }\n | {\n type: 'abortSignal'\n nonce: string\n reason?: unknown\n }\n | {\n type: 'fetchEventSource'\n nonce: string\n params: Omit<FetchEventSourceInit, 'onmessage' | 'onerror' | 'onopen' | 'onclose'>\n url: string\n }\n | {\n type: 'fetchEventSourceMessage'\n nonce: string\n message: EventSourceMessage\n }\n | {\n type: 'event'\n event: string\n data: unknown\n }\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// TODO - some kind of ready state / queue for messages while waiting for the target to be ready\nexport abstract class BaseMessenger<\n Commands extends Record<string, AnyFunction> = Record<string, never>,\n ReceivedCommands extends Record<string, AnyFunction> = Record<string, never>,\n Events extends Record<string, unknown> = Record<string, never>,\n ReceivedEvents extends Record<string, unknown> = Record<string, never>\n> {\n private targetOrigin: string\n private target: () => Window | null\n private commandHandlers: Record<string, AnyFunction>\n private _fetch: typeof window.fetch\n\n // Override this method to implement runtime command capability validation\n abstract canReceiveCommand(_: string): boolean\n\n constructor({\n handlers,\n target,\n targetOrigin,\n fetch = window.fetch\n }: {\n target: () => Window | null\n targetOrigin: string\n fetch?: typeof window.fetch\n handlers: {\n [K in keyof ReceivedCommands as K extends `${infer C}${infer S}` ? `on${Capitalize<C>}${S}` : never]: (\n data: Parameters<ReceivedCommands[K]>[0]\n ) => ReturnType<ReceivedCommands[K]> | Promise<ReturnType<ReceivedCommands[K]>>\n }\n }) {\n this.commandHandlers = handlers\n this.target = target\n this.targetOrigin = targetOrigin\n this._fetch = ((...args) => fetch(...args)) as typeof window.fetch\n }\n\n private emitter = new EventEmitter<Record<string, unknown>>()\n private handlers = new Map<\n string,\n { resolve: (data: unknown) => void; reject: (err: unknown) => void; stack: string }\n >()\n private fetchEventSourceHandlers = new Map<\n string,\n {\n onmessage?: (ev: EventSourceMessage) => void\n onclose?: () => void\n }\n >()\n\n setTargetOrigin(targetOrigin: string) {\n this.targetOrigin = targetOrigin\n }\n private abortControllers = new Map<string, AbortController>()\n\n private sendMessage(data: ChatKitMessage, transfer?: Transferable[]) {\n const message = {\n __xpaiChatKit: true,\n ...data\n }\n this.target()?.postMessage(message, this.targetOrigin, transfer)\n }\n\n connect() {\n window.addEventListener('message', this.handleMessage)\n }\n\n disconnect() {\n window.removeEventListener('message', this.handleMessage)\n }\n\n fetch<T = unknown>(url: string, params: RequestInit) {\n return new Promise<unknown>((resolve, reject) => {\n const nonce = safeRandomUUID()\n this.handlers.set(nonce, { resolve, reject, stack: new Error().stack || '' })\n\n // Special case for FormData since it isn't structured cloneable\n let formData: Record<string, unknown> | undefined\n if (params.body instanceof FormData) {\n formData = {}\n for (const [key, value] of params.body.entries()) {\n formData[key] = value\n }\n params.body = undefined\n }\n\n // special case for abortSignal since it isn't structured cloneable\n if (params.signal) {\n params.signal.addEventListener('abort', () => {\n this.sendMessage({\n type: 'abortSignal',\n nonce,\n reason: params.signal?.reason\n })\n })\n params.signal = undefined\n }\n\n this.sendMessage({ type: 'fetch', nonce, params, formData, url })\n }) as Promise<T>\n }\n\n // Supporting onopen would require a good way for us to serialize the Response object\n // across the iframe boundary, which is not trivial and also not really necessary.\n fetchEventSource(url: string, params: Omit<FetchEventSourceInit, 'onopen' | 'onerror' | 'onclose'>) {\n return new Promise<unknown>((resolve, reject) => {\n const { onmessage, signal, ...rest } = params\n const nonce = safeRandomUUID()\n\n this.handlers.set(nonce, { resolve, reject, stack: new Error().stack || '' })\n this.fetchEventSourceHandlers.set(nonce, {\n onmessage\n })\n\n // special case for abortSignal since it isn't structured cloneable\n if (signal) {\n signal.addEventListener('abort', () => {\n this.sendMessage({\n type: 'abortSignal',\n nonce,\n reason: signal.reason\n })\n })\n }\n\n this.sendMessage({ type: 'fetchEventSource', nonce, params: rest, url })\n }) as Promise<void>\n }\n\n commands = new Proxy(\n {},\n {\n get: (_, command: string) => {\n return (data: Record<string, unknown>, transfer?: Transferable[]) => {\n return new Promise<unknown>((resolve, reject) => {\n const nonce = safeRandomUUID()\n this.handlers.set(nonce, { resolve, reject, stack: new Error().stack || '' })\n this.sendMessage(\n {\n type: 'command',\n nonce,\n command: `on${command.charAt(0).toUpperCase()}${command.slice(1)}`,\n data\n },\n transfer\n )\n })\n }\n }\n }\n ) as {\n [K in keyof Commands]: (\n ...args: Commands[K] extends () => any\n ? [data?: void, transfer?: void]\n : [data: Parameters<Commands[K]>[0], transfer?: Transferable[]]\n ) => Promise<Awaited<ReturnType<Commands[K]>>>\n }\n\n emit<E extends keyof Events>(\n ...[event, data, transfer]: Events[E] extends void\n ? [event: E]\n : [event: E, data: Events[E], transfer?: Transferable[]]\n ) {\n this.sendMessage(\n {\n type: 'event' as const,\n event: event as string,\n data\n },\n transfer\n )\n }\n\n on<E extends keyof ReceivedEvents>(\n ...[event, callback]: ReceivedEvents[E] extends void\n ? [event: E, callback: () => void]\n : [event: E, callback: (data: ReceivedEvents[E]) => void]\n ) {\n this.emitter.on(event as string, callback as AnyFunction)\n }\n\n destroy() {\n window.removeEventListener('message', this.handleMessage)\n this.emitter.allOff()\n this.handlers.clear()\n }\n\n private handleMessage = async (event: MessageEvent) => {\n if (\n !event.data ||\n event.data.__xpaiChatKit !== true ||\n event.origin !== this.targetOrigin ||\n event.source !== this.target()\n ) {\n return\n }\n\n const data = event.data as ChatKitMessage\n\n switch (data.type) {\n case 'event': {\n this.emitter.emit(data.event, data.data)\n break\n }\n case 'fetch': {\n // TODO - handle server errors - non-200 status codes or whatever\n try {\n // Special case for FormData since it isn't structured cloneable\n if (data.formData) {\n const formData = new FormData()\n for (const [key, value] of Object.entries(data.formData)) {\n formData.append(key, value as string)\n }\n data.params.body = formData\n }\n\n // special case for abortSignal since it isn't structured cloneable\n const controller = new AbortController()\n this.abortControllers.set(data.nonce, controller)\n data.params.signal = controller.signal\n\n const res = await this._fetch(data.url, data.params)\n\n if (!res.ok) {\n // TODO - structured errors from ChatKit SDK so we can handle these a bit better\n const message = await res\n .json()\n .then((json) => json.message || res.statusText)\n .catch(() => res.statusText)\n\n throw new FrameSafeHttpError(message, res)\n }\n\n // TODO: only accept non-JSON responses when fetching external API\n // (e.g. S3/Azure blob storage uploads)\n const json = await res.json().catch(() => ({}))\n this.sendMessage({\n type: 'response',\n response: json,\n nonce: data.nonce\n })\n } catch (error) {\n this.sendMessage({\n type: 'response',\n error,\n nonce: data.nonce\n })\n }\n break\n }\n case 'fetchEventSource': {\n try {\n // special case for abortSignal since it isn't structured cloneable\n const controller = new AbortController()\n this.abortControllers.set(data.nonce, controller)\n await fetchEventSourceWithRetry(data.url, {\n ...data.params,\n signal: controller.signal,\n fetch: this._fetch,\n onmessage: (message) => {\n this.sendMessage({\n type: 'fetchEventSourceMessage',\n message,\n nonce: data.nonce\n })\n }\n })\n this.sendMessage({\n type: 'response',\n response: undefined,\n nonce: data.nonce\n })\n } catch (error) {\n this.sendMessage({\n type: 'response',\n error,\n nonce: data.nonce\n })\n }\n break\n }\n case 'command': {\n if (!this.canReceiveCommand(data.command)) {\n this.sendMessage({\n type: 'response',\n error: new FrameSafeIntegrationError(`Command ${data.command} not supported`),\n nonce: data.nonce\n })\n return\n }\n try {\n const response = await this.commandHandlers[data.command]?.(data.data)\n this.sendMessage({\n type: 'response',\n response,\n nonce: data.nonce\n })\n } catch (error) {\n this.sendMessage({\n type: 'response',\n error,\n nonce: data.nonce\n })\n }\n break\n }\n case 'response': {\n const handler = this.handlers.get(data.nonce)\n if (!handler) {\n // log this\n // eslint-disable-next-line no-console\n console.error('No handler found for nonce', data.nonce)\n return\n }\n if (data.error) {\n const integrationError = IntegrationError.fromPossibleFrameSafeError(data.error)\n const httpError = HttpError.fromPossibleFrameSafeError(data.error)\n if (integrationError) {\n // Set the stack from the handler so the user can see where the\n // error originated in their own integration code.\n integrationError.stack = handler.stack\n handler.reject(integrationError)\n } else if (httpError) {\n handler.reject(httpError)\n } else {\n handler.reject(data.error)\n }\n } else {\n handler.resolve(data.response)\n }\n this.handlers.delete(data.nonce)\n break\n }\n case 'fetchEventSourceMessage': {\n const handler = this.fetchEventSourceHandlers.get(data.nonce)\n if (!handler) {\n // log this\n // eslint-disable-next-line no-console\n console.error('No handler found for nonce', data.nonce)\n return\n }\n this.fetchEventSourceHandlers.get(data.nonce)?.onmessage?.(data.message)\n break\n }\n case 'abortSignal': {\n const controller = this.abortControllers.get(data.nonce)\n if (controller) {\n controller.abort(data.reason)\n this.abortControllers.delete(data.nonce)\n }\n break\n }\n default: {\n data satisfies never\n // log this\n break\n }\n }\n }\n}\n","const toUrlBase64 = (bin: string) => btoa(bin).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n\nconst fromUrlBase64 = (b64: string) => atob(b64.replace(/-/g, '+').replace(/_/g, '/'))\n\nexport const encodeBase64 = (value: unknown): string => {\n if (value === undefined) {\n throw new TypeError('encodeBase64: `undefined` cannot be encoded to valid JSON. Pass null instead.')\n }\n const json = JSON.stringify(value)\n const bytes = new TextEncoder().encode(json)\n let bin = ''\n for (const b of bytes) bin += String.fromCharCode(b)\n return toUrlBase64(bin)\n}\n\nexport const decodeBase64 = <T = unknown>(b64: string): T => {\n const bin = fromUrlBase64(b64)\n const bytes = Uint8Array.from(bin, (c) => c.charCodeAt(0))\n const json = new TextDecoder().decode(bytes)\n return JSON.parse(json) as T\n}\n","import type { EventSourceMessage, FetchEventSourceInit } from '@microsoft/fetch-event-source'\n\nexport type ChatKitMessage =\n | {\n type: 'command'\n nonce: string\n command: string\n data: unknown\n }\n | {\n type: 'response'\n nonce: string\n response?: unknown\n error?: unknown\n }\n | {\n type: 'fetch'\n nonce: string\n params: RequestInit\n formData?: Record<string, unknown>\n url: string\n }\n | {\n type: 'abortSignal'\n nonce: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n reason?: any\n }\n | {\n type: 'fetchEventSource'\n nonce: string\n params: Omit<FetchEventSourceInit, 'onmessage' | 'onerror' | 'onopen' | 'onclose'>\n url: string\n }\n | {\n type: 'fetchEventSourceMessage'\n nonce: string\n message: EventSourceMessage\n }\n | {\n type: 'event'\n event: string\n data: unknown\n }\n\nexport type AnyFunction = (...args: any[]) => any\nexport type OuterEvents = any\nexport type InnerEvents = any\nexport type InnerCommands = any\nexport type Attachment = any\nexport type ChatKitFrameParams = any\nexport type ChatKitProfile = 'chatkit'\nexport type ChatKitInnerOptions = any\nexport type UserMessageContent = any\nexport type ToolChoice = any\n\nexport type RemoveMethods<T> = T extends AnyFunction\n ? '[ChatKitMethod]'\n : T extends object\n ? { [K in keyof T]: RemoveMethods<T[K]> }\n : T\nexport class IntegrationError extends Error {}\n\nexport function fromPossibleFrameSafeError(err: any): any {\n // Placeholder implementation\n return err.message\n}\n","import type { RuntimeCapabilitiesSelection as ChatKitRuntimeCapabilitiesSelection } from '@lichen-ai/chatkit-types'\n\nexport type ChatKitReq = any\n\ntype JsonRecord = Record<string, unknown>\n\nexport type SerializedChatKitOptions = JsonRecord\nexport type ChatKitCommandUserMessageContent = unknown\nexport type ChatKitCommandToolChoice = unknown\n\nexport type ChatKitReferenceBase = {\n id?: string\n label?: string\n text: string\n}\n\nexport type ChatKitCodeReference = ChatKitReferenceBase & {\n type: 'code'\n path: string\n startLine: number\n endLine: number\n language?: string\n taskId?: string\n}\n\nexport type ChatKitQuoteReference = ChatKitReferenceBase & {\n type: 'quote'\n messageId?: string\n source?: string\n}\n\nexport type ChatKitImageReference = ChatKitReferenceBase & {\n type: 'image'\n fileId?: string\n url?: string\n mimeType?: string\n name?: string\n size?: number\n width?: number\n height?: number\n}\n\nexport type ChatKitReference = ChatKitCodeReference | ChatKitQuoteReference | ChatKitImageReference\n\nexport type ChatKitReferenceCompositionMode = 'compose' | 'preserve'\n\nexport type RuntimeCapabilitiesSelectionSet = Omit<ChatKitRuntimeCapabilitiesSelection, 'mode' | 'recommended'>\n\nexport type RuntimeCapabilitiesSelection = ChatKitRuntimeCapabilitiesSelection & {\n recommended?: RuntimeCapabilitiesSelectionSet\n}\n\nexport type ChatKitMessageAttachment =\n | {\n type: 'file'\n id: string\n name: string\n mime_type: string\n }\n | {\n type: 'image'\n id: string\n preview_url: string\n name: string\n mime_type: string\n }\n\nexport type WorkflowTriggerParams = JsonRecord\nexport type FollowUpMode = 'default' | 'queue' | 'steer'\n\nexport type SendUserMessageCommandPayload = {\n text?: string\n content?: ChatKitCommandUserMessageContent[]\n state?: JsonRecord\n reply?: string\n attachments?: ChatKitMessageAttachment[]\n newThread?: boolean\n references?: ChatKitReference[]\n referenceComposition?: ChatKitReferenceCompositionMode\n toolChoice?: ChatKitCommandToolChoice\n model?: string\n planMode?: boolean\n runtimeCapabilities?: RuntimeCapabilitiesSelection\n trigger?: WorkflowTriggerParams\n followUpMode?: FollowUpMode\n}\n\nexport type SetComposerValueCommandPayload = {\n text?: string\n content?: ChatKitCommandUserMessageContent[]\n reply?: string\n attachments?: ChatKitMessageAttachment[]\n references?: ChatKitReference[]\n appendReferences?: boolean\n files?: File[]\n selectedToolId?: string | null\n selectedModelId?: string | null\n}\n\nexport type CustomActionCommandPayload = {\n action: {\n type: string\n payload?: JsonRecord\n }\n itemId?: string\n}\n\nexport type PublicLogEventPayload = {\n name: string\n data?: JsonRecord\n [key: string]: unknown\n}\n\nexport type PublicNamedEventPayload = {\n name: string\n data?: JsonRecord\n}\n\nexport type OuterCommands = {\n setOptions: (options: SerializedChatKitOptions) => void\n sendUserMessage: (params: SendUserMessageCommandPayload) => void\n setPetEnabled: (params: { enabled: boolean }) => void\n setComposerValue: (params: SetComposerValueCommandPayload) => void\n setThreadId: (params: { threadId: string | null }) => void\n focusComposer: () => void\n fetchUpdates: () => void\n sendCustomAction: (params: CustomActionCommandPayload) => void\n showHistory: () => void\n hideHistory: () => void\n shareThread: () => void\n setTrainingOptOut: (params: { value: boolean }) => void\n}\nexport type PublicEvents = {\n ready: void\n error: { error: Error }\n log: PublicLogEventPayload\n 'response.start': void\n 'response.end': void\n 'response.stop': any\n 'thread.change': { threadId: string | null }\n 'tool.change': any\n 'thread.load.start': { threadId: string }\n 'thread.load.end': { threadId: string }\n deeplink: PublicNamedEventPayload\n effect: PublicNamedEventPayload\n 'thread.restore': any\n 'message.share': any\n 'image.download': any\n 'history.open': any\n 'history.close': any\n 'log.chatgpt': any\n}\nexport type PublicError =\n | 'StreamError'\n | 'StreamEventParsingError'\n | 'WidgetItemError'\n | 'InitialThreadLoadError'\n | 'FileAttachmentError'\n | 'HistoryViewError'\n | 'FatalAppError'\n | 'IntegrationError'\n | 'EntitySearchError'\n | 'DomainVerificationRequestError'\n | 'HttpError'\n | 'NetworkError'\n | 'UnhandledError'\n | 'UnhandledPromiseRejectionError'\n | 'StreamEventHandlingError'\n | 'StreamStopError'\n | 'ThreadRenderingError'\n | 'IntlError'\n | 'AppError'\nexport type ThreadItem = { type: string }\nexport type WidgetRoot = { type: string }\nexport type WidgetComponent = { type: string }\n\n// This is a type-only namespace and will disappear after compile.\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Capability {\n export type Command = keyof OuterCommands\n export type Event = keyof PublicEvents\n export type Error = PublicError\n\n export type BackendOperation = ChatKitReq['type']\n export type ThreadItemType = ThreadItem['type']\n export type WidgetType = WidgetRoot['type'] | WidgetComponent['type']\n\n export type Key =\n | `command.${Command}`\n | `event.${Event}`\n | `thread.item.${ThreadItemType}`\n | `backend.${BackendOperation}`\n | `error.${Error}`\n | `widget.${WidgetType}`\n\n export type Rules = {\n allow?: readonly Key[] // allow-list\n deny?: readonly Key[] // optional additional denies\n }\n}\n\n// Publicly exported capabili\nexport type Capabilities = {\n commands: Set<Capability.Command>\n events: Set<Capability.Event>\n errors: Set<Capability.Error>\n backend: Set<Capability.BackendOperation>\n threadItems: Set<Capability.ThreadItemType>\n widgets: Set<Capability.WidgetType>\n}\n\n// Default capabilities. We intersect this with allow/deny lists on profiles\n// to compute effective capabilities.\nexport const BASE_CAPABILITY_ALLOWLIST = [\n // commands\n 'command.setOptions',\n 'command.sendUserMessage',\n 'command.setComposerValue',\n 'command.setThreadId',\n 'command.focusComposer',\n 'command.fetchUpdates',\n 'command.sendCustomAction',\n 'command.showHistory',\n 'command.hideHistory',\n // events\n 'event.ready',\n 'event.error',\n 'event.log',\n 'event.response.start',\n 'event.response.end',\n 'event.response.stop',\n 'event.thread.change',\n 'event.tool.change',\n 'event.thread.load.start',\n 'event.thread.load.end',\n 'event.deeplink',\n 'event.effect',\n // errors\n 'error.StreamError',\n 'error.StreamEventParsingError',\n 'error.WidgetItemError',\n 'error.InitialThreadLoadError',\n 'error.FileAttachmentError',\n 'error.HistoryViewError',\n 'error.FatalAppError',\n 'error.IntegrationError',\n 'error.EntitySearchError',\n 'error.DomainVerificationRequestError',\n // backend\n 'backend.threads.get_by_id',\n 'backend.threads.list',\n 'backend.threads.update',\n 'backend.threads.delete',\n 'backend.threads.create',\n 'backend.threads.add_user_message',\n 'backend.threads.add_client_tool_output',\n 'backend.threads.retry_after_item',\n 'backend.threads.custom_action',\n 'backend.attachments.create',\n 'backend.attachments.get_preview',\n 'backend.attachments.delete',\n 'backend.items.list',\n 'backend.items.feedback',\n // thread item types\n 'thread.item.generated_image',\n 'thread.item.user_message',\n 'thread.item.assistant_message',\n 'thread.item.client_tool_call',\n 'thread.item.widget',\n 'thread.item.task',\n 'thread.item.workflow',\n 'thread.item.end_of_turn',\n 'thread.item.image_generation',\n // widgets\n 'widget.Basic',\n 'widget.Card',\n 'widget.ListView',\n 'widget.ListViewItem',\n 'widget.Badge',\n 'widget.Box',\n 'widget.Row',\n 'widget.Col',\n 'widget.Button',\n 'widget.Caption',\n 'widget.Chart',\n 'widget.Checkbox',\n 'widget.DatePicker',\n 'widget.Divider',\n 'widget.Form',\n 'widget.Icon',\n 'widget.Image',\n 'widget.Input',\n 'widget.Label',\n 'widget.Markdown',\n 'widget.RadioGroup',\n 'widget.Select',\n 'widget.Spacer',\n 'widget.Text',\n 'widget.Textarea',\n 'widget.Title',\n 'widget.Transition'\n] as const satisfies readonly Capability.Key[]\n\nexport const BASE_CAPABILITY_DENYLIST = [\n // --- commands\n 'command.shareThread',\n 'command.setTrainingOptOut',\n // --- events\n 'event.thread.restore',\n 'event.message.share',\n 'event.image.download',\n 'event.history.open',\n 'event.history.close',\n 'event.log.chatgpt',\n // --- errors\n // These errors considered internal and are not exposed to the user by default.\n 'error.HttpError',\n 'error.NetworkError',\n 'error.UnhandledError',\n 'error.UnhandledPromiseRejectionError',\n 'error.StreamEventHandlingError',\n 'error.StreamStopError',\n 'error.ThreadRenderingError',\n 'error.IntlError',\n 'error.AppError',\n // --- backend\n 'backend.threads.stop',\n 'backend.threads.share',\n 'backend.threads.create_from_shared',\n 'backend.threads.init',\n 'backend.attachments.process',\n // widgets\n 'widget.CardCarousel',\n 'widget.Favicon',\n 'widget.CardLinkItem',\n 'widget.Map'\n] as const satisfies readonly Capability.Key[]\n\nexport const PROFILE_TO_RULES = {\n chatkit: {\n allow: [...BASE_CAPABILITY_ALLOWLIST, 'thread.item.image_generation'],\n deny: BASE_CAPABILITY_DENYLIST\n }\n}\n","import { PROFILE_TO_RULES } from './types/capabilities.types'\n\nimport type { ChatKitProfile } from './types'\nimport type { Capabilities, Capability } from './types/capabilities.types'\n\nexport const getCapabilities = (profile: ChatKitProfile): Capabilities => {\n const rules = PROFILE_TO_RULES[profile]\n const effective = new Set(rules.allow as readonly Capability.Key[])\n for (const capability of rules.deny ?? []) {\n effective.delete(capability)\n }\n\n const commands = new Set<Capability.Command>()\n const events = new Set<Capability.Event>()\n const backend = new Set<Capability.BackendOperation>()\n const threadItems = new Set<Capability.ThreadItemType>()\n const errors = new Set<Capability.Error>()\n const widgets = new Set<Capability.WidgetType>()\n\n for (const capability of effective) {\n if (capability.startsWith('command.')) {\n commands.add(capability.slice('command.'.length) as Capability.Command)\n continue\n }\n if (capability.startsWith('event.')) {\n events.add(capability.slice('event.'.length) as Capability.Event)\n continue\n }\n if (capability.startsWith('backend.')) {\n backend.add(capability.slice('backend.'.length) as Capability.BackendOperation)\n continue\n }\n if (capability.startsWith('thread.item.')) {\n threadItems.add(capability.slice('thread.item.'.length) as Capability.ThreadItemType)\n }\n if (capability.startsWith('error.')) {\n errors.add(capability.slice('error.'.length) as Capability.Error)\n continue\n }\n if (capability.startsWith('widget.')) {\n widgets.add(capability.slice('widget.'.length) as Capability.WidgetType)\n continue\n }\n }\n\n return { commands, events, backend, threadItems, errors, widgets }\n}\n","import { BaseMessenger } from '@lichen-ai/chatkit-web-shared'\nimport type { InnerCommands, InnerEvents, OuterCommands, OuterEvents } from '@lichen-ai/chatkit-web-shared'\n\nexport class ChatFrameMessenger extends BaseMessenger<OuterCommands, InnerCommands, OuterEvents, InnerEvents> {\n // Messenger running in outer can always handle commands coming from inner\n canReceiveCommand(_: string) {\n return true\n }\n}\n","import type {\n ChatKitOptions,\n ChatKitPetAnimationName,\n ChatKitPetBoundsPadding,\n ChatKitPetCharacter,\n ChatKitPetFrameAnimation,\n ChatKitPetOptions,\n ChatKitPetPin,\n ChatKitPetSpriteAtlas\n} from './options.js'\n\nexport type PetFrameAnimationDefinition = {\n row: number\n frames: number\n frameDurations: readonly number[]\n}\n\nexport type PetSpriteAtlasDefinition = {\n columns: number\n rows: number\n cellWidth: number\n cellHeight: number\n animations: Record<ChatKitPetAnimationName, PetFrameAnimationDefinition>\n}\n\nexport type NormalizedPetOptions = {\n character: ChatKitPetCharacter\n position: Required<Pick<NonNullable<ChatKitPetOptions['position']>, 'draggable' | 'persist' | 'scale' | 'zIndex'>> &\n Pick<NonNullable<ChatKitPetOptions['position']>, 'pin' | 'boundsPadding'>\n behavior: NonNullable<ChatKitPetOptions['behavior']>\n ariaLabel: string\n imageRendering: NonNullable<ChatKitPetOptions['imageRendering']>\n}\n\nexport type ResolvedPetCharacter = {\n kind: 'atlas'\n src: string\n atlas: PetSpriteAtlasDefinition\n}\n\nexport type PetPosition = {\n x: number\n y: number\n}\n\nexport type PetSize = {\n width: number\n height: number\n}\n\nexport type PetViewport = {\n width: number\n height: number\n}\n\nexport const PET_ANIMATION_NAMES = [\n 'idle',\n 'running-right',\n 'running-left',\n 'waving',\n 'jumping',\n 'failed',\n 'waiting',\n 'running',\n 'review'\n] as const satisfies readonly ChatKitPetAnimationName[]\n\nexport const petSpriteAtlas = {\n columns: 8,\n rows: 9,\n cellWidth: 192,\n cellHeight: 208,\n animations: {\n idle: {\n row: 0,\n frames: 6,\n frameDurations: [280, 110, 110, 140, 140, 320]\n },\n 'running-right': {\n row: 1,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220]\n },\n 'running-left': {\n row: 2,\n frames: 8,\n frameDurations: [120, 120, 120, 120, 120, 120, 120, 220]\n },\n waving: {\n row: 3,\n frames: 4,\n frameDurations: [140, 140, 140, 280]\n },\n jumping: {\n row: 4,\n frames: 5,\n frameDurations: [140, 140, 140, 140, 280]\n },\n failed: {\n row: 5,\n frames: 8,\n frameDurations: [140, 140, 140, 140, 140, 140, 140, 240]\n },\n waiting: {\n row: 6,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 260]\n },\n running: {\n row: 7,\n frames: 6,\n frameDurations: [120, 120, 120, 120, 120, 220]\n },\n review: {\n row: 8,\n frames: 6,\n frameDurations: [150, 150, 150, 150, 150, 280]\n }\n }\n} as const satisfies PetSpriteAtlasDefinition\n\nexport const DEFAULT_PET_SIZE = {\n width: petSpriteAtlas.cellWidth,\n height: petSpriteAtlas.cellHeight\n}\n\nexport const DEFAULT_PET_BOUNDS_PADDING: ChatKitPetBoundsPadding = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n}\n\nexport const DEFAULT_PET_STORAGE_KEY = 'chatkit:pet:position:v1'\n\nexport const DEFAULT_PET_SPRITESHEET_URL = '/pets/boba/spritesheet.webp'\n\nconst DEFAULT_PET_CHARACTER = {\n type: 'sprite-atlas',\n src: DEFAULT_PET_SPRITESHEET_URL\n} as const satisfies ChatKitPetCharacter\n\nconst DEFAULT_POSITION = {\n pin: 'bottom-right',\n draggable: true,\n scale: 0.25,\n persist: true,\n zIndex: 40\n} as const satisfies NormalizedPetOptions['position']\n\nfunction mergeFrameAnimation(\n base: PetFrameAnimationDefinition,\n override?: ChatKitPetFrameAnimation\n): PetFrameAnimationDefinition {\n return {\n row: override?.row ?? base.row,\n frames: override?.frames ?? base.frames,\n frameDurations:\n override?.frameDurations && override.frameDurations.length > 0 ? override.frameDurations : base.frameDurations\n }\n}\n\nexport function mergePetSpriteAtlas(override?: ChatKitPetSpriteAtlas): PetSpriteAtlasDefinition {\n const animations = {} as Record<ChatKitPetAnimationName, PetFrameAnimationDefinition>\n\n for (const name of PET_ANIMATION_NAMES) {\n animations[name] = mergeFrameAnimation(petSpriteAtlas.animations[name], override?.animations?.[name])\n }\n\n return {\n columns: override?.columns ?? petSpriteAtlas.columns,\n rows: override?.rows ?? petSpriteAtlas.rows,\n cellWidth: override?.cellWidth ?? petSpriteAtlas.cellWidth,\n cellHeight: override?.cellHeight ?? petSpriteAtlas.cellHeight,\n animations\n }\n}\n\nfunction normalizeCharacter(character: ChatKitPetCharacter | undefined): ChatKitPetCharacter {\n if (!character) {\n return DEFAULT_PET_CHARACTER\n }\n\n if (character.src) {\n return character\n }\n\n return DEFAULT_PET_CHARACTER\n}\n\nexport function normalizePetOptions(pet: ChatKitOptions['pet'] | null): NormalizedPetOptions | null {\n if (!pet) {\n return null\n }\n\n if (pet === true) {\n return {\n character: DEFAULT_PET_CHARACTER,\n position: DEFAULT_POSITION,\n behavior: 'auto',\n ariaLabel: 'Animated pet',\n imageRendering: 'auto'\n }\n }\n\n if (pet.enabled === false) {\n return null\n }\n\n return {\n character: normalizeCharacter(pet.character),\n position: {\n ...DEFAULT_POSITION,\n ...pet.position\n },\n behavior: pet.behavior ?? 'auto',\n ariaLabel: pet.ariaLabel ?? 'Animated pet',\n imageRendering: pet.imageRendering ?? 'auto'\n }\n}\n\nexport function resolvePetCharacter(character: ChatKitPetCharacter): ResolvedPetCharacter | null {\n if (!character.src) {\n return null\n }\n\n return {\n kind: 'atlas',\n src: character.src,\n atlas: mergePetSpriteAtlas(character.atlas)\n }\n}\n\nexport function normalizeBoundsPadding(value?: number | Partial<ChatKitPetBoundsPadding>): ChatKitPetBoundsPadding {\n if (typeof value === 'number') {\n return {\n top: value,\n right: value,\n bottom: value,\n left: value\n }\n }\n\n return {\n top: value?.top ?? DEFAULT_PET_BOUNDS_PADDING.top,\n right: value?.right ?? DEFAULT_PET_BOUNDS_PADDING.right,\n bottom: value?.bottom ?? DEFAULT_PET_BOUNDS_PADDING.bottom,\n left: value?.left ?? DEFAULT_PET_BOUNDS_PADDING.left\n }\n}\n\nexport function clampPetPosition(\n position: PetPosition,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding\n): PetPosition {\n const minX = padding.left\n const minY = padding.top\n const maxX = Math.max(minX, viewport.width - size.width - padding.right)\n const maxY = Math.max(minY, viewport.height - size.height - padding.bottom)\n\n return {\n x: Math.min(maxX, Math.max(minX, position.x)),\n y: Math.min(maxY, Math.max(minY, position.y))\n }\n}\n\nexport function getPinnedPetPosition(\n pin: ChatKitPetPin,\n size: PetSize,\n viewport: PetViewport,\n padding: ChatKitPetBoundsPadding\n): PetPosition {\n const horizontalCenter = (viewport.width - size.width) / 2\n const verticalCenter = (viewport.height - size.height) / 2\n const right = viewport.width - size.width - padding.right\n const bottom = viewport.height - size.height - padding.bottom\n\n switch (pin) {\n case 'top-left':\n return clampPetPosition({ x: padding.left, y: padding.top }, size, viewport, padding)\n case 'top':\n return clampPetPosition({ x: horizontalCenter, y: padding.top }, size, viewport, padding)\n case 'top-right':\n return clampPetPosition({ x: right, y: padding.top }, size, viewport, padding)\n case 'left':\n return clampPetPosition({ x: padding.left, y: verticalCenter }, size, viewport, padding)\n case 'center':\n return clampPetPosition({ x: horizontalCenter, y: verticalCenter }, size, viewport, padding)\n case 'right':\n return clampPetPosition({ x: right, y: verticalCenter }, size, viewport, padding)\n case 'bottom-left':\n return clampPetPosition({ x: padding.left, y: bottom }, size, viewport, padding)\n case 'bottom':\n return clampPetPosition({ x: horizontalCenter, y: bottom }, size, viewport, padding)\n case 'bottom-right':\n default:\n return clampPetPosition({ x: right, y: bottom }, size, viewport, padding)\n }\n}\n","// ChatKitElement.ts\n\nimport type { RemoveMethods } from '@lichen-ai/chatkit-web-shared'\n\nexport const removeMethods = <T>(obj: T, seen = new WeakSet<object>()): RemoveMethods<T> => {\n if (typeof obj === 'function') return '[ChatKitMethod]' as RemoveMethods<T>\n if (typeof obj !== 'object' || obj === null) return obj as RemoveMethods<T>\n if (seen.has(obj)) return obj as RemoveMethods<T>\n seen.add(obj)\n\n if (Array.isArray(obj)) {\n return obj.map((c) => removeMethods(c, seen)) as RemoveMethods<T>\n }\n\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value !== 'function') {\n result[key] = removeMethods(value as unknown, seen)\n } else {\n result[key] = '[ChatKitMethod]'\n }\n }\n return result as RemoveMethods<T>\n}\n\nexport const debounce = (fn: () => void, delay = 150) => {\n let timer: ReturnType<typeof setTimeout>\n return () => {\n clearTimeout(timer)\n timer = setTimeout(fn, delay)\n }\n}\n","import type { ChatKitOptions, ChatKitPetAnimationName, ChatKitPetAnimationMode } from '@lichen-ai/chatkit-types'\nimport {\n DEFAULT_PET_STORAGE_KEY,\n clampPetPosition,\n getPinnedPetPosition,\n normalizeBoundsPadding,\n normalizePetOptions,\n resolvePetCharacter,\n type NormalizedPetOptions,\n type PetPosition,\n type PetSize,\n type PetSpriteAtlasDefinition,\n type PetViewport,\n type ResolvedPetCharacter\n} from '@lichen-ai/chatkit-types'\n\ntype TransientAnimation = {\n name: ChatKitPetAnimationName\n}\n\ntype PetOverlayCopy = {\n closePetMenuItem: string\n hideMessage: string\n expandMessage: string\n collapseMessage: string\n restoreMessage: string\n replyButton: string\n replyPlaceholder: string\n sendButton: string\n sendingButton: string\n sendFailed: string\n}\n\nexport type ThreadSummaryStatus = 'running' | 'completed' | 'failed'\n\nexport type ThreadSummary = {\n threadId: string\n title: string\n message: string\n status: ThreadSummaryStatus\n messageId?: string\n updatedAt?: string\n}\n\nconst DRAG_DIRECTION_THRESHOLD_PX = 2\nconst PET_BASE_RENDER_SCALE = 0.5\nconst PET_FRAME_DURATION_MULTIPLIER = 1.5\nconst PET_RESTING_FRAME_DURATION_MULTIPLIER = 3\nconst PET_RESTING_DELAY_MS = 2000\nconst PET_SUMMARY_GAP = 12\nconst PET_SUMMARY_WIDTH = 320\nconst PET_SUMMARY_MARGIN = 12\nconst PET_CONTEXT_MENU_MARGIN = 8\nconst PET_SUMMARY_FONT_FAMILY = 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif'\nconst PET_OVERLAY_COPY = {\n 'en-US': {\n closePetMenuItem: 'Close pet',\n hideMessage: 'Hide message',\n expandMessage: 'Expand message',\n collapseMessage: 'Collapse message',\n restoreMessage: 'Show message',\n replyButton: 'Reply',\n replyPlaceholder: 'Reply...',\n sendButton: 'Send',\n sendingButton: 'Sending...',\n sendFailed: 'Failed to send'\n },\n 'zh-CN': {\n closePetMenuItem: '关闭宠物',\n hideMessage: '隐藏消息',\n expandMessage: '展开消息',\n collapseMessage: '收起消息',\n restoreMessage: '显示消息',\n replyButton: '回复',\n replyPlaceholder: '输入回复...',\n sendButton: '发送',\n sendingButton: '发送中...',\n sendFailed: '发送失败'\n }\n} satisfies Record<string, PetOverlayCopy>\ntype PetOverlayCopyLocale = keyof typeof PET_OVERLAY_COPY\ntype PetOverlayTheme = Exclude<NonNullable<ChatKitOptions['theme']>, string>\n\ntype DragAnimationName = Extract<ChatKitPetAnimationName, 'running-left' | 'running-right'>\n\ntype PetOverlayOptions = {\n onActivate?: () => void\n onClose?: () => void\n onReply?: (text: string) => Promise<void>\n onThreadSummaryActivate?: (threadId: string) => void\n}\n\ntype SummaryDensityMetrics = {\n padding: string\n gap: number\n marginTop: number\n toggleSize: number\n actionSize: number\n}\n\nfunction stopEventPropagation(event: Event): void {\n event.stopPropagation()\n}\n\nfunction getViewportSize(): PetViewport {\n const visualViewport = window.visualViewport\n return {\n width: visualViewport?.width || window.innerWidth || 320,\n height: visualViewport?.height || window.innerHeight || 480\n }\n}\n\nfunction readPersistedPosition(storageKey: string, persist: boolean): PetPosition | null {\n if (!persist) {\n return null\n }\n\n try {\n const raw = window.localStorage.getItem(storageKey)\n if (!raw) {\n return null\n }\n const parsed = JSON.parse(raw) as { x?: unknown; y?: unknown } | null\n if (!parsed || typeof parsed !== 'object' || typeof parsed.x !== 'number' || typeof parsed.y !== 'number') {\n return null\n }\n return { x: parsed.x, y: parsed.y }\n } catch {\n return null\n }\n}\n\nfunction writePersistedPosition(storageKey: string, persist: boolean, position: PetPosition): void {\n if (!persist) {\n return\n }\n\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(position))\n } catch {\n // Persistence is best-effort; blocked storage should not break ChatKit.\n }\n}\n\nfunction escapeCssUrl(value: string): string {\n return value.replace(/[\"\\\\]/g, '\\\\$&')\n}\n\nfunction getRenderScale(scale: number): number {\n return Math.max(0.1, scale) * PET_BASE_RENDER_SCALE\n}\n\nfunction clampNumber(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction getDefaultLocale(): string | null {\n if (typeof window !== 'undefined') {\n try {\n const stored = window.localStorage.getItem('chatkit:locale')\n if (stored) {\n return stored\n }\n } catch {\n // Ignore unavailable localStorage in restricted host pages.\n }\n }\n\n return typeof navigator !== 'undefined' ? navigator.language : null\n}\n\nfunction resolveCopyLocale(locale?: string | null): PetOverlayCopyLocale {\n const normalized = (locale ?? getDefaultLocale() ?? '').trim().toLowerCase()\n if (normalized === 'zh-cn' || normalized === 'zh-hans' || normalized.startsWith('zh')) {\n return 'zh-CN'\n }\n\n return 'en-US'\n}\n\nfunction getSummaryDensityMetrics(density: NonNullable<PetOverlayTheme['density']>): SummaryDensityMetrics {\n switch (density) {\n case 'compact':\n return {\n padding: '8px 10px',\n gap: 6,\n marginTop: 3,\n toggleSize: 30,\n actionSize: 22\n }\n case 'spacious':\n return {\n padding: '14px 16px',\n gap: 10,\n marginTop: 6,\n toggleSize: 38,\n actionSize: 28\n }\n case 'normal':\n default:\n return {\n padding: '12px 14px',\n gap: 8,\n marginTop: 4,\n toggleSize: 34,\n actionSize: 26\n }\n }\n}\n\nfunction getSummaryRadius(radius: PetOverlayTheme['radius']): number {\n switch (radius) {\n case 'pill':\n return 24\n case 'round':\n return 16\n case 'sharp':\n return 0\n case 'soft':\n default:\n return 12\n }\n}\n\nfunction getSummaryThemeMetrics(theme?: ChatKitOptions['theme'] | null) {\n const themeObject = typeof theme === 'string' ? null : theme\n const baseSize = themeObject?.typography?.baseSize ?? 16\n const density = themeObject?.density ?? 'normal'\n const densityOffset = density === 'compact' ? -1 : density === 'spacious' ? 1 : 0\n const bodySize = clampNumber(baseSize - 2 + densityOffset, 11, 17)\n const densityMetrics = getSummaryDensityMetrics(density)\n\n return {\n ...densityMetrics,\n bodySize,\n titleSize: bodySize + 1,\n iconSize: clampNumber(bodySize + 2, 13, 19),\n radius: getSummaryRadius(themeObject?.radius),\n fontFamily: themeObject?.typography?.fontFamily ?? PET_SUMMARY_FONT_FAMILY\n }\n}\n\nfunction isPetState(value: unknown): value is ChatKitPetAnimationName {\n return (\n value === 'idle' ||\n value === 'running-right' ||\n value === 'running-left' ||\n value === 'waving' ||\n value === 'jumping' ||\n value === 'failed' ||\n value === 'waiting' ||\n value === 'running' ||\n value === 'review'\n )\n}\n\nexport function parsePetStateChangePayload(value: unknown): { state: ChatKitPetAnimationName } | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null\n }\n\n const payload = value as { state?: unknown }\n return isPetState(payload.state) ? { state: payload.state } : null\n}\n\nexport function parsePetOptionsChangePayload(value: unknown): { pet: ChatKitOptions['pet'] | null } | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null\n }\n\n const payload = value as { pet?: unknown }\n if (payload.pet === null || typeof payload.pet === 'boolean') {\n return { pet: payload.pet }\n }\n\n if (payload.pet && typeof payload.pet === 'object' && !Array.isArray(payload.pet)) {\n return { pet: payload.pet as ChatKitOptions['pet'] }\n }\n\n return null\n}\n\nfunction isThreadSummaryStatus(value: unknown): value is ThreadSummaryStatus {\n return value === 'running' || value === 'completed' || value === 'failed'\n}\n\nfunction getThreadSummaryKey(summary: ThreadSummary | null): string | null {\n if (!summary) {\n return null\n }\n\n return [summary.threadId, summary.messageId || summary.updatedAt || summary.message].join(':')\n}\n\nfunction getThreadSummaryInteractionKey(summary: ThreadSummary | null): string | null {\n if (!summary) {\n return null\n }\n\n return [summary.threadId, summary.messageId ?? ''].join(':')\n}\n\nfunction parseThreadSummaryPayload(value: unknown): { summary: ThreadSummary | null } | null {\n if (value === null) {\n return { summary: null }\n }\n\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null\n }\n\n const payload = value as {\n threadId?: unknown\n title?: unknown\n message?: unknown\n status?: unknown\n messageId?: unknown\n updatedAt?: unknown\n }\n if (\n typeof payload.threadId !== 'string' ||\n !payload.threadId.trim() ||\n typeof payload.title !== 'string' ||\n !payload.title.trim() ||\n typeof payload.message !== 'string' ||\n !payload.message.trim() ||\n !isThreadSummaryStatus(payload.status)\n ) {\n return null\n }\n\n return {\n summary: {\n threadId: payload.threadId,\n title: payload.title,\n message: payload.message,\n status: payload.status,\n ...(typeof payload.messageId === 'string' && payload.messageId.trim() ? { messageId: payload.messageId } : {}),\n ...(typeof payload.updatedAt === 'string' && payload.updatedAt.trim() ? { updatedAt: payload.updatedAt } : {})\n }\n }\n}\n\nexport function parseThreadSummaryLogPayload(value: unknown): { summary: ThreadSummary | null } | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null\n }\n\n const payload = value as {\n name?: unknown\n data?: unknown\n }\n if (payload.name !== 'thread.summary') {\n return null\n }\n\n return parseThreadSummaryPayload(payload.data ?? null)\n}\n\nexport class PetOverlay {\n private readonly root: ShadowRoot\n private readonly onActivate?: () => void\n private readonly onClose?: () => void\n private readonly onReply?: (text: string) => Promise<void>\n private readonly onThreadSummaryActivate?: (threadId: string) => void\n private overlayElement: HTMLDivElement | null = null\n private petElement: HTMLDivElement | null = null\n private contextMenuElement: HTMLDivElement | null = null\n private summaryElement: HTMLDivElement | null = null\n private summaryToggleElement: HTMLButtonElement | null = null\n private mediaElement: HTMLElement | null = null\n private options: NormalizedPetOptions | null = null\n private theme: ChatKitOptions['theme'] | null = null\n private resolved: ResolvedPetCharacter | null = null\n private summary: ThreadSummary | null = null\n private summaryRenderKey: string | null = null\n private dismissedSummaryKey: string | null = null\n private isSummaryCollapsed = false\n private isSummaryExpanded = false\n private isSummaryHovering = false\n private isReplyOpen = false\n private isReplySubmitting = false\n private replyError: string | null = null\n private replyDraft = ''\n private replyInputElement: HTMLInputElement | null = null\n private copyLocale: PetOverlayCopyLocale = resolveCopyLocale()\n private copy: PetOverlayCopy = PET_OVERLAY_COPY[this.copyLocale]\n private currentState: ChatKitPetAnimationName = 'waiting'\n private lastAutoState: ChatKitPetAnimationName = 'waiting'\n private transient: TransientAnimation | null = null\n private position: PetPosition | null = null\n private dragPosition: PetPosition | null = null\n private dragOffset: PetPosition = { x: 0, y: 0 }\n private lastDragPosition: PetPosition | null = null\n private lastDragClientX: number | null = null\n private dragAnimation: DragAnimationName | null = null\n private isDragging = false\n private isHovering = false\n private movedDuringDrag = false\n private prefersReducedMotion = false\n private frame = 0\n private completed = false\n private activeAnimationName: ChatKitPetAnimationName | null = null\n private activeAnimationMode: ChatKitPetAnimationMode | null = null\n private frameTimer: number | null = null\n private restingDelayTimer: number | null = null\n private mediaQuery: MediaQueryList | null = null\n private connected = false\n\n constructor(root: ShadowRoot, options?: PetOverlayOptions) {\n this.root = root\n this.onActivate = options?.onActivate\n this.onClose = options?.onClose\n this.onReply = options?.onReply\n this.onThreadSummaryActivate = options?.onThreadSummaryActivate\n this.connect()\n }\n\n connect(): void {\n if (this.connected) {\n return\n }\n this.connected = true\n this.installViewportListeners()\n this.installReducedMotionListener()\n this.render()\n }\n\n setOptions(pet: ChatKitOptions['pet'] | null, theme?: ChatKitOptions['theme']): void {\n this.closeContextMenu()\n const nextOptions = normalizePetOptions(pet)\n this.options = nextOptions\n this.theme = theme ?? null\n\n if (!nextOptions) {\n this.isDragging = false\n this.isHovering = false\n this.position = null\n this.dragPosition = null\n this.dragAnimation = null\n this.lastDragPosition = null\n this.lastDragClientX = null\n this.transient = null\n this.resolved = null\n this.clearRestingDelayTimer()\n this.removeDragListeners()\n this.removeOverlay()\n return\n }\n\n this.position = readPersistedPosition(DEFAULT_PET_STORAGE_KEY, nextOptions.position.persist)\n\n if (nextOptions.behavior === 'auto' && !this.prefersReducedMotion) {\n this.transient = { name: 'waving' }\n }\n\n this.resolveCharacter()\n this.render()\n }\n\n setState(state: ChatKitPetAnimationName): void {\n const previous = this.lastAutoState\n this.lastAutoState = state\n this.currentState = state\n\n if (\n this.options?.behavior === 'auto' &&\n !this.prefersReducedMotion &&\n state === 'idle' &&\n (previous === 'running' || previous === 'review') &&\n !this.transient\n ) {\n this.transient = { name: 'jumping' }\n } else if (state !== 'idle') {\n this.transient = null\n }\n\n this.render()\n }\n\n setLocale(locale?: string | null): void {\n const nextLocale = resolveCopyLocale(locale)\n if (nextLocale === this.copyLocale) {\n return\n }\n\n this.copyLocale = nextLocale\n this.copy = PET_OVERLAY_COPY[nextLocale]\n this.summaryRenderKey = null\n this.closeContextMenu()\n this.render()\n }\n\n setThreadSummary(summary: ThreadSummary | null): void {\n const previousKey = getThreadSummaryInteractionKey(this.summary)\n const nextKey = getThreadSummaryInteractionKey(summary)\n this.summary = summary\n\n if (!summary) {\n this.isSummaryCollapsed = false\n this.isSummaryExpanded = false\n this.isSummaryHovering = false\n this.isReplyOpen = false\n this.isReplySubmitting = false\n this.replyError = null\n this.replyDraft = ''\n this.summaryRenderKey = null\n this.removeSummaryElements()\n return\n }\n\n if (previousKey !== nextKey) {\n this.isSummaryCollapsed = false\n this.isSummaryExpanded = false\n this.isSummaryHovering = false\n this.isReplyOpen = false\n this.isReplySubmitting = false\n this.replyError = null\n this.replyDraft = ''\n }\n\n this.render()\n }\n\n setThreadSummaryStatus(status: ThreadSummaryStatus): void {\n if (!this.summary || this.summary.status === status) {\n return\n }\n\n this.summary = { ...this.summary, status }\n this.render()\n }\n\n destroy(): void {\n if (!this.connected) {\n return\n }\n this.connected = false\n this.clearRestingDelayTimer()\n this.clearTimers()\n this.removeDragListeners()\n this.removeOverlay()\n window.removeEventListener('resize', this.handleViewportChange)\n window.visualViewport?.removeEventListener('resize', this.handleViewportChange)\n window.visualViewport?.removeEventListener('scroll', this.handleViewportChange)\n this.mediaQuery?.removeEventListener?.('change', this.handleReducedMotionChange)\n this.mediaQuery = null\n }\n\n private installViewportListeners(): void {\n window.addEventListener('resize', this.handleViewportChange)\n window.visualViewport?.addEventListener('resize', this.handleViewportChange)\n window.visualViewport?.addEventListener('scroll', this.handleViewportChange)\n }\n\n private installReducedMotionListener(): void {\n if (!window.matchMedia) {\n return\n }\n\n this.mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)')\n this.prefersReducedMotion = this.mediaQuery.matches\n this.mediaQuery.addEventListener?.('change', this.handleReducedMotionChange)\n }\n\n private handleViewportChange = (): void => {\n this.closeContextMenu()\n this.render()\n }\n\n private handleReducedMotionChange = (): void => {\n this.prefersReducedMotion = Boolean(this.mediaQuery?.matches)\n if (this.prefersReducedMotion) {\n this.transient = null\n }\n this.render()\n }\n\n private resolveCharacter(): void {\n if (!this.options) {\n this.resolved = null\n return\n }\n\n const character = this.options.character\n this.resolved = resolvePetCharacter(character)\n }\n\n private ensureOverlay(): void {\n if (this.overlayElement && this.petElement) {\n return\n }\n\n const overlay = document.createElement('div')\n overlay.setAttribute('data-chatkit-host-pet-layer', '')\n overlay.style.position = 'fixed'\n overlay.style.inset = '0'\n overlay.style.pointerEvents = 'none'\n overlay.style.overflow = 'visible'\n\n const style = document.createElement('style')\n style.textContent = `\n @keyframes chatkit-pet-summary-spin {\n to { transform: rotate(360deg); }\n }\n `\n\n const pet = document.createElement('div')\n pet.setAttribute('data-chatkit-host-pet', '')\n pet.style.position = 'absolute'\n pet.style.top = '0'\n pet.style.left = '0'\n pet.style.pointerEvents = 'auto'\n pet.style.touchAction = 'none'\n pet.style.userSelect = 'none'\n pet.style.willChange = 'transform'\n pet.addEventListener('pointerenter', this.handlePointerEnter)\n pet.addEventListener('pointerleave', this.handlePointerLeave)\n pet.addEventListener('pointerdown', this.handlePointerDown)\n pet.addEventListener('contextmenu', this.handleContextMenu)\n pet.addEventListener('click', this.handleClick)\n\n overlay.append(style, pet)\n this.root.append(overlay)\n this.overlayElement = overlay\n this.petElement = pet\n }\n\n private removeOverlay(): void {\n this.clearRestingDelayTimer()\n this.clearTimers()\n this.closeContextMenu()\n if (this.petElement) {\n this.petElement.removeEventListener('pointerenter', this.handlePointerEnter)\n this.petElement.removeEventListener('pointerleave', this.handlePointerLeave)\n this.petElement.removeEventListener('pointerdown', this.handlePointerDown)\n this.petElement.removeEventListener('contextmenu', this.handleContextMenu)\n this.petElement.removeEventListener('click', this.handleClick)\n }\n this.isHovering = false\n this.removeSummaryElements()\n this.overlayElement?.remove()\n this.overlayElement = null\n this.petElement = null\n this.mediaElement = null\n }\n\n private removeSummaryElements(): void {\n this.summaryElement?.remove()\n this.summaryToggleElement?.remove()\n this.summaryElement = null\n this.summaryToggleElement = null\n this.replyInputElement = null\n this.summaryRenderKey = null\n }\n\n private getSize(): PetSize {\n if (!this.options || !this.resolved) {\n return { width: 0, height: 0 }\n }\n\n const scale = getRenderScale(this.options.position.scale)\n const baseSize = {\n width: this.resolved.atlas.cellWidth,\n height: this.resolved.atlas.cellHeight\n }\n return {\n width: baseSize.width * scale,\n height: baseSize.height * scale\n }\n }\n\n private getCurrentPosition(size: PetSize): PetPosition {\n const options = this.options\n if (!options) {\n return { x: 0, y: 0 }\n }\n\n const viewport = getViewportSize()\n const padding = normalizeBoundsPadding(options.position.boundsPadding)\n const pin = options.position.pin === undefined ? 'bottom-right' : options.position.pin\n const pinnedPosition = pin ? getPinnedPetPosition(pin, size, viewport, padding) : null\n\n return clampPetPosition(\n this.dragPosition ?? this.position ?? pinnedPosition ?? { x: padding.left, y: padding.top },\n size,\n viewport,\n padding\n )\n }\n\n private persistPosition(nextPosition: PetPosition): void {\n if (!this.options) {\n return\n }\n\n const size = this.getSize()\n const clamped = clampPetPosition(\n nextPosition,\n size,\n getViewportSize(),\n normalizeBoundsPadding(this.options.position.boundsPadding)\n )\n this.position = clamped\n writePersistedPosition(DEFAULT_PET_STORAGE_KEY, this.options.position.persist, clamped)\n }\n\n private getActiveAnimationName(): ChatKitPetAnimationName {\n if (!this.options) {\n return 'idle'\n }\n\n if (this.isDragging) {\n return this.dragAnimation ?? 'running'\n }\n\n if (this.transient) {\n return this.transient.name\n }\n\n if (this.options.behavior === 'manual') {\n return 'idle'\n }\n\n return this.currentState\n }\n\n private getActiveAnimationMode(): ChatKitPetAnimationMode {\n if (this.isDragging) {\n return 'loop'\n }\n\n return this.transient ? 'once' : 'loop'\n }\n\n private resetAnimationIfNeeded(name: ChatKitPetAnimationName, mode: ChatKitPetAnimationMode): void {\n if (this.activeAnimationName === name && this.activeAnimationMode === mode) {\n return\n }\n\n this.clearTimers()\n this.activeAnimationName = name\n this.activeAnimationMode = mode\n this.frame = 0\n this.completed = false\n }\n\n private render(): void {\n if (!this.options || !this.resolved) {\n this.clearTimers()\n if (this.petElement) {\n this.petElement.replaceChildren()\n }\n this.removeSummaryElements()\n this.mediaElement = null\n this.activeAnimationName = null\n this.activeAnimationMode = null\n this.frame = 0\n this.completed = false\n return\n }\n\n this.ensureOverlay()\n const overlay = this.overlayElement\n const pet = this.petElement\n if (!overlay || !pet) {\n return\n }\n\n const size = this.getSize()\n const position = this.getCurrentPosition(size)\n const animationName = this.getActiveAnimationName()\n const animationMode = this.getActiveAnimationMode()\n this.resetAnimationIfNeeded(animationName, animationMode)\n\n overlay.style.zIndex = String(this.options.position.zIndex)\n pet.style.width = `${size.width}px`\n pet.style.height = `${size.height}px`\n pet.style.transform = `translate3d(${position.x}px, ${position.y}px, 0)`\n pet.style.cursor = this.options.position.draggable ? (this.isDragging ? 'grabbing' : 'grab') : 'default'\n pet.dataset.petAnimation = animationName\n pet.setAttribute('aria-label', this.options.ariaLabel)\n pet.setAttribute('role', 'img')\n\n this.renderAtlas(animationName, animationMode)\n this.renderThreadSummary(position, size)\n\n this.scheduleNextFrame(animationName, animationMode)\n }\n\n private renderThreadSummary(position: PetPosition, size: PetSize): void {\n const summary = this.summary\n const summaryKey = getThreadSummaryKey(summary)\n if (!summary || !summaryKey || this.dismissedSummaryKey === summaryKey) {\n this.removeSummaryElements()\n return\n }\n\n if (this.isSummaryCollapsed) {\n this.renderCollapsedSummary(position, size)\n return\n }\n\n const nextRenderKey = [\n this.copyLocale,\n this.isSummaryExpanded ? 'expanded' : 'compact',\n this.isSummaryHovering ? 'hover' : 'rest',\n this.isReplyOpen ? 'reply' : 'closed',\n this.isReplySubmitting ? 'submitting' : 'ready',\n this.replyError ?? ''\n ].join('|')\n\n if (!this.summaryElement || this.summaryRenderKey !== nextRenderKey) {\n this.summaryElement?.remove()\n this.summaryToggleElement?.remove()\n this.summaryElement = this.createSummaryBubble(summary)\n this.summaryToggleElement = this.createSummaryToggleButton('v')\n this.overlayElement?.append(this.summaryElement, this.summaryToggleElement)\n this.summaryRenderKey = nextRenderKey\n if (this.isReplyOpen && !this.isReplySubmitting) {\n window.setTimeout(() => this.replyInputElement?.focus(), 0)\n }\n }\n\n this.updateSummaryBubbleContent(summary)\n this.positionSummaryBubble(position, size)\n }\n\n private renderCollapsedSummary(position: PetPosition, size: PetSize): void {\n this.summaryElement?.remove()\n this.summaryElement = null\n this.summaryRenderKey = null\n\n if (!this.summaryToggleElement) {\n this.summaryToggleElement = this.createSummaryToggleButton('1')\n this.overlayElement?.append(this.summaryToggleElement)\n }\n\n this.summaryToggleElement.textContent = '1'\n this.positionSummaryToggleBadge(position, size)\n }\n\n private positionSummaryToggleBadge(position: PetPosition, size: PetSize): void {\n const badge = this.summaryToggleElement\n if (!badge) {\n return\n }\n\n const viewport = getViewportSize()\n const badgeSize = getSummaryThemeMetrics(this.theme).toggleSize\n const x = clampNumber(\n position.x + size.width - badgeSize * 0.35,\n PET_SUMMARY_MARGIN,\n viewport.width - badgeSize - PET_SUMMARY_MARGIN\n )\n const y = clampNumber(\n position.y - badgeSize * 0.35,\n PET_SUMMARY_MARGIN,\n viewport.height - badgeSize - PET_SUMMARY_MARGIN\n )\n badge.style.width = `${badgeSize}px`\n badge.style.height = `${badgeSize}px`\n badge.style.transform = `translate3d(${x}px, ${y}px, 0)`\n badge.style.borderRadius = '999px'\n }\n\n private positionSummaryBubble(position: PetPosition, size: PetSize): void {\n const bubble = this.summaryElement\n const toggle = this.summaryToggleElement\n if (!bubble || !toggle) {\n return\n }\n\n const viewport = getViewportSize()\n const width = Math.min(PET_SUMMARY_WIDTH, viewport.width - PET_SUMMARY_MARGIN * 2)\n bubble.style.width = `${width}px`\n const bubbleHeight = bubble.offsetHeight || 96\n const aboveY = position.y - bubbleHeight - PET_SUMMARY_GAP\n const showAbove = aboveY >= PET_SUMMARY_MARGIN\n const y = showAbove\n ? aboveY\n : clampNumber(\n position.y + size.height + PET_SUMMARY_GAP,\n PET_SUMMARY_MARGIN,\n viewport.height - bubbleHeight - PET_SUMMARY_MARGIN\n )\n const x = clampNumber(\n position.x + size.width / 2 - width / 2,\n PET_SUMMARY_MARGIN,\n viewport.width - width - PET_SUMMARY_MARGIN\n )\n\n bubble.style.transform = `translate3d(${x}px, ${y}px, 0)`\n this.positionSummaryToggleBadge(position, size)\n }\n\n private createSummaryBubble(summary: ThreadSummary): HTMLDivElement {\n const shouldShowReplyButton = this.isSummaryHovering && !this.isReplyOpen\n const metrics = getSummaryThemeMetrics(this.theme)\n\n const bubble = document.createElement('div')\n bubble.setAttribute('data-chatkit-pet-summary', '')\n bubble.addEventListener('pointerenter', this.handleSummaryPointerEnter)\n bubble.addEventListener('pointerleave', this.handleSummaryPointerLeave)\n bubble.addEventListener('click', this.handleSummaryClick)\n bubble.style.position = 'absolute'\n bubble.style.top = '0'\n bubble.style.left = '0'\n bubble.style.boxSizing = 'border-box'\n bubble.style.pointerEvents = 'auto'\n bubble.style.padding = metrics.padding\n bubble.style.border = '1px solid rgba(148, 163, 184, 0.22)'\n bubble.style.borderRadius = `${metrics.radius}px`\n bubble.style.background = 'rgba(255, 255, 255, 0.94)'\n bubble.style.color = '#1f2937'\n bubble.style.boxShadow = '0 8px 24px rgba(15, 23, 42, 0.1)'\n bubble.style.font = `500 ${metrics.bodySize}px/1.35 ${metrics.fontFamily}`\n bubble.style.backdropFilter = 'blur(10px)'\n\n const header = document.createElement('div')\n header.style.display = 'flex'\n header.style.alignItems = 'center'\n header.style.gap = `${metrics.gap}px`\n\n if (this.isSummaryHovering || this.isReplyOpen) {\n header.append(this.createSummaryActionButton('x', this.copy.hideMessage, this.handleSummaryDelete))\n }\n\n const title = document.createElement('div')\n title.textContent = summary.title\n title.style.minWidth = '0'\n title.style.flex = '1'\n title.style.overflow = 'hidden'\n title.style.textOverflow = 'ellipsis'\n title.style.whiteSpace = 'nowrap'\n title.style.fontWeight = '700'\n title.style.fontSize = `${metrics.titleSize}px`\n title.dataset.chatkitPetSummaryTitle = ''\n header.append(title)\n\n if (this.isSummaryHovering || this.isReplyOpen) {\n header.append(\n this.createSummaryActionButton(\n this.isSummaryExpanded ? '-' : '>',\n this.isSummaryExpanded ? this.copy.collapseMessage : this.copy.expandMessage,\n this.handleSummaryExpandToggle\n )\n )\n } else {\n header.append(this.createStatusIcon(summary.status))\n }\n\n const message = document.createElement('div')\n message.textContent = summary.message\n message.style.marginTop = `${metrics.marginTop}px`\n message.style.fontWeight = '400'\n message.style.color = '#374151'\n message.style.overflow = 'hidden'\n if (this.isSummaryExpanded) {\n message.style.maxHeight = '7em'\n message.style.overflowY = 'auto'\n } else {\n message.style.display = '-webkit-box'\n message.style.setProperty('-webkit-line-clamp', '2')\n message.style.setProperty('-webkit-box-orient', 'vertical')\n }\n message.dataset.chatkitPetSummaryMessage = ''\n\n bubble.append(header, message)\n\n if (shouldShowReplyButton) {\n const reply = this.createTextButton(this.copy.replyButton, this.handleReplyOpen)\n reply.style.position = 'absolute'\n reply.style.right = '14px'\n reply.style.bottom = '10px'\n bubble.append(reply)\n }\n\n if (this.isReplyOpen) {\n bubble.append(this.createReplyForm())\n }\n\n return bubble\n }\n\n private updateSummaryBubbleContent(summary: ThreadSummary): void {\n const title = this.summaryElement?.querySelector<HTMLElement>('[data-chatkit-pet-summary-title]')\n if (title && title.textContent !== summary.title) {\n title.textContent = summary.title\n }\n\n const message = this.summaryElement?.querySelector<HTMLElement>('[data-chatkit-pet-summary-message]')\n if (message && message.textContent !== summary.message) {\n message.textContent = summary.message\n }\n\n const statusIcon = this.summaryElement?.querySelector<HTMLElement>('[data-chatkit-pet-summary-status]')\n if (statusIcon && statusIcon.dataset.chatkitPetSummaryStatus !== summary.status) {\n const nextIcon = this.createStatusIcon(summary.status)\n statusIcon.replaceWith(nextIcon)\n }\n }\n\n private createSummaryToggleButton(label: string): HTMLButtonElement {\n const metrics = getSummaryThemeMetrics(this.theme)\n const button = document.createElement('button')\n button.type = 'button'\n button.textContent = label\n button.title = label === '1' ? this.copy.restoreMessage : this.copy.collapseMessage\n button.addEventListener('click', stopEventPropagation)\n button.addEventListener('click', this.handleSummaryCollapseToggle)\n button.style.position = 'absolute'\n button.style.top = '0'\n button.style.left = '0'\n button.style.pointerEvents = 'auto'\n button.style.border = '1px solid rgba(148, 163, 184, 0.28)'\n button.style.background = 'rgba(248, 250, 252, 0.94)'\n button.style.color = '#475569'\n button.style.boxShadow = '0 6px 18px rgba(15, 23, 42, 0.1)'\n button.style.cursor = 'pointer'\n button.style.font = `600 ${metrics.titleSize}px/1 ${metrics.fontFamily}`\n button.style.display = 'flex'\n button.style.alignItems = 'center'\n button.style.justifyContent = 'center'\n return button\n }\n\n private createStatusIcon(status: ThreadSummaryStatus): HTMLSpanElement {\n const metrics = getSummaryThemeMetrics(this.theme)\n const iconSize = metrics.iconSize\n const icon = document.createElement('span')\n icon.setAttribute('aria-hidden', 'true')\n icon.dataset.chatkitPetSummaryStatus = status\n icon.style.display = 'inline-flex'\n icon.style.width = `${iconSize}px`\n icon.style.height = `${iconSize}px`\n icon.style.alignItems = 'center'\n icon.style.justifyContent = 'center'\n icon.style.flex = '0 0 auto'\n\n if (status === 'running') {\n icon.style.border = '2px solid rgba(71, 85, 105, 0.32)'\n icon.style.borderTopColor = '#64748b'\n icon.style.borderRadius = '999px'\n icon.style.animation = 'chatkit-pet-summary-spin 900ms linear infinite'\n return icon\n }\n\n icon.style.borderRadius = '999px'\n icon.style.fontSize = `${Math.max(10, iconSize - 4)}px`\n icon.style.fontWeight = '700'\n if (status === 'failed') {\n icon.textContent = '!'\n icon.style.background = '#fee2e2'\n icon.style.color = '#b91c1c'\n return icon\n }\n\n icon.textContent = ''\n icon.style.border = '2px solid #22c55e'\n icon.style.position = 'relative'\n const check = document.createElement('span')\n check.style.width = `${Math.round(iconSize * 0.44)}px`\n check.style.height = `${Math.round(iconSize * 0.25)}px`\n check.style.borderLeft = '2px solid #22c55e'\n check.style.borderBottom = '2px solid #22c55e'\n check.style.transform = 'rotate(-45deg) translate(1px, -1px)'\n icon.append(check)\n return icon\n }\n\n private createSummaryActionButton(label: string, title: string, onClick: () => void): HTMLButtonElement {\n const metrics = getSummaryThemeMetrics(this.theme)\n const button = document.createElement('button')\n button.type = 'button'\n button.textContent = label\n button.title = title\n button.addEventListener('click', (event) => {\n event.preventDefault()\n event.stopPropagation()\n onClick()\n })\n button.style.width = `${metrics.actionSize}px`\n button.style.height = `${metrics.actionSize}px`\n button.style.border = '0'\n button.style.borderRadius = '999px'\n button.style.background = 'rgba(241, 245, 249, 0.96)'\n button.style.color = '#475569'\n button.style.cursor = 'pointer'\n button.style.font = `600 ${metrics.titleSize}px/1 ${metrics.fontFamily}`\n return button\n }\n\n private createTextButton(label: string, onClick: () => void): HTMLButtonElement {\n const button = document.createElement('button')\n button.type = 'button'\n button.textContent = label\n button.addEventListener('click', (event) => {\n event.preventDefault()\n event.stopPropagation()\n onClick()\n })\n button.style.border = '1px solid rgba(148, 163, 184, 0.28)'\n button.style.borderRadius = '999px'\n button.style.background = 'rgba(248, 250, 252, 0.95)'\n button.style.color = '#334155'\n button.style.cursor = 'pointer'\n button.style.padding = '3px 10px'\n button.style.font = '600 12px/1.4 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif'\n return button\n }\n\n private createReplyForm(): HTMLFormElement {\n const form = document.createElement('form')\n form.addEventListener('click', stopEventPropagation)\n form.addEventListener('submit', this.handleReplySubmit)\n form.addEventListener('keydown', this.handleReplyKeyDown)\n form.style.display = 'flex'\n form.style.gap = '6px'\n form.style.alignItems = 'center'\n form.style.marginTop = '8px'\n\n const input = document.createElement('input')\n input.type = 'text'\n input.value = this.replyDraft\n input.disabled = this.isReplySubmitting\n input.placeholder = this.copy.replyPlaceholder\n input.addEventListener('input', this.handleReplyInput)\n input.style.minWidth = '0'\n input.style.flex = '1'\n input.style.border = '1px solid rgba(148, 163, 184, 0.35)'\n input.style.borderRadius = '999px'\n input.style.padding = '6px 10px'\n input.style.font = '400 13px/1.2 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif'\n this.replyInputElement = input\n\n const send = document.createElement('button')\n send.type = 'submit'\n send.textContent = this.isReplySubmitting ? this.copy.sendingButton : this.copy.sendButton\n send.disabled = this.isReplySubmitting\n send.style.border = '0'\n send.style.borderRadius = '999px'\n send.style.background = '#22c55e'\n send.style.color = '#052e16'\n send.style.cursor = this.isReplySubmitting ? 'default' : 'pointer'\n send.style.padding = '6px 10px'\n send.style.font = '700 12px/1.2 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif'\n\n form.append(input, send)\n\n if (this.replyError) {\n const error = document.createElement('div')\n error.textContent = this.copy.sendFailed\n error.style.flexBasis = '100%'\n error.style.color = '#b91c1c'\n error.style.fontSize = '12px'\n form.style.flexWrap = 'wrap'\n form.append(error)\n }\n\n return form\n }\n\n private createContextMenu(): HTMLDivElement {\n const menu = document.createElement('div')\n menu.setAttribute('data-chatkit-pet-context-menu', '')\n menu.setAttribute('role', 'menu')\n menu.addEventListener('contextmenu', this.handleContextMenuEvent)\n menu.addEventListener('pointerdown', stopEventPropagation)\n menu.addEventListener('click', stopEventPropagation)\n menu.style.position = 'absolute'\n menu.style.top = '0'\n menu.style.left = '0'\n menu.style.boxSizing = 'border-box'\n menu.style.minWidth = '132px'\n menu.style.padding = '4px'\n menu.style.pointerEvents = 'auto'\n menu.style.border = '1px solid rgba(148, 163, 184, 0.28)'\n menu.style.borderRadius = '10px'\n menu.style.background = 'rgba(255, 255, 255, 0.96)'\n menu.style.color = '#1f2937'\n menu.style.boxShadow = '0 12px 28px rgba(15, 23, 42, 0.16)'\n menu.style.font = '500 13px/1.3 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif'\n menu.style.backdropFilter = 'blur(10px)'\n\n const closeItem = document.createElement('button')\n closeItem.type = 'button'\n closeItem.textContent = this.copy.closePetMenuItem\n closeItem.setAttribute('role', 'menuitem')\n closeItem.addEventListener('click', this.handleClosePetMenuItemClick)\n closeItem.style.display = 'block'\n closeItem.style.width = '100%'\n closeItem.style.border = '0'\n closeItem.style.borderRadius = '7px'\n closeItem.style.background = 'transparent'\n closeItem.style.color = 'inherit'\n closeItem.style.cursor = 'pointer'\n closeItem.style.padding = '7px 10px'\n closeItem.style.textAlign = 'left'\n closeItem.style.font = 'inherit'\n\n menu.append(closeItem)\n return menu\n }\n\n private openContextMenu(position: PetPosition): void {\n const overlay = this.overlayElement\n if (!overlay) {\n return\n }\n\n this.closeContextMenu()\n const menu = this.createContextMenu()\n overlay.append(menu)\n this.contextMenuElement = menu\n this.positionContextMenu(position)\n menu.querySelector('button')?.focus({ preventScroll: true })\n window.addEventListener('pointerdown', this.handleContextMenuOutsidePointerDown, true)\n window.addEventListener('keydown', this.handleContextMenuKeyDown)\n }\n\n private closeContextMenu(): void {\n this.contextMenuElement?.remove()\n this.contextMenuElement = null\n window.removeEventListener('pointerdown', this.handleContextMenuOutsidePointerDown, true)\n window.removeEventListener('keydown', this.handleContextMenuKeyDown)\n }\n\n private positionContextMenu(position: PetPosition): void {\n const menu = this.contextMenuElement\n if (!menu) {\n return\n }\n\n const viewport = getViewportSize()\n const width = menu.offsetWidth || 132\n const height = menu.offsetHeight || 40\n const maxX = Math.max(PET_CONTEXT_MENU_MARGIN, viewport.width - width - PET_CONTEXT_MENU_MARGIN)\n const maxY = Math.max(PET_CONTEXT_MENU_MARGIN, viewport.height - height - PET_CONTEXT_MENU_MARGIN)\n const x = clampNumber(position.x, PET_CONTEXT_MENU_MARGIN, maxX)\n const y = clampNumber(position.y, PET_CONTEXT_MENU_MARGIN, maxY)\n menu.style.transform = `translate3d(${x}px, ${y}px, 0)`\n }\n\n private renderAtlas(animationName: ChatKitPetAnimationName, animationMode: ChatKitPetAnimationMode): void {\n if (!this.petElement || this.resolved?.kind !== 'atlas' || !this.options) {\n return\n }\n\n if (!(this.mediaElement instanceof HTMLDivElement)) {\n const frame = document.createElement('div')\n frame.setAttribute('aria-hidden', 'true')\n this.petElement.replaceChildren(frame)\n this.mediaElement = frame\n }\n\n const frameElement = this.mediaElement\n const atlas = this.resolved.atlas\n const definition = atlas.animations[animationName] ?? atlas.animations.idle\n const safeFrame =\n animationMode === 'once' && this.completed\n ? Math.max(0, definition.frames - 1)\n : Math.min(this.frame, Math.max(0, definition.frames - 1))\n const scale = getRenderScale(this.options.position.scale)\n const sourceWidth = atlas.cellWidth\n const sourceHeight = atlas.cellHeight\n const backgroundWidth = atlas.columns * sourceWidth\n const backgroundHeight = atlas.rows * sourceHeight\n\n frameElement.style.width = `${sourceWidth}px`\n frameElement.style.height = `${sourceHeight}px`\n frameElement.style.overflow = 'hidden'\n frameElement.style.transform = `scale(${scale})`\n frameElement.style.transformOrigin = 'top left'\n frameElement.style.pointerEvents = 'none'\n frameElement.style.backgroundImage = `url(\"${escapeCssUrl(this.resolved.src)}\")`\n frameElement.style.backgroundRepeat = 'no-repeat'\n frameElement.style.backgroundSize = `${backgroundWidth}px ${backgroundHeight}px`\n frameElement.style.backgroundPosition = `${-safeFrame * sourceWidth}px ${-definition.row * sourceHeight}px`\n frameElement.style.imageRendering = this.options.imageRendering\n frameElement.dataset.petFrame = String(safeFrame)\n }\n\n private scheduleNextFrame(animationName: ChatKitPetAnimationName, animationMode: ChatKitPetAnimationMode): void {\n if (this.prefersReducedMotion || this.completed || !this.resolved) {\n this.clearTimers()\n return\n }\n\n if (this.frameTimer !== null) {\n return\n }\n\n const atlas: PetSpriteAtlasDefinition = this.resolved.atlas\n const definition = atlas.animations[animationName] ?? atlas.animations.idle\n const duration =\n definition.frameDurations[this.frame] ?? definition.frameDurations[definition.frameDurations.length - 1] ?? 150\n const baseDuration = duration * PET_FRAME_DURATION_MULTIPLIER\n const effectiveDuration =\n this.isHovering || this.isDragging ? baseDuration : baseDuration * PET_RESTING_FRAME_DURATION_MULTIPLIER\n\n this.frameTimer = window.setTimeout(() => {\n this.frameTimer = null\n const nextFrame = this.frame + 1\n\n if (nextFrame >= definition.frames) {\n if (animationMode === 'once') {\n this.completed = true\n this.frame = Math.max(0, definition.frames - 1)\n this.finishTransient()\n return\n }\n\n this.frame = 0\n this.render()\n return\n }\n\n this.frame = nextFrame\n this.render()\n }, effectiveDuration)\n }\n\n private clearTimers(): void {\n if (this.frameTimer !== null) {\n window.clearTimeout(this.frameTimer)\n this.frameTimer = null\n }\n }\n\n private clearRestingDelayTimer(): void {\n if (this.restingDelayTimer !== null) {\n window.clearTimeout(this.restingDelayTimer)\n this.restingDelayTimer = null\n }\n }\n\n private finishTransient(): void {\n this.transient = null\n this.activeAnimationName = null\n this.activeAnimationMode = null\n this.render()\n }\n\n private rescheduleAnimation(): void {\n this.clearTimers()\n this.render()\n }\n\n private enterRestingAfterDelay(): void {\n this.clearRestingDelayTimer()\n this.isHovering = true\n this.restingDelayTimer = window.setTimeout(() => {\n this.restingDelayTimer = null\n if (this.isDragging) {\n return\n }\n this.isHovering = false\n this.rescheduleAnimation()\n }, PET_RESTING_DELAY_MS)\n }\n\n private isPointOverPet(clientX: number, clientY: number): boolean {\n const rect = this.petElement?.getBoundingClientRect()\n if (!rect) {\n return false\n }\n\n return clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom\n }\n\n private isPointerOverPet(event: PointerEvent): boolean {\n return this.isPointOverPet(event.clientX, event.clientY)\n }\n\n private handlePointerEnter = (): void => {\n this.clearRestingDelayTimer()\n this.isHovering = true\n this.rescheduleAnimation()\n }\n\n private handlePointerLeave = (): void => {\n if (!this.isDragging) {\n this.enterRestingAfterDelay()\n }\n }\n\n private handleContextMenu = (event: MouseEvent): void => {\n event.preventDefault()\n event.stopPropagation()\n this.openContextMenu({ x: event.clientX, y: event.clientY })\n }\n\n private handleContextMenuEvent = (event: Event): void => {\n event.preventDefault()\n event.stopPropagation()\n }\n\n private handleContextMenuOutsidePointerDown = (event: PointerEvent): void => {\n const menu = this.contextMenuElement\n if (menu && event.composedPath().includes(menu)) {\n return\n }\n\n this.closeContextMenu()\n }\n\n private handleContextMenuKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape') {\n return\n }\n\n event.preventDefault()\n this.closeContextMenu()\n }\n\n private handleClosePetMenuItemClick = (event: Event): void => {\n event.preventDefault()\n event.stopPropagation()\n this.closeContextMenu()\n this.onClose?.()\n }\n\n private handleSummaryPointerEnter = (): void => {\n this.isSummaryHovering = true\n this.render()\n }\n\n private handleSummaryPointerLeave = (): void => {\n this.isSummaryHovering = false\n if (!this.isReplyOpen) {\n this.render()\n }\n }\n\n private handleSummaryClick = (): void => {\n const threadId = this.summary?.threadId.trim()\n if (!threadId) {\n return\n }\n\n this.onThreadSummaryActivate?.(threadId)\n }\n\n private handleSummaryDelete = (): void => {\n const summaryKey = getThreadSummaryKey(this.summary)\n if (summaryKey) {\n this.dismissedSummaryKey = summaryKey\n }\n this.isSummaryCollapsed = false\n this.isReplyOpen = false\n this.replyDraft = ''\n this.replyError = null\n this.removeSummaryElements()\n }\n\n private handleSummaryCollapseToggle = (): void => {\n this.isSummaryCollapsed = !this.isSummaryCollapsed\n this.isSummaryExpanded = false\n this.isReplyOpen = false\n this.replyError = null\n this.render()\n }\n\n private handleSummaryExpandToggle = (): void => {\n this.isSummaryExpanded = !this.isSummaryExpanded\n this.render()\n }\n\n private handleReplyOpen = (): void => {\n this.isReplyOpen = true\n this.replyError = null\n this.render()\n }\n\n private handleReplyInput = (event: Event): void => {\n const target = event.currentTarget\n if (target instanceof HTMLInputElement) {\n this.replyDraft = target.value\n this.replyError = null\n }\n }\n\n private handleReplySubmit = (event: Event): void => {\n event.preventDefault()\n void this.submitReply()\n }\n\n private handleReplyKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape') {\n return\n }\n\n event.preventDefault()\n this.isReplyOpen = false\n this.replyError = null\n this.render()\n }\n\n private async submitReply(): Promise<void> {\n const text = this.replyDraft.trim()\n if (!text || this.isReplySubmitting) {\n return\n }\n\n this.isReplySubmitting = true\n this.replyError = null\n this.render()\n try {\n await this.onReply?.(text)\n this.replyDraft = ''\n this.isReplyOpen = false\n this.isSummaryHovering = false\n } catch {\n this.replyError = 'Failed to send'\n } finally {\n this.isReplySubmitting = false\n this.render()\n }\n }\n\n private handlePointerDown = (event: PointerEvent): void => {\n if (event.button !== 0 || event.ctrlKey) {\n return\n }\n\n this.closeContextMenu()\n\n if (!this.options?.position.draggable) {\n return\n }\n\n event.preventDefault()\n const rect = this.petElement?.getBoundingClientRect()\n if (!rect) {\n return\n }\n\n const nextPosition = {\n x: rect.left,\n y: rect.top\n }\n this.dragOffset = {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top\n }\n this.lastDragPosition = nextPosition\n this.lastDragClientX = event.clientX\n this.dragAnimation = null\n this.movedDuringDrag = false\n this.dragPosition = nextPosition\n this.isDragging = true\n this.clearRestingDelayTimer()\n this.isHovering = true\n this.installDragListeners()\n this.rescheduleAnimation()\n }\n\n private getNextDragPosition(event: PointerEvent): PetPosition {\n if (!this.options) {\n return { x: 0, y: 0 }\n }\n\n return clampPetPosition(\n {\n x: event.clientX - this.dragOffset.x,\n y: event.clientY - this.dragOffset.y\n },\n this.getSize(),\n getViewportSize(),\n normalizeBoundsPadding(this.options.position.boundsPadding)\n )\n }\n\n private handlePointerMove = (event: PointerEvent): void => {\n const nextPosition = this.getNextDragPosition(event)\n const last = this.lastDragPosition\n if (\n last &&\n (Math.abs(last.x - nextPosition.x) > DRAG_DIRECTION_THRESHOLD_PX ||\n Math.abs(last.y - nextPosition.y) > DRAG_DIRECTION_THRESHOLD_PX)\n ) {\n this.movedDuringDrag = true\n }\n\n if (this.lastDragClientX !== null) {\n const deltaX = event.clientX - this.lastDragClientX\n if (deltaX > DRAG_DIRECTION_THRESHOLD_PX) {\n this.dragAnimation = 'running-right'\n } else if (deltaX < -DRAG_DIRECTION_THRESHOLD_PX) {\n this.dragAnimation = 'running-left'\n }\n }\n\n this.lastDragClientX = event.clientX\n this.lastDragPosition = nextPosition\n this.dragPosition = nextPosition\n this.render()\n }\n\n private handlePointerUp = (event: PointerEvent): void => {\n const finalPosition = this.lastDragPosition ?? this.getNextDragPosition(event)\n this.isDragging = false\n this.dragPosition = null\n this.dragAnimation = null\n this.lastDragClientX = null\n this.removeDragListeners()\n this.persistPosition(finalPosition)\n if (event.pointerType === 'mouse' && this.isPointerOverPet(event)) {\n this.isHovering = true\n this.rescheduleAnimation()\n } else {\n this.enterRestingAfterDelay()\n this.rescheduleAnimation()\n }\n }\n\n private handleClick = (): void => {\n if (this.movedDuringDrag) {\n return\n }\n this.onActivate?.()\n if (this.prefersReducedMotion) {\n return\n }\n this.transient = { name: 'waving' }\n this.render()\n }\n\n private installDragListeners(): void {\n window.addEventListener('pointermove', this.handlePointerMove)\n window.addEventListener('pointerup', this.handlePointerUp, { once: true })\n window.addEventListener('pointercancel', this.handlePointerUp, {\n once: true\n })\n }\n\n private removeDragListeners(): void {\n window.removeEventListener('pointermove', this.handlePointerMove)\n window.removeEventListener('pointerup', this.handlePointerUp)\n window.removeEventListener('pointercancel', this.handlePointerUp)\n }\n}\n","/// <reference path=\"./import-meta-env.d.ts\" />\n\nimport { encodeBase64 } from '@lichen-ai/chatkit-web-shared'\n\nimport { ChatFrameMessenger } from './ChatFrameMessenger'\nimport type { Card, ChatKitOptions, Entity, ListView } from '@lichen-ai/chatkit-types'\nimport { normalizePetOptions } from '@lichen-ai/chatkit-types'\nimport type { ChatKitReference } from '@lichen-ai/chatkit-types'\nimport type { SendUserMessageParams } from '@lichen-ai/chatkit-types'\nimport { removeMethods } from './helpers'\n\nimport type {\n Attachment,\n ChatKitFrameParams,\n ChatKitProfile,\n ChatKitInnerOptions,\n ChatKitReq,\n UserMessageContent\n} from '@lichen-ai/chatkit-web-shared'\nimport { getCapabilities } from '@lichen-ai/chatkit-web-shared'\nimport type { Capabilities, Capability } from '@lichen-ai/chatkit-web-shared'\nimport { IntegrationError, fromPossibleFrameSafeError } from '@lichen-ai/chatkit-web-shared'\nimport {\n PetOverlay,\n parsePetOptionsChangePayload,\n parsePetStateChangePayload,\n parseThreadSummaryLogPayload,\n type ThreadSummary\n} from './PetOverlay'\n\n// Compute inner options by removing methods (to make options serializable)\nfunction getInnerOptions(options: ChatKitOptions): ChatKitInnerOptions {\n return removeMethods(options) as ChatKitInnerOptions\n}\n\n// Decorator to assert that a command is available for the current capabilities profile\nexport function requireCommandCapability<This extends ChatKitElementBase<unknown>, Args extends unknown[], Return>(\n value: (this: This, ...args: Args) => Return,\n context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>\n) {\n const command = String(context.name)\n return function (this: This, ...args: Args) {\n if (!this.capabilities.commands.has(command as Capability.Command)) {\n throw new IntegrationError(\n `ChatKit command \"${String(command)}\" is not available for the \"${this.profile}\" profile.`\n )\n }\n return value.apply(this, args)\n }\n}\n\ninterface ChatKitBaseElementEventMap {\n 'chatkit.ready': CustomEvent<void>\n 'chatkit.error': CustomEvent<{ error: Error }>\n 'chatkit.response.start': CustomEvent<void>\n 'chatkit.response.end': CustomEvent<void>\n 'chatkit.thread.change': CustomEvent<{ threadId: string | null }>\n 'chatkit.log': CustomEvent<{ name: string; data?: Record<string, unknown> }>\n 'chatkit.deeplink': CustomEvent<{\n name: string\n data?: Record<string, unknown>\n }>\n 'chatkit.widget.action': CustomEvent<{\n action: string\n payload?: Record<string, unknown>\n }>\n}\n\nexport abstract class ChatKitElementBase<TRawOptions> extends HTMLElement {\n protected profile: ChatKitProfile\n protected capabilities: Capabilities\n protected abstract sanitizeOptions(options: TRawOptions): ChatKitOptions\n\n #opts?: ChatKitOptions\n #frameUrl?: string\n #frame?: HTMLIFrameElement\n #wrapper?: HTMLDivElement\n #launcherCloseButton?: HTMLButtonElement\n #launcherOpen = false\n #chatMinimizedToPet = false\n #framePetOptionsOverride: ChatKitOptions['pet'] | null | undefined\n #petClosedByContextMenu = false\n\n #shadow = this.attachShadow({ mode: 'open' })\n #petOverlay = new PetOverlay(this.#shadow, {\n onActivate: () => this.#handlePetActivate(),\n onClose: () => this.#handlePetClose(),\n onReply: (text) => this.#handlePetReply(text),\n onThreadSummaryActivate: (threadId) => void this.#handlePetThreadSummaryActivate(threadId)\n })\n\n #resolveLoaded?: () => void\n #loaded = new Promise<void>((resolve) => {\n this.#resolveLoaded = resolve\n })\n\n #messenger = new ChatFrameMessenger({\n fetch: ((...args) => {\n const customFetch = this.#opts?.api && 'fetch' in this.#opts.api && this.#opts.api.fetch\n return customFetch ? customFetch(...args) : fetch(...args)\n }) as typeof fetch,\n target: () => this.#frame?.contentWindow ?? null,\n targetOrigin: window.location.origin,\n handlers: {\n onFileInputClick: ({ inputAttributes }: { inputAttributes: Record<string, string> }) => {\n return new Promise<File[]>((resolve) => {\n const input = document.createElement('input')\n for (const [key, value] of Object.entries(inputAttributes)) {\n input.setAttribute(key, String(value))\n }\n const respond = () => {\n resolve(Array.from(input.files || []))\n if (this.#shadow.contains(input)) {\n this.#shadow.removeChild(input)\n }\n }\n input.addEventListener('cancel', respond)\n input.addEventListener('change', respond)\n this.#shadow.appendChild(input)\n input.click()\n })\n },\n onClientToolCall: async ({\n name,\n params,\n id,\n tool_call_id\n }: {\n name: string\n params: Record<string, unknown>\n id?: string\n tool_call_id?: string\n }) => {\n const onClientTool = this.#opts?.onClientTool\n if (!onClientTool) {\n this.#emitAndThrow(\n new IntegrationError(\n `No handler for client tool calls. You'll need to add onClientTool to your ChatKit options.`\n )\n )\n }\n return onClientTool({ name, params, id, tool_call_id })\n },\n onWidgetAction: async ({\n action,\n widgetItem\n }: {\n action: {\n type: string\n payload?: Record<string, unknown> | undefined\n }\n widgetItem: {\n id: string\n widget: Card | ListView\n }\n }) => {\n const onAction = this.#opts?.widgets?.onAction\n if (!onAction) {\n this.#emitAndThrow(\n new IntegrationError(\n `No handler for widget actions. You'll need to add widgets.onAction to your ChatKit options.`\n )\n )\n }\n return onAction(action, widgetItem)\n },\n onEntitySearch: async ({ query }: { query: string }) => this.#opts?.entities?.onTagSearch?.(query) ?? [],\n onEntityClick: async ({ entity }: { entity: Entity }) => this.#opts?.entities?.onClick?.(entity),\n onEntityPreview: async ({ entity }: { entity: Entity }) =>\n this.#opts?.entities?.onRequestPreview?.(entity) ?? { preview: null },\n onGetClientSecret: async (currentClientSecret: string | null) => {\n if (!this.#opts || !('getClientSecret' in this.#opts.api) || !this.#opts.api.getClientSecret) {\n // ~Impossible since the existence of this handler is the only way\n // that we end up creating the kind of ApiClient that would call this handler in the first place.\n this.#emitAndThrow(\n new IntegrationError(\n 'Could not refresh the session because ChatKitOptions.api.getClientSecret is not configured.'\n )\n )\n }\n\n return this.#opts.api.getClientSecret(currentClientSecret ?? null)\n },\n onAddMetadataToRequest: ({ op, params }: { op: ChatKitReq['type']; params: Record<string, unknown> }): void => {\n throw new IntegrationError('ChatKit: onAddMetadataToRequest is unimplemented.')\n // if (!this.#opts) return null\n // if (!(\"addMetadataToRequest\" in this.#opts.api) || !this.#opts.api.addMetadataToRequest)\n // return null\n\n // const result = this.#opts.api.addMetadataToRequest({ op, params })\n // if (!result) return null\n\n // return result.then((value) => {\n // if (!value) return null\n // if (typeof value !== \"object\" || Array.isArray(value)) {\n // throw new IntegrationError(\n // \"ChatKit: addMetadataToRequest must return an object or null.\",\n // )\n // }\n // return value as Record<string, unknown>\n // })\n }\n }\n })\n\n constructor({ profile }: { profile: ChatKitProfile }) {\n super()\n this.profile = profile\n this.capabilities = getCapabilities(profile)\n }\n\n protected setProfile(profile: ChatKitProfile) {\n this.profile = profile\n this.capabilities = getCapabilities(profile)\n }\n\n #emitAndThrow(error: Error): never {\n this.dispatchEvent(new CustomEvent('chatkit.error', { detail: { error } }))\n throw error\n }\n\n #setOptionsDataAttributes(options: ChatKitOptions) {\n this.dataset.colorScheme =\n typeof options.theme === 'string' ? options.theme : (options.theme?.colorScheme ?? 'light')\n this.dataset.displayMode = this.#getDisplayMode(options)\n if (this.#getDisplayMode(options) !== 'pet') {\n this.#setLauncherOpen(false)\n }\n }\n\n #getDisplayMode(options = this.#opts) {\n return options?.displayMode === 'pet' ? 'pet' : 'chat'\n }\n\n #getConfiguredPetOptions(options = this.#opts): ChatKitOptions['pet'] | null {\n if (!options) {\n return null\n }\n\n if (this.#getDisplayMode(options) === 'pet' && !normalizePetOptions(options.pet ?? null)) {\n return true\n }\n\n return options.pet ?? null\n }\n\n #mergeConfiguredPetPositionDefaults(pet: ChatKitOptions['pet'] | null): ChatKitOptions['pet'] | null {\n if (!pet) {\n return pet\n }\n\n const configured = normalizePetOptions(this.#getConfiguredPetOptions() ?? null)\n if (!configured) {\n return pet\n }\n\n if (pet === true) {\n return { position: configured.position }\n }\n\n if (!pet.position) {\n return { ...pet, position: configured.position }\n }\n\n return {\n ...pet,\n position: {\n ...configured.position,\n ...pet.position,\n boundsPadding: pet.position.boundsPadding ?? configured.position.boundsPadding,\n pin: 'pin' in pet.position ? pet.position.pin : configured.position.pin\n }\n }\n }\n\n #getOverlayPetOptions(): ChatKitOptions['pet'] | null {\n if (this.#petClosedByContextMenu) {\n return null\n }\n\n let pet\n if (this.#framePetOptionsOverride !== undefined) {\n pet = this.#mergeConfiguredPetPositionDefaults(this.#framePetOptionsOverride)\n } else {\n pet = this.#getConfiguredPetOptions()\n }\n\n if (this.#getDisplayMode() === 'pet' && !normalizePetOptions(pet ?? null)) {\n pet = true\n }\n\n return this.#resolveOverlayPetOptions(pet)\n }\n\n #resolvePetAssetUrl(src: string): string {\n try {\n const base = new URL(this.#frameUrl ?? window.location.href, window.location.origin)\n return new URL(src, base).toString()\n } catch {\n return src\n }\n }\n\n #resolveOverlayPetOptions(pet: ChatKitOptions['pet'] | null): ChatKitOptions['pet'] | null {\n const normalized = normalizePetOptions(pet ?? null)\n if (!normalized) {\n return null\n }\n\n return {\n character: {\n ...normalized.character,\n src: this.#resolvePetAssetUrl(normalized.character.src)\n },\n position: normalized.position,\n behavior: normalized.behavior,\n ariaLabel: normalized.ariaLabel,\n imageRendering: normalized.imageRendering\n }\n }\n\n #getFrameOptions(options: ChatKitOptions): ChatKitOptions {\n const pet = this.#getConfiguredPetOptions(options)\n if (pet === (options.pet ?? null)) {\n return options\n }\n\n const nextOptions = { ...options }\n if (pet === null) {\n delete nextOptions.pet\n } else {\n nextOptions.pet = pet\n }\n return nextOptions\n }\n\n #setLauncherOpen(open: boolean) {\n this.#launcherOpen = open\n if (open) {\n this.dataset.chatOpen = 'true'\n } else {\n delete this.dataset.chatOpen\n }\n }\n\n #setChatMinimizedToPet(minimized: boolean) {\n const next = minimized && Boolean(this.#getOverlayPetOptions())\n this.#chatMinimizedToPet = next\n if (next) {\n this.dataset.chatMinimizedToPet = 'true'\n } else {\n delete this.dataset.chatMinimizedToPet\n }\n }\n\n #syncPetOverlayOptions() {\n const overlayPetOptions = this.#getOverlayPetOptions()\n this.#petOverlay.setOptions(overlayPetOptions, this.#opts?.theme)\n if (!overlayPetOptions) {\n this.#setChatMinimizedToPet(false)\n }\n }\n\n #handlePetActivate() {\n if (this.#chatMinimizedToPet) {\n this.#setChatMinimizedToPet(false)\n if (this.#getDisplayMode() === 'pet') {\n this.#setLauncherOpen(true)\n }\n this.#loaded.then(() => this.focusComposer()).catch(() => undefined)\n return\n }\n\n if (this.#getDisplayMode() !== 'pet') {\n return\n }\n\n this.#setLauncherOpen(true)\n this.#loaded.then(() => this.focusComposer()).catch(() => undefined)\n }\n\n #handlePetClose() {\n this.#petClosedByContextMenu = true\n this.#framePetOptionsOverride = null\n this.#setChatMinimizedToPet(false)\n this.#setLauncherOpen(false)\n this.#petOverlay.setOptions(null)\n\n if (this.#getDisplayMode() === 'pet') {\n return\n }\n\n this.#loaded.then(() => this.#messenger.commands.setPetEnabled({ enabled: false })).catch(() => undefined)\n }\n\n async #handlePetReply(text: string) {\n await this.sendUserMessage({ text })\n }\n\n async #handlePetThreadSummaryActivate(threadId: string) {\n if (this.#getDisplayMode() === 'pet') {\n this.#setLauncherOpen(true)\n }\n\n await this.setThreadId(threadId)\n await this.focusComposer()\n }\n\n #handleLauncherClose = () => {\n this.#setLauncherOpen(false)\n }\n\n #getFrameUrl() {\n if (!this.#frameUrl) {\n throw new IntegrationError(\n 'ChatKit frameUrl is not configured. Provide it via setOptions({ frameUrl }) before mounting.'\n )\n }\n return this.#frameUrl\n }\n\n #setFrameUrl(frameUrl: string) {\n if (this.#initialized && this.#frameUrl && this.#frameUrl !== frameUrl) {\n throw new IntegrationError(\n 'ChatKit frameUrl cannot be changed after initialization. Create a new element to use a different URL.'\n )\n }\n this.#frameUrl = frameUrl\n }\n\n #consumeFrameUrl(options: ChatKitOptions) {\n if (!('frameUrl' in options)) return\n const frameUrl = options.frameUrl\n delete options.frameUrl\n if (frameUrl == null) return\n if (typeof frameUrl !== 'string' || frameUrl.trim() === '') {\n throw new IntegrationError('ChatKit frameUrl must be a non-empty string.')\n }\n this.#setFrameUrl(frameUrl)\n }\n\n #handleFrameLoad = () => {\n this.dataset.loaded = 'true'\n this.dispatchEvent(new CustomEvent('chatkit.ready', { bubbles: true, composed: true }))\n this.#resolveLoaded?.()\n }\n\n connectedCallback() {\n this.#petOverlay.connect()\n const style = document.createElement('style')\n style.textContent = `\n :host {\n display: block;\n position: relative;\n height: 100%;\n width: 100%;\n overflow: visible;\n }\n :host([data-display-mode=\"pet\"]) {\n display: contents;\n }\n :host([data-chat-minimized-to-pet=\"true\"]) {\n display: contents;\n }\n .ck-iframe {\n border: none;\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n color-scheme: light only;\n }\n .ck-wrapper {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n opacity: 0;\n }\n .ck-launcher-close {\n display: none;\n }\n :host([data-display-mode=\"pet\"]) .ck-wrapper {\n position: fixed;\n inset: auto 16px 16px auto;\n width: min(420px, calc(100vw - 32px));\n height: min(720px, calc(100vh - 32px));\n max-height: calc(100vh - 32px);\n overflow: visible;\n border: 1px solid rgba(148, 163, 184, 0.35);\n border-radius: 18px;\n background: Canvas;\n box-shadow:\n 0 24px 80px rgba(15, 23, 42, 0.22),\n 0 0 0 1px rgba(15, 23, 42, 0.04);\n opacity: 0;\n pointer-events: none;\n transform: translateY(12px) scale(0.98);\n transition:\n opacity 160ms ease,\n transform 160ms ease;\n z-index: 39;\n }\n :host([data-display-mode=\"pet\"][data-chat-open=\"true\"]) .ck-wrapper {\n opacity: 1;\n pointer-events: auto;\n transform: translateY(0) scale(1);\n }\n :host([data-display-mode=\"pet\"]) .ck-iframe {\n border-radius: inherit;\n }\n :host([data-display-mode=\"pet\"]) .ck-launcher-close {\n display: inline-flex;\n position: absolute;\n top: -10px;\n right: -10px;\n z-index: 2;\n width: 28px;\n height: 28px;\n align-items: center;\n justify-content: center;\n border: 1px solid rgba(148, 163, 184, 0.45);\n border-radius: 999px;\n background: rgba(255, 255, 255, 0.96);\n color: #475569;\n box-shadow: 0 8px 24px rgba(15, 23, 42, 0.18);\n cursor: pointer;\n font: inherit;\n font-size: 0;\n line-height: 1;\n }\n :host([data-display-mode=\"pet\"]) .ck-launcher-close::before,\n :host([data-display-mode=\"pet\"]) .ck-launcher-close::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n width: 14px;\n height: 2px;\n border-radius: 999px;\n background: currentColor;\n transform: translate(-50%, -50%) rotate(45deg);\n }\n :host([data-display-mode=\"pet\"]) .ck-launcher-close::after {\n transform: translate(-50%, -50%) rotate(-45deg);\n }\n :host([data-display-mode=\"pet\"]) .ck-launcher-close:hover {\n background: #fff;\n color: #0f172a;\n }\n :host([data-color-scheme=\"dark\"]) .ck-iframe {\n color-scheme: dark only;\n }\n :host([data-color-scheme=\"dark\"][data-display-mode=\"pet\"]) .ck-wrapper {\n border-color: rgba(148, 163, 184, 0.28);\n background: #020617;\n box-shadow:\n 0 24px 80px rgba(0, 0, 0, 0.5),\n 0 0 0 1px rgba(255, 255, 255, 0.06);\n }\n :host([data-color-scheme=\"dark\"][data-display-mode=\"pet\"]) .ck-launcher-close {\n background: rgba(15, 23, 42, 0.88);\n border-color: rgba(148, 163, 184, 0.32);\n color: #cbd5e1;\n }\n :host([data-color-scheme=\"dark\"][data-display-mode=\"pet\"]) .ck-launcher-close:hover {\n background: #1e293b;\n color: #f8fafc;\n }\n :host([data-loaded=\"true\"]) .ck-wrapper {\n opacity: 1;\n }\n :host([data-chat-minimized-to-pet=\"true\"]) .ck-wrapper {\n opacity: 0;\n pointer-events: none;\n visibility: hidden;\n }\n :host([data-display-mode=\"pet\"]:not([data-chat-open=\"true\"])) .ck-wrapper {\n opacity: 0;\n }\n @media (max-width: 520px) {\n :host([data-display-mode=\"pet\"]) .ck-wrapper {\n inset: auto 8px 8px 8px;\n width: auto;\n height: min(680px, calc(100vh - 16px));\n max-height: calc(100vh - 16px);\n border-radius: 16px;\n }\n :host([data-display-mode=\"pet\"]) .ck-launcher-close {\n top: -8px;\n right: 8px;\n }\n }\n `\n\n const frame = document.createElement('iframe')\n frame.className = 'ck-iframe'\n frame.name = 'chatkit'\n frame.role = 'presentation'\n frame.tabIndex = 0\n frame.setAttribute('allowtransparency', 'true')\n frame.setAttribute('frameborder', '0')\n frame.setAttribute('scrolling', 'no')\n frame.setAttribute('allow', 'clipboard-read; clipboard-write')\n this.#frame = frame\n\n // not sure we still need this..\n const wrapper = document.createElement('div')\n wrapper.className = 'ck-wrapper'\n wrapper.appendChild(frame)\n this.#wrapper = wrapper\n\n const closeButton = document.createElement('button')\n closeButton.className = 'ck-launcher-close'\n closeButton.type = 'button'\n closeButton.setAttribute('aria-label', 'Close chat')\n closeButton.addEventListener('click', this.#handleLauncherClose)\n wrapper.appendChild(closeButton)\n this.#launcherCloseButton = closeButton\n\n this.#shadow.append(style)\n\n if (import.meta.env.DEV) {\n this.#messenger.on('development_only_force_page_reload', () => {\n window.location.reload()\n })\n }\n this.#messenger.on('left_header_icon_click', () => {\n this.#opts?.header?.leftAction?.onClick()\n })\n this.#messenger.on('right_header_icon_click', () => {\n this.#opts?.header?.rightAction?.onClick()\n })\n this.#messenger.on('public_event', ([event, data]) => {\n if (event === 'log') {\n const payload = parseThreadSummaryLogPayload(data)\n if (payload) {\n this.#petOverlay.setThreadSummary(payload.summary)\n }\n } else if (event === 'response.start') {\n this.#petOverlay.setThreadSummaryStatus('running')\n } else if (event === 'response.end') {\n this.#petOverlay.setThreadSummaryStatus('completed')\n } else if (event === 'response.stop') {\n this.#petOverlay.setThreadSummaryStatus('completed')\n }\n\n if (!this.capabilities.events.has(event)) return\n if (event === 'error' && 'error' in data) {\n // Custom error handling to convert frame-safe errors back into real Errors\n const error = fromPossibleFrameSafeError(data.error)\n this.dispatchEvent(new CustomEvent('chatkit.error', { detail: { error } }))\n // IntegrationErrors should throw\n if (error instanceof IntegrationError) {\n throw error\n }\n return\n }\n\n this.dispatchEvent(new CustomEvent(`chatkit.${event}`, { detail: data }))\n })\n this.#messenger.on('pet_state_change', (data) => {\n const payload = parsePetStateChangePayload(data)\n if (payload) {\n this.#petOverlay.setState(payload.state)\n }\n })\n this.#messenger.on('pet_options_change', (data) => {\n const payload = parsePetOptionsChangePayload(data)\n if (payload) {\n if (!this.#petClosedByContextMenu || payload.pet === null) {\n this.#petClosedByContextMenu = false\n }\n this.#framePetOptionsOverride = payload.pet\n this.#syncPetOverlayOptions()\n }\n })\n this.#messenger.on('chat_minimize_change', (data) => {\n const minimized =\n typeof data === 'object' &&\n data !== null &&\n 'minimized' in data &&\n (data as { minimized?: unknown }).minimized === true\n\n if (minimized && !this.#getOverlayPetOptions()) {\n return\n }\n\n this.#setChatMinimizedToPet(minimized)\n if (minimized) {\n this.#setLauncherOpen(false)\n }\n })\n this.#messenger.on('unmount', () => {\n // Remove the iframe and wrapper from the shadow DOM if they exist\n if (this.#wrapper && this.#shadow.contains(this.#wrapper)) {\n this.#shadow.removeChild(this.#wrapper)\n this.#wrapper = undefined\n this.#frame = undefined\n }\n })\n this.#messenger.on('capabilities_profile_change', ({ profile }: { profile: ChatKitProfile }) => {\n this.setProfile(profile)\n })\n\n frame.addEventListener('load', this.#handleFrameLoad, { once: true })\n\n try {\n this.#maybeInit()\n } catch (error) {\n console.error(error)\n this.#emitAndThrow(error instanceof Error ? error : new IntegrationError('Failed to initialize ChatKit'))\n }\n }\n\n #initialized = false\n #maybeInit() {\n if (this.#initialized || !this.#frame || !this.#opts) {\n return\n }\n this.#initialized = true\n this.#setOptionsDataAttributes(this.#opts)\n const frameURL = new URL(this.#getFrameUrl(), window.location.origin)\n this.#messenger.setTargetOrigin(frameURL.origin)\n frameURL.hash = encodeBase64({\n options: getInnerOptions(this.#getFrameOptions(this.#opts)),\n referrer: window.location.origin,\n profile: this.profile\n } satisfies ChatKitFrameParams)\n this.#messenger.connect()\n this.#frame.src = frameURL.toString()\n // Impossible to not exist\n if (this.#wrapper) {\n this.#shadow.append(this.#wrapper)\n }\n }\n\n disconnectedCallback() {\n this.#frame?.removeEventListener('load', this.#handleFrameLoad)\n this.#launcherCloseButton?.removeEventListener('click', this.#handleLauncherClose)\n this.#messenger.disconnect()\n this.#petOverlay.destroy()\n }\n\n protected applySanitizedOptions(newOptions: ChatKitOptions) {\n this.#opts = newOptions\n this.#petClosedByContextMenu = false\n this.#petOverlay.setLocale(newOptions.locale)\n this.#syncPetOverlayOptions()\n if (this.#initialized) {\n this.#setOptionsDataAttributes(this.#opts)\n this.#loaded.then(() => {\n this.#messenger.commands.setOptions(getInnerOptions(this.#getFrameOptions(newOptions)))\n })\n } else {\n this.#maybeInit()\n }\n }\n\n setOptions(newOptions: TRawOptions) {\n try {\n const sanitized = this.sanitizeOptions(newOptions)\n this.#consumeFrameUrl(sanitized)\n this.applySanitizedOptions(sanitized)\n } catch (error) {\n this.#emitAndThrow(error instanceof Error ? error : new IntegrationError('Failed to parse options'))\n }\n }\n\n @requireCommandCapability\n async focusComposer() {\n await this.#loaded\n this.#frame?.focus()\n await this.#messenger?.commands.focusComposer()\n }\n\n @requireCommandCapability\n async fetchUpdates() {\n await this.#loaded\n await this.#messenger?.commands.fetchUpdates()\n }\n\n @requireCommandCapability\n async sendUserMessage(params: SendUserMessageParams) {\n await this.#loaded\n await this.#messenger?.commands.sendUserMessage(params)\n }\n\n @requireCommandCapability\n async setComposerValue(params: {\n text?: string\n content?: UserMessageContent[]\n reply?: string\n attachments?: Attachment[]\n references?: ChatKitReference[]\n appendReferences?: boolean\n files?: File[]\n selectedToolId?: string | null\n selectedModelId?: string | null\n }) {\n await this.#loaded\n await this.#messenger?.commands.setComposerValue(params)\n }\n\n @requireCommandCapability\n async setThreadId(threadId: string | null) {\n await this.#loaded\n await this.#messenger?.commands.setThreadId({ threadId })\n }\n\n @requireCommandCapability\n async shareThread() {\n await this.#loaded\n return this.#messenger?.commands.shareThread()\n }\n\n @requireCommandCapability\n async sendCustomAction(action: { type: string; payload?: Record<string, unknown> }, itemId?: string) {\n await this.#loaded\n return this.#messenger?.commands.sendCustomAction({ action, itemId })\n }\n\n @requireCommandCapability\n async showHistory() {\n await this.#loaded\n return this.#messenger?.commands.showHistory()\n }\n\n @requireCommandCapability\n async hideHistory() {\n await this.#loaded\n return this.#messenger?.commands.hideHistory()\n }\n\n @requireCommandCapability\n async setTrainingOptOut(value: boolean) {\n await this.#loaded\n return this.#messenger?.commands.setTrainingOptOut({ value })\n }\n}\n\nexport interface ChatKitBaseElement<TRawOptions, TSanitizedOptions extends ChatKitOptions> extends HTMLElement {\n addEventListener<K extends keyof ChatKitBaseElementEventMap>(\n type: K,\n listener: (this: ChatKitBaseElement<TRawOptions, TSanitizedOptions>, ev: ChatKitBaseElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions\n ): void\n\n removeEventListener<K extends keyof ChatKitBaseElementEventMap>(\n type: K,\n listener: (this: ChatKitBaseElement<TRawOptions, TSanitizedOptions>, ev: ChatKitBaseElementEventMap[K]) => void,\n options?: boolean | EventListenerOptions\n ): void\n}\n","import { ChatKitElementBase } from './ChatKitElementBase'\n\nimport type { ChatKitOptions } from '@lichen-ai/chatkit-types'\n\nexport class ChatKitElement extends ChatKitElementBase<ChatKitOptions> {\n constructor() {\n super({ profile: 'chatkit' })\n }\n\n override sanitizeOptions(options: ChatKitOptions) {\n // TODO: Sanitize unknown options instead of assuming it is of type ChatKitOptions.\n // The below deletions are expedient for now to prevent ChatGPTShell-only options from\n // being passed to ChatKit.\n delete options.threadItemActions?.share\n return options\n }\n}\n\nexport function registerChatKitElement(tag = 'xpertai-chatkit') {\n // SSR-safe guard\n if (!('customElements' in globalThis)) return\n\n if (!customElements.get(tag)) {\n customElements.define(tag, ChatKitElement)\n }\n}\n","import { registerChatKitElement } from './ChatKitElement'\n\nregisterChatKitElement()\n"],"names":["_a","fetch","json","IntegrationError"],"mappings":"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","x_google_ignoreList":[1,2]}
|