@flowengage/react-chatbot 8.0.129 → 8.0.130

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.
@@ -34,72 +34,72 @@ var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, b = Object.g
34
34
  agentName: "flowengage.agentName",
35
35
  agentHeadshot: "flowengage.agentHeadshot",
36
36
  visitorEmail: "flowengage.visitorEmail"
37
- }, ee = 6e4, te = 480 * 60, ne = 3e4, j = typeof window < "u", M = (e) => e ? `flowengage.visitorEmail.${e}` : null, re = () => {
37
+ }, ee = 6e4, te = 480 * 60, ne = 3e4, j = typeof window < "u", re = (e) => e ? `flowengage.visitorEmail.${e}` : null, ie = () => {
38
38
  if (!j) return null;
39
39
  let e = window.localStorage.getItem(A.chatId);
40
40
  return e && String(e).trim() ? String(e).trim() : null;
41
- }, ie = () => {
41
+ }, ae = () => {
42
42
  if (j) try {
43
43
  window.localStorage.removeItem(A.chatId);
44
44
  } catch {}
45
- }, ae = () => j ? typeof crypto < "u" && crypto.randomUUID ? crypto.randomUUID() : `${Date.now()}-${Math.random().toString(16).slice(2)}` : "server-chat-id", N = (e) => e ? `flowengage.entrySeen.${e}` : null, oe = (e) => {
45
+ }, oe = () => j ? typeof crypto < "u" && crypto.randomUUID ? crypto.randomUUID() : `${Date.now()}-${Math.random().toString(16).slice(2)}` : "server-chat-id", M = (e) => e ? `flowengage.entrySeen.${e}` : null, se = (e) => {
46
46
  if (!j || !e) return !1;
47
47
  try {
48
- let t = N(e);
48
+ let t = M(e);
49
49
  return t ? window.localStorage.getItem(t) === "1" : !1;
50
50
  } catch {
51
51
  return !1;
52
52
  }
53
- }, P = (e) => {
53
+ }, N = (e) => {
54
54
  if (!(!j || !e)) try {
55
- let t = N(e);
55
+ let t = M(e);
56
56
  t && window.localStorage.setItem(t, "1");
57
57
  } catch {}
58
- }, se = (e) => e ? `flowengage.navPreference.${e}` : null, F = (e) => e ? `flowengage.navPreferencePromptShown.${e}` : null, ce = (e) => {
58
+ }, ce = (e) => e ? `flowengage.navPreference.${e}` : null, P = (e) => e ? `flowengage.navPreferencePromptShown.${e}` : null, le = (e) => {
59
59
  if (!j || !e) return null;
60
60
  try {
61
- let t = se(e), n = t ? window.localStorage.getItem(t) : null;
61
+ let t = ce(e), n = t ? window.localStorage.getItem(t) : null;
62
62
  return n === "auto" || n === "ask" ? n : null;
63
63
  } catch {
64
64
  return null;
65
65
  }
66
- }, le = (e, t) => {
66
+ }, ue = (e, t) => {
67
67
  if (!(!j || !e || t !== "auto" && t !== "ask")) try {
68
- let n = se(e);
69
- n && window.localStorage.setItem(n, t), de(e);
68
+ let n = ce(e);
69
+ n && window.localStorage.setItem(n, t), fe(e);
70
70
  } catch {}
71
- }, ue = (e) => {
71
+ }, de = (e) => {
72
72
  if (!j || !e) return !1;
73
73
  try {
74
- let t = F(e);
74
+ let t = P(e);
75
75
  return t ? window.localStorage.getItem(t) === "1" : !1;
76
76
  } catch {
77
77
  return !1;
78
78
  }
79
- }, de = (e) => {
79
+ }, fe = (e) => {
80
80
  if (!(!j || !e)) try {
81
- let t = F(e);
81
+ let t = P(e);
82
82
  t && window.localStorage.setItem(t, "1");
83
83
  } catch {}
84
- }, fe = (e) => e ? `flowengage.persistedChatId.${e}` : null, pe = (e) => {
84
+ }, pe = (e) => e ? `flowengage.persistedChatId.${e}` : null, me = (e) => {
85
85
  if (!j || !e) return null;
86
86
  try {
87
- let t = fe(e), n = t ? window.localStorage.getItem(t) : null;
87
+ let t = pe(e), n = t ? window.localStorage.getItem(t) : null;
88
88
  return n && String(n).trim() ? String(n).trim() : null;
89
89
  } catch {
90
90
  return null;
91
91
  }
92
- }, me = (e) => {
92
+ }, he = (e) => {
93
93
  if (!(!j || !e)) try {
94
- let t = fe(e);
94
+ let t = pe(e);
95
95
  t && window.localStorage.removeItem(t);
96
96
  } catch {}
97
- }, he = (e, t) => {
97
+ }, ge = (e, t) => {
98
98
  if (!(!j || !e || !t)) try {
99
- let n = fe(e);
99
+ let n = pe(e);
100
100
  n && window.localStorage.setItem(n, String(t).trim());
101
101
  } catch {}
102
- }, ge = () => j ? {
102
+ }, _e = () => j ? {
103
103
  isOpen: !1,
104
104
  activeScreen: window.sessionStorage.getItem(A.activeScreen) || "ai",
105
105
  isHumanHandled: window.sessionStorage.getItem(A.isHumanHandled) === "true",
@@ -113,7 +113,7 @@ var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, b = Object.g
113
113
  agentName: null,
114
114
  agentHeadshot: null,
115
115
  visitorEmail: ""
116
- }, _e = (e) => {
116
+ }, ve = (e) => {
117
117
  j && Object.entries(e).forEach(([e, t]) => {
118
118
  let n = A[e];
119
119
  if (n) {
@@ -124,17 +124,17 @@ var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, b = Object.g
124
124
  window.sessionStorage.setItem(n, String(t));
125
125
  }
126
126
  });
127
- }, ve = (e) => {
127
+ }, ye = (e) => {
128
128
  if (!j || !e) return "";
129
- let t = M(e), n = window.localStorage.getItem(t);
129
+ let t = re(e), n = window.localStorage.getItem(t);
130
130
  if (!n) {
131
131
  let e = window.sessionStorage.getItem(A.visitorEmail);
132
132
  e && (window.localStorage.setItem(t, e), window.sessionStorage.removeItem(A.visitorEmail), n = e);
133
133
  }
134
134
  return n || "";
135
- }, ye = (e, t) => {
135
+ }, be = (e, t) => {
136
136
  if (!j) return;
137
- let n = M(t);
137
+ let n = re(t);
138
138
  if (!n) return;
139
139
  let r = typeof e == "string" ? e.trim() : "";
140
140
  if (!r) {
@@ -142,91 +142,91 @@ var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, b = Object.g
142
142
  return;
143
143
  }
144
144
  window.localStorage.setItem(n, r), window.sessionStorage.removeItem(A.visitorEmail);
145
- }, be = (e) => e ? `flowengage.visitorId.${e}` : null, xe = () => `v_${Date.now().toString(36)}_${typeof crypto < "u" && crypto.randomUUID ? crypto.randomUUID().replace(/-/g, "").slice(0, 16) : Math.random().toString(36).slice(2, 18)}`, I = (e) => {
145
+ }, xe = (e) => e ? `flowengage.visitorId.${e}` : null, Se = () => `v_${Date.now().toString(36)}_${typeof crypto < "u" && crypto.randomUUID ? crypto.randomUUID().replace(/-/g, "").slice(0, 16) : Math.random().toString(36).slice(2, 18)}`, F = (e) => {
146
146
  if (!j || !e) return null;
147
147
  try {
148
- let t = be(e), n = t ? window.localStorage.getItem(t) : null;
148
+ let t = xe(e), n = t ? window.localStorage.getItem(t) : null;
149
149
  return n && String(n).trim() ? String(n).trim() : null;
150
150
  } catch {
151
151
  return null;
152
152
  }
153
- }, L = (e) => {
153
+ }, I = (e) => {
154
154
  if (!j || !e) return null;
155
155
  try {
156
- let t = I(e);
156
+ let t = F(e);
157
157
  if (t) return t;
158
- let n = xe(), r = be(e);
158
+ let n = Se(), r = xe(e);
159
159
  return r && window.localStorage.setItem(r, n), n;
160
160
  } catch {
161
- return xe();
161
+ return Se();
162
162
  }
163
- }, R = "flowengage.tabId", Se = () => {
163
+ }, L = "flowengage.tabId", Ce = () => {
164
164
  if (!j) return "default";
165
165
  try {
166
- let e = window.sessionStorage.getItem(R);
167
- return e || (e = typeof crypto < "u" && crypto.randomUUID ? crypto.randomUUID().replace(/-/g, "").slice(0, 12) : Math.random().toString(36).slice(2, 14), window.sessionStorage.setItem(R, e)), e;
166
+ let e = window.sessionStorage.getItem(L);
167
+ return e || (e = typeof crypto < "u" && crypto.randomUUID ? crypto.randomUUID().replace(/-/g, "").slice(0, 12) : Math.random().toString(36).slice(2, 14), window.sessionStorage.setItem(L, e)), e;
168
168
  } catch {
169
169
  return "default";
170
170
  }
171
- }, Ce = (e) => e ? `flowengage.voice.transcript.${e}.${Se()}` : null, we = 600 * 1e3, Te = (e, t, n = {}) => {
171
+ }, we = (e) => e ? `flowengage.voice.transcript.${e}.${Ce()}` : null, Te = 600 * 1e3, Ee = (e, t, n = {}) => {
172
172
  if (!j || !e) return;
173
173
  let r = typeof t == "string" ? t.trim() : "";
174
174
  if (!r) return;
175
- let i = Number.isFinite(n.ttlMs) ? n.ttlMs : we, a = {
175
+ let i = Number.isFinite(n.ttlMs) ? n.ttlMs : Te, a = {
176
176
  transcript: r,
177
177
  expiresAt: Date.now() + i
178
178
  };
179
179
  try {
180
- let t = Ce(e);
180
+ let t = we(e);
181
181
  t && window.localStorage.setItem(t, JSON.stringify(a));
182
182
  } catch {}
183
- }, Ee = (e) => {
183
+ }, De = (e) => {
184
184
  if (!j || !e) return null;
185
185
  try {
186
- let t = Ce(e), n = t ? window.localStorage.getItem(t) : null;
186
+ let t = we(e), n = t ? window.localStorage.getItem(t) : null;
187
187
  if (!n) return null;
188
188
  let r = JSON.parse(n);
189
189
  return !r || typeof r.transcript != "string" ? null : Number.isFinite(r.expiresAt) && Date.now() > r.expiresAt ? (window.localStorage.removeItem(t), null) : r;
190
190
  } catch {
191
191
  return null;
192
192
  }
193
- }, De = (e) => {
193
+ }, Oe = (e) => {
194
194
  if (!(!j || !e)) try {
195
- let t = Ce(e);
195
+ let t = we(e);
196
196
  t && window.localStorage.removeItem(t);
197
197
  } catch {}
198
- }, Oe = "flowengage.voice.pendingResume", ke = () => {
198
+ }, ke = "flowengage.voice.pendingResume", Ae = () => {
199
199
  if (j) try {
200
- window.sessionStorage.setItem(Oe, "1");
200
+ window.sessionStorage.setItem(ke, "1");
201
201
  } catch {}
202
- }, Ae = () => {
202
+ }, je = () => {
203
203
  if (!j) return !1;
204
204
  try {
205
- return window.sessionStorage.getItem(Oe) === "1" ? (window.sessionStorage.removeItem(Oe), !0) : !1;
205
+ return window.sessionStorage.getItem(ke) === "1" ? (window.sessionStorage.removeItem(ke), !0) : !1;
206
206
  } catch {
207
207
  return !1;
208
208
  }
209
- }, je = "flowengage.chat.pendingReopen", Me = () => {
209
+ }, Me = "flowengage.chat.pendingReopen", Ne = () => {
210
210
  if (j) try {
211
- window.sessionStorage.setItem(je, "1");
211
+ window.sessionStorage.setItem(Me, "1");
212
212
  } catch {}
213
- }, Ne = () => {
213
+ }, Pe = () => {
214
214
  if (!j) return !1;
215
215
  try {
216
- return window.sessionStorage.getItem(je) === "1" ? (window.sessionStorage.removeItem(je), !0) : !1;
216
+ return window.sessionStorage.getItem(Me) === "1" ? (window.sessionStorage.removeItem(Me), !0) : !1;
217
217
  } catch {
218
218
  return !1;
219
219
  }
220
- }, Pe = () => {
220
+ }, Fe = () => {
221
221
  if (!j) return !1;
222
222
  try {
223
- return window.sessionStorage.getItem(Oe) === "1";
223
+ return window.sessionStorage.getItem(ke) === "1";
224
224
  } catch {
225
225
  return !1;
226
226
  }
227
- }, Fe = (e) => e ? `flowengage.voice.navState.${e}.${Se()}` : null, Ie = (e, t, n, r) => {
227
+ }, Ie = (e) => e ? `flowengage.voice.navState.${e}.${Ce()}` : null, Le = (e, t, n, r) => {
228
228
  if (!(!j || !e || !t)) try {
229
- let i = Fe(e);
229
+ let i = Ie(e);
230
230
  i && window.sessionStorage.setItem(i, JSON.stringify({
231
231
  previousPage: String(t),
232
232
  targetPath: n ? new URL(String(n), window.location.href).pathname : null,
@@ -234,10 +234,10 @@ var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, b = Object.g
234
234
  ts: Date.now()
235
235
  }));
236
236
  } catch {}
237
- }, Le = (e) => {
237
+ }, Re = (e) => {
238
238
  if (!j || !e) return null;
239
239
  try {
240
- let t = Fe(e);
240
+ let t = Ie(e);
241
241
  if (!t) return null;
242
242
  let n = window.sessionStorage.getItem(t);
243
243
  if (!n) return null;
@@ -250,14 +250,14 @@ var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, b = Object.g
250
250
  } catch {
251
251
  return null;
252
252
  }
253
- }, z = async (e) => {
253
+ }, R = async (e) => {
254
254
  let t = await e.json().catch(() => ({}));
255
255
  if (!e.ok) {
256
256
  let n = Error(t.message || t.error || `Request failed with status ${e.status}`);
257
257
  throw n.status = e.status, n;
258
258
  }
259
259
  return t;
260
- }, Re = async (e, t = {}) => {
260
+ }, ze = async (e, t = {}) => {
261
261
  try {
262
262
  return await fetch(e, {
263
263
  mode: "cors",
@@ -267,9 +267,9 @@ var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, b = Object.g
267
267
  let n = /* @__PURE__ */ Error(`Network error reaching ${e}. Check: (1) backend is running, (2) CORS allows this origin, (3) siteId is correct. Original: ${t.message}`);
268
268
  throw n.status = 0, n.cause = t, n;
269
269
  }
270
- }, ze = async ({ apiBaseUrl: e, userId: t, siteId: n, priorChatId: r = null, forceNew: i = !1, resumeChatId: a = null, visitorId: o = null }) => {
270
+ }, Be = async ({ apiBaseUrl: e, userId: t, siteId: n, priorChatId: r = null, forceNew: i = !1, resumeChatId: a = null, visitorId: o = null }) => {
271
271
  let s = `${e}/api/visitors/resolve-session`, c = { siteId: n };
272
- return r && String(r).trim() && (c.priorChatId = String(r).trim()), i && (c.forceNew = !0), a && (c.resumeChatId = a), o && (c.visitorId = o), z(await Re(s, {
272
+ return r && String(r).trim() && (c.priorChatId = String(r).trim()), i && (c.forceNew = !0), a && (c.resumeChatId = a), o && (c.visitorId = o), R(await ze(s, {
273
273
  method: "POST",
274
274
  mode: "cors",
275
275
  headers: {
@@ -280,13 +280,13 @@ var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, b = Object.g
280
280
  },
281
281
  body: JSON.stringify(c)
282
282
  }));
283
- }, Be = async ({ apiBaseUrl: e, siteId: t }) => {
283
+ }, Ve = async ({ apiBaseUrl: e, siteId: t }) => {
284
284
  let n = typeof window < "u" ? window.location.origin : "http://localhost";
285
- return (await z(await Re(`${e}/api/widget/chatbot-loader?${new URLSearchParams({
285
+ return (await R(await ze(`${e}/api/widget/chatbot-loader?${new URLSearchParams({
286
286
  siteId: t,
287
287
  origin: n
288
288
  }).toString()}`, { method: "GET" }))).data;
289
- }, Ve = ({ apiBaseUrl: e, userId: t, siteId: n, visitorId: r = null }) => {
289
+ }, z = ({ apiBaseUrl: e, userId: t, siteId: n, visitorId: r = null }) => {
290
290
  let i = (t, n) => {
291
291
  let r = `${e}${t}`, i = JSON.stringify(n);
292
292
  if (typeof navigator < "u" && navigator.sendBeacon) try {
@@ -300,7 +300,7 @@ var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, b = Object.g
300
300
  headers: { "Content-Type": "application/json" },
301
301
  body: i
302
302
  }).catch(() => {}), !0) : !1;
303
- }, a = async (i, a = {}) => z(await Re(`${e}${i}`, {
303
+ }, a = async (i, a = {}) => R(await ze(`${e}${i}`, {
304
304
  ...a,
305
305
  headers: {
306
306
  "Content-Type": "application/json",
@@ -315,7 +315,7 @@ var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, b = Object.g
315
315
  ...n ? { "x-site-id": n } : {},
316
316
  ...a.headers || {}
317
317
  };
318
- return z(await Re(`${e}${r}`, {
318
+ return R(await ze(`${e}${r}`, {
319
319
  ...a,
320
320
  body: i,
321
321
  headers: o
@@ -346,7 +346,7 @@ var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, b = Object.g
346
346
  method: "POST",
347
347
  body: JSON.stringify(f)
348
348
  });
349
- let p = await Re(`${e}/api/ai/chat`, {
349
+ let p = await ze(`${e}/api/ai/chat`, {
350
350
  method: "POST",
351
351
  headers: {
352
352
  "Content-Type": "application/json",
@@ -359,7 +359,7 @@ var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, b = Object.g
359
359
  stream: !0
360
360
  })
361
361
  });
362
- if (!(p.headers.get("content-type") || "").includes("text/event-stream")) return z(p);
362
+ if (!(p.headers.get("content-type") || "").includes("text/event-stream")) return R(p);
363
363
  let m = p.body.getReader(), h = new TextDecoder(), g = "", _ = null, v = (e) => {
364
364
  let t = e.split("\n").find((e) => e.startsWith("data: "));
365
365
  if (t) try {
@@ -475,7 +475,7 @@ var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, b = Object.g
475
475
  });
476
476
  },
477
477
  async getIceServersConfig() {
478
- return z(await Re(`${e}/api/calls/ice-config`, {
478
+ return R(await ze(`${e}/api/calls/ice-config`, {
479
479
  method: "GET",
480
480
  headers: {
481
481
  "x-user-id": t,
@@ -2881,7 +2881,7 @@ async function Ar(e, t = {}) {
2881
2881
  reason: "already-on-page"
2882
2882
  };
2883
2883
  let a = i.pathname + i.search + i.hash;
2884
- if (window.Shopify) return n && br(n), r || Me(), r ? kr().then(() => window.location.assign(i.href)) : window.location.assign(i.href), { navigated: !0 };
2884
+ if (window.Shopify) return n && br(n), r || Ne(), r ? kr().then(() => window.location.assign(i.href)) : window.location.assign(i.href), { navigated: !0 };
2885
2885
  let o = window.next?.router;
2886
2886
  if (o?.push) return new Promise((e) => {
2887
2887
  let t = () => {
@@ -2900,11 +2900,11 @@ async function Ar(e, t = {}) {
2900
2900
  try {
2901
2901
  window.history.pushState({}, "", e), window.dispatchEvent(new PopStateEvent("popstate", { state: {} }));
2902
2902
  } catch {}
2903
- return n && br(n), r || Me(), window.location.assign(i.href), { navigated: !0 };
2903
+ return n && br(n), r || Ne(), window.location.assign(i.href), { navigated: !0 };
2904
2904
  }
2905
2905
  return { navigated: !0 };
2906
2906
  }
2907
- return n && br(n), r || Me(), window.location.assign(i.href), { navigated: !0 };
2907
+ return n && br(n), r || Ne(), window.location.assign(i.href), { navigated: !0 };
2908
2908
  } catch (t) {
2909
2909
  console.warn("[FlowEngage] shadowNavigate error:", t), n && br(n);
2910
2910
  try {
@@ -3325,7 +3325,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3325
3325
  message: "Looks like you're already on this page!",
3326
3326
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
3327
3327
  }]);
3328
- }, []), [D, O] = m(ge().isOpen), [k, A] = m(ge().activeScreen), [j, M] = m(ge().isHumanHandled), [N, oe] = m(ge().agentName), [P, se] = m(ge().agentHeadshot), [F, le] = m(() => ve(i?.siteId)), [fe, be] = m(!1), [xe, I] = m(!1), [R, Se] = m("idle"), [Ce, we] = m(!1), [Te, Ee] = m(!1), [De, Oe] = m(""), [Ae, je] = m(!1), [Me, Ne] = m(0), [Pe, Fe] = m(0), [Ie, Le] = m(!1), [z, Re] = m(null), [B, He] = m(null), [Ue, V] = m("idle"), [We, Ge] = m(null), [Ke, qe] = m(!1), [Je, Ye] = m(""), [Xe, Ze] = m(!1), H = p(null), U = p(null), Qe = p(""), $e = p(!1), W = p(null), et = p(null), tt = p(null), nt = p(null), rt = p(null), it = p(null), at = p(null), ot = p(!1), st = p({
3328
+ }, []), [D, O] = m(_e().isOpen), [k, A] = m(_e().activeScreen), [j, re] = m(_e().isHumanHandled), [M, se] = m(_e().agentName), [N, ce] = m(_e().agentHeadshot), [P, ue] = m(() => ye(i?.siteId)), [pe, xe] = m(!1), [Se, F] = m(!1), [L, Ce] = m("idle"), [we, Te] = m(!1), [Ee, De] = m(!1), [Oe, ke] = m(""), [je, Me] = m(!1), [Ne, Pe] = m(0), [Fe, Ie] = m(0), [Le, Re] = m(!1), [R, ze] = m(null), [B, He] = m(null), [Ue, V] = m("idle"), [We, Ge] = m(null), [Ke, qe] = m(!1), [Je, Ye] = m(""), [Xe, Ze] = m(!1), H = p(null), U = p(null), Qe = p(""), $e = p(!1), W = p(null), et = p(null), tt = p(null), nt = p(null), rt = p(null), it = p(null), at = p(null), ot = p(!1), st = p({
3329
3329
  url: null,
3330
3330
  at: 0
3331
3331
  }), ct = o((e, t) => {
@@ -3342,23 +3342,23 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3342
3342
  url: n,
3343
3343
  at: Date.now()
3344
3344
  }, Ar(e, t));
3345
- }, []), G = p([]), lt = p(null), ut = p(null), dt = p(null), ft = p(!1), pt = p(!1), mt = p(""), ht = p(null), gt = p(null), _t = p([]), vt = p(0), yt = p(N), bt = p([]), xt = p(!1), St = p(!1), Ct = p(i), wt = p({
3345
+ }, []), G = p([]), lt = p(null), ut = p(null), dt = p(null), ft = p(!1), pt = p(!1), mt = p(""), ht = p(null), gt = p(null), _t = p([]), vt = p(0), yt = p(M), bt = p([]), xt = p(!1), St = p(!1), Ct = p(i), wt = p({
3346
3346
  notifyRouteChange: () => {},
3347
3347
  cleanup: () => {}
3348
3348
  }), Tt = o((e = {}) => {
3349
3349
  let t = !!e.is_human_handled;
3350
- return M(t), t ? (A("agent"), e.agent_info?.name && oe(e.agent_info.name), e.agent_info?.headshot && se(e.agent_info.headshot), t) : (A("ai"), t);
3350
+ return re(t), t ? (A("agent"), e.agent_info?.name && se(e.agent_info.name), e.agent_info?.headshot && ce(e.agent_info.headshot), t) : (A("ai"), t);
3351
3351
  }, []), Et = f(() => {
3352
3352
  let e = _?.widgetSettings?.call?.maxDurationSeconds ?? i?.widgetSettings?.call?.maxDurationSeconds ?? i?.callMaxDurationSeconds, t = Number(e);
3353
3353
  return Number.isFinite(t) && t > 0 ? t : te;
3354
3354
  }, [i, _]);
3355
3355
  c(() => {
3356
- et.current = z;
3357
- }, [z]), c(() => {
3358
- yt.current = N;
3359
- }, [N]), c(() => {
3360
- St.current = Ae;
3361
- }, [Ae]), c(() => {
3356
+ et.current = R;
3357
+ }, [R]), c(() => {
3358
+ yt.current = M;
3359
+ }, [M]), c(() => {
3360
+ St.current = je;
3361
+ }, [je]), c(() => {
3362
3362
  Ct.current = i;
3363
3363
  }, [i]);
3364
3364
  let Dt = () => {
@@ -3367,17 +3367,17 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3367
3367
  dt.current &&= (window.clearTimeout(dt.current), null);
3368
3368
  }, []), kt = (e) => {
3369
3369
  let t = typeof e == "string" ? e.trim().toLowerCase() : "";
3370
- return le(t), ye(t, i?.siteId), t;
3370
+ return ue(t), be(t, i?.siteId), t;
3371
3371
  };
3372
3372
  c(() => {
3373
3373
  let e = i?.siteId;
3374
3374
  if (!e) return;
3375
- let t = ve(e);
3375
+ let t = ye(e);
3376
3376
  if (t) {
3377
- le(t);
3377
+ ue(t);
3378
3378
  return;
3379
3379
  }
3380
- le((t) => (t && ye(t, e), t));
3380
+ ue((t) => (t && be(t, e), t));
3381
3381
  }, [i?.siteId]);
3382
3382
  let At = (e = "unspecified") => {
3383
3383
  let t = lt.current || it.current?.callId, n = vt.current, r = ht.current;
@@ -3407,7 +3407,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3407
3407
  } catch {}
3408
3408
  gt.current = null;
3409
3409
  }
3410
- tt.current &&= (tt.current.close(), null), nt.current &&= (nt.current.getTracks().forEach((e) => e.stop()), null), rt.current &&= (rt.current.srcObject = null, rt.current.remove(), null), Ot(), it.current = null, G.current = [], lt.current = null, ut.current = null, ft.current = !1, qe(!1), Re(null), He(null), V("idle"), Ge(null);
3410
+ tt.current &&= (tt.current.close(), null), nt.current &&= (nt.current.getTracks().forEach((e) => e.stop()), null), rt.current &&= (rt.current.srcObject = null, rt.current.remove(), null), Ot(), it.current = null, G.current = [], lt.current = null, ut.current = null, ft.current = !1, qe(!1), ze(null), He(null), V("idle"), Ge(null);
3411
3411
  }, jt = (e = (/* @__PURE__ */ new Date()).toISOString()) => {
3412
3412
  let t = H.current, n = lt.current || it.current?.callId;
3413
3413
  if (!(!t?.connected || !n || ft.current)) {
@@ -3459,7 +3459,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3459
3459
  if (!e.callId) return;
3460
3460
  let t = ut.current === e.callId, n = lt.current === e.callId, r = et.current?.callId === e.callId;
3461
3461
  if (!(!t && !n && !r)) {
3462
- if (Ot(), Re(null), t || n) {
3462
+ if (Ot(), ze(null), t || n) {
3463
3463
  lt.current = e.callId, He(e.callId), V((e) => e === "connected" ? e : "connecting"), O(!0);
3464
3464
  return;
3465
3465
  }
@@ -3473,7 +3473,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3473
3473
  At();
3474
3474
  return;
3475
3475
  }
3476
- ut.current = null, it.current = null, G.current = [], Re(null), V("idle");
3476
+ ut.current = null, it.current = null, G.current = [], ze(null), V("idle");
3477
3477
  }
3478
3478
  }, Pt = async (e = {}) => {
3479
3479
  let t = tt.current, n = H.current, r = e.sdpOffer || e.offer?.sdp;
@@ -3507,44 +3507,44 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3507
3507
  });
3508
3508
  };
3509
3509
  c(() => {
3510
- _e({
3510
+ ve({
3511
3511
  isOpen: D,
3512
3512
  activeScreen: k,
3513
3513
  isHumanHandled: j,
3514
- agentName: N,
3515
- agentHeadshot: P
3514
+ agentName: M,
3515
+ agentHeadshot: N
3516
3516
  });
3517
3517
  }, [
3518
3518
  D,
3519
3519
  k,
3520
3520
  j,
3521
- N,
3522
- P
3521
+ M,
3522
+ N
3523
3523
  ]), c(() => {
3524
3524
  let e = !0;
3525
3525
  return (async () => {
3526
3526
  Ze(!0);
3527
3527
  try {
3528
- let t = E(i), n = await Be(t);
3528
+ let t = E(i), n = await Ve(t);
3529
3529
  if (!e) return;
3530
- let a = t.siteId, o = pe(a), s = L(a), c = "";
3530
+ let a = t.siteId, o = me(a), s = I(a), c = "";
3531
3531
  try {
3532
3532
  let e = $e.current, r = W.current;
3533
- if ($e.current = !1, W.current = null, c = (await ze({
3533
+ if ($e.current = !1, W.current = null, c = (await Be({
3534
3534
  apiBaseUrl: t.apiBaseUrl,
3535
3535
  userId: n.userId,
3536
3536
  siteId: a,
3537
- priorChatId: e || r ? null : o || re(),
3537
+ priorChatId: e || r ? null : o || ie(),
3538
3538
  forceNew: e,
3539
3539
  resumeChatId: r,
3540
3540
  visitorId: s
3541
3541
  }))?.data?.chatId, !c) throw Error("resolve-session returned no chatId");
3542
- ie(), he(a, c);
3542
+ ae(), ge(a, c);
3543
3543
  } catch (e) {
3544
- console.warn("[FlowEngageProvider] resolve-session failed, reusing persisted or ephemeral chat id", e?.message || e), c = o || ae(), he(a, c);
3544
+ console.warn("[FlowEngageProvider] resolve-session failed, reusing persisted or ephemeral chat id", e?.message || e), c = o || oe(), ge(a, c);
3545
3545
  }
3546
3546
  Qe.current = c;
3547
- let l = Ve({
3547
+ let l = z({
3548
3548
  apiBaseUrl: t.apiBaseUrl,
3549
3549
  userId: n.userId,
3550
3550
  siteId: t.siteId,
@@ -3561,23 +3561,23 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3561
3561
  siteId: t.siteId
3562
3562
  });
3563
3563
  H.current = f, f.on("connect", async () => {
3564
- Se("connected");
3564
+ Ce("connected");
3565
3565
  let e = Qe.current;
3566
3566
  if (e && U.current) try {
3567
3567
  Tt(await U.current.checkHumanHandled(e));
3568
3568
  } catch {}
3569
3569
  }), f.on("disconnect", () => {
3570
- Se("disconnected");
3570
+ Ce("disconnected");
3571
3571
  }), f.on("aiTyping", () => {
3572
- I(!0);
3572
+ F(!0);
3573
3573
  }), f.on("ai:typing", () => {
3574
- I(!0);
3574
+ F(!0);
3575
3575
  }), f.on("messageReceived", (e) => {
3576
3576
  let t = e.message || e, n = {
3577
3577
  ...t,
3578
3578
  message: fi(t.message)
3579
3579
  };
3580
- I(!1), be(!1), !(n.type === "call_recording" || typeof n.message == "string" && n.message.includes("AI chat recording")) && S((e) => [...e.filter((e) => !e.isPending), {
3580
+ F(!1), xe(!1), !(n.type === "call_recording" || typeof n.message == "string" && n.message.includes("AI chat recording")) && S((e) => [...e.filter((e) => !e.isPending), {
3581
3581
  ...n,
3582
3582
  isPending: !1,
3583
3583
  id: n.messageId || `${n.sender}-${Date.now()}-${Math.random()}`
@@ -3595,7 +3595,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3595
3595
  ...t,
3596
3596
  message: fi(t.message)
3597
3597
  };
3598
- I(!1), !(n.type === "call_recording" || typeof n.message == "string" && n.message.includes("AI chat recording")) && ((n.sender === "agent" || n.agent_name || n.sender === "ai" || n.sender === "bot") && be(!1), S((e) => n.sender === "bot" || n.sender === "ai" ? [...e, {
3598
+ F(!1), !(n.type === "call_recording" || typeof n.message == "string" && n.message.includes("AI chat recording")) && ((n.sender === "agent" || n.agent_name || n.sender === "ai" || n.sender === "bot") && xe(!1), S((e) => n.sender === "bot" || n.sender === "ai" ? [...e, {
3599
3599
  ...n,
3600
3600
  isPending: !1,
3601
3601
  id: n.messageId || `${n.sender}-${Date.now()}-${Math.random()}`
@@ -3607,11 +3607,11 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3607
3607
  ...n,
3608
3608
  isPending: !1,
3609
3609
  id: n.messageId || `${n.sender}-${Date.now()}-${Math.random()}`
3610
- }]), (n.sender === "agent" || n.agent_name) && (M(!0), A("agent"), oe(_i([
3610
+ }]), (n.sender === "agent" || n.agent_name) && (re(!0), A("agent"), se(_i([
3611
3611
  n.agent_name,
3612
3612
  n.agentName,
3613
3613
  n.metadata?.agentName
3614
- ], d)), n.sender_headshot && se(n.sender_headshot), O(!0), Ne((e) => e + 1)));
3614
+ ], d)), n.sender_headshot && ce(n.sender_headshot), O(!0), Pe((e) => e + 1)));
3615
3615
  });
3616
3616
  let p = (e = {}) => {
3617
3617
  let t = _i([
@@ -3620,7 +3620,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3620
3620
  e.agent_name,
3621
3621
  yt.current
3622
3622
  ], d);
3623
- M(!0), A("agent"), oe(t), se(e.agent?.headshot || null), O(!0), Ne((e) => e + 1), S((e) => vi(e, {
3623
+ re(!0), A("agent"), se(t), ce(e.agent?.headshot || null), O(!0), Pe((e) => e + 1), S((e) => vi(e, {
3624
3624
  id: `agent-joined-${Date.now()}`,
3625
3625
  sender: "system",
3626
3626
  message: `${t} has joined the chat.`,
@@ -3634,7 +3634,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3634
3634
  e.agent_name,
3635
3635
  yt.current
3636
3636
  ], d);
3637
- M(!1), A("ai"), S((e) => vi(e, {
3637
+ re(!1), A("ai"), S((e) => vi(e, {
3638
3638
  id: `agent-left-${Date.now()}`,
3639
3639
  sender: "system",
3640
3640
  message: `${t} has left the chat.`,
@@ -3643,7 +3643,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3643
3643
  }));
3644
3644
  };
3645
3645
  f.on("agent:joined", p), f.on("agentJoined", p), f.on("agent:left", m), f.on("agentLeft", m), f.on("conversationEnded", (e) => {
3646
- Le(!0);
3646
+ Re(!0);
3647
3647
  let t = e?.message || "This conversation has ended. Thank you for reaching out!";
3648
3648
  S((e) => [...e, {
3649
3649
  id: `conversation-ended-${Date.now()}`,
@@ -3654,15 +3654,15 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3654
3654
  }]);
3655
3655
  }), f.on("chat:history_update", (e) => {
3656
3656
  let t = pi(e.chat_history || []);
3657
- S(t), t.length === 0 && (Le(!1), M(!1), A("ai"), I(!1), be(!1));
3657
+ S(t), t.length === 0 && (Re(!1), re(!1), A("ai"), F(!1), xe(!1));
3658
3658
  }), f.on("conversation:reset", () => {
3659
- S([]), Le(!1), M(!1), A("ai"), I(!1), be(!1);
3659
+ S([]), Re(!1), re(!1), A("ai"), F(!1), xe(!1);
3660
3660
  }), f.on("voice:end_session", (e = {}) => {
3661
- console.log("[FlowEngageProvider] voice:end_session received — ending voice session"), Fe((e) => e + 1), O(!0), Ne((e) => e + 1);
3661
+ console.log("[FlowEngageProvider] voice:end_session received — ending voice session"), Ie((e) => e + 1), O(!0), Pe((e) => e + 1);
3662
3662
  }), f.on("typing:start", (e) => {
3663
- e.sender === "agent" && be(!0);
3663
+ e.sender === "agent" && xe(!0);
3664
3664
  }), f.on("typing:stop", (e) => {
3665
- e.sender === "agent" && be(!1);
3665
+ e.sender === "agent" && xe(!1);
3666
3666
  }), f.on("call:incoming", (e = {}) => {
3667
3667
  let t = _i([
3668
3668
  e.agentName,
@@ -3670,12 +3670,12 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3670
3670
  e.agent?.name,
3671
3671
  yt.current
3672
3672
  ], "Agent");
3673
- Dt(), Ot(), ft.current = !1, Re({
3673
+ Dt(), Ot(), ft.current = !1, ze({
3674
3674
  callId: e.callId,
3675
3675
  from: e.from || "owner",
3676
3676
  agentId: e.agentId || null,
3677
3677
  agentName: t
3678
- }), oe((e) => _i([t, e], "Agent")), V("incoming"), Ge(null), O(!0);
3678
+ }), se((e) => _i([t, e], "Agent")), V("incoming"), Ge(null), O(!0);
3679
3679
  }), f.on("call:offer", async (e = {}) => {
3680
3680
  it.current = e;
3681
3681
  try {
@@ -3718,10 +3718,10 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3718
3718
  if (!e.callId) return;
3719
3719
  let t = ut.current === e.callId, n = lt.current === e.callId, r = it.current?.callId === e.callId, i = et.current?.callId === e.callId;
3720
3720
  if (!t && !n && !r) {
3721
- i && (Re(null), V("idle"));
3721
+ i && (ze(null), V("idle"));
3722
3722
  return;
3723
3723
  }
3724
- ft.current = !0, ut.current = null, lt.current = e.callId, He(e.callId), Re(null), V("connected"), Ge(e.connectedAt || (/* @__PURE__ */ new Date()).toISOString()), O(!0);
3724
+ ft.current = !0, ut.current = null, lt.current = e.callId, He(e.callId), ze(null), V("connected"), Ge(e.connectedAt || (/* @__PURE__ */ new Date()).toISOString()), O(!0);
3725
3725
  }), f.on("call:unavailable", (e = {}) => {
3726
3726
  At("socket:call_unavailable"), Ye(hi(e, "This visitor is not available for a call right now.")), O(!0);
3727
3727
  }), f.on("call:error", (e = {}) => {
@@ -3750,7 +3750,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3750
3750
  });
3751
3751
  let h = await l.loadHistory(c, r);
3752
3752
  if (!e) return;
3753
- S(pi(h.chat_history || [])), M(!!h.is_human_handled), A(h.is_human_handled ? "agent" : k);
3753
+ S(pi(h.chat_history || [])), re(!!h.is_human_handled), A(h.is_human_handled ? "agent" : k);
3754
3754
  let g = h?.visitor_email || h?.visitorEmail;
3755
3755
  if (g && String(g).trim() && kt(String(g).trim()), await new Promise((e) => setTimeout(e, 500)), !e) return;
3756
3756
  u("ready");
@@ -3768,11 +3768,11 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3768
3768
  r,
3769
3769
  a
3770
3770
  ]), c(() => () => {
3771
- if (Ae && !xt.current && bt.current.length > 0) {
3771
+ if (je && !xt.current && bt.current.length > 0) {
3772
3772
  let e = Qe.current, t = bt.current, n = U.current;
3773
3773
  n && e && t.length > 0 && (console.log("[FlowEngageProvider] safety-net: syncing voice transcript on unmount"), n.beaconSyncVoice(e, t) || n.syncVoice(e, t).catch(() => {}), xt.current = !0);
3774
3774
  }
3775
- }, [Ae, _]);
3775
+ }, [je, _]);
3776
3776
  let Ft = p(null);
3777
3777
  c(() => {
3778
3778
  let e = U.current;
@@ -3785,8 +3785,8 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3785
3785
  return window.addEventListener("pagehide", e), () => window.removeEventListener("pagehide", e);
3786
3786
  }, []);
3787
3787
  let It = async () => {
3788
- if (!(!z?.callId || !U.current || !H.current || !y)) {
3789
- Dt(), ut.current = z.callId, Ot();
3788
+ if (!(!R?.callId || !U.current || !H.current || !y)) {
3789
+ Dt(), ut.current = R.callId, Ot();
3790
3790
  try {
3791
3791
  let e = await navigator.mediaDevices.getUserMedia({ audio: !0 });
3792
3792
  nt.current = e;
@@ -3828,7 +3828,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3828
3828
  if (!e.candidate || !H.current?.connected) return;
3829
3829
  let t = e.candidate;
3830
3830
  H.current.emit("call:ice-candidate", {
3831
- callId: z.callId,
3831
+ callId: R.callId,
3832
3832
  candidate: t.candidate,
3833
3833
  sdpMid: t.sdpMid,
3834
3834
  sdpMLineIndex: t.sdpMLineIndex,
@@ -3842,7 +3842,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3842
3842
  e.id = "flowengage-remote-audio", e.autoplay = !0, e.playsInline = !0, e.onplay = () => {}, e.onpause = () => {}, e.onended = () => {}, e.onerror = (e) => {}, rt.current = e, document.body.appendChild(e);
3843
3843
  }
3844
3844
  rt.current.srcObject = e.streams[0];
3845
- let r = z?.callId, i = r && (ut.current === r || lt.current === r);
3845
+ let r = R?.callId, i = r && (ut.current === r || lt.current === r);
3846
3846
  if (!ft.current && i) {
3847
3847
  let e = (/* @__PURE__ */ new Date()).toISOString();
3848
3848
  V("connected"), Ge((t) => t || e), lt.current = r, He(r), jt(e);
@@ -3853,15 +3853,15 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3853
3853
  };
3854
3854
  let r = it.current;
3855
3855
  r && (console.log("[FlowEngageProvider] found pending remote offer during accept", {
3856
- callId: r.callId || z.callId,
3856
+ callId: r.callId || R.callId,
3857
3857
  chatId: y
3858
3858
  }), await Pt({
3859
3859
  ...r,
3860
- callId: r.callId || z.callId
3861
- })), await U.current.acceptCall(z.callId, y), H.current?.emit("call:accepted", {
3862
- callId: z.callId,
3860
+ callId: r.callId || R.callId
3861
+ })), await U.current.acceptCall(R.callId, y), H.current?.emit("call:accepted", {
3862
+ callId: R.callId,
3863
3863
  chatId: y
3864
- }), lt.current = z.callId, He(z.callId), V((e) => e === "connected" || ft.current ? "connected" : "connecting"), Re(null), O(!0);
3864
+ }), lt.current = R.callId, He(R.callId), V((e) => e === "connected" || ft.current ? "connected" : "connecting"), ze(null), O(!0);
3865
3865
  } catch (e) {
3866
3866
  if (ut.current = null, At("accept_call_failed"), e?.status === 404 || e?.status === 409 || e?.status === 422) {
3867
3867
  Ye(hi(e, "This visitor call is no longer available."));
@@ -3869,7 +3869,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3869
3869
  }
3870
3870
  if (e?.name === "NotAllowedError" || e?.name === "PermissionDeniedError") {
3871
3871
  try {
3872
- await U.current.rejectCall(z.callId, y);
3872
+ await U.current.rejectCall(R.callId, y);
3873
3873
  } catch (e) {
3874
3874
  console.error("[FlowEngageProvider] failed to reject call after microphone denial", e);
3875
3875
  }
@@ -3880,11 +3880,11 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3880
3880
  }
3881
3881
  }
3882
3882
  }, Lt = async () => {
3883
- if (!z?.callId || !U.current || !y) {
3883
+ if (!R?.callId || !U.current || !y) {
3884
3884
  At("reject_call_without_server_context");
3885
3885
  return;
3886
3886
  }
3887
- let e = z.callId;
3887
+ let e = R.callId;
3888
3888
  Ot(), Dt(), H.current?.emit("call:rejected", {
3889
3889
  callId: e,
3890
3890
  chatId: y,
@@ -3899,11 +3899,11 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3899
3899
  }
3900
3900
  }, Rt = p(Lt);
3901
3901
  Rt.current = Lt, c(() => {
3902
- if (!z?.callId || B) {
3902
+ if (!R?.callId || B) {
3903
3903
  Ot();
3904
3904
  return;
3905
3905
  }
3906
- let e = z.callId;
3906
+ let e = R.callId;
3907
3907
  return Ot(), dt.current = window.setTimeout(() => {
3908
3908
  et.current?.callId === e && ut.current !== e && lt.current !== e && Rt.current();
3909
3909
  }, ne), () => {
@@ -3912,7 +3912,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3912
3912
  }, [
3913
3913
  B,
3914
3914
  Ot,
3915
- z?.callId
3915
+ R?.callId
3916
3916
  ]);
3917
3917
  let zt = async () => {
3918
3918
  if (!B || !U.current || !y) {
@@ -3991,7 +3991,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
3991
3991
  }
3992
3992
  let qt = async (e, t = "", n = null, a = {}) => {
3993
3993
  let o = typeof e == "string" ? e.trim() : "";
3994
- if (!o || !U.current || !y || l !== "ready" || Ie) return;
3994
+ if (!o || !U.current || !y || l !== "ready" || Le) return;
3995
3995
  Wt(), ot.current = !1;
3996
3996
  let s = /^\s*(yes|yeah|sure|ok|okay|go ahead|take me(?: there)?(?!\s+\w)|navigate(?!\s+(?:me\s+)?to\s+\w)|yep|absolutely|please do|do it|let'?s go|go there|show me(?!\s+(?:the|a|an)\s+\w)|go to it|bring me there|navigate me there)\b/i, c = /^\s*(?:yes|yeah|sure|ok|okay|yep|absolutely)\s+(?!(?:please|do\s+it|let'?s|that|this|there|it|thanks|go|cool|great|perfect|sounds|alright|proceed)\b)\w/i, u = /\b(take me|navigate|go to|show me|bring me|open|go there|navigate to|take me to|let'?s go to)\b/i;
3997
3997
  if (at.current && s.test(o) && !c.test(o)) {
@@ -4027,17 +4027,17 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
4027
4027
  chatId: y,
4028
4028
  content: e,
4029
4029
  sender: "user",
4030
- email: F || void 0,
4030
+ email: P || void 0,
4031
4031
  type: a?.type || "text",
4032
4032
  metadata: a?.metadata || {},
4033
4033
  ...n || {}
4034
4034
  });
4035
4035
  return;
4036
4036
  }
4037
- we(!0);
4037
+ Te(!0);
4038
4038
  try {
4039
4039
  let s = await Ur(), c = Vr(), l = `stream-preview-${Date.now().toString(36)}`, d = (e) => {
4040
- I(!1), S((t) => {
4040
+ F(!1), S((t) => {
4041
4041
  let n = t.findIndex((e) => e.id === l);
4042
4042
  if (n === -1) return [...t, {
4043
4043
  id: l,
@@ -4054,14 +4054,14 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
4054
4054
  });
4055
4055
  }, f = await U.current.sendAiMessage(y, e, r, t, {
4056
4056
  ...n || {},
4057
- ...F ? { email: F } : {}
4057
+ ...P ? { email: P } : {}
4058
4058
  }, {
4059
4059
  ...a,
4060
4060
  currentPageUrl: typeof window < "u" ? window.location.href : void 0,
4061
4061
  currentPageTitle: typeof window < "u" ? document.title : void 0,
4062
4062
  currentPagePath: typeof window < "u" ? window.location.pathname : void 0,
4063
4063
  currentPageContent: Kt() || void 0,
4064
- navPreference: ce(i?.siteId) || void 0,
4064
+ navPreference: le(i?.siteId) || void 0,
4065
4065
  ...s ? { shopifyCart: s } : {},
4066
4066
  ...c ? { shopifyCustomerId: c } : {}
4067
4067
  }, d), p = f.chat_history || [];
@@ -4087,7 +4087,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
4087
4087
  }, 300);
4088
4088
  })) : (at.current = e, console.log("[FWH Nav] Stored pending nav →", at.current));
4089
4089
  let t = i?.siteId;
4090
- t && !ue(t) && (de(t), S((e) => [...e, {
4090
+ t && !de(t) && (fe(t), S((e) => [...e, {
4091
4091
  id: `nav-pref-${Date.now()}`,
4092
4092
  type: "nav_pref_choice",
4093
4093
  sender: "system",
@@ -4140,14 +4140,14 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
4140
4140
  });
4141
4141
  }
4142
4142
  }
4143
- S(pi(p)), Array.isArray(f.cart_actions) && f.cart_actions.length && w(f.cart_actions), M(!!f.is_human_handled), A(f.is_human_handled ? "agent" : "ai"), I(!1), we(!1), await U.current.updateChatStatus(y, "messageSent");
4143
+ S(pi(p)), Array.isArray(f.cart_actions) && f.cart_actions.length && w(f.cart_actions), re(!!f.is_human_handled), A(f.is_human_handled ? "agent" : "ai"), F(!1), Te(!1), await U.current.updateChatStatus(y, "messageSent");
4144
4144
  } catch (e) {
4145
4145
  S((e) => e.filter((e) => !e.isStreaming).map((e) => e.id === d ? {
4146
4146
  ...e,
4147
4147
  isPending: !1,
4148
4148
  failed: !0
4149
- } : e)), I(!1), we(!1), e.status === 429 ? (Ee(!0), Oe(e.message), window.setTimeout(() => {
4150
- Ee(!1), Oe("");
4149
+ } : e)), F(!1), Te(!1), e.status === 429 ? (De(!0), ke(e.message), window.setTimeout(() => {
4150
+ De(!1), ke("");
4151
4151
  }, ee)) : h(e);
4152
4152
  }
4153
4153
  }, Jt = async (e) => {
@@ -4159,12 +4159,12 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
4159
4159
  let t = e ? "voice" : "text";
4160
4160
  await U.current.setChatMode(y, t);
4161
4161
  } catch {}
4162
- je(e), e && (xt.current = !1);
4162
+ Me(e), e && (xt.current = !1);
4163
4163
  }
4164
4164
  }, Xt = async (e) => {
4165
4165
  if (xt.current) return;
4166
4166
  if (xt.current = !0, !U.current || !y || !e?.length) {
4167
- je(!1);
4167
+ Me(!1);
4168
4168
  return;
4169
4169
  }
4170
4170
  let t = () => {
@@ -4188,11 +4188,11 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
4188
4188
  } catch {
4189
4189
  t();
4190
4190
  } finally {
4191
- je(!1);
4191
+ Me(!1);
4192
4192
  }
4193
4193
  }, Zt = async () => {
4194
4194
  if (!(!U.current || !y)) {
4195
- Ae && !xt.current && bt.current.length > 0 && await Xt(bt.current);
4195
+ je && !xt.current && bt.current.length > 0 && await Xt(bt.current);
4196
4196
  try {
4197
4197
  await U.current.endConversation(y);
4198
4198
  } catch {
@@ -4200,7 +4200,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
4200
4200
  await U.current.updateChatStatus(y, "ended");
4201
4201
  } catch {}
4202
4202
  }
4203
- Le(!0), S((e) => [...e, {
4203
+ Re(!0), S((e) => [...e, {
4204
4204
  id: `conversation-ended-${Date.now()}`,
4205
4205
  sender: "system",
4206
4206
  message: "This conversation has ended. Thank you for reaching out!",
@@ -4226,7 +4226,7 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
4226
4226
  let e = () => {
4227
4227
  let e = Qe.current, t = U.current;
4228
4228
  if (!t || !e) return;
4229
- if (St.current && bt.current.length > 0 && ke(), !xt.current && bt.current.length > 0 && (t.beaconSyncVoice(e, bt.current) || t.syncVoice(e, bt.current).catch(() => {}), xt.current = !0), lt.current) {
4229
+ if (St.current && bt.current.length > 0 && Ae(), !xt.current && bt.current.length > 0 && (t.beaconSyncVoice(e, bt.current) || t.syncVoice(e, bt.current).catch(() => {}), xt.current = !0), lt.current) {
4230
4230
  t.beaconEndWebRTCCall(lt.current, e);
4231
4231
  return;
4232
4232
  }
@@ -4239,9 +4239,9 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
4239
4239
  }, []);
4240
4240
  let Qt = o(() => {
4241
4241
  let e = i?.siteId;
4242
- me(e), $e.current = !0, W.current = null, H.current?.disconnect(), S([]), b(""), Qe.current = "", Le(!1), M(!1), oe(null), se(null), Ze(!0), s((e) => e + 1);
4242
+ he(e), $e.current = !0, W.current = null, H.current?.disconnect(), S([]), b(""), Qe.current = "", Re(!1), re(!1), se(null), ce(null), Ze(!0), s((e) => e + 1);
4243
4243
  }, [i?.siteId]), $t = o((e) => {
4244
- i?.siteId, $e.current = !1, W.current = e, H.current?.disconnect(), S([]), b(""), Qe.current = "", Le(!1), M(!1), oe(null), se(null), Ze(!0), s((e) => e + 1);
4244
+ i?.siteId, $e.current = !1, W.current = e, H.current?.disconnect(), S([]), b(""), Qe.current = "", Re(!1), re(!1), se(null), ce(null), Ze(!0), s((e) => e + 1);
4245
4245
  }, [i?.siteId]), en = f(() => ({
4246
4246
  status: l,
4247
4247
  error: d,
@@ -4252,21 +4252,21 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
4252
4252
  isOpen: D,
4253
4253
  activeScreen: k,
4254
4254
  isHumanHandled: j,
4255
- agentName: N,
4256
- agentHeadshot: P,
4257
- visitorEmail: F,
4258
- isAgentTyping: fe,
4259
- isAiTyping: xe,
4260
- connectionStatus: R,
4261
- isLoading: Ce,
4262
- isVoiceMode: Ae,
4263
- isRateLimited: Te,
4264
- rateLimitMessage: De,
4265
- isConversationEnded: Ie,
4255
+ agentName: M,
4256
+ agentHeadshot: N,
4257
+ visitorEmail: P,
4258
+ isAgentTyping: pe,
4259
+ isAiTyping: Se,
4260
+ connectionStatus: L,
4261
+ isLoading: we,
4262
+ isVoiceMode: je,
4263
+ isRateLimited: Ee,
4264
+ rateLimitMessage: Oe,
4265
+ isConversationEnded: Le,
4266
4266
  isSessionRestoring: Xe,
4267
- openToChatCounter: Me,
4268
- voiceEndCounter: Pe,
4269
- incomingCall: z,
4267
+ openToChatCounter: Ne,
4268
+ voiceEndCounter: Fe,
4269
+ incomingCall: R,
4270
4270
  activeCallId: B,
4271
4271
  callConnectionState: Ue,
4272
4272
  callConnectedAt: We,
@@ -4317,21 +4317,21 @@ function yi({ siteId: e, config: t, children: n, language: r = "en" }) {
4317
4317
  D,
4318
4318
  k,
4319
4319
  j,
4320
+ M,
4320
4321
  N,
4321
4322
  P,
4322
- F,
4323
- fe,
4324
- xe,
4325
- R,
4326
- Ce,
4327
- Ae,
4328
- Te,
4329
- De,
4330
- Ie,
4323
+ pe,
4324
+ Se,
4325
+ L,
4326
+ we,
4327
+ je,
4328
+ Ee,
4329
+ Oe,
4330
+ Le,
4331
4331
  Xe,
4332
- Me,
4333
- Pe,
4334
- z,
4332
+ Ne,
4333
+ Fe,
4334
+ R,
4335
4335
  B,
4336
4336
  Ue,
4337
4337
  We,
@@ -9349,7 +9349,7 @@ async function Dh(e, t, n) {
9349
9349
  let r = new URLSearchParams({ siteId: t || "" });
9350
9350
  n && r.set("chatId", n);
9351
9351
  let i = Vr();
9352
- i && r.set("shopifyCustomerId", String(i)), ce(t) === "auto" && r.set("navPreference", "auto");
9352
+ i && r.set("shopifyCustomerId", String(i)), le(t) === "auto" && r.set("navPreference", "auto");
9353
9353
  let a = await fetch(`${e}/api/voice/session?${r.toString()}`, {
9354
9354
  method: "GET",
9355
9355
  headers: { "Content-Type": "application/json" }
@@ -9405,52 +9405,52 @@ async function Oh(e) {
9405
9405
  }
9406
9406
  }, k = (e, t, n) => {
9407
9407
  t && (E.role && E.role !== e && O(), E.role = e, E.text = E.text ? `${E.text} ${t}`.replace(/\s+/g, " ") : t, n && (E.debug = n), E.timer && clearTimeout(E.timer), E.timer = setTimeout(O, lh));
9408
- }, A = !1, ee = !1, te = !1, ne = !1, j = !1, M = !0, re = 0, ie = 0, ae = !1, N = !1, oe = uh, P = null, se = !1, F = !1, ce = () => {
9409
- P && clearTimeout(P);
9408
+ }, A = !1, ee = !1, te = !1, ne = !1, j = !1, re = !0, ie = 0, ae = 0, oe = !1, M = !1, se = uh, N = null, ce = !1, P = !1, le = () => {
9409
+ N && clearTimeout(N);
9410
9410
  let e = () => {
9411
9411
  if (!A) {
9412
- if (le.isPlaying()) {
9413
- P = setTimeout(e, 150);
9412
+ if (ue.isPlaying()) {
9413
+ N = setTimeout(e, 150);
9414
9414
  return;
9415
9415
  }
9416
- if (P = null, se) {
9416
+ if (N = null, ce) {
9417
9417
  p?.();
9418
9418
  return;
9419
9419
  }
9420
- !A && w.readyState === WebSocket.OPEN && w.send(JSON.stringify({ type: "PlaybackDrained" })), F && (F = !1, d?.());
9420
+ !A && w.readyState === WebSocket.OPEN && w.send(JSON.stringify({ type: "PlaybackDrained" })), P && (P = !1, d?.());
9421
9421
  }
9422
9422
  };
9423
- P = setTimeout(e, 150);
9424
- }, le = Eh(v, () => {
9423
+ N = setTimeout(e, 150);
9424
+ }, ue = Eh(v, () => {
9425
9425
  ne && (ne = !1, c?.({ mode: j ? "thinking" : "listening" }));
9426
9426
  }, y);
9427
- typeof window < "u" && (window.__fe_agentAudioPlaying = () => le.isPlaying());
9428
- let ue = v.createMediaStreamSource(_);
9429
- ue.connect(y);
9430
- let de = v.createScriptProcessor(ch, 1, 1), fe = !1;
9431
- de.onaudioprocess = (e) => {
9427
+ typeof window < "u" && (window.__fe_agentAudioPlaying = () => ue.isPlaying());
9428
+ let de = v.createMediaStreamSource(_);
9429
+ de.connect(y);
9430
+ let fe = v.createScriptProcessor(ch, 1, 1), pe = !1;
9431
+ fe.onaudioprocess = (e) => {
9432
9432
  if (A || w.readyState !== WebSocket.OPEN) return;
9433
9433
  let t = e.inputBuffer.getChannelData(0), n = () => w.send(new Int16Array(t.length).buffer);
9434
9434
  if (ee) {
9435
- te || (te = !0, console.debug("[FlowEngage] mic held — streaming silence to keep socket alive")), fe = !1, re = 0, ie = 0, n();
9435
+ te || (te = !0, console.debug("[FlowEngage] mic held — streaming silence to keep socket alive")), pe = !1, ie = 0, ae = 0, n();
9436
9436
  return;
9437
9437
  }
9438
- let r = vh(t), i = _h(t), a = le.isPlaying() || N, o = a ? oe * gh : oe, s = a ? hh : ph;
9439
- if (r >= o && i >= dh && i <= fh ? (ie = 0, re += 1) : ++ie >= mh && (re = 0), a ? fe = !1 : !fe && re >= ph ? (fe = !0, c?.({ mode: "user-speaking" })) : fe && re === 0 && (fe = !1), a && !ae && re >= s) {
9440
- ae = !0, j = !1, re = 0;
9441
- let e = le.playedMs();
9442
- le.stop(), M = !1, N = !1, P && !se && (clearTimeout(P), P = null), F = !1, w.send(JSON.stringify({
9438
+ let r = vh(t), i = _h(t), a = ue.isPlaying() || M, o = a ? se * gh : se, s = a ? hh : ph;
9439
+ if (r >= o && i >= dh && i <= fh ? (ae = 0, ie += 1) : ++ae >= mh && (ie = 0), a ? pe = !1 : !pe && ie >= ph ? (pe = !0, c?.({ mode: "user-speaking" })) : pe && ie === 0 && (pe = !1), a && !oe && ie >= s) {
9440
+ oe = !0, j = !1, ie = 0;
9441
+ let e = ue.playedMs();
9442
+ ue.stop(), re = !1, M = !1, N && !ce && (clearTimeout(N), N = null), P = !1, w.send(JSON.stringify({
9443
9443
  type: "VisitorInterrupted",
9444
9444
  played_ms: Math.round(e)
9445
9445
  })), console.debug("[FlowEngage] barge-in — visitor spoke over the agent");
9446
9446
  }
9447
9447
  w.send(yh(t).buffer);
9448
- }, ue.connect(de), de.connect(v.destination);
9449
- let pe = () => {
9448
+ }, de.connect(fe), fe.connect(v.destination);
9449
+ let me = () => {
9450
9450
  if (!A) {
9451
- A = !0, P &&= (clearTimeout(P), null), O(), le.stop(), typeof window < "u" && delete window.__fe_agentAudioPlaying;
9451
+ A = !0, N &&= (clearTimeout(N), null), O(), ue.stop(), typeof window < "u" && delete window.__fe_agentAudioPlaying;
9452
9452
  try {
9453
- de.disconnect(), ue.disconnect();
9453
+ fe.disconnect(), de.disconnect();
9454
9454
  } catch {}
9455
9455
  if (_.getTracks().forEach((e) => e.stop()), S && S.state !== "inactive") {
9456
9456
  S.onstop = () => wh(t, n, C, x, b);
@@ -9462,7 +9462,7 @@ async function Oh(e) {
9462
9462
  } else x.length && wh(t, n, C, x, b);
9463
9463
  v.close().catch(() => {}), (w.readyState === WebSocket.OPEN || w.readyState === WebSocket.CONNECTING) && w.close();
9464
9464
  }
9465
- }, me = async (e) => {
9465
+ }, he = async (e) => {
9466
9466
  let t = i[e.name];
9467
9467
  if (!t) return u?.({ tool_name: e.name }), { error: `Unknown tool ${e.name}` };
9468
9468
  let n = {};
@@ -9474,10 +9474,10 @@ async function Oh(e) {
9474
9474
  } catch (e) {
9475
9475
  return { error: e?.message || "Tool execution failed" };
9476
9476
  }
9477
- }, he = async (e) => {
9477
+ }, ge = async (e) => {
9478
9478
  for (let t of e.functions || []) {
9479
9479
  if (!t.client_side) continue;
9480
- let e = await me(t);
9480
+ let e = await he(t);
9481
9481
  if (A || w.readyState !== WebSocket.OPEN) return;
9482
9482
  w.send(JSON.stringify({
9483
9483
  type: "FunctionCallResponse",
@@ -9486,10 +9486,10 @@ async function Oh(e) {
9486
9486
  content: typeof e == "string" ? e : JSON.stringify(e ?? {})
9487
9487
  }));
9488
9488
  }
9489
- }, ge = (e) => {
9489
+ }, _e = (e) => {
9490
9490
  switch (e.type) {
9491
9491
  case "Welcome":
9492
- Number.isFinite(e.barge_in_rms) && e.barge_in_rms > 0 && (oe = e.barge_in_rms), Number.isFinite(e.barge_in_frames) && e.barge_in_frames > 0 && e.barge_in_frames, C = e.session_id || r || n || null, a?.({ conversationId: C });
9492
+ Number.isFinite(e.barge_in_rms) && e.barge_in_rms > 0 && (se = e.barge_in_rms), Number.isFinite(e.barge_in_frames) && e.barge_in_frames > 0 && e.barge_in_frames, C = e.session_id || r || n || null, a?.({ conversationId: C });
9493
9493
  break;
9494
9494
  case "ConversationText": {
9495
9495
  let t = String(e.content || "");
@@ -9508,25 +9508,25 @@ async function Oh(e) {
9508
9508
  break;
9509
9509
  }
9510
9510
  case "UserStartedSpeaking":
9511
- O(), le.stop(), N = !1, M = !1, ne = !1, j = !1, P && !se && (clearTimeout(P), P = null), F = !1, c?.({ mode: "listening" });
9511
+ O(), ue.stop(), M = !1, re = !1, ne = !1, j = !1, N && !ce && (clearTimeout(N), N = null), P = !1, c?.({ mode: "listening" });
9512
9512
  break;
9513
9513
  case "AgentStartedSpeaking":
9514
- M = !0, ne = !0, ae = !1, re = 0, c?.({ mode: "speaking" });
9514
+ re = !0, ne = !0, oe = !1, ie = 0, c?.({ mode: "speaking" });
9515
9515
  break;
9516
9516
  case "AgentAudioDone":
9517
- N = !1, O(), ce(), le.isPlaying() || (ne = !1, c?.({ mode: j ? "thinking" : "listening" }));
9517
+ M = !1, O(), le(), ue.isPlaying() || (ne = !1, c?.({ mode: j ? "thinking" : "listening" }));
9518
9518
  break;
9519
9519
  case "FunctionCallRequest":
9520
- he(e);
9520
+ ge(e);
9521
9521
  break;
9522
9522
  case "AgentPreparing":
9523
- N = !0;
9523
+ M = !0;
9524
9524
  break;
9525
9525
  case "AgentTurnComplete":
9526
- j = !1, F = !0, ce();
9526
+ j = !1, P = !0, le();
9527
9527
  break;
9528
9528
  case "SessionEnding":
9529
- console.debug("[FlowEngage] server is ending the session:", e.reason || "unspecified"), se = !0;
9529
+ console.debug("[FlowEngage] server is ending the session:", e.reason || "unspecified"), ce = !0;
9530
9530
  break;
9531
9531
  case "AgentThinking":
9532
9532
  j = !0, c?.({ mode: "thinking" });
@@ -9550,7 +9550,7 @@ async function Oh(e) {
9550
9550
  };
9551
9551
  return w.onopen = () => w.send(JSON.stringify(g)), w.onmessage = (e) => {
9552
9552
  if (e.data instanceof ArrayBuffer) {
9553
- M && le.enqueue(new Int16Array(e.data));
9553
+ re && ue.enqueue(new Int16Array(e.data));
9554
9554
  return;
9555
9555
  }
9556
9556
  let t;
@@ -9560,14 +9560,14 @@ async function Oh(e) {
9560
9560
  return;
9561
9561
  }
9562
9562
  try {
9563
- ge(t);
9563
+ _e(t);
9564
9564
  } catch (e) {
9565
9565
  console.error("[FlowEngage] voice event handler failed:", t?.type, e);
9566
9566
  }
9567
9567
  }, w.onerror = () => l?.(/* @__PURE__ */ Error("Voice connection failed")), w.onclose = () => {
9568
- pe(), o?.();
9568
+ me(), o?.();
9569
9569
  }, {
9570
- endSession: async () => pe(),
9570
+ endSession: async () => me(),
9571
9571
  sendContextualUpdate: (e) => {
9572
9572
  A || w.readyState !== WebSocket.OPEN || !e || w.send(JSON.stringify({
9573
9573
  type: "UpdatePrompt",
@@ -10400,7 +10400,7 @@ function Lg({ src: e, name: t, imgStyle: n, initialsSpanStyle: r }) {
10400
10400
  //#region src/components/MessageList.jsx
10401
10401
  function Rg({ siteId: e, onChoose: t }) {
10402
10402
  let [n, r] = m(null), i = (n) => {
10403
- le(e, n), r(n), t?.(n);
10403
+ ue(e, n), r(n), t?.(n);
10404
10404
  };
10405
10405
  return /* @__PURE__ */ g("div", {
10406
10406
  style: {
@@ -12820,7 +12820,7 @@ function T_(e) {
12820
12820
  function E_(e) {
12821
12821
  let t = e.siteId || null, n = (e.apiBaseUrl || "").replace(/\/$/, ""), r = typeof e.getLastUserVoiceText == "function" ? e.getLastUserVoiceText : null, i = typeof e.beaconSyncFullVoiceHistory == "function" ? e.beaconSyncFullVoiceHistory : null, a = [], o = {
12822
12822
  "fwh-navigate-mvp": async (n) => {
12823
- if ($("fwh-navigate-mvp ▶ raw parameters:", n), e?.isWalkthroughActive?.()) return $("fwh-navigate-mvp ✖ blocked — walkthrough in progress"), "NAVIGATION_BLOCKED_DURING_WALKTHROUGH. A walkthrough of the current page is in progress, so navigation is not allowed. Do NOT tell the visitor you navigated or offer to. Describe the requested section using the CURRENT page's own content (fwh-read-content-mvp), then stop.";
12823
+ if ($("fwh-navigate-mvp ▶ raw parameters:", n), e?.isWalkthroughActive?.()) return $("fwh-navigate-mvp ✖ blocked — walkthrough in progress"), "NAVIGATION_BLOCKED_DURING_WALKTHROUGH. A walkthrough of the current page is running, so the visitor was not moved.";
12824
12824
  let a = x_(n), o = S_(a), s = a.section_text ?? a.sectionText ?? a.section, c = Array.isArray(a.expected_landmarks) ? a.expected_landmarks : Array.isArray(a.expectedLandmarks) ? a.expectedLandmarks : [];
12825
12825
  if ($("fwh-navigate-mvp · coerced:", {
12826
12826
  url: o,
@@ -12835,17 +12835,17 @@ function E_(e) {
12835
12835
  if (e.hostname === window.location.hostname && e.origin !== window.location.origin) o = e.pathname + e.search + e.hash, $("fwh-navigate-mvp · cross-protocol same-host URL normalized →", o);
12836
12836
  else if (e.origin !== window.location.origin && /^https?:$/i.test(e.protocol)) {
12837
12837
  let t = e.hostname;
12838
- return $("fwh-navigate-mvp ✖ external URL blocked:", e.href), `EXTERNAL_LINK_BLOCKED: The URL "${o}" points to an external site (${t}) that opens in a new tab. I cannot open new tabs or navigate to external sites. Tell the visitor exactly this: "That link opens an external app — I'm not able to open it for you, but you can click the link directly in the navigation header."`;
12838
+ return $("fwh-navigate-mvp ✖ external URL blocked:", e.href), `EXTERNAL_LINK_BLOCKED: "${o}" is on another site (${t}) and opens in a new tab, which you can't open. The visitor can click that link themselves.`;
12839
12839
  }
12840
12840
  } catch {}
12841
12841
  if (typeof window < "u") {
12842
12842
  try {
12843
12843
  let e = new URL(o, window.location.href);
12844
- if (e.pathname === window.location.pathname && e.search === window.location.search) return $("fwh-navigate-mvp ✖ already on page, skipping"), "OK_ALREADY_ON_PAGE. The visitor is already on this page. Do not navigate. Proceed directly with highlights, answering the question, or reading page content.";
12844
+ if (e.pathname === window.location.pathname && e.search === window.location.search) return $("fwh-navigate-mvp ✖ already on page, skipping"), "OK_ALREADY_ON_PAGE. The visitor is already on this page, so nothing changed.";
12845
12845
  } catch {}
12846
12846
  let e = window.__fe_user_nav_during_speech;
12847
12847
  if (e && Date.now() - e.ts < 3e4) try {
12848
- if (new URL(o, window.location.href).pathname === e.fromPath) return $("flowengage_navigate ✖ blocked — would navigate back to page visitor just left", e), `NAV_BLOCKED: The visitor just left "${e.fromPageName}" and is now on "${e.toPageName}". Do NOT navigate them back. If they said "continue", resume verbally from where you left off — no navigation needed. If they want to return, they will navigate themselves.`;
12848
+ if (new URL(o, window.location.href).pathname === e.fromPath) return $("flowengage_navigate ✖ blocked — would navigate back to page visitor just left", e), `NAV_BLOCKED: the visitor just left "${e.fromPageName}" themselves and is now on "${e.toPageName}", so they were not moved back.`;
12849
12849
  } catch {}
12850
12850
  }
12851
12851
  let { allowed: l, correctedUrl: u } = await yr(o, {
@@ -12853,7 +12853,7 @@ function E_(e) {
12853
12853
  apiBaseUrl: e.apiBaseUrl
12854
12854
  });
12855
12855
  if (!l) {
12856
- let e = `PAGE_NOT_IN_SITE: "${o}" is NOT a real page on this site — do NOT guess or invent URL paths. Do NOT tell the visitor you are taking them there. Instead, find the REAL page: look at your Popular Pages / Site Pages list for the closest actual match, or call fwh-list-nav-links-mvp (to read the site's real menu links) or fwh-search-mvp (to find the right page). If a close match exists (e.g. the visitor said "support" and the site has "Technical Support"), tell them the ACTUAL page name and ask "we don't have a page called that, but we do have [real page] — would you like me to take you there?" Then navigate only to that verified URL.`;
12856
+ let e = `PAGE_NOT_IN_SITE: "${o}" is not a page on this site, so the visitor was not moved. The real pages are in your Site Pages list, fwh-list-nav-links-mvp and fwh-search-mvp.`;
12857
12857
  return $("fwh-navigate-mvp ✖ blocked", e), e;
12858
12858
  }
12859
12859
  u && u !== o && ($("fwh-navigate-mvp · corrected url:", {
@@ -12872,10 +12872,10 @@ function E_(e) {
12872
12872
  sender: "user",
12873
12873
  message: e
12874
12874
  }]);
12875
- n && Te(t, n);
12875
+ n && Ee(t, n);
12876
12876
  }
12877
12877
  } catch {}
12878
- ke();
12878
+ Ae();
12879
12879
  let e = o;
12880
12880
  try {
12881
12881
  e = new URL(o, typeof window < "u" ? window.location.href : "").href;
@@ -12885,7 +12885,7 @@ function E_(e) {
12885
12885
  let e = new URL(o, window.location.href).pathname.split("/").filter(Boolean).pop() || "";
12886
12886
  n = e ? e.replace(/[-_]/g, " ").replace(/\b\w/g, (e) => e.toUpperCase()) : "Home";
12887
12887
  } catch {}
12888
- t && typeof window < "u" && Ie(t, window.location.href, e, n), Sr(e);
12888
+ t && typeof window < "u" && Le(t, window.location.href, e, n), Sr(e);
12889
12889
  try {
12890
12890
  window.__fe_agent_nav = {
12891
12891
  path: new URL(e, window.location.href).pathname,
@@ -12905,7 +12905,7 @@ function E_(e) {
12905
12905
  let a = [], s = null, c = "", l = Date.now() + 12e3;
12906
12906
  for (; Date.now() < l && (await new Promise((e) => setTimeout(e, 300)), {headings: a, pageTitleHeading: s, introText: c} = w_(), !(a.length >= 1)););
12907
12907
  C_(), $("fwh-navigate-mvp → page headings collected:", a, "titleHeading:", s);
12908
- let u = a.length ? a.join(" | ") : "none", d = a.length ? "Use ONLY these exact heading strings for fwh-highlight-mvp — never invent or abbreviate." : "No headings collected yet — call fwh-get-current-page-mvp immediately (no speech) to get the live headings before speaking or highlighting.", f = s ? ` "${s}" is the PAGE TITLE, not a content section — do not fwh-highlight-mvp it separately; if doing a walkthrough, just fold this intro into your opening line: "${c || "(no intro text found)"}"` : c ? ` No separate page-title heading detected, but this intro text precedes the first section — mention it briefly before covering sections: "${c}"` : "", p = "";
12908
+ let u = a.length ? a.join(" | ") : "none", d = a.length ? "" : "Headings were not ready yet; fwh-get-current-page-mvp returns them.", f = s ? ` "${s}" is the page title, not a section. Intro text: "${c || "none"}".` : c ? ` Intro text before the first section: "${c}".` : "", p = "";
12909
12909
  try {
12910
12910
  if (a.length > 0) {
12911
12911
  let e = a.slice(0, 3), t = [];
@@ -12916,10 +12916,10 @@ function E_(e) {
12916
12916
  r && t.push(`[Section: ${n}] ${r}`);
12917
12917
  }
12918
12918
  }
12919
- t.length > 0 && (p = ` CONTENT FOR FIRST FEW SECTIONS: ${t.join(" | ")}. Use this content to answer immediately if the visitor asks about one of these sections.`);
12919
+ t.length > 0 && (p = ` Content of the first sections: ${t.join(" | ")}.`);
12920
12920
  }
12921
12921
  } catch {}
12922
- if (Tr()) return Cr(), $("fwh-navigate-mvp ✖ landed on a not-found/404 page:", i), `NAVIGATION_PAGE_NOT_FOUND. The page at ${i} does not exist — it shows a "not found"/404 error, not real content. Do NOT offer a page overview, do NOT describe or highlight any sections, do NOT claim the navigation succeeded. Tell the visitor EXACTLY: "It looks like that page doesn't exist — I couldn't find it. Would you like me to take you somewhere else?" Then STOP and wait for their reply.`;
12922
+ if (Tr()) return Cr(), $("fwh-navigate-mvp ✖ landed on a not-found/404 page:", i), `NAVIGATION_PAGE_NOT_FOUND. ${i} shows a "not found" error — that page doesn't exist on this site.`;
12923
12923
  let m = Date.now() + 4e3, h = typeof window < "u" ? window.location.pathname : r;
12924
12924
  for (; Date.now() < m && !l_(h, e) && l_(h, t);) await new Promise((e) => setTimeout(e, 120)), h = window.location.pathname;
12925
12925
  $("fwh-navigate-mvp route settle:", {
@@ -12928,9 +12928,9 @@ function E_(e) {
12928
12928
  settledPath: h
12929
12929
  });
12930
12930
  let g = typeof window < "u" ? window.location.href : i, _ = (h.split("/").filter(Boolean).pop() || "").replace(/[-_]/g, " ").replace(/\b\w/g, (e) => e.toUpperCase()) || "Home", v = l_(h, e), y = !l_(h, t), b = v || y;
12931
- return $("fwh-navigate-mvp settled:", h, "target:", e, "match:", b), b ? (Cr(), `OK_NAVIGATE_SPA. Visitor is now on: ${g} (page: "${_}") | Section headings: ${u}.${f} ${d}${p} Now confirm the arrival in ONE short sentence phrased for what the visitor actually asked for — mention the page by name and what it lets them do (e.g. for a contact request: "I've taken you to the Contact Us page — filling in this form sends your query straight to our team."). Do NOT use a fixed template. Then, in the same breath, offer either a specific section or a full overview. Then STOP — wait for their reply.`) : (Cr(), `NAVIGATION_DID_NOT_HAPPEN. The visitor is STILL on ${g} (page: "${_}") — the navigation did not go through. Do NOT say "I have navigated you". Do NOT claim success. Tell the visitor EXACTLY: "Sorry, I couldn't open that page just now. Would you like me to try again, or is there something else I can help with?" Then STOP and wait for their reply.`);
12931
+ return $("fwh-navigate-mvp settled:", h, "target:", e, "match:", b), b ? (Cr(), `OK_NAVIGATE_SPA. The visitor is now on ${g} (page: "${_}"). Section headings: ${u}.${f} ${d}${p}`) : (Cr(), `NAVIGATION_DID_NOT_HAPPEN. The page did not change; the visitor is still on ${g} (page: "${_}").`);
12932
12932
  } catch {}
12933
- return "OK_NAVIGATE_RELOADING. The page is reloading now and this session is ending. Say NOTHING further — do not confirm the navigation, do not describe the page. The arrival greeting is spoken automatically on the new page; you resume from the visitor's next reply.";
12933
+ return "OK_NAVIGATE_RELOADING. The page is reloading; this call ends now and continues on the new page.";
12934
12934
  } catch (e) {
12935
12935
  let t = `Navigation error: ${e?.message || String(e)}`;
12936
12936
  return $("fwh-navigate-mvp ✖", t), Ph("Navigation failed", {
@@ -12948,7 +12948,7 @@ function E_(e) {
12948
12948
  if (Wn(3e3), typeof window < "u" && window.__fe_user_nav_during_speech) {
12949
12949
  let e = window.__fe_user_nav_during_speech, t = window.location.pathname;
12950
12950
  if (Date.now() - e.ts >= 3e4) window.__fe_user_nav_during_speech = null;
12951
- else return $("flowengage_highlight ✖ blocked — user navigated during speech", e), `NAV_CHANGED: The visitor navigated from "${e.fromPageName}" to "${e.toPageName}" (current path: ${t}) while you were speaking. STOP the current walkthrough immediately. DO NOT call fwh-highlight-mvp again. Say out loud: "I see you've navigated to the ${e.toPageName} page — do you want me to continue what I was explaining, or shall I guide you through this page?" Wait for the visitor's answer before doing anything else.`;
12951
+ else return $("flowengage_highlight ✖ blocked — user navigated during speech", e), `NAV_CHANGED: the visitor moved themselves from "${e.fromPageName}" to "${e.toPageName}" (${t}) while you were speaking, so nothing was highlighted.`;
12952
12952
  }
12953
12953
  C_();
12954
12954
  let i = ((e) => e && e.replace(/^\d+\.\s*/, "").replace(/^["']|["']$/g, "").trim())(r), a = mr(n || null, i || null);
@@ -12958,10 +12958,10 @@ function E_(e) {
12958
12958
  }
12959
12959
  if (!a) {
12960
12960
  $("fwh-highlight-mvp ✖ no element for:", i || n);
12961
- let { headings: e } = w_(), t = e.length ? `Page headings: ${e.map((e) => `"${e}"`).join(" | ")}. Use one of these EXACT strings for section_text — no numbers, no quotes around them.` : "No headings found — skip highlight and continue speaking.";
12961
+ let { headings: e } = w_(), t = e.length ? `Headings on this page: ${e.map((e) => `"${e}"`).join(" | ")}.` : "This page has no headings to highlight.";
12962
12962
  return `HIGHLIGHT_NOT_FOUND: "${i || n}" on the current page. ${t}`;
12963
12963
  }
12964
- return Nn(a), $("fwh-highlight-mvp ✓", i || n), `OK_HIGHLIGHT: "${i || n}". Your NEXT response must be speech only (no tool call) describing THIS section — "${i || n}" — using its own content. Do not ask whether to continue.`;
12964
+ return Nn(a), $("fwh-highlight-mvp ✓", i || n), `OK_HIGHLIGHT: "${i || n}" is highlighted on screen.`;
12965
12965
  },
12966
12966
  "fwh-read-content-mvp": async (e) => {
12967
12967
  $("fwh-read-content-mvp ▶", e);
@@ -13088,24 +13088,24 @@ function E_(e) {
13088
13088
  });
13089
13089
  }), e.forEach((e) => t.push(e)), !t.length) return "NAV_LINKS: No navigation links found on this page. Use fwh-read-content-mvp to read page content or fwh-search-mvp to search the site.";
13090
13090
  let r = t.slice(0, 50).map((e, t) => `${t + 1}. "${e.text}"${e.isSelectOption ? ` (dropdown option in "${e.selectLabel}")` : ""} → ${e.href}`).join("\n");
13091
- return $("fwh-list-nav-links-mvp ✓", `${t.length} links`), `NAV_LINKS (${t.length} total, showing up to 50):\n${r}\n\nIMPORTANT: Use the EXACT text shown above when reading link names to the visitor. Do NOT rename, abbreviate, or invent options not listed here. To navigate, call fwh-navigate-mvp with the href value.`;
13091
+ return $("fwh-list-nav-links-mvp ✓", `${t.length} links`), `NAV_LINKS (${t.length} total, showing up to 50):\n${r}`;
13092
13092
  },
13093
13093
  "fwh-end-session-mvp": async () => ($("fwh-end-session-mvp ▶"), typeof e.requestEndSession == "function" && e.requestEndSession(), "Voice session is ending."),
13094
- "fwh-request-email-mvp": async () => ($("fwh-request-email-mvp ▶"), typeof e.requestEmailCollection == "function" && e.requestEmailCollection(), "EMAIL_BOX_SHOWN. An email input text box is now visible to the visitor. Say EXACTLY: \"Please enter your email in the text box to continue.\" Then stop and wait silently — do NOT ask them to say it aloud, do NOT repeat, and do NOT answer any other question until you receive the EMAIL_SAVED message."),
13094
+ "fwh-request-email-mvp": async () => ($("fwh-request-email-mvp ▶"), typeof e.requestEmailCollection == "function" && e.requestEmailCollection(), "EMAIL_BOX_SHOWN. A text box for their email is on screen now. EMAIL_SAVED arrives once they submit it."),
13095
13095
  "fwh-get-current-page-mvp": async () => {
13096
13096
  if ($("fwh-get-current-page-mvp ▶"), typeof window > "u") return "Cannot determine current page (no browser context).";
13097
13097
  let e = window.location.href, t = window.location.pathname, n = document.title || "";
13098
- if (Tr()) return $("fwh-get-current-page-mvp ✓ 404 detected", { url: e }), `CURRENT_PAGE_NOT_FOUND. The visitor is currently on a 404 / page-not-found error page (${e}). There is no real content here. Do NOT describe this page, do NOT list sections, do NOT offer a walkthrough, and do NOT describe it from your own knowledge. Tell the visitor plainly that the page they are on doesn't exist, and offer to take them somewhere that does.`;
13098
+ if (Tr()) return $("fwh-get-current-page-mvp ✓ 404 detected", { url: e }), `CURRENT_PAGE_NOT_FOUND. The visitor is on a "not found" error page (${e}); there is no content here.`;
13099
13099
  let { headings: r, pageTitleHeading: i, introText: a } = w_();
13100
13100
  $("fwh-get-current-page-mvp ✓", {
13101
13101
  url: e,
13102
13102
  path: t,
13103
13103
  title: n
13104
13104
  }), $("fwh-get-current-page-mvp → page headings collected:", r, "titleHeading:", i);
13105
- let o = i ? ` NOTE: "${i}" is the PAGE TITLE, not a content section — do NOT fwh-highlight-mvp it or list it as a separate section in a walkthrough. Instead, open with a brief 1-2 sentence summary of this intro text before covering the real sections: "${a || "(no intro text captured)"}"` : a ? ` NOTE: no separate page-title heading was detected, but this intro text appears before the first section — open your walkthrough with a brief 1-2 sentence summary of it before covering sections: "${a}"` : "";
13106
- if (!r.length) return `CURRENT_PAGE. URL: ${e} | Title: ${n} |${o} No structured section headings found on this page. If there is intro text above, describe it; otherwise describe the page from your knowledge. Do not call this tool again.`;
13105
+ let o = i ? ` "${i}" is the page title, not a section. Intro text: "${a || "none"}".` : a ? ` Intro text before the first section: "${a}".` : "";
13106
+ if (!r.length) return `CURRENT_PAGE. URL: ${e} | Title: ${n} |${o} This page has no section headings.`;
13107
13107
  let s = r.map((e) => `"${e}"`).join(" | ");
13108
- return `CURRENT_PAGE. URL: ${e} | Title: ${n} | Page sections (${r.length} total): ${s}.${o} *** WALKTHROUGH: do NOT drive it yourself. Do not call fwh-highlight-mvp and do not decide the order — highlighting and section order are handled for you. You will be told which section to describe, one at a time. When told, describe ONLY that section in 3-4 sentences and then stop; never announce another section, never ask whether to continue. ***`;
13108
+ return `CURRENT_PAGE. URL: ${e} | Title: ${n} | Page sections (${r.length} total): ${s}.${o}`;
13109
13109
  },
13110
13110
  "fwh-list-forms-mvp": async () => {
13111
13111
  let e = h_(), t = g_();
@@ -13120,7 +13120,7 @@ function E_(e) {
13120
13120
  hint: "field_key: use the label/placeholder/name shown above. CRITICAL: fields with inputCategory='dropdown_select' are SELECT elements — their field_key must match the SELECT's own label (e.g. 'Company Size'), NOT the option text (e.g. 'Small Business') and NOT a nearby text input label. Never fill a SELECT option value into a text input."
13121
13121
  });
13122
13122
  },
13123
- "fwh-fill-form-mvp": async () => "FORM_FILLING_DISABLED: Form filling is not available at this time. Tell the visitor what fields are present (use fwh-list-forms-mvp) and ask them to fill the form themselves.",
13123
+ "fwh-fill-form-mvp": async () => "FORM_FILLING_DISABLED: forms can't be filled in for the visitor; fwh-list-forms-mvp lists the fields.",
13124
13124
  "fwh-click-button-mvp": async (e) => {
13125
13125
  let t = x_(e), n = (t.button_text ?? t.buttonText ?? t.text ?? "").trim(), r = (t.card_context ?? t.cardContext ?? "").trim();
13126
13126
  if ($("fwh-click-button-mvp ▶", n, r ? `(card_context: ${r})` : ""), !n) return "Missing button_text: pass the visible label, e.g. Conduct Audit.";
@@ -13250,9 +13250,9 @@ function E_(e) {
13250
13250
  try {
13251
13251
  r = new URL(e, window.location.href).href;
13252
13252
  } catch {}
13253
- return t && Ie(t, window.location.href, r, n), Sr(r), kr().then(() => {
13253
+ return t && Le(t, window.location.href, r, n), Sr(r), kr().then(() => {
13254
13254
  window.location.assign(r);
13255
- }), `OK_NAVIGATING to ${n}. The page is loading — say one short phrase like "Here you go." and nothing more.`;
13255
+ }), `OK_NAVIGATING to ${n}. The page is loading.`;
13256
13256
  }
13257
13257
  return {
13258
13258
  ...o,
@@ -13293,8 +13293,8 @@ function k_(e) {
13293
13293
  //#endregion
13294
13294
  //#region src/components/FlowEngageWidget.jsx
13295
13295
  var A_ = "[PAGE_CONTEXT]";
13296
- function j_(e, t, n) {
13297
- return `${A_} SESSION_CONTEXT (NOT a tool result — do NOT treat as CURRENT_PAGE): Visitor is on: ${e} | Approx headings for awareness only: ${t || ""}. ${n ? `Forms: ${n}. ` : ""}The visitor is ALREADY on this page — do NOT offer to navigate there.`;
13296
+ function j_(e, t, n, r) {
13297
+ return `${A_} The visitor is on ${e}${r ? `, having moved here themselves from the ${r} page` : ""}. Approximate headings: ${t || "none"}. ${n ? `Forms: ${n}. ` : ""}`.trim();
13298
13298
  }
13299
13299
  var M_ = {
13300
13300
  blue: "#135bd8",
@@ -13708,87 +13708,87 @@ function V_({ copy: e, orbColors: t, primaryColor: n, onVoice: r, onText: i, onC
13708
13708
  }
13709
13709
  function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i, apiBaseUrl: a, chatId: s, historyRef: l, onMessageSync: u, beaconSyncVoiceTranscript: d, widgetPosition: f = "bottom-right", voiceEndCounter: h, websiteName: v, voiceFirstMessage: y, captureVisitorEmail: b, emailRequired: x, emailCaptureEnabled: S = !0, listeningLabel: C = "Listening...", thinkingLabel: w = "Thinking...", enterChatModeLabel: T = "Enter Chat Mode", endConversationLabel: E = "End Conversation" }) {
13710
13710
  c(() => (console.log("[FlowEngage:VoiceDebug] 🔵 VoiceMode MOUNTED"), () => console.log("[FlowEngage:VoiceDebug] 🔴 VoiceMode UNMOUNTED")), []);
13711
- let [D, O] = m("idle"), [k, A] = m(!1), [ee, te] = m(!1), [ne, j] = m(() => ce(i) === "auto"), M = () => {
13711
+ let [D, O] = m("idle"), [k, A] = m(!1), [ee, te] = m(!1), [ne, j] = m(() => le(i) === "auto"), re = () => {
13712
13712
  let e = ne ? "ask" : "auto";
13713
- le(i, e), j(e === "auto");
13714
- }, [re, ie] = m(!1), [ae, N] = m(""), [oe, P] = m(""), se = p(!1), F = p(!1), ue = p(null), de = p(0), fe = p(""), pe = p(!1), me = p(0), he = p(!1), ge = p(!1), _e = p(!1), ve = p([]), ye = p(null), be = p(""), xe = p(null), I = (e) => {
13715
- he.current = e, e || (ge.current = !1), R.current?.setWalkthroughActive?.(e);
13713
+ ue(i, e), j(e === "auto");
13714
+ }, [ie, ae] = m(!1), [oe, M] = m(""), [se, N] = m(""), ce = p(!1), P = p(!1), de = p(null), fe = p(0), pe = p(""), me = p(!1), he = p(0), ge = p(!1), _e = p(!1), ve = p(!1), ye = p([]), be = p(null), xe = p(""), Se = p(null), F = (e) => {
13715
+ ge.current = e, e || (_e.current = !1), L.current?.setWalkthroughActive?.(e);
13716
13716
  };
13717
- xe.current = async () => {
13718
- if (ge.current) return;
13717
+ Se.current = async () => {
13718
+ if (_e.current) return;
13719
13719
  let e = typeof window < "u" ? window.location.pathname : null;
13720
- if (e && ye.current && e !== ye.current) {
13721
- console.log("[FlowEngage] walkthrough ended — visitor left " + ye.current), ye.current = null, ve.current = [], I(!1);
13720
+ if (e && be.current && e !== be.current) {
13721
+ console.log("[FlowEngage] walkthrough ended — visitor left " + be.current), be.current = null, ye.current = [], F(!1);
13722
13722
  return;
13723
13723
  }
13724
- let t = ve.current;
13725
- L.current += 1;
13726
- let n = L.current, r = t[n];
13724
+ let t = ye.current;
13725
+ I.current += 1;
13726
+ let n = I.current, r = t[n];
13727
13727
  if (!r) {
13728
- if (I(!1), t.length) R.current?.sendUserMessage?.("That was the last section. Say so in one short sentence and ask if they want to explore any section further.");
13728
+ if (F(!1), t.length) L.current?.sendUserMessage?.("That was the last section. Say so in one short sentence and ask if they want to explore any section further.");
13729
13729
  else if (n === 0) {
13730
13730
  let e = "";
13731
13731
  try {
13732
- let t = await Se.current?.["fwh-read-content-mvp"]?.({});
13732
+ let t = await Ce.current?.["fwh-read-content-mvp"]?.({});
13733
13733
  typeof t == "string" && t && !/^Could not/i.test(t) && (e = t.slice(0, 2800));
13734
13734
  } catch {}
13735
- R.current?.sendUserMessage?.(e ? `Give the visitor a complete spoken overview of this page in 4-6 sentences, based ONLY on this page content:\n"""${e}"""\nThen ask which part they'd like to hear more about. Do not call any tool.` : "Give the visitor a complete spoken overview of this page in 4-6 sentences based on what you know about it, then ask which part they'd like to hear more about. Do not call any tool.", { suppressQuestion: !0 });
13735
+ L.current?.sendUserMessage?.(e ? `Give the visitor a complete spoken overview of this page in 4-6 sentences, based ONLY on this page content:\n"""${e}"""\nThen ask which part they'd like to hear more about. Do not call any tool.` : "Give the visitor a complete spoken overview of this page in 4-6 sentences based on what you know about it, then ask which part they'd like to hear more about. Do not call any tool.", { suppressQuestion: !0 });
13736
13736
  }
13737
13737
  return;
13738
13738
  }
13739
13739
  try {
13740
- await Se.current?.highlightOnPage?.({ section_text: r });
13740
+ await Ce.current?.highlightOnPage?.({ section_text: r });
13741
13741
  } catch (e) {
13742
13742
  console.warn("[FlowEngage] walkthrough highlight failed:", e?.message || e);
13743
13743
  }
13744
13744
  console.debug(`[FlowEngage] walkthrough step ${n + 1}/${t.length}: ${r}`);
13745
13745
  let i = "";
13746
13746
  try {
13747
- let e = await Se.current?.["fwh-read-content-mvp"]?.({ section_text: r });
13747
+ let e = await Ce.current?.["fwh-read-content-mvp"]?.({ section_text: r });
13748
13748
  typeof e == "string" && e && !/^Could not/i.test(e) && (i = e.slice(0, 2500));
13749
13749
  } catch {}
13750
13750
  let a = i ? `Here is this section's full content — describe it from THIS text only, and do not call any tool:\n"""${i}"""\n` : "read the section's content silently first (fwh-read-content-mvp) if you don't already have it. ";
13751
- R.current?.sendUserMessage?.(`Describe the section titled "${r}" in 3-4 sentences, starting with ${n === 0 ? "Starting with" : "Next —"} ${r}. Describe ONLY this section. If this section contains named sub-items (steps, checklist entries, cards, plans, FAQs, team members), name EVERY one of them in order with a short phrase each — never skip or collapse them into a summary; ` + a + "This section is ON THE PAGE THE VISITOR IS ALREADY ON — do NOT call fwh-navigate-mvp, do not go to a product/detail page, and do not offer to, even if this section's name also matches a page name. Do not mention any other section, do not ask whether to continue, then stop.", { suppressQuestion: !0 });
13751
+ L.current?.sendUserMessage?.(`Describe the section titled "${r}" in 3-4 sentences, starting with ${n === 0 ? "Starting with" : "Next —"} ${r}. Describe ONLY this section. If this section contains named sub-items (steps, checklist entries, cards, plans, FAQs, team members), name EVERY one of them in order with a short phrase each — never skip or collapse them into a summary; ` + a + "This section is ON THE PAGE THE VISITOR IS ALREADY ON — do NOT call fwh-navigate-mvp, do not go to a product/detail page, and do not offer to, even if this section's name also matches a page name. Do not mention any other section, do not ask whether to continue, then stop.", { suppressQuestion: !0 });
13752
13752
  };
13753
- let L = p(0), R = p(null), Se = p(null), Ce = p(""), we = p(async () => {}), Oe = p(!1), Ae = p(!1), je = p(!1), Me = p(!1), Ne = p("minimized"), Fe = p(null), Ie = p(null), z = p(null), Re = p(0), ze = p(!1), Be = p("idle"), Ve = p(null), B = p(!1), He = p(null), Ue = o((e = "minimized") => {
13753
+ let I = p(0), L = p(null), Ce = p(null), we = p(""), Te = p(async () => {}), ke = p(!1), je = p(!1), Me = p(!1), Ne = p(!1), Pe = p("minimized"), Ie = p(null), Le = p(null), R = p(null), ze = p(0), Be = p(!1), Ve = p("idle"), z = p(null), B = p(!1), He = p(null), Ue = o((e = "minimized") => {
13754
13754
  console.warn("[FlowEngage:VoiceDebug] 🛑 requestSessionShutdown called", {
13755
13755
  destination: e,
13756
13756
  stack: (/* @__PURE__ */ Error()).stack?.split("\n").slice(1, 4).join(" | ")
13757
- }), Ne.current = e, Me.current = !0, queueMicrotask(() => {
13758
- Oe.current || (Oe.current = !0, we.current?.());
13757
+ }), Pe.current = e, Ne.current = !0, queueMicrotask(() => {
13758
+ ke.current || (ke.current = !0, Te.current?.());
13759
13759
  });
13760
13760
  }, [l]), V = o(() => {
13761
- ue.current &&= (clearTimeout(ue.current), null);
13761
+ de.current &&= (clearTimeout(de.current), null);
13762
13762
  }, []);
13763
13763
  c(() => {
13764
13764
  if (x) {
13765
- se.current = !1;
13765
+ ce.current = !1;
13766
13766
  return;
13767
13767
  }
13768
- if (se.current = !0, F.current = !1, ie(!1), V(), pe.current) {
13769
- pe.current = !1, R.current?.setMicMuted?.(!1);
13770
- let e = fe.current;
13771
- fe.current = "", R.current?.injectAgentSpeech?.("Thanks — I already have your email on file.", "interrupt"), e && R.current?.sendUserMessage?.(`The visitor's email is already on file — do not ask for it. Answer their question now: "${e}"`);
13768
+ if (ce.current = !0, P.current = !1, ae(!1), V(), me.current) {
13769
+ me.current = !1, L.current?.setMicMuted?.(!1);
13770
+ let e = pe.current;
13771
+ pe.current = "", L.current?.injectAgentSpeech?.("Thanks — I already have your email on file.", "interrupt"), e && L.current?.sendUserMessage?.(`The visitor's email is already on file — do not ask for it. Answer their question now: "${e}"`);
13772
13772
  }
13773
- R.current?.sendContextualUpdate?.("EMAIL REQUIREMENT SATISFIED — the visitor's email is already on file. All earlier instructions about requiring or asking for an email are VOID. Never ask for it again.");
13773
+ L.current?.sendContextualUpdate?.("EMAIL REQUIREMENT SATISFIED — the visitor's email is already on file. All earlier instructions about requiring or asking for an email are VOID. Never ask for it again.");
13774
13774
  }, [x, V]);
13775
13775
  let We = /(walk\s*(me\s*)?through|walkthrough|take me through|(complete|full|detailed) (overview|understanding|walkthrough|picture|breakdown|explanation)|give me (a|an|the) (overview|tour|walk)|tell me about (each|all)|go through (it|them|each|all)|overview of|one by one|tell me everything|explain (me )?(this|the) (whole |entire |full )?page|everything (about|on) this page|show me (each|all|around))/i, Ge = /(that covers everything|that was all|covered everything|that(?:'|’)?s everything)/i, Ke = /^((uh+|um+|so|well|okay|ok|yeah)[,.\s]+)*(yes|yeah|yep|yup|sure|ok(ay)?|please|continue|go on|next|keep going|carry on|go ahead|resume|back to the tour)[\s.!,]*$/i, qe = /(would you like (me )?to take you|shall i take you|want me to take you|would you like to (go|explore|visit|see)|take you there)/i, Je = /^((uh+|um+|oh|ah|so|well)[,.\s]+)*(cool|nice|great|awesome|wow|lovely|perfect|got it|gotcha|i see|understood|makes sense|interesting|right|alright|sounds good|mm+-?hmm+|hmm+|k)[\s.!,]*$/i, Ye = (e) => String(e || "").replace(/[\s.,!?]*((uh+|um+|er+|hmm+|mm+)[\s.,!?]*)+$/i, "").trim(), Xe = o(() => {
13776
- V(), ue.current = setTimeout(() => {
13777
- if (!(!F.current || se.current)) if (de.current < 3) {
13778
- de.current += 1;
13776
+ V(), de.current = setTimeout(() => {
13777
+ if (!(!P.current || ce.current)) if (fe.current < 3) {
13778
+ fe.current += 1;
13779
13779
  try {
13780
- R.current?.injectAgentSpeech?.("I still need your email in the box below to continue — could you enter it, please?", "queue");
13780
+ L.current?.injectAgentSpeech?.("I still need your email in the box below to continue — could you enter it, please?", "queue");
13781
13781
  } catch {}
13782
13782
  Xe();
13783
13783
  } else {
13784
13784
  try {
13785
- R.current?.injectAgentSpeech?.("Since I haven't received your email, I'll close this session for now. Feel free to come back anytime — take care!", "queue");
13785
+ L.current?.injectAgentSpeech?.("Since I haven't received your email, I'll close this session for now. Feel free to come back anytime — take care!", "queue");
13786
13786
  } catch {}
13787
- F.current = !1, ie(!1), V(), ze.current = !0;
13787
+ P.current = !1, ae(!1), V(), Be.current = !0;
13788
13788
  }
13789
13789
  }, 1e4);
13790
13790
  }, [V]), Ze = o(async (e) => {
13791
- Me.current = !0;
13791
+ Ne.current = !0;
13792
13792
  try {
13793
13793
  Pn();
13794
13794
  } catch {}
@@ -13796,12 +13796,12 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
13796
13796
  Jh();
13797
13797
  } catch {}
13798
13798
  if (i) try {
13799
- Le(i);
13799
+ Re(i);
13800
13800
  } catch {}
13801
13801
  try {
13802
- await R.current?.endSession?.();
13802
+ await L.current?.endSession?.();
13803
13803
  } catch {}
13804
- let t = Fe.current, n = Ie.current;
13804
+ let t = Ie.current, n = Le.current;
13805
13805
  if (t && s && a) {
13806
13806
  let e = n ? Math.round((Date.now() - n) / 1e3) : 0;
13807
13807
  fetch(`${a}/api/voice/save-chat-recording`, {
@@ -13815,8 +13815,8 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
13815
13815
  })
13816
13816
  }).catch((e) => console.warn("[FlowEngage] save-chat-recording failed:", e.message));
13817
13817
  }
13818
- if (Fe.current = null, Ie.current = null, R.current = null, O("idle"), A(!1), Oe.current = !1, Pr(), i) try {
13819
- De(i);
13818
+ if (Ie.current = null, Le.current = null, L.current = null, O("idle"), A(!1), ke.current = !1, Pr(), i) try {
13819
+ Oe(i);
13820
13820
  } catch {}
13821
13821
  typeof u == "function" && await u(l.current), e?.();
13822
13822
  }, [
@@ -13826,8 +13826,8 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
13826
13826
  s,
13827
13827
  a
13828
13828
  ]);
13829
- we.current = () => Ze(Ne.current === "chat" ? t : n), c(() => {
13830
- Ae.current = k;
13829
+ Te.current = () => Ze(Pe.current === "chat" ? t : n), c(() => {
13830
+ je.current = k;
13831
13831
  }, [k]), c(() => {
13832
13832
  h && Ue("chat");
13833
13833
  }, [h]), c(() => {
@@ -13839,13 +13839,13 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
13839
13839
  }
13840
13840
  try {
13841
13841
  if ((await navigator.mediaDevices.getUserMedia({ audio: !0 })).getTracks().forEach((e) => e.stop()), e) return;
13842
- l.current = [], Ce.current = "", Oe.current = !1, je.current = !1, Me.current = !1, Ne.current = "minimized", Nr({ onBeforeNavigate: () => {
13842
+ l.current = [], we.current = "", ke.current = !1, Me.current = !1, Ne.current = !1, Pe.current = "minimized", Nr({ onBeforeNavigate: () => {
13843
13843
  if (i && l.current.length > 0) try {
13844
13844
  let e = o_(l.current);
13845
- e && Te(i, e);
13845
+ e && Ee(i, e);
13846
13846
  } catch {}
13847
13847
  if (!$n()) {
13848
- let e = Fe.current, t = Ie.current;
13848
+ let e = Ie.current, t = Le.current;
13849
13849
  if (e && s && a) try {
13850
13850
  let n = t ? Math.round((Date.now() - t) / 1e3) : 0, r = JSON.stringify({
13851
13851
  chatId: s,
@@ -13858,68 +13858,57 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
13858
13858
  headers: { "Content-Type": "application/json" },
13859
13859
  body: r,
13860
13860
  keepalive: !0
13861
- }).catch(() => {}), Fe.current = null, Ie.current = null;
13861
+ }).catch(() => {}), Ie.current = null, Le.current = null;
13862
13862
  } catch {}
13863
13863
  }
13864
- ke();
13864
+ Ae();
13865
13865
  } });
13866
13866
  let t = k_(E_({
13867
13867
  siteId: i || null,
13868
13868
  apiBaseUrl: a || null,
13869
13869
  chatId: s || null,
13870
- getLastUserVoiceText: () => Ce.current,
13870
+ getLastUserVoiceText: () => we.current,
13871
13871
  beaconSyncFullVoiceHistory: () => d?.(l.current),
13872
- isWalkthroughActive: () => he.current && !ge.current,
13872
+ isWalkthroughActive: () => ge.current && !_e.current,
13873
13873
  requestEndSession: () => {
13874
- ze.current = !0;
13874
+ Be.current = !0;
13875
13875
  },
13876
13876
  requestEmailCollection: () => {
13877
- S && (se.current || F.current || (F.current = !0, de.current = 0, ie(!0), Xe()));
13877
+ S && (ce.current || P.current || (P.current = !0, fe.current = 0, ae(!0), Xe()));
13878
13878
  }
13879
- })), n = i ? Ee(i) : null, r = !!n?.transcript, u = i ? Le(i) : null, m = !!u, h = typeof window < "u" ? window.location.pathname : "/", g = typeof document < "u" ? document.title : "", _ = h.replace(/^\/[a-z]{2}(?:-[a-z]{2})?(?=\/|$)/i, "") || "/", b = _ === "/" || _ === "", C = {
13879
+ })), n = !!(i ? De(i) : null)?.transcript, r = i ? Re(i) : null, u = !!r, m = typeof window < "u" ? window.location.pathname : "/", h = typeof document < "u" ? document.title : "", g = m.replace(/^\/[a-z]{2}(?:-[a-z]{2})?(?=\/|$)/i, "") || "/", _ = g === "/" || g === "", b = {
13880
13880
  apiBaseUrl: a,
13881
13881
  siteId: i,
13882
13882
  chatId: s,
13883
13883
  clientTools: t
13884
13884
  };
13885
- Se.current = t;
13886
- let w = (h.split("/").filter(Boolean).pop() || "").replace(/[-_]/g, " ").replace(/\b\w/g, (e) => e.toUpperCase()), T = "";
13887
- g && g.includes("|") && (T = g.split("|").map((e) => e.trim()).filter(Boolean).reduce((e, t) => e.length <= t.length ? e : t));
13888
- let E = T || w || "", D = E ? `the ${E} page` : "this page", k = (() => {
13889
- if (!u?.targetUrl) return !0;
13885
+ Ce.current = t;
13886
+ let C = (m.split("/").filter(Boolean).pop() || "").replace(/[-_]/g, " ").replace(/\b\w/g, (e) => e.toUpperCase()), w = "";
13887
+ h && h.includes("|") && (w = h.split("|").map((e) => e.trim()).filter(Boolean).reduce((e, t) => e.length <= t.length ? e : t));
13888
+ let T = w || C || "", E = T ? `the ${T} page` : "this page", D = (() => {
13889
+ if (!r?.targetUrl) return null;
13890
13890
  try {
13891
- return new URL(u.targetUrl, window.location.href).pathname.replace(/\/$/, "") === window.location.pathname.replace(/\/$/, "");
13892
- } catch {
13893
- return !0;
13894
- }
13895
- })(), ee = (() => {
13896
- if (!u?.targetUrl) return null;
13897
- try {
13898
- return new URL(u.targetUrl, window.location.href).pathname;
13891
+ return new URL(r.targetUrl, window.location.href).pathname;
13899
13892
  } catch {
13900
13893
  return null;
13901
13894
  }
13902
13895
  })();
13903
- if (m && !k) C.greeting = `You're on ${D}. What would you like to know?`, console.warn(`[FlowEngage] nav target "${u?.pageName}" not reached — on "${E}" instead; not claiming navigation`);
13904
- else if (m) {
13905
- let e = u?.pageName ? `the ${u.pageName} page` : D;
13906
- C.greeting = `I have navigated you to ${e}. Do you want to know about any specific section or want a complete overview?`, console.log(`[FlowEngage] 🔄 Agent-nav resume: greeting set for "${e}" (${h})`);
13907
- } else if (r) C.greeting = `Welcome back! I see you're now on ${D}. Would you like me to continue what I was explaining before, or would you like to know about this page instead?`;
13896
+ if (u || n) b.greeting = null;
13908
13897
  else {
13909
13898
  let e = v || "";
13910
- C.greeting = y || (b ? e ? `Hi, welcome to ${e}! How may I help you?` : "Hi, welcome! How may I help you?" : `Welcome to ${D}! How may I help you?`), b || console.log(`[FlowEngage] 🏠 Page-context greeting: "${E}" for ${h}`);
13899
+ b.greeting = y || (_ ? e ? `Hi, welcome to ${e}! How may I help you?` : "Hi, welcome! How may I help you?" : `Welcome to ${E}! How may I help you?`), _ || console.log(`[FlowEngage] 🏠 Page-context greeting: "${T}" for ${m}`);
13911
13900
  }
13912
- let te = !1, ne = m ? `NAVIGATION COMPLETE — The exact phrase "I have navigated you to the [page] page. Do you want to know about any specific section or want a complete overview?" has already been spoken as your firstMessage. DO NOT repeat it. PRIOR CONVERSATION CONTEXT:\n${n?.transcript ? `Prior transcript:\n${n.transcript}\n` : "(no prior transcript)"}\nNow STOP — wait silently for the visitor's reply. Do NOT speak, do NOT call any tool until the visitor responds. When they reply: if they name a specific section → call fwh-get-current-page-mvp then answer immediately; if they say "overview" or anything non-specific → call fwh-get-current-page-mvp (zero speech) then do a full highlighted walkthrough.` : null, j = !1, M = !m && !r ? "Your greeting has been spoken. Wait for the visitor to ask a question or tell you what they need. Do NOT auto-start a walkthrough or highlight any sections — let the visitor lead." : null, re = r && !m, ae = !1, N = re ? `The question "Would you like me to continue what I was explaining before, or would you like to know about this page instead?" has already been spoken as your firstMessage. DO NOT repeat it. PRIOR CONVERSATION CONTEXT:\n${n?.transcript ? `Prior transcript:\n${n.transcript}\n` : "(no prior transcript, or the visitor navigated before saying much)"}\nNow STOP — wait silently for the visitor's reply. Do NOT speak, do NOT call any tool until they respond. When they reply: if they want you to CONTINUE the previous topic → resume verbally from the prior transcript above, do NOT call fwh-get-current-page-mvp or describe the new page unless they ask. If they want to know about THIS page → call fwh-get-current-page-mvp (zero speech) then proceed as a normal fresh-page walkthrough/description. If their reply is ambiguous, ask them to clarify which they'd prefer rather than guessing.` : null, oe = !1, P = !1, le = S && !!x && !_e.current, ue = await kh.startSession({
13913
- ...C,
13901
+ let k = !1, ee = !1, te = S && !!x && !ve.current, ne = await kh.startSession({
13902
+ ...b,
13914
13903
  onConnect: ({ conversationId: e }) => {
13915
- Fe.current = e, Ie.current = Date.now(), console.log("[FlowEngage] 🎙️ AI chat session connected:", e);
13904
+ Ie.current = e, Le.current = Date.now(), console.log("[FlowEngage] 🎙️ AI chat session connected:", e);
13916
13905
  },
13917
13906
  onUnhandledClientToolCall: (e) => console.error("[FlowEngage] Unhandled tool:", e?.tool_name),
13918
13907
  onSessionInfo: ({ emailOnFile: e }) => {
13919
- _e.current = !!e, e && (se.current = !0, F.current = !1, ie(!1), V(), console.log("[FlowEngage] email already on file per server — gate disabled"));
13908
+ ve.current = !!e, e && (ce.current = !0, P.current = !1, ae(!1), V(), console.log("[FlowEngage] email already on file per server — gate disabled"));
13920
13909
  },
13921
13910
  onAgentTurnEnd: () => {
13922
- e || he.current && (ge.current || pe.current || setTimeout(() => xe.current?.(), 250));
13911
+ e || ge.current && (_e.current || me.current || setTimeout(() => Se.current?.(), 250));
13923
13912
  },
13924
13913
  onSessionEnding: () => {
13925
13914
  e || Ue("minimized");
@@ -13934,145 +13923,123 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
13934
13923
  onModeChange: ({ mode: t, tentative: n }) => {
13935
13924
  if (!e) {
13936
13925
  if (t === "speaking") {
13937
- Ve.current &&= (clearTimeout(Ve.current), null), He.current &&= (clearTimeout(He.current), null), O("speaking"), Be.current = "speaking", B.current = !1;
13926
+ z.current &&= (clearTimeout(z.current), null), He.current &&= (clearTimeout(He.current), null), O("speaking"), Ve.current = "speaking", B.current = !1;
13938
13927
  return;
13939
13928
  }
13940
13929
  if (t === "user-speaking") {
13941
- if (F.current && !se.current && Xe(), He.current &&= (clearTimeout(He.current), null), Be.current === "speaking") return;
13930
+ if (P.current && !ce.current && Xe(), He.current &&= (clearTimeout(He.current), null), Ve.current === "speaking") return;
13942
13931
  try {
13943
13932
  Pn();
13944
13933
  } catch {}
13945
- Ve.current &&= (clearTimeout(Ve.current), null), Be.current !== "listening" && (O("listening"), Be.current = "listening");
13934
+ z.current &&= (clearTimeout(z.current), null), Ve.current !== "listening" && (O("listening"), Ve.current = "listening");
13946
13935
  return;
13947
13936
  }
13948
13937
  if (t === "thinking") {
13949
- if (Ve.current &&= (clearTimeout(Ve.current), null), He.current &&= (clearTimeout(He.current), null), Be.current === "speaking") return;
13950
- O("thinking"), Be.current = "thinking", n && (He.current = setTimeout(() => {
13951
- He.current = null, !(e || Be.current !== "thinking") && (Be.current = "listening", O("listening"));
13938
+ if (z.current &&= (clearTimeout(z.current), null), He.current &&= (clearTimeout(He.current), null), Ve.current === "speaking") return;
13939
+ O("thinking"), Ve.current = "thinking", n && (He.current = setTimeout(() => {
13940
+ He.current = null, !(e || Ve.current !== "thinking") && (Ve.current = "listening", O("listening"));
13952
13941
  }, 4e3));
13953
13942
  return;
13954
13943
  }
13955
- if (Be.current = "listening", ze.current) {
13956
- ze.current = !1, Ue();
13944
+ if (Ve.current = "listening", Be.current) {
13945
+ Be.current = !1, Ue();
13957
13946
  return;
13958
13947
  }
13959
- if (le && !P && !se.current && !_e.current) {
13960
- P = !0, te = !0, j = !0;
13948
+ if (te && !ee && !ce.current && !ve.current) {
13949
+ ee = !0;
13961
13950
  try {
13962
- R.current?.sendContextualUpdate?.("CRITICAL — EMAIL REQUIRED BEFORE ANYTHING ELSE. The visitor has not provided their email. The app itself speaks the email request out loud — you must NOT say it, and you must NOT answer. Stay completely silent from now until you receive an EMAIL_SAVED message: produce no speech and call no tools, no matter what the visitor says. Remember their question. On EMAIL_SAVED, thank them briefly and answer that remembered question in full.");
13951
+ L.current?.sendContextualUpdate?.("The visitor hasn't given their email yet; the app will ask for it when they first speak.");
13963
13952
  } catch {}
13964
13953
  }
13965
- if (ne && !te) {
13966
- te = !0;
13967
- try {
13968
- R.current?.sendContextualUpdate?.(ne);
13969
- } catch {}
13970
- }
13971
- if (N && !ae) {
13972
- ae = !0;
13973
- try {
13974
- R.current?.sendContextualUpdate?.(N);
13975
- } catch {}
13976
- }
13977
- if (M && !j) {
13978
- j = !0;
13979
- try {
13980
- R.current?.sendContextualUpdate?.(M);
13981
- } catch {}
13982
- }
13983
- Ve.current && clearTimeout(Ve.current), Ve.current = setTimeout(() => {
13984
- e || Be.current !== "speaking" && (B.current || (Ve.current = null, Be.current = "listening", O("listening")));
13954
+ z.current && clearTimeout(z.current), z.current = setTimeout(() => {
13955
+ e || Ve.current !== "speaking" && (B.current || (z.current = null, Ve.current = "listening", O("listening")));
13985
13956
  }, 1200);
13986
13957
  }
13987
13958
  },
13988
13959
  onMessage: (t) => {
13989
- if (e || pe.current && t.role !== "user" && !/email/i.test(String(t.message || ""))) return;
13960
+ if (e || me.current && t.role !== "user" && !/email/i.test(String(t.message || ""))) return;
13990
13961
  let n = t.role === "user" && /^(Describe the section titled "|\[SYSTEM:|Give the visitor a complete spoken overview|That was the last section)/.test(String(t.message || "").trim());
13991
13962
  if (t.role === "user" && !n) try {
13992
13963
  Jh();
13993
13964
  } catch {}
13994
13965
  let r = /\b(?:this|that|the)\s+(?:case\s*stud(?:y|ies)|product|article|blog|post|item|service)\b/i.test(String(t.message || ""));
13995
- if (!n && !r && t.role === "user" && We.test(String(t.message || ""))) typeof window < "u" && (window.__fe_user_nav_during_speech = null), I(!0), ge.current = !1, me.current = 0, L.current = -1, ve.current = O_(), ye.current = typeof window < "u" ? window.location.pathname : null, setTimeout(() => xe.current?.(), 400), console.log(`[FlowEngage] walkthrough armed — ${ve.current.length} sections on this page`);
13996
- else if (!n && t.role === "user" && he.current) {
13966
+ if (!n && !r && t.role === "user" && We.test(String(t.message || ""))) typeof window < "u" && (window.__fe_user_nav_during_speech = null), F(!0), _e.current = !1, he.current = 0, I.current = -1, ye.current = O_(), be.current = typeof window < "u" ? window.location.pathname : null, setTimeout(() => Se.current?.(), 400), console.log(`[FlowEngage] walkthrough armed — ${ye.current.length} sections on this page`);
13967
+ else if (!n && t.role === "user" && ge.current) {
13997
13968
  let e = String(t.message || "").trim(), n = Ye(e), r = (e) => !!e && (Ke.test(e) || Je.test(e));
13998
- qe.test(be.current || "") ? (console.log("[FlowEngage] walkthrough ended — visitor accepted a navigation offer"), ye.current = null, ve.current = [], I(!1)) : !n || r(e) || r(n) ? ge.current && (ge.current = !1, console.debug("[FlowEngage] walkthrough resumed by visitor"), setTimeout(() => xe.current?.(), 300)) : (console.log("[FlowEngage] walkthrough ended — visitor moved to a new topic"), ye.current = null, ve.current = [], I(!1));
13969
+ qe.test(xe.current || "") ? (console.log("[FlowEngage] walkthrough ended — visitor accepted a navigation offer"), be.current = null, ye.current = [], F(!1)) : !n || r(e) || r(n) ? _e.current && (_e.current = !1, console.debug("[FlowEngage] walkthrough resumed by visitor"), setTimeout(() => Se.current?.(), 300)) : (console.log("[FlowEngage] walkthrough ended — visitor moved to a new topic"), be.current = null, ye.current = [], F(!1));
13999
13970
  }
14000
- if (t.role !== "user" && !n && (be.current = String(t.message || "")), t.role !== "user" && Ge.test(String(t.message || ""))) {
14001
- let e = ve.current.length;
14002
- !e || L.current >= e - 1 ? I(!1) : console.debug(`[FlowEngage] agent claimed completion at step ${L.current + 1}/${e} — ignoring, tour continues`);
13971
+ if (t.role !== "user" && !n && (xe.current = String(t.message || "")), t.role !== "user" && Ge.test(String(t.message || ""))) {
13972
+ let e = ye.current.length;
13973
+ !e || I.current >= e - 1 ? F(!1) : console.debug(`[FlowEngage] agent claimed completion at step ${I.current + 1}/${e} — ignoring, tour continues`);
14003
13974
  }
14004
13975
  let a = t.role === "user" ? "user" : "bot", o = t.message || t.text || t.content || "";
14005
13976
  if (o) {
14006
- if (a === "user" && (Ce.current = o, typeof window < "u" && (window.__fe_user_nav_during_speech = null), B.current = !0, Ve.current &&= (clearTimeout(Ve.current), null), Be.current !== "speaking" && (O("thinking"), Be.current = "thinking"), le && !oe && !se.current && !_e.current && (oe = !0, fe.current = o, pe.current = !0, R.current?.injectAgentSpeech?.("Before I answer that, could you please enter your email in the text box below?", "interrupt"), R.current?.setMicMuted?.(!0), F.current || (F.current = !0, de.current = 0, ie(!0), Xe()))), l.current = [...l.current, {
13977
+ if (a === "user" && (we.current = o, typeof window < "u" && (window.__fe_user_nav_during_speech = null), B.current = !0, z.current &&= (clearTimeout(z.current), null), Ve.current !== "speaking" && (O("thinking"), Ve.current = "thinking"), te && !k && !ce.current && !ve.current && (k = !0, pe.current = o, me.current = !0, L.current?.injectAgentSpeech?.("Before I answer that, could you please enter your email in the text box below?", "interrupt"), L.current?.setMicMuted?.(!0), P.current || (P.current = !0, fe.current = 0, ae(!0), Xe()))), l.current = [...l.current, {
14007
13978
  sender: a,
14008
13979
  message: o,
14009
13980
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
14010
13981
  debug: t.debug
14011
13982
  }], i) try {
14012
13983
  let e = o_(l.current);
14013
- e && Te(i, e);
13984
+ e && Ee(i, e);
14014
13985
  } catch {}
14015
13986
  if (R_(a, o)) {
14016
- ze.current = !0;
13987
+ Be.current = !0;
14017
13988
  return;
14018
13989
  }
14019
- if (Ae.current && a === "bot" && /are you still there|still there\??|hello\?|anyone there|checking in|you there|are you available|is anyone|did you step away/i.test(o)) if (Re.current += 1, Re.current === 2) try {
14020
- R.current?.sendContextualUpdate?.("IMPORTANT: The visitor is muted and has not responded to your last 2 checks. Make exactly ONE more check. If there is still no response, say: 'I feel like you are not active, so I'm ending this session. You can connect with me anytime.' then immediately call the fwh-end-session-mvp tool to end the voice session. Do NOT ask again after that.");
14021
- } catch {}
14022
- else Re.current >= 5 && Ue("minimized");
13990
+ je.current && a === "bot" && /are you still there|still there\??|hello\?|anyone there|checking in|you there|are you available|is anyone|did you step away/i.test(o) && (ze.current += 1, ze.current >= 5 && Ue("minimized"));
14023
13991
  }
14024
13992
  },
14025
13993
  onError: (t) => {
14026
- if (!e && !Me.current && !je.current && !Pe()) {
14027
- je.current = !0, console.error("[FlowEngageVoiceCall] session:error", {
13994
+ if (!e && !Ne.current && !Me.current && !Fe()) {
13995
+ Me.current = !0, console.error("[FlowEngageVoiceCall] session:error", {
14028
13996
  message: t?.message,
14029
13997
  name: t?.name,
14030
13998
  raw: t
14031
13999
  });
14032
14000
  try {
14033
- R.current?.setMicMuted?.(!0);
14001
+ L.current?.setMicMuted?.(!0);
14034
14002
  } catch {}
14035
14003
  A(!0), O("error"), Ue("chat");
14036
14004
  }
14037
14005
  },
14038
14006
  onDisconnect: (t) => {
14039
- if (e || Me.current || je.current || Pe()) return;
14007
+ if (e || Ne.current || Me.current || Fe()) return;
14040
14008
  let n = l.current?.length || 0;
14041
14009
  console.warn("[FlowEngageVoiceCall] session:disconnected", {
14042
14010
  historyCount: n,
14043
14011
  reason: t?.reason,
14044
14012
  closeCode: t?.context?.code,
14045
14013
  closeReason: t?.context?.reason || t?.message,
14046
- lastUserText: Ce.current || "",
14047
- wasMuted: Ae.current
14048
- }), je.current = !0;
14014
+ lastUserText: we.current || "",
14015
+ wasMuted: je.current
14016
+ }), Me.current = !0;
14049
14017
  try {
14050
- R.current?.setMicMuted?.(!0);
14018
+ L.current?.setMicMuted?.(!0);
14051
14019
  } catch {}
14052
14020
  A(!0), Ue("chat");
14053
14021
  }
14054
14022
  });
14055
14023
  if (e) {
14056
- console.warn("[FlowEngage:VoiceDebug] ❌ cancelled=true after startSession resolved — killing session immediately"), ue.endSession().catch(() => {});
14024
+ console.warn("[FlowEngage:VoiceDebug] ❌ cancelled=true after startSession resolved — killing session immediately"), ne.endSession().catch(() => {});
14057
14025
  return;
14058
14026
  }
14059
- o = ue, R.current = ue, O("listening");
14027
+ o = ne, L.current = ne, O("listening");
14060
14028
  try {
14061
- sessionStorage.setItem(`el_conv_${i}`, ue.getId());
14029
+ sessionStorage.setItem(`el_conv_${i}`, ne.getId());
14062
14030
  } catch {}
14063
14031
  parent.postMessage({ type: "AGENT_EXPAND" }, "*");
14064
14032
  try {
14065
- let e = typeof window < "u" ? window.location.href : "", a = "[]";
14033
+ let e = typeof window < "u" ? window.location.href : "", n = "[]";
14066
14034
  try {
14067
- a = await t["fwh-list-forms-mvp"]();
14035
+ n = await t["fwh-list-forms-mvp"]();
14068
14036
  } catch {}
14069
- let o = "none";
14037
+ let r = "none";
14070
14038
  if (typeof window < "u" && typeof document < "u") try {
14071
14039
  let e = "#flowengage-root, .flowengage-shell, .flowengage-widget-root", t = document.querySelector("main, [role='main']") || document.body, n = Array.from(t.querySelectorAll("h1, h2, h3")).filter((t) => !t.closest(e)).map((e) => e.textContent.replace(/\s+/g, " ").trim()).filter((e) => e.length > 2 && e.length < 200);
14072
- n.length || (n = Array.from(document.body.querySelectorAll("h1, h2, h3")).filter((t) => !t.closest(e)).map((e) => e.textContent.replace(/\s+/g, " ").trim()).filter((e) => e.length > 2 && e.length < 200)), n.length && (o = [...new Set(n)].slice(0, 15).join(" | "));
14040
+ n.length || (n = Array.from(document.body.querySelectorAll("h1, h2, h3")).filter((t) => !t.closest(e)).map((e) => e.textContent.replace(/\s+/g, " ").trim()).filter((e) => e.length > 2 && e.length < 200)), n.length && (r = [...new Set(n)].slice(0, 15).join(" | "));
14073
14041
  } catch {}
14074
- let s = r && !m ? `RESUMING PRIOR SESSION — DO NOT GREET. The visitor is continuing the same conversation after a page reload. Do not introduce yourself or re-state your capabilities. Wait silently until the visitor speaks; if you must speak first, briefly acknowledge where you left off in one short sentence.\nPrior transcript:\n${n?.transcript || ""}\n\n` : "";
14075
- ue.sendContextualUpdate(`${s}SiteId: ${i || "unknown"}. ${x ? "" : "Visitor's email is already on file from a prior session — do NOT ask for it again. "}WALKTHROUGH RULE: When the visitor asks for a walkthrough or overview of this page, you MUST IMMEDIATELY call fwh-get-current-page-mvp (zero speech — call it silently with NO words before it) to get the exact highlightable headings. Do NOT skip fwh-get-current-page-mvp. Voice: call end_voice_session or say you are ending the session to stop.`), ue.sendContextualUpdate(j_(e, o, a));
14042
+ x || ne.sendContextualUpdate("The visitor's email is already on file from an earlier session."), ne.sendContextualUpdate(j_(e, r, n));
14076
14043
  } catch {}
14077
14044
  if (typeof window < "u") {
14078
14045
  let t = window.location.pathname, n = Date.now(), r = (e) => {
@@ -14081,57 +14048,51 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
14081
14048
  } catch {
14082
14049
  return ((e || "/").replace(/\/+$/, "") || "/").toLowerCase();
14083
14050
  }
14084
- }, a = () => {
14051
+ }, i = () => {
14085
14052
  if (e) return;
14086
- let a = window.location.pathname;
14087
- if (r(a) === r(t)) {
14088
- t = a;
14053
+ let i = window.location.pathname;
14054
+ if (r(i) === r(t)) {
14055
+ t = i;
14089
14056
  return;
14090
14057
  }
14091
14058
  if (Date.now() - n < 8e3) {
14092
- t = a;
14059
+ t = i;
14093
14060
  return;
14094
14061
  }
14095
- let o = typeof window < "u" && window.__fe_agent_nav || null, s = ee && r(a) === r(ee) || Gn() || o && Date.now() - o.ts < 15e3 && r(o.path) === r(a), c = t;
14096
- t = a;
14097
- let l = window.location.href, u = typeof document < "u" ? document.title : "", d = typeof document < "u" ? Array.from(document.querySelectorAll("h1, h2, h3, h4")).filter((e) => !e.closest("#flowengage-root, .flowengage-shell")).map((e) => ({
14062
+ let a = typeof window < "u" && window.__fe_agent_nav || null, o = D && r(i) === r(D) || Gn() || a && Date.now() - a.ts < 15e3 && r(a.path) === r(i), s = t;
14063
+ t = i;
14064
+ let c = window.location.href, l = typeof document < "u" ? Array.from(document.querySelectorAll("h1, h2, h3, h4")).filter((e) => !e.closest("#flowengage-root, .flowengage-shell")).map((e) => ({
14098
14065
  tag: e.tagName,
14099
14066
  text: e.textContent.trim()
14100
14067
  })).filter((e) => e.text.length > 0 && e.text.length < 200).slice(0, 20) : [];
14101
14068
  try {
14102
14069
  Pn();
14103
14070
  } catch {}
14104
- let f = d.map((e) => e.text).join(" | "), p = (e) => (e.split("/").filter(Boolean).pop() || "").replace(/[-_]/g, " ").replace(/\b\w/g, (e) => e.toUpperCase()) || "Home", m = p(c), h = p(a);
14105
- if (s) {
14106
- if (typeof window < "u" && (window.__fe_agent_nav = null), console.log(`[FlowEngage] agent-driven navigation settled: "${c}" → "${a}"`), ce(i) !== "auto") try {
14107
- R.current?.sendUserMessage?.(`[SYSTEM: YOU just navigated the visitor to the "${h}" page (${l}) at their request — this was YOUR action, not theirs. Page title: "${u}". Sections: ${JSON.stringify(d)}. Say: "Here we are on the ${h} page." Then introduce this page in 2-3 sentences, and finish by asking: "Would you like me to walk you through it section by section?" NEVER say "I see you've navigated" — the visitor did not navigate, you did. Do NOT call fwh-navigate-mvp again. Wait for their answer before describing sections.]`, { suppressQuestion: !0 });
14108
- } catch {}
14109
- else console.log("[FlowEngage] auto-nav — skipping the arrival acknowledgment turn");
14071
+ let u = l.map((e) => e.text).join(" | "), d = (e) => (e.split("/").filter(Boolean).pop() || "").replace(/[-_]/g, " ").replace(/\b\w/g, (e) => e.toUpperCase()) || "Home", f = d(s), p = d(i);
14072
+ if (o) {
14073
+ typeof window < "u" && (window.__fe_agent_nav = null), console.log(`[FlowEngage] agent-driven navigation settled: "${s}" → "${i}"`);
14110
14074
  try {
14111
- R.current?.sendContextualUpdate?.(j_(l, f));
14075
+ L.current?.sendContextualUpdate?.(j_(c, u));
14112
14076
  } catch {}
14113
14077
  return;
14114
14078
  }
14115
14079
  typeof window < "u" && (window.__fe_user_nav_during_speech = {
14116
- fromPath: c,
14117
- toPath: a,
14118
- fromPageName: m,
14119
- toPageName: h,
14080
+ fromPath: s,
14081
+ toPath: i,
14082
+ fromPageName: f,
14083
+ toPageName: p,
14120
14084
  ts: Date.now()
14121
- }), console.log(`[FlowEngage] visitor navigation detected: "${c}" → "${a}" (agent target: ${ee || "none"})`);
14122
- try {
14123
- R.current?.sendUserMessage?.(`[SYSTEM: I navigated away mid-walkthrough — I am now on the "${h}" page (${l}). Page title: "${u}". Sections: ${JSON.stringify(d)}. STOP everything. Do NOT describe the new page. Say EXACTLY: "I see you've navigated to the ${h} page — would you like me to continue what I was explaining, or shall I walk you through this page?" Then wait for my answer. IF I say continue/yes/carry on: resume speaking verbally from where you left off — do NOT call fwh-navigate-mvp, do NOT call fwh-highlight-mvp, the visitor will navigate themselves if needed. IF I want to hear about this page: call fwh-highlight-mvp for sections of "${h}" only.]`);
14124
- } catch {}
14085
+ }), console.log(`[FlowEngage] visitor navigation detected: "${s}" → "${i}" (agent target: ${D || "none"})`);
14125
14086
  try {
14126
- R.current?.sendContextualUpdate?.(j_(l, f));
14087
+ L.current?.sendContextualUpdate?.(j_(c, u, null, f));
14127
14088
  } catch {}
14128
14089
  };
14129
14090
  c = window.history.pushState.bind(window.history), window.history.pushState = (...e) => {
14130
- c(...e), setTimeout(a, 50);
14131
- }, p = () => setTimeout(a, 50), window.addEventListener("popstate", p);
14091
+ c(...e), setTimeout(i, 50);
14092
+ }, p = () => setTimeout(i, 50), window.addEventListener("popstate", p);
14132
14093
  }
14133
14094
  } catch (r) {
14134
- e || (console.error("[FlowEngage] startSession failed", r), r.message && r.message.includes("Too many voice sessions") ? (alert(r.message), n && n("minimized")) : (O("error"), Ne.current = "chat", window.setTimeout(() => {
14095
+ e || (console.error("[FlowEngage] startSession failed", r), r.message && r.message.includes("Too many voice sessions") ? (alert(r.message), n && n("minimized")) : (O("error"), Pe.current = "chat", window.setTimeout(() => {
14135
14096
  e || t?.();
14136
14097
  }, 0)));
14137
14098
  }
@@ -14140,15 +14101,15 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
14140
14101
  agentId: r,
14141
14102
  siteId: i,
14142
14103
  apiBaseUrl: a
14143
- }), e = !0, Me.current = !0;
14104
+ }), e = !0, Ne.current = !0;
14144
14105
  try {
14145
14106
  Pn();
14146
14107
  } catch {}
14147
14108
  if (i) try {
14148
- Le(i);
14109
+ Re(i);
14149
14110
  } catch {}
14150
- typeof window < "u" && (window.__fe_user_nav_during_speech = null), Pr(), Ve.current &&= (clearTimeout(Ve.current), null), He.current &&= (clearTimeout(He.current), null), ue.current &&= (clearTimeout(ue.current), null), B.current = !1, Be.current = "idle", c && typeof window < "u" && (window.history.pushState = c), p && typeof window < "u" && window.removeEventListener("popstate", p);
14151
- let t = o || R.current, n = Fe.current, d = Ie.current;
14111
+ typeof window < "u" && (window.__fe_user_nav_during_speech = null), Pr(), z.current &&= (clearTimeout(z.current), null), He.current &&= (clearTimeout(He.current), null), de.current &&= (clearTimeout(de.current), null), B.current = !1, Ve.current = "idle", c && typeof window < "u" && (window.history.pushState = c), p && typeof window < "u" && window.removeEventListener("popstate", p);
14112
+ let t = o || L.current, n = Ie.current, d = Le.current;
14152
14113
  if (t?.endSession?.().catch(() => {}), n && s && a) {
14153
14114
  let e = d ? Math.round((Date.now() - d) / 1e3) : 0, t = JSON.stringify({
14154
14115
  chatId: s,
@@ -14161,7 +14122,7 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
14161
14122
  headers: { "Content-Type": "application/json" },
14162
14123
  body: t,
14163
14124
  keepalive: !0
14164
- }).catch(() => {}), Fe.current = null, Ie.current = null;
14125
+ }).catch(() => {}), Ie.current = null, Le.current = null;
14165
14126
  }
14166
14127
  typeof u == "function" && l.current.length > 0 && u(l.current).catch?.(() => {});
14167
14128
  };
@@ -14174,48 +14135,48 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
14174
14135
  if (!ee) return;
14175
14136
  let e = (e) => {
14176
14137
  let t = e.composedPath?.()?.[0] || e.target;
14177
- z.current && !z.current.contains(t) && te(!1);
14138
+ R.current && !R.current.contains(t) && te(!1);
14178
14139
  };
14179
14140
  return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
14180
14141
  }, [ee]);
14181
14142
  let H = async () => {
14182
- if (R.current) try {
14143
+ if (L.current) try {
14183
14144
  if (k) {
14184
- Re.current = 0, await R.current.setMicMuted?.(!1), A(!1);
14145
+ ze.current = 0, await L.current.setMicMuted?.(!1), A(!1);
14185
14146
  try {
14186
- R.current.sendContextualUpdate?.("The visitor has unmuted. Resume normal interaction and wait for them to speak.");
14147
+ L.current.sendContextualUpdate?.("[MIC] The visitor unmuted their microphone.");
14187
14148
  } catch {}
14188
14149
  } else {
14189
- Re.current = 0, await R.current.setMicMuted?.(!0), A(!0);
14150
+ ze.current = 0, await L.current.setMicMuted?.(!0), A(!0);
14190
14151
  try {
14191
- R.current.sendContextualUpdate?.("The visitor has muted their microphone. Do NOT speak, ask if they are there, or prompt them in any way. Stay completely silent until they unmute.");
14152
+ L.current.sendContextualUpdate?.("[MIC] The visitor muted their microphone.");
14192
14153
  } catch {}
14193
14154
  }
14194
14155
  } catch {}
14195
14156
  }, U = o(async (e) => {
14196
14157
  e?.preventDefault?.();
14197
- let t = ae.trim().toLowerCase();
14158
+ let t = oe.trim().toLowerCase();
14198
14159
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)) {
14199
- P("Please enter a valid email address.");
14160
+ N("Please enter a valid email address.");
14200
14161
  return;
14201
14162
  }
14202
- P(""), se.current = !0, F.current = !1, V(), ie(!1), N(""), pe.current = !1;
14163
+ N(""), ce.current = !0, P.current = !1, V(), ae(!1), M(""), me.current = !1;
14203
14164
  try {
14204
14165
  typeof b == "function" && await b(t);
14205
14166
  } catch {}
14206
- R.current?.setMicMuted?.(!1);
14207
- let n = fe.current;
14208
- fe.current = "";
14167
+ L.current?.setMicMuted?.(!1);
14168
+ let n = pe.current;
14169
+ pe.current = "";
14209
14170
  try {
14210
- R.current?.injectAgentSpeech?.("Thank you for submitting your email."), R.current?.sendUserMessage?.(n || "The visitor's email is on file. Carry on helping them and never ask for it again.");
14171
+ L.current?.injectAgentSpeech?.("Thank you for submitting your email."), L.current?.sendUserMessage?.(n || "The visitor's email is on file. Carry on helping them and never ask for it again.");
14211
14172
  } catch {}
14212
14173
  }, [
14213
- ae,
14174
+ oe,
14214
14175
  b,
14215
14176
  V
14216
14177
  ]), Qe = Array.isArray(e) && e[0] || "#3B82F6";
14217
14178
  return /* @__PURE__ */ _("div", {
14218
- ref: z,
14179
+ ref: R,
14219
14180
  style: {
14220
14181
  position: "relative",
14221
14182
  display: "flex",
@@ -14225,7 +14186,7 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
14225
14186
  animation: "fe-orb-slide-up 0.42s cubic-bezier(0.16,1,0.3,1)"
14226
14187
  },
14227
14188
  children: [
14228
- re && /* @__PURE__ */ _("form", {
14189
+ ie && /* @__PURE__ */ _("form", {
14229
14190
  onSubmit: U,
14230
14191
  style: {
14231
14192
  width: "270px",
@@ -14257,9 +14218,9 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
14257
14218
  inputMode: "email",
14258
14219
  autoComplete: "email",
14259
14220
  autoFocus: !0,
14260
- value: ae,
14221
+ value: oe,
14261
14222
  onChange: (e) => {
14262
- N(e.target.value), oe && P("");
14223
+ M(e.target.value), se && N("");
14263
14224
  },
14264
14225
  placeholder: "you@example.com",
14265
14226
  style: {
@@ -14267,33 +14228,33 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
14267
14228
  boxSizing: "border-box",
14268
14229
  padding: "10px 12px",
14269
14230
  borderRadius: "10px",
14270
- border: oe ? "1.5px solid #ef4444" : "1.5px solid #4b5563",
14231
+ border: se ? "1.5px solid #ef4444" : "1.5px solid #4b5563",
14271
14232
  background: "#1f2937",
14272
14233
  color: "white",
14273
14234
  fontSize: "14px",
14274
14235
  outline: "none"
14275
14236
  }
14276
14237
  }),
14277
- oe && /* @__PURE__ */ g("span", {
14238
+ se && /* @__PURE__ */ g("span", {
14278
14239
  style: {
14279
14240
  color: "#f87171",
14280
14241
  fontSize: "12px"
14281
14242
  },
14282
- children: oe
14243
+ children: se
14283
14244
  }),
14284
14245
  /* @__PURE__ */ g("button", {
14285
14246
  type: "submit",
14286
- disabled: !ae.trim(),
14247
+ disabled: !oe.trim(),
14287
14248
  style: {
14288
14249
  width: "100%",
14289
14250
  padding: "10px 12px",
14290
14251
  borderRadius: "10px",
14291
14252
  border: "none",
14292
- background: ae.trim() ? Qe : "#374151",
14253
+ background: oe.trim() ? Qe : "#374151",
14293
14254
  color: "white",
14294
14255
  fontSize: "14px",
14295
14256
  fontWeight: 600,
14296
- cursor: ae.trim() ? "pointer" : "default",
14257
+ cursor: oe.trim() ? "pointer" : "default",
14297
14258
  transition: "background 0.2s ease"
14298
14259
  },
14299
14260
  children: "Submit"
@@ -14453,7 +14414,7 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
14453
14414
  children: [
14454
14415
  /* @__PURE__ */ _("button", {
14455
14416
  onClick: () => {
14456
- te(!1), Ne.current = "chat", Ze(t);
14417
+ te(!1), Pe.current = "chat", Ze(t);
14457
14418
  },
14458
14419
  style: {
14459
14420
  display: "flex",
@@ -14481,7 +14442,7 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
14481
14442
  children: [/* @__PURE__ */ g(vg, {}), T]
14482
14443
  }),
14483
14444
  i && /* @__PURE__ */ _("button", {
14484
- onClick: () => M(),
14445
+ onClick: () => re(),
14485
14446
  style: {
14486
14447
  display: "flex",
14487
14448
  alignItems: "center",
@@ -14557,7 +14518,7 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
14557
14518
  }),
14558
14519
  /* @__PURE__ */ _("button", {
14559
14520
  onClick: () => {
14560
- te(!1), Ne.current = "minimized", Ze(n);
14521
+ te(!1), Pe.current = "minimized", Ze(n);
14561
14522
  },
14562
14523
  style: {
14563
14524
  display: "flex",
@@ -14683,11 +14644,11 @@ var W_ = () => /* @__PURE__ */ g("div", {
14683
14644
  } }, e))
14684
14645
  })
14685
14646
  });
14686
- function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i, quickChatOptions: a, onQuickChatSelect: o, isMobile: s, chatHistory: l, isAiTyping: u, isAgentTyping: d, activeScreen: f, agentName: v, agentHeadshot: y, fallbackAgentName: b, input: x, setInput: S, onSubmit: C, isConversationEnded: w, isLoading: T, isRateLimited: E, rateLimitMessage: D, selectedFile: O, onFileSelect: k, onRemoveSelectedFile: A, attachmentError: ee, isUploadingAttachment: te, requiresEmail: ne, emailInput: j, setEmailInput: M, emailError: re, emailCaptureSuccess: ie, replyContext: ae, setReplyContext: N, webRTCError: oe, micError: P, setMicError: se, dismissCallError: F, activeCallId: ue, isCallMuted: de, toggleCallMute: fe, endWebRTCCall: pe, formatCallDuration: me, callDurationSeconds: he, isCallMinimized: ge, onExpand: _e, onCollapse: ve, onStartVoice: ye, voiceEnabled: be, headerBgColor: xe, onNewChat: I, showPoweredBy: L, privacyPolicyUrl: R, getVisitorChatHistory: Se, resumeChat: Ce, isSessionRestoring: we, isClosing: Te }) {
14687
- let Ee = l.length > 0, De = T || E || w, Oe = !!ue, [ke, Ae] = m(!1), { resolvedConfig: je } = kn(), Me = je?.siteId || null, [Ne, Pe] = m(() => ce(Me) === "auto"), Fe = () => {
14688
- let e = Ne ? "ask" : "auto";
14689
- le(Me, e), Pe(e === "auto");
14690
- }, [Ie, Le] = m(!1), [z, Re] = m([]), [ze, Be] = m(!1), Ve = p(null), [B, He] = m(() => typeof window < "u" ? window.visualViewport?.height ?? window.innerHeight : 600), [Ue, V] = m(0);
14647
+ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i, quickChatOptions: a, onQuickChatSelect: o, isMobile: s, chatHistory: l, isAiTyping: u, isAgentTyping: d, activeScreen: f, agentName: v, agentHeadshot: y, fallbackAgentName: b, input: x, setInput: S, onSubmit: C, isConversationEnded: w, isLoading: T, isRateLimited: E, rateLimitMessage: D, selectedFile: O, onFileSelect: k, onRemoveSelectedFile: A, attachmentError: ee, isUploadingAttachment: te, requiresEmail: ne, emailInput: j, setEmailInput: re, emailError: ie, emailCaptureSuccess: ae, replyContext: oe, setReplyContext: M, webRTCError: se, micError: N, setMicError: ce, dismissCallError: P, activeCallId: de, isCallMuted: fe, toggleCallMute: pe, endWebRTCCall: me, formatCallDuration: he, callDurationSeconds: ge, isCallMinimized: _e, onExpand: ve, onCollapse: ye, onStartVoice: be, voiceEnabled: xe, headerBgColor: Se, onNewChat: F, showPoweredBy: I, privacyPolicyUrl: L, getVisitorChatHistory: Ce, resumeChat: we, isSessionRestoring: Te, isClosing: Ee }) {
14648
+ let De = l.length > 0, Oe = T || E || w, ke = !!de, [Ae, je] = m(!1), { resolvedConfig: Me } = kn(), Ne = Me?.siteId || null, [Pe, Fe] = m(() => le(Ne) === "auto"), Ie = () => {
14649
+ let e = Pe ? "ask" : "auto";
14650
+ ue(Ne, e), Fe(e === "auto");
14651
+ }, [Le, Re] = m(!1), [R, ze] = m([]), [Be, Ve] = m(!1), z = p(null), [B, He] = m(() => typeof window < "u" ? window.visualViewport?.height ?? window.innerHeight : 600), [Ue, V] = m(0);
14691
14652
  c(() => {
14692
14653
  if (!s) return;
14693
14654
  let e = window.visualViewport;
@@ -14700,26 +14661,26 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
14700
14661
  };
14701
14662
  }, [s]);
14702
14663
  let We = s && window.innerHeight - B > 150, Ge = async () => {
14703
- Ae(!1), Le(!0), Be(!0);
14664
+ je(!1), Re(!0), Ve(!0);
14704
14665
  try {
14705
- let e = await Se();
14706
- e?.data && Re(e.data);
14666
+ let e = await Ce();
14667
+ e?.data && ze(e.data);
14707
14668
  } catch (e) {
14708
14669
  console.error(e);
14709
14670
  } finally {
14710
- Be(!1);
14671
+ Ve(!1);
14711
14672
  }
14712
14673
  }, Ke = async (e) => {
14713
- Le(!1), Ce?.(e.chatId);
14674
+ Re(!1), we?.(e.chatId);
14714
14675
  };
14715
14676
  return c(() => {
14716
- if (!ke) return;
14677
+ if (!Ae) return;
14717
14678
  let e = (e) => {
14718
14679
  let t = e.composedPath?.()?.[0] || e.target;
14719
- Ve.current && !Ve.current.contains(t) && Ae(!1);
14680
+ z.current && !z.current.contains(t) && je(!1);
14720
14681
  };
14721
14682
  return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
14722
- }, [ke]), /* @__PURE__ */ _("div", {
14683
+ }, [Ae]), /* @__PURE__ */ _("div", {
14723
14684
  style: s ? {
14724
14685
  "--flowengage-primary": n,
14725
14686
  "--flowengage-accent": n,
@@ -14733,7 +14694,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
14733
14694
  display: "flex",
14734
14695
  flexDirection: "column",
14735
14696
  overflow: "hidden",
14736
- animation: Te ? "fe-orb-slide-down 0.28s cubic-bezier(0.16,1,0.3,1) forwards" : "fe-orb-slide-up 0.28s cubic-bezier(0.16,1,0.3,1)"
14697
+ animation: Ee ? "fe-orb-slide-down 0.28s cubic-bezier(0.16,1,0.3,1) forwards" : "fe-orb-slide-up 0.28s cubic-bezier(0.16,1,0.3,1)"
14737
14698
  } : {
14738
14699
  "--flowengage-primary": n,
14739
14700
  "--flowengage-accent": n,
@@ -14746,7 +14707,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
14746
14707
  flexDirection: "column",
14747
14708
  overflow: "hidden",
14748
14709
  position: "relative",
14749
- animation: Te ? "fe-orb-slide-down 0.28s cubic-bezier(0.16,1,0.3,1) forwards" : "fe-orb-slide-up 0.36s cubic-bezier(0.16,1,0.3,1)"
14710
+ animation: Ee ? "fe-orb-slide-down 0.28s cubic-bezier(0.16,1,0.3,1) forwards" : "fe-orb-slide-up 0.36s cubic-bezier(0.16,1,0.3,1)"
14750
14711
  },
14751
14712
  children: [
14752
14713
  /* @__PURE__ */ _("div", {
@@ -14756,7 +14717,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
14756
14717
  alignItems: "center",
14757
14718
  columnGap: "14px",
14758
14719
  padding: "16px 10px 14px",
14759
- background: xe || "transparent",
14720
+ background: Se || "transparent",
14760
14721
  flexShrink: 0,
14761
14722
  position: "relative",
14762
14723
  zIndex: 30
@@ -14769,7 +14730,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
14769
14730
  alignItems: "center"
14770
14731
  },
14771
14732
  children: /* @__PURE__ */ g("button", {
14772
- onClick: ve,
14733
+ onClick: ye,
14773
14734
  style: {
14774
14735
  width: "40px",
14775
14736
  height: "40px",
@@ -14871,10 +14832,10 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
14871
14832
  isolation: "isolate",
14872
14833
  zIndex: 10
14873
14834
  },
14874
- ref: Ve,
14835
+ ref: z,
14875
14836
  children: [/* @__PURE__ */ g("button", {
14876
14837
  type: "button",
14877
- onClick: () => Ae((e) => !e),
14838
+ onClick: () => je((e) => !e),
14878
14839
  style: {
14879
14840
  width: "40px",
14880
14841
  height: "40px",
@@ -14920,7 +14881,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
14920
14881
  })
14921
14882
  ]
14922
14883
  })
14923
- }), ke && /* @__PURE__ */ _("div", {
14884
+ }), Ae && /* @__PURE__ */ _("div", {
14924
14885
  style: {
14925
14886
  position: "absolute",
14926
14887
  top: "34px",
@@ -14936,10 +14897,10 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
14936
14897
  animation: "fe-orb-fade-in 0.18s ease"
14937
14898
  },
14938
14899
  children: [
14939
- be && /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ _("button", {
14900
+ xe && /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ _("button", {
14940
14901
  type: "button",
14941
14902
  onClick: () => {
14942
- Ae(!1), ye?.();
14903
+ je(!1), be?.();
14943
14904
  },
14944
14905
  style: {
14945
14906
  display: "flex",
@@ -14981,7 +14942,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
14981
14942
  /* @__PURE__ */ _("button", {
14982
14943
  type: "button",
14983
14944
  onClick: () => {
14984
- Ae(!1), I?.();
14945
+ je(!1), F?.();
14985
14946
  },
14986
14947
  style: {
14987
14948
  display: "flex",
@@ -15016,7 +14977,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15016
14977
  children: [/* @__PURE__ */ g("path", { d: "M12 5H5a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-7" }), /* @__PURE__ */ g("path", { d: "M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z" })]
15017
14978
  }), "Start new chat"]
15018
14979
  }),
15019
- Se && /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g("div", { style: {
14980
+ Ce && /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g("div", { style: {
15020
14981
  height: "1px",
15021
14982
  background: "rgba(255,255,255,0.07)",
15022
14983
  margin: "0 14px"
@@ -15056,14 +15017,14 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15056
15017
  children: /* @__PURE__ */ g("path", { d: "M12 8v4l3 3M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0z" })
15057
15018
  }), "Chat history"]
15058
15019
  })] }),
15059
- Me && /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g("div", { style: {
15020
+ Ne && /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g("div", { style: {
15060
15021
  height: "1px",
15061
15022
  background: "rgba(255,255,255,0.07)",
15062
15023
  margin: "0 14px"
15063
15024
  } }), /* @__PURE__ */ _("button", {
15064
15025
  type: "button",
15065
15026
  onClick: () => {
15066
- Fe(), Ae(!1);
15027
+ Ie(), je(!1);
15067
15028
  },
15068
15029
  style: {
15069
15030
  display: "flex",
@@ -15120,7 +15081,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15120
15081
  width: "34px",
15121
15082
  height: "19px",
15122
15083
  borderRadius: "999px",
15123
- background: Ne ? "#22c55e" : "rgba(255,255,255,0.2)",
15084
+ background: Pe ? "#22c55e" : "rgba(255,255,255,0.2)",
15124
15085
  position: "relative",
15125
15086
  flexShrink: 0,
15126
15087
  transition: "background 0.15s ease"
@@ -15128,7 +15089,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15128
15089
  children: /* @__PURE__ */ g("span", { style: {
15129
15090
  position: "absolute",
15130
15091
  top: "2px",
15131
- left: Ne ? "17px" : "2px",
15092
+ left: Pe ? "17px" : "2px",
15132
15093
  width: "15px",
15133
15094
  height: "15px",
15134
15095
  borderRadius: "50%",
@@ -15145,7 +15106,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15145
15106
  /* @__PURE__ */ _("button", {
15146
15107
  type: "button",
15147
15108
  onClick: () => {
15148
- Ae(!1), ve?.();
15109
+ je(!1), ye?.();
15149
15110
  },
15150
15111
  style: {
15151
15112
  display: "flex",
@@ -15204,23 +15165,23 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15204
15165
  ]
15205
15166
  }),
15206
15167
  /* @__PURE__ */ g(Hg, {
15207
- webRTCError: oe,
15208
- micError: P,
15209
- setMicError: se,
15210
- dismissCallError: F,
15168
+ webRTCError: se,
15169
+ micError: N,
15170
+ setMicError: ce,
15171
+ dismissCallError: P,
15211
15172
  isRateLimited: E,
15212
15173
  rateLimitMessage: D
15213
15174
  }),
15214
- ge && /* @__PURE__ */ g(a_, {
15175
+ _e && /* @__PURE__ */ g(a_, {
15215
15176
  agentName: v,
15216
15177
  agentHeadshot: y,
15217
15178
  fallbackAgentName: b,
15218
- callDurationSeconds: he,
15219
- isCallMuted: de,
15220
- formatCallDuration: me,
15221
- toggleCallMute: fe,
15222
- endWebRTCCall: pe,
15223
- onExpand: _e,
15179
+ callDurationSeconds: ge,
15180
+ isCallMuted: fe,
15181
+ formatCallDuration: he,
15182
+ toggleCallMute: pe,
15183
+ endWebRTCCall: me,
15184
+ onExpand: ve,
15224
15185
  primaryColor: n
15225
15186
  }),
15226
15187
  /* @__PURE__ */ _("div", {
@@ -15232,7 +15193,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15232
15193
  background: "transparent",
15233
15194
  position: "relative"
15234
15195
  },
15235
- children: [Ie ? /* @__PURE__ */ _("div", {
15196
+ children: [Le ? /* @__PURE__ */ _("div", {
15236
15197
  style: {
15237
15198
  position: "absolute",
15238
15199
  inset: 0,
@@ -15251,7 +15212,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15251
15212
  flexShrink: 0
15252
15213
  },
15253
15214
  children: /* @__PURE__ */ _("button", {
15254
- onClick: () => Le(!1),
15215
+ onClick: () => Re(!1),
15255
15216
  style: {
15256
15217
  background: "none",
15257
15218
  border: "none",
@@ -15285,7 +15246,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15285
15246
  overflowY: "auto",
15286
15247
  position: "relative"
15287
15248
  },
15288
- children: ze ? /* @__PURE__ */ g("div", {
15249
+ children: Be ? /* @__PURE__ */ g("div", {
15289
15250
  style: {
15290
15251
  padding: "40px 20px",
15291
15252
  textAlign: "center",
@@ -15293,7 +15254,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15293
15254
  fontSize: "14px"
15294
15255
  },
15295
15256
  children: "Loading past conversations..."
15296
- }) : z.length > 0 ? /* @__PURE__ */ g("div", { children: z.map((e) => /* @__PURE__ */ _("div", {
15257
+ }) : R.length > 0 ? /* @__PURE__ */ g("div", { children: R.map((e) => /* @__PURE__ */ _("div", {
15297
15258
  onClick: () => Ke(e),
15298
15259
  style: {
15299
15260
  padding: "16px 20px",
@@ -15345,18 +15306,18 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15345
15306
  children: "No previous chats found."
15346
15307
  })
15347
15308
  })]
15348
- }) : null, Ee ? /* @__PURE__ */ g(zg, {
15309
+ }) : null, De ? /* @__PURE__ */ g(zg, {
15349
15310
  chatHistory: l,
15350
15311
  isAiTyping: u,
15351
15312
  isLoading: T,
15352
15313
  isAgentTyping: d,
15353
- setReplyContext: N,
15314
+ setReplyContext: M,
15354
15315
  TypingDots: W_,
15355
15316
  primaryColor: n,
15356
15317
  agentHeadshot: y,
15357
15318
  agentDisplayName: v || b,
15358
15319
  botAvatarNode: /* @__PURE__ */ g(U_, { orbColors: t })
15359
- }) : we ? /* @__PURE__ */ _("div", {
15320
+ }) : Te ? /* @__PURE__ */ _("div", {
15360
15321
  style: {
15361
15322
  flex: 1,
15362
15323
  display: "flex",
@@ -15446,7 +15407,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15446
15407
  ]
15447
15408
  })]
15448
15409
  }),
15449
- ie && /* @__PURE__ */ _("div", {
15410
+ ae && /* @__PURE__ */ _("div", {
15450
15411
  style: {
15451
15412
  margin: "0 16px 8px",
15452
15413
  padding: "9px 14px",
@@ -15492,13 +15453,13 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15492
15453
  setInput: S,
15493
15454
  onSubmit: C,
15494
15455
  isConversationEnded: w,
15495
- callUiActive: Oe,
15496
- handleToggleVoice: ye,
15456
+ callUiActive: ke,
15457
+ handleToggleVoice: be,
15497
15458
  showVoiceToggle: f === "agent",
15498
15459
  activeScreen: f,
15499
- inputDisabled: De,
15500
- replyContext: ae,
15501
- clearReplyContext: () => N(null),
15460
+ inputDisabled: Oe,
15461
+ replyContext: oe,
15462
+ clearReplyContext: () => M(null),
15502
15463
  onFileSelect: k,
15503
15464
  selectedFile: O,
15504
15465
  onRemoveSelectedFile: A,
@@ -15506,8 +15467,8 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15506
15467
  isUploadingAttachment: te,
15507
15468
  requiresEmail: ne,
15508
15469
  emailInput: j,
15509
- setEmailInput: M,
15510
- emailError: re,
15470
+ setEmailInput: re,
15471
+ emailError: ie,
15511
15472
  inputPlaceholder: e.inputPlaceholder
15512
15473
  })
15513
15474
  }),
@@ -15519,7 +15480,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15519
15480
  paddingBottom: "max(12px, env(safe-area-inset-bottom, 12px))",
15520
15481
  pointerEvents: "none"
15521
15482
  },
15522
- children: [R && /* @__PURE__ */ _("p", {
15483
+ children: [L && /* @__PURE__ */ _("p", {
15523
15484
  style: {
15524
15485
  margin: "0 0 4px",
15525
15486
  fontSize: "10px",
@@ -15532,7 +15493,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15532
15493
  "This conversation is recorded for quality assurance purposes.",
15533
15494
  " ",
15534
15495
  /* @__PURE__ */ g("a", {
15535
- href: R,
15496
+ href: L,
15536
15497
  target: "_blank",
15537
15498
  rel: "noopener noreferrer",
15538
15499
  style: {
@@ -15542,7 +15503,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15542
15503
  children: "See our privacy policy"
15543
15504
  })
15544
15505
  ]
15545
- }), L && /* @__PURE__ */ _("span", {
15506
+ }), I && /* @__PURE__ */ _("span", {
15546
15507
  style: {
15547
15508
  fontSize: "11px",
15548
15509
  color: "#9ca3af",
@@ -15562,33 +15523,33 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
15562
15523
  });
15563
15524
  }
15564
15525
  function K_() {
15565
- let { status: e, runtimeConfig: t, resolvedConfig: n, chatHistory: r, isOpen: i, activeScreen: a, isHumanHandled: s, agentName: l, agentHeadshot: u, visitorEmail: h, isAgentTyping: v, isAiTyping: y, isLoading: b, isRateLimited: x, rateLimitMessage: S, isConversationEnded: C, incomingCall: w, activeCallId: T, callConnectionState: E, callConnectedAt: D, isCallMuted: O, webRTCError: k, language: A, chatId: ee, historyRef: te, onMessageSync: ne, beaconSyncVoiceTranscript: j, sendMessage: M, uploadChatFile: re, openWidget: ie, captureVisitorEmail: ae, setVoiceMode: N, endConversation: se, startNewChat: F, acceptCall: ce, rejectCall: le, endWebRTCCall: ue, toggleCallMute: de, dismissCallError: fe, startTyping: pe, stopTyping: me, updateTypingDraft: he, getVisitorChatHistory: ge, resumeChat: _e, isSessionRestoring: ve, openToChatCounter: ye, voiceEndCounter: be } = kn();
15526
+ let { status: e, runtimeConfig: t, resolvedConfig: n, chatHistory: r, isOpen: i, activeScreen: a, isHumanHandled: s, agentName: l, agentHeadshot: u, visitorEmail: h, isAgentTyping: v, isAiTyping: y, isLoading: b, isRateLimited: x, rateLimitMessage: S, isConversationEnded: C, incomingCall: w, activeCallId: T, callConnectionState: E, callConnectedAt: D, isCallMuted: O, webRTCError: k, language: A, chatId: ee, historyRef: te, onMessageSync: ne, beaconSyncVoiceTranscript: j, sendMessage: re, uploadChatFile: ie, openWidget: ae, captureVisitorEmail: oe, setVoiceMode: M, endConversation: ce, startNewChat: P, acceptCall: le, rejectCall: ue, endWebRTCCall: de, toggleCallMute: fe, dismissCallError: pe, startTyping: me, stopTyping: he, updateTypingDraft: ge, getVisitorChatHistory: _e, resumeChat: ve, isSessionRestoring: ye, openToChatCounter: be, voiceEndCounter: xe } = kn();
15566
15527
  c(() => {
15567
15528
  try {
15568
15529
  fr();
15569
15530
  } catch {}
15570
15531
  }, []), c(() => {
15571
- ye && W !== "voice_mode" && W !== "text_chat" && W !== "call_screen" && (N?.(!1), et("text_chat"));
15572
- }, [ye]);
15573
- let xe = t?.widgetSettings || {}, I = n?.widgetSettings || {}, L = {
15574
- ...xe.branding || {},
15575
- ...I.branding || {}
15576
- }, R = {
15577
- ...xe.theme || {},
15578
- ...I.theme || {}
15579
- }, Se = {
15580
- ...xe.features || {},
15581
- ...I.features || {}
15582
- }, Ce = Se.voice !== !1, we = Array.isArray(R.orbColors) && R.orbColors.length > 0 ? R.orbColors : null, Te = R.buttonColor || R.primaryColor || we?.[0] || "#3B82F6", Oe = {
15532
+ be && W !== "voice_mode" && W !== "text_chat" && W !== "call_screen" && (M?.(!1), et("text_chat"));
15533
+ }, [be]);
15534
+ let Se = t?.widgetSettings || {}, F = n?.widgetSettings || {}, I = {
15535
+ ...Se.branding || {},
15536
+ ...F.branding || {}
15537
+ }, L = {
15538
+ ...Se.theme || {},
15539
+ ...F.theme || {}
15540
+ }, Ce = {
15541
+ ...Se.features || {},
15542
+ ...F.features || {}
15543
+ }, we = Ce.voice !== !1, Te = Array.isArray(L.orbColors) && L.orbColors.length > 0 ? L.orbColors : null, Ee = L.buttonColor || L.primaryColor || Te?.[0] || "#3B82F6", ke = {
15583
15544
  small: 50,
15584
15545
  medium: 64,
15585
15546
  large: 80
15586
- }, ke = Oe[R.orbSize] || Oe.small, je = R.position || "bottom-right", Me = L.fallbackAgentName || "Agent", Pe = N_(we ?? R.chatBgColors), Fe = L.logo || L.logoUrl || null, Ie = A || "en", Le = xe.recommendations?.[Ie] || [], z = (I.recommendations?.[Ie] ?? Le).filter((e) => String(e?.label ?? "").trim()).map((e, t) => ({
15547
+ }, Ae = ke[L.orbSize] || ke.small, Me = L.position || "bottom-right", Ne = I.fallbackAgentName || "Agent", Fe = N_(Te ?? L.chatBgColors), Ie = I.logo || I.logoUrl || null, Le = A || "en", Re = Se.recommendations?.[Le] || [], R = (F.recommendations?.[Le] ?? Re).filter((e) => String(e?.label ?? "").trim()).map((e, t) => ({
15587
15548
  id: e.key || `qr-${t}`,
15588
15549
  label: e.label,
15589
15550
  message: e.label,
15590
15551
  text: e.label
15591
- })), Re = Array.isArray(L.quickChatOptions) && L.quickChatOptions.length > 0 ? L.quickChatOptions : z, ze = L.hideWatermark === !0 ? !1 : L.showPoweredBy !== !1, Be = L.headerBgColor || null, Ve = R.bottomPosition == null ? "1.5rem" : `${R.bottomPosition}px`, B = L.privacyPolicyUrl || null, He = L.chatbotEnabled !== !1 && R.chatbotEnabled !== !1, [Ue, V] = m(() => typeof window < "u" ? window.location.pathname : "/");
15552
+ })), ze = Array.isArray(I.quickChatOptions) && I.quickChatOptions.length > 0 ? I.quickChatOptions : R, Be = I.hideWatermark === !0 ? !1 : I.showPoweredBy !== !1, Ve = I.headerBgColor || null, z = L.bottomPosition == null ? "1.5rem" : `${L.bottomPosition}px`, B = I.privacyPolicyUrl || null, He = I.chatbotEnabled !== !1 && L.chatbotEnabled !== !1, [Ue, V] = m(() => typeof window < "u" ? window.location.pathname : "/");
15592
15553
  c(() => {
15593
15554
  if (typeof window > "u") return;
15594
15555
  let e = () => V(window.location.pathname), t = window.history.pushState.bind(window.history);
@@ -15600,24 +15561,24 @@ function K_() {
15600
15561
  }, []);
15601
15562
  let We = (() => {
15602
15563
  let e = {
15603
- ...xe.pageVisibility || {},
15604
- ...I.pageVisibility || {}
15564
+ ...Se.pageVisibility || {},
15565
+ ...F.pageVisibility || {}
15605
15566
  };
15606
15567
  return Array.isArray(e.allowedPaths) ? e.allowedPaths.filter(Boolean) : [];
15607
- })(), Ge = We.length === 0 || We.some((e) => e === "*" || e === "/*" ? !0 : e.endsWith("/*") ? Ue.startsWith(e.slice(0, -1)) : Ue.replace(/\/$/, "") === e.replace(/\/$/, "")), Ke = xe.greetings?.[A] || I.greetings?.[A] || L.introGreeting || (t?.websiteName && String(t.websiteName).trim() ? `Hello, I'm here to help you know more about ${String(t.websiteName).trim()}.` : "Hello, I'm here to help — what would you like to know?"), qe = {
15608
- entryPrompt: L.entryPrompt || "Do you want to explore in a new way?",
15609
- yesLabel: L.yesLabel || "Yes",
15610
- laterLabel: L.laterLabel || "Later",
15611
- connectionTitle: L.connectionTitle || "How would you like to connect?",
15612
- connectionSubtitle: L.connectionSubtitle || "",
15613
- voiceLabel: L.voiceLabel || "Voice",
15614
- textLabel: L.textLabel || "Text",
15615
- chatTitle: L.headerName || "Chat with FlowEngage",
15616
- hasCustomTitle: !!(L.headerName && String(L.headerName).trim()),
15568
+ })(), Ge = We.length === 0 || We.some((e) => e === "*" || e === "/*" ? !0 : e.endsWith("/*") ? Ue.startsWith(e.slice(0, -1)) : Ue.replace(/\/$/, "") === e.replace(/\/$/, "")), Ke = Se.greetings?.[A] || F.greetings?.[A] || I.introGreeting || (t?.websiteName && String(t.websiteName).trim() ? `Hello, I'm here to help you know more about ${String(t.websiteName).trim()}.` : "Hello, I'm here to help — what would you like to know?"), qe = {
15569
+ entryPrompt: I.entryPrompt || "Do you want to explore in a new way?",
15570
+ yesLabel: I.yesLabel || "Yes",
15571
+ laterLabel: I.laterLabel || "Later",
15572
+ connectionTitle: I.connectionTitle || "How would you like to connect?",
15573
+ connectionSubtitle: I.connectionSubtitle || "",
15574
+ voiceLabel: I.voiceLabel || "Voice",
15575
+ textLabel: I.textLabel || "Text",
15576
+ chatTitle: I.headerName || "Chat with FlowEngage",
15577
+ hasCustomTitle: !!(I.headerName && String(I.headerName).trim()),
15617
15578
  introGreeting: Ke,
15618
- inputPlaceholder: L.inputPlaceholder || "Type your message",
15619
- analysingLabel: L.analysingLabel || "analysing..."
15620
- }, Je = I.elevenLabsAgentId || t?.elevenLabsAgentId || null, Ye = t?.siteId || n?.siteId || null, Xe = t?.apiBaseUrl || "";
15579
+ inputPlaceholder: I.inputPlaceholder || "Type your message",
15580
+ analysingLabel: I.analysingLabel || "analysing..."
15581
+ }, Je = F.elevenLabsAgentId || t?.elevenLabsAgentId || null, Ye = t?.siteId || n?.siteId || null, Xe = t?.apiBaseUrl || "";
15621
15582
  c(() => {
15622
15583
  Qn(t?.siteType || null);
15623
15584
  }, [t?.siteType]);
@@ -15628,10 +15589,10 @@ function K_() {
15628
15589
  ]), H = u && String(u).trim() || t?.ownerProfileImageUrl && String(t.ownerProfileImageUrl).trim() || null, U = r.some((e) => e.sender === "user"), Qe = f(() => {
15629
15590
  let e = r.findIndex((e) => e.sender === "user");
15630
15591
  return e === -1 ? !1 : r.slice(e + 1).some((e) => e.sender === "bot" || e.sender === "ai" || e.sender === "agent");
15631
- }, [r]), $e = !!(I._dashboardLivePreview || xe._dashboardLivePreview), [W, et] = m(() => $e ? "text_chat" : "entry_prompt"), [tt, nt] = m(""), [rt, it] = m(null), [at, ot] = m(h || ""), [st, ct] = m(""), [G, lt] = m(!1), [ut, dt] = m(0), [ft, pt] = m(null), [mt, ht] = m(null), [gt, _t] = m(""), [vt, yt] = m(!1), [bt, xt] = m(!1), [St, Ct] = m(!1), wt = p(null), Tt = p(!1), Et = !h && U && Qe && W !== "voice_mode";
15592
+ }, [r]), $e = !!(F._dashboardLivePreview || Se._dashboardLivePreview), [W, et] = m(() => $e ? "text_chat" : "entry_prompt"), [tt, nt] = m(""), [rt, it] = m(null), [at, ot] = m(h || ""), [st, ct] = m(""), [G, lt] = m(!1), [ut, dt] = m(0), [ft, pt] = m(null), [mt, ht] = m(null), [gt, _t] = m(""), [vt, yt] = m(!1), [bt, xt] = m(!1), [St, Ct] = m(!1), wt = p(null), Tt = p(!1), Et = !h && U && Qe && W !== "voice_mode";
15632
15593
  d(() => {
15633
15594
  if (e !== "ready" || Tt.current) return;
15634
- if (Tt.current = !0, !Ce) {
15595
+ if (Tt.current = !0, !we) {
15635
15596
  et("minimized_orb");
15636
15597
  return;
15637
15598
  }
@@ -15639,13 +15600,13 @@ function K_() {
15639
15600
  try {
15640
15601
  t = wr().shouldResumeVoice;
15641
15602
  } catch {}
15642
- let n = Ae(), r = Ye ? Ee(Ye) : null, i = n || !!r?.transcript;
15603
+ let n = je(), r = Ye ? De(Ye) : null, i = n || !!r?.transcript;
15643
15604
  if (t) {
15644
- ie?.({ notifyChatInitiated: !0 }), N?.(!0), et("voice_mode");
15605
+ ae?.({ notifyChatInitiated: !0 }), M?.(!0), et("voice_mode");
15645
15606
  return;
15646
15607
  }
15647
- if (Ne()) {
15648
- ie?.({ notifyChatInitiated: !1 }), et("text_chat");
15608
+ if (Pe()) {
15609
+ ae?.({ notifyChatInitiated: !1 }), et("text_chat");
15649
15610
  return;
15650
15611
  }
15651
15612
  if (i) {
@@ -15653,13 +15614,13 @@ function K_() {
15653
15614
  et("minimized_orb");
15654
15615
  return;
15655
15616
  }
15656
- ie?.({ notifyChatInitiated: !0 }), N?.(!0), et("voice_mode");
15617
+ ae?.({ notifyChatInitiated: !0 }), M?.(!0), et("voice_mode");
15657
15618
  return;
15658
15619
  }
15659
15620
  if (Ye) try {
15660
- De(Ye);
15621
+ Oe(Ye);
15661
15622
  } catch {}
15662
- if (oe(Ye)) {
15623
+ if (se(Ye)) {
15663
15624
  et("minimized_orb");
15664
15625
  return;
15665
15626
  }
@@ -15717,7 +15678,7 @@ function K_() {
15717
15678
  hasIncomingCall: !!w?.callId,
15718
15679
  activeCallId: T,
15719
15680
  callConnectionState: E
15720
- }), wt.current = e, W === "voice_mode" && N?.(!1), ie?.(), jt());
15681
+ }), wt.current = e, W === "voice_mode" && M?.(!1), ae?.(), jt());
15721
15682
  }
15722
15683
  }, [
15723
15684
  T,
@@ -15725,8 +15686,8 @@ function K_() {
15725
15686
  jt,
15726
15687
  w?.callId,
15727
15688
  i,
15728
- ie,
15729
- N,
15689
+ ae,
15690
+ M,
15730
15691
  W
15731
15692
  ]), c(() => {
15732
15693
  !w && !T && W === "call_screen" && et("text_chat");
@@ -15738,16 +15699,16 @@ function K_() {
15738
15699
  !T && bt && xt(!1);
15739
15700
  }, [T, bt]), c(() => {
15740
15701
  if (!s || C) {
15741
- he?.(""), me?.();
15702
+ ge?.(""), he?.();
15742
15703
  return;
15743
15704
  }
15744
15705
  if (!tt.trim() || mt) {
15745
- he?.("");
15746
- let e = window.setTimeout(() => me?.(), 100);
15706
+ ge?.("");
15707
+ let e = window.setTimeout(() => he?.(), 100);
15747
15708
  return () => window.clearTimeout(e);
15748
15709
  }
15749
- pe?.();
15750
- let e = window.setTimeout(() => he?.(tt), 120), t = window.setTimeout(() => me?.(), 1200);
15710
+ me?.();
15711
+ let e = window.setTimeout(() => ge?.(tt), 120), t = window.setTimeout(() => he?.(), 1200);
15751
15712
  return () => {
15752
15713
  window.clearTimeout(e), window.clearTimeout(t);
15753
15714
  };
@@ -15756,9 +15717,9 @@ function K_() {
15756
15717
  mt,
15757
15718
  s,
15758
15719
  C,
15759
- pe,
15760
15720
  me,
15761
- he
15721
+ he,
15722
+ ge
15762
15723
  ]);
15763
15724
  let Nt = (e) => e ? {
15764
15725
  replyTo: e.messageId || e.id || null,
@@ -15772,7 +15733,7 @@ function K_() {
15772
15733
  ct("Please enter a valid email so we can continue helping you.");
15773
15734
  return;
15774
15735
  }
15775
- await ae(e), ct(""), lt(!0), setTimeout(() => lt(!1), 3e3);
15736
+ await oe(e), ct(""), lt(!0), setTimeout(() => lt(!1), 3e3);
15776
15737
  return;
15777
15738
  }
15778
15739
  let t = Nt(rt);
@@ -15780,8 +15741,8 @@ function K_() {
15780
15741
  if (mt) {
15781
15742
  try {
15782
15743
  yt(!0), _t("");
15783
- let e = await re(mt), n = e?.data || e, r = tt.trim() || `Shared file: ${Fg(mt)}`;
15784
- nt(""), it(null), kt(), await M(r, "", t, {
15744
+ let e = await ie(mt), n = e?.data || e, r = tt.trim() || `Shared file: ${Fg(mt)}`;
15745
+ nt(""), it(null), kt(), await re(r, "", t, {
15785
15746
  type: "file",
15786
15747
  metadata: {
15787
15748
  fileUrl: n?.fileUrl,
@@ -15798,20 +15759,20 @@ function K_() {
15798
15759
  return;
15799
15760
  }
15800
15761
  let n = tt.trim();
15801
- nt(""), it(null), await M(n, "", t);
15762
+ nt(""), it(null), await re(n, "", t);
15802
15763
  }, Ft = o(() => {
15803
- r.length !== 0 && F?.();
15804
- }, [r.length, F]), It = (e) => {
15764
+ r.length !== 0 && P?.();
15765
+ }, [r.length, P]), It = (e) => {
15805
15766
  let t = Math.floor(e / 60);
15806
15767
  return `${String(t).padStart(2, "0")}:${String(e % 60).padStart(2, "0")}`;
15807
15768
  }, Lt = o(async (e) => {
15808
15769
  if (C || b) return;
15809
15770
  let t = e.message || e.label || e.text || "";
15810
- t.trim() && await M(t.trim(), "");
15771
+ t.trim() && await re(t.trim(), "");
15811
15772
  }, [
15812
15773
  C,
15813
15774
  b,
15814
- M
15775
+ re
15815
15776
  ]), Rt = Dt && W === "entry_prompt" ? { inset: 0 } : Dt && W === "text_chat" ? {
15816
15777
  left: 0,
15817
15778
  right: 0,
@@ -15832,19 +15793,19 @@ function K_() {
15832
15793
  height: "min(640px, calc(100vh - 120px))",
15833
15794
  borderRadius: "22px",
15834
15795
  overflow: "hidden",
15835
- ...je === "bottom-left" ? {
15796
+ ...Me === "bottom-left" ? {
15836
15797
  left: "1.5rem",
15837
- bottom: Ve
15798
+ bottom: z
15838
15799
  } : {
15839
15800
  right: "1.5rem",
15840
- bottom: Ve
15801
+ bottom: z
15841
15802
  }
15842
- } : je === "bottom-left" ? {
15803
+ } : Me === "bottom-left" ? {
15843
15804
  left: "1.5rem",
15844
- bottom: Ve
15805
+ bottom: z
15845
15806
  } : {
15846
15807
  right: "1.5rem",
15847
- bottom: Ve
15808
+ bottom: z
15848
15809
  }, zt = o(() => {
15849
15810
  W !== "minimized_orb" && (Ct(!0), setTimeout(() => {
15850
15811
  et("minimized_orb"), Ct(!1), T && xt(!0);
@@ -15857,13 +15818,13 @@ function K_() {
15857
15818
  t.resume().catch(() => {}), setTimeout(() => t.close().catch(() => {}), 3e3);
15858
15819
  }
15859
15820
  } catch {}
15860
- ie({ notifyChatInitiated: !0 }), N?.(!0), et("voice_mode");
15821
+ ae({ notifyChatInitiated: !0 }), M?.(!0), et("voice_mode");
15861
15822
  }, Ht = () => {
15862
- ie({ notifyChatInitiated: !0 }), N?.(!1), et("text_chat");
15823
+ ae({ notifyChatInitiated: !0 }), M?.(!1), et("text_chat");
15863
15824
  }, Ut = () => {
15864
- N?.(!1), zt();
15825
+ M?.(!1), zt();
15865
15826
  };
15866
- return e !== "ready" || !He || Se.chat === !1 || !Ge ? null : /* @__PURE__ */ _("div", {
15827
+ return e !== "ready" || !He || Ce.chat === !1 || !Ge ? null : /* @__PURE__ */ _("div", {
15867
15828
  className: "flowengage-widget-root",
15868
15829
  style: {
15869
15830
  position: "fixed",
@@ -15875,13 +15836,13 @@ function K_() {
15875
15836
  children: [
15876
15837
  W === "entry_prompt" && /* @__PURE__ */ g(B_, {
15877
15838
  copy: qe,
15878
- orbColors: we,
15879
- primaryColor: Te,
15839
+ orbColors: Te,
15840
+ primaryColor: Ee,
15880
15841
  onYes: () => {
15881
- P(Ye), Vt();
15842
+ N(Ye), Vt();
15882
15843
  },
15883
15844
  onLater: () => {
15884
- P(Ye), zt();
15845
+ N(Ye), zt();
15885
15846
  },
15886
15847
  isMobile: Dt,
15887
15848
  isClosing: St
@@ -15905,7 +15866,7 @@ function K_() {
15905
15866
  transformOrigin: "bottom right",
15906
15867
  display: "inline-flex",
15907
15868
  flexDirection: "column",
15908
- alignItems: je === "bottom-left" ? "flex-start" : "flex-end",
15869
+ alignItems: Me === "bottom-left" ? "flex-start" : "flex-end",
15909
15870
  gap: "10px"
15910
15871
  },
15911
15872
  children: [T && /* @__PURE__ */ _("button", {
@@ -15957,15 +15918,15 @@ function K_() {
15957
15918
  })]
15958
15919
  })]
15959
15920
  }), /* @__PURE__ */ g(z_, {
15960
- size: ke,
15961
- orbColors: we,
15962
- onClick: T ? jt : Ce ? Bt : Ht
15921
+ size: Ae,
15922
+ orbColors: Te,
15923
+ onClick: T ? jt : we ? Bt : Ht
15963
15924
  })]
15964
15925
  }),
15965
15926
  W === "connection_modal" && /* @__PURE__ */ g(V_, {
15966
15927
  copy: qe,
15967
- orbColors: we,
15968
- primaryColor: Te,
15928
+ orbColors: Te,
15929
+ primaryColor: Ee,
15969
15930
  onVoice: Vt,
15970
15931
  onText: Ht,
15971
15932
  onClose: zt,
@@ -15973,7 +15934,7 @@ function K_() {
15973
15934
  isClosing: St
15974
15935
  }),
15975
15936
  W === "voice_mode" && /* @__PURE__ */ g(H_, {
15976
- orbColors: we,
15937
+ orbColors: Te,
15977
15938
  onEnterChat: Ht,
15978
15939
  onEndChat: Ut,
15979
15940
  agentId: Je,
@@ -15983,17 +15944,17 @@ function K_() {
15983
15944
  historyRef: te,
15984
15945
  onMessageSync: ne,
15985
15946
  beaconSyncVoiceTranscript: j,
15986
- widgetPosition: je,
15987
- voiceEndCounter: be,
15947
+ widgetPosition: Me,
15948
+ voiceEndCounter: xe,
15988
15949
  websiteName: t?.websiteName,
15989
- voiceFirstMessage: xe.voiceFirstMessage || null,
15990
- captureVisitorEmail: ae,
15950
+ voiceFirstMessage: Se.voiceFirstMessage || null,
15951
+ captureVisitorEmail: oe,
15991
15952
  emailRequired: !h,
15992
- emailCaptureEnabled: Se.emailCapture !== !1 && L.disableEmailCapture !== !0,
15993
- listeningLabel: L.voiceListeningLabel || "Listening...",
15994
- thinkingLabel: L.voiceThinkingLabel || "Thinking...",
15995
- enterChatModeLabel: L.voiceEnterChatLabel || "Enter Chat Mode",
15996
- endConversationLabel: L.voiceEndConversationLabel || "End Conversation"
15953
+ emailCaptureEnabled: Ce.emailCapture !== !1 && I.disableEmailCapture !== !0,
15954
+ listeningLabel: I.voiceListeningLabel || "Listening...",
15955
+ thinkingLabel: I.voiceThinkingLabel || "Thinking...",
15956
+ enterChatModeLabel: I.voiceEnterChatLabel || "Enter Chat Mode",
15957
+ endConversationLabel: I.voiceEndConversationLabel || "End Conversation"
15997
15958
  }, "voice"),
15998
15959
  W === "call_screen" && /* @__PURE__ */ g(i_, {
15999
15960
  incomingCall: w,
@@ -16003,25 +15964,25 @@ function K_() {
16003
15964
  isCallMuted: O,
16004
15965
  agentName: Ze,
16005
15966
  agentHeadshot: H,
16006
- fallbackAgentName: Me,
16007
- acceptCall: ce,
16008
- rejectCall: le,
16009
- endWebRTCCall: ue,
16010
- toggleCallMute: de,
15967
+ fallbackAgentName: Ne,
15968
+ acceptCall: le,
15969
+ rejectCall: ue,
15970
+ endWebRTCCall: de,
15971
+ toggleCallMute: fe,
16011
15972
  formatCallDuration: It,
16012
15973
  onMinimize: Mt,
16013
- primaryColor: Te,
16014
- orbColors: we,
15974
+ primaryColor: Ee,
15975
+ orbColors: Te,
16015
15976
  chatHistory: r
16016
15977
  }),
16017
15978
  W === "text_chat" && /* @__PURE__ */ g(G_, {
16018
15979
  isClosing: St,
16019
15980
  copy: qe,
16020
- orbColors: we,
16021
- primaryColor: Te,
16022
- chatBgGradient: Pe,
16023
- logo: Fe,
16024
- quickChatOptions: Re,
15981
+ orbColors: Te,
15982
+ primaryColor: Ee,
15983
+ chatBgGradient: Fe,
15984
+ logo: Ie,
15985
+ quickChatOptions: ze,
16025
15986
  onQuickChatSelect: Lt,
16026
15987
  isMobile: Dt,
16027
15988
  chatHistory: r,
@@ -16030,7 +15991,7 @@ function K_() {
16030
15991
  activeScreen: a,
16031
15992
  agentName: Ze,
16032
15993
  agentHeadshot: H,
16033
- fallbackAgentName: Me,
15994
+ fallbackAgentName: Ne,
16034
15995
  input: tt,
16035
15996
  setInput: nt,
16036
15997
  onSubmit: Pt,
@@ -16053,26 +16014,26 @@ function K_() {
16053
16014
  webRTCError: k,
16054
16015
  micError: ft,
16055
16016
  setMicError: pt,
16056
- dismissCallError: fe,
16017
+ dismissCallError: pe,
16057
16018
  activeCallId: T,
16058
16019
  isCallMuted: O,
16059
- toggleCallMute: de,
16060
- endWebRTCCall: ue,
16020
+ toggleCallMute: fe,
16021
+ endWebRTCCall: de,
16061
16022
  formatCallDuration: It,
16062
16023
  callDurationSeconds: ut,
16063
16024
  onCollapse: zt,
16064
16025
  onStartVoice: Vt,
16065
- voiceEnabled: Ce,
16026
+ voiceEnabled: we,
16066
16027
  onNewChat: Ft,
16067
16028
  onMinimize: Mt,
16068
16029
  onExpand: jt,
16069
16030
  isCallMinimized: !!T,
16070
- showPoweredBy: ze,
16031
+ showPoweredBy: Be,
16071
16032
  privacyPolicyUrl: B,
16072
- headerBgColor: Be,
16073
- getVisitorChatHistory: ge,
16074
- resumeChat: _e,
16075
- isSessionRestoring: ve
16033
+ headerBgColor: Ve,
16034
+ getVisitorChatHistory: _e,
16035
+ resumeChat: ve,
16036
+ isSessionRestoring: ye
16076
16037
  }),
16077
16038
  /* @__PURE__ */ g("style", { children: "\n /* Force any SVG (or img) inside LogoSlot to fill the container height\n regardless of whether the component forwards its style prop. */\n .fe-logo-slot svg,\n .fe-logo-slot img { height: 100%; width: auto; display: block; }\n\n @keyframes fe-orb-breathe { 0%,100%{transform:scale(1)} 50%{transform:scale(1.04)} }\n @keyframes fe-orb-breathe-subtle { 0%,100%{transform:scale(1)} 50%{transform:scale(1.025)} }\n @keyframes fe-orb-pulse { 0%{transform:scale(1);opacity:.65} 50%{transform:scale(1.28);opacity:.1} 100%{transform:scale(1);opacity:.65} }\n @keyframes fe-orb-glow { from{opacity:.35} to{opacity:.75} }\n @keyframes fe-orb-fade-in { from{opacity:0} to{opacity:1} }\n @keyframes fe-orb-slide-up { from{opacity:0;transform:translateY(18px)} to{opacity:1;transform:translateY(0)} }\n @keyframes fe-orb-slide-down { from{opacity:1;transform:translateY(0)} to{opacity:0;transform:translateY(24px)} }\n @keyframes fe-orb-bar-0 { from{height:6px} to{height:18px} }\n @keyframes fe-orb-bar-1 { from{height:10px} to{height:22px} }\n @keyframes fe-orb-bar-2 { from{height:14px} to{height:26px} }\n @keyframes fe-orb-bar-3 { from{height:8px} to{height:20px} }\n @keyframes fe-orb-bar-4 { from{height:6px} to{height:16px} }\n @keyframes fe-dot-bounce { 0%,80%,100%{transform:translateY(0);opacity:.5} 40%{transform:translateY(-5px);opacity:1} }\n " })
16078
16039
  ]