@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",
|
|
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
|
-
},
|
|
41
|
+
}, ae = () => {
|
|
42
42
|
if (j) try {
|
|
43
43
|
window.localStorage.removeItem(A.chatId);
|
|
44
44
|
} catch {}
|
|
45
|
-
},
|
|
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 =
|
|
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
|
-
},
|
|
53
|
+
}, N = (e) => {
|
|
54
54
|
if (!(!j || !e)) try {
|
|
55
|
-
let t =
|
|
55
|
+
let t = M(e);
|
|
56
56
|
t && window.localStorage.setItem(t, "1");
|
|
57
57
|
} catch {}
|
|
58
|
-
},
|
|
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 =
|
|
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
|
-
},
|
|
66
|
+
}, ue = (e, t) => {
|
|
67
67
|
if (!(!j || !e || t !== "auto" && t !== "ask")) try {
|
|
68
|
-
let n =
|
|
69
|
-
n && window.localStorage.setItem(n, t),
|
|
68
|
+
let n = ce(e);
|
|
69
|
+
n && window.localStorage.setItem(n, t), fe(e);
|
|
70
70
|
} catch {}
|
|
71
|
-
},
|
|
71
|
+
}, de = (e) => {
|
|
72
72
|
if (!j || !e) return !1;
|
|
73
73
|
try {
|
|
74
|
-
let t =
|
|
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
|
-
},
|
|
79
|
+
}, fe = (e) => {
|
|
80
80
|
if (!(!j || !e)) try {
|
|
81
|
-
let t =
|
|
81
|
+
let t = P(e);
|
|
82
82
|
t && window.localStorage.setItem(t, "1");
|
|
83
83
|
} catch {}
|
|
84
|
-
},
|
|
84
|
+
}, pe = (e) => e ? `flowengage.persistedChatId.${e}` : null, me = (e) => {
|
|
85
85
|
if (!j || !e) return null;
|
|
86
86
|
try {
|
|
87
|
-
let t =
|
|
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
|
-
},
|
|
92
|
+
}, he = (e) => {
|
|
93
93
|
if (!(!j || !e)) try {
|
|
94
|
-
let t =
|
|
94
|
+
let t = pe(e);
|
|
95
95
|
t && window.localStorage.removeItem(t);
|
|
96
96
|
} catch {}
|
|
97
|
-
},
|
|
97
|
+
}, ge = (e, t) => {
|
|
98
98
|
if (!(!j || !e || !t)) try {
|
|
99
|
-
let n =
|
|
99
|
+
let n = pe(e);
|
|
100
100
|
n && window.localStorage.setItem(n, String(t).trim());
|
|
101
101
|
} catch {}
|
|
102
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
127
|
+
}, ye = (e) => {
|
|
128
128
|
if (!j || !e) return "";
|
|
129
|
-
let 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
|
-
},
|
|
135
|
+
}, be = (e, t) => {
|
|
136
136
|
if (!j) return;
|
|
137
|
-
let n =
|
|
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
|
-
},
|
|
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 =
|
|
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
|
-
},
|
|
153
|
+
}, I = (e) => {
|
|
154
154
|
if (!j || !e) return null;
|
|
155
155
|
try {
|
|
156
|
-
let t =
|
|
156
|
+
let t = F(e);
|
|
157
157
|
if (t) return t;
|
|
158
|
-
let n =
|
|
158
|
+
let n = Se(), r = xe(e);
|
|
159
159
|
return r && window.localStorage.setItem(r, n), n;
|
|
160
160
|
} catch {
|
|
161
|
-
return
|
|
161
|
+
return Se();
|
|
162
162
|
}
|
|
163
|
-
},
|
|
163
|
+
}, L = "flowengage.tabId", Ce = () => {
|
|
164
164
|
if (!j) return "default";
|
|
165
165
|
try {
|
|
166
|
-
let e = window.sessionStorage.getItem(
|
|
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(
|
|
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
|
-
},
|
|
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 :
|
|
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 =
|
|
180
|
+
let t = we(e);
|
|
181
181
|
t && window.localStorage.setItem(t, JSON.stringify(a));
|
|
182
182
|
} catch {}
|
|
183
|
-
},
|
|
183
|
+
}, De = (e) => {
|
|
184
184
|
if (!j || !e) return null;
|
|
185
185
|
try {
|
|
186
|
-
let t =
|
|
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
|
-
},
|
|
193
|
+
}, Oe = (e) => {
|
|
194
194
|
if (!(!j || !e)) try {
|
|
195
|
-
let t =
|
|
195
|
+
let t = we(e);
|
|
196
196
|
t && window.localStorage.removeItem(t);
|
|
197
197
|
} catch {}
|
|
198
|
-
},
|
|
198
|
+
}, ke = "flowengage.voice.pendingResume", Ae = () => {
|
|
199
199
|
if (j) try {
|
|
200
|
-
window.sessionStorage.setItem(
|
|
200
|
+
window.sessionStorage.setItem(ke, "1");
|
|
201
201
|
} catch {}
|
|
202
|
-
},
|
|
202
|
+
}, je = () => {
|
|
203
203
|
if (!j) return !1;
|
|
204
204
|
try {
|
|
205
|
-
return window.sessionStorage.getItem(
|
|
205
|
+
return window.sessionStorage.getItem(ke) === "1" ? (window.sessionStorage.removeItem(ke), !0) : !1;
|
|
206
206
|
} catch {
|
|
207
207
|
return !1;
|
|
208
208
|
}
|
|
209
|
-
},
|
|
209
|
+
}, Me = "flowengage.chat.pendingReopen", Ne = () => {
|
|
210
210
|
if (j) try {
|
|
211
|
-
window.sessionStorage.setItem(
|
|
211
|
+
window.sessionStorage.setItem(Me, "1");
|
|
212
212
|
} catch {}
|
|
213
|
-
},
|
|
213
|
+
}, Pe = () => {
|
|
214
214
|
if (!j) return !1;
|
|
215
215
|
try {
|
|
216
|
-
return window.sessionStorage.getItem(
|
|
216
|
+
return window.sessionStorage.getItem(Me) === "1" ? (window.sessionStorage.removeItem(Me), !0) : !1;
|
|
217
217
|
} catch {
|
|
218
218
|
return !1;
|
|
219
219
|
}
|
|
220
|
-
},
|
|
220
|
+
}, Fe = () => {
|
|
221
221
|
if (!j) return !1;
|
|
222
222
|
try {
|
|
223
|
-
return window.sessionStorage.getItem(
|
|
223
|
+
return window.sessionStorage.getItem(ke) === "1";
|
|
224
224
|
} catch {
|
|
225
225
|
return !1;
|
|
226
226
|
}
|
|
227
|
-
},
|
|
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 =
|
|
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
|
-
},
|
|
237
|
+
}, Re = (e) => {
|
|
238
238
|
if (!j || !e) return null;
|
|
239
239
|
try {
|
|
240
|
-
let t =
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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),
|
|
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
|
-
},
|
|
283
|
+
}, Ve = async ({ apiBaseUrl: e, siteId: t }) => {
|
|
284
284
|
let n = typeof window < "u" ? window.location.origin : "http://localhost";
|
|
285
|
-
return (await
|
|
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
|
-
},
|
|
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 = {}) =>
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 ||
|
|
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 ||
|
|
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 ||
|
|
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(
|
|
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(
|
|
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
|
|
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 =
|
|
3357
|
-
}, [
|
|
3358
|
-
yt.current =
|
|
3359
|
-
}, [
|
|
3360
|
-
St.current =
|
|
3361
|
-
}, [
|
|
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
|
|
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 =
|
|
3375
|
+
let t = ye(e);
|
|
3376
3376
|
if (t) {
|
|
3377
|
-
|
|
3377
|
+
ue(t);
|
|
3378
3378
|
return;
|
|
3379
3379
|
}
|
|
3380
|
-
|
|
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),
|
|
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(),
|
|
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 = [],
|
|
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
|
-
|
|
3510
|
+
ve({
|
|
3511
3511
|
isOpen: D,
|
|
3512
3512
|
activeScreen: k,
|
|
3513
3513
|
isHumanHandled: j,
|
|
3514
|
-
agentName:
|
|
3515
|
-
agentHeadshot:
|
|
3514
|
+
agentName: M,
|
|
3515
|
+
agentHeadshot: N
|
|
3516
3516
|
});
|
|
3517
3517
|
}, [
|
|
3518
3518
|
D,
|
|
3519
3519
|
k,
|
|
3520
3520
|
j,
|
|
3521
|
-
|
|
3522
|
-
|
|
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
|
|
3528
|
+
let t = E(i), n = await Ve(t);
|
|
3529
3529
|
if (!e) return;
|
|
3530
|
-
let a = t.siteId, o =
|
|
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
|
|
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 ||
|
|
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
|
-
|
|
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 ||
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
3570
|
+
Ce("disconnected");
|
|
3571
3571
|
}), f.on("aiTyping", () => {
|
|
3572
|
-
|
|
3572
|
+
F(!0);
|
|
3573
3573
|
}), f.on("ai:typing", () => {
|
|
3574
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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) && (
|
|
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 &&
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 && (
|
|
3657
|
+
S(t), t.length === 0 && (Re(!1), re(!1), A("ai"), F(!1), xe(!1));
|
|
3658
3658
|
}), f.on("conversation:reset", () => {
|
|
3659
|
-
S([]),
|
|
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"),
|
|
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" &&
|
|
3663
|
+
e.sender === "agent" && xe(!0);
|
|
3664
3664
|
}), f.on("typing:stop", (e) => {
|
|
3665
|
-
e.sender === "agent" &&
|
|
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,
|
|
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
|
-
}),
|
|
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 && (
|
|
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),
|
|
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 || [])),
|
|
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 (
|
|
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
|
-
}, [
|
|
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 (!(!
|
|
3789
|
-
Dt(), ut.current =
|
|
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:
|
|
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 =
|
|
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 ||
|
|
3856
|
+
callId: r.callId || R.callId,
|
|
3857
3857
|
chatId: y
|
|
3858
3858
|
}), await Pt({
|
|
3859
3859
|
...r,
|
|
3860
|
-
callId: r.callId ||
|
|
3861
|
-
})), await U.current.acceptCall(
|
|
3862
|
-
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 =
|
|
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(
|
|
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 (!
|
|
3883
|
+
if (!R?.callId || !U.current || !y) {
|
|
3884
3884
|
At("reject_call_without_server_context");
|
|
3885
3885
|
return;
|
|
3886
3886
|
}
|
|
3887
|
-
let e =
|
|
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 (!
|
|
3902
|
+
if (!R?.callId || B) {
|
|
3903
3903
|
Ot();
|
|
3904
3904
|
return;
|
|
3905
3905
|
}
|
|
3906
|
-
let e =
|
|
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
|
-
|
|
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" ||
|
|
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:
|
|
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
|
-
|
|
4037
|
+
Te(!0);
|
|
4038
4038
|
try {
|
|
4039
4039
|
let s = await Ur(), c = Vr(), l = `stream-preview-${Date.now().toString(36)}`, d = (e) => {
|
|
4040
|
-
|
|
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
|
-
...
|
|
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:
|
|
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 && !
|
|
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),
|
|
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)),
|
|
4150
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4191
|
+
Me(!1);
|
|
4192
4192
|
}
|
|
4193
4193
|
}, Zt = async () => {
|
|
4194
4194
|
if (!(!U.current || !y)) {
|
|
4195
|
-
|
|
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
|
-
|
|
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 &&
|
|
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
|
-
|
|
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 = "",
|
|
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:
|
|
4256
|
-
agentHeadshot:
|
|
4257
|
-
visitorEmail:
|
|
4258
|
-
isAgentTyping:
|
|
4259
|
-
isAiTyping:
|
|
4260
|
-
connectionStatus:
|
|
4261
|
-
isLoading:
|
|
4262
|
-
isVoiceMode:
|
|
4263
|
-
isRateLimited:
|
|
4264
|
-
rateLimitMessage:
|
|
4265
|
-
isConversationEnded:
|
|
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:
|
|
4268
|
-
voiceEndCounter:
|
|
4269
|
-
incomingCall:
|
|
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
|
-
|
|
4323
|
-
|
|
4324
|
-
|
|
4325
|
-
|
|
4326
|
-
|
|
4327
|
-
|
|
4328
|
-
|
|
4329
|
-
|
|
4330
|
-
Ie,
|
|
4323
|
+
pe,
|
|
4324
|
+
Se,
|
|
4325
|
+
L,
|
|
4326
|
+
we,
|
|
4327
|
+
je,
|
|
4328
|
+
Ee,
|
|
4329
|
+
Oe,
|
|
4330
|
+
Le,
|
|
4331
4331
|
Xe,
|
|
4332
|
-
|
|
4333
|
-
|
|
4334
|
-
|
|
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)),
|
|
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,
|
|
9409
|
-
|
|
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 (
|
|
9413
|
-
|
|
9412
|
+
if (ue.isPlaying()) {
|
|
9413
|
+
N = setTimeout(e, 150);
|
|
9414
9414
|
return;
|
|
9415
9415
|
}
|
|
9416
|
-
if (
|
|
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" })),
|
|
9420
|
+
!A && w.readyState === WebSocket.OPEN && w.send(JSON.stringify({ type: "PlaybackDrained" })), P && (P = !1, d?.());
|
|
9421
9421
|
}
|
|
9422
9422
|
};
|
|
9423
|
-
|
|
9424
|
-
},
|
|
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 = () =>
|
|
9428
|
-
let
|
|
9429
|
-
|
|
9430
|
-
let
|
|
9431
|
-
|
|
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")),
|
|
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 =
|
|
9439
|
-
if (r >= o && i >= dh && i <= fh ? (
|
|
9440
|
-
|
|
9441
|
-
let e =
|
|
9442
|
-
|
|
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
|
-
},
|
|
9449
|
-
let
|
|
9448
|
+
}, de.connect(fe), fe.connect(v.destination);
|
|
9449
|
+
let me = () => {
|
|
9450
9450
|
if (!A) {
|
|
9451
|
-
A = !0,
|
|
9451
|
+
A = !0, N &&= (clearTimeout(N), null), O(), ue.stop(), typeof window < "u" && delete window.__fe_agentAudioPlaying;
|
|
9452
9452
|
try {
|
|
9453
|
-
|
|
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
|
-
},
|
|
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
|
-
},
|
|
9477
|
+
}, ge = async (e) => {
|
|
9478
9478
|
for (let t of e.functions || []) {
|
|
9479
9479
|
if (!t.client_side) continue;
|
|
9480
|
-
let e = await
|
|
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
|
-
},
|
|
9489
|
+
}, _e = (e) => {
|
|
9490
9490
|
switch (e.type) {
|
|
9491
9491
|
case "Welcome":
|
|
9492
|
-
Number.isFinite(e.barge_in_rms) && e.barge_in_rms > 0 && (
|
|
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(),
|
|
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
|
-
|
|
9514
|
+
re = !0, ne = !0, oe = !1, ie = 0, c?.({ mode: "speaking" });
|
|
9515
9515
|
break;
|
|
9516
9516
|
case "AgentAudioDone":
|
|
9517
|
-
|
|
9517
|
+
M = !1, O(), le(), ue.isPlaying() || (ne = !1, c?.({ mode: j ? "thinking" : "listening" }));
|
|
9518
9518
|
break;
|
|
9519
9519
|
case "FunctionCallRequest":
|
|
9520
|
-
|
|
9520
|
+
ge(e);
|
|
9521
9521
|
break;
|
|
9522
9522
|
case "AgentPreparing":
|
|
9523
|
-
|
|
9523
|
+
M = !0;
|
|
9524
9524
|
break;
|
|
9525
9525
|
case "AgentTurnComplete":
|
|
9526
|
-
j = !1,
|
|
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"),
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
9568
|
+
me(), o?.();
|
|
9569
9569
|
}, {
|
|
9570
|
-
endSession: async () =>
|
|
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
|
-
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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 &&
|
|
12875
|
+
n && Ee(t, n);
|
|
12876
12876
|
}
|
|
12877
12877
|
} catch {}
|
|
12878
|
-
|
|
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" &&
|
|
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 ? "
|
|
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 = `
|
|
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.
|
|
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.
|
|
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
|
|
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:
|
|
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 ? `
|
|
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}"
|
|
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}
|
|
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.
|
|
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
|
|
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 ? `
|
|
13106
|
-
if (!r.length) return `CURRENT_PAGE. URL: ${e} | Title: ${n} |${o}
|
|
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}
|
|
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:
|
|
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 &&
|
|
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
|
|
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_}
|
|
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(() =>
|
|
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
|
-
|
|
13714
|
-
}, [
|
|
13715
|
-
|
|
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
|
-
|
|
13718
|
-
if (
|
|
13717
|
+
Se.current = async () => {
|
|
13718
|
+
if (_e.current) return;
|
|
13719
13719
|
let e = typeof window < "u" ? window.location.pathname : null;
|
|
13720
|
-
if (e &&
|
|
13721
|
-
console.log("[FlowEngage] walkthrough ended — visitor left " +
|
|
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 =
|
|
13725
|
-
|
|
13726
|
-
let n =
|
|
13724
|
+
let t = ye.current;
|
|
13725
|
+
I.current += 1;
|
|
13726
|
+
let n = I.current, r = t[n];
|
|
13727
13727
|
if (!r) {
|
|
13728
|
-
if (
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
}),
|
|
13758
|
-
|
|
13757
|
+
}), Pe.current = e, Ne.current = !0, queueMicrotask(() => {
|
|
13758
|
+
ke.current || (ke.current = !0, Te.current?.());
|
|
13759
13759
|
});
|
|
13760
13760
|
}, [l]), V = o(() => {
|
|
13761
|
-
|
|
13761
|
+
de.current &&= (clearTimeout(de.current), null);
|
|
13762
13762
|
}, []);
|
|
13763
13763
|
c(() => {
|
|
13764
13764
|
if (x) {
|
|
13765
|
-
|
|
13765
|
+
ce.current = !1;
|
|
13766
13766
|
return;
|
|
13767
13767
|
}
|
|
13768
|
-
if (
|
|
13769
|
-
|
|
13770
|
-
let e =
|
|
13771
|
-
|
|
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
|
-
|
|
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(),
|
|
13777
|
-
if (!(!
|
|
13778
|
-
|
|
13776
|
+
V(), de.current = setTimeout(() => {
|
|
13777
|
+
if (!(!P.current || ce.current)) if (fe.current < 3) {
|
|
13778
|
+
fe.current += 1;
|
|
13779
13779
|
try {
|
|
13780
|
-
|
|
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
|
-
|
|
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
|
-
|
|
13787
|
+
P.current = !1, ae(!1), V(), Be.current = !0;
|
|
13788
13788
|
}
|
|
13789
13789
|
}, 1e4);
|
|
13790
13790
|
}, [V]), Ze = o(async (e) => {
|
|
13791
|
-
|
|
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
|
-
|
|
13799
|
+
Re(i);
|
|
13800
13800
|
} catch {}
|
|
13801
13801
|
try {
|
|
13802
|
-
await
|
|
13802
|
+
await L.current?.endSession?.();
|
|
13803
13803
|
} catch {}
|
|
13804
|
-
let t =
|
|
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 (
|
|
13819
|
-
|
|
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
|
-
|
|
13830
|
-
|
|
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 = [],
|
|
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 &&
|
|
13845
|
+
e && Ee(i, e);
|
|
13846
13846
|
} catch {}
|
|
13847
13847
|
if (!$n()) {
|
|
13848
|
-
let e =
|
|
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(() => {}),
|
|
13861
|
+
}).catch(() => {}), Ie.current = null, Le.current = null;
|
|
13862
13862
|
} catch {}
|
|
13863
13863
|
}
|
|
13864
|
-
|
|
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: () =>
|
|
13870
|
+
getLastUserVoiceText: () => we.current,
|
|
13871
13871
|
beaconSyncFullVoiceHistory: () => d?.(l.current),
|
|
13872
|
-
isWalkthroughActive: () =>
|
|
13872
|
+
isWalkthroughActive: () => ge.current && !_e.current,
|
|
13873
13873
|
requestEndSession: () => {
|
|
13874
|
-
|
|
13874
|
+
Be.current = !0;
|
|
13875
13875
|
},
|
|
13876
13876
|
requestEmailCollection: () => {
|
|
13877
|
-
S && (
|
|
13877
|
+
S && (ce.current || P.current || (P.current = !0, fe.current = 0, ae(!0), Xe()));
|
|
13878
13878
|
}
|
|
13879
|
-
})), n = i ?
|
|
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
|
-
|
|
13886
|
-
let
|
|
13887
|
-
|
|
13888
|
-
let
|
|
13889
|
-
if (!
|
|
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(
|
|
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 (
|
|
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
|
-
|
|
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
|
|
13913
|
-
...
|
|
13901
|
+
let k = !1, ee = !1, te = S && !!x && !ve.current, ne = await kh.startSession({
|
|
13902
|
+
...b,
|
|
13914
13903
|
onConnect: ({ conversationId: e }) => {
|
|
13915
|
-
|
|
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
|
-
|
|
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 ||
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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 (
|
|
13950
|
-
O("thinking"),
|
|
13951
|
-
He.current = null, !(e ||
|
|
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 (
|
|
13956
|
-
|
|
13944
|
+
if (Ve.current = "listening", Be.current) {
|
|
13945
|
+
Be.current = !1, Ue();
|
|
13957
13946
|
return;
|
|
13958
13947
|
}
|
|
13959
|
-
if (
|
|
13960
|
-
|
|
13948
|
+
if (te && !ee && !ce.current && !ve.current) {
|
|
13949
|
+
ee = !0;
|
|
13961
13950
|
try {
|
|
13962
|
-
|
|
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
|
-
|
|
13966
|
-
|
|
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 ||
|
|
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),
|
|
13996
|
-
else if (!n && t.role === "user" &&
|
|
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(
|
|
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 && (
|
|
14001
|
-
let e =
|
|
14002
|
-
!e ||
|
|
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" && (
|
|
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 &&
|
|
13984
|
+
e && Ee(i, e);
|
|
14014
13985
|
} catch {}
|
|
14015
13986
|
if (R_(a, o)) {
|
|
14016
|
-
|
|
13987
|
+
Be.current = !0;
|
|
14017
13988
|
return;
|
|
14018
13989
|
}
|
|
14019
|
-
|
|
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 && !
|
|
14027
|
-
|
|
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
|
-
|
|
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 ||
|
|
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:
|
|
14047
|
-
wasMuted:
|
|
14048
|
-
}),
|
|
14014
|
+
lastUserText: we.current || "",
|
|
14015
|
+
wasMuted: je.current
|
|
14016
|
+
}), Me.current = !0;
|
|
14049
14017
|
try {
|
|
14050
|
-
|
|
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"),
|
|
14024
|
+
console.warn("[FlowEngage:VoiceDebug] ❌ cancelled=true after startSession resolved — killing session immediately"), ne.endSession().catch(() => {});
|
|
14057
14025
|
return;
|
|
14058
14026
|
}
|
|
14059
|
-
o =
|
|
14027
|
+
o = ne, L.current = ne, O("listening");
|
|
14060
14028
|
try {
|
|
14061
|
-
sessionStorage.setItem(`el_conv_${i}`,
|
|
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 : "",
|
|
14033
|
+
let e = typeof window < "u" ? window.location.href : "", n = "[]";
|
|
14066
14034
|
try {
|
|
14067
|
-
|
|
14035
|
+
n = await t["fwh-list-forms-mvp"]();
|
|
14068
14036
|
} catch {}
|
|
14069
|
-
let
|
|
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 && (
|
|
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
|
-
|
|
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
|
-
},
|
|
14051
|
+
}, i = () => {
|
|
14085
14052
|
if (e) return;
|
|
14086
|
-
let
|
|
14087
|
-
if (r(
|
|
14088
|
-
t =
|
|
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 =
|
|
14059
|
+
t = i;
|
|
14093
14060
|
return;
|
|
14094
14061
|
}
|
|
14095
|
-
let
|
|
14096
|
-
t =
|
|
14097
|
-
let
|
|
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
|
|
14105
|
-
if (
|
|
14106
|
-
|
|
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
|
-
|
|
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:
|
|
14117
|
-
toPath:
|
|
14118
|
-
fromPageName:
|
|
14119
|
-
toPageName:
|
|
14080
|
+
fromPath: s,
|
|
14081
|
+
toPath: i,
|
|
14082
|
+
fromPageName: f,
|
|
14083
|
+
toPageName: p,
|
|
14120
14084
|
ts: Date.now()
|
|
14121
|
-
}), console.log(`[FlowEngage] visitor navigation detected: "${
|
|
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
|
-
|
|
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(
|
|
14131
|
-
}, p = () => setTimeout(
|
|
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"),
|
|
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,
|
|
14104
|
+
}), e = !0, Ne.current = !0;
|
|
14144
14105
|
try {
|
|
14145
14106
|
Pn();
|
|
14146
14107
|
} catch {}
|
|
14147
14108
|
if (i) try {
|
|
14148
|
-
|
|
14109
|
+
Re(i);
|
|
14149
14110
|
} catch {}
|
|
14150
|
-
typeof window < "u" && (window.__fe_user_nav_during_speech = null), Pr(),
|
|
14151
|
-
let t = o ||
|
|
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(() => {}),
|
|
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
|
-
|
|
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 (
|
|
14143
|
+
if (L.current) try {
|
|
14183
14144
|
if (k) {
|
|
14184
|
-
|
|
14145
|
+
ze.current = 0, await L.current.setMicMuted?.(!1), A(!1);
|
|
14185
14146
|
try {
|
|
14186
|
-
|
|
14147
|
+
L.current.sendContextualUpdate?.("[MIC] The visitor unmuted their microphone.");
|
|
14187
14148
|
} catch {}
|
|
14188
14149
|
} else {
|
|
14189
|
-
|
|
14150
|
+
ze.current = 0, await L.current.setMicMuted?.(!0), A(!0);
|
|
14190
14151
|
try {
|
|
14191
|
-
|
|
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 =
|
|
14158
|
+
let t = oe.trim().toLowerCase();
|
|
14198
14159
|
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)) {
|
|
14199
|
-
|
|
14160
|
+
N("Please enter a valid email address.");
|
|
14200
14161
|
return;
|
|
14201
14162
|
}
|
|
14202
|
-
|
|
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
|
-
|
|
14207
|
-
let n =
|
|
14208
|
-
|
|
14167
|
+
L.current?.setMicMuted?.(!1);
|
|
14168
|
+
let n = pe.current;
|
|
14169
|
+
pe.current = "";
|
|
14209
14170
|
try {
|
|
14210
|
-
|
|
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
|
-
|
|
14174
|
+
oe,
|
|
14214
14175
|
b,
|
|
14215
14176
|
V
|
|
14216
14177
|
]), Qe = Array.isArray(e) && e[0] || "#3B82F6";
|
|
14217
14178
|
return /* @__PURE__ */ _("div", {
|
|
14218
|
-
ref:
|
|
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
|
-
|
|
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:
|
|
14221
|
+
value: oe,
|
|
14261
14222
|
onChange: (e) => {
|
|
14262
|
-
|
|
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:
|
|
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
|
-
|
|
14238
|
+
se && /* @__PURE__ */ g("span", {
|
|
14278
14239
|
style: {
|
|
14279
14240
|
color: "#f87171",
|
|
14280
14241
|
fontSize: "12px"
|
|
14281
14242
|
},
|
|
14282
|
-
children:
|
|
14243
|
+
children: se
|
|
14283
14244
|
}),
|
|
14284
14245
|
/* @__PURE__ */ g("button", {
|
|
14285
14246
|
type: "submit",
|
|
14286
|
-
disabled: !
|
|
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:
|
|
14253
|
+
background: oe.trim() ? Qe : "#374151",
|
|
14293
14254
|
color: "white",
|
|
14294
14255
|
fontSize: "14px",
|
|
14295
14256
|
fontWeight: 600,
|
|
14296
|
-
cursor:
|
|
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),
|
|
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: () =>
|
|
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),
|
|
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:
|
|
14687
|
-
let
|
|
14688
|
-
let e =
|
|
14689
|
-
|
|
14690
|
-
}, [
|
|
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
|
-
|
|
14664
|
+
je(!1), Re(!0), Ve(!0);
|
|
14704
14665
|
try {
|
|
14705
|
-
let e = await
|
|
14706
|
-
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
|
-
|
|
14671
|
+
Ve(!1);
|
|
14711
14672
|
}
|
|
14712
14673
|
}, Ke = async (e) => {
|
|
14713
|
-
|
|
14674
|
+
Re(!1), we?.(e.chatId);
|
|
14714
14675
|
};
|
|
14715
14676
|
return c(() => {
|
|
14716
|
-
if (!
|
|
14677
|
+
if (!Ae) return;
|
|
14717
14678
|
let e = (e) => {
|
|
14718
14679
|
let t = e.composedPath?.()?.[0] || e.target;
|
|
14719
|
-
|
|
14680
|
+
z.current && !z.current.contains(t) && je(!1);
|
|
14720
14681
|
};
|
|
14721
14682
|
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
14722
|
-
}, [
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
14835
|
+
ref: z,
|
|
14875
14836
|
children: [/* @__PURE__ */ g("button", {
|
|
14876
14837
|
type: "button",
|
|
14877
|
-
onClick: () =>
|
|
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
|
-
}),
|
|
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
|
-
|
|
14900
|
+
xe && /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ _("button", {
|
|
14940
14901
|
type: "button",
|
|
14941
14902
|
onClick: () => {
|
|
14942
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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:
|
|
15208
|
-
micError:
|
|
15209
|
-
setMicError:
|
|
15210
|
-
dismissCallError:
|
|
15168
|
+
webRTCError: se,
|
|
15169
|
+
micError: N,
|
|
15170
|
+
setMicError: ce,
|
|
15171
|
+
dismissCallError: P,
|
|
15211
15172
|
isRateLimited: E,
|
|
15212
15173
|
rateLimitMessage: D
|
|
15213
15174
|
}),
|
|
15214
|
-
|
|
15175
|
+
_e && /* @__PURE__ */ g(a_, {
|
|
15215
15176
|
agentName: v,
|
|
15216
15177
|
agentHeadshot: y,
|
|
15217
15178
|
fallbackAgentName: b,
|
|
15218
|
-
callDurationSeconds:
|
|
15219
|
-
isCallMuted:
|
|
15220
|
-
formatCallDuration:
|
|
15221
|
-
toggleCallMute:
|
|
15222
|
-
endWebRTCCall:
|
|
15223
|
-
onExpand:
|
|
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: [
|
|
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: () =>
|
|
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:
|
|
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
|
-
}) :
|
|
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,
|
|
15309
|
+
}) : null, De ? /* @__PURE__ */ g(zg, {
|
|
15349
15310
|
chatHistory: l,
|
|
15350
15311
|
isAiTyping: u,
|
|
15351
15312
|
isLoading: T,
|
|
15352
15313
|
isAgentTyping: d,
|
|
15353
|
-
setReplyContext:
|
|
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
|
-
}) :
|
|
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
|
-
|
|
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:
|
|
15496
|
-
handleToggleVoice:
|
|
15456
|
+
callUiActive: ke,
|
|
15457
|
+
handleToggleVoice: be,
|
|
15497
15458
|
showVoiceToggle: f === "agent",
|
|
15498
15459
|
activeScreen: f,
|
|
15499
|
-
inputDisabled:
|
|
15500
|
-
replyContext:
|
|
15501
|
-
clearReplyContext: () =>
|
|
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:
|
|
15510
|
-
emailError:
|
|
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: [
|
|
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:
|
|
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
|
-
}),
|
|
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:
|
|
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
|
-
|
|
15572
|
-
}, [
|
|
15573
|
-
let
|
|
15574
|
-
...
|
|
15575
|
-
...
|
|
15576
|
-
},
|
|
15577
|
-
...
|
|
15578
|
-
...
|
|
15579
|
-
},
|
|
15580
|
-
...
|
|
15581
|
-
...
|
|
15582
|
-
},
|
|
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
|
-
},
|
|
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
|
-
})),
|
|
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
|
-
...
|
|
15604
|
-
...
|
|
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 =
|
|
15608
|
-
entryPrompt:
|
|
15609
|
-
yesLabel:
|
|
15610
|
-
laterLabel:
|
|
15611
|
-
connectionTitle:
|
|
15612
|
-
connectionSubtitle:
|
|
15613
|
-
voiceLabel:
|
|
15614
|
-
textLabel:
|
|
15615
|
-
chatTitle:
|
|
15616
|
-
hasCustomTitle: !!(
|
|
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:
|
|
15619
|
-
analysingLabel:
|
|
15620
|
-
}, Je =
|
|
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 = !!(
|
|
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, !
|
|
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 =
|
|
15603
|
+
let n = je(), r = Ye ? De(Ye) : null, i = n || !!r?.transcript;
|
|
15643
15604
|
if (t) {
|
|
15644
|
-
|
|
15605
|
+
ae?.({ notifyChatInitiated: !0 }), M?.(!0), et("voice_mode");
|
|
15645
15606
|
return;
|
|
15646
15607
|
}
|
|
15647
|
-
if (
|
|
15648
|
-
|
|
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
|
-
|
|
15617
|
+
ae?.({ notifyChatInitiated: !0 }), M?.(!0), et("voice_mode");
|
|
15657
15618
|
return;
|
|
15658
15619
|
}
|
|
15659
15620
|
if (Ye) try {
|
|
15660
|
-
|
|
15621
|
+
Oe(Ye);
|
|
15661
15622
|
} catch {}
|
|
15662
|
-
if (
|
|
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" &&
|
|
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
|
-
|
|
15729
|
-
|
|
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
|
-
|
|
15702
|
+
ge?.(""), he?.();
|
|
15742
15703
|
return;
|
|
15743
15704
|
}
|
|
15744
15705
|
if (!tt.trim() || mt) {
|
|
15745
|
-
|
|
15746
|
-
let e = window.setTimeout(() =>
|
|
15706
|
+
ge?.("");
|
|
15707
|
+
let e = window.setTimeout(() => he?.(), 100);
|
|
15747
15708
|
return () => window.clearTimeout(e);
|
|
15748
15709
|
}
|
|
15749
|
-
|
|
15750
|
-
let e = window.setTimeout(() =>
|
|
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
|
|
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
|
|
15784
|
-
nt(""), it(null), kt(), await
|
|
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
|
|
15762
|
+
nt(""), it(null), await re(n, "", t);
|
|
15802
15763
|
}, Ft = o(() => {
|
|
15803
|
-
r.length !== 0 &&
|
|
15804
|
-
}, [r.length,
|
|
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
|
|
15771
|
+
t.trim() && await re(t.trim(), "");
|
|
15811
15772
|
}, [
|
|
15812
15773
|
C,
|
|
15813
15774
|
b,
|
|
15814
|
-
|
|
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
|
-
...
|
|
15796
|
+
...Me === "bottom-left" ? {
|
|
15836
15797
|
left: "1.5rem",
|
|
15837
|
-
bottom:
|
|
15798
|
+
bottom: z
|
|
15838
15799
|
} : {
|
|
15839
15800
|
right: "1.5rem",
|
|
15840
|
-
bottom:
|
|
15801
|
+
bottom: z
|
|
15841
15802
|
}
|
|
15842
|
-
} :
|
|
15803
|
+
} : Me === "bottom-left" ? {
|
|
15843
15804
|
left: "1.5rem",
|
|
15844
|
-
bottom:
|
|
15805
|
+
bottom: z
|
|
15845
15806
|
} : {
|
|
15846
15807
|
right: "1.5rem",
|
|
15847
|
-
bottom:
|
|
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
|
-
|
|
15821
|
+
ae({ notifyChatInitiated: !0 }), M?.(!0), et("voice_mode");
|
|
15861
15822
|
}, Ht = () => {
|
|
15862
|
-
|
|
15823
|
+
ae({ notifyChatInitiated: !0 }), M?.(!1), et("text_chat");
|
|
15863
15824
|
}, Ut = () => {
|
|
15864
|
-
|
|
15825
|
+
M?.(!1), zt();
|
|
15865
15826
|
};
|
|
15866
|
-
return e !== "ready" || !He ||
|
|
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:
|
|
15879
|
-
primaryColor:
|
|
15839
|
+
orbColors: Te,
|
|
15840
|
+
primaryColor: Ee,
|
|
15880
15841
|
onYes: () => {
|
|
15881
|
-
|
|
15842
|
+
N(Ye), Vt();
|
|
15882
15843
|
},
|
|
15883
15844
|
onLater: () => {
|
|
15884
|
-
|
|
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:
|
|
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:
|
|
15961
|
-
orbColors:
|
|
15962
|
-
onClick: T ? jt :
|
|
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:
|
|
15968
|
-
primaryColor:
|
|
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:
|
|
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:
|
|
15987
|
-
voiceEndCounter:
|
|
15947
|
+
widgetPosition: Me,
|
|
15948
|
+
voiceEndCounter: xe,
|
|
15988
15949
|
websiteName: t?.websiteName,
|
|
15989
|
-
voiceFirstMessage:
|
|
15990
|
-
captureVisitorEmail:
|
|
15950
|
+
voiceFirstMessage: Se.voiceFirstMessage || null,
|
|
15951
|
+
captureVisitorEmail: oe,
|
|
15991
15952
|
emailRequired: !h,
|
|
15992
|
-
emailCaptureEnabled:
|
|
15993
|
-
listeningLabel:
|
|
15994
|
-
thinkingLabel:
|
|
15995
|
-
enterChatModeLabel:
|
|
15996
|
-
endConversationLabel:
|
|
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:
|
|
16007
|
-
acceptCall:
|
|
16008
|
-
rejectCall:
|
|
16009
|
-
endWebRTCCall:
|
|
16010
|
-
toggleCallMute:
|
|
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:
|
|
16014
|
-
orbColors:
|
|
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:
|
|
16021
|
-
primaryColor:
|
|
16022
|
-
chatBgGradient:
|
|
16023
|
-
logo:
|
|
16024
|
-
quickChatOptions:
|
|
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:
|
|
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:
|
|
16017
|
+
dismissCallError: pe,
|
|
16057
16018
|
activeCallId: T,
|
|
16058
16019
|
isCallMuted: O,
|
|
16059
|
-
toggleCallMute:
|
|
16060
|
-
endWebRTCCall:
|
|
16020
|
+
toggleCallMute: fe,
|
|
16021
|
+
endWebRTCCall: de,
|
|
16061
16022
|
formatCallDuration: It,
|
|
16062
16023
|
callDurationSeconds: ut,
|
|
16063
16024
|
onCollapse: zt,
|
|
16064
16025
|
onStartVoice: Vt,
|
|
16065
|
-
voiceEnabled:
|
|
16026
|
+
voiceEnabled: we,
|
|
16066
16027
|
onNewChat: Ft,
|
|
16067
16028
|
onMinimize: Mt,
|
|
16068
16029
|
onExpand: jt,
|
|
16069
16030
|
isCallMinimized: !!T,
|
|
16070
|
-
showPoweredBy:
|
|
16031
|
+
showPoweredBy: Be,
|
|
16071
16032
|
privacyPolicyUrl: B,
|
|
16072
|
-
headerBgColor:
|
|
16073
|
-
getVisitorChatHistory:
|
|
16074
|
-
resumeChat:
|
|
16075
|
-
isSessionRestoring:
|
|
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
|
]
|