@paramms/chat-widget 1.7.0 → 1.9.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/dist/index.js CHANGED
@@ -1,18 +1,18 @@
1
1
  var Be = Object.defineProperty;
2
- var $e = (t, e, d) => e in t ? Be(t, e, { enumerable: !0, configurable: !0, writable: !0, value: d }) : t[e] = d;
3
- var C = (t, e, d) => $e(t, typeof e != "symbol" ? e + "" : e, d);
4
- import { l as Re, b as ve, p as Me, r as Ae, c as qe, a as Ne, m as Oe } from "./chatlist2.js";
5
- import { h as ut } from "./chatlist2.js";
6
- import { P as De, C as He, b as _e } from "./outbox.js";
7
- import { e as ft } from "./outbox.js";
8
- import { E2ESession as Ue, extractX3DHInit as Fe } from "./e2e.js";
9
- const We = `
2
+ var $e = (t, e, l) => e in t ? Be(t, e, { enumerable: !0, configurable: !0, writable: !0, value: l }) : t[e] = l;
3
+ var C = (t, e, l) => $e(t, typeof e != "symbol" ? e + "" : e, l);
4
+ import { l as Re, b as ke, p as Me, r as Ae, c as qe, f as Ne, a as Oe, m as De } from "./chatlist2.js";
5
+ import { h as ht } from "./chatlist2.js";
6
+ import { P as He, C as _e, b as Ue } from "./outbox.js";
7
+ import { e as wt } from "./outbox.js";
8
+ import { E2ESession as Fe, extractX3DHInit as We } from "./e2e.js";
9
+ const Ge = `
10
10
  .ocw { ${Re("ocw")}
11
11
  position:relative;
12
12
  display:flex; flex-direction:column; height:100%; min-height:320px; background:var(--ocw-bg);
13
13
  font-family:var(--ocw-fb); color:var(--ocw-ink); overflow:hidden; }
14
- @media (prefers-color-scheme: dark) { .ocw[data-theme="auto"] { ${ve("ocw")} } }
15
- .ocw[data-theme="dark"] { ${ve("ocw")} }
14
+ @media (prefers-color-scheme: dark) { .ocw[data-theme="auto"] { ${ke("ocw")} } }
15
+ .ocw[data-theme="dark"] { ${ke("ocw")} }
16
16
  /* ── Responsive sizing ──────────────────────────────────────────────────────
17
17
  * Sizing is driven by the WIDGET'S OWN width (ResizeObserver toggles
18
18
  * .ocw-compact below 400px), not the viewport — so a widget embedded in a
@@ -197,47 +197,47 @@ const We = `
197
197
  .ocw-bubble-wrap:hover .ocw-translate-btn { opacity:1; }
198
198
  .ocw-translation { margin-top:6px; padding-top:6px; border-top:1px solid var(--ocw-line); font-size:13px; line-height:1.45; }
199
199
  .ocw-translation::before { content:'🌐 '; opacity:.75; }
200
- `, ke = "objectchat-widget-styles", Ge = ["👍", "❤️", "😂", "😮", "😢", "🙏"], Ke = 400, Ve = '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M22 2 11 13M22 2l-7 20-4-9-9-4 20-7z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>';
201
- function Ye() {
202
- if (typeof document > "u" || document.getElementById(ke)) return;
203
- const t = document.createElement("style");
204
- t.id = ke, t.textContent = We, document.head.appendChild(t);
205
- }
206
- const Ce = "ocw-webfont";
200
+ `, Ce = "objectchat-widget-styles", Ke = ["👍", "❤️", "😂", "😮", "😢", "🙏"], Ve = 400, Ye = '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M22 2 11 13M22 2l-7 20-4-9-9-4 20-7z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>';
207
201
  function Xe() {
208
202
  if (typeof document > "u" || document.getElementById(Ce)) return;
203
+ const t = document.createElement("style");
204
+ t.id = Ce, t.textContent = Ge, document.head.appendChild(t);
205
+ }
206
+ const Ie = "ocw-webfont";
207
+ function Qe() {
208
+ if (typeof document > "u" || document.getElementById(Ie)) return;
209
209
  const t = document.createElement("link");
210
- t.id = Ce, t.rel = "stylesheet", t.href = "https://fonts.googleapis.com/css2?family=Baloo+2:wght@500;600;700&family=Nunito:wght@400;500;600;700&display=swap", document.head.appendChild(t);
210
+ t.id = Ie, t.rel = "stylesheet", t.href = "https://fonts.googleapis.com/css2?family=Baloo+2:wght@500;600;700&family=Nunito:wght@400;500;600;700&display=swap", document.head.appendChild(t);
211
211
  }
212
- function n(t, e, d) {
213
- const s = document.createElement(t);
214
- return e && (s.className = e), d !== void 0 && (s.textContent = d), s;
212
+ function n(t, e, l) {
213
+ const c = document.createElement(t);
214
+ return e && (c.className = e), l !== void 0 && (c.textContent = l), c;
215
215
  }
216
- function Qe(t, e) {
217
- const d = /(https?:\/\/[^\s]+)/g;
218
- let s = 0, c = null, h;
219
- for (; (h = d.exec(e)) !== null; ) {
220
- if (h.index > s) {
221
- const a = document.createTextNode(e.slice(s, h.index));
222
- t.append(a), c ?? (c = a);
216
+ function Je(t, e) {
217
+ const l = /(https?:\/\/[^\s]+)/g;
218
+ let c = 0, a = null, f;
219
+ for (; (f = l.exec(e)) !== null; ) {
220
+ if (f.index > c) {
221
+ const d = document.createTextNode(e.slice(c, f.index));
222
+ t.append(d), a ?? (a = d);
223
223
  }
224
- let y = h[0], l = "";
225
- const u = /[).,!?;:]+$/.exec(y);
226
- u && (l = u[0], y = y.slice(0, -l.length));
227
- const x = document.createElement("a");
228
- x.href = y, x.target = "_blank", x.rel = "noopener noreferrer", x.textContent = y, x.style.cssText = "color:inherit;text-decoration:underline;word-break:break-all", t.append(x), l && t.append(document.createTextNode(l)), s = h.index + h[0].length;
224
+ let y = f[0], s = "";
225
+ const x = /[).,!?;:]+$/.exec(y);
226
+ x && (s = x[0], y = y.slice(0, -s.length));
227
+ const u = document.createElement("a");
228
+ u.href = y, u.target = "_blank", u.rel = "noopener noreferrer", u.textContent = y, u.style.cssText = "color:inherit;text-decoration:underline;word-break:break-all", t.append(u), s && t.append(document.createTextNode(s)), c = f.index + f[0].length;
229
229
  }
230
- const b = document.createTextNode(e.slice(s));
231
- return t.append(b), c ?? (c = b), c;
230
+ const b = document.createTextNode(e.slice(c));
231
+ return t.append(b), a ?? (a = b), a;
232
232
  }
233
- function Je(t) {
233
+ function Ze(t) {
234
234
  try {
235
235
  return new Date(t).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
236
236
  } catch {
237
237
  return "";
238
238
  }
239
239
  }
240
- function re(t) {
240
+ function se(t) {
241
241
  var e;
242
242
  switch (t.kind) {
243
243
  case "text":
@@ -254,9 +254,9 @@ function re(t) {
254
254
  return `📅 ${t.title} — ${new Date(t.startIso).toLocaleString()}`;
255
255
  }
256
256
  }
257
- class Ze {
257
+ class et {
258
258
  /** Last seq the guest has seen per conversationId — used to compute unread badges. */
259
- constructor(e, d, s, c = {}) {
259
+ constructor(e, l, c, a = {}) {
260
260
  C(this, "scroll");
261
261
  C(this, "chips");
262
262
  C(this, "typing");
@@ -291,59 +291,59 @@ class Ze {
291
291
  /** Whether the subject card (server Subject entity, mount config fallback)
292
292
  * has been built — built once when data first arrives. */
293
293
  C(this, "subjectBuilt", !1);
294
- var z, O, T, _, r, i, v, f, m, k, S;
295
- this.root = e, this.me = d, this.h = s, this.cfg = c, Ye(), c.webfont !== !1 && Xe(), e.replaceChildren(), e.classList.add("ocw"), c.accent && e.style.setProperty("--ocw-accent", c.accent);
296
- const h = c.accent2 ?? c.accent;
297
- h && e.style.setProperty("--ocw-accent2", h), this.cfgAccent2 = c.accent2, e.dataset.theme = c.theme ?? "light";
294
+ var P, O, j, _, E, r, i, h, m, v, k;
295
+ this.root = e, this.me = l, this.h = c, this.cfg = a, Xe(), a.webfont !== !1 && Qe(), e.replaceChildren(), e.classList.add("ocw"), a.accent && e.style.setProperty("--ocw-accent", a.accent);
296
+ const f = a.accent2 ?? a.accent;
297
+ f && e.style.setProperty("--ocw-accent2", f), this.cfgAccent2 = a.accent2, e.dataset.theme = a.theme ?? "light";
298
298
  const b = n("div", "ocw-head");
299
299
  if (this.h.onBack) {
300
300
  const w = n("button", "ocw-back", "‹");
301
301
  w.type = "button", w.setAttribute("aria-label", "Back"), w.addEventListener("click", () => this.h.onBack()), b.append(w);
302
302
  }
303
- const y = ((z = c.subject) == null ? void 0 : z.ownerLabel) ?? ((O = c.subject) == null ? void 0 : O.title) ?? "", l = n("div", "ocw-avatar");
304
- y.trim() && (l.textContent = y.trim()[0].toUpperCase(), b.append(l));
305
- const u = n("div", "ocw-head-main");
306
- this.headerName = n("div", "ocw-head-name", ((T = c.subject) == null ? void 0 : T.ownerLabel) ?? ((_ = c.subject) == null ? void 0 : _.title) ?? ""), u.append(this.headerName), this.headStatus = n("div", "ocw-head-status"), this.headStatus.style.display = "none", u.append(this.headStatus), (r = c.subject) != null && r.subtitle && u.append(n("div", "ocw-head-meta", c.subject.subtitle)), b.append(u), this.statusBadge = n("span", "ocw-badge", ((i = c.subject) == null ? void 0 : i.status) ?? ""), (v = c.subject) != null && v.status || (this.statusBadge.style.display = "none"), b.append(this.statusBadge), this.e2eBadge = n("span", "ocw-e2e", "🔒 E2E"), this.e2eBadge.style.display = "none", b.append(this.e2eBadge), this.connStatus = n("span", "ocw-conn-status"), this.connStatus.style.display = "none", b.append(this.connStatus), b.append(n("button", "ocw-menu", "⋯")), this.chips = n("div", "ocw-chiprow"), this.scroll = n("div", "ocw-scroll"), this.subjectCard = n("div", "ocw-subject"), this.typing = n("div", "ocw-typing");
307
- const x = n("div", "ocw-typing-bubble");
308
- x.append(n("div", "ocw-typing-dot"), n("div", "ocw-typing-dot"), n("div", "ocw-typing-dot")), this.typing.append(x), this.quick = n("div", "ocw-quick");
309
- for (const w of c.quickReplies ?? []) {
310
- const I = n("button", void 0, w);
311
- I.addEventListener("click", () => {
303
+ const y = ((P = a.subject) == null ? void 0 : P.ownerLabel) ?? ((O = a.subject) == null ? void 0 : O.title) ?? "", s = n("div", "ocw-avatar");
304
+ y.trim() && (s.textContent = y.trim()[0].toUpperCase(), b.append(s));
305
+ const x = n("div", "ocw-head-main");
306
+ this.headerName = n("div", "ocw-head-name", ((j = a.subject) == null ? void 0 : j.ownerLabel) ?? ((_ = a.subject) == null ? void 0 : _.title) ?? ""), x.append(this.headerName), this.headStatus = n("div", "ocw-head-status"), this.headStatus.style.display = "none", x.append(this.headStatus), (E = a.subject) != null && E.subtitle && x.append(n("div", "ocw-head-meta", a.subject.subtitle)), b.append(x), this.statusBadge = n("span", "ocw-badge", ((r = a.subject) == null ? void 0 : r.status) ?? ""), (i = a.subject) != null && i.status || (this.statusBadge.style.display = "none"), b.append(this.statusBadge), this.e2eBadge = n("span", "ocw-e2e", "🔒 E2E"), this.e2eBadge.style.display = "none", b.append(this.e2eBadge), this.connStatus = n("span", "ocw-conn-status"), this.connStatus.style.display = "none", b.append(this.connStatus), b.append(n("button", "ocw-menu", "⋯")), this.chips = n("div", "ocw-chiprow"), this.scroll = n("div", "ocw-scroll"), this.subjectCard = n("div", "ocw-subject"), this.typing = n("div", "ocw-typing");
307
+ const u = n("div", "ocw-typing-bubble");
308
+ u.append(n("div", "ocw-typing-dot"), n("div", "ocw-typing-dot"), n("div", "ocw-typing-dot")), this.typing.append(u), this.quick = n("div", "ocw-quick");
309
+ for (const w of a.quickReplies ?? []) {
310
+ const S = n("button", void 0, w);
311
+ S.addEventListener("click", () => {
312
312
  this.h.onSend(w), this.quick.style.display = "none";
313
- }), this.quick.append(I);
313
+ }), this.quick.append(S);
314
314
  }
315
- this.formHost = n("div", "ocw-form-host"), this.csatPanel = n("div", "ocw-csat"), this.csatPanel.style.display = "none", this.awayNotice = n("div", "ocw-away"), this.awayNotice.style.display = "none", this.preChatPanel = n("div", "ocw-prechat"), this.preChatPanel.style.display = "none", this.deflectPanel = n("div", "ocw-deflect"), this.deflectPanel.style.display = "none", this.input = n("textarea", void 0), this.input.rows = 1, this.input.placeholder = ((f = c.i18n) == null ? void 0 : f.placeholder) ?? "Message…";
316
- const a = n("button", "ocw-sendbtn");
317
- a.type = "button";
318
- const j = (m = c.i18n) == null ? void 0 : m.send;
319
- j ? (a.textContent = j, a.classList.add("ocw-sendbtn-label"), a.setAttribute("aria-label", j)) : (a.innerHTML = Ve, a.setAttribute("aria-label", "Send message")), a.disabled = !0, this.sendBtn = a, a.addEventListener("click", () => this.flushSend()), this.input.addEventListener("input", () => {
320
- var w, I;
321
- this.sendBtn.disabled = this.input.value.trim().length === 0, this.autoGrowInput(), this.storeRef && !this.storeRef.messages().some((N) => N.senderRole === "guest") ? (I = (w = this.h).onDeflectQuery) == null || I.call(w, this.input.value) : this.hideDeflection();
315
+ this.formHost = n("div", "ocw-form-host"), this.csatPanel = n("div", "ocw-csat"), this.csatPanel.style.display = "none", this.awayNotice = n("div", "ocw-away"), this.awayNotice.style.display = "none", this.preChatPanel = n("div", "ocw-prechat"), this.preChatPanel.style.display = "none", this.deflectPanel = n("div", "ocw-deflect"), this.deflectPanel.style.display = "none", this.input = n("textarea", void 0), this.input.rows = 1, this.input.placeholder = ((h = a.i18n) == null ? void 0 : h.placeholder) ?? "Message…";
316
+ const d = n("button", "ocw-sendbtn");
317
+ d.type = "button";
318
+ const I = (m = a.i18n) == null ? void 0 : m.send;
319
+ I ? (d.textContent = I, d.classList.add("ocw-sendbtn-label"), d.setAttribute("aria-label", I)) : (d.innerHTML = Ye, d.setAttribute("aria-label", "Send message")), d.disabled = !0, this.sendBtn = d, d.addEventListener("click", () => this.flushSend()), this.input.addEventListener("input", () => {
320
+ var w, S;
321
+ this.sendBtn.disabled = this.input.value.trim().length === 0, this.autoGrowInput(), this.storeRef && !this.storeRef.messages().some((z) => z.senderRole === "guest") ? (S = (w = this.h).onDeflectQuery) == null || S.call(w, this.input.value) : this.hideDeflection();
322
322
  }), this.input.addEventListener("keydown", (w) => {
323
323
  w.isComposing || w.keyCode === 229 || (w.key === "Enter" && !w.shiftKey ? (w.preventDefault(), this.flushSend()) : this.signalTyping());
324
324
  });
325
- const R = n("button", "ocw-attach", "📎");
326
- R.title = "Attach image or file";
327
- const E = document.createElement("input");
328
- E.type = "file", E.accept = "image/*,.pdf,.txt,.doc,.docx", E.style.display = "none", R.addEventListener("click", () => E.click()), E.addEventListener("change", () => {
325
+ const T = n("button", "ocw-attach", "📎");
326
+ T.title = "Attach image or file";
327
+ const L = document.createElement("input");
328
+ L.type = "file", L.accept = "image/*,.pdf,.txt,.doc,.docx", L.style.display = "none", T.addEventListener("click", () => L.click()), L.addEventListener("change", () => {
329
329
  var w;
330
- (w = E.files) != null && w[0] && this.h.onAttach && this.h.onAttach(E.files[0]), E.value = "";
330
+ (w = L.files) != null && w[0] && this.h.onAttach && this.h.onAttach(L.files[0]), L.value = "";
331
331
  });
332
- const A = n("div", "ocw-input");
333
- A.append(R, E, this.input, a);
334
- const P = n("div", "ocw-footer");
335
- ((k = c.i18n) == null ? void 0 : k.poweredBy) !== void 0 ? P.textContent = c.i18n.poweredBy : P.innerHTML = 'Powered by <a href="https://relay.paramms.com" target="_blank" rel="noopener">Relay</a>', this.footer = P, this.reopenBtn = n("button", "ocw-reopen", ((S = this.cfg.i18n) == null ? void 0 : S.reopen) ?? "Reopen conversation"), this.reopenBtn.type = "button", this.reopenBtn.addEventListener("click", () => {
332
+ const B = n("div", "ocw-input");
333
+ B.append(T, L, this.input, d);
334
+ const M = n("div", "ocw-footer");
335
+ ((v = a.i18n) == null ? void 0 : v.poweredBy) !== void 0 ? M.textContent = a.i18n.poweredBy : M.innerHTML = 'Powered by <a href="https://relay.paramms.com" target="_blank" rel="noopener">Relay</a>', this.footer = M, this.reopenBtn = n("button", "ocw-reopen", ((k = this.cfg.i18n) == null ? void 0 : k.reopen) ?? "Reopen conversation"), this.reopenBtn.type = "button", this.reopenBtn.addEventListener("click", () => {
336
336
  this.reopenBtn.style.display = "none";
337
337
  const w = this.root.querySelector(".ocw-input textarea");
338
338
  w == null || w.focus();
339
- }), e.append(b, this.chips, this.scroll, this.typing, this.quick, this.formHost, this.csatPanel, this.preChatPanel, this.deflectPanel, this.awayNotice, A, this.reopenBtn, this.footer);
340
- const B = (w) => {
341
- e.classList.toggle("ocw-compact", w > 0 && w < Ke);
339
+ }), e.append(b, this.chips, this.scroll, this.typing, this.quick, this.formHost, this.csatPanel, this.preChatPanel, this.deflectPanel, this.awayNotice, B, this.reopenBtn, this.footer);
340
+ const A = (w) => {
341
+ e.classList.toggle("ocw-compact", w > 0 && w < Ve);
342
342
  };
343
- B(e.clientWidth), typeof ResizeObserver < "u" && (this.compactObserver = new ResizeObserver((w) => {
344
- var N;
345
- const I = ((N = w[0]) == null ? void 0 : N.contentRect.width) ?? e.clientWidth;
346
- B(I);
343
+ A(e.clientWidth), typeof ResizeObserver < "u" && (this.compactObserver = new ResizeObserver((w) => {
344
+ var z;
345
+ const S = ((z = w[0]) == null ? void 0 : z.contentRect.width) ?? e.clientWidth;
346
+ A(S);
347
347
  }), this.compactObserver.observe(e));
348
348
  }
349
349
  /** Returns the scroll container so history.ts can attach scroll listeners. */
@@ -352,13 +352,13 @@ class Ze {
352
352
  }
353
353
  /** Registers a cleanup fn removed on destroy() to prevent listener leaks. */
354
354
  setScrollCleanup(e) {
355
- var d;
356
- (d = this.scrollCleanup) == null || d.call(this), this.scrollCleanup = e;
355
+ var l;
356
+ (l = this.scrollCleanup) == null || l.call(this), this.scrollCleanup = e;
357
357
  }
358
358
  /** Call when the widget is unmounted. Disconnects scroll listeners and clears timers. */
359
359
  destroy() {
360
- var e, d;
361
- (e = this.scrollCleanup) == null || e.call(this), this.scrollCleanup = null, this.typingTimer && (clearTimeout(this.typingTimer), this.typingTimer = null), (d = this.compactObserver) == null || d.disconnect(), this.compactObserver = null;
360
+ var e, l;
361
+ (e = this.scrollCleanup) == null || e.call(this), this.scrollCleanup = null, this.typingTimer && (clearTimeout(this.typingTimer), this.typingTimer = null), (l = this.compactObserver) == null || l.disconnect(), this.compactObserver = null;
362
362
  }
363
363
  flushSend() {
364
364
  this.hideDeflection();
@@ -382,110 +382,110 @@ class Ze {
382
382
  this.cfg.i18n = { ...this.cfg.i18n ?? {}, aiAssistant: e };
383
383
  }
384
384
  render(e) {
385
- var E, A, P, B, z, O, T, _;
385
+ var L, B, M, A, P, O, j, _;
386
386
  if (this.storeRef = e, e.accent && (this.root.style.setProperty("--ocw-accent", e.accent), this.root.style.setProperty("--ocw-accent2", this.cfgAccent2 ?? e.accent)), this.e2eBadge.style.display = e.e2e ? "inline-flex" : "none", this.buildSubjectCard(e), e.subject) {
387
- const r = (E = this.cfg.subject) == null ? void 0 : E.ownerLabel;
388
- r && (this.headerName.textContent = r);
387
+ const E = (L = this.cfg.subject) == null ? void 0 : L.ownerLabel;
388
+ E && (this.headerName.textContent = E);
389
389
  }
390
390
  this.quick.style.display = e.messages().length === 0 ? "flex" : "none", this.chips.replaceChildren();
391
- const d = e.visibleActions();
392
- this.chips.style.display = d.length ? "flex" : "none";
393
- for (const r of d) this.chips.append(this.chipEl(r));
394
- const s = this.scroll.scrollHeight, c = this.scroll.scrollTop;
391
+ const l = e.visibleActions();
392
+ this.chips.style.display = l.length ? "flex" : "none";
393
+ for (const E of l) this.chips.append(this.chipEl(E));
394
+ const c = this.scroll.scrollHeight, a = this.scroll.scrollTop;
395
395
  if (this.scroll.replaceChildren(), this.subjectCard.childNodes.length && this.scroll.append(this.subjectCard), e.hasMoreHistory) {
396
- const r = n("div", "ocw-load-more");
397
- r.textContent = "↑ Loading earlier messages…", r.style.pointerEvents = "none", this.scroll.append(r);
396
+ const E = n("div", "ocw-load-more");
397
+ E.textContent = "↑ Loading earlier messages…", E.style.pointerEvents = "none", this.scroll.append(E);
398
398
  }
399
- let h = 0, b = null;
399
+ let f = 0, b = null;
400
400
  const y = [...e.messages()];
401
- for (let r = 0; r < y.length; r++) {
402
- const i = y[r], v = i.senderRole !== "system" && i.senderId !== this.me && !i.internal && i.senderId !== b;
403
- this.scroll.append(this.messageEl(i, e, v, r === y.length - 1)), i.senderRole !== "system" && (b = i.senderId), i.senderId !== this.me && i.seq > h && (h = i.seq);
401
+ for (let E = 0; E < y.length; E++) {
402
+ const r = y[E], i = r.senderRole !== "system" && r.senderId !== this.me && !r.internal && r.senderId !== b;
403
+ this.scroll.append(this.messageEl(r, e, i, E === y.length - 1)), r.senderRole !== "system" && (b = r.senderId), r.senderId !== this.me && r.seq > f && (f = r.seq);
404
404
  }
405
- c > 20 ? this.scroll.scrollTop = this.scroll.scrollHeight - s + c : this.scroll.scrollTop = this.scroll.scrollHeight, h > 0 && this.h.onReadUpTo(h);
406
- const l = [...e.typing];
407
- this.typing.classList.toggle("active", l.length > 0);
408
- const u = this.typing.querySelector(".ocw-typing-bubble");
409
- u && u.setAttribute("aria-label", l.length ? "typing" : ""), this.footer.style.display = e.whiteLabel ? "none" : "block";
410
- const x = e.messages().some((r) => r.senderRole === "guest");
411
- if (!!((A = e.preChat) != null && A.enabled) && !this.preChatDone && !x && (e.preChat.showWhen !== "offline" || e.offline))
412
- this.preChatBuilt || this.buildPreChatPanel(e.preChat), this.preChatPanel.style.display = "block", this.awayNotice.style.display = "none", (P = this.root.querySelector(".ocw-input")) == null || P.style.setProperty("display", "none");
405
+ a > 20 ? this.scroll.scrollTop = this.scroll.scrollHeight - c + a : this.scroll.scrollTop = this.scroll.scrollHeight, f > 0 && this.h.onReadUpTo(f);
406
+ const s = [...e.typing];
407
+ this.typing.classList.toggle("active", s.length > 0);
408
+ const x = this.typing.querySelector(".ocw-typing-bubble");
409
+ x && x.setAttribute("aria-label", s.length ? "typing" : ""), this.footer.style.display = e.whiteLabel ? "none" : "block";
410
+ const u = e.messages().some((E) => E.senderRole === "guest");
411
+ if (!!((B = e.preChat) != null && B.enabled) && !this.preChatDone && !u && (e.preChat.showWhen !== "offline" || e.offline))
412
+ this.preChatBuilt || this.buildPreChatPanel(e.preChat), this.preChatPanel.style.display = "block", this.awayNotice.style.display = "none", (M = this.root.querySelector(".ocw-input")) == null || M.style.setProperty("display", "none");
413
413
  else {
414
414
  if (this.preChatPanel.style.display = "none", e.offline) {
415
415
  this.awayNotice.firstChild || this.awayNotice.append(n("span", "ocw-away-icon", "🌙"), n("span", "", ""));
416
- const r = this.awayNotice.lastChild;
417
- r.textContent = e.offlineMessage || ((B = this.cfg.i18n) == null ? void 0 : B.offline) || "We're away right now — send your message and we'll reply as soon as we're back.", this.awayNotice.style.display = "flex";
416
+ const E = this.awayNotice.lastChild;
417
+ E.textContent = e.offlineMessage || ((A = this.cfg.i18n) == null ? void 0 : A.offline) || "We're away right now — send your message and we'll reply as soon as we're back.", this.awayNotice.style.display = "flex";
418
418
  } else
419
419
  this.awayNotice.style.display = "none";
420
- (z = this.root.querySelector(".ocw-input")) == null || z.style.removeProperty("display");
420
+ (P = this.root.querySelector(".ocw-input")) == null || P.style.removeProperty("display");
421
421
  }
422
- const j = ["resolved", "closed", "sold", "issued", "checked_out"];
423
- this.h.onCsat && !this.csatSubmitted && j.includes(e.state) && e.messages().length > 0 && (this.csatPanel.style.display === "none" && this.buildCsatPanel(), this.csatPanel.style.display = "block");
424
- const R = j.includes(e.state);
425
- if (e.offline ? (this.headStatus.textContent = `● ${e.offlineMessage || ((O = this.cfg.i18n) == null ? void 0 : O.away) || "Away"}`, this.headStatus.className = "ocw-head-status away", this.headStatus.style.display = "") : e.conversationId ? (this.headStatus.textContent = `● ${((T = this.cfg.i18n) == null ? void 0 : T.online) ?? "Online"}`, this.headStatus.className = "ocw-head-status online", this.headStatus.style.display = "") : this.headStatus.style.display = "none", R && e.messages().length > 0) {
426
- const r = n("div", "ocw-resolved-note", `— ${((_ = this.cfg.i18n) == null ? void 0 : _.resolved) ?? "Marked as resolved"} —`);
427
- this.scroll.append(r), this.reopenBtn.style.display = "block";
422
+ const I = ["resolved", "closed", "sold", "issued", "checked_out"];
423
+ this.h.onCsat && !this.csatSubmitted && I.includes(e.state) && e.messages().length > 0 && (this.csatPanel.style.display === "none" && this.buildCsatPanel(), this.csatPanel.style.display = "block");
424
+ const T = I.includes(e.state);
425
+ if (e.offline ? (this.headStatus.textContent = `● ${e.offlineMessage || ((O = this.cfg.i18n) == null ? void 0 : O.away) || "Away"}`, this.headStatus.className = "ocw-head-status away", this.headStatus.style.display = "") : e.conversationId ? (this.headStatus.textContent = `● ${((j = this.cfg.i18n) == null ? void 0 : j.online) ?? "Online"}`, this.headStatus.className = "ocw-head-status online", this.headStatus.style.display = "") : this.headStatus.style.display = "none", T && e.messages().length > 0) {
426
+ const E = n("div", "ocw-resolved-note", `— ${((_ = this.cfg.i18n) == null ? void 0 : _.resolved) ?? "Marked as resolved"} —`);
427
+ this.scroll.append(E), this.reopenBtn.style.display = "block";
428
428
  } else
429
429
  this.reopenBtn.style.display = "none";
430
430
  }
431
- setConnStatus(e, d) {
431
+ setConnStatus(e, l) {
432
432
  if (e === "open") {
433
433
  this.connStatus.style.display = "none";
434
434
  return;
435
435
  }
436
436
  this.connStatus.style.display = "";
437
- const s = e === "error";
438
- this.connStatus.className = `ocw-conn-status${s ? " err" : e === "reconnecting" ? " warn" : ""}`, this.connStatus.textContent = s ? `⚠ ${d ?? "Chat unavailable"}` : e === "reconnecting" ? d ?? "↻ reconnecting…" : "● connecting…";
437
+ const c = e === "error";
438
+ this.connStatus.className = `ocw-conn-status${c ? " err" : e === "reconnecting" ? " warn" : ""}`, this.connStatus.textContent = c ? `⚠ ${l ?? "Chat unavailable"}` : e === "reconnecting" ? l ?? "↻ reconnecting…" : "● connecting…";
439
439
  }
440
440
  buildPreChatPanel(e) {
441
- var l;
441
+ var s;
442
442
  this.preChatBuilt = !0, this.preChatPanel.replaceChildren(), this.preChatPanel.append(n("div", "ocw-prechat-title", e.title ?? "Before we start…"));
443
- const d = n("div", "ocw-offline-form"), s = {};
444
- for (const u of e.fields ?? ["name", "email"]) {
445
- const x = n("input", "ocw-offline-input");
446
- x.type = u === "email" ? "email" : u === "phone" ? "tel" : "text", x.placeholder = u === "name" ? "Your name" : u === "email" ? "Your email" : "Your phone number", s[u] = x, d.append(x);
443
+ const l = n("div", "ocw-offline-form"), c = {};
444
+ for (const x of e.fields ?? ["name", "email"]) {
445
+ const u = n("input", "ocw-offline-input");
446
+ u.type = x === "email" ? "email" : x === "phone" ? "tel" : "text", u.placeholder = x === "name" ? "Your name" : x === "email" ? "Your email" : "Your phone number", c[x] = u, l.append(u);
447
447
  }
448
- let c = null;
449
- if ((l = e.topics) != null && l.length) {
450
- c = n("select", void 0);
451
- const u = document.createElement("option");
452
- u.value = "", u.textContent = "What is this about?", c.append(u);
453
- for (const x of e.topics) {
454
- const a = document.createElement("option");
455
- a.value = x, a.textContent = x, c.append(a);
448
+ let a = null;
449
+ if ((s = e.topics) != null && s.length) {
450
+ a = n("select", void 0);
451
+ const x = document.createElement("option");
452
+ x.value = "", x.textContent = "What is this about?", a.append(x);
453
+ for (const u of e.topics) {
454
+ const d = document.createElement("option");
455
+ d.value = u, d.textContent = u, a.append(d);
456
456
  }
457
- d.append(c);
457
+ l.append(a);
458
458
  }
459
- let h = null, b = null;
459
+ let f = null, b = null;
460
460
  if (e.callbackOption) {
461
- const u = n("label", "ocw-prechat-cb");
462
- h = document.createElement("input"), h.type = "checkbox", u.append(h, document.createTextNode("📞 Request a call back")), d.append(u), s.phone || (b = n("input", "ocw-offline-input"), b.type = "tel", b.placeholder = "Phone number for the call", b.style.display = "none", h.addEventListener("change", () => b.style.setProperty("display", h.checked ? "block" : "none")), d.append(b));
461
+ const x = n("label", "ocw-prechat-cb");
462
+ f = document.createElement("input"), f.type = "checkbox", x.append(f, document.createTextNode("📞 Request a call back")), l.append(x), c.phone || (b = n("input", "ocw-offline-input"), b.type = "tel", b.placeholder = "Phone number for the call", b.style.display = "none", f.addEventListener("change", () => b.style.setProperty("display", f.checked ? "block" : "none")), l.append(b));
463
463
  }
464
464
  const y = n("button", "ocw-offline-submit", "Start chat");
465
465
  y.type = "button", y.addEventListener("click", () => {
466
- var j, R, E, A, P, B, z;
467
- const u = (j = s.email) == null ? void 0 : j.value.trim();
468
- if (s.email && (!u || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(u))) {
469
- s.email.focus();
466
+ var I, T, L, B, M, A, P;
467
+ const x = (I = c.email) == null ? void 0 : I.value.trim();
468
+ if (c.email && (!x || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(x))) {
469
+ c.email.focus();
470
470
  return;
471
471
  }
472
- const x = !!(h != null && h.checked), a = (((R = s.phone) == null ? void 0 : R.value) ?? (b == null ? void 0 : b.value) ?? "").trim();
473
- if (x && !a) {
474
- (E = s.phone ?? b) == null || E.focus();
472
+ const u = !!(f != null && f.checked), d = (((T = c.phone) == null ? void 0 : T.value) ?? (b == null ? void 0 : b.value) ?? "").trim();
473
+ if (u && !d) {
474
+ (L = c.phone ?? b) == null || L.focus();
475
475
  return;
476
476
  }
477
- if (c && ((A = e.topics) != null && A.length) && !c.value) {
478
- c.focus();
477
+ if (a && ((B = e.topics) != null && B.length) && !a.value) {
478
+ a.focus();
479
479
  return;
480
480
  }
481
- y.disabled = !0, this.completePreChat(), (z = (B = this.h).onPreChat) == null || z.call(B, {
482
- ...(P = s.name) != null && P.value.trim() ? { name: s.name.value.trim() } : {},
483
- ...u ? { email: u } : {},
484
- ...a ? { phone: a } : {},
485
- ...c != null && c.value ? { topic: c.value } : {},
486
- ...x ? { callback: !0 } : {}
481
+ y.disabled = !0, this.completePreChat(), (P = (A = this.h).onPreChat) == null || P.call(A, {
482
+ ...(M = c.name) != null && M.value.trim() ? { name: c.name.value.trim() } : {},
483
+ ...x ? { email: x } : {},
484
+ ...d ? { phone: d } : {},
485
+ ...a != null && a.value ? { topic: a.value } : {},
486
+ ...u ? { callback: !0 } : {}
487
487
  });
488
- }), d.append(y), this.preChatPanel.append(d);
488
+ }), l.append(y), this.preChatPanel.append(l);
489
489
  }
490
490
  /** Mark pre-chat complete (submitted now or in a previous session). */
491
491
  completePreChat() {
@@ -495,9 +495,9 @@ class Ze {
495
495
  showDeflection(e) {
496
496
  if (!e.length) return this.hideDeflection();
497
497
  this.deflectPanel.replaceChildren(), this.deflectPanel.append(n("div", "ocw-deflect-hint", "Instant answers — tap to expand"));
498
- for (const d of e.slice(0, 3)) {
499
- const s = n("button", "ocw-deflect-card");
500
- s.append(n("div", "ocw-deflect-q", d.title), n("div", "ocw-deflect-a", d.answer)), s.addEventListener("click", () => s.classList.toggle("open")), this.deflectPanel.append(s);
498
+ for (const l of e.slice(0, 3)) {
499
+ const c = n("button", "ocw-deflect-card");
500
+ c.append(n("div", "ocw-deflect-q", l.title), n("div", "ocw-deflect-a", l.answer)), c.addEventListener("click", () => c.classList.toggle("open")), this.deflectPanel.append(c);
501
501
  }
502
502
  this.deflectPanel.style.display = "flex";
503
503
  }
@@ -506,266 +506,277 @@ class Ze {
506
506
  }
507
507
  buildCsatPanel() {
508
508
  this.csatPanel.replaceChildren(), this.csatPanel.append(n("div", "ocw-csat-title", "How did we do?"));
509
- const e = n("div", "ocw-csat-stars"), d = [];
510
- for (let s = 1; s <= 5; s++) {
511
- const c = n("button", "ocw-csat-star", "★");
512
- c.dataset.score = String(s), c.addEventListener("mouseenter", () => d.forEach((h, b) => h.classList.toggle("lit", b < s))), c.addEventListener("mouseleave", () => d.forEach((h) => h.classList.remove("lit"))), c.addEventListener("click", () => {
513
- var h, b;
514
- this.csatSubmitted = !0, this.csatPanel.replaceChildren(n("div", "ocw-csat-done", `Thanks for your ${s}★ rating!`)), (b = (h = this.h).onCsat) == null || b.call(h, s);
515
- }), d.push(c), e.append(c);
509
+ const e = n("div", "ocw-csat-stars"), l = [];
510
+ for (let c = 1; c <= 5; c++) {
511
+ const a = n("button", "ocw-csat-star", "★");
512
+ a.dataset.score = String(c), a.addEventListener("mouseenter", () => l.forEach((f, b) => f.classList.toggle("lit", b < c))), a.addEventListener("mouseleave", () => l.forEach((f) => f.classList.remove("lit"))), a.addEventListener("click", () => {
513
+ var f, b;
514
+ this.csatSubmitted = !0, this.csatPanel.replaceChildren(n("div", "ocw-csat-done", `Thanks for your ${c}★ rating!`)), (b = (f = this.h).onCsat) == null || b.call(f, c);
515
+ }), l.push(a), e.append(a);
516
516
  }
517
517
  this.csatPanel.append(e);
518
518
  }
519
519
  buildSubjectCard(e) {
520
520
  if (this.subjectBuilt) return;
521
- const d = e.subject, s = this.cfg.subject, c = (d == null ? void 0 : d.title) ?? (s == null ? void 0 : s.title);
522
- if (!c) return;
523
- this.subjectBuilt = !0, this.subjectCard.replaceChildren(), this.subjectCard.append(n("div", "ocw-subject-title", c)), s != null && s.subtitle && this.subjectCard.append(n("div", "ocw-subject-sub", s.subtitle));
524
- const h = n("div", "ocw-tags");
525
- if (d) for (const [y, l] of Object.entries(d.fields)) h.append(n("span", "ocw-tag", `${y}: ${l}`));
526
- else for (const y of (s == null ? void 0 : s.tags) ?? []) h.append(n("span", "ocw-tag", y));
527
- h.childNodes.length && this.subjectCard.append(h);
528
- const b = (d == null ? void 0 : d.state) ?? (s == null ? void 0 : s.status);
521
+ const l = e.subject, c = this.cfg.subject, a = (l == null ? void 0 : l.title) ?? (c == null ? void 0 : c.title);
522
+ if (!a) return;
523
+ this.subjectBuilt = !0, this.subjectCard.replaceChildren(), this.subjectCard.append(n("div", "ocw-subject-title", a)), c != null && c.subtitle && this.subjectCard.append(n("div", "ocw-subject-sub", c.subtitle));
524
+ const f = n("div", "ocw-tags");
525
+ if (l) for (const [y, s] of Object.entries(l.fields)) f.append(n("span", "ocw-tag", `${y}: ${s}`));
526
+ else for (const y of (c == null ? void 0 : c.tags) ?? []) f.append(n("span", "ocw-tag", y));
527
+ f.childNodes.length && this.subjectCard.append(f);
528
+ const b = (l == null ? void 0 : l.state) ?? (c == null ? void 0 : c.status);
529
529
  b && (this.statusBadge.textContent = b, this.statusBadge.style.display = "inline-flex");
530
530
  }
531
531
  chipEl(e) {
532
- const d = n("button", "ocw-chip", e.icon ? `${e.icon} ${e.label}` : e.label);
533
- return d.dataset.actionId = e.id, d.addEventListener("click", async () => {
534
- var s;
535
- e.confirm && !await this.confirm(e.label) || ((s = e.input) != null && s.length ? this.openForm(e) : this.h.onInvoke(e.id));
536
- }), d;
532
+ const l = n("button", "ocw-chip", e.icon ? `${e.icon} ${e.label}` : e.label);
533
+ return l.dataset.actionId = e.id, l.addEventListener("click", async () => {
534
+ var c;
535
+ e.confirm && !await this.confirm(e.label) || ((c = e.input) != null && c.length ? this.openForm(e) : this.h.onInvoke(e.id));
536
+ }), l;
537
537
  }
538
538
  /** In-widget confirmation modal (replaces window.confirm). */
539
539
  confirm(e) {
540
- return new Promise((d) => {
541
- const s = n("div", "ocw-modal"), c = n("div", "ocw-modal-card");
542
- c.append(n("div", "ocw-modal-title", e)), c.append(n("div", "ocw-modal-body", `Confirm “${e}”?`));
543
- const h = n("div", "ocw-modal-actions"), b = n("button", "ocw-modal-cancel", "Cancel"), y = n("button", "ocw-modal-ok", "Confirm"), l = (u) => {
544
- s.remove(), d(u);
540
+ return new Promise((l) => {
541
+ const c = n("div", "ocw-modal"), a = n("div", "ocw-modal-card");
542
+ a.append(n("div", "ocw-modal-title", e)), a.append(n("div", "ocw-modal-body", `Confirm “${e}”?`));
543
+ const f = n("div", "ocw-modal-actions"), b = n("button", "ocw-modal-cancel", "Cancel"), y = n("button", "ocw-modal-ok", "Confirm"), s = (x) => {
544
+ c.remove(), l(x);
545
545
  };
546
- b.addEventListener("click", () => l(!1)), y.addEventListener("click", () => l(!0)), s.addEventListener("click", (u) => {
547
- u.target === s && l(!1);
548
- }), h.append(b, y), c.append(h), s.append(c), this.root.append(s), y.focus();
546
+ b.addEventListener("click", () => s(!1)), y.addEventListener("click", () => s(!0)), c.addEventListener("click", (x) => {
547
+ x.target === c && s(!1);
548
+ }), f.append(b, y), a.append(f), c.append(a), this.root.append(c), y.focus();
549
549
  });
550
550
  }
551
551
  /** Inline form for a form-effect action: typed inputs (date picker, number,
552
- * text) rendered above the composer — no browser prompts. */
553
- openForm(e) {
554
- var y, l;
552
+ * text) rendered above the composer — no browser prompts. `prefill` seeds
553
+ * field values (search pre-fill) — deterministic parse, correctable before
554
+ * submit. */
555
+ openForm(e, l) {
556
+ var s, x;
555
557
  this.formHost.replaceChildren();
556
- const d = n("div", "ocw-form");
557
- d.append(n("div", "ocw-form-title", e.icon ? `${e.icon} ${e.label}` : e.label));
558
- const s = /* @__PURE__ */ new Map();
558
+ const c = n("div", "ocw-form");
559
+ c.append(n("div", "ocw-form-title", e.icon ? `${e.icon} ${e.label}` : e.label));
560
+ const a = /* @__PURE__ */ new Map();
559
561
  for (const u of e.input ?? []) {
560
- const x = n("label", "ocw-form-row");
561
- if (x.append(n("span", "ocw-form-lbl", u.label)), u.type === "select" && ((y = u.options) != null && y.length)) {
562
- const a = n("select", "ocw-form-input");
563
- u.required || a.append(n("option", void 0, "— select —"));
564
- for (const j of u.options) {
565
- const R = n("option");
566
- R.value = j, R.textContent = j, a.append(R);
562
+ const d = l == null ? void 0 : l[u.name], I = n("label", "ocw-form-row");
563
+ if (I.append(n("span", "ocw-form-lbl", u.label)), u.type === "select" && ((s = u.options) != null && s.length)) {
564
+ const T = n("select", "ocw-form-input");
565
+ u.required || T.append(n("option", void 0, "— select —"));
566
+ for (const L of u.options) {
567
+ const B = n("option");
568
+ B.value = L, B.textContent = L, T.append(B);
567
569
  }
568
- u.required && (a.required = !0), x.append(a), s.set(u.name, a);
570
+ u.required && (T.required = !0), d != null && u.options.includes(d) && (T.value = d), I.append(T), a.set(u.name, T);
569
571
  } else {
570
- const a = n("input", "ocw-form-input");
571
- a.type = u.type === "number" ? "number" : u.type === "date" ? "datetime-local" : "text", u.required && (a.required = !0), x.append(a), s.set(u.name, a);
572
+ const T = n("input", "ocw-form-input");
573
+ T.type = u.type === "number" ? "number" : u.type === "date" ? "datetime-local" : "text", u.required && (T.required = !0), d != null && d !== "" && (T.value = d), I.append(T), a.set(u.name, T);
572
574
  }
573
- d.append(x);
575
+ c.append(I);
574
576
  }
575
- const c = n("div", "ocw-form-actions"), h = n("button", "ocw-form-cancel", "Cancel"), b = n("button", "ocw-form-submit", "Send");
576
- h.addEventListener("click", () => this.formHost.replaceChildren()), b.addEventListener("click", () => {
577
+ const f = n("div", "ocw-form-actions"), b = n("button", "ocw-form-cancel", "Cancel"), y = n("button", "ocw-form-submit", "Send");
578
+ b.addEventListener("click", () => this.formHost.replaceChildren()), y.addEventListener("click", () => {
577
579
  const u = {};
578
- for (const [x, a] of s) {
579
- if (a.required && !a.value) {
580
- a.style.borderColor = "#e5484d";
580
+ for (const [d, I] of a) {
581
+ if (I.required && !I.value) {
582
+ I.style.borderColor = "#e5484d";
581
583
  return;
582
584
  }
583
- u[x] = a.type === "number" ? Number(a.value) : a.value;
585
+ u[d] = I.type === "number" ? Number(I.value) : I.value;
584
586
  }
585
587
  this.formHost.replaceChildren(), this.h.onInvoke(e.id, u);
586
- }), c.append(h, b), d.append(c), this.formHost.append(d), (l = s.values().next().value) == null || l.focus();
588
+ }), f.append(b, y), c.append(f), this.formHost.append(c), (x = a.values().next().value) == null || x.focus();
587
589
  }
588
- messageEl(e, d, s = !1, c = !1) {
589
- var R, E, A, P, B, z, O, T, _;
590
+ messageEl(e, l, c = !1, a = !1) {
591
+ var T, L, B, M, A, P, O, j, _, E;
590
592
  if (e.senderRole === "system") {
591
593
  const r = n("div", "ocw-sys");
592
- return r.textContent = e.deletedAt ? "message deleted" : re(e.content), r;
594
+ return r.textContent = e.deletedAt ? "message deleted" : se(e.content), r;
593
595
  }
594
- const h = e.senderId === this.me, b = !!e.internal, y = n("div", `ocw-row ${b ? "ocw-note mine" : h ? "mine" : "theirs"} ${e.senderRole === "bot" ? "ocw-bot" : ""}`), l = n("div");
595
- if (s) {
596
- const r = e.senderRole === "bot" ? ((R = this.cfg.i18n) == null ? void 0 : R.aiAssistant) ?? "AI Assistant" : ((E = this.cfg.subject) == null ? void 0 : E.ownerLabel) ?? ((A = this.cfg.subject) == null ? void 0 : A.title) ?? "Support";
597
- l.append(n("div", "ocw-msg-sender", r));
596
+ const f = e.senderId === this.me, b = !!e.internal, y = n("div", `ocw-row ${b ? "ocw-note mine" : f ? "mine" : "theirs"} ${e.senderRole === "bot" ? "ocw-bot" : ""}`), s = n("div");
597
+ if (c) {
598
+ const r = e.senderRole === "bot" ? ((T = this.cfg.i18n) == null ? void 0 : T.aiAssistant) ?? "AI Assistant" : ((L = this.cfg.subject) == null ? void 0 : L.ownerLabel) ?? ((B = this.cfg.subject) == null ? void 0 : B.title) ?? "Support";
599
+ s.append(n("div", "ocw-msg-sender", r));
598
600
  }
599
- const u = n("div", "ocw-bubble-wrap");
601
+ const x = n("div", "ocw-bubble-wrap");
600
602
  if (e.replyToId) {
601
603
  const r = n("div", "ocw-reply-to", "↩ replying to a message");
602
- r.style.cssText = "font-size:11px;color:var(--ocw-mut);margin-bottom:2px;font-style:italic", l.append(r);
604
+ r.style.cssText = "font-size:11px;color:var(--ocw-mut);margin-bottom:2px;font-style:italic", s.append(r);
603
605
  }
604
- const x = n("div", "ocw-bubble");
605
- let a = null;
606
- if (e.deletedAt) x.append(n("span", "ocw-deleted", "message deleted"));
606
+ const u = n("div", "ocw-bubble");
607
+ let d = null;
608
+ if (e.deletedAt) u.append(n("span", "ocw-deleted", "message deleted"));
607
609
  else if (e.content.kind === "attachment") {
608
610
  const r = e.content;
609
- if ((P = r.mime) != null && P.startsWith("image/")) {
611
+ if ((M = r.mime) != null && M.startsWith("image/")) {
610
612
  const i = document.createElement("img");
611
- i.src = r.url, i.alt = r.name ?? "image", i.style.cssText = "max-width:220px;max-height:160px;border-radius:10px;display:block;cursor:pointer", i.addEventListener("click", () => window.open(r.url, "_blank")), x.append(i);
612
- } else if ((B = r.mime) != null && B.startsWith("video/")) {
613
+ i.src = r.url, i.alt = r.name ?? "image", i.style.cssText = "max-width:220px;max-height:160px;border-radius:10px;display:block;cursor:pointer", i.addEventListener("click", () => window.open(r.url, "_blank")), u.append(i);
614
+ } else if ((A = r.mime) != null && A.startsWith("video/")) {
613
615
  const i = document.createElement("video");
614
- i.src = r.url, i.controls = !0, i.style.cssText = "max-width:240px;max-height:180px;border-radius:10px;display:block", x.append(i);
616
+ i.src = r.url, i.controls = !0, i.style.cssText = "max-width:240px;max-height:180px;border-radius:10px;display:block", u.append(i);
615
617
  } else {
616
618
  const i = document.createElement("a");
617
- i.href = r.url, i.target = "_blank", i.rel = "noopener", i.style.cssText = "display:flex;align-items:center;gap:8px;color:inherit;text-decoration:none", i.append(n("span", void 0, "📄"), n("span", void 0, r.name ?? "file")), x.append(i);
619
+ i.href = r.url, i.target = "_blank", i.rel = "noopener", i.style.cssText = "display:flex;align-items:center;gap:8px;color:inherit;text-decoration:none", i.append(n("span", void 0, "📄"), n("span", void 0, r.name ?? "file")), u.append(i);
618
620
  }
619
621
  } else if (e.content.kind === "appointment") {
620
622
  const r = e.content, i = n("div", "ocw-appt");
621
623
  i.append(n("div", "ocw-appt-title", `📅 ${r.title}`)), i.append(n("div", "ocw-appt-time", new Date(r.startIso).toLocaleString() + " – " + new Date(r.endIso).toLocaleTimeString())), r.location && i.append(n("div", "ocw-appt-loc", `📍 ${r.location}`)), r.description && i.append(n("div", "ocw-appt-desc", r.description));
622
- const v = n("div", "ocw-appt-links"), f = document.createElement("a");
623
- f.href = r.googleUrl, f.target = "_blank", f.rel = "noopener", f.className = "ocw-appt-btn", f.textContent = "📅 Add to Google Calendar";
624
- const m = document.createElement("a");
625
- m.href = r.icalUrl, m.download = `${r.title}.ics`, m.className = "ocw-appt-btn ocw-appt-btn-sec", m.textContent = "🍎 Apple / iCal", v.append(f, m), i.append(v), x.append(i);
624
+ const h = n("div", "ocw-appt-links"), m = document.createElement("a");
625
+ m.href = r.googleUrl, m.target = "_blank", m.rel = "noopener", m.className = "ocw-appt-btn", m.textContent = "📅 Add to Google Calendar";
626
+ const v = document.createElement("a");
627
+ v.href = r.icalUrl, v.download = `${r.title}.ics`, v.className = "ocw-appt-btn ocw-appt-btn-sec", v.textContent = "🍎 Apple / iCal", h.append(m, v), i.append(h), u.append(i);
626
628
  } else
627
- a = Qe(x, re(e.content)), e.editedAt && x.append(n("span", "ocw-edited", "(edited)"));
628
- if (u.append(x), c && !e.deletedAt && e.content.kind === "text" && ((z = e.content.quickReplies) != null && z.length)) {
629
+ d = Je(u, se(e.content)), e.editedAt && u.append(n("span", "ocw-edited", "(edited)"));
630
+ if (x.append(u), a && !e.deletedAt && e.content.kind === "text" && ((P = e.content.quickReplies) != null && P.length)) {
629
631
  const r = n("div", "ocw-flow-choices");
630
632
  r.style.cssText = "display:flex;flex-wrap:wrap;gap:6px;margin-top:6px";
631
633
  for (const i of e.content.quickReplies) {
632
- const v = n("button", "ocw-flow-choice", i);
633
- v.type = "button", v.style.cssText = "border:1px solid var(--ocw-bd,rgba(0,0,0,.12));background:var(--ocw-bg,#fff);color:inherit;border-radius:14px;padding:5px 12px;font:inherit;font-size:13px;cursor:pointer", v.addEventListener("click", () => {
634
- r.querySelectorAll("button").forEach((f) => f.disabled = !0), r.style.opacity = "0.5", this.h.onSend(i);
635
- }), r.append(v);
634
+ const h = n("button", "ocw-flow-choice", i);
635
+ h.type = "button", h.style.cssText = "border:1px solid var(--ocw-bd,rgba(0,0,0,.12));background:var(--ocw-bg,#fff);color:inherit;border-radius:14px;padding:5px 12px;font:inherit;font-size:13px;cursor:pointer", h.addEventListener("click", () => {
636
+ r.querySelectorAll("button").forEach((m) => m.disabled = !0), r.style.opacity = "0.5", this.h.onSend(i);
637
+ }), r.append(h);
638
+ }
639
+ x.append(r);
640
+ }
641
+ if (a && !e.deletedAt && e.content.kind === "form") {
642
+ const r = e.content, i = l.actionById(r.actionId);
643
+ if ((O = i == null ? void 0 : i.input) != null && O.length) {
644
+ const h = n("button", "ocw-chip", i.icon ? `${i.icon} ${i.label}` : i.label);
645
+ h.type = "button", h.style.cssText = "margin-top:6px", h.addEventListener("click", async () => {
646
+ i.confirm && !await this.confirm(i.label) || this.openForm(i, r.prefill);
647
+ }), x.append(h);
636
648
  }
637
- u.append(r);
638
649
  }
639
- if (!h && !b && this.h.onTranslate && e.content.kind === "text" && !e.deletedAt && e.seq > 0 && a) {
650
+ if (!f && !b && this.h.onTranslate && e.content.kind === "text" && !e.deletedAt && e.seq > 0 && d) {
640
651
  const r = e.content.text;
641
652
  if (r.trim()) {
642
653
  const i = n("button", "ocw-translate-btn", "🌐");
643
654
  i.type = "button", i.title = "Translate";
644
- const v = n("div", "ocw-translation");
645
- v.style.display = "none", x.append(v);
646
- const f = (S) => {
647
- v.textContent = S, v.style.display = "", this.showingTranslation.add(e.id), i.textContent = "↩", i.title = "Show original";
648
- }, m = () => {
649
- v.style.display = "none", this.showingTranslation.delete(e.id), i.textContent = "🌐", i.title = "Translate";
655
+ const h = n("div", "ocw-translation");
656
+ h.style.display = "none", u.append(h);
657
+ const m = (w) => {
658
+ h.textContent = w, h.style.display = "", this.showingTranslation.add(e.id), i.textContent = "↩", i.title = "Show original";
659
+ }, v = () => {
660
+ h.style.display = "none", this.showingTranslation.delete(e.id), i.textContent = "🌐", i.title = "Translate";
650
661
  };
651
- i.addEventListener("click", (S) => {
652
- if (S.stopPropagation(), this.showingTranslation.has(e.id)) {
653
- m();
662
+ i.addEventListener("click", (w) => {
663
+ if (w.stopPropagation(), this.showingTranslation.has(e.id)) {
664
+ v();
654
665
  return;
655
666
  }
656
- const w = this.translationCache.get(e.id);
657
- if (w !== void 0) {
658
- f(w);
667
+ const S = this.translationCache.get(e.id);
668
+ if (S !== void 0) {
669
+ m(S);
659
670
  return;
660
671
  }
661
- i.textContent = "⏳", this.h.onTranslate(r).then((I) => {
662
- if (I === null) {
672
+ i.textContent = "⏳", this.h.onTranslate(r).then((z) => {
673
+ if (z === null) {
663
674
  i.textContent = "⚠️", i.title = "Translation unavailable", setTimeout(() => {
664
675
  i.textContent = "🌐", i.title = "Translate";
665
676
  }, 1500);
666
677
  return;
667
678
  }
668
- this.translationCache.set(e.id, I), f(I);
679
+ this.translationCache.set(e.id, z), m(z);
669
680
  });
670
- }), u.append(i);
681
+ }), x.append(i);
671
682
  const k = this.translationCache.get(e.id);
672
- this.showingTranslation.has(e.id) && k !== void 0 && f(k);
683
+ this.showingTranslation.has(e.id) && k !== void 0 && m(k);
673
684
  }
674
685
  }
675
- if (h && !e.deletedAt && e.seq > 0 && (this.h.onEdit ?? this.h.onDelete)) {
686
+ if (f && !e.deletedAt && e.seq > 0 && (this.h.onEdit ?? this.h.onDelete)) {
676
687
  const r = n("div", "ocw-msg-menu");
677
688
  if (this.h.onEdit) {
678
689
  const i = n("button", void 0, "✏️");
679
- i.title = "Edit", i.addEventListener("click", (v) => {
680
- v.stopPropagation();
681
- const f = re(e.content), m = document.createElement("textarea");
682
- m.value = f, m.rows = Math.min(4, Math.ceil(f.length / 40) + 1), m.style.cssText = "width:100%;resize:vertical;border:1px solid var(--ocw-accent);border-radius:8px;padding:6px 10px;font:inherit;font-size:14px;background:var(--ocw-card);color:#1c1b1a;box-sizing:border-box";
690
+ i.title = "Edit", i.addEventListener("click", (h) => {
691
+ h.stopPropagation();
692
+ const m = se(e.content), v = document.createElement("textarea");
693
+ v.value = m, v.rows = Math.min(4, Math.ceil(m.length / 40) + 1), v.style.cssText = "width:100%;resize:vertical;border:1px solid var(--ocw-accent);border-radius:8px;padding:6px 10px;font:inherit;font-size:14px;background:var(--ocw-card);color:#1c1b1a;box-sizing:border-box";
683
694
  const k = n("button", "ocw-form-submit", "Save");
684
695
  k.style.cssText = "margin-top:6px;padding:5px 14px;font-size:13px";
685
- const S = n("button", "ocw-form-cancel", "Cancel");
686
- S.style.cssText = "margin-top:6px;padding:5px 10px;font-size:13px";
687
- const w = n("div");
688
- w.style.cssText = "display:flex;gap:6px;justify-content:flex-end", w.append(S, k);
689
- const I = n("div");
690
- I.append(m, w), x.replaceChildren(I), m.focus(), m.select();
691
- const N = () => x.replaceChildren(a ?? document.createTextNode(f));
692
- S.addEventListener("click", N), k.addEventListener("click", () => {
693
- const D = m.value.trim();
694
- D && D !== f && this.h.onEdit(e.id, D), N();
695
- }), m.addEventListener("keydown", (D) => {
696
- D.key === "Enter" && !D.shiftKey && (D.preventDefault(), k.click()), D.key === "Escape" && N();
696
+ const w = n("button", "ocw-form-cancel", "Cancel");
697
+ w.style.cssText = "margin-top:6px;padding:5px 10px;font-size:13px";
698
+ const S = n("div");
699
+ S.style.cssText = "display:flex;gap:6px;justify-content:flex-end", S.append(w, k);
700
+ const z = n("div");
701
+ z.append(v, S), u.replaceChildren(z), v.focus(), v.select();
702
+ const U = () => u.replaceChildren(d ?? document.createTextNode(m));
703
+ w.addEventListener("click", U), k.addEventListener("click", () => {
704
+ const D = v.value.trim();
705
+ D && D !== m && this.h.onEdit(e.id, D), U();
706
+ }), v.addEventListener("keydown", (D) => {
707
+ D.key === "Enter" && !D.shiftKey && (D.preventDefault(), k.click()), D.key === "Escape" && U();
697
708
  });
698
709
  }), r.append(i);
699
710
  }
700
711
  if (this.h.onDelete) {
701
712
  const i = n("button", "del", "🗑");
702
- i.title = "Delete", i.addEventListener("click", (v) => {
703
- v.stopPropagation(), this.h.onDelete(e.id);
713
+ i.title = "Delete", i.addEventListener("click", (h) => {
714
+ h.stopPropagation(), this.h.onDelete(e.id);
704
715
  }), r.append(i);
705
716
  }
706
- u.append(r);
717
+ x.append(r);
707
718
  }
708
- if (l.append(u), e.senderRole === "bot" && !e.deletedAt && e.seq > 0 && e.content.kind === "text") {
719
+ if (s.append(x), e.senderRole === "bot" && !e.deletedAt && e.seq > 0 && e.content.kind === "text") {
709
720
  const r = e.content.citations;
710
721
  if (r != null && r.length) {
711
722
  const i = n("div", "ocw-cites");
712
- i.style.cssText = "margin-top:4px;font-size:11px;color:var(--ocw-mut,#667)", i.textContent = `${((O = this.cfg.i18n) == null ? void 0 : O.sources) ?? "Sources"}: ${r.map((v) => v.source).join(", ")}`, l.append(i);
723
+ i.style.cssText = "margin-top:4px;font-size:11px;color:var(--ocw-mut,#667)", i.textContent = `${((j = this.cfg.i18n) == null ? void 0 : j.sources) ?? "Sources"}: ${r.map((h) => h.source).join(", ")}`, s.append(i);
713
724
  }
714
725
  if (this.h.onReact) {
715
726
  const i = n("div", "ocw-bot-feedback");
716
727
  i.style.cssText = "display:flex;gap:6px;margin-top:4px";
717
- const v = (f, m) => {
718
- const k = n("button", "ocw-fb-btn", f);
719
- k.type = "button", k.title = m, k.style.cssText = "border:1px solid var(--ocw-bd,rgba(0,0,0,.12));background:transparent;border-radius:12px;padding:1px 8px;font-size:12px;cursor:pointer;opacity:.7";
720
- const S = () => {
721
- var w, I;
722
- return !!((I = (w = e.reactions) == null ? void 0 : w[f]) != null && I.includes(this.me));
728
+ const h = (m, v) => {
729
+ const k = n("button", "ocw-fb-btn", m);
730
+ k.type = "button", k.title = v, k.style.cssText = "border:1px solid var(--ocw-bd,rgba(0,0,0,.12));background:transparent;border-radius:12px;padding:1px 8px;font-size:12px;cursor:pointer;opacity:.7";
731
+ const w = () => {
732
+ var S, z;
733
+ return !!((z = (S = e.reactions) == null ? void 0 : S[m]) != null && z.includes(this.me));
723
734
  };
724
- return S() && (k.style.opacity = "1"), k.addEventListener("click", () => {
725
- var w, I;
726
- (I = (w = this.h).onReact) == null || I.call(w, e.id, f, S()), k.style.opacity = "1";
735
+ return w() && (k.style.opacity = "1"), k.addEventListener("click", () => {
736
+ var S, z;
737
+ (z = (S = this.h).onReact) == null || z.call(S, e.id, m, w()), k.style.opacity = "1";
727
738
  }), k;
728
739
  };
729
- i.append(v("👍", ((T = this.cfg.i18n) == null ? void 0 : T.helpful) ?? "Helpful"), v("👎", ((_ = this.cfg.i18n) == null ? void 0 : _.notHelpful) ?? "Not helpful")), l.append(i);
740
+ i.append(h("👍", ((_ = this.cfg.i18n) == null ? void 0 : _.helpful) ?? "Helpful"), h("👎", ((E = this.cfg.i18n) == null ? void 0 : E.notHelpful) ?? "Not helpful")), s.append(i);
730
741
  }
731
742
  }
732
743
  if (this.h.onReact && !e.deletedAt && e.seq > 0) {
733
744
  const r = n("div", "ocw-react-wrap"), i = n("div", "ocw-react");
734
745
  if (e.reactions && Object.keys(e.reactions).length)
735
- for (const [m, k] of Object.entries(e.reactions)) {
736
- const S = n("button", `ocw-react-pill${k.includes(this.me) ? " mine" : ""}`, `${m} ${k.length}`);
737
- S.addEventListener("click", () => {
738
- var w, I;
739
- return (I = (w = this.h).onReact) == null ? void 0 : I.call(w, e.id, m, k.includes(this.me));
740
- }), i.append(S);
746
+ for (const [v, k] of Object.entries(e.reactions)) {
747
+ const w = n("button", `ocw-react-pill${k.includes(this.me) ? " mine" : ""}`, `${v} ${k.length}`);
748
+ w.addEventListener("click", () => {
749
+ var S, z;
750
+ return (z = (S = this.h).onReact) == null ? void 0 : z.call(S, e.id, v, k.includes(this.me));
751
+ }), i.append(w);
741
752
  }
742
- const v = n("button", "ocw-react-btn", "+"), f = n("div", "ocw-react-picker");
743
- for (const m of Ge) {
744
- const k = n("button", void 0, m);
745
- k.addEventListener("click", (S) => {
746
- var I, N, D, X;
747
- S.stopPropagation();
748
- const w = (N = (I = e.reactions) == null ? void 0 : I[m]) == null ? void 0 : N.includes(this.me);
749
- (X = (D = this.h).onReact) == null || X.call(D, e.id, m, !!w), f.style.display = "none";
750
- }), f.append(k);
753
+ const h = n("button", "ocw-react-btn", "+"), m = n("div", "ocw-react-picker");
754
+ for (const v of Ke) {
755
+ const k = n("button", void 0, v);
756
+ k.addEventListener("click", (w) => {
757
+ var z, U, D, Q;
758
+ w.stopPropagation();
759
+ const S = (U = (z = e.reactions) == null ? void 0 : z[v]) == null ? void 0 : U.includes(this.me);
760
+ (Q = (D = this.h).onReact) == null || Q.call(D, e.id, v, !!S), m.style.display = "none";
761
+ }), m.append(k);
751
762
  }
752
- f.style.display = "none", v.addEventListener("click", (m) => {
753
- m.stopPropagation();
754
- const k = f.style.display === "none";
755
- f.style.display = k ? "flex" : "none", k && document.addEventListener("click", () => {
756
- f.style.display = "none";
763
+ m.style.display = "none", h.addEventListener("click", (v) => {
764
+ v.stopPropagation();
765
+ const k = m.style.display === "none";
766
+ m.style.display = k ? "flex" : "none", k && document.addEventListener("click", () => {
767
+ m.style.display = "none";
757
768
  }, { once: !0 });
758
- }), i.append(v), r.append(i, f), l.append(r);
759
- } else e.reactions && Object.keys(e.reactions).length && l.append(n("div", "ocw-react", Object.entries(e.reactions).map(([r, i]) => `${r}${i.length}`).join(" ")));
760
- const j = n("div", "ocw-time ocw-meta", Je(e.ts));
761
- if (h && e.status) {
762
- const r = n("span", `ocw-tick${e.status === "read" ? " read" : e.status === "delivered" ? " delivered" : ""}`, et(e.status));
763
- j.append(r);
769
+ }), i.append(h), r.append(i, m), s.append(r);
770
+ } else e.reactions && Object.keys(e.reactions).length && s.append(n("div", "ocw-react", Object.entries(e.reactions).map(([r, i]) => `${r}${i.length}`).join(" ")));
771
+ const I = n("div", "ocw-time ocw-meta", Ze(e.ts));
772
+ if (f && e.status) {
773
+ const r = n("span", `ocw-tick${e.status === "read" ? " read" : e.status === "delivered" ? " delivered" : ""}`, tt(e.status));
774
+ I.append(r);
764
775
  }
765
- return h && e.seq > 0 && d.lastReadByOthers >= e.seq && j.append(n("span", "ocw-seen", " · Seen")), l.append(j), y.append(l), y;
776
+ return f && e.seq > 0 && l.lastReadByOthers >= e.seq && I.append(n("span", "ocw-seen", " · Seen")), s.append(I), y.append(s), y;
766
777
  }
767
778
  }
768
- function et(t) {
779
+ function tt(t) {
769
780
  switch (t) {
770
781
  case "read":
771
782
  return "✓✓";
@@ -777,31 +788,31 @@ function et(t) {
777
788
  return "🕓";
778
789
  }
779
790
  }
780
- const F = /* @__PURE__ */ new WeakMap(), ne = /* @__PURE__ */ new Map();
781
- function Ie(t) {
791
+ const G = /* @__PURE__ */ new WeakMap(), oe = /* @__PURE__ */ new Map();
792
+ function Te(t) {
782
793
  return `relay-launcher::${t.profileId}::${t.subjectId ?? ""}`;
783
794
  }
784
- let Y = null;
785
- function tt() {
786
- if (Y && Y.state !== "closed") return Y;
795
+ let X = null;
796
+ function nt() {
797
+ if (X && X.state !== "closed") return X;
787
798
  try {
788
- return Y = new AudioContext(), Y;
799
+ return X = new AudioContext(), X;
789
800
  } catch {
790
801
  return null;
791
802
  }
792
803
  }
793
- function lt(t) {
804
+ function dt(t) {
794
805
  var e;
795
- (e = F.get(t)) == null || e.close(), F.delete(t);
806
+ (e = G.get(t)) == null || e.close(), G.delete(t);
796
807
  }
797
- function nt(t) {
808
+ function ot(t) {
798
809
  const e = t.el;
799
- let d = null, s = null, c = !1;
800
- const h = () => {
801
- d == null || d.close(), d = null, s == null || s.close(), s = null, e.innerHTML = "";
810
+ let l = null, c = null, a = !1;
811
+ const f = () => {
812
+ l == null || l.close(), l = null, c == null || c.close(), c = null, e.innerHTML = "";
802
813
  };
803
814
  function b() {
804
- c || (h(), s = Oe({
815
+ a || (f(), c = De({
805
816
  el: e,
806
817
  url: t.url,
807
818
  ...t.apiUrl ? { apiUrl: t.apiUrl } : {},
@@ -814,46 +825,46 @@ function nt(t) {
814
825
  ...t.webfont === !1 ? { webfont: !1 } : {},
815
826
  ...t.locale ? { locale: t.locale } : {},
816
827
  ...t.i18n ? { i18n: t.i18n } : {},
817
- onSelect: (l) => y(l)
828
+ onSelect: (s) => y(s)
818
829
  }));
819
830
  }
820
- function y(l) {
821
- if (c) return;
822
- h();
823
- const { subjectId: u, kind: x, peerId: a, ...j } = t;
824
- d = ot({
825
- ...j,
831
+ function y(s) {
832
+ if (a) return;
833
+ f();
834
+ const { subjectId: x, kind: u, peerId: d, ...I } = t;
835
+ l = it({
836
+ ...I,
826
837
  inbox: !1,
827
838
  launcher: !1,
828
839
  el: e,
829
- ...l.profileId ? { profileId: l.profileId } : {},
830
- ...l.subjectId ? { subjectId: l.subjectId } : {},
831
- ...l.kind === "direct" && l.peerId ? { kind: "direct", peerId: l.peerId } : {},
840
+ ...s.profileId ? { profileId: s.profileId } : {},
841
+ ...s.subjectId ? { subjectId: s.subjectId } : {},
842
+ ...s.kind === "direct" && s.peerId ? { kind: "direct", peerId: s.peerId } : {},
832
843
  onBack: b
833
844
  });
834
845
  }
835
846
  return b(), { close() {
836
- c = !0, h();
847
+ a = !0, f();
837
848
  } };
838
849
  }
839
- function ot(t) {
840
- var de, pe, ue, he, fe, we, be, xe;
841
- if (t.inbox) return nt(t);
842
- F.has(t.el) && (F.get(t.el).close(), F.delete(t.el)), t.launcher && ((de = ne.get(Ie(t))) == null || de.close());
850
+ function it(t) {
851
+ var pe, ue, he, fe, we, be, xe, me;
852
+ if (t.inbox) return ot(t);
853
+ G.has(t.el) && (G.get(t.el).close(), G.delete(t.el)), t.launcher && ((pe = oe.get(Te(t))) == null || pe.close());
843
854
  const e = Me();
844
- let d, s = !1;
845
- const c = t.token ?? t.userId ?? e, h = c !== e ? e : void 0, { wsUrl: b, httpBase: y } = Ae(t.url, t.apiUrl);
846
- let l = new He(c);
847
- const u = t.subjectId ? `${c}::${t.subjectId}` : c, x = new De(u);
848
- let a, j = !1, R = null, E = null, A = null, P = null;
855
+ let l, c = !1;
856
+ const a = t.token ?? t.userId ?? e, f = a !== e ? e : void 0, { wsUrl: b, httpBase: y } = Ae(t.url, t.apiUrl);
857
+ let s = new _e(a);
858
+ const x = t.subjectId ? `${a}::${t.subjectId}` : a, u = new He(x);
859
+ let d, I = !1, T = null, L = null, B = null, M = null;
849
860
  !t.launcher && !t.el.style.height && t.el.clientHeight === 0 && (t.el.style.width = t.el.style.width || "100%", t.el.style.height = "600px");
850
- for (const o of x.load()) l.addOptimistic(o.clientMsgId, o.content);
851
- let B = null, z = null, O = 0, T = !t.launcher;
861
+ for (const o of u.load()) s.addOptimistic(o.clientMsgId, o.content);
862
+ let A = null, P = null, O = 0, j = !t.launcher;
852
863
  if (t.launcher) {
853
864
  const p = (t.position ?? "bottom-right").includes("right");
854
- B = document.createElement("div"), B.style.cssText = `position:fixed;${p ? "right:20px" : "left:20px"};bottom:20px;z-index:9999;display:flex;flex-direction:column;align-items:${p ? "flex-end" : "flex-start"};gap:12px`;
855
- const g = document.createElement("div"), M = typeof window < "u" && typeof window.matchMedia == "function" ? window.matchMedia("(max-width: 479px)") : null, K = ($) => {
856
- t.el.classList.toggle("ocw-fs", $), g.style.cssText = $ ? [
865
+ A = document.createElement("div"), A.style.cssText = `position:fixed;${p ? "right:20px" : "left:20px"};bottom:20px;z-index:9999;display:flex;flex-direction:column;align-items:${p ? "flex-end" : "flex-start"};gap:12px`;
866
+ const g = document.createElement("div"), $ = typeof window < "u" && typeof window.matchMedia == "function" ? window.matchMedia("(max-width: 479px)") : null, W = (q) => {
867
+ t.el.classList.toggle("ocw-fs", q), g.style.cssText = q ? [
857
868
  "position:fixed",
858
869
  "inset:0",
859
870
  "width:100%",
@@ -882,10 +893,10 @@ function ot(t) {
882
893
  "transform:scale(.95)"
883
894
  ].join(";");
884
895
  };
885
- K((M == null ? void 0 : M.matches) ?? !1);
886
- const V = ($) => K($.matches);
887
- M == null || M.addEventListener("change", V), R = M, E = V, t.el.style.cssText = "width:100%;height:100%;overflow:hidden", g.append(t.el);
888
- const J = '<svg viewBox="0 0 24 24" width="26" height="26" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="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" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>', Z = '<svg viewBox="0 0 24 24" width="22" height="22" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/></svg>', H = document.createElement("button");
896
+ W(($ == null ? void 0 : $.matches) ?? !1);
897
+ const Y = (q) => W(q.matches);
898
+ $ == null || $.addEventListener("change", Y), T = $, L = Y, t.el.style.cssText = "width:100%;height:100%;overflow:hidden", g.append(t.el);
899
+ const Z = '<svg viewBox="0 0 24 24" width="26" height="26" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="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" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>', ee = '<svg viewBox="0 0 24 24" width="22" height="22" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M18 6 6 18M6 6l12 12" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/></svg>', H = document.createElement("button");
889
900
  H.type = "button", H.style.cssText = [
890
901
  "width:56px;height:56px;border-radius:50%",
891
902
  `background:${t.accent ?? "#6c5ce7"}`,
@@ -898,27 +909,27 @@ function ot(t) {
898
909
  H.style.transform = "scale(1.08)";
899
910
  }, H.onmouseleave = () => {
900
911
  H.style.transform = "scale(1)";
901
- }, z = document.createElement("span"), z.style.cssText = "position:absolute;top:-4px;right:-4px;background:#4c6fff;color:#fff;border-radius:50%;width:20px;height:20px;font-size:11px;font-weight:700;display:none;align-items:center;justify-content:center";
902
- const ee = () => {
903
- H.innerHTML = T ? Z : J, H.setAttribute("aria-label", T ? "Close chat" : "Open chat"), H.setAttribute("aria-expanded", String(T)), H.append(z);
912
+ }, P = document.createElement("span"), P.style.cssText = "position:absolute;top:-4px;right:-4px;background:#4c6fff;color:#fff;border-radius:50%;width:20px;height:20px;font-size:11px;font-weight:700;display:none;align-items:center;justify-content:center";
913
+ const te = () => {
914
+ H.innerHTML = j ? ee : Z, H.setAttribute("aria-label", j ? "Close chat" : "Open chat"), H.setAttribute("aria-expanded", String(j)), H.append(P);
904
915
  };
905
- ee(), B.append(g, H), document.body.append(B);
906
- const oe = `ocw-teaser-dismissed::${t.profileId}`, te = typeof t.launcherMessage == "string" ? { title: t.launcherMessage } : t.launcherMessage;
907
- let L = null;
908
- const Le = () => {
916
+ te(), A.append(g, H), document.body.append(A);
917
+ const ie = `ocw-teaser-dismissed::${t.profileId}`, ne = typeof t.launcherMessage == "string" ? { title: t.launcherMessage } : t.launcherMessage;
918
+ let R = null;
919
+ const je = () => {
909
920
  try {
910
- return sessionStorage.getItem(oe) === "1";
921
+ return sessionStorage.getItem(ie) === "1";
911
922
  } catch {
912
923
  return !1;
913
924
  }
914
- }, Pe = '<svg viewBox="0 0 24 24" width="15" height="15" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="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" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>', me = () => {
915
- const $ = te != null && te.title ? te : l.launcherMessage ?? void 0;
916
- if (!(!!($ != null && $.title) && !T && !Le())) {
917
- L && (L.remove(), L = null);
925
+ }, Pe = '<svg viewBox="0 0 24 24" width="15" height="15" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="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" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>', ge = () => {
926
+ const q = ne != null && ne.title ? ne : s.launcherMessage ?? void 0;
927
+ if (!(!!(q != null && q.title) && !j && !je())) {
928
+ R && (R.remove(), R = null);
918
929
  return;
919
930
  }
920
- if (L) return;
921
- L = document.createElement("div"), L.setAttribute("role", "button"), L.setAttribute("tabindex", "0"), L.setAttribute("aria-label", $.title), L.style.cssText = [
931
+ if (R) return;
932
+ R = document.createElement("div"), R.setAttribute("role", "button"), R.setAttribute("tabindex", "0"), R.setAttribute("aria-label", q.title), R.style.cssText = [
922
933
  "max-width:280px",
923
934
  "background:#fff",
924
935
  "border-radius:16px",
@@ -930,61 +941,61 @@ function ot(t) {
930
941
  `align-self:${p ? "flex-end" : "flex-start"}`,
931
942
  "animation:ocw-teaser-in .22s ease-out"
932
943
  ].join(";");
933
- const ae = document.createElement("div");
934
- if (ae.textContent = $.title, ae.style.cssText = "font-size:15px;font-weight:600;color:#111;line-height:1.35", L.append(ae), $.subtitle) {
935
- const U = document.createElement("div");
936
- U.style.cssText = "display:flex;align-items:center;gap:6px;margin-top:6px;font-size:13px;color:#6b7280";
937
- const ce = document.createElement("span");
938
- ce.innerHTML = Pe, ce.style.cssText = `color:${t.accent ?? "#6c5ce7"};display:inline-flex`;
939
- const ye = document.createElement("span");
940
- ye.textContent = $.subtitle, U.append(ce, ye), L.append(U);
944
+ const ce = document.createElement("div");
945
+ if (ce.textContent = q.title, ce.style.cssText = "font-size:15px;font-weight:600;color:#111;line-height:1.35", R.append(ce), q.subtitle) {
946
+ const F = document.createElement("div");
947
+ F.style.cssText = "display:flex;align-items:center;gap:6px;margin-top:6px;font-size:13px;color:#6b7280";
948
+ const re = document.createElement("span");
949
+ re.innerHTML = Pe, re.style.cssText = `color:${t.accent ?? "#6c5ce7"};display:inline-flex`;
950
+ const ve = document.createElement("span");
951
+ ve.textContent = q.subtitle, F.append(re, ve), R.append(F);
941
952
  }
942
- const W = document.createElement("button");
943
- W.type = "button", W.setAttribute("aria-label", "Dismiss"), W.innerHTML = '<svg viewBox="0 0 24 24" width="14" height="14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M18 6 6 18M6 6l12 12" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/></svg>', W.style.cssText = "position:absolute;top:8px;right:8px;width:24px;height:24px;border:none;border-radius:50%;background:#f3f4f6;color:#6b7280;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0", W.addEventListener("click", (U) => {
944
- U.stopPropagation();
953
+ const K = document.createElement("button");
954
+ K.type = "button", K.setAttribute("aria-label", "Dismiss"), K.innerHTML = '<svg viewBox="0 0 24 24" width="14" height="14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M18 6 6 18M6 6l12 12" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/></svg>', K.style.cssText = "position:absolute;top:8px;right:8px;width:24px;height:24px;border:none;border-radius:50%;background:#f3f4f6;color:#6b7280;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0", K.addEventListener("click", (F) => {
955
+ F.stopPropagation();
945
956
  try {
946
- sessionStorage.setItem(oe, "1");
957
+ sessionStorage.setItem(ie, "1");
947
958
  } catch {
948
959
  }
949
- L && (L.remove(), L = null);
950
- }), L.append(W);
951
- const ge = () => {
952
- T || (T = !0, ie(!0), ee(), O = 0, z && (z.style.display = "none"), L && (L.remove(), L = null));
960
+ R && (R.remove(), R = null);
961
+ }), R.append(K);
962
+ const ye = () => {
963
+ j || (j = !0, ae(!0), te(), O = 0, P && (P.style.display = "none"), R && (R.remove(), R = null));
953
964
  };
954
- L.addEventListener("click", ge), L.addEventListener("keydown", (U) => {
955
- (U.key === "Enter" || U.key === " ") && (U.preventDefault(), ge());
956
- }), B.insertBefore(L, H);
965
+ R.addEventListener("click", ye), R.addEventListener("keydown", (F) => {
966
+ (F.key === "Enter" || F.key === " ") && (F.preventDefault(), ye());
967
+ }), A.insertBefore(R, H);
957
968
  };
958
969
  if (!document.getElementById("ocw-teaser-style")) {
959
- const $ = document.createElement("style");
960
- $.id = "ocw-teaser-style", $.textContent = "@keyframes ocw-teaser-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}", document.head.append($);
970
+ const q = document.createElement("style");
971
+ q.id = "ocw-teaser-style", q.textContent = "@keyframes ocw-teaser-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}", document.head.append(q);
961
972
  }
962
- P = me, me();
963
- const ie = ($) => {
964
- $ ? (g.style.display = "flex", requestAnimationFrame(() => {
973
+ M = ge, ge();
974
+ const ae = (q) => {
975
+ q ? (g.style.display = "flex", requestAnimationFrame(() => {
965
976
  g.style.opacity = "1", g.style.transform = "scale(1)";
966
977
  })) : (g.style.opacity = "0", g.style.transform = "scale(.95)", setTimeout(() => {
967
- T || (g.style.display = "none");
978
+ j || (g.style.display = "none");
968
979
  }, 180));
969
980
  };
970
981
  H.addEventListener("click", () => {
971
- if (T = !T, ie(T), ee(), T) {
972
- O = 0, z && (z.style.display = "none");
982
+ if (j = !j, ae(j), te(), j) {
983
+ O = 0, P && (P.style.display = "none");
973
984
  try {
974
- sessionStorage.setItem(oe, "1");
985
+ sessionStorage.setItem(ie, "1");
975
986
  } catch {
976
987
  }
977
988
  }
978
- P == null || P();
979
- }), A = ($) => {
980
- $.key === "Escape" && T && (T = !1, ie(!1), ee());
981
- }, document.addEventListener("keydown", A);
989
+ M == null || M();
990
+ }), B = (q) => {
991
+ q.key === "Escape" && j && (j = !1, ae(!1), te());
992
+ }, document.addEventListener("keydown", B);
982
993
  }
983
994
  const _ = () => {
984
- T || (O++, z && (z.textContent = String(O), z.style.display = "flex"));
985
- }, r = () => {
995
+ j || (O++, P && (P.textContent = String(O), P.style.display = "flex"));
996
+ }, E = () => {
986
997
  try {
987
- const o = tt();
998
+ const o = nt();
988
999
  if (!o) return;
989
1000
  o.state === "suspended" && o.resume().catch(() => {
990
1001
  });
@@ -992,77 +1003,77 @@ function ot(t) {
992
1003
  p.connect(g), g.connect(o.destination), p.frequency.setValueAtTime(880, o.currentTime), p.frequency.exponentialRampToValueAtTime(440, o.currentTime + 0.15), g.gain.setValueAtTime(0.3, o.currentTime), g.gain.exponentialRampToValueAtTime(1e-3, o.currentTime + 0.3), p.start(), p.stop(o.currentTime + 0.3);
993
1004
  } catch {
994
1005
  }
995
- }, i = [], v = (o) => {
996
- for (; i.length; ) {
997
- const p = i.shift();
998
- x.add({ clientMsgId: p.clientMsgId, content: p.content, ts: Date.now() }), f.send({ type: "send", conversationId: o, clientMsgId: p.clientMsgId, content: p.content });
1006
+ }, r = [], i = (o) => {
1007
+ for (; r.length; ) {
1008
+ const p = r.shift();
1009
+ u.add({ clientMsgId: p.clientMsgId, content: p.content, ts: Date.now() }), h.send({ type: "send", conversationId: o, clientMsgId: p.clientMsgId, content: p.content });
999
1010
  }
1000
1011
  };
1001
- let f;
1002
- const m = new Ue(`ocw-e2e-${t.profileId}`);
1003
- let k = !1;
1004
- const S = [], w = [];
1005
- let I = !1;
1006
- const N = (o, p) => {
1012
+ let h;
1013
+ const m = new Fe(`ocw-e2e-${t.profileId}`);
1014
+ let v = !1;
1015
+ const k = [], w = [];
1016
+ let S = !1;
1017
+ const z = (o, p) => {
1007
1018
  m.sealText(p).then((g) => {
1008
- a && f.send({ type: "send", conversationId: a, clientMsgId: o, content: g });
1019
+ d && h.send({ type: "send", conversationId: d, clientMsgId: o, content: g });
1009
1020
  });
1010
- }, D = (o, p, g) => {
1011
- m.sealText(p, g).then((M) => {
1012
- a && f.send({ type: "send", conversationId: a, clientMsgId: o, content: M });
1021
+ }, U = (o, p, g) => {
1022
+ m.sealText(p, g).then(($) => {
1023
+ d && h.send({ type: "send", conversationId: d, clientMsgId: o, content: $ });
1013
1024
  });
1014
- }, X = () => {
1015
- for (; S.length; ) {
1016
- const o = S.shift();
1017
- N(o.clientMsgId, o.text);
1025
+ }, D = () => {
1026
+ for (; k.length; ) {
1027
+ const o = k.shift();
1028
+ z(o.clientMsgId, o.text);
1018
1029
  }
1019
1030
  for (; w.length; ) {
1020
1031
  const o = w.shift();
1021
- N(o.clientMsgId, o.text);
1032
+ z(o.clientMsgId, o.text);
1022
1033
  }
1023
- }, Te = (o) => {
1024
- f.send({ type: "fetchPrekey", targetUserId: o });
1034
+ }, Q = (o) => {
1035
+ h.send({ type: "fetchPrekey", targetUserId: o });
1025
1036
  }, Se = qe(t.locale, t.i18n), Ee = ["ar", "he", "fa", "ur"], ze = typeof navigator < "u" ? (navigator.language ?? "").slice(0, 2).toLowerCase() : "";
1026
1037
  Ee.includes(ze) && !t.el.dir && (t.el.dir = "rtl", t.el.style.fontFamily = t.el.style.fontFamily || "Tahoma,Arial,system-ui,sans-serif");
1027
- const se = `oc_prechat_${t.profileId}_${c.slice(-8)}`, q = new Ze(t.el, c, {
1038
+ const le = `oc_prechat_${t.profileId}_${a.slice(-8)}`, N = new et(t.el, a, {
1028
1039
  onSend(o) {
1029
1040
  const p = `cm_${Math.random().toString(36).slice(2)}`, g = { kind: "text", text: o };
1030
- l.addOptimistic(p, g), q.render(l), l.e2e ? m.ready ? N(p, o) : I ? w.push({ clientMsgId: p, text: o }) : (S.push({ clientMsgId: p, text: o }), l.assignedAgentId && Te(l.assignedAgentId)) : a ? (x.add({ clientMsgId: p, content: g, ts: Date.now() }), f.send({ type: "send", conversationId: a, clientMsgId: p, content: g })) : i.push({ clientMsgId: p, content: g });
1041
+ s.addOptimistic(p, g), N.render(s), s.e2e ? m.ready ? z(p, o) : S ? w.push({ clientMsgId: p, text: o }) : (k.push({ clientMsgId: p, text: o }), s.assignedAgentId && Q(s.assignedAgentId)) : d ? (u.add({ clientMsgId: p, content: g, ts: Date.now() }), h.send({ type: "send", conversationId: d, clientMsgId: p, content: g })) : r.push({ clientMsgId: p, content: g });
1031
1042
  },
1032
1043
  async onAttach(o) {
1033
- if (!a) return;
1044
+ if (!d) return;
1034
1045
  const p = `${y}/upload?name=${encodeURIComponent(o.name)}`, g = `cm_${Math.random().toString(36).slice(2)}`;
1035
- l.addOptimistic(g, { kind: "text", text: `📎 Uploading ${o.name}…` }), q.render(l);
1046
+ s.addOptimistic(g, { kind: "text", text: `📎 Uploading ${o.name}…` }), N.render(s);
1036
1047
  try {
1037
- const M = await fetch(p, {
1048
+ const $ = await fetch(p, {
1038
1049
  method: "POST",
1039
1050
  // Use the resolved connection token (a signed JWT, an explicit userId,
1040
1051
  // or the anonymous persistent uid) — NOT just opts.token. The server
1041
1052
  // requires an Authorization header, and the verifier accepts an
1042
1053
  // anonymous id as a guest; keying off opts.token alone meant anonymous
1043
1054
  // visitors (the common case) sent no auth and every upload 401'd.
1044
- headers: { "content-type": o.type, authorization: `Bearer ${c}` },
1055
+ headers: { "content-type": o.type, authorization: `Bearer ${a}` },
1045
1056
  body: o
1046
1057
  });
1047
- if (!M.ok) throw new Error(`Upload failed: ${M.status}`);
1048
- const { url: K, name: V, mime: J, size: Z } = await M.json();
1049
- l.addOptimistic(g, { kind: "attachment", url: K, name: V, mime: J, size: Z }), q.render(l), f.send({ type: "send", conversationId: a, clientMsgId: g, content: { kind: "attachment", url: K, name: V, mime: J, size: Z } });
1050
- } catch (M) {
1051
- l.addOptimistic(g, { kind: "text", text: `⚠️ Upload failed: ${M.message}` }), q.render(l);
1058
+ if (!$.ok) throw new Error(`Upload failed: ${$.status}`);
1059
+ const { url: W, name: Y, mime: Z, size: ee } = await $.json();
1060
+ s.addOptimistic(g, { kind: "attachment", url: W, name: Y, mime: Z, size: ee }), N.render(s), h.send({ type: "send", conversationId: d, clientMsgId: g, content: { kind: "attachment", url: W, name: Y, mime: Z, size: ee } });
1061
+ } catch ($) {
1062
+ s.addOptimistic(g, { kind: "text", text: `⚠️ Upload failed: ${$.message}` }), N.render(s);
1052
1063
  }
1053
1064
  },
1054
1065
  onInvoke(o, p) {
1055
- a && f.send({ type: "invoke", conversationId: a, actionId: o, clientInvokeId: `iv_${Math.random().toString(36).slice(2)}`, ...p ? { inputs: p } : {} });
1066
+ d && h.send({ type: "invoke", conversationId: d, actionId: o, clientInvokeId: `iv_${Math.random().toString(36).slice(2)}`, ...p ? { inputs: p } : {} });
1056
1067
  },
1057
1068
  onTyping(o, p) {
1058
- a && f.send({ type: "typing", conversationId: a, isTyping: o, ...p ? { preview: p } : {} });
1069
+ d && h.send({ type: "typing", conversationId: d, isTyping: o, ...p ? { preview: p } : {} });
1059
1070
  },
1060
1071
  onPreChat(o) {
1061
1072
  try {
1062
- localStorage.setItem(se, "1");
1073
+ localStorage.setItem(le, "1");
1063
1074
  } catch {
1064
1075
  }
1065
- f.send({
1076
+ h.send({
1066
1077
  type: "open",
1067
1078
  profileId: t.profileId,
1068
1079
  ...t.subjectId ? { subjectId: t.subjectId } : {},
@@ -1076,67 +1087,70 @@ function ot(t) {
1076
1087
  }
1077
1088
  });
1078
1089
  const p = o.callback ? `📞 Call-back requested${o.phone ? `: ${o.phone}` : ""}${o.topic ? ` — ${o.topic}` : ""}` : o.topic ? `Topic: ${o.topic}` : "";
1079
- p && a && !l.e2e && f.send({ type: "send", conversationId: a, clientMsgId: `pc_${Math.random().toString(36).slice(2, 12)}`, content: { kind: "text", text: p } });
1090
+ p && d && !s.e2e && h.send({ type: "send", conversationId: d, clientMsgId: `pc_${Math.random().toString(36).slice(2, 12)}`, content: { kind: "text", text: p } });
1080
1091
  },
1081
- ...((pe = t.features) == null ? void 0 : pe.deflection) !== !1 ? {
1092
+ ...((ue = t.features) == null ? void 0 : ue.deflection) !== !1 ? {
1082
1093
  onDeflectQuery(o) {
1083
- if (s) return;
1084
- clearTimeout(d);
1094
+ if (c) return;
1095
+ clearTimeout(l);
1085
1096
  const p = o.trim();
1086
1097
  if (p.length < 3) {
1087
- q.hideDeflection();
1098
+ N.hideDeflection();
1088
1099
  return;
1089
1100
  }
1090
- d = setTimeout(() => {
1091
- fetch(`${y}/kb/search?profileId=${encodeURIComponent(t.profileId)}&q=${encodeURIComponent(p.slice(0, 200))}`).then((g) => g.ok ? g.json() : { articles: [] }).then((g) => q.showDeflection(g.articles ?? [])).catch(() => q.hideDeflection());
1101
+ l = setTimeout(() => {
1102
+ fetch(`${y}/kb/search?profileId=${encodeURIComponent(t.profileId)}&q=${encodeURIComponent(p.slice(0, 200))}`).then((g) => g.ok ? g.json() : { articles: [] }).then((g) => N.showDeflection(g.articles ?? [])).catch(() => N.hideDeflection());
1092
1103
  }, 350);
1093
1104
  }
1094
1105
  } : {},
1095
1106
  onReadUpTo(o) {
1096
- a && f.send({ type: "read", conversationId: a, seq: o });
1107
+ d && h.send({ type: "read", conversationId: d, seq: o });
1097
1108
  },
1098
1109
  onLoadMore() {
1099
- if (!a || !l.e2e) return;
1100
- const o = l.messages()[0];
1101
- o && f.send({ type: "history", conversationId: a, beforeSeq: o.seq, limit: 20 });
1110
+ if (!d || !s.e2e) return;
1111
+ const o = s.messages()[0];
1112
+ o && h.send({ type: "history", conversationId: d, beforeSeq: o.seq, limit: 20 });
1102
1113
  },
1103
1114
  onEdit(o, p) {
1104
- a && f.send({ type: "edit", conversationId: a, messageId: o, content: { kind: "text", text: p } });
1115
+ d && h.send({ type: "edit", conversationId: d, messageId: o, content: { kind: "text", text: p } });
1105
1116
  },
1106
1117
  onDelete(o) {
1107
- a && f.send({ type: "delete", conversationId: a, messageId: o });
1118
+ d && h.send({ type: "delete", conversationId: d, messageId: o });
1108
1119
  },
1109
- ...((ue = t.features) == null ? void 0 : ue.reactions) !== !1 ? {
1120
+ ...((he = t.features) == null ? void 0 : he.reactions) !== !1 ? {
1110
1121
  onReact(o, p, g) {
1111
- a && f.send({ type: "react", conversationId: a, messageId: o, emoji: p, remove: g });
1122
+ d && h.send({ type: "react", conversationId: d, messageId: o, emoji: p, remove: g });
1112
1123
  }
1113
1124
  } : {},
1114
- ...((he = t.features) == null ? void 0 : he.csat) !== !1 ? {
1125
+ ...((fe = t.features) == null ? void 0 : fe.csat) !== !1 ? {
1115
1126
  onCsat(o) {
1116
- a && fetch(`${y}/conversations/${a}/csat`, {
1127
+ d && fetch(`${y}/conversations/${d}/csat`, {
1117
1128
  method: "POST",
1118
- headers: { "Content-Type": "application/json", Authorization: `Bearer ${c}` },
1129
+ headers: { "Content-Type": "application/json", Authorization: `Bearer ${a}` },
1119
1130
  body: JSON.stringify({ score: o })
1120
1131
  }).catch(() => {
1121
1132
  });
1122
1133
  }
1123
1134
  } : {},
1124
- ...t.translateLang ? {
1125
- async onTranslate(o) {
1126
- try {
1127
- const p = await fetch(`${y}/translate`, {
1128
- method: "POST",
1129
- headers: { "content-type": "application/json", authorization: `Bearer ${c}` },
1130
- body: JSON.stringify({ text: o, targetLang: t.translateLang })
1131
- });
1132
- if (!p.ok) return null;
1133
- const { translated: g } = await p.json();
1134
- return g;
1135
- } catch {
1136
- return null;
1135
+ ...(() => {
1136
+ const o = t.locale ?? (typeof navigator < "u" ? navigator.language : ""), p = t.translateLang !== void 0 ? t.translateLang : o ? o.split("-")[0] : Ne();
1137
+ return p ? {
1138
+ async onTranslate(g) {
1139
+ try {
1140
+ const $ = await fetch(`${y}/translate`, {
1141
+ method: "POST",
1142
+ headers: { "content-type": "application/json", authorization: `Bearer ${a}` },
1143
+ body: JSON.stringify({ text: g, targetLang: p })
1144
+ });
1145
+ if (!$.ok) return null;
1146
+ const { translated: W } = await $.json();
1147
+ return W;
1148
+ } catch {
1149
+ return null;
1150
+ }
1137
1151
  }
1138
- }
1139
- } : {},
1152
+ } : {};
1153
+ })(),
1140
1154
  ...t.onBack ? { onBack: t.onBack } : {}
1141
1155
  }, {
1142
1156
  ...t.subject ? { subject: t.subject } : {},
@@ -1145,107 +1159,107 @@ function ot(t) {
1145
1159
  ...t.accent2 ? { accent2: t.accent2 } : {},
1146
1160
  ...t.theme ? { theme: t.theme } : {},
1147
1161
  ...t.webfont === !1 ? { webfont: !1 } : {},
1148
- ...(fe = t.user) != null && fe.name || (we = t.user) != null && we.avatar ? { userInfo: { ...t.user.name ? { name: t.user.name } : {}, ...t.user.avatar ? { avatar: t.user.avatar } : {} } } : {},
1162
+ ...(we = t.user) != null && we.name || (be = t.user) != null && be.avatar ? { userInfo: { ...t.user.name ? { name: t.user.name } : {}, ...t.user.avatar ? { avatar: t.user.avatar } : {} } } : {},
1149
1163
  i18n: Se
1150
1164
  });
1151
1165
  try {
1152
- localStorage.getItem(se) && q.completePreChat();
1166
+ localStorage.getItem(le) && N.completePreChat();
1153
1167
  } catch {
1154
1168
  }
1155
- const le = t.user && (t.user.name || t.user.email || t.user.avatar || t.user.meta) ? {
1169
+ const de = t.user && (t.user.name || t.user.email || t.user.avatar || t.user.meta) ? {
1156
1170
  ...t.user.name ? { name: t.user.name } : {},
1157
1171
  ...t.user.email ? { email: t.user.email } : {},
1158
1172
  ...t.user.avatar ? { avatar: t.user.avatar } : {},
1159
1173
  ...t.user.meta ? { meta: t.user.meta } : {}
1160
- } : void 0, je = {
1174
+ } : void 0, Le = {
1161
1175
  type: "open",
1162
1176
  profileId: t.profileId,
1163
1177
  // Direct conversations use the kind/peerId pair; the dm:… subject key is
1164
1178
  // server-derived and owner-keyed, so passing it as subjectId from the
1165
1179
  // NON-owner side would find-or-create a junk duplicate thread.
1166
1180
  ...t.kind === "direct" && t.peerId ? { kind: "direct", peerId: t.peerId } : t.subjectId ? { subjectId: t.subjectId } : {},
1167
- ...h ? { linkFrom: h } : {},
1168
- ...le ? { userInfo: le } : {},
1181
+ ...f ? { linkFrom: f } : {},
1182
+ ...de ? { userInfo: de } : {},
1169
1183
  ...typeof location < "u" ? { pageUrl: location.href } : {},
1170
1184
  ...typeof document < "u" && document.title ? { pageTitle: document.title } : {},
1171
1185
  // Pass subject display info so the server can persist it to the Subject record.
1172
1186
  // This is how listingTitle and listingMeta get saved without a separate API call.
1173
- ...(be = t.subject) != null && be.title ? { subjectTitle: t.subject.title } : {},
1174
- ...(xe = t.subject) != null && xe.subtitle ? { subjectMeta: t.subject.subtitle } : {}
1187
+ ...(xe = t.subject) != null && xe.title ? { subjectTitle: t.subject.title } : {},
1188
+ ...(me = t.subject) != null && me.subtitle ? { subjectMeta: t.subject.subtitle } : {}
1175
1189
  };
1176
- f = new _e({
1190
+ h = new Ue({
1177
1191
  ...t.refreshToken ? { refreshToken: t.refreshToken } : {},
1178
1192
  url: b,
1179
- token: c,
1180
- open: je,
1181
- getCursor: () => l.highestSeq(),
1182
- onStatusChange: (o, p) => q.setConnStatus(o, p),
1193
+ token: a,
1194
+ open: Le,
1195
+ getCursor: () => s.highestSeq(),
1196
+ onStatusChange: (o, p) => N.setConnStatus(o, p),
1183
1197
  onFrame(o) {
1184
1198
  if (o.type === "opened") {
1185
- if (a = o.conversation.id, !j) {
1186
- j = !0;
1187
- for (const p of x.load())
1188
- f.send({ type: "send", conversationId: a, clientMsgId: p.clientMsgId, content: p.content });
1199
+ if (d = o.conversation.id, !I) {
1200
+ I = !0;
1201
+ for (const p of u.load())
1202
+ h.send({ type: "send", conversationId: d, clientMsgId: p.clientMsgId, content: p.content });
1189
1203
  }
1190
- Ne(b, c, a, l, q, y), i.length && v(a);
1204
+ Oe(b, a, d, s, N, y), r.length && i(d);
1191
1205
  }
1192
- if (o.type === "ack" && x.remove(o.clientMsgId), o.type === "prekeyBundle") {
1193
- o.bundle && (I = !0, m.x3dhSendTo(o.bundle).then((p) => {
1194
- const g = [...S.splice(0), ...w.splice(0)];
1195
- for (const M of g) D(M.clientMsgId, M.text, p);
1196
- q.render(l);
1206
+ if (o.type === "ack" && u.remove(o.clientMsgId), o.type === "prekeyBundle") {
1207
+ o.bundle && (S = !0, m.x3dhSendTo(o.bundle).then((p) => {
1208
+ const g = [...k.splice(0), ...w.splice(0)];
1209
+ for (const $ of g) U($.clientMsgId, $.text, p);
1210
+ N.render(s);
1197
1211
  }));
1198
1212
  return;
1199
1213
  }
1200
- if (o.type === "message" && l.e2e) {
1201
- const p = Fe(o.message.content);
1214
+ if (o.type === "message" && s.e2e) {
1215
+ const p = We(o.message.content);
1202
1216
  if (p && !m.ready) {
1203
1217
  m.x3dhReceiveFrom(p.x3dhIK, p.x3dhEK, p.x3dhSPK, p.x3dhOTP).then(async () => {
1204
- await m.openFrame(o), l.apply(o), q.render(l);
1218
+ await m.openFrame(o), s.apply(o), N.render(s);
1205
1219
  });
1206
1220
  return;
1207
1221
  }
1208
1222
  }
1209
1223
  if (o.type === "peerkey") {
1210
1224
  m.onPeerKey(o.key).then(() => {
1211
- X(), q.render(l);
1225
+ D(), N.render(s);
1212
1226
  });
1213
1227
  return;
1214
1228
  }
1215
1229
  (async () => {
1216
- if (l.e2e && await m.openFrame(o), l.apply(o), o.type === "manifest") {
1217
- P == null || P();
1230
+ if (s.e2e && await m.openFrame(o), s.apply(o), o.type === "manifest") {
1231
+ M == null || M();
1218
1232
  const p = o.botName;
1219
- p && q.setBotName(p);
1233
+ p && N.setBotName(p);
1220
1234
  }
1221
- if (o.type === "message" && o.message.senderId !== c && !o.message.internal && (_(), r()), l.e2e && a && !k) {
1222
- k = !0;
1235
+ if (o.type === "message" && o.message.senderId !== a && !o.message.internal && (_(), E()), s.e2e && d && !v) {
1236
+ v = !0;
1223
1237
  const p = await m.initX3DH();
1224
- f.send({ type: "uploadPrekeys", ...p });
1238
+ h.send({ type: "uploadPrekeys", ...p });
1225
1239
  const g = await m.begin();
1226
- f.send({ type: "pubkey", conversationId: a, key: g });
1240
+ h.send({ type: "pubkey", conversationId: d, key: g });
1227
1241
  }
1228
- q.render(l);
1242
+ N.render(s);
1229
1243
  })();
1230
1244
  }
1231
- }), f.connect(), q.render(l);
1232
- const G = t.launcher ? Ie(t) : null, Q = { close: () => {
1233
- s = !0, clearTimeout(d), f.close(), B == null || B.remove(), q.destroy(), R && E && R.removeEventListener("change", E), A && (document.removeEventListener("keydown", A), A = null), F.delete(t.el), G && ne.get(G) === Q && ne.delete(G);
1245
+ }), h.connect(), N.render(s);
1246
+ const V = t.launcher ? Te(t) : null, J = { close: () => {
1247
+ c = !0, clearTimeout(l), h.close(), A == null || A.remove(), N.destroy(), T && L && T.removeEventListener("change", L), B && (document.removeEventListener("keydown", B), B = null), G.delete(t.el), V && oe.get(V) === J && oe.delete(V);
1234
1248
  } };
1235
- return F.set(t.el, Q), G && ne.set(G, Q), Q;
1249
+ return G.set(t.el, J), V && oe.set(V, J), J;
1236
1250
  }
1237
1251
  export {
1238
- He as ChatStore,
1239
- _e as ConnectionManager,
1240
- Ue as E2ESession,
1241
- De as PersistentOutbox,
1242
- Ze as Renderer,
1243
- ft as asConversationId,
1244
- Fe as extractX3DHInit,
1245
- ut as httpBaseFromWsUrl,
1246
- ot as mount,
1252
+ _e as ChatStore,
1253
+ Ue as ConnectionManager,
1254
+ Fe as E2ESession,
1255
+ He as PersistentOutbox,
1256
+ et as Renderer,
1257
+ wt as asConversationId,
1258
+ We as extractX3DHInit,
1259
+ ht as httpBaseFromWsUrl,
1260
+ it as mount,
1247
1261
  Ae as resolveRelayUrls,
1248
- Ne as restoreHistory,
1249
- lt as unmount
1262
+ Oe as restoreHistory,
1263
+ dt as unmount
1250
1264
  };
1251
1265
  //# sourceMappingURL=index.js.map