@flowengage/react-chatbot 8.0.129 → 8.0.131
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,86 @@ 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
|
-
|
|
13751
|
-
R.current?.sendUserMessage?.(`Describe the section titled "${r}" in 3-4 sentences, starting with ${n === 0 ? "Starting with" : "Next —"} ${r}. Describe ONLY this section. If this section contains named sub-items (steps, checklist entries, cards, plans, FAQs, team members), name EVERY one of them in order with a short phrase each — never skip or collapse them into a summary; ` + a + "This section is ON THE PAGE THE VISITOR IS ALREADY ON — do NOT call fwh-navigate-mvp, do not go to a product/detail page, and do not offer to, even if this section's name also matches a page name. Do not mention any other section, do not ask whether to continue, then stop.", { suppressQuestion: !0 });
|
|
13750
|
+
L.current?.sendUserMessage?.(`Describe the section titled "${r}".` + (i ? ` Its content:\n"""${i}"""` : ""), { suppressQuestion: !0 });
|
|
13752
13751
|
};
|
|
13753
|
-
let
|
|
13752
|
+
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
13753
|
console.warn("[FlowEngage:VoiceDebug] 🛑 requestSessionShutdown called", {
|
|
13755
13754
|
destination: e,
|
|
13756
13755
|
stack: (/* @__PURE__ */ Error()).stack?.split("\n").slice(1, 4).join(" | ")
|
|
13757
|
-
}),
|
|
13758
|
-
|
|
13756
|
+
}), Pe.current = e, Ne.current = !0, queueMicrotask(() => {
|
|
13757
|
+
ke.current || (ke.current = !0, Te.current?.());
|
|
13759
13758
|
});
|
|
13760
13759
|
}, [l]), V = o(() => {
|
|
13761
|
-
|
|
13760
|
+
de.current &&= (clearTimeout(de.current), null);
|
|
13762
13761
|
}, []);
|
|
13763
13762
|
c(() => {
|
|
13764
13763
|
if (x) {
|
|
13765
|
-
|
|
13764
|
+
ce.current = !1;
|
|
13766
13765
|
return;
|
|
13767
13766
|
}
|
|
13768
|
-
if (
|
|
13769
|
-
|
|
13770
|
-
let e =
|
|
13771
|
-
|
|
13767
|
+
if (ce.current = !0, P.current = !1, ae(!1), V(), me.current) {
|
|
13768
|
+
me.current = !1, L.current?.setMicMuted?.(!1);
|
|
13769
|
+
let e = pe.current;
|
|
13770
|
+
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
13771
|
}
|
|
13773
|
-
|
|
13772
|
+
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
13773
|
}, [x, V]);
|
|
13775
13774
|
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
|
-
|
|
13775
|
+
V(), de.current = setTimeout(() => {
|
|
13776
|
+
if (!(!P.current || ce.current)) if (fe.current < 3) {
|
|
13777
|
+
fe.current += 1;
|
|
13779
13778
|
try {
|
|
13780
|
-
|
|
13779
|
+
L.current?.injectAgentSpeech?.("I still need your email in the box below to continue — could you enter it, please?", "queue");
|
|
13781
13780
|
} catch {}
|
|
13782
13781
|
Xe();
|
|
13783
13782
|
} else {
|
|
13784
13783
|
try {
|
|
13785
|
-
|
|
13784
|
+
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
13785
|
} catch {}
|
|
13787
|
-
|
|
13786
|
+
P.current = !1, ae(!1), V(), Be.current = !0;
|
|
13788
13787
|
}
|
|
13789
13788
|
}, 1e4);
|
|
13790
13789
|
}, [V]), Ze = o(async (e) => {
|
|
13791
|
-
|
|
13790
|
+
Ne.current = !0;
|
|
13792
13791
|
try {
|
|
13793
13792
|
Pn();
|
|
13794
13793
|
} catch {}
|
|
@@ -13796,12 +13795,12 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
|
|
|
13796
13795
|
Jh();
|
|
13797
13796
|
} catch {}
|
|
13798
13797
|
if (i) try {
|
|
13799
|
-
|
|
13798
|
+
Re(i);
|
|
13800
13799
|
} catch {}
|
|
13801
13800
|
try {
|
|
13802
|
-
await
|
|
13801
|
+
await L.current?.endSession?.();
|
|
13803
13802
|
} catch {}
|
|
13804
|
-
let t =
|
|
13803
|
+
let t = Ie.current, n = Le.current;
|
|
13805
13804
|
if (t && s && a) {
|
|
13806
13805
|
let e = n ? Math.round((Date.now() - n) / 1e3) : 0;
|
|
13807
13806
|
fetch(`${a}/api/voice/save-chat-recording`, {
|
|
@@ -13815,8 +13814,8 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
|
|
|
13815
13814
|
})
|
|
13816
13815
|
}).catch((e) => console.warn("[FlowEngage] save-chat-recording failed:", e.message));
|
|
13817
13816
|
}
|
|
13818
|
-
if (
|
|
13819
|
-
|
|
13817
|
+
if (Ie.current = null, Le.current = null, L.current = null, O("idle"), A(!1), ke.current = !1, Pr(), i) try {
|
|
13818
|
+
Oe(i);
|
|
13820
13819
|
} catch {}
|
|
13821
13820
|
typeof u == "function" && await u(l.current), e?.();
|
|
13822
13821
|
}, [
|
|
@@ -13826,8 +13825,8 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
|
|
|
13826
13825
|
s,
|
|
13827
13826
|
a
|
|
13828
13827
|
]);
|
|
13829
|
-
|
|
13830
|
-
|
|
13828
|
+
Te.current = () => Ze(Pe.current === "chat" ? t : n), c(() => {
|
|
13829
|
+
je.current = k;
|
|
13831
13830
|
}, [k]), c(() => {
|
|
13832
13831
|
h && Ue("chat");
|
|
13833
13832
|
}, [h]), c(() => {
|
|
@@ -13839,13 +13838,13 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
|
|
|
13839
13838
|
}
|
|
13840
13839
|
try {
|
|
13841
13840
|
if ((await navigator.mediaDevices.getUserMedia({ audio: !0 })).getTracks().forEach((e) => e.stop()), e) return;
|
|
13842
|
-
l.current = [],
|
|
13841
|
+
l.current = [], we.current = "", ke.current = !1, Me.current = !1, Ne.current = !1, Pe.current = "minimized", Nr({ onBeforeNavigate: () => {
|
|
13843
13842
|
if (i && l.current.length > 0) try {
|
|
13844
13843
|
let e = o_(l.current);
|
|
13845
|
-
e &&
|
|
13844
|
+
e && Ee(i, e);
|
|
13846
13845
|
} catch {}
|
|
13847
13846
|
if (!$n()) {
|
|
13848
|
-
let e =
|
|
13847
|
+
let e = Ie.current, t = Le.current;
|
|
13849
13848
|
if (e && s && a) try {
|
|
13850
13849
|
let n = t ? Math.round((Date.now() - t) / 1e3) : 0, r = JSON.stringify({
|
|
13851
13850
|
chatId: s,
|
|
@@ -13858,68 +13857,57 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
|
|
|
13858
13857
|
headers: { "Content-Type": "application/json" },
|
|
13859
13858
|
body: r,
|
|
13860
13859
|
keepalive: !0
|
|
13861
|
-
}).catch(() => {}),
|
|
13860
|
+
}).catch(() => {}), Ie.current = null, Le.current = null;
|
|
13862
13861
|
} catch {}
|
|
13863
13862
|
}
|
|
13864
|
-
|
|
13863
|
+
Ae();
|
|
13865
13864
|
} });
|
|
13866
13865
|
let t = k_(E_({
|
|
13867
13866
|
siteId: i || null,
|
|
13868
13867
|
apiBaseUrl: a || null,
|
|
13869
13868
|
chatId: s || null,
|
|
13870
|
-
getLastUserVoiceText: () =>
|
|
13869
|
+
getLastUserVoiceText: () => we.current,
|
|
13871
13870
|
beaconSyncFullVoiceHistory: () => d?.(l.current),
|
|
13872
|
-
isWalkthroughActive: () =>
|
|
13871
|
+
isWalkthroughActive: () => ge.current && !_e.current,
|
|
13873
13872
|
requestEndSession: () => {
|
|
13874
|
-
|
|
13873
|
+
Be.current = !0;
|
|
13875
13874
|
},
|
|
13876
13875
|
requestEmailCollection: () => {
|
|
13877
|
-
S && (
|
|
13876
|
+
S && (ce.current || P.current || (P.current = !0, fe.current = 0, ae(!0), Xe()));
|
|
13878
13877
|
}
|
|
13879
|
-
})), n = i ?
|
|
13878
|
+
})), 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
13879
|
apiBaseUrl: a,
|
|
13881
13880
|
siteId: i,
|
|
13882
13881
|
chatId: s,
|
|
13883
13882
|
clientTools: t
|
|
13884
13883
|
};
|
|
13885
|
-
|
|
13886
|
-
let
|
|
13887
|
-
|
|
13888
|
-
let
|
|
13889
|
-
if (!
|
|
13884
|
+
Ce.current = t;
|
|
13885
|
+
let C = (m.split("/").filter(Boolean).pop() || "").replace(/[-_]/g, " ").replace(/\b\w/g, (e) => e.toUpperCase()), w = "";
|
|
13886
|
+
h && h.includes("|") && (w = h.split("|").map((e) => e.trim()).filter(Boolean).reduce((e, t) => e.length <= t.length ? e : t));
|
|
13887
|
+
let T = w || C || "", E = T ? `the ${T} page` : "this page", D = (() => {
|
|
13888
|
+
if (!r?.targetUrl) return null;
|
|
13890
13889
|
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;
|
|
13890
|
+
return new URL(r.targetUrl, window.location.href).pathname;
|
|
13899
13891
|
} catch {
|
|
13900
13892
|
return null;
|
|
13901
13893
|
}
|
|
13902
13894
|
})();
|
|
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?`;
|
|
13895
|
+
if (u || n) b.greeting = null;
|
|
13908
13896
|
else {
|
|
13909
13897
|
let e = v || "";
|
|
13910
|
-
|
|
13898
|
+
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
13899
|
}
|
|
13912
|
-
let
|
|
13913
|
-
...
|
|
13900
|
+
let k = !1, ee = !1, te = S && !!x && !ve.current, ne = await kh.startSession({
|
|
13901
|
+
...b,
|
|
13914
13902
|
onConnect: ({ conversationId: e }) => {
|
|
13915
|
-
|
|
13903
|
+
Ie.current = e, Le.current = Date.now(), console.log("[FlowEngage] 🎙️ AI chat session connected:", e);
|
|
13916
13904
|
},
|
|
13917
13905
|
onUnhandledClientToolCall: (e) => console.error("[FlowEngage] Unhandled tool:", e?.tool_name),
|
|
13918
13906
|
onSessionInfo: ({ emailOnFile: e }) => {
|
|
13919
|
-
|
|
13907
|
+
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
13908
|
},
|
|
13921
13909
|
onAgentTurnEnd: () => {
|
|
13922
|
-
e ||
|
|
13910
|
+
e || ge.current && (_e.current || me.current || setTimeout(() => Se.current?.(), 250));
|
|
13923
13911
|
},
|
|
13924
13912
|
onSessionEnding: () => {
|
|
13925
13913
|
e || Ue("minimized");
|
|
@@ -13934,145 +13922,123 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
|
|
|
13934
13922
|
onModeChange: ({ mode: t, tentative: n }) => {
|
|
13935
13923
|
if (!e) {
|
|
13936
13924
|
if (t === "speaking") {
|
|
13937
|
-
|
|
13925
|
+
z.current &&= (clearTimeout(z.current), null), He.current &&= (clearTimeout(He.current), null), O("speaking"), Ve.current = "speaking", B.current = !1;
|
|
13938
13926
|
return;
|
|
13939
13927
|
}
|
|
13940
13928
|
if (t === "user-speaking") {
|
|
13941
|
-
if (
|
|
13929
|
+
if (P.current && !ce.current && Xe(), He.current &&= (clearTimeout(He.current), null), Ve.current === "speaking") return;
|
|
13942
13930
|
try {
|
|
13943
13931
|
Pn();
|
|
13944
13932
|
} catch {}
|
|
13945
|
-
|
|
13933
|
+
z.current &&= (clearTimeout(z.current), null), Ve.current !== "listening" && (O("listening"), Ve.current = "listening");
|
|
13946
13934
|
return;
|
|
13947
13935
|
}
|
|
13948
13936
|
if (t === "thinking") {
|
|
13949
|
-
if (
|
|
13950
|
-
O("thinking"),
|
|
13951
|
-
He.current = null, !(e ||
|
|
13937
|
+
if (z.current &&= (clearTimeout(z.current), null), He.current &&= (clearTimeout(He.current), null), Ve.current === "speaking") return;
|
|
13938
|
+
O("thinking"), Ve.current = "thinking", n && (He.current = setTimeout(() => {
|
|
13939
|
+
He.current = null, !(e || Ve.current !== "thinking") && (Ve.current = "listening", O("listening"));
|
|
13952
13940
|
}, 4e3));
|
|
13953
13941
|
return;
|
|
13954
13942
|
}
|
|
13955
|
-
if (
|
|
13956
|
-
|
|
13943
|
+
if (Ve.current = "listening", Be.current) {
|
|
13944
|
+
Be.current = !1, Ue();
|
|
13957
13945
|
return;
|
|
13958
13946
|
}
|
|
13959
|
-
if (
|
|
13960
|
-
|
|
13947
|
+
if (te && !ee && !ce.current && !ve.current) {
|
|
13948
|
+
ee = !0;
|
|
13961
13949
|
try {
|
|
13962
|
-
|
|
13950
|
+
L.current?.sendContextualUpdate?.("The visitor hasn't given their email yet; the app will ask for it when they first speak.");
|
|
13963
13951
|
} catch {}
|
|
13964
13952
|
}
|
|
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")));
|
|
13953
|
+
z.current && clearTimeout(z.current), z.current = setTimeout(() => {
|
|
13954
|
+
e || Ve.current !== "speaking" && (B.current || (z.current = null, Ve.current = "listening", O("listening")));
|
|
13985
13955
|
}, 1200);
|
|
13986
13956
|
}
|
|
13987
13957
|
},
|
|
13988
13958
|
onMessage: (t) => {
|
|
13989
|
-
if (e ||
|
|
13959
|
+
if (e || me.current && t.role !== "user" && !/email/i.test(String(t.message || ""))) return;
|
|
13990
13960
|
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
13961
|
if (t.role === "user" && !n) try {
|
|
13992
13962
|
Jh();
|
|
13993
13963
|
} catch {}
|
|
13994
13964
|
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" &&
|
|
13965
|
+
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, console.log(`[FlowEngage] walkthrough armed — ${ye.current.length} sections on this page`);
|
|
13966
|
+
else if (!n && t.role === "user" && ge.current) {
|
|
13997
13967
|
let e = String(t.message || "").trim(), n = Ye(e), r = (e) => !!e && (Ke.test(e) || Je.test(e));
|
|
13998
|
-
qe.test(
|
|
13968
|
+
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
13969
|
}
|
|
14000
|
-
if (t.role !== "user" && !n && (
|
|
14001
|
-
let e =
|
|
14002
|
-
!e ||
|
|
13970
|
+
if (t.role !== "user" && !n && (xe.current = String(t.message || "")), t.role !== "user" && Ge.test(String(t.message || ""))) {
|
|
13971
|
+
let e = ye.current.length;
|
|
13972
|
+
!e || I.current >= e - 1 ? F(!1) : console.debug(`[FlowEngage] agent claimed completion at step ${I.current + 1}/${e} — ignoring, tour continues`);
|
|
14003
13973
|
}
|
|
14004
13974
|
let a = t.role === "user" ? "user" : "bot", o = t.message || t.text || t.content || "";
|
|
14005
13975
|
if (o) {
|
|
14006
|
-
if (a === "user" && (
|
|
13976
|
+
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
13977
|
sender: a,
|
|
14008
13978
|
message: o,
|
|
14009
13979
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
14010
13980
|
debug: t.debug
|
|
14011
13981
|
}], i) try {
|
|
14012
13982
|
let e = o_(l.current);
|
|
14013
|
-
e &&
|
|
13983
|
+
e && Ee(i, e);
|
|
14014
13984
|
} catch {}
|
|
14015
13985
|
if (R_(a, o)) {
|
|
14016
|
-
|
|
13986
|
+
Be.current = !0;
|
|
14017
13987
|
return;
|
|
14018
13988
|
}
|
|
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");
|
|
13989
|
+
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
13990
|
}
|
|
14024
13991
|
},
|
|
14025
13992
|
onError: (t) => {
|
|
14026
|
-
if (!e && !
|
|
14027
|
-
|
|
13993
|
+
if (!e && !Ne.current && !Me.current && !Fe()) {
|
|
13994
|
+
Me.current = !0, console.error("[FlowEngageVoiceCall] session:error", {
|
|
14028
13995
|
message: t?.message,
|
|
14029
13996
|
name: t?.name,
|
|
14030
13997
|
raw: t
|
|
14031
13998
|
});
|
|
14032
13999
|
try {
|
|
14033
|
-
|
|
14000
|
+
L.current?.setMicMuted?.(!0);
|
|
14034
14001
|
} catch {}
|
|
14035
14002
|
A(!0), O("error"), Ue("chat");
|
|
14036
14003
|
}
|
|
14037
14004
|
},
|
|
14038
14005
|
onDisconnect: (t) => {
|
|
14039
|
-
if (e ||
|
|
14006
|
+
if (e || Ne.current || Me.current || Fe()) return;
|
|
14040
14007
|
let n = l.current?.length || 0;
|
|
14041
14008
|
console.warn("[FlowEngageVoiceCall] session:disconnected", {
|
|
14042
14009
|
historyCount: n,
|
|
14043
14010
|
reason: t?.reason,
|
|
14044
14011
|
closeCode: t?.context?.code,
|
|
14045
14012
|
closeReason: t?.context?.reason || t?.message,
|
|
14046
|
-
lastUserText:
|
|
14047
|
-
wasMuted:
|
|
14048
|
-
}),
|
|
14013
|
+
lastUserText: we.current || "",
|
|
14014
|
+
wasMuted: je.current
|
|
14015
|
+
}), Me.current = !0;
|
|
14049
14016
|
try {
|
|
14050
|
-
|
|
14017
|
+
L.current?.setMicMuted?.(!0);
|
|
14051
14018
|
} catch {}
|
|
14052
14019
|
A(!0), Ue("chat");
|
|
14053
14020
|
}
|
|
14054
14021
|
});
|
|
14055
14022
|
if (e) {
|
|
14056
|
-
console.warn("[FlowEngage:VoiceDebug] ❌ cancelled=true after startSession resolved — killing session immediately"),
|
|
14023
|
+
console.warn("[FlowEngage:VoiceDebug] ❌ cancelled=true after startSession resolved — killing session immediately"), ne.endSession().catch(() => {});
|
|
14057
14024
|
return;
|
|
14058
14025
|
}
|
|
14059
|
-
o =
|
|
14026
|
+
o = ne, L.current = ne, O("listening");
|
|
14060
14027
|
try {
|
|
14061
|
-
sessionStorage.setItem(`el_conv_${i}`,
|
|
14028
|
+
sessionStorage.setItem(`el_conv_${i}`, ne.getId());
|
|
14062
14029
|
} catch {}
|
|
14063
14030
|
parent.postMessage({ type: "AGENT_EXPAND" }, "*");
|
|
14064
14031
|
try {
|
|
14065
|
-
let e = typeof window < "u" ? window.location.href : "",
|
|
14032
|
+
let e = typeof window < "u" ? window.location.href : "", n = "[]";
|
|
14066
14033
|
try {
|
|
14067
|
-
|
|
14034
|
+
n = await t["fwh-list-forms-mvp"]();
|
|
14068
14035
|
} catch {}
|
|
14069
|
-
let
|
|
14036
|
+
let r = "none";
|
|
14070
14037
|
if (typeof window < "u" && typeof document < "u") try {
|
|
14071
14038
|
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 && (
|
|
14039
|
+
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
14040
|
} 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));
|
|
14041
|
+
x || ne.sendContextualUpdate("The visitor's email is already on file from an earlier session."), ne.sendContextualUpdate(j_(e, r, n));
|
|
14076
14042
|
} catch {}
|
|
14077
14043
|
if (typeof window < "u") {
|
|
14078
14044
|
let t = window.location.pathname, n = Date.now(), r = (e) => {
|
|
@@ -14081,57 +14047,51 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
|
|
|
14081
14047
|
} catch {
|
|
14082
14048
|
return ((e || "/").replace(/\/+$/, "") || "/").toLowerCase();
|
|
14083
14049
|
}
|
|
14084
|
-
},
|
|
14050
|
+
}, i = () => {
|
|
14085
14051
|
if (e) return;
|
|
14086
|
-
let
|
|
14087
|
-
if (r(
|
|
14088
|
-
t =
|
|
14052
|
+
let i = window.location.pathname;
|
|
14053
|
+
if (r(i) === r(t)) {
|
|
14054
|
+
t = i;
|
|
14089
14055
|
return;
|
|
14090
14056
|
}
|
|
14091
14057
|
if (Date.now() - n < 8e3) {
|
|
14092
|
-
t =
|
|
14058
|
+
t = i;
|
|
14093
14059
|
return;
|
|
14094
14060
|
}
|
|
14095
|
-
let
|
|
14096
|
-
t =
|
|
14097
|
-
let
|
|
14061
|
+
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;
|
|
14062
|
+
t = i;
|
|
14063
|
+
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
14064
|
tag: e.tagName,
|
|
14099
14065
|
text: e.textContent.trim()
|
|
14100
14066
|
})).filter((e) => e.text.length > 0 && e.text.length < 200).slice(0, 20) : [];
|
|
14101
14067
|
try {
|
|
14102
14068
|
Pn();
|
|
14103
14069
|
} 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");
|
|
14070
|
+
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);
|
|
14071
|
+
if (o) {
|
|
14072
|
+
typeof window < "u" && (window.__fe_agent_nav = null), console.log(`[FlowEngage] agent-driven navigation settled: "${s}" → "${i}"`);
|
|
14110
14073
|
try {
|
|
14111
|
-
|
|
14074
|
+
L.current?.sendContextualUpdate?.(j_(c, u));
|
|
14112
14075
|
} catch {}
|
|
14113
14076
|
return;
|
|
14114
14077
|
}
|
|
14115
14078
|
typeof window < "u" && (window.__fe_user_nav_during_speech = {
|
|
14116
|
-
fromPath:
|
|
14117
|
-
toPath:
|
|
14118
|
-
fromPageName:
|
|
14119
|
-
toPageName:
|
|
14079
|
+
fromPath: s,
|
|
14080
|
+
toPath: i,
|
|
14081
|
+
fromPageName: f,
|
|
14082
|
+
toPageName: p,
|
|
14120
14083
|
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 {}
|
|
14084
|
+
}), console.log(`[FlowEngage] visitor navigation detected: "${s}" → "${i}" (agent target: ${D || "none"})`);
|
|
14125
14085
|
try {
|
|
14126
|
-
|
|
14086
|
+
L.current?.sendContextualUpdate?.(j_(c, u, null, f));
|
|
14127
14087
|
} catch {}
|
|
14128
14088
|
};
|
|
14129
14089
|
c = window.history.pushState.bind(window.history), window.history.pushState = (...e) => {
|
|
14130
|
-
c(...e), setTimeout(
|
|
14131
|
-
}, p = () => setTimeout(
|
|
14090
|
+
c(...e), setTimeout(i, 50);
|
|
14091
|
+
}, p = () => setTimeout(i, 50), window.addEventListener("popstate", p);
|
|
14132
14092
|
}
|
|
14133
14093
|
} 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"),
|
|
14094
|
+
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
14095
|
e || t?.();
|
|
14136
14096
|
}, 0)));
|
|
14137
14097
|
}
|
|
@@ -14140,15 +14100,15 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
|
|
|
14140
14100
|
agentId: r,
|
|
14141
14101
|
siteId: i,
|
|
14142
14102
|
apiBaseUrl: a
|
|
14143
|
-
}), e = !0,
|
|
14103
|
+
}), e = !0, Ne.current = !0;
|
|
14144
14104
|
try {
|
|
14145
14105
|
Pn();
|
|
14146
14106
|
} catch {}
|
|
14147
14107
|
if (i) try {
|
|
14148
|
-
|
|
14108
|
+
Re(i);
|
|
14149
14109
|
} catch {}
|
|
14150
|
-
typeof window < "u" && (window.__fe_user_nav_during_speech = null), Pr(),
|
|
14151
|
-
let t = o ||
|
|
14110
|
+
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);
|
|
14111
|
+
let t = o || L.current, n = Ie.current, d = Le.current;
|
|
14152
14112
|
if (t?.endSession?.().catch(() => {}), n && s && a) {
|
|
14153
14113
|
let e = d ? Math.round((Date.now() - d) / 1e3) : 0, t = JSON.stringify({
|
|
14154
14114
|
chatId: s,
|
|
@@ -14161,7 +14121,7 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
|
|
|
14161
14121
|
headers: { "Content-Type": "application/json" },
|
|
14162
14122
|
body: t,
|
|
14163
14123
|
keepalive: !0
|
|
14164
|
-
}).catch(() => {}),
|
|
14124
|
+
}).catch(() => {}), Ie.current = null, Le.current = null;
|
|
14165
14125
|
}
|
|
14166
14126
|
typeof u == "function" && l.current.length > 0 && u(l.current).catch?.(() => {});
|
|
14167
14127
|
};
|
|
@@ -14174,48 +14134,48 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
|
|
|
14174
14134
|
if (!ee) return;
|
|
14175
14135
|
let e = (e) => {
|
|
14176
14136
|
let t = e.composedPath?.()?.[0] || e.target;
|
|
14177
|
-
|
|
14137
|
+
R.current && !R.current.contains(t) && te(!1);
|
|
14178
14138
|
};
|
|
14179
14139
|
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
14180
14140
|
}, [ee]);
|
|
14181
14141
|
let H = async () => {
|
|
14182
|
-
if (
|
|
14142
|
+
if (L.current) try {
|
|
14183
14143
|
if (k) {
|
|
14184
|
-
|
|
14144
|
+
ze.current = 0, await L.current.setMicMuted?.(!1), A(!1);
|
|
14185
14145
|
try {
|
|
14186
|
-
|
|
14146
|
+
L.current.sendContextualUpdate?.("[MIC] The visitor unmuted their microphone.");
|
|
14187
14147
|
} catch {}
|
|
14188
14148
|
} else {
|
|
14189
|
-
|
|
14149
|
+
ze.current = 0, await L.current.setMicMuted?.(!0), A(!0);
|
|
14190
14150
|
try {
|
|
14191
|
-
|
|
14151
|
+
L.current.sendContextualUpdate?.("[MIC] The visitor muted their microphone.");
|
|
14192
14152
|
} catch {}
|
|
14193
14153
|
}
|
|
14194
14154
|
} catch {}
|
|
14195
14155
|
}, U = o(async (e) => {
|
|
14196
14156
|
e?.preventDefault?.();
|
|
14197
|
-
let t =
|
|
14157
|
+
let t = oe.trim().toLowerCase();
|
|
14198
14158
|
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)) {
|
|
14199
|
-
|
|
14159
|
+
N("Please enter a valid email address.");
|
|
14200
14160
|
return;
|
|
14201
14161
|
}
|
|
14202
|
-
|
|
14162
|
+
N(""), ce.current = !0, P.current = !1, V(), ae(!1), M(""), me.current = !1;
|
|
14203
14163
|
try {
|
|
14204
14164
|
typeof b == "function" && await b(t);
|
|
14205
14165
|
} catch {}
|
|
14206
|
-
|
|
14207
|
-
let n =
|
|
14208
|
-
|
|
14166
|
+
L.current?.setMicMuted?.(!1);
|
|
14167
|
+
let n = pe.current;
|
|
14168
|
+
pe.current = "";
|
|
14209
14169
|
try {
|
|
14210
|
-
|
|
14170
|
+
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
14171
|
} catch {}
|
|
14212
14172
|
}, [
|
|
14213
|
-
|
|
14173
|
+
oe,
|
|
14214
14174
|
b,
|
|
14215
14175
|
V
|
|
14216
14176
|
]), Qe = Array.isArray(e) && e[0] || "#3B82F6";
|
|
14217
14177
|
return /* @__PURE__ */ _("div", {
|
|
14218
|
-
ref:
|
|
14178
|
+
ref: R,
|
|
14219
14179
|
style: {
|
|
14220
14180
|
position: "relative",
|
|
14221
14181
|
display: "flex",
|
|
@@ -14225,7 +14185,7 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
|
|
|
14225
14185
|
animation: "fe-orb-slide-up 0.42s cubic-bezier(0.16,1,0.3,1)"
|
|
14226
14186
|
},
|
|
14227
14187
|
children: [
|
|
14228
|
-
|
|
14188
|
+
ie && /* @__PURE__ */ _("form", {
|
|
14229
14189
|
onSubmit: U,
|
|
14230
14190
|
style: {
|
|
14231
14191
|
width: "270px",
|
|
@@ -14257,9 +14217,9 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
|
|
|
14257
14217
|
inputMode: "email",
|
|
14258
14218
|
autoComplete: "email",
|
|
14259
14219
|
autoFocus: !0,
|
|
14260
|
-
value:
|
|
14220
|
+
value: oe,
|
|
14261
14221
|
onChange: (e) => {
|
|
14262
|
-
|
|
14222
|
+
M(e.target.value), se && N("");
|
|
14263
14223
|
},
|
|
14264
14224
|
placeholder: "you@example.com",
|
|
14265
14225
|
style: {
|
|
@@ -14267,33 +14227,33 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
|
|
|
14267
14227
|
boxSizing: "border-box",
|
|
14268
14228
|
padding: "10px 12px",
|
|
14269
14229
|
borderRadius: "10px",
|
|
14270
|
-
border:
|
|
14230
|
+
border: se ? "1.5px solid #ef4444" : "1.5px solid #4b5563",
|
|
14271
14231
|
background: "#1f2937",
|
|
14272
14232
|
color: "white",
|
|
14273
14233
|
fontSize: "14px",
|
|
14274
14234
|
outline: "none"
|
|
14275
14235
|
}
|
|
14276
14236
|
}),
|
|
14277
|
-
|
|
14237
|
+
se && /* @__PURE__ */ g("span", {
|
|
14278
14238
|
style: {
|
|
14279
14239
|
color: "#f87171",
|
|
14280
14240
|
fontSize: "12px"
|
|
14281
14241
|
},
|
|
14282
|
-
children:
|
|
14242
|
+
children: se
|
|
14283
14243
|
}),
|
|
14284
14244
|
/* @__PURE__ */ g("button", {
|
|
14285
14245
|
type: "submit",
|
|
14286
|
-
disabled: !
|
|
14246
|
+
disabled: !oe.trim(),
|
|
14287
14247
|
style: {
|
|
14288
14248
|
width: "100%",
|
|
14289
14249
|
padding: "10px 12px",
|
|
14290
14250
|
borderRadius: "10px",
|
|
14291
14251
|
border: "none",
|
|
14292
|
-
background:
|
|
14252
|
+
background: oe.trim() ? Qe : "#374151",
|
|
14293
14253
|
color: "white",
|
|
14294
14254
|
fontSize: "14px",
|
|
14295
14255
|
fontWeight: 600,
|
|
14296
|
-
cursor:
|
|
14256
|
+
cursor: oe.trim() ? "pointer" : "default",
|
|
14297
14257
|
transition: "background 0.2s ease"
|
|
14298
14258
|
},
|
|
14299
14259
|
children: "Submit"
|
|
@@ -14453,7 +14413,7 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
|
|
|
14453
14413
|
children: [
|
|
14454
14414
|
/* @__PURE__ */ _("button", {
|
|
14455
14415
|
onClick: () => {
|
|
14456
|
-
te(!1),
|
|
14416
|
+
te(!1), Pe.current = "chat", Ze(t);
|
|
14457
14417
|
},
|
|
14458
14418
|
style: {
|
|
14459
14419
|
display: "flex",
|
|
@@ -14481,7 +14441,7 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
|
|
|
14481
14441
|
children: [/* @__PURE__ */ g(vg, {}), T]
|
|
14482
14442
|
}),
|
|
14483
14443
|
i && /* @__PURE__ */ _("button", {
|
|
14484
|
-
onClick: () =>
|
|
14444
|
+
onClick: () => re(),
|
|
14485
14445
|
style: {
|
|
14486
14446
|
display: "flex",
|
|
14487
14447
|
alignItems: "center",
|
|
@@ -14557,7 +14517,7 @@ function H_({ orbColors: e, onEnterChat: t, onEndChat: n, agentId: r, siteId: i,
|
|
|
14557
14517
|
}),
|
|
14558
14518
|
/* @__PURE__ */ _("button", {
|
|
14559
14519
|
onClick: () => {
|
|
14560
|
-
te(!1),
|
|
14520
|
+
te(!1), Pe.current = "minimized", Ze(n);
|
|
14561
14521
|
},
|
|
14562
14522
|
style: {
|
|
14563
14523
|
display: "flex",
|
|
@@ -14683,11 +14643,11 @@ var W_ = () => /* @__PURE__ */ g("div", {
|
|
|
14683
14643
|
} }, e))
|
|
14684
14644
|
})
|
|
14685
14645
|
});
|
|
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
|
-
}, [
|
|
14646
|
+
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 }) {
|
|
14647
|
+
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 = () => {
|
|
14648
|
+
let e = Pe ? "ask" : "auto";
|
|
14649
|
+
ue(Ne, e), Fe(e === "auto");
|
|
14650
|
+
}, [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
14651
|
c(() => {
|
|
14692
14652
|
if (!s) return;
|
|
14693
14653
|
let e = window.visualViewport;
|
|
@@ -14700,26 +14660,26 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
14700
14660
|
};
|
|
14701
14661
|
}, [s]);
|
|
14702
14662
|
let We = s && window.innerHeight - B > 150, Ge = async () => {
|
|
14703
|
-
|
|
14663
|
+
je(!1), Re(!0), Ve(!0);
|
|
14704
14664
|
try {
|
|
14705
|
-
let e = await
|
|
14706
|
-
e?.data &&
|
|
14665
|
+
let e = await Ce();
|
|
14666
|
+
e?.data && ze(e.data);
|
|
14707
14667
|
} catch (e) {
|
|
14708
14668
|
console.error(e);
|
|
14709
14669
|
} finally {
|
|
14710
|
-
|
|
14670
|
+
Ve(!1);
|
|
14711
14671
|
}
|
|
14712
14672
|
}, Ke = async (e) => {
|
|
14713
|
-
|
|
14673
|
+
Re(!1), we?.(e.chatId);
|
|
14714
14674
|
};
|
|
14715
14675
|
return c(() => {
|
|
14716
|
-
if (!
|
|
14676
|
+
if (!Ae) return;
|
|
14717
14677
|
let e = (e) => {
|
|
14718
14678
|
let t = e.composedPath?.()?.[0] || e.target;
|
|
14719
|
-
|
|
14679
|
+
z.current && !z.current.contains(t) && je(!1);
|
|
14720
14680
|
};
|
|
14721
14681
|
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
14722
|
-
}, [
|
|
14682
|
+
}, [Ae]), /* @__PURE__ */ _("div", {
|
|
14723
14683
|
style: s ? {
|
|
14724
14684
|
"--flowengage-primary": n,
|
|
14725
14685
|
"--flowengage-accent": n,
|
|
@@ -14733,7 +14693,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
14733
14693
|
display: "flex",
|
|
14734
14694
|
flexDirection: "column",
|
|
14735
14695
|
overflow: "hidden",
|
|
14736
|
-
animation:
|
|
14696
|
+
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
14697
|
} : {
|
|
14738
14698
|
"--flowengage-primary": n,
|
|
14739
14699
|
"--flowengage-accent": n,
|
|
@@ -14746,7 +14706,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
14746
14706
|
flexDirection: "column",
|
|
14747
14707
|
overflow: "hidden",
|
|
14748
14708
|
position: "relative",
|
|
14749
|
-
animation:
|
|
14709
|
+
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
14710
|
},
|
|
14751
14711
|
children: [
|
|
14752
14712
|
/* @__PURE__ */ _("div", {
|
|
@@ -14756,7 +14716,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
14756
14716
|
alignItems: "center",
|
|
14757
14717
|
columnGap: "14px",
|
|
14758
14718
|
padding: "16px 10px 14px",
|
|
14759
|
-
background:
|
|
14719
|
+
background: Se || "transparent",
|
|
14760
14720
|
flexShrink: 0,
|
|
14761
14721
|
position: "relative",
|
|
14762
14722
|
zIndex: 30
|
|
@@ -14769,7 +14729,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
14769
14729
|
alignItems: "center"
|
|
14770
14730
|
},
|
|
14771
14731
|
children: /* @__PURE__ */ g("button", {
|
|
14772
|
-
onClick:
|
|
14732
|
+
onClick: ye,
|
|
14773
14733
|
style: {
|
|
14774
14734
|
width: "40px",
|
|
14775
14735
|
height: "40px",
|
|
@@ -14871,10 +14831,10 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
14871
14831
|
isolation: "isolate",
|
|
14872
14832
|
zIndex: 10
|
|
14873
14833
|
},
|
|
14874
|
-
ref:
|
|
14834
|
+
ref: z,
|
|
14875
14835
|
children: [/* @__PURE__ */ g("button", {
|
|
14876
14836
|
type: "button",
|
|
14877
|
-
onClick: () =>
|
|
14837
|
+
onClick: () => je((e) => !e),
|
|
14878
14838
|
style: {
|
|
14879
14839
|
width: "40px",
|
|
14880
14840
|
height: "40px",
|
|
@@ -14920,7 +14880,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
14920
14880
|
})
|
|
14921
14881
|
]
|
|
14922
14882
|
})
|
|
14923
|
-
}),
|
|
14883
|
+
}), Ae && /* @__PURE__ */ _("div", {
|
|
14924
14884
|
style: {
|
|
14925
14885
|
position: "absolute",
|
|
14926
14886
|
top: "34px",
|
|
@@ -14936,10 +14896,10 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
14936
14896
|
animation: "fe-orb-fade-in 0.18s ease"
|
|
14937
14897
|
},
|
|
14938
14898
|
children: [
|
|
14939
|
-
|
|
14899
|
+
xe && /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ _("button", {
|
|
14940
14900
|
type: "button",
|
|
14941
14901
|
onClick: () => {
|
|
14942
|
-
|
|
14902
|
+
je(!1), be?.();
|
|
14943
14903
|
},
|
|
14944
14904
|
style: {
|
|
14945
14905
|
display: "flex",
|
|
@@ -14981,7 +14941,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
14981
14941
|
/* @__PURE__ */ _("button", {
|
|
14982
14942
|
type: "button",
|
|
14983
14943
|
onClick: () => {
|
|
14984
|
-
|
|
14944
|
+
je(!1), F?.();
|
|
14985
14945
|
},
|
|
14986
14946
|
style: {
|
|
14987
14947
|
display: "flex",
|
|
@@ -15016,7 +14976,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15016
14976
|
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
14977
|
}), "Start new chat"]
|
|
15018
14978
|
}),
|
|
15019
|
-
|
|
14979
|
+
Ce && /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g("div", { style: {
|
|
15020
14980
|
height: "1px",
|
|
15021
14981
|
background: "rgba(255,255,255,0.07)",
|
|
15022
14982
|
margin: "0 14px"
|
|
@@ -15056,14 +15016,14 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15056
15016
|
children: /* @__PURE__ */ g("path", { d: "M12 8v4l3 3M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0z" })
|
|
15057
15017
|
}), "Chat history"]
|
|
15058
15018
|
})] }),
|
|
15059
|
-
|
|
15019
|
+
Ne && /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g("div", { style: {
|
|
15060
15020
|
height: "1px",
|
|
15061
15021
|
background: "rgba(255,255,255,0.07)",
|
|
15062
15022
|
margin: "0 14px"
|
|
15063
15023
|
} }), /* @__PURE__ */ _("button", {
|
|
15064
15024
|
type: "button",
|
|
15065
15025
|
onClick: () => {
|
|
15066
|
-
|
|
15026
|
+
Ie(), je(!1);
|
|
15067
15027
|
},
|
|
15068
15028
|
style: {
|
|
15069
15029
|
display: "flex",
|
|
@@ -15120,7 +15080,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15120
15080
|
width: "34px",
|
|
15121
15081
|
height: "19px",
|
|
15122
15082
|
borderRadius: "999px",
|
|
15123
|
-
background:
|
|
15083
|
+
background: Pe ? "#22c55e" : "rgba(255,255,255,0.2)",
|
|
15124
15084
|
position: "relative",
|
|
15125
15085
|
flexShrink: 0,
|
|
15126
15086
|
transition: "background 0.15s ease"
|
|
@@ -15128,7 +15088,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15128
15088
|
children: /* @__PURE__ */ g("span", { style: {
|
|
15129
15089
|
position: "absolute",
|
|
15130
15090
|
top: "2px",
|
|
15131
|
-
left:
|
|
15091
|
+
left: Pe ? "17px" : "2px",
|
|
15132
15092
|
width: "15px",
|
|
15133
15093
|
height: "15px",
|
|
15134
15094
|
borderRadius: "50%",
|
|
@@ -15145,7 +15105,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15145
15105
|
/* @__PURE__ */ _("button", {
|
|
15146
15106
|
type: "button",
|
|
15147
15107
|
onClick: () => {
|
|
15148
|
-
|
|
15108
|
+
je(!1), ye?.();
|
|
15149
15109
|
},
|
|
15150
15110
|
style: {
|
|
15151
15111
|
display: "flex",
|
|
@@ -15204,23 +15164,23 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15204
15164
|
]
|
|
15205
15165
|
}),
|
|
15206
15166
|
/* @__PURE__ */ g(Hg, {
|
|
15207
|
-
webRTCError:
|
|
15208
|
-
micError:
|
|
15209
|
-
setMicError:
|
|
15210
|
-
dismissCallError:
|
|
15167
|
+
webRTCError: se,
|
|
15168
|
+
micError: N,
|
|
15169
|
+
setMicError: ce,
|
|
15170
|
+
dismissCallError: P,
|
|
15211
15171
|
isRateLimited: E,
|
|
15212
15172
|
rateLimitMessage: D
|
|
15213
15173
|
}),
|
|
15214
|
-
|
|
15174
|
+
_e && /* @__PURE__ */ g(a_, {
|
|
15215
15175
|
agentName: v,
|
|
15216
15176
|
agentHeadshot: y,
|
|
15217
15177
|
fallbackAgentName: b,
|
|
15218
|
-
callDurationSeconds:
|
|
15219
|
-
isCallMuted:
|
|
15220
|
-
formatCallDuration:
|
|
15221
|
-
toggleCallMute:
|
|
15222
|
-
endWebRTCCall:
|
|
15223
|
-
onExpand:
|
|
15178
|
+
callDurationSeconds: ge,
|
|
15179
|
+
isCallMuted: fe,
|
|
15180
|
+
formatCallDuration: he,
|
|
15181
|
+
toggleCallMute: pe,
|
|
15182
|
+
endWebRTCCall: me,
|
|
15183
|
+
onExpand: ve,
|
|
15224
15184
|
primaryColor: n
|
|
15225
15185
|
}),
|
|
15226
15186
|
/* @__PURE__ */ _("div", {
|
|
@@ -15232,7 +15192,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15232
15192
|
background: "transparent",
|
|
15233
15193
|
position: "relative"
|
|
15234
15194
|
},
|
|
15235
|
-
children: [
|
|
15195
|
+
children: [Le ? /* @__PURE__ */ _("div", {
|
|
15236
15196
|
style: {
|
|
15237
15197
|
position: "absolute",
|
|
15238
15198
|
inset: 0,
|
|
@@ -15251,7 +15211,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15251
15211
|
flexShrink: 0
|
|
15252
15212
|
},
|
|
15253
15213
|
children: /* @__PURE__ */ _("button", {
|
|
15254
|
-
onClick: () =>
|
|
15214
|
+
onClick: () => Re(!1),
|
|
15255
15215
|
style: {
|
|
15256
15216
|
background: "none",
|
|
15257
15217
|
border: "none",
|
|
@@ -15285,7 +15245,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15285
15245
|
overflowY: "auto",
|
|
15286
15246
|
position: "relative"
|
|
15287
15247
|
},
|
|
15288
|
-
children:
|
|
15248
|
+
children: Be ? /* @__PURE__ */ g("div", {
|
|
15289
15249
|
style: {
|
|
15290
15250
|
padding: "40px 20px",
|
|
15291
15251
|
textAlign: "center",
|
|
@@ -15293,7 +15253,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15293
15253
|
fontSize: "14px"
|
|
15294
15254
|
},
|
|
15295
15255
|
children: "Loading past conversations..."
|
|
15296
|
-
}) :
|
|
15256
|
+
}) : R.length > 0 ? /* @__PURE__ */ g("div", { children: R.map((e) => /* @__PURE__ */ _("div", {
|
|
15297
15257
|
onClick: () => Ke(e),
|
|
15298
15258
|
style: {
|
|
15299
15259
|
padding: "16px 20px",
|
|
@@ -15345,18 +15305,18 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15345
15305
|
children: "No previous chats found."
|
|
15346
15306
|
})
|
|
15347
15307
|
})]
|
|
15348
|
-
}) : null,
|
|
15308
|
+
}) : null, De ? /* @__PURE__ */ g(zg, {
|
|
15349
15309
|
chatHistory: l,
|
|
15350
15310
|
isAiTyping: u,
|
|
15351
15311
|
isLoading: T,
|
|
15352
15312
|
isAgentTyping: d,
|
|
15353
|
-
setReplyContext:
|
|
15313
|
+
setReplyContext: M,
|
|
15354
15314
|
TypingDots: W_,
|
|
15355
15315
|
primaryColor: n,
|
|
15356
15316
|
agentHeadshot: y,
|
|
15357
15317
|
agentDisplayName: v || b,
|
|
15358
15318
|
botAvatarNode: /* @__PURE__ */ g(U_, { orbColors: t })
|
|
15359
|
-
}) :
|
|
15319
|
+
}) : Te ? /* @__PURE__ */ _("div", {
|
|
15360
15320
|
style: {
|
|
15361
15321
|
flex: 1,
|
|
15362
15322
|
display: "flex",
|
|
@@ -15446,7 +15406,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15446
15406
|
]
|
|
15447
15407
|
})]
|
|
15448
15408
|
}),
|
|
15449
|
-
|
|
15409
|
+
ae && /* @__PURE__ */ _("div", {
|
|
15450
15410
|
style: {
|
|
15451
15411
|
margin: "0 16px 8px",
|
|
15452
15412
|
padding: "9px 14px",
|
|
@@ -15492,13 +15452,13 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15492
15452
|
setInput: S,
|
|
15493
15453
|
onSubmit: C,
|
|
15494
15454
|
isConversationEnded: w,
|
|
15495
|
-
callUiActive:
|
|
15496
|
-
handleToggleVoice:
|
|
15455
|
+
callUiActive: ke,
|
|
15456
|
+
handleToggleVoice: be,
|
|
15497
15457
|
showVoiceToggle: f === "agent",
|
|
15498
15458
|
activeScreen: f,
|
|
15499
|
-
inputDisabled:
|
|
15500
|
-
replyContext:
|
|
15501
|
-
clearReplyContext: () =>
|
|
15459
|
+
inputDisabled: Oe,
|
|
15460
|
+
replyContext: oe,
|
|
15461
|
+
clearReplyContext: () => M(null),
|
|
15502
15462
|
onFileSelect: k,
|
|
15503
15463
|
selectedFile: O,
|
|
15504
15464
|
onRemoveSelectedFile: A,
|
|
@@ -15506,8 +15466,8 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15506
15466
|
isUploadingAttachment: te,
|
|
15507
15467
|
requiresEmail: ne,
|
|
15508
15468
|
emailInput: j,
|
|
15509
|
-
setEmailInput:
|
|
15510
|
-
emailError:
|
|
15469
|
+
setEmailInput: re,
|
|
15470
|
+
emailError: ie,
|
|
15511
15471
|
inputPlaceholder: e.inputPlaceholder
|
|
15512
15472
|
})
|
|
15513
15473
|
}),
|
|
@@ -15519,7 +15479,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15519
15479
|
paddingBottom: "max(12px, env(safe-area-inset-bottom, 12px))",
|
|
15520
15480
|
pointerEvents: "none"
|
|
15521
15481
|
},
|
|
15522
|
-
children: [
|
|
15482
|
+
children: [L && /* @__PURE__ */ _("p", {
|
|
15523
15483
|
style: {
|
|
15524
15484
|
margin: "0 0 4px",
|
|
15525
15485
|
fontSize: "10px",
|
|
@@ -15532,7 +15492,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15532
15492
|
"This conversation is recorded for quality assurance purposes.",
|
|
15533
15493
|
" ",
|
|
15534
15494
|
/* @__PURE__ */ g("a", {
|
|
15535
|
-
href:
|
|
15495
|
+
href: L,
|
|
15536
15496
|
target: "_blank",
|
|
15537
15497
|
rel: "noopener noreferrer",
|
|
15538
15498
|
style: {
|
|
@@ -15542,7 +15502,7 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15542
15502
|
children: "See our privacy policy"
|
|
15543
15503
|
})
|
|
15544
15504
|
]
|
|
15545
|
-
}),
|
|
15505
|
+
}), I && /* @__PURE__ */ _("span", {
|
|
15546
15506
|
style: {
|
|
15547
15507
|
fontSize: "11px",
|
|
15548
15508
|
color: "#9ca3af",
|
|
@@ -15562,33 +15522,33 @@ function G_({ copy: e, orbColors: t, primaryColor: n, chatBgGradient: r, logo: i
|
|
|
15562
15522
|
});
|
|
15563
15523
|
}
|
|
15564
15524
|
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:
|
|
15525
|
+
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
15526
|
c(() => {
|
|
15567
15527
|
try {
|
|
15568
15528
|
fr();
|
|
15569
15529
|
} catch {}
|
|
15570
15530
|
}, []), c(() => {
|
|
15571
|
-
|
|
15572
|
-
}, [
|
|
15573
|
-
let
|
|
15574
|
-
...
|
|
15575
|
-
...
|
|
15576
|
-
},
|
|
15577
|
-
...
|
|
15578
|
-
...
|
|
15579
|
-
},
|
|
15580
|
-
...
|
|
15581
|
-
...
|
|
15582
|
-
},
|
|
15531
|
+
be && W !== "voice_mode" && W !== "text_chat" && W !== "call_screen" && (M?.(!1), et("text_chat"));
|
|
15532
|
+
}, [be]);
|
|
15533
|
+
let Se = t?.widgetSettings || {}, F = n?.widgetSettings || {}, I = {
|
|
15534
|
+
...Se.branding || {},
|
|
15535
|
+
...F.branding || {}
|
|
15536
|
+
}, L = {
|
|
15537
|
+
...Se.theme || {},
|
|
15538
|
+
...F.theme || {}
|
|
15539
|
+
}, Ce = {
|
|
15540
|
+
...Se.features || {},
|
|
15541
|
+
...F.features || {}
|
|
15542
|
+
}, 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
15543
|
small: 50,
|
|
15584
15544
|
medium: 64,
|
|
15585
15545
|
large: 80
|
|
15586
|
-
},
|
|
15546
|
+
}, 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
15547
|
id: e.key || `qr-${t}`,
|
|
15588
15548
|
label: e.label,
|
|
15589
15549
|
message: e.label,
|
|
15590
15550
|
text: e.label
|
|
15591
|
-
})),
|
|
15551
|
+
})), 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
15552
|
c(() => {
|
|
15593
15553
|
if (typeof window > "u") return;
|
|
15594
15554
|
let e = () => V(window.location.pathname), t = window.history.pushState.bind(window.history);
|
|
@@ -15600,24 +15560,24 @@ function K_() {
|
|
|
15600
15560
|
}, []);
|
|
15601
15561
|
let We = (() => {
|
|
15602
15562
|
let e = {
|
|
15603
|
-
...
|
|
15604
|
-
...
|
|
15563
|
+
...Se.pageVisibility || {},
|
|
15564
|
+
...F.pageVisibility || {}
|
|
15605
15565
|
};
|
|
15606
15566
|
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: !!(
|
|
15567
|
+
})(), 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 = {
|
|
15568
|
+
entryPrompt: I.entryPrompt || "Do you want to explore in a new way?",
|
|
15569
|
+
yesLabel: I.yesLabel || "Yes",
|
|
15570
|
+
laterLabel: I.laterLabel || "Later",
|
|
15571
|
+
connectionTitle: I.connectionTitle || "How would you like to connect?",
|
|
15572
|
+
connectionSubtitle: I.connectionSubtitle || "",
|
|
15573
|
+
voiceLabel: I.voiceLabel || "Voice",
|
|
15574
|
+
textLabel: I.textLabel || "Text",
|
|
15575
|
+
chatTitle: I.headerName || "Chat with FlowEngage",
|
|
15576
|
+
hasCustomTitle: !!(I.headerName && String(I.headerName).trim()),
|
|
15617
15577
|
introGreeting: Ke,
|
|
15618
|
-
inputPlaceholder:
|
|
15619
|
-
analysingLabel:
|
|
15620
|
-
}, Je =
|
|
15578
|
+
inputPlaceholder: I.inputPlaceholder || "Type your message",
|
|
15579
|
+
analysingLabel: I.analysingLabel || "analysing..."
|
|
15580
|
+
}, Je = F.elevenLabsAgentId || t?.elevenLabsAgentId || null, Ye = t?.siteId || n?.siteId || null, Xe = t?.apiBaseUrl || "";
|
|
15621
15581
|
c(() => {
|
|
15622
15582
|
Qn(t?.siteType || null);
|
|
15623
15583
|
}, [t?.siteType]);
|
|
@@ -15628,10 +15588,10 @@ function K_() {
|
|
|
15628
15588
|
]), H = u && String(u).trim() || t?.ownerProfileImageUrl && String(t.ownerProfileImageUrl).trim() || null, U = r.some((e) => e.sender === "user"), Qe = f(() => {
|
|
15629
15589
|
let e = r.findIndex((e) => e.sender === "user");
|
|
15630
15590
|
return e === -1 ? !1 : r.slice(e + 1).some((e) => e.sender === "bot" || e.sender === "ai" || e.sender === "agent");
|
|
15631
|
-
}, [r]), $e = !!(
|
|
15591
|
+
}, [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
15592
|
d(() => {
|
|
15633
15593
|
if (e !== "ready" || Tt.current) return;
|
|
15634
|
-
if (Tt.current = !0, !
|
|
15594
|
+
if (Tt.current = !0, !we) {
|
|
15635
15595
|
et("minimized_orb");
|
|
15636
15596
|
return;
|
|
15637
15597
|
}
|
|
@@ -15639,13 +15599,13 @@ function K_() {
|
|
|
15639
15599
|
try {
|
|
15640
15600
|
t = wr().shouldResumeVoice;
|
|
15641
15601
|
} catch {}
|
|
15642
|
-
let n =
|
|
15602
|
+
let n = je(), r = Ye ? De(Ye) : null, i = n || !!r?.transcript;
|
|
15643
15603
|
if (t) {
|
|
15644
|
-
|
|
15604
|
+
ae?.({ notifyChatInitiated: !0 }), M?.(!0), et("voice_mode");
|
|
15645
15605
|
return;
|
|
15646
15606
|
}
|
|
15647
|
-
if (
|
|
15648
|
-
|
|
15607
|
+
if (Pe()) {
|
|
15608
|
+
ae?.({ notifyChatInitiated: !1 }), et("text_chat");
|
|
15649
15609
|
return;
|
|
15650
15610
|
}
|
|
15651
15611
|
if (i) {
|
|
@@ -15653,13 +15613,13 @@ function K_() {
|
|
|
15653
15613
|
et("minimized_orb");
|
|
15654
15614
|
return;
|
|
15655
15615
|
}
|
|
15656
|
-
|
|
15616
|
+
ae?.({ notifyChatInitiated: !0 }), M?.(!0), et("voice_mode");
|
|
15657
15617
|
return;
|
|
15658
15618
|
}
|
|
15659
15619
|
if (Ye) try {
|
|
15660
|
-
|
|
15620
|
+
Oe(Ye);
|
|
15661
15621
|
} catch {}
|
|
15662
|
-
if (
|
|
15622
|
+
if (se(Ye)) {
|
|
15663
15623
|
et("minimized_orb");
|
|
15664
15624
|
return;
|
|
15665
15625
|
}
|
|
@@ -15717,7 +15677,7 @@ function K_() {
|
|
|
15717
15677
|
hasIncomingCall: !!w?.callId,
|
|
15718
15678
|
activeCallId: T,
|
|
15719
15679
|
callConnectionState: E
|
|
15720
|
-
}), wt.current = e, W === "voice_mode" &&
|
|
15680
|
+
}), wt.current = e, W === "voice_mode" && M?.(!1), ae?.(), jt());
|
|
15721
15681
|
}
|
|
15722
15682
|
}, [
|
|
15723
15683
|
T,
|
|
@@ -15725,8 +15685,8 @@ function K_() {
|
|
|
15725
15685
|
jt,
|
|
15726
15686
|
w?.callId,
|
|
15727
15687
|
i,
|
|
15728
|
-
|
|
15729
|
-
|
|
15688
|
+
ae,
|
|
15689
|
+
M,
|
|
15730
15690
|
W
|
|
15731
15691
|
]), c(() => {
|
|
15732
15692
|
!w && !T && W === "call_screen" && et("text_chat");
|
|
@@ -15738,16 +15698,16 @@ function K_() {
|
|
|
15738
15698
|
!T && bt && xt(!1);
|
|
15739
15699
|
}, [T, bt]), c(() => {
|
|
15740
15700
|
if (!s || C) {
|
|
15741
|
-
|
|
15701
|
+
ge?.(""), he?.();
|
|
15742
15702
|
return;
|
|
15743
15703
|
}
|
|
15744
15704
|
if (!tt.trim() || mt) {
|
|
15745
|
-
|
|
15746
|
-
let e = window.setTimeout(() =>
|
|
15705
|
+
ge?.("");
|
|
15706
|
+
let e = window.setTimeout(() => he?.(), 100);
|
|
15747
15707
|
return () => window.clearTimeout(e);
|
|
15748
15708
|
}
|
|
15749
|
-
|
|
15750
|
-
let e = window.setTimeout(() =>
|
|
15709
|
+
me?.();
|
|
15710
|
+
let e = window.setTimeout(() => ge?.(tt), 120), t = window.setTimeout(() => he?.(), 1200);
|
|
15751
15711
|
return () => {
|
|
15752
15712
|
window.clearTimeout(e), window.clearTimeout(t);
|
|
15753
15713
|
};
|
|
@@ -15756,9 +15716,9 @@ function K_() {
|
|
|
15756
15716
|
mt,
|
|
15757
15717
|
s,
|
|
15758
15718
|
C,
|
|
15759
|
-
pe,
|
|
15760
15719
|
me,
|
|
15761
|
-
he
|
|
15720
|
+
he,
|
|
15721
|
+
ge
|
|
15762
15722
|
]);
|
|
15763
15723
|
let Nt = (e) => e ? {
|
|
15764
15724
|
replyTo: e.messageId || e.id || null,
|
|
@@ -15772,7 +15732,7 @@ function K_() {
|
|
|
15772
15732
|
ct("Please enter a valid email so we can continue helping you.");
|
|
15773
15733
|
return;
|
|
15774
15734
|
}
|
|
15775
|
-
await
|
|
15735
|
+
await oe(e), ct(""), lt(!0), setTimeout(() => lt(!1), 3e3);
|
|
15776
15736
|
return;
|
|
15777
15737
|
}
|
|
15778
15738
|
let t = Nt(rt);
|
|
@@ -15780,8 +15740,8 @@ function K_() {
|
|
|
15780
15740
|
if (mt) {
|
|
15781
15741
|
try {
|
|
15782
15742
|
yt(!0), _t("");
|
|
15783
|
-
let e = await
|
|
15784
|
-
nt(""), it(null), kt(), await
|
|
15743
|
+
let e = await ie(mt), n = e?.data || e, r = tt.trim() || `Shared file: ${Fg(mt)}`;
|
|
15744
|
+
nt(""), it(null), kt(), await re(r, "", t, {
|
|
15785
15745
|
type: "file",
|
|
15786
15746
|
metadata: {
|
|
15787
15747
|
fileUrl: n?.fileUrl,
|
|
@@ -15798,20 +15758,20 @@ function K_() {
|
|
|
15798
15758
|
return;
|
|
15799
15759
|
}
|
|
15800
15760
|
let n = tt.trim();
|
|
15801
|
-
nt(""), it(null), await
|
|
15761
|
+
nt(""), it(null), await re(n, "", t);
|
|
15802
15762
|
}, Ft = o(() => {
|
|
15803
|
-
r.length !== 0 &&
|
|
15804
|
-
}, [r.length,
|
|
15763
|
+
r.length !== 0 && P?.();
|
|
15764
|
+
}, [r.length, P]), It = (e) => {
|
|
15805
15765
|
let t = Math.floor(e / 60);
|
|
15806
15766
|
return `${String(t).padStart(2, "0")}:${String(e % 60).padStart(2, "0")}`;
|
|
15807
15767
|
}, Lt = o(async (e) => {
|
|
15808
15768
|
if (C || b) return;
|
|
15809
15769
|
let t = e.message || e.label || e.text || "";
|
|
15810
|
-
t.trim() && await
|
|
15770
|
+
t.trim() && await re(t.trim(), "");
|
|
15811
15771
|
}, [
|
|
15812
15772
|
C,
|
|
15813
15773
|
b,
|
|
15814
|
-
|
|
15774
|
+
re
|
|
15815
15775
|
]), Rt = Dt && W === "entry_prompt" ? { inset: 0 } : Dt && W === "text_chat" ? {
|
|
15816
15776
|
left: 0,
|
|
15817
15777
|
right: 0,
|
|
@@ -15832,19 +15792,19 @@ function K_() {
|
|
|
15832
15792
|
height: "min(640px, calc(100vh - 120px))",
|
|
15833
15793
|
borderRadius: "22px",
|
|
15834
15794
|
overflow: "hidden",
|
|
15835
|
-
...
|
|
15795
|
+
...Me === "bottom-left" ? {
|
|
15836
15796
|
left: "1.5rem",
|
|
15837
|
-
bottom:
|
|
15797
|
+
bottom: z
|
|
15838
15798
|
} : {
|
|
15839
15799
|
right: "1.5rem",
|
|
15840
|
-
bottom:
|
|
15800
|
+
bottom: z
|
|
15841
15801
|
}
|
|
15842
|
-
} :
|
|
15802
|
+
} : Me === "bottom-left" ? {
|
|
15843
15803
|
left: "1.5rem",
|
|
15844
|
-
bottom:
|
|
15804
|
+
bottom: z
|
|
15845
15805
|
} : {
|
|
15846
15806
|
right: "1.5rem",
|
|
15847
|
-
bottom:
|
|
15807
|
+
bottom: z
|
|
15848
15808
|
}, zt = o(() => {
|
|
15849
15809
|
W !== "minimized_orb" && (Ct(!0), setTimeout(() => {
|
|
15850
15810
|
et("minimized_orb"), Ct(!1), T && xt(!0);
|
|
@@ -15857,13 +15817,13 @@ function K_() {
|
|
|
15857
15817
|
t.resume().catch(() => {}), setTimeout(() => t.close().catch(() => {}), 3e3);
|
|
15858
15818
|
}
|
|
15859
15819
|
} catch {}
|
|
15860
|
-
|
|
15820
|
+
ae({ notifyChatInitiated: !0 }), M?.(!0), et("voice_mode");
|
|
15861
15821
|
}, Ht = () => {
|
|
15862
|
-
|
|
15822
|
+
ae({ notifyChatInitiated: !0 }), M?.(!1), et("text_chat");
|
|
15863
15823
|
}, Ut = () => {
|
|
15864
|
-
|
|
15824
|
+
M?.(!1), zt();
|
|
15865
15825
|
};
|
|
15866
|
-
return e !== "ready" || !He ||
|
|
15826
|
+
return e !== "ready" || !He || Ce.chat === !1 || !Ge ? null : /* @__PURE__ */ _("div", {
|
|
15867
15827
|
className: "flowengage-widget-root",
|
|
15868
15828
|
style: {
|
|
15869
15829
|
position: "fixed",
|
|
@@ -15875,13 +15835,13 @@ function K_() {
|
|
|
15875
15835
|
children: [
|
|
15876
15836
|
W === "entry_prompt" && /* @__PURE__ */ g(B_, {
|
|
15877
15837
|
copy: qe,
|
|
15878
|
-
orbColors:
|
|
15879
|
-
primaryColor:
|
|
15838
|
+
orbColors: Te,
|
|
15839
|
+
primaryColor: Ee,
|
|
15880
15840
|
onYes: () => {
|
|
15881
|
-
|
|
15841
|
+
N(Ye), Vt();
|
|
15882
15842
|
},
|
|
15883
15843
|
onLater: () => {
|
|
15884
|
-
|
|
15844
|
+
N(Ye), zt();
|
|
15885
15845
|
},
|
|
15886
15846
|
isMobile: Dt,
|
|
15887
15847
|
isClosing: St
|
|
@@ -15905,7 +15865,7 @@ function K_() {
|
|
|
15905
15865
|
transformOrigin: "bottom right",
|
|
15906
15866
|
display: "inline-flex",
|
|
15907
15867
|
flexDirection: "column",
|
|
15908
|
-
alignItems:
|
|
15868
|
+
alignItems: Me === "bottom-left" ? "flex-start" : "flex-end",
|
|
15909
15869
|
gap: "10px"
|
|
15910
15870
|
},
|
|
15911
15871
|
children: [T && /* @__PURE__ */ _("button", {
|
|
@@ -15957,15 +15917,15 @@ function K_() {
|
|
|
15957
15917
|
})]
|
|
15958
15918
|
})]
|
|
15959
15919
|
}), /* @__PURE__ */ g(z_, {
|
|
15960
|
-
size:
|
|
15961
|
-
orbColors:
|
|
15962
|
-
onClick: T ? jt :
|
|
15920
|
+
size: Ae,
|
|
15921
|
+
orbColors: Te,
|
|
15922
|
+
onClick: T ? jt : we ? Bt : Ht
|
|
15963
15923
|
})]
|
|
15964
15924
|
}),
|
|
15965
15925
|
W === "connection_modal" && /* @__PURE__ */ g(V_, {
|
|
15966
15926
|
copy: qe,
|
|
15967
|
-
orbColors:
|
|
15968
|
-
primaryColor:
|
|
15927
|
+
orbColors: Te,
|
|
15928
|
+
primaryColor: Ee,
|
|
15969
15929
|
onVoice: Vt,
|
|
15970
15930
|
onText: Ht,
|
|
15971
15931
|
onClose: zt,
|
|
@@ -15973,7 +15933,7 @@ function K_() {
|
|
|
15973
15933
|
isClosing: St
|
|
15974
15934
|
}),
|
|
15975
15935
|
W === "voice_mode" && /* @__PURE__ */ g(H_, {
|
|
15976
|
-
orbColors:
|
|
15936
|
+
orbColors: Te,
|
|
15977
15937
|
onEnterChat: Ht,
|
|
15978
15938
|
onEndChat: Ut,
|
|
15979
15939
|
agentId: Je,
|
|
@@ -15983,17 +15943,17 @@ function K_() {
|
|
|
15983
15943
|
historyRef: te,
|
|
15984
15944
|
onMessageSync: ne,
|
|
15985
15945
|
beaconSyncVoiceTranscript: j,
|
|
15986
|
-
widgetPosition:
|
|
15987
|
-
voiceEndCounter:
|
|
15946
|
+
widgetPosition: Me,
|
|
15947
|
+
voiceEndCounter: xe,
|
|
15988
15948
|
websiteName: t?.websiteName,
|
|
15989
|
-
voiceFirstMessage:
|
|
15990
|
-
captureVisitorEmail:
|
|
15949
|
+
voiceFirstMessage: Se.voiceFirstMessage || null,
|
|
15950
|
+
captureVisitorEmail: oe,
|
|
15991
15951
|
emailRequired: !h,
|
|
15992
|
-
emailCaptureEnabled:
|
|
15993
|
-
listeningLabel:
|
|
15994
|
-
thinkingLabel:
|
|
15995
|
-
enterChatModeLabel:
|
|
15996
|
-
endConversationLabel:
|
|
15952
|
+
emailCaptureEnabled: Ce.emailCapture !== !1 && I.disableEmailCapture !== !0,
|
|
15953
|
+
listeningLabel: I.voiceListeningLabel || "Listening...",
|
|
15954
|
+
thinkingLabel: I.voiceThinkingLabel || "Thinking...",
|
|
15955
|
+
enterChatModeLabel: I.voiceEnterChatLabel || "Enter Chat Mode",
|
|
15956
|
+
endConversationLabel: I.voiceEndConversationLabel || "End Conversation"
|
|
15997
15957
|
}, "voice"),
|
|
15998
15958
|
W === "call_screen" && /* @__PURE__ */ g(i_, {
|
|
15999
15959
|
incomingCall: w,
|
|
@@ -16003,25 +15963,25 @@ function K_() {
|
|
|
16003
15963
|
isCallMuted: O,
|
|
16004
15964
|
agentName: Ze,
|
|
16005
15965
|
agentHeadshot: H,
|
|
16006
|
-
fallbackAgentName:
|
|
16007
|
-
acceptCall:
|
|
16008
|
-
rejectCall:
|
|
16009
|
-
endWebRTCCall:
|
|
16010
|
-
toggleCallMute:
|
|
15966
|
+
fallbackAgentName: Ne,
|
|
15967
|
+
acceptCall: le,
|
|
15968
|
+
rejectCall: ue,
|
|
15969
|
+
endWebRTCCall: de,
|
|
15970
|
+
toggleCallMute: fe,
|
|
16011
15971
|
formatCallDuration: It,
|
|
16012
15972
|
onMinimize: Mt,
|
|
16013
|
-
primaryColor:
|
|
16014
|
-
orbColors:
|
|
15973
|
+
primaryColor: Ee,
|
|
15974
|
+
orbColors: Te,
|
|
16015
15975
|
chatHistory: r
|
|
16016
15976
|
}),
|
|
16017
15977
|
W === "text_chat" && /* @__PURE__ */ g(G_, {
|
|
16018
15978
|
isClosing: St,
|
|
16019
15979
|
copy: qe,
|
|
16020
|
-
orbColors:
|
|
16021
|
-
primaryColor:
|
|
16022
|
-
chatBgGradient:
|
|
16023
|
-
logo:
|
|
16024
|
-
quickChatOptions:
|
|
15980
|
+
orbColors: Te,
|
|
15981
|
+
primaryColor: Ee,
|
|
15982
|
+
chatBgGradient: Fe,
|
|
15983
|
+
logo: Ie,
|
|
15984
|
+
quickChatOptions: ze,
|
|
16025
15985
|
onQuickChatSelect: Lt,
|
|
16026
15986
|
isMobile: Dt,
|
|
16027
15987
|
chatHistory: r,
|
|
@@ -16030,7 +15990,7 @@ function K_() {
|
|
|
16030
15990
|
activeScreen: a,
|
|
16031
15991
|
agentName: Ze,
|
|
16032
15992
|
agentHeadshot: H,
|
|
16033
|
-
fallbackAgentName:
|
|
15993
|
+
fallbackAgentName: Ne,
|
|
16034
15994
|
input: tt,
|
|
16035
15995
|
setInput: nt,
|
|
16036
15996
|
onSubmit: Pt,
|
|
@@ -16053,26 +16013,26 @@ function K_() {
|
|
|
16053
16013
|
webRTCError: k,
|
|
16054
16014
|
micError: ft,
|
|
16055
16015
|
setMicError: pt,
|
|
16056
|
-
dismissCallError:
|
|
16016
|
+
dismissCallError: pe,
|
|
16057
16017
|
activeCallId: T,
|
|
16058
16018
|
isCallMuted: O,
|
|
16059
|
-
toggleCallMute:
|
|
16060
|
-
endWebRTCCall:
|
|
16019
|
+
toggleCallMute: fe,
|
|
16020
|
+
endWebRTCCall: de,
|
|
16061
16021
|
formatCallDuration: It,
|
|
16062
16022
|
callDurationSeconds: ut,
|
|
16063
16023
|
onCollapse: zt,
|
|
16064
16024
|
onStartVoice: Vt,
|
|
16065
|
-
voiceEnabled:
|
|
16025
|
+
voiceEnabled: we,
|
|
16066
16026
|
onNewChat: Ft,
|
|
16067
16027
|
onMinimize: Mt,
|
|
16068
16028
|
onExpand: jt,
|
|
16069
16029
|
isCallMinimized: !!T,
|
|
16070
|
-
showPoweredBy:
|
|
16030
|
+
showPoweredBy: Be,
|
|
16071
16031
|
privacyPolicyUrl: B,
|
|
16072
|
-
headerBgColor:
|
|
16073
|
-
getVisitorChatHistory:
|
|
16074
|
-
resumeChat:
|
|
16075
|
-
isSessionRestoring:
|
|
16032
|
+
headerBgColor: Ve,
|
|
16033
|
+
getVisitorChatHistory: _e,
|
|
16034
|
+
resumeChat: ve,
|
|
16035
|
+
isSessionRestoring: ye
|
|
16076
16036
|
}),
|
|
16077
16037
|
/* @__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
16038
|
]
|