@omni-commerce/sdk 0.7.0 → 0.8.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/README.md CHANGED
@@ -8,6 +8,8 @@ The surface is a resource client with one request object per call, dual ESM/CJS
8
8
 
9
9
  Assistant chat is available from `@omni-commerce/sdk/react` (`OmniProvider`, `OmniChat`) and `@omni-commerce/sdk/embed` (`createOmniChatEmbed`, `createOmniChatWidget`). They mount the same hosted chat for public visitors or organization members. Widgets accept `presentation: "sidebar"` for a full-height drawer, or `"floating"` (the default), with `position: "left" | "right"`. Inline and React chat fill their host container. React is an optional peer dependency; REST and plain JavaScript consumers do not need it. See [chat integration](https://docs.omnicommerce.sg/sdk/chat) for multiple assistants and session handling.
10
10
 
11
+ With SDK 0.8.0, pass `application={{ name, description, getContext }}` and `frontendTools` to connect live app state and local UI actions. Tool names use the `app_` namespace and JSON object schemas. Native LangGraph pauses the call, your app executes it, and its result returns to the agent. Host tools confer no extra server permissions. See the [application integration guide](https://docs.omnicommerce.sg/sdk/chat#application-context-and-ui-actions) for a complete React example.
12
+
11
13
  ## Install
12
14
 
13
15
  ```bash
package/dist/embed.cjs CHANGED
@@ -1,5 +1,88 @@
1
1
  'use strict';
2
2
 
3
+ // src/application.ts
4
+ function boundedJson(value, maximum) {
5
+ const encoded = JSON.stringify(value);
6
+ if (typeof encoded !== "string" || new TextEncoder().encode(encoded).length > maximum || /data:[^"\s]{0,100};base64,/i.test(encoded))
7
+ throw new Error(
8
+ "Application data must be bounded JSON without base64 payloads."
9
+ );
10
+ return JSON.parse(encoded);
11
+ }
12
+ function createApplicationMessageHandler(input) {
13
+ const calls = /* @__PURE__ */ new Map();
14
+ return async (message) => {
15
+ if (typeof message.requestId !== "string" || message.requestId.length > 200)
16
+ return;
17
+ try {
18
+ if (message.type === "omni-chat:application-request") {
19
+ const application = input.options.application;
20
+ input.reply({
21
+ type: "omni-chat:application-response",
22
+ requestId: message.requestId,
23
+ application: application ? boundedJson(
24
+ {
25
+ name: application.name,
26
+ description: application.description,
27
+ context: await application.getContext() ?? null,
28
+ tools: Object.entries(input.options.frontendTools ?? {}).map(
29
+ ([name, definition]) => ({
30
+ name,
31
+ description: definition.description,
32
+ parameters: definition.parameters
33
+ })
34
+ )
35
+ },
36
+ 65536
37
+ ) : void 0
38
+ });
39
+ } else if (message.type === "omni-chat:tool-request") {
40
+ const name = message.toolName;
41
+ const toolCallId = message.toolCallId;
42
+ if (typeof name !== "string" || !/^app_[a-z][a-z0-9_]{0,59}$/.test(name) || typeof toolCallId !== "string" || !toolCallId || toolCallId.length > 200)
43
+ throw new Error("Invalid application tool request.");
44
+ const definition = Object.hasOwn(
45
+ input.options.frontendTools ?? {},
46
+ name
47
+ ) ? input.options.frontendTools?.[name] : void 0;
48
+ if (!input.options.application || !definition)
49
+ throw new Error("This application action is unavailable.");
50
+ const args = message.args;
51
+ if (!args || typeof args !== "object" || Array.isArray(args))
52
+ throw new Error("Invalid application action arguments.");
53
+ const signature = JSON.stringify({ name, args });
54
+ const prior = calls.get(toolCallId);
55
+ if (prior && prior.signature !== signature)
56
+ throw new Error("This tool call ID was already used.");
57
+ const result = prior?.result ?? Promise.resolve().then(
58
+ () => definition.execute(args, {
59
+ toolCallId,
60
+ abortSignal: input.signal
61
+ })
62
+ );
63
+ if (!prior) {
64
+ if (calls.size >= 200)
65
+ throw new Error("Start a new application chat.");
66
+ calls.set(toolCallId, { signature, result });
67
+ }
68
+ input.reply({
69
+ type: "omni-chat:tool-response",
70
+ requestId: message.requestId,
71
+ toolCallId,
72
+ result: boundedJson(await result ?? null, 12e3)
73
+ });
74
+ }
75
+ } catch (error) {
76
+ input.reply({
77
+ type: message.type === "omni-chat:application-request" ? "omni-chat:application-response" : "omni-chat:tool-response",
78
+ requestId: message.requestId,
79
+ toolCallId: message.toolCallId,
80
+ error: error instanceof Error ? error.message : "The application action failed."
81
+ });
82
+ }
83
+ };
84
+ }
85
+
3
86
  // src/widget-chrome.ts
4
87
  var iconPaths = {
5
88
  chat: "M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5Z",
@@ -265,9 +348,24 @@ function createOmniChatEmbed(container, options) {
265
348
  }
266
349
  return result;
267
350
  };
351
+ const applicationMessage = createApplicationMessageHandler({
352
+ options,
353
+ signal: controller.signal,
354
+ reply: (message) => {
355
+ if (!destroyed)
356
+ iframe.contentWindow?.postMessage(
357
+ { ...message, deploymentId: options.deploymentId },
358
+ chatOrigin
359
+ );
360
+ }
361
+ });
268
362
  const receive = (event) => {
269
363
  if (destroyed || event.source !== iframe.contentWindow || event.origin !== chatOrigin || event.data?.deploymentId !== options.deploymentId)
270
364
  return;
365
+ if (event.data.type === "omni-chat:application-request" || event.data.type === "omni-chat:tool-request") {
366
+ void applicationMessage(event.data);
367
+ return;
368
+ }
271
369
  if (event.data.type === "omni-chat:close-request") {
272
370
  options.onRequestClose?.();
273
371
  return;
@@ -283,7 +381,8 @@ function createOmniChatEmbed(container, options) {
283
381
  {
284
382
  type: "omni-chat:session",
285
383
  deploymentId: options.deploymentId,
286
- session
384
+ session,
385
+ ...options.application ? { applicationEnabled: true } : {}
287
386
  },
288
387
  chatOrigin
289
388
  );
@@ -295,7 +394,8 @@ function createOmniChatEmbed(container, options) {
295
394
  {
296
395
  type: "omni-chat:session-error",
297
396
  deploymentId: options.deploymentId,
298
- error: failure.message
397
+ error: failure.message,
398
+ ...options.application ? { applicationEnabled: true } : {}
299
399
  },
300
400
  chatOrigin
301
401
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/widget-chrome.ts","../src/widget.ts","../src/embed-code.ts","../src/embed.ts"],"names":[],"mappings":"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","file":"embed.cjs","sourcesContent":["const iconPaths = {\n chat: \"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5Z\",\n close: \"m6 6 12 12M6 18 18 6\",\n collapse: \"m6 9 6 6 6-6\",\n};\n\nexport function widgetIcon(document: Document, name: keyof typeof iconPaths) {\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"fill\", \"none\");\n svg.setAttribute(\"stroke\", \"currentColor\");\n svg.setAttribute(\"stroke-width\", \"1.8\");\n svg.setAttribute(\"stroke-linecap\", \"round\");\n svg.setAttribute(\"stroke-linejoin\", \"round\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n path.setAttribute(\"d\", iconPaths[name]);\n svg.append(path);\n return svg;\n}\n\n/** Shadow DOM keeps a store's button, font and section CSS out of the widget. */\nexport const widgetStyles = `\n :host { all: initial; font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; color-scheme: light; }\n *, *::before, *::after { box-sizing: border-box; }\n button { font: inherit; cursor: pointer; -webkit-tap-highlight-color: transparent; }\n button:focus-visible { outline: 3px solid var(--omni-launcher-bg); outline-offset: 4px; }\n svg { display: block; width: 22px; height: 22px; flex: none; }\n .launcher {\n display: flex; align-items: center; justify-content: center; gap: 10px;\n height: 52px; padding: 0 20px; border: 1px solid rgba(255,255,255,.14);\n border-radius: 999px; background: var(--omni-launcher-bg); color: var(--omni-launcher-fg);\n font-size: 14px; font-weight: 600; line-height: 1; letter-spacing: -.01em;\n box-shadow: 0 6px 24px rgba(0,0,0,.16), 0 2px 6px rgba(0,0,0,.08);\n transition: transform 160ms ease, box-shadow 160ms ease;\n margin-left: auto;\n }\n .launcher:hover { transform: translateY(-2px); box-shadow: 0 10px 28px rgba(0,0,0,.2); }\n .launcher[hidden] { display: none; }\n .launcher[aria-expanded=\"true\"] { width: 52px; padding: 0; }\n .launcher[aria-expanded=\"true\"] .label { display: none; }\n .panel {\n position: absolute; bottom: 66px; right: 0; width: min(392px, calc(100vw - 40px));\n overflow: hidden; border: 1px solid rgba(0,0,0,.08); border-radius: 20px;\n background: var(--omni-panel-bg); box-shadow: 0 24px 80px rgba(0,0,0,.18), 0 4px 16px rgba(0,0,0,.06);\n animation: omni-chat-enter 180ms ease-out;\n }\n .panel[hidden] { display: none; }\n .frame { height: min(780px, calc(100dvh - 112px)); min-height: 240px; }\n .close {\n position: absolute; z-index: 1; top: 18px; right: 14px;\n display: flex; align-items: center; justify-content: center; width: 34px; height: 34px;\n border: 1px solid color-mix(in srgb, var(--omni-panel-fg) 10%, transparent); border-radius: 50%;\n background: var(--omni-panel-bg); color: var(--omni-panel-fg); transition: background 160ms ease;\n }\n .close svg { width: 17px; height: 17px; }\n .close:hover { background: color-mix(in srgb, var(--omni-panel-fg) 6%, var(--omni-panel-bg)); }\n :host([data-position=\"left\"]) .panel { right: auto; left: 0; }\n :host([data-position=\"left\"]) .launcher { margin-left: 0; }\n :host([data-presentation=\"sidebar\"]) .panel {\n position: fixed; top: 0; bottom: 0; right: 0; left: auto;\n width: min(440px, 100vw); border-radius: 0; border-top: 0; border-bottom: 0;\n animation: omni-sidebar-enter 180ms ease-out;\n }\n :host([data-presentation=\"sidebar\"]) .frame { height: 100dvh; min-height: 0; }\n :host([data-presentation=\"sidebar\"][data-position=\"left\"]) .panel {\n right: auto; left: 0; animation-name: omni-sidebar-enter-left;\n }\n @keyframes omni-sidebar-enter { from { opacity: 0; transform: translateX(100%); } to { opacity: 1; transform: none; } }\n @keyframes omni-sidebar-enter-left { from { opacity: 0; transform: translateX(-100%); } to { opacity: 1; transform: none; } }\n @keyframes omni-chat-enter { from { opacity: 0; transform: translateY(8px) scale(.98); } to { opacity: 1; transform: none; } }\n @media (max-width: 480px) { :host([data-presentation=\"floating\"]) .panel { width: calc(100vw - 40px); border-radius: 18px; } }\n @media (prefers-reduced-motion: reduce) { .panel, :host([data-presentation=\"sidebar\"]) .panel { animation: none; } .launcher { transition: none; } }\n`;\n","import {\n createOmniChatEmbed,\n getOmniChatEmbedUrl,\n type OmniChatEmbedOptions,\n type OmniChatEmbed,\n} from \"./embed\";\nimport { widgetIcon, widgetStyles } from \"./widget-chrome\";\n\nexport type OmniChatWidgetOptions = OmniChatEmbedOptions & {\n /** Floating window by default; sidebar fills the viewport height. */\n presentation?: \"floating\" | \"sidebar\";\n launcherLabel?: string;\n position?: \"left\" | \"right\";\n launcherBackground?: string;\n launcherForeground?: string;\n panelBackground?: string;\n panelForeground?: string;\n};\nlet widgetSequence = 0;\n/** A website launcher using the same hosted assistant as OmniChat. */\nexport function createOmniChatWidget(\n container: HTMLElement,\n options: OmniChatWidgetOptions,\n) {\n getOmniChatEmbedUrl(options);\n const document = container.ownerDocument;\n const root = document.createElement(\"div\");\n root.setAttribute(\"data-omni-chat-widget\", \"\");\n root.setAttribute(\"data-position\", options.position ?? \"right\");\n root.setAttribute(\"data-presentation\", options.presentation ?? \"floating\");\n const shadow = root.attachShadow({ mode: \"open\" });\n const style = document.createElement(\"style\");\n style.textContent = widgetStyles;\n const launcher = document.createElement(\"button\");\n const panel = document.createElement(\"section\");\n const close = document.createElement(\"button\");\n const frame = document.createElement(\"div\");\n let embed: OmniChatEmbed | undefined;\n let destroyed = false;\n Object.assign(root.style, {\n position: \"fixed\",\n bottom: \"20px\",\n [options.position ?? \"right\"]: \"20px\",\n zIndex: \"2147483000\",\n });\n root.style.setProperty(\n \"--omni-launcher-bg\",\n options.launcherBackground ?? \"#2563eb\",\n );\n root.style.setProperty(\n \"--omni-launcher-fg\",\n options.launcherForeground ?? \"#ffffff\",\n );\n root.style.setProperty(\n \"--omni-panel-bg\",\n options.panelBackground ?? \"#ffffff\",\n );\n root.style.setProperty(\n \"--omni-panel-fg\",\n options.panelForeground ?? \"#171717\",\n );\n launcher.type = close.type = \"button\";\n launcher.className = \"launcher\";\n const label = document.createElement(\"span\");\n label.className = \"label\";\n label.textContent = options.launcherLabel ?? \"Chat with us\";\n launcher.append(widgetIcon(document, \"chat\"), label);\n launcher.setAttribute(\"aria-expanded\", \"false\");\n launcher.setAttribute(\"aria-label\", label.textContent);\n panel.hidden = true;\n panel.className = \"panel\";\n panel.setAttribute(\"role\", \"region\");\n panel.setAttribute(\"aria-label\", options.title ?? \"Assistant chat\");\n panel.id = `omni-chat-widget-${++widgetSequence}`;\n launcher.setAttribute(\"aria-controls\", panel.id);\n frame.className = \"frame\";\n close.className = \"close\";\n close.setAttribute(\"aria-label\", \"Close chat\");\n close.title = \"Close chat\";\n close.append(widgetIcon(document, \"close\"));\n const closeChat = () => {\n if (destroyed) return;\n panel.hidden = true;\n launcher.hidden = false;\n launcher.setAttribute(\"aria-expanded\", \"false\");\n launcher.setAttribute(\"aria-label\", label.textContent!);\n launcher.querySelector(\"svg\")?.replaceWith(widgetIcon(document, \"chat\"));\n launcher.focus();\n };\n const openChat = () => {\n if (destroyed) return;\n embed ??= createOmniChatEmbed(frame, {\n ...options,\n onRequestClose: closeChat,\n });\n embed.iframe.style.minHeight = \"0\";\n panel.hidden = false;\n launcher.hidden = options.presentation === \"sidebar\";\n launcher.setAttribute(\"aria-expanded\", \"true\");\n launcher.setAttribute(\"aria-label\", \"Close chat\");\n launcher\n .querySelector(\"svg\")\n ?.replaceWith(widgetIcon(document, \"collapse\"));\n embed.focus();\n };\n launcher.addEventListener(\"click\", () =>\n panel.hidden ? openChat() : closeChat(),\n );\n close.addEventListener(\"click\", closeChat);\n shadow.addEventListener(\"keydown\", (event) => {\n if ((event as KeyboardEvent).key === \"Escape\" && !panel.hidden) closeChat();\n });\n panel.append(close, frame);\n shadow.append(style, panel, launcher);\n container.append(root);\n return {\n open: openChat,\n close: closeChat,\n destroy() {\n destroyed = true;\n embed?.destroy();\n root.remove();\n },\n };\n}\n","import { getOmniChatEmbedUrl, type OmniChatEmbedOptions } from \"./embed\";\nimport type { OmniChatWidgetOptions } from \"./widget\";\n\ntype EmbedCodeOptions = Pick<\n OmniChatEmbedOptions,\n \"baseUrl\" | \"deploymentId\" | \"title\"\n> &\n Pick<\n OmniChatWidgetOptions,\n | \"presentation\"\n | \"launcherLabel\"\n | \"position\"\n | \"launcherBackground\"\n | \"launcherForeground\"\n | \"panelBackground\"\n | \"panelForeground\"\n >;\nconst scriptJson = (value: unknown) =>\n JSON.stringify(value, null, 2).replace(\n /[<>&\\u2028\\u2029]/g,\n (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, \"0\")}`,\n );\n\n/** Copyable integrations contain only public deployment configuration. */\nexport function getOmniChatEmbedCode(\n options: EmbedCodeOptions,\n mode: \"widget\" | \"inline\" = \"widget\",\n) {\n const baseUrl = new URL(getOmniChatEmbedUrl(options)).origin;\n const config = { ...options, baseUrl };\n const id = `omni-chat-${options.deploymentId}`;\n const mount =\n mode === \"widget\"\n ? `OmniCommerceChat.createOmniChatWidget(document.body, ${scriptJson(config)});`\n : `OmniCommerceChat.createOmniChatEmbed(document.getElementById(${scriptJson(id)}), ${scriptJson(config)});`;\n return `${mode === \"inline\" ? `<div id=\"${id}\" style=\"height:600px\"></div>\\n` : \"\"}<script src=\"${baseUrl}/sdk/embed.global.js\"></script>\\n<script>\\n ${mount.replace(/\\n/g, \"\\n \")}\\n</script>`;\n}\nexport function getOmniChatReactCode(options: EmbedCodeOptions) {\n const baseUrl = new URL(getOmniChatEmbedUrl(options)).origin;\n return `import { OmniProvider, OmniChat } from \"@omni-commerce/sdk/react\";\\n\\n<OmniProvider deploymentId={${scriptJson(options.deploymentId)}}\\n baseUrl={${scriptJson(baseUrl)}}${options.title ? `\\n title={${scriptJson(options.title)}}` : \"\"}>\\n <OmniChat style={{ height: 600 }} />\\n</OmniProvider>`;\n}\n","/** A hosted chat session. Keep its short-lived token in memory, never in iframe URLs. */\nexport { createOmniChatWidget, type OmniChatWidgetOptions } from \"./widget\";\nexport { getOmniChatEmbedCode, getOmniChatReactCode } from \"./embed-code\";\nexport interface OmniChatSession {\n token: string;\n threadId: string;\n expiresIn: number;\n}\nexport interface OmniChatEmbedOptions {\n deploymentId: string;\n baseUrl?: string;\n /** Optional authenticated session mint on the host application's server. */\n getSession?: () => Promise<OmniChatSession>;\n title?: string;\n onError?: (error: Error) => void;\n /** Floating widgets use this to close on Escape from the hosted chat. */\n onRequestClose?: () => void;\n}\nexport interface OmniChatEmbed {\n iframe: HTMLIFrameElement;\n /** Focus the hosted composer, including when reopening a retained chat. */\n focus(): void;\n destroy(): void;\n}\n\nexport function getOmniChatEmbedUrl(\n options: Pick<OmniChatEmbedOptions, \"baseUrl\" | \"deploymentId\">,\n parentOrigin?: string,\n): string {\n if (\n !/^[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}$/i.test(\n options.deploymentId,\n )\n )\n throw new Error(\"A valid chat deployment ID is required.\");\n const base = new URL(options.baseUrl ?? \"https://omnicommerce.sg\");\n if (\n (base.protocol !== \"https:\" &&\n !(\n base.protocol === \"http:\" &&\n [\"localhost\", \"127.0.0.1\"].includes(base.hostname)\n )) ||\n base.username ||\n base.password ||\n base.pathname !== \"/\" ||\n base.search ||\n base.hash\n )\n throw new Error(\"Chat baseUrl must be an HTTPS origin, or HTTP localhost.\");\n const url = new URL(`/embed/${options.deploymentId}`, base.origin);\n if (parentOrigin)\n url.searchParams.set(\"parentOrigin\", new URL(parentOrigin).origin);\n return url.toString();\n}\n\n/** Browser-only mounting; importing this entry point is safe during SSR. */\nexport function createOmniChatEmbed(\n container: HTMLElement,\n options: OmniChatEmbedOptions,\n): OmniChatEmbed {\n const document = container.ownerDocument;\n const host = document.defaultView;\n if (!host) throw new Error(\"A browser document is required to mount chat.\");\n const iframe = document.createElement(\"iframe\");\n iframe.src = getOmniChatEmbedUrl(options, host.location.origin);\n iframe.title = options.title ?? \"OmniCommerce assistant\";\n iframe.referrerPolicy = \"strict-origin-when-cross-origin\";\n iframe.setAttribute(\n \"sandbox\",\n \"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox\",\n );\n Object.assign(iframe.style, {\n width: \"100%\",\n height: \"100%\",\n minHeight: \"320px\",\n border: \"0\",\n display: \"block\",\n });\n const chatOrigin = new URL(iframe.src).origin;\n let destroyed = false;\n let pending: Promise<OmniChatSession> | undefined;\n let previousToken: string | undefined;\n const controller = new AbortController();\n\n const mint = async (): Promise<OmniChatSession> => {\n if (options.getSession) return options.getSession();\n const response = await host.fetch(\n `${chatOrigin}/api/embed/${options.deploymentId}/session`,\n {\n method: \"POST\",\n credentials: \"include\",\n signal: controller.signal,\n headers: {\n \"Content-Type\": \"application/json\",\n ...(previousToken\n ? { Authorization: `Bearer ${previousToken}` }\n : {}),\n },\n body: \"{}\",\n },\n );\n const result = (await response.json()) as OmniChatSession & {\n error?: string;\n };\n if (!response.ok) {\n // A rejected renewal must not keep Retry bound to an obsolete session.\n // The next mint still performs the deployment's full access checks.\n if (response.status === 401 || response.status === 403)\n previousToken = undefined;\n throw new Error(result.error ?? \"Could not open the chat session.\");\n }\n return result;\n };\n const receive = (event: MessageEvent) => {\n if (\n destroyed ||\n event.source !== iframe.contentWindow ||\n event.origin !== chatOrigin ||\n event.data?.deploymentId !== options.deploymentId\n )\n return;\n if (event.data.type === \"omni-chat:close-request\") {\n options.onRequestClose?.();\n return;\n }\n if (event.data.type !== \"omni-chat:session-request\") return;\n pending ??= mint();\n void pending\n .then((session) => {\n if (destroyed) return;\n if (\n typeof session?.token !== \"string\" ||\n !session.token ||\n session.token.length > 4096 ||\n typeof session.threadId !== \"string\" ||\n !session.threadId ||\n !Number.isFinite(session.expiresIn) ||\n session.expiresIn <= 0\n )\n throw new Error(\"Invalid chat session response.\");\n previousToken = session.token;\n iframe.contentWindow?.postMessage(\n {\n type: \"omni-chat:session\",\n deploymentId: options.deploymentId,\n session,\n },\n chatOrigin,\n );\n })\n .catch((error: unknown) => {\n if (destroyed) return;\n const failure =\n error instanceof Error ? error : new Error(\"Could not open chat.\");\n options.onError?.(failure);\n iframe.contentWindow?.postMessage(\n {\n type: \"omni-chat:session-error\",\n deploymentId: options.deploymentId,\n error: failure.message,\n },\n chatOrigin,\n );\n })\n .finally(() => {\n pending = undefined;\n });\n };\n host.addEventListener(\"message\", receive);\n container.append(iframe);\n return {\n iframe,\n focus() {\n if (destroyed) return;\n iframe.focus();\n iframe.contentWindow?.postMessage(\n {\n type: \"omni-chat:focus-composer\",\n deploymentId: options.deploymentId,\n },\n chatOrigin,\n );\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n controller.abort();\n previousToken = undefined;\n host.removeEventListener(\"message\", receive);\n iframe.remove();\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/application.ts","../src/widget-chrome.ts","../src/widget.ts","../src/embed-code.ts","../src/embed.ts"],"names":[],"mappings":"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","file":"embed.cjs","sourcesContent":["/** Host-defined actions execute inside the application, never on the assistant server. */\nexport interface OmniFrontendTool {\n description: string;\n parameters: Record<string, unknown>;\n execute: (\n args: Record<string, unknown>,\n context: { toolCallId: string; abortSignal: AbortSignal },\n ) => unknown | Promise<unknown>;\n}\nexport interface OmniChatApplication {\n name: string;\n description: string;\n /** Return a small, explicitly selected snapshot. Do not include secrets. */\n getContext: () => unknown | Promise<unknown>;\n}\nexport interface OmniApplicationOptions {\n application?: OmniChatApplication;\n /** Names must start with app_; use array arguments for actions with multiple targets. */\n frontendTools?: Record<string, OmniFrontendTool>;\n}\n\nfunction boundedJson(value: unknown, maximum: number): unknown {\n const encoded = JSON.stringify(value);\n if (\n typeof encoded !== \"string\" ||\n new TextEncoder().encode(encoded).length > maximum ||\n /data:[^\"\\s]{0,100};base64,/i.test(encoded)\n )\n throw new Error(\n \"Application data must be bounded JSON without base64 payloads.\",\n );\n return JSON.parse(encoded);\n}\n\nexport function createApplicationMessageHandler(input: {\n options: OmniApplicationOptions;\n signal: AbortSignal;\n reply: (message: Record<string, unknown>) => void;\n}) {\n // A repeated parked call reuses its result instead of applying an action twice.\n const calls = new Map<\n string,\n { signature: string; result: Promise<unknown> }\n >();\n return async (message: Record<string, unknown>) => {\n if (typeof message.requestId !== \"string\" || message.requestId.length > 200)\n return;\n try {\n if (message.type === \"omni-chat:application-request\") {\n const application = input.options.application;\n input.reply({\n type: \"omni-chat:application-response\",\n requestId: message.requestId,\n application: application\n ? boundedJson(\n {\n name: application.name,\n description: application.description,\n context: (await application.getContext()) ?? null,\n tools: Object.entries(input.options.frontendTools ?? {}).map(\n ([name, definition]) => ({\n name,\n description: definition.description,\n parameters: definition.parameters,\n }),\n ),\n },\n 65536,\n )\n : undefined,\n });\n } else if (message.type === \"omni-chat:tool-request\") {\n const name = message.toolName;\n const toolCallId = message.toolCallId;\n if (\n typeof name !== \"string\" ||\n !/^app_[a-z][a-z0-9_]{0,59}$/.test(name) ||\n typeof toolCallId !== \"string\" ||\n !toolCallId ||\n toolCallId.length > 200\n )\n throw new Error(\"Invalid application tool request.\");\n const definition = Object.hasOwn(\n input.options.frontendTools ?? {},\n name,\n )\n ? input.options.frontendTools?.[name]\n : undefined;\n if (!input.options.application || !definition)\n throw new Error(\"This application action is unavailable.\");\n const args = message.args;\n if (!args || typeof args !== \"object\" || Array.isArray(args))\n throw new Error(\"Invalid application action arguments.\");\n const signature = JSON.stringify({ name, args });\n const prior = calls.get(toolCallId);\n if (prior && prior.signature !== signature)\n throw new Error(\"This tool call ID was already used.\");\n const result =\n prior?.result ??\n Promise.resolve().then(() =>\n definition.execute(args as Record<string, unknown>, {\n toolCallId,\n abortSignal: input.signal,\n }),\n );\n if (!prior) {\n if (calls.size >= 200)\n throw new Error(\"Start a new application chat.\");\n calls.set(toolCallId, { signature, result });\n }\n input.reply({\n type: \"omni-chat:tool-response\",\n requestId: message.requestId,\n toolCallId,\n result: boundedJson((await result) ?? null, 12000),\n });\n }\n } catch (error) {\n input.reply({\n type:\n message.type === \"omni-chat:application-request\"\n ? \"omni-chat:application-response\"\n : \"omni-chat:tool-response\",\n requestId: message.requestId,\n toolCallId: message.toolCallId,\n error:\n error instanceof Error\n ? error.message\n : \"The application action failed.\",\n });\n }\n };\n}\n","const iconPaths = {\n chat: \"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5Z\",\n close: \"m6 6 12 12M6 18 18 6\",\n collapse: \"m6 9 6 6 6-6\",\n};\n\nexport function widgetIcon(document: Document, name: keyof typeof iconPaths) {\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"fill\", \"none\");\n svg.setAttribute(\"stroke\", \"currentColor\");\n svg.setAttribute(\"stroke-width\", \"1.8\");\n svg.setAttribute(\"stroke-linecap\", \"round\");\n svg.setAttribute(\"stroke-linejoin\", \"round\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n path.setAttribute(\"d\", iconPaths[name]);\n svg.append(path);\n return svg;\n}\n\n/** Shadow DOM keeps a store's button, font and section CSS out of the widget. */\nexport const widgetStyles = `\n :host { all: initial; font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; color-scheme: light; }\n *, *::before, *::after { box-sizing: border-box; }\n button { font: inherit; cursor: pointer; -webkit-tap-highlight-color: transparent; }\n button:focus-visible { outline: 3px solid var(--omni-launcher-bg); outline-offset: 4px; }\n svg { display: block; width: 22px; height: 22px; flex: none; }\n .launcher {\n display: flex; align-items: center; justify-content: center; gap: 10px;\n height: 52px; padding: 0 20px; border: 1px solid rgba(255,255,255,.14);\n border-radius: 999px; background: var(--omni-launcher-bg); color: var(--omni-launcher-fg);\n font-size: 14px; font-weight: 600; line-height: 1; letter-spacing: -.01em;\n box-shadow: 0 6px 24px rgba(0,0,0,.16), 0 2px 6px rgba(0,0,0,.08);\n transition: transform 160ms ease, box-shadow 160ms ease;\n margin-left: auto;\n }\n .launcher:hover { transform: translateY(-2px); box-shadow: 0 10px 28px rgba(0,0,0,.2); }\n .launcher[hidden] { display: none; }\n .launcher[aria-expanded=\"true\"] { width: 52px; padding: 0; }\n .launcher[aria-expanded=\"true\"] .label { display: none; }\n .panel {\n position: absolute; bottom: 66px; right: 0; width: min(392px, calc(100vw - 40px));\n overflow: hidden; border: 1px solid rgba(0,0,0,.08); border-radius: 20px;\n background: var(--omni-panel-bg); box-shadow: 0 24px 80px rgba(0,0,0,.18), 0 4px 16px rgba(0,0,0,.06);\n animation: omni-chat-enter 180ms ease-out;\n }\n .panel[hidden] { display: none; }\n .frame { height: min(780px, calc(100dvh - 112px)); min-height: 240px; }\n .close {\n position: absolute; z-index: 1; top: 18px; right: 14px;\n display: flex; align-items: center; justify-content: center; width: 34px; height: 34px;\n border: 1px solid color-mix(in srgb, var(--omni-panel-fg) 10%, transparent); border-radius: 50%;\n background: var(--omni-panel-bg); color: var(--omni-panel-fg); transition: background 160ms ease;\n }\n .close svg { width: 17px; height: 17px; }\n .close:hover { background: color-mix(in srgb, var(--omni-panel-fg) 6%, var(--omni-panel-bg)); }\n :host([data-position=\"left\"]) .panel { right: auto; left: 0; }\n :host([data-position=\"left\"]) .launcher { margin-left: 0; }\n :host([data-presentation=\"sidebar\"]) .panel {\n position: fixed; top: 0; bottom: 0; right: 0; left: auto;\n width: min(440px, 100vw); border-radius: 0; border-top: 0; border-bottom: 0;\n animation: omni-sidebar-enter 180ms ease-out;\n }\n :host([data-presentation=\"sidebar\"]) .frame { height: 100dvh; min-height: 0; }\n :host([data-presentation=\"sidebar\"][data-position=\"left\"]) .panel {\n right: auto; left: 0; animation-name: omni-sidebar-enter-left;\n }\n @keyframes omni-sidebar-enter { from { opacity: 0; transform: translateX(100%); } to { opacity: 1; transform: none; } }\n @keyframes omni-sidebar-enter-left { from { opacity: 0; transform: translateX(-100%); } to { opacity: 1; transform: none; } }\n @keyframes omni-chat-enter { from { opacity: 0; transform: translateY(8px) scale(.98); } to { opacity: 1; transform: none; } }\n @media (max-width: 480px) { :host([data-presentation=\"floating\"]) .panel { width: calc(100vw - 40px); border-radius: 18px; } }\n @media (prefers-reduced-motion: reduce) { .panel, :host([data-presentation=\"sidebar\"]) .panel { animation: none; } .launcher { transition: none; } }\n`;\n","import {\n createOmniChatEmbed,\n getOmniChatEmbedUrl,\n type OmniChatEmbedOptions,\n type OmniChatEmbed,\n} from \"./embed\";\nimport { widgetIcon, widgetStyles } from \"./widget-chrome\";\n\nexport type OmniChatWidgetOptions = OmniChatEmbedOptions & {\n /** Floating window by default; sidebar fills the viewport height. */\n presentation?: \"floating\" | \"sidebar\";\n launcherLabel?: string;\n position?: \"left\" | \"right\";\n launcherBackground?: string;\n launcherForeground?: string;\n panelBackground?: string;\n panelForeground?: string;\n};\nlet widgetSequence = 0;\n/** A website launcher using the same hosted assistant as OmniChat. */\nexport function createOmniChatWidget(\n container: HTMLElement,\n options: OmniChatWidgetOptions,\n) {\n getOmniChatEmbedUrl(options);\n const document = container.ownerDocument;\n const root = document.createElement(\"div\");\n root.setAttribute(\"data-omni-chat-widget\", \"\");\n root.setAttribute(\"data-position\", options.position ?? \"right\");\n root.setAttribute(\"data-presentation\", options.presentation ?? \"floating\");\n const shadow = root.attachShadow({ mode: \"open\" });\n const style = document.createElement(\"style\");\n style.textContent = widgetStyles;\n const launcher = document.createElement(\"button\");\n const panel = document.createElement(\"section\");\n const close = document.createElement(\"button\");\n const frame = document.createElement(\"div\");\n let embed: OmniChatEmbed | undefined;\n let destroyed = false;\n Object.assign(root.style, {\n position: \"fixed\",\n bottom: \"20px\",\n [options.position ?? \"right\"]: \"20px\",\n zIndex: \"2147483000\",\n });\n root.style.setProperty(\n \"--omni-launcher-bg\",\n options.launcherBackground ?? \"#2563eb\",\n );\n root.style.setProperty(\n \"--omni-launcher-fg\",\n options.launcherForeground ?? \"#ffffff\",\n );\n root.style.setProperty(\n \"--omni-panel-bg\",\n options.panelBackground ?? \"#ffffff\",\n );\n root.style.setProperty(\n \"--omni-panel-fg\",\n options.panelForeground ?? \"#171717\",\n );\n launcher.type = close.type = \"button\";\n launcher.className = \"launcher\";\n const label = document.createElement(\"span\");\n label.className = \"label\";\n label.textContent = options.launcherLabel ?? \"Chat with us\";\n launcher.append(widgetIcon(document, \"chat\"), label);\n launcher.setAttribute(\"aria-expanded\", \"false\");\n launcher.setAttribute(\"aria-label\", label.textContent);\n panel.hidden = true;\n panel.className = \"panel\";\n panel.setAttribute(\"role\", \"region\");\n panel.setAttribute(\"aria-label\", options.title ?? \"Assistant chat\");\n panel.id = `omni-chat-widget-${++widgetSequence}`;\n launcher.setAttribute(\"aria-controls\", panel.id);\n frame.className = \"frame\";\n close.className = \"close\";\n close.setAttribute(\"aria-label\", \"Close chat\");\n close.title = \"Close chat\";\n close.append(widgetIcon(document, \"close\"));\n const closeChat = () => {\n if (destroyed) return;\n panel.hidden = true;\n launcher.hidden = false;\n launcher.setAttribute(\"aria-expanded\", \"false\");\n launcher.setAttribute(\"aria-label\", label.textContent!);\n launcher.querySelector(\"svg\")?.replaceWith(widgetIcon(document, \"chat\"));\n launcher.focus();\n };\n const openChat = () => {\n if (destroyed) return;\n embed ??= createOmniChatEmbed(frame, {\n ...options,\n onRequestClose: closeChat,\n });\n embed.iframe.style.minHeight = \"0\";\n panel.hidden = false;\n launcher.hidden = options.presentation === \"sidebar\";\n launcher.setAttribute(\"aria-expanded\", \"true\");\n launcher.setAttribute(\"aria-label\", \"Close chat\");\n launcher\n .querySelector(\"svg\")\n ?.replaceWith(widgetIcon(document, \"collapse\"));\n embed.focus();\n };\n launcher.addEventListener(\"click\", () =>\n panel.hidden ? openChat() : closeChat(),\n );\n close.addEventListener(\"click\", closeChat);\n shadow.addEventListener(\"keydown\", (event) => {\n if ((event as KeyboardEvent).key === \"Escape\" && !panel.hidden) closeChat();\n });\n panel.append(close, frame);\n shadow.append(style, panel, launcher);\n container.append(root);\n return {\n open: openChat,\n close: closeChat,\n destroy() {\n destroyed = true;\n embed?.destroy();\n root.remove();\n },\n };\n}\n","import { getOmniChatEmbedUrl, type OmniChatEmbedOptions } from \"./embed\";\nimport type { OmniChatWidgetOptions } from \"./widget\";\n\ntype EmbedCodeOptions = Pick<\n OmniChatEmbedOptions,\n \"baseUrl\" | \"deploymentId\" | \"title\"\n> &\n Pick<\n OmniChatWidgetOptions,\n | \"presentation\"\n | \"launcherLabel\"\n | \"position\"\n | \"launcherBackground\"\n | \"launcherForeground\"\n | \"panelBackground\"\n | \"panelForeground\"\n >;\nconst scriptJson = (value: unknown) =>\n JSON.stringify(value, null, 2).replace(\n /[<>&\\u2028\\u2029]/g,\n (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, \"0\")}`,\n );\n\n/** Copyable integrations contain only public deployment configuration. */\nexport function getOmniChatEmbedCode(\n options: EmbedCodeOptions,\n mode: \"widget\" | \"inline\" = \"widget\",\n) {\n const baseUrl = new URL(getOmniChatEmbedUrl(options)).origin;\n const config = { ...options, baseUrl };\n const id = `omni-chat-${options.deploymentId}`;\n const mount =\n mode === \"widget\"\n ? `OmniCommerceChat.createOmniChatWidget(document.body, ${scriptJson(config)});`\n : `OmniCommerceChat.createOmniChatEmbed(document.getElementById(${scriptJson(id)}), ${scriptJson(config)});`;\n return `${mode === \"inline\" ? `<div id=\"${id}\" style=\"height:600px\"></div>\\n` : \"\"}<script src=\"${baseUrl}/sdk/embed.global.js\"></script>\\n<script>\\n ${mount.replace(/\\n/g, \"\\n \")}\\n</script>`;\n}\nexport function getOmniChatReactCode(options: EmbedCodeOptions) {\n const baseUrl = new URL(getOmniChatEmbedUrl(options)).origin;\n return `import { OmniProvider, OmniChat } from \"@omni-commerce/sdk/react\";\\n\\n<OmniProvider deploymentId={${scriptJson(options.deploymentId)}}\\n baseUrl={${scriptJson(baseUrl)}}${options.title ? `\\n title={${scriptJson(options.title)}}` : \"\"}>\\n <OmniChat style={{ height: 600 }} />\\n</OmniProvider>`;\n}\n","import {\n createApplicationMessageHandler,\n type OmniApplicationOptions,\n} from \"./application\";\nexport type {\n OmniFrontendTool,\n OmniChatApplication,\n OmniApplicationOptions,\n} from \"./application\";\n/** A hosted chat session. Keep its short-lived token in memory, never in iframe URLs. */\nexport { createOmniChatWidget, type OmniChatWidgetOptions } from \"./widget\";\nexport { getOmniChatEmbedCode, getOmniChatReactCode } from \"./embed-code\";\nexport interface OmniChatSession {\n token: string;\n threadId: string;\n expiresIn: number;\n}\nexport interface OmniChatEmbedOptions extends OmniApplicationOptions {\n deploymentId: string;\n baseUrl?: string;\n /** Optional authenticated session mint on the host application's server. */\n getSession?: () => Promise<OmniChatSession>;\n title?: string;\n onError?: (error: Error) => void;\n /** Floating widgets use this to close on Escape from the hosted chat. */\n onRequestClose?: () => void;\n}\nexport interface OmniChatEmbed {\n iframe: HTMLIFrameElement;\n /** Focus the hosted composer, including when reopening a retained chat. */\n focus(): void;\n destroy(): void;\n}\n\nexport function getOmniChatEmbedUrl(\n options: Pick<OmniChatEmbedOptions, \"baseUrl\" | \"deploymentId\">,\n parentOrigin?: string,\n): string {\n if (\n !/^[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}$/i.test(\n options.deploymentId,\n )\n )\n throw new Error(\"A valid chat deployment ID is required.\");\n const base = new URL(options.baseUrl ?? \"https://omnicommerce.sg\");\n if (\n (base.protocol !== \"https:\" &&\n !(\n base.protocol === \"http:\" &&\n [\"localhost\", \"127.0.0.1\"].includes(base.hostname)\n )) ||\n base.username ||\n base.password ||\n base.pathname !== \"/\" ||\n base.search ||\n base.hash\n )\n throw new Error(\"Chat baseUrl must be an HTTPS origin, or HTTP localhost.\");\n const url = new URL(`/embed/${options.deploymentId}`, base.origin);\n if (parentOrigin)\n url.searchParams.set(\"parentOrigin\", new URL(parentOrigin).origin);\n return url.toString();\n}\n\n/** Browser-only mounting; importing this entry point is safe during SSR. */\nexport function createOmniChatEmbed(\n container: HTMLElement,\n options: OmniChatEmbedOptions,\n): OmniChatEmbed {\n const document = container.ownerDocument;\n const host = document.defaultView;\n if (!host) throw new Error(\"A browser document is required to mount chat.\");\n const iframe = document.createElement(\"iframe\");\n iframe.src = getOmniChatEmbedUrl(options, host.location.origin);\n iframe.title = options.title ?? \"OmniCommerce assistant\";\n iframe.referrerPolicy = \"strict-origin-when-cross-origin\";\n iframe.setAttribute(\n \"sandbox\",\n \"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox\",\n );\n Object.assign(iframe.style, {\n width: \"100%\",\n height: \"100%\",\n minHeight: \"320px\",\n border: \"0\",\n display: \"block\",\n });\n const chatOrigin = new URL(iframe.src).origin;\n let destroyed = false;\n let pending: Promise<OmniChatSession> | undefined;\n let previousToken: string | undefined;\n const controller = new AbortController();\n\n const mint = async (): Promise<OmniChatSession> => {\n if (options.getSession) return options.getSession();\n const response = await host.fetch(\n `${chatOrigin}/api/embed/${options.deploymentId}/session`,\n {\n method: \"POST\",\n credentials: \"include\",\n signal: controller.signal,\n headers: {\n \"Content-Type\": \"application/json\",\n ...(previousToken\n ? { Authorization: `Bearer ${previousToken}` }\n : {}),\n },\n body: \"{}\",\n },\n );\n const result = (await response.json()) as OmniChatSession & {\n error?: string;\n };\n if (!response.ok) {\n // A rejected renewal must not keep Retry bound to an obsolete session.\n // The next mint still performs the deployment's full access checks.\n if (response.status === 401 || response.status === 403)\n previousToken = undefined;\n throw new Error(result.error ?? \"Could not open the chat session.\");\n }\n return result;\n };\n const applicationMessage = createApplicationMessageHandler({\n options,\n signal: controller.signal,\n reply: (message) => {\n if (!destroyed)\n iframe.contentWindow?.postMessage(\n { ...message, deploymentId: options.deploymentId },\n chatOrigin,\n );\n },\n });\n const receive = (event: MessageEvent) => {\n if (\n destroyed ||\n event.source !== iframe.contentWindow ||\n event.origin !== chatOrigin ||\n event.data?.deploymentId !== options.deploymentId\n )\n return;\n if (\n event.data.type === \"omni-chat:application-request\" ||\n event.data.type === \"omni-chat:tool-request\"\n ) {\n void applicationMessage(event.data);\n return;\n }\n if (event.data.type === \"omni-chat:close-request\") {\n options.onRequestClose?.();\n return;\n }\n if (event.data.type !== \"omni-chat:session-request\") return;\n pending ??= mint();\n void pending\n .then((session) => {\n if (destroyed) return;\n if (\n typeof session?.token !== \"string\" ||\n !session.token ||\n session.token.length > 4096 ||\n typeof session.threadId !== \"string\" ||\n !session.threadId ||\n !Number.isFinite(session.expiresIn) ||\n session.expiresIn <= 0\n )\n throw new Error(\"Invalid chat session response.\");\n previousToken = session.token;\n iframe.contentWindow?.postMessage(\n {\n type: \"omni-chat:session\",\n deploymentId: options.deploymentId,\n session,\n ...(options.application ? { applicationEnabled: true } : {}),\n },\n chatOrigin,\n );\n })\n .catch((error: unknown) => {\n if (destroyed) return;\n const failure =\n error instanceof Error ? error : new Error(\"Could not open chat.\");\n options.onError?.(failure);\n iframe.contentWindow?.postMessage(\n {\n type: \"omni-chat:session-error\",\n deploymentId: options.deploymentId,\n error: failure.message,\n ...(options.application ? {applicationEnabled: true} : {}),\n },\n chatOrigin,\n );\n })\n .finally(() => {\n pending = undefined;\n });\n };\n host.addEventListener(\"message\", receive);\n container.append(iframe);\n return {\n iframe,\n focus() {\n if (destroyed) return;\n iframe.focus();\n iframe.contentWindow?.postMessage(\n {\n type: \"omni-chat:focus-composer\",\n deploymentId: options.deploymentId,\n },\n chatOrigin,\n );\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n controller.abort();\n previousToken = undefined;\n host.removeEventListener(\"message\", receive);\n iframe.remove();\n },\n };\n}\n"]}
package/dist/embed.d.cts CHANGED
@@ -1,3 +1,24 @@
1
+ /** Host-defined actions execute inside the application, never on the assistant server. */
2
+ interface OmniFrontendTool {
3
+ description: string;
4
+ parameters: Record<string, unknown>;
5
+ execute: (args: Record<string, unknown>, context: {
6
+ toolCallId: string;
7
+ abortSignal: AbortSignal;
8
+ }) => unknown | Promise<unknown>;
9
+ }
10
+ interface OmniChatApplication {
11
+ name: string;
12
+ description: string;
13
+ /** Return a small, explicitly selected snapshot. Do not include secrets. */
14
+ getContext: () => unknown | Promise<unknown>;
15
+ }
16
+ interface OmniApplicationOptions {
17
+ application?: OmniChatApplication;
18
+ /** Names must start with app_; use array arguments for actions with multiple targets. */
19
+ frontendTools?: Record<string, OmniFrontendTool>;
20
+ }
21
+
1
22
  type OmniChatWidgetOptions = OmniChatEmbedOptions & {
2
23
  /** Floating window by default; sidebar fills the viewport height. */
3
24
  presentation?: "floating" | "sidebar";
@@ -20,14 +41,12 @@ type EmbedCodeOptions = Pick<OmniChatEmbedOptions, "baseUrl" | "deploymentId" |
20
41
  declare function getOmniChatEmbedCode(options: EmbedCodeOptions, mode?: "widget" | "inline"): string;
21
42
  declare function getOmniChatReactCode(options: EmbedCodeOptions): string;
22
43
 
23
- /** A hosted chat session. Keep its short-lived token in memory, never in iframe URLs. */
24
-
25
44
  interface OmniChatSession {
26
45
  token: string;
27
46
  threadId: string;
28
47
  expiresIn: number;
29
48
  }
30
- interface OmniChatEmbedOptions {
49
+ interface OmniChatEmbedOptions extends OmniApplicationOptions {
31
50
  deploymentId: string;
32
51
  baseUrl?: string;
33
52
  /** Optional authenticated session mint on the host application's server. */
@@ -47,4 +66,4 @@ declare function getOmniChatEmbedUrl(options: Pick<OmniChatEmbedOptions, "baseUr
47
66
  /** Browser-only mounting; importing this entry point is safe during SSR. */
48
67
  declare function createOmniChatEmbed(container: HTMLElement, options: OmniChatEmbedOptions): OmniChatEmbed;
49
68
 
50
- export { type OmniChatEmbed, type OmniChatEmbedOptions, type OmniChatSession, type OmniChatWidgetOptions, createOmniChatEmbed, createOmniChatWidget, getOmniChatEmbedCode, getOmniChatEmbedUrl, getOmniChatReactCode };
69
+ export { type OmniApplicationOptions, type OmniChatApplication, type OmniChatEmbed, type OmniChatEmbedOptions, type OmniChatSession, type OmniChatWidgetOptions, type OmniFrontendTool, createOmniChatEmbed, createOmniChatWidget, getOmniChatEmbedCode, getOmniChatEmbedUrl, getOmniChatReactCode };
package/dist/embed.d.ts CHANGED
@@ -1,3 +1,24 @@
1
+ /** Host-defined actions execute inside the application, never on the assistant server. */
2
+ interface OmniFrontendTool {
3
+ description: string;
4
+ parameters: Record<string, unknown>;
5
+ execute: (args: Record<string, unknown>, context: {
6
+ toolCallId: string;
7
+ abortSignal: AbortSignal;
8
+ }) => unknown | Promise<unknown>;
9
+ }
10
+ interface OmniChatApplication {
11
+ name: string;
12
+ description: string;
13
+ /** Return a small, explicitly selected snapshot. Do not include secrets. */
14
+ getContext: () => unknown | Promise<unknown>;
15
+ }
16
+ interface OmniApplicationOptions {
17
+ application?: OmniChatApplication;
18
+ /** Names must start with app_; use array arguments for actions with multiple targets. */
19
+ frontendTools?: Record<string, OmniFrontendTool>;
20
+ }
21
+
1
22
  type OmniChatWidgetOptions = OmniChatEmbedOptions & {
2
23
  /** Floating window by default; sidebar fills the viewport height. */
3
24
  presentation?: "floating" | "sidebar";
@@ -20,14 +41,12 @@ type EmbedCodeOptions = Pick<OmniChatEmbedOptions, "baseUrl" | "deploymentId" |
20
41
  declare function getOmniChatEmbedCode(options: EmbedCodeOptions, mode?: "widget" | "inline"): string;
21
42
  declare function getOmniChatReactCode(options: EmbedCodeOptions): string;
22
43
 
23
- /** A hosted chat session. Keep its short-lived token in memory, never in iframe URLs. */
24
-
25
44
  interface OmniChatSession {
26
45
  token: string;
27
46
  threadId: string;
28
47
  expiresIn: number;
29
48
  }
30
- interface OmniChatEmbedOptions {
49
+ interface OmniChatEmbedOptions extends OmniApplicationOptions {
31
50
  deploymentId: string;
32
51
  baseUrl?: string;
33
52
  /** Optional authenticated session mint on the host application's server. */
@@ -47,4 +66,4 @@ declare function getOmniChatEmbedUrl(options: Pick<OmniChatEmbedOptions, "baseUr
47
66
  /** Browser-only mounting; importing this entry point is safe during SSR. */
48
67
  declare function createOmniChatEmbed(container: HTMLElement, options: OmniChatEmbedOptions): OmniChatEmbed;
49
68
 
50
- export { type OmniChatEmbed, type OmniChatEmbedOptions, type OmniChatSession, type OmniChatWidgetOptions, createOmniChatEmbed, createOmniChatWidget, getOmniChatEmbedCode, getOmniChatEmbedUrl, getOmniChatReactCode };
69
+ export { type OmniApplicationOptions, type OmniChatApplication, type OmniChatEmbed, type OmniChatEmbedOptions, type OmniChatSession, type OmniChatWidgetOptions, type OmniFrontendTool, createOmniChatEmbed, createOmniChatWidget, getOmniChatEmbedCode, getOmniChatEmbedUrl, getOmniChatReactCode };
@@ -1,4 +1,4 @@
1
- "use strict";var OmniCommerceChat=(()=>{var y=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var S=(n,e)=>{for(var t in e)y(n,t,{get:e[t],enumerable:!0})},P=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of I(e))!A.call(n,o)&&o!==t&&y(n,o,{get:()=>e[o],enumerable:!(r=k(e,o))||r.enumerable});return n};var $=n=>P(y({},"__esModule",{value:!0}),n);var W={};S(W,{createOmniChatEmbed:()=>x,createOmniChatWidget:()=>C,getOmniChatEmbedCode:()=>O,getOmniChatEmbedUrl:()=>m,getOmniChatReactCode:()=>E});var L={chat:"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5Z",close:"m6 6 12 12M6 18 18 6",collapse:"m6 9 6 6 6-6"};function f(n,e){let t=n.createElementNS("http://www.w3.org/2000/svg","svg");t.setAttribute("viewBox","0 0 24 24"),t.setAttribute("fill","none"),t.setAttribute("stroke","currentColor"),t.setAttribute("stroke-width","1.8"),t.setAttribute("stroke-linecap","round"),t.setAttribute("stroke-linejoin","round"),t.setAttribute("aria-hidden","true");let r=n.createElementNS("http://www.w3.org/2000/svg","path");return r.setAttribute("d",L[e]),t.append(r),t}var w=`
1
+ "use strict";var OmniCommerceChat=(()=>{var w=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var q=Object.prototype.hasOwnProperty;var P=(n,t)=>{for(var e in t)w(n,e,{get:t[e],enumerable:!0})},T=(n,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of S(t))!q.call(n,r)&&r!==e&&w(n,r,{get:()=>t[r],enumerable:!(o=A(t,r))||o.enumerable});return n};var $=n=>T(w({},"__esModule",{value:!0}),n);var R={};P(R,{createOmniChatEmbed:()=>x,createOmniChatWidget:()=>k,getOmniChatEmbedCode:()=>v,getOmniChatEmbedUrl:()=>h,getOmniChatReactCode:()=>I});function O(n,t){let e=JSON.stringify(n);if(typeof e!="string"||new TextEncoder().encode(e).length>t||/data:[^"\s]{0,100};base64,/i.test(e))throw new Error("Application data must be bounded JSON without base64 payloads.");return JSON.parse(e)}function C(n){let t=new Map;return async e=>{if(!(typeof e.requestId!="string"||e.requestId.length>200))try{if(e.type==="omni-chat:application-request"){let o=n.options.application;n.reply({type:"omni-chat:application-response",requestId:e.requestId,application:o?O({name:o.name,description:o.description,context:await o.getContext()??null,tools:Object.entries(n.options.frontendTools??{}).map(([r,p])=>({name:r,description:p.description,parameters:p.parameters}))},65536):void 0})}else if(e.type==="omni-chat:tool-request"){let o=e.toolName,r=e.toolCallId;if(typeof o!="string"||!/^app_[a-z][a-z0-9_]{0,59}$/.test(o)||typeof r!="string"||!r||r.length>200)throw new Error("Invalid application tool request.");let p=Object.hasOwn(n.options.frontendTools??{},o)?n.options.frontendTools?.[o]:void 0;if(!n.options.application||!p)throw new Error("This application action is unavailable.");let i=e.args;if(!i||typeof i!="object"||Array.isArray(i))throw new Error("Invalid application action arguments.");let s=JSON.stringify({name:o,args:i}),l=t.get(r);if(l&&l.signature!==s)throw new Error("This tool call ID was already used.");let c=l?.result??Promise.resolve().then(()=>p.execute(i,{toolCallId:r,abortSignal:n.signal}));if(!l){if(t.size>=200)throw new Error("Start a new application chat.");t.set(r,{signature:s,result:c})}n.reply({type:"omni-chat:tool-response",requestId:e.requestId,toolCallId:r,result:O(await c??null,12e3)})}}catch(o){n.reply({type:e.type==="omni-chat:application-request"?"omni-chat:application-response":"omni-chat:tool-response",requestId:e.requestId,toolCallId:e.toolCallId,error:o instanceof Error?o.message:"The application action failed."})}}}var L={chat:"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5Z",close:"m6 6 12 12M6 18 18 6",collapse:"m6 9 6 6 6-6"};function b(n,t){let e=n.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttribute("viewBox","0 0 24 24"),e.setAttribute("fill","none"),e.setAttribute("stroke","currentColor"),e.setAttribute("stroke-width","1.8"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-linejoin","round"),e.setAttribute("aria-hidden","true");let o=n.createElementNS("http://www.w3.org/2000/svg","path");return o.setAttribute("d",L[t]),e.append(o),e}var E=`
2
2
  :host { all: initial; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; color-scheme: light; }
3
3
  *, *::before, *::after { box-sizing: border-box; }
4
4
  button { font: inherit; cursor: pointer; -webkit-tap-highlight-color: transparent; }
@@ -49,16 +49,16 @@
49
49
  @keyframes omni-chat-enter { from { opacity: 0; transform: translateY(8px) scale(.98); } to { opacity: 1; transform: none; } }
50
50
  @media (max-width: 480px) { :host([data-presentation="floating"]) .panel { width: calc(100vw - 40px); border-radius: 18px; } }
51
51
  @media (prefers-reduced-motion: reduce) { .panel, :host([data-presentation="sidebar"]) .panel { animation: none; } .launcher { transition: none; } }
52
- `;var U=0;function C(n,e){m(e);let t=n.ownerDocument,r=t.createElement("div");r.setAttribute("data-omni-chat-widget",""),r.setAttribute("data-position",e.position??"right"),r.setAttribute("data-presentation",e.presentation??"floating");let o=r.attachShadow({mode:"open"}),c=t.createElement("style");c.textContent=w;let i=t.createElement("button"),s=t.createElement("section"),l=t.createElement("button"),p=t.createElement("div"),h,u=!1;Object.assign(r.style,{position:"fixed",bottom:"20px",[e.position??"right"]:"20px",zIndex:"2147483000"}),r.style.setProperty("--omni-launcher-bg",e.launcherBackground??"#2563eb"),r.style.setProperty("--omni-launcher-fg",e.launcherForeground??"#ffffff"),r.style.setProperty("--omni-panel-bg",e.panelBackground??"#ffffff"),r.style.setProperty("--omni-panel-fg",e.panelForeground??"#171717"),i.type=l.type="button",i.className="launcher";let d=t.createElement("span");d.className="label",d.textContent=e.launcherLabel??"Chat with us",i.append(f(t,"chat"),d),i.setAttribute("aria-expanded","false"),i.setAttribute("aria-label",d.textContent),s.hidden=!0,s.className="panel",s.setAttribute("role","region"),s.setAttribute("aria-label",e.title??"Assistant chat"),s.id=`omni-chat-widget-${++U}`,i.setAttribute("aria-controls",s.id),p.className="frame",l.className="close",l.setAttribute("aria-label","Close chat"),l.title="Close chat",l.append(f(t,"close"));let a=()=>{u||(s.hidden=!0,i.hidden=!1,i.setAttribute("aria-expanded","false"),i.setAttribute("aria-label",d.textContent),i.querySelector("svg")?.replaceWith(f(t,"chat")),i.focus())},b=()=>{u||(h??(h=x(p,{...e,onRequestClose:a})),h.iframe.style.minHeight="0",s.hidden=!1,i.hidden=e.presentation==="sidebar",i.setAttribute("aria-expanded","true"),i.setAttribute("aria-label","Close chat"),i.querySelector("svg")?.replaceWith(f(t,"collapse")),h.focus())};return i.addEventListener("click",()=>s.hidden?b():a()),l.addEventListener("click",a),o.addEventListener("keydown",v=>{v.key==="Escape"&&!s.hidden&&a()}),s.append(l,p),o.append(c,s,i),n.append(r),{open:b,close:a,destroy(){u=!0,h?.destroy(),r.remove()}}}var g=n=>JSON.stringify(n,null,2).replace(/[<>&\u2028\u2029]/g,e=>`\\u${e.charCodeAt(0).toString(16).padStart(4,"0")}`);function O(n,e="widget"){let t=new URL(m(n)).origin,r={...n,baseUrl:t},o=`omni-chat-${n.deploymentId}`,c=e==="widget"?`OmniCommerceChat.createOmniChatWidget(document.body, ${g(r)});`:`OmniCommerceChat.createOmniChatEmbed(document.getElementById(${g(o)}), ${g(r)});`;return`${e==="inline"?`<div id="${o}" style="height:600px"></div>
53
- `:""}<script src="${t}/sdk/embed.global.js"><\/script>
52
+ `;var U=0;function k(n,t){h(t);let e=n.ownerDocument,o=e.createElement("div");o.setAttribute("data-omni-chat-widget",""),o.setAttribute("data-position",t.position??"right"),o.setAttribute("data-presentation",t.presentation??"floating");let r=o.attachShadow({mode:"open"}),p=e.createElement("style");p.textContent=E;let i=e.createElement("button"),s=e.createElement("section"),l=e.createElement("button"),c=e.createElement("div"),u,f=!1;Object.assign(o.style,{position:"fixed",bottom:"20px",[t.position??"right"]:"20px",zIndex:"2147483000"}),o.style.setProperty("--omni-launcher-bg",t.launcherBackground??"#2563eb"),o.style.setProperty("--omni-launcher-fg",t.launcherForeground??"#ffffff"),o.style.setProperty("--omni-panel-bg",t.panelBackground??"#ffffff"),o.style.setProperty("--omni-panel-fg",t.panelForeground??"#171717"),i.type=l.type="button",i.className="launcher";let m=e.createElement("span");m.className="label",m.textContent=t.launcherLabel??"Chat with us",i.append(b(e,"chat"),m),i.setAttribute("aria-expanded","false"),i.setAttribute("aria-label",m.textContent),s.hidden=!0,s.className="panel",s.setAttribute("role","region"),s.setAttribute("aria-label",t.title??"Assistant chat"),s.id=`omni-chat-widget-${++U}`,i.setAttribute("aria-controls",s.id),c.className="frame",l.className="close",l.setAttribute("aria-label","Close chat"),l.title="Close chat",l.append(b(e,"close"));let a=()=>{f||(s.hidden=!0,i.hidden=!1,i.setAttribute("aria-expanded","false"),i.setAttribute("aria-label",m.textContent),i.querySelector("svg")?.replaceWith(b(e,"chat")),i.focus())},d=()=>{f||(u??(u=x(c,{...t,onRequestClose:a})),u.iframe.style.minHeight="0",s.hidden=!1,i.hidden=t.presentation==="sidebar",i.setAttribute("aria-expanded","true"),i.setAttribute("aria-label","Close chat"),i.querySelector("svg")?.replaceWith(b(e,"collapse")),u.focus())};return i.addEventListener("click",()=>s.hidden?d():a()),l.addEventListener("click",a),r.addEventListener("keydown",y=>{y.key==="Escape"&&!s.hidden&&a()}),s.append(l,c),r.append(p,s,i),n.append(o),{open:d,close:a,destroy(){f=!0,u?.destroy(),o.remove()}}}var g=n=>JSON.stringify(n,null,2).replace(/[<>&\u2028\u2029]/g,t=>`\\u${t.charCodeAt(0).toString(16).padStart(4,"0")}`);function v(n,t="widget"){let e=new URL(h(n)).origin,o={...n,baseUrl:e},r=`omni-chat-${n.deploymentId}`,p=t==="widget"?`OmniCommerceChat.createOmniChatWidget(document.body, ${g(o)});`:`OmniCommerceChat.createOmniChatEmbed(document.getElementById(${g(r)}), ${g(o)});`;return`${t==="inline"?`<div id="${r}" style="height:600px"></div>
53
+ `:""}<script src="${e}/sdk/embed.global.js"><\/script>
54
54
  <script>
55
- ${c.replace(/\n/g,`
55
+ ${p.replace(/\n/g,`
56
56
  `)}
57
- <\/script>`}function E(n){let e=new URL(m(n)).origin;return`import { OmniProvider, OmniChat } from "@omni-commerce/sdk/react";
57
+ <\/script>`}function I(n){let t=new URL(h(n)).origin;return`import { OmniProvider, OmniChat } from "@omni-commerce/sdk/react";
58
58
 
59
59
  <OmniProvider deploymentId={${g(n.deploymentId)}}
60
- baseUrl={${g(e)}}${n.title?`
60
+ baseUrl={${g(t)}}${n.title?`
61
61
  title={${g(n.title)}}`:""}>
62
62
  <OmniChat style={{ height: 600 }} />
63
- </OmniProvider>`}function m(n,e){if(!/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/i.test(n.deploymentId))throw new Error("A valid chat deployment ID is required.");let t=new URL(n.baseUrl??"https://omnicommerce.sg");if(t.protocol!=="https:"&&!(t.protocol==="http:"&&["localhost","127.0.0.1"].includes(t.hostname))||t.username||t.password||t.pathname!=="/"||t.search||t.hash)throw new Error("Chat baseUrl must be an HTTPS origin, or HTTP localhost.");let r=new URL(`/embed/${n.deploymentId}`,t.origin);return e&&r.searchParams.set("parentOrigin",new URL(e).origin),r.toString()}function x(n,e){let t=n.ownerDocument,r=t.defaultView;if(!r)throw new Error("A browser document is required to mount chat.");let o=t.createElement("iframe");o.src=m(e,r.location.origin),o.title=e.title??"OmniCommerce assistant",o.referrerPolicy="strict-origin-when-cross-origin",o.setAttribute("sandbox","allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox"),Object.assign(o.style,{width:"100%",height:"100%",minHeight:"320px",border:"0",display:"block"});let c=new URL(o.src).origin,i=!1,s,l,p=new AbortController,h=async()=>{if(e.getSession)return e.getSession();let d=await r.fetch(`${c}/api/embed/${e.deploymentId}/session`,{method:"POST",credentials:"include",signal:p.signal,headers:{"Content-Type":"application/json",...l?{Authorization:`Bearer ${l}`}:{}},body:"{}"}),a=await d.json();if(!d.ok)throw(d.status===401||d.status===403)&&(l=void 0),new Error(a.error??"Could not open the chat session.");return a},u=d=>{if(!(i||d.source!==o.contentWindow||d.origin!==c||d.data?.deploymentId!==e.deploymentId)){if(d.data.type==="omni-chat:close-request"){e.onRequestClose?.();return}d.data.type==="omni-chat:session-request"&&(s??(s=h()),s.then(a=>{if(!i){if(typeof a?.token!="string"||!a.token||a.token.length>4096||typeof a.threadId!="string"||!a.threadId||!Number.isFinite(a.expiresIn)||a.expiresIn<=0)throw new Error("Invalid chat session response.");l=a.token,o.contentWindow?.postMessage({type:"omni-chat:session",deploymentId:e.deploymentId,session:a},c)}}).catch(a=>{if(i)return;let b=a instanceof Error?a:new Error("Could not open chat.");e.onError?.(b),o.contentWindow?.postMessage({type:"omni-chat:session-error",deploymentId:e.deploymentId,error:b.message},c)}).finally(()=>{s=void 0}))}};return r.addEventListener("message",u),n.append(o),{iframe:o,focus(){i||(o.focus(),o.contentWindow?.postMessage({type:"omni-chat:focus-composer",deploymentId:e.deploymentId},c))},destroy(){i||(i=!0,p.abort(),l=void 0,r.removeEventListener("message",u),o.remove())}}}return $(W);})();
63
+ </OmniProvider>`}function h(n,t){if(!/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/i.test(n.deploymentId))throw new Error("A valid chat deployment ID is required.");let e=new URL(n.baseUrl??"https://omnicommerce.sg");if(e.protocol!=="https:"&&!(e.protocol==="http:"&&["localhost","127.0.0.1"].includes(e.hostname))||e.username||e.password||e.pathname!=="/"||e.search||e.hash)throw new Error("Chat baseUrl must be an HTTPS origin, or HTTP localhost.");let o=new URL(`/embed/${n.deploymentId}`,e.origin);return t&&o.searchParams.set("parentOrigin",new URL(t).origin),o.toString()}function x(n,t){let e=n.ownerDocument,o=e.defaultView;if(!o)throw new Error("A browser document is required to mount chat.");let r=e.createElement("iframe");r.src=h(t,o.location.origin),r.title=t.title??"OmniCommerce assistant",r.referrerPolicy="strict-origin-when-cross-origin",r.setAttribute("sandbox","allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox"),Object.assign(r.style,{width:"100%",height:"100%",minHeight:"320px",border:"0",display:"block"});let p=new URL(r.src).origin,i=!1,s,l,c=new AbortController,u=async()=>{if(t.getSession)return t.getSession();let a=await o.fetch(`${p}/api/embed/${t.deploymentId}/session`,{method:"POST",credentials:"include",signal:c.signal,headers:{"Content-Type":"application/json",...l?{Authorization:`Bearer ${l}`}:{}},body:"{}"}),d=await a.json();if(!a.ok)throw(a.status===401||a.status===403)&&(l=void 0),new Error(d.error??"Could not open the chat session.");return d},f=C({options:t,signal:c.signal,reply:a=>{i||r.contentWindow?.postMessage({...a,deploymentId:t.deploymentId},p)}}),m=a=>{if(!(i||a.source!==r.contentWindow||a.origin!==p||a.data?.deploymentId!==t.deploymentId)){if(a.data.type==="omni-chat:application-request"||a.data.type==="omni-chat:tool-request"){f(a.data);return}if(a.data.type==="omni-chat:close-request"){t.onRequestClose?.();return}a.data.type==="omni-chat:session-request"&&(s??(s=u()),s.then(d=>{if(!i){if(typeof d?.token!="string"||!d.token||d.token.length>4096||typeof d.threadId!="string"||!d.threadId||!Number.isFinite(d.expiresIn)||d.expiresIn<=0)throw new Error("Invalid chat session response.");l=d.token,r.contentWindow?.postMessage({type:"omni-chat:session",deploymentId:t.deploymentId,session:d,...t.application?{applicationEnabled:!0}:{}},p)}}).catch(d=>{if(i)return;let y=d instanceof Error?d:new Error("Could not open chat.");t.onError?.(y),r.contentWindow?.postMessage({type:"omni-chat:session-error",deploymentId:t.deploymentId,error:y.message,...t.application?{applicationEnabled:!0}:{}},p)}).finally(()=>{s=void 0}))}};return o.addEventListener("message",m),n.append(r),{iframe:r,focus(){i||(r.focus(),r.contentWindow?.postMessage({type:"omni-chat:focus-composer",deploymentId:t.deploymentId},p))},destroy(){i||(i=!0,c.abort(),l=void 0,o.removeEventListener("message",m),r.remove())}}}return $(R);})();
64
64
  //# sourceMappingURL=embed.global.js.map