@tekibo/feedpulse-sdk 0.7.0 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/feedpulse-bot-build.mjs +121 -0
- package/dist/index.js +1 -1
- package/dist/index.mjs +171 -93
- package/dist/nuxt.js +2 -2
- package/dist/nuxt.mjs +345 -284
- package/dist/react.js +3 -3
- package/dist/react.mjs +315 -275
- package/dist/server.js +1 -0
- package/dist/server.mjs +18 -0
- package/package.json +11 -2
- package/templates/nuxt-bot-proxy.ts +39 -2
- package/templates/nuxt-config-id-route.ts +15 -0
package/dist/nuxt.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { inject as
|
|
2
|
-
import { CookieManager as
|
|
3
|
-
import { S as
|
|
4
|
-
const
|
|
5
|
-
function
|
|
6
|
-
return
|
|
1
|
+
import { inject as U, defineComponent as E, ref as u, computed as F, watch as J, createElementBlock as f, openBlock as r, createElementVNode as e, createCommentVNode as h, Fragment as D, renderList as O, normalizeStyle as $, toDisplayString as T, withDirectives as B, vModelText as H, onMounted as N, onBeforeUnmount as Y, createBlock as j, createTextVNode as A, createStaticVNode as G, Teleport as K, vModelCheckbox as q, provide as Q, renderSlot as X } from "vue";
|
|
2
|
+
import { CursorActor as Z, CookieManager as L, FeedPulseTracker as ee } from "./index.mjs";
|
|
3
|
+
import { S as te } from "./struggle-detector-BqTHgw95.mjs";
|
|
4
|
+
const V = /* @__PURE__ */ Symbol("feedpulse");
|
|
5
|
+
function oe() {
|
|
6
|
+
return U(V, null);
|
|
7
7
|
}
|
|
8
|
-
const
|
|
8
|
+
const ne = { style: {
|
|
9
9
|
width: "360px",
|
|
10
10
|
height: "520px",
|
|
11
11
|
background: "#111827",
|
|
@@ -17,20 +17,20 @@ const ee = { style: {
|
|
|
17
17
|
flexDirection: "column",
|
|
18
18
|
overflow: "hidden",
|
|
19
19
|
animation: "fp-panel-open 300ms ease-out"
|
|
20
|
-
} },
|
|
20
|
+
} }, ae = { style: {
|
|
21
21
|
display: "flex",
|
|
22
22
|
justifyContent: "space-between",
|
|
23
23
|
alignItems: "center",
|
|
24
24
|
padding: "12px 14px",
|
|
25
25
|
borderBottom: "1px solid #374151",
|
|
26
26
|
background: "#0f172a"
|
|
27
|
-
} },
|
|
27
|
+
} }, ie = { style: { flex: 1, overflowY: "auto", padding: "12px", display: "grid", gap: "10px" } }, se = {
|
|
28
28
|
key: 0,
|
|
29
29
|
style: { display: "flex", gap: "8px" }
|
|
30
|
-
},
|
|
30
|
+
}, le = ["onClick"], re = ["onClick"], de = {
|
|
31
31
|
key: 0,
|
|
32
32
|
style: { display: "flex", alignItems: "center", gap: "5px", padding: "4px 0" }
|
|
33
|
-
},
|
|
33
|
+
}, ue = {
|
|
34
34
|
key: 1,
|
|
35
35
|
style: {
|
|
36
36
|
border: "1px solid #f59e0b",
|
|
@@ -40,89 +40,125 @@ const ee = { style: {
|
|
|
40
40
|
padding: "10px",
|
|
41
41
|
fontSize: "12px"
|
|
42
42
|
}
|
|
43
|
-
},
|
|
43
|
+
}, pe = {
|
|
44
|
+
key: 2,
|
|
45
|
+
style: {
|
|
46
|
+
margin: "8px 0",
|
|
47
|
+
padding: "12px",
|
|
48
|
+
background: "#f0f0ff",
|
|
49
|
+
border: "1px solid #c7d2fe",
|
|
50
|
+
borderRadius: "10px",
|
|
51
|
+
fontSize: "13px",
|
|
52
|
+
color: "#111827"
|
|
53
|
+
}
|
|
54
|
+
}, ce = { style: { margin: "0 0 8px", fontWeight: "600" } }, fe = { style: { display: "flex", gap: "8px" } }, xe = {
|
|
55
|
+
key: 3,
|
|
56
|
+
style: {
|
|
57
|
+
margin: "0 0 8px",
|
|
58
|
+
padding: "10px",
|
|
59
|
+
background: "#ecfdf5",
|
|
60
|
+
border: "1px solid #6ee7b7",
|
|
61
|
+
borderRadius: "8px",
|
|
62
|
+
fontSize: "13px",
|
|
63
|
+
color: "#065f46"
|
|
64
|
+
}
|
|
65
|
+
}, ge = { style: { display: "flex", gap: "8px" } }, ve = ["disabled"], be = ["disabled"], ye = ["href"], me = /* @__PURE__ */ E({
|
|
44
66
|
__name: "BotPanel",
|
|
45
67
|
props: {
|
|
46
68
|
botSessionId: {},
|
|
47
69
|
config: {},
|
|
70
|
+
configId: {},
|
|
71
|
+
page: {},
|
|
48
72
|
unavailable: { type: Boolean }
|
|
49
73
|
},
|
|
50
74
|
emits: ["close", "helpful", "escalated"],
|
|
51
|
-
setup(
|
|
52
|
-
const
|
|
53
|
-
function
|
|
54
|
-
return
|
|
55
|
-
role:
|
|
56
|
-
content:
|
|
75
|
+
setup(p, { emit: s }) {
|
|
76
|
+
const a = p, o = s, l = u({}), t = u([]), i = u(""), b = u(!1), y = u(!1), g = u(null), x = u(null), m = new Z(), k = F(() => i.value.trim().length > 0 && !b.value && !a.unavailable && !y.value);
|
|
77
|
+
function C() {
|
|
78
|
+
return t.value.map((S) => ({
|
|
79
|
+
role: S.role,
|
|
80
|
+
content: S.content
|
|
57
81
|
}));
|
|
58
82
|
}
|
|
59
|
-
async function
|
|
60
|
-
if (
|
|
83
|
+
async function v(S) {
|
|
84
|
+
if (S.preventDefault(), !k.value)
|
|
61
85
|
return;
|
|
62
|
-
const
|
|
63
|
-
|
|
86
|
+
const c = i.value.trim(), n = [
|
|
87
|
+
...C(),
|
|
88
|
+
{
|
|
89
|
+
role: "user",
|
|
90
|
+
content: c
|
|
91
|
+
}
|
|
92
|
+
];
|
|
93
|
+
i.value = "", t.value.push({
|
|
64
94
|
id: `user-${Date.now()}`,
|
|
65
95
|
role: "user",
|
|
66
|
-
content:
|
|
96
|
+
content: c
|
|
67
97
|
});
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
id:
|
|
98
|
+
const d = `assistant-${Date.now()}`;
|
|
99
|
+
t.value.push({
|
|
100
|
+
id: d,
|
|
71
101
|
role: "assistant",
|
|
72
102
|
content: ""
|
|
73
|
-
}),
|
|
103
|
+
}), b.value = !0, y.value = !1;
|
|
74
104
|
try {
|
|
75
|
-
const
|
|
105
|
+
const w = await fetch("/api/bot/chat-proxy", {
|
|
76
106
|
method: "POST",
|
|
77
107
|
headers: { "content-type": "application/json" },
|
|
78
108
|
body: JSON.stringify({
|
|
79
|
-
botSessionId:
|
|
80
|
-
config:
|
|
81
|
-
|
|
109
|
+
botSessionId: a.botSessionId,
|
|
110
|
+
config: JSON.parse(JSON.stringify(a.config)),
|
|
111
|
+
configId: a.configId,
|
|
112
|
+
page: a.page,
|
|
113
|
+
messages: n
|
|
82
114
|
})
|
|
83
115
|
});
|
|
84
|
-
if (
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
|
|
116
|
+
if (w.status === 402) {
|
|
117
|
+
y.value = !0;
|
|
118
|
+
const _ = t.value.find((W) => W.id === d);
|
|
119
|
+
_ && (_.content = "Service temporarily unavailable.");
|
|
88
120
|
return;
|
|
89
121
|
}
|
|
90
|
-
if (!
|
|
122
|
+
if (!w.ok)
|
|
91
123
|
throw new Error("Chat request failed");
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
throw new Error("Missing stream");
|
|
95
|
-
const h = new TextDecoder();
|
|
96
|
-
let c = !1;
|
|
97
|
-
for (; !c; ) {
|
|
98
|
-
const k = await $.read();
|
|
99
|
-
if (c = k.done, k.value) {
|
|
100
|
-
const z = h.decode(k.value, { stream: !c }), A = e.value.find((V) => V.id === p);
|
|
101
|
-
A && (A.content += z);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
124
|
+
const P = await w.json(), I = t.value.find((_) => _.id === d);
|
|
125
|
+
I && (I.content = P.text || ""), P.action && (g.value = P.action);
|
|
104
126
|
} catch {
|
|
105
|
-
const
|
|
106
|
-
|
|
127
|
+
const w = t.value.find((P) => P.id === d);
|
|
128
|
+
w && !w.content && (w.content = "Sorry, I couldn't process that. Please try again.");
|
|
107
129
|
} finally {
|
|
108
|
-
|
|
130
|
+
b.value = !1;
|
|
109
131
|
}
|
|
110
132
|
}
|
|
111
|
-
function
|
|
112
|
-
|
|
133
|
+
function z(S, c) {
|
|
134
|
+
l.value[S] = c, o("helpful", c);
|
|
113
135
|
}
|
|
114
|
-
function
|
|
136
|
+
function M() {
|
|
115
137
|
o("escalated");
|
|
116
138
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
139
|
+
async function R(S) {
|
|
140
|
+
if (!g.value)
|
|
141
|
+
return;
|
|
142
|
+
if (!S) {
|
|
143
|
+
g.value = null, x.value = "No problem! Let me know if you need anything else.";
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const c = g.value;
|
|
147
|
+
g.value = null;
|
|
148
|
+
const n = await m.perform(c);
|
|
149
|
+
x.value = n.message, setTimeout(() => {
|
|
150
|
+
x.value = null;
|
|
151
|
+
}, 3e3);
|
|
152
|
+
}
|
|
153
|
+
return J(() => a.botSessionId, () => {
|
|
154
|
+
l.value = {}, t.value = [], i.value = "", y.value = !1, g.value = null, x.value = null;
|
|
155
|
+
}), (S, c) => (r(), f("div", ne, [
|
|
156
|
+
e("div", ae, [
|
|
157
|
+
c[4] || (c[4] = e("div", { style: { display: "grid", gap: "2px" } }, [
|
|
158
|
+
e("strong", { style: { fontSize: "14px", color: "#fff" } }, "Pulse Bot"),
|
|
159
|
+
e("span", { style: { fontSize: "11px", color: "#94a3b8" } }, "Powered by FeedPulse AI")
|
|
124
160
|
], -1)),
|
|
125
|
-
|
|
161
|
+
e("button", {
|
|
126
162
|
style: {
|
|
127
163
|
border: "none",
|
|
128
164
|
background: "transparent",
|
|
@@ -131,72 +167,86 @@ const ee = { style: {
|
|
|
131
167
|
fontSize: "18px",
|
|
132
168
|
lineHeight: "1"
|
|
133
169
|
},
|
|
134
|
-
onClick:
|
|
170
|
+
onClick: c[0] || (c[0] = (n) => o("close"))
|
|
135
171
|
}, " × ")
|
|
136
172
|
]),
|
|
137
|
-
|
|
138
|
-
(
|
|
139
|
-
key:
|
|
140
|
-
style:
|
|
173
|
+
e("div", ie, [
|
|
174
|
+
(r(!0), f(D, null, O(t.value, (n) => (r(), f("div", {
|
|
175
|
+
key: n.id,
|
|
176
|
+
style: $({
|
|
141
177
|
display: "grid",
|
|
142
|
-
justifyItems:
|
|
178
|
+
justifyItems: n.role === "user" ? "end" : "start",
|
|
143
179
|
gap: "6px"
|
|
144
180
|
})
|
|
145
181
|
}, [
|
|
146
|
-
|
|
147
|
-
style:
|
|
182
|
+
e("div", {
|
|
183
|
+
style: $({
|
|
148
184
|
maxWidth: "85%",
|
|
149
185
|
padding: "9px 11px",
|
|
150
|
-
borderRadius:
|
|
151
|
-
background:
|
|
186
|
+
borderRadius: n.role === "user" ? "14px 14px 2px 14px" : "14px 14px 14px 2px",
|
|
187
|
+
background: n.role === "user" ? "#4f46e5" : "#1f2937",
|
|
152
188
|
color: "#fff",
|
|
153
189
|
fontSize: "13px",
|
|
154
190
|
lineHeight: "1.4",
|
|
155
191
|
whiteSpace: "pre-wrap"
|
|
156
192
|
})
|
|
157
|
-
},
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
style:
|
|
193
|
+
}, T(n.content), 5),
|
|
194
|
+
n.role === "assistant" ? (r(), f("div", se, [
|
|
195
|
+
e("button", {
|
|
196
|
+
style: $({
|
|
161
197
|
border: "1px solid #334155",
|
|
162
|
-
background:
|
|
198
|
+
background: l.value[n.id] === !0 ? "#16a34a" : "#0f172a",
|
|
163
199
|
color: "#e2e8f0",
|
|
164
200
|
borderRadius: "8px",
|
|
165
201
|
fontSize: "12px",
|
|
166
202
|
padding: "4px 8px",
|
|
167
203
|
cursor: "pointer"
|
|
168
204
|
}),
|
|
169
|
-
onClick: (
|
|
170
|
-
}, " 👍 ", 12,
|
|
171
|
-
|
|
172
|
-
style:
|
|
205
|
+
onClick: (d) => z(n.id, !0)
|
|
206
|
+
}, " 👍 ", 12, le),
|
|
207
|
+
e("button", {
|
|
208
|
+
style: $({
|
|
173
209
|
border: "1px solid #334155",
|
|
174
|
-
background:
|
|
210
|
+
background: l.value[n.id] === !1 ? "#dc2626" : "#0f172a",
|
|
175
211
|
color: "#e2e8f0",
|
|
176
212
|
borderRadius: "8px",
|
|
177
213
|
fontSize: "12px",
|
|
178
214
|
padding: "4px 8px",
|
|
179
215
|
cursor: "pointer"
|
|
180
216
|
}),
|
|
181
|
-
onClick: (
|
|
182
|
-
}, " 👎 ", 12,
|
|
183
|
-
])) :
|
|
217
|
+
onClick: (d) => z(n.id, !1)
|
|
218
|
+
}, " 👎 ", 12, re)
|
|
219
|
+
])) : h("", !0)
|
|
184
220
|
], 4))), 128)),
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
])])) :
|
|
190
|
-
|
|
221
|
+
b.value ? (r(), f("div", de, [...c[5] || (c[5] = [
|
|
222
|
+
e("span", { style: { width: "8px", height: "8px", borderRadius: "999px", background: "#94a3b8", animation: "fp-dot 1s infinite 0ms" } }, null, -1),
|
|
223
|
+
e("span", { style: { width: "8px", height: "8px", borderRadius: "999px", background: "#94a3b8", animation: "fp-dot 1s infinite 160ms" } }, null, -1),
|
|
224
|
+
e("span", { style: { width: "8px", height: "8px", borderRadius: "999px", background: "#94a3b8", animation: "fp-dot 1s infinite 320ms" } }, null, -1)
|
|
225
|
+
])])) : h("", !0),
|
|
226
|
+
p.unavailable || y.value ? (r(), f("div", ue, " Service temporarily unavailable. ")) : h("", !0),
|
|
227
|
+
g.value ? (r(), f("div", pe, [
|
|
228
|
+
e("p", ce, " Want me to " + T(g.value.type) + ' "' + T(g.value.label) + '"? ', 1),
|
|
229
|
+
e("div", fe, [
|
|
230
|
+
e("button", {
|
|
231
|
+
style: { padding: "6px 16px", background: "#6366f1", color: "#fff", border: "none", borderRadius: "6px", cursor: "pointer", fontSize: "12px" },
|
|
232
|
+
onClick: c[1] || (c[1] = (n) => R(!0))
|
|
233
|
+
}, " ✓ Yes, do it "),
|
|
234
|
+
e("button", {
|
|
235
|
+
style: { padding: "6px 16px", background: "transparent", border: "1px solid #c7d2fe", borderRadius: "6px", cursor: "pointer", fontSize: "12px", color: "#111827" },
|
|
236
|
+
onClick: c[2] || (c[2] = (n) => R(!1))
|
|
237
|
+
}, " No thanks ")
|
|
238
|
+
])
|
|
239
|
+
])) : h("", !0),
|
|
240
|
+
x.value ? (r(), f("div", xe, T(x.value), 1)) : h("", !0)
|
|
191
241
|
]),
|
|
192
|
-
|
|
242
|
+
e("form", {
|
|
193
243
|
style: { padding: "10px", borderTop: "1px solid #374151", display: "grid", gap: "8px" },
|
|
194
|
-
onSubmit:
|
|
244
|
+
onSubmit: v
|
|
195
245
|
}, [
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
"onUpdate:modelValue":
|
|
199
|
-
disabled:
|
|
246
|
+
e("div", ge, [
|
|
247
|
+
B(e("input", {
|
|
248
|
+
"onUpdate:modelValue": c[3] || (c[3] = (n) => i.value = n),
|
|
249
|
+
disabled: b.value || p.unavailable,
|
|
200
250
|
style: {
|
|
201
251
|
flex: 1,
|
|
202
252
|
borderRadius: "10px",
|
|
@@ -208,66 +258,75 @@ const ee = { style: {
|
|
|
208
258
|
outline: "none"
|
|
209
259
|
},
|
|
210
260
|
placeholder: "Ask a question..."
|
|
211
|
-
}, null, 8,
|
|
212
|
-
[
|
|
261
|
+
}, null, 8, ve), [
|
|
262
|
+
[H, i.value]
|
|
213
263
|
]),
|
|
214
|
-
|
|
264
|
+
e("button", {
|
|
215
265
|
type: "submit",
|
|
216
|
-
disabled: !
|
|
217
|
-
style:
|
|
266
|
+
disabled: !k.value,
|
|
267
|
+
style: $({
|
|
218
268
|
border: "none",
|
|
219
269
|
borderRadius: "10px",
|
|
220
|
-
background:
|
|
270
|
+
background: k.value ? "#6366f1" : "#334155",
|
|
221
271
|
color: "#fff",
|
|
222
272
|
fontWeight: "600",
|
|
223
273
|
fontSize: "12px",
|
|
224
274
|
padding: "0 14px",
|
|
225
|
-
cursor:
|
|
275
|
+
cursor: k.value ? "pointer" : "not-allowed"
|
|
226
276
|
})
|
|
227
|
-
}, " Send ", 12,
|
|
277
|
+
}, " Send ", 12, be)
|
|
228
278
|
]),
|
|
229
|
-
|
|
279
|
+
p.config.escalateTo ? (r(), f("a", {
|
|
230
280
|
key: 0,
|
|
231
|
-
href:
|
|
281
|
+
href: p.config.escalateTo.url,
|
|
232
282
|
style: { color: "#c4b5fd", fontSize: "12px", textDecoration: "none" },
|
|
233
|
-
onClick:
|
|
234
|
-
},
|
|
283
|
+
onClick: M
|
|
284
|
+
}, T(p.config.escalateTo.label), 9, ye)) : h("", !0)
|
|
235
285
|
], 32)
|
|
236
286
|
]));
|
|
237
287
|
}
|
|
238
|
-
}),
|
|
288
|
+
}), Be = /* @__PURE__ */ E({
|
|
239
289
|
__name: "FeedPulseBot",
|
|
240
290
|
props: {
|
|
241
291
|
faq: {},
|
|
242
292
|
pageContext: {},
|
|
243
293
|
systemPrompt: {},
|
|
244
294
|
canNavigate: { type: Boolean },
|
|
295
|
+
navigableElements: {},
|
|
245
296
|
canHelpForms: { type: Boolean },
|
|
297
|
+
formGuide: {},
|
|
298
|
+
features: {},
|
|
246
299
|
escalateTo: {},
|
|
247
300
|
initialMessage: { default: "👋 Need help?" },
|
|
248
|
-
position: { default: "bottom-right" }
|
|
301
|
+
position: { default: "bottom-right" },
|
|
302
|
+
config: {},
|
|
303
|
+
configId: {}
|
|
249
304
|
},
|
|
250
|
-
setup(
|
|
251
|
-
const
|
|
252
|
-
let
|
|
253
|
-
const
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
canNavigate:
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
305
|
+
setup(p) {
|
|
306
|
+
const s = p, a = new L(), o = u(!1), l = u(!1), t = u(!1), i = u(!1), b = u(""), y = u(""), g = u(null), x = u(!1);
|
|
307
|
+
let m = null, k = null;
|
|
308
|
+
const C = F(() => s.config ?? {
|
|
309
|
+
pageContext: s.pageContext,
|
|
310
|
+
systemPrompt: s.systemPrompt,
|
|
311
|
+
faq: s.faq,
|
|
312
|
+
canNavigate: s.canNavigate,
|
|
313
|
+
navigableElements: s.navigableElements,
|
|
314
|
+
canHelpForms: s.canHelpForms,
|
|
315
|
+
formGuide: s.formGuide,
|
|
316
|
+
features: s.features,
|
|
317
|
+
escalateTo: s.escalateTo,
|
|
318
|
+
initialMessage: s.initialMessage
|
|
319
|
+
}), v = F(() => ({
|
|
261
320
|
position: "fixed",
|
|
262
321
|
bottom: "24px",
|
|
263
322
|
zIndex: "10000",
|
|
264
|
-
...
|
|
323
|
+
...s.position === "bottom-left" ? { left: "24px" } : { right: "24px" }
|
|
265
324
|
}));
|
|
266
|
-
function
|
|
325
|
+
function z() {
|
|
267
326
|
if (typeof document > "u" || document.getElementById("fp-bot-animations"))
|
|
268
327
|
return;
|
|
269
|
-
const
|
|
270
|
-
|
|
328
|
+
const n = document.createElement("style");
|
|
329
|
+
n.id = "fp-bot-animations", n.textContent = `
|
|
271
330
|
@keyframes fp-bubble-in {
|
|
272
331
|
0% { opacity: 0; transform: scale(0.8) translateY(6px); }
|
|
273
332
|
100% { opacity: 1; transform: scale(1) translateY(0); }
|
|
@@ -286,73 +345,73 @@ const ee = { style: {
|
|
|
286
345
|
50% { opacity: 1; transform: translateY(-3px); }
|
|
287
346
|
100% { opacity: 0.2; transform: translateY(0); }
|
|
288
347
|
}
|
|
289
|
-
`, document.head.appendChild(
|
|
348
|
+
`, document.head.appendChild(n);
|
|
290
349
|
}
|
|
291
|
-
async function
|
|
292
|
-
const
|
|
350
|
+
async function M(n, d) {
|
|
351
|
+
const w = a.getAllData(!0);
|
|
293
352
|
try {
|
|
294
|
-
const
|
|
353
|
+
const P = await fetch("/api/bot/session-proxy", {
|
|
295
354
|
method: "POST",
|
|
296
355
|
headers: { "content-type": "application/json" },
|
|
297
356
|
body: JSON.stringify({
|
|
298
357
|
page: window.location.pathname,
|
|
299
|
-
triggerScore:
|
|
300
|
-
triggerReasons:
|
|
301
|
-
sessionId:
|
|
302
|
-
visitorId:
|
|
358
|
+
triggerScore: n,
|
|
359
|
+
triggerReasons: d,
|
|
360
|
+
sessionId: w.sessionId,
|
|
361
|
+
visitorId: w.userId,
|
|
303
362
|
device: navigator.userAgent
|
|
304
363
|
})
|
|
305
364
|
});
|
|
306
|
-
if (!
|
|
307
|
-
|
|
365
|
+
if (!P.ok) {
|
|
366
|
+
P.status === 402 && (i.value = !0);
|
|
308
367
|
return;
|
|
309
368
|
}
|
|
310
|
-
const
|
|
311
|
-
|
|
369
|
+
const I = await P.json().catch(() => null);
|
|
370
|
+
I?.botSessionId && (y.value = I.botSessionId);
|
|
312
371
|
} catch {
|
|
313
372
|
}
|
|
314
373
|
}
|
|
315
|
-
function
|
|
316
|
-
|
|
374
|
+
function R(n, d) {
|
|
375
|
+
l.value = !0, o.value = !0, i.value = !1, g.value = null, x.value = !1, M(n, d), k && clearTimeout(k), k = setTimeout(() => {
|
|
317
376
|
o.value = !1;
|
|
318
377
|
}, 8e3);
|
|
319
378
|
}
|
|
320
379
|
function S() {
|
|
321
|
-
|
|
380
|
+
t.value = !0, o.value = !1;
|
|
322
381
|
}
|
|
323
|
-
async function
|
|
324
|
-
if (
|
|
382
|
+
async function c() {
|
|
383
|
+
if (t.value = !1, !!y.value)
|
|
325
384
|
try {
|
|
326
385
|
await fetch("/api/bot/session-end-proxy", {
|
|
327
386
|
method: "POST",
|
|
328
387
|
headers: { "content-type": "application/json" },
|
|
329
388
|
body: JSON.stringify({
|
|
330
|
-
botSessionId:
|
|
389
|
+
botSessionId: y.value,
|
|
331
390
|
wasHelpful: g.value,
|
|
332
|
-
escalated:
|
|
391
|
+
escalated: x.value
|
|
333
392
|
})
|
|
334
393
|
});
|
|
335
394
|
} catch {
|
|
336
395
|
}
|
|
337
396
|
}
|
|
338
|
-
return
|
|
339
|
-
|
|
340
|
-
onTrigger: (
|
|
341
|
-
|
|
397
|
+
return N(() => {
|
|
398
|
+
z(), b.value = window.location.pathname, m = new te({
|
|
399
|
+
onTrigger: (n, d) => {
|
|
400
|
+
R(n, d);
|
|
342
401
|
}
|
|
343
|
-
}),
|
|
344
|
-
}),
|
|
345
|
-
|
|
346
|
-
}), (
|
|
347
|
-
style:
|
|
402
|
+
}), m.start();
|
|
403
|
+
}), Y(() => {
|
|
404
|
+
m?.stop(), k && clearTimeout(k);
|
|
405
|
+
}), (n, d) => (r(), f("div", {
|
|
406
|
+
style: $(v.value)
|
|
348
407
|
}, [
|
|
349
|
-
o.value && !
|
|
408
|
+
o.value && !t.value ? (r(), f("div", {
|
|
350
409
|
key: 0,
|
|
351
|
-
style:
|
|
410
|
+
style: $({
|
|
352
411
|
position: "absolute",
|
|
353
412
|
bottom: "62px",
|
|
354
|
-
right:
|
|
355
|
-
left:
|
|
413
|
+
right: p.position === "bottom-right" ? "0" : "auto",
|
|
414
|
+
left: p.position === "bottom-left" ? "0" : "auto",
|
|
356
415
|
background: "#fff",
|
|
357
416
|
border: "2px solid #6366f1",
|
|
358
417
|
color: "#1f2937",
|
|
@@ -364,8 +423,8 @@ const ee = { style: {
|
|
|
364
423
|
animation: "fp-bubble-in 300ms ease-out"
|
|
365
424
|
})
|
|
366
425
|
}, [
|
|
367
|
-
|
|
368
|
-
|
|
426
|
+
A(T(C.value.initialMessage || p.initialMessage) + " ", 1),
|
|
427
|
+
d[2] || (d[2] = e("span", { style: {
|
|
369
428
|
position: "absolute",
|
|
370
429
|
right: "10px",
|
|
371
430
|
bottom: "-12px",
|
|
@@ -374,7 +433,7 @@ const ee = { style: {
|
|
|
374
433
|
borderLeft: "10px solid transparent",
|
|
375
434
|
borderTop: "12px solid #6366f1"
|
|
376
435
|
} }, null, -1)),
|
|
377
|
-
|
|
436
|
+
d[3] || (d[3] = e("span", { style: {
|
|
378
437
|
position: "absolute",
|
|
379
438
|
right: "11px",
|
|
380
439
|
bottom: "-9px",
|
|
@@ -383,8 +442,8 @@ const ee = { style: {
|
|
|
383
442
|
borderLeft: "9px solid transparent",
|
|
384
443
|
borderTop: "11px solid #fff"
|
|
385
444
|
} }, null, -1))
|
|
386
|
-
], 4)) :
|
|
387
|
-
|
|
445
|
+
], 4)) : h("", !0),
|
|
446
|
+
l.value && !t.value ? (r(), f("button", {
|
|
388
447
|
key: 1,
|
|
389
448
|
style: {
|
|
390
449
|
width: "48px",
|
|
@@ -399,212 +458,214 @@ const ee = { style: {
|
|
|
399
458
|
animation: "fp-bounce 600ms ease-out"
|
|
400
459
|
},
|
|
401
460
|
onClick: S
|
|
402
|
-
}, [...
|
|
403
|
-
|
|
404
|
-
])])) :
|
|
405
|
-
|
|
461
|
+
}, [...d[4] || (d[4] = [
|
|
462
|
+
G('<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2"><rect x="3" y="8" width="18" height="13" rx="2"></rect><path d="M12 8V5"></path><circle cx="12" cy="4" r="1"></circle><circle cx="8" cy="13" r="1.5" fill="white" stroke="none"></circle><circle cx="16" cy="13" r="1.5" fill="white" stroke="none"></circle><path d="M9 17h6" stroke-linecap="round"></path></svg>', 1)
|
|
463
|
+
])])) : h("", !0),
|
|
464
|
+
t.value && y.value ? (r(), j(me, {
|
|
406
465
|
key: 2,
|
|
407
|
-
"bot-session-id":
|
|
408
|
-
config:
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
466
|
+
"bot-session-id": y.value,
|
|
467
|
+
config: C.value,
|
|
468
|
+
"config-id": p.configId,
|
|
469
|
+
page: b.value,
|
|
470
|
+
unavailable: i.value,
|
|
471
|
+
onClose: c,
|
|
472
|
+
onHelpful: d[0] || (d[0] = (w) => g.value = w),
|
|
473
|
+
onEscalated: d[1] || (d[1] = (w) => x.value = !0)
|
|
474
|
+
}, null, 8, ["bot-session-id", "config", "config-id", "page", "unavailable"])) : h("", !0)
|
|
414
475
|
], 4));
|
|
415
476
|
}
|
|
416
|
-
}),
|
|
477
|
+
}), ke = {
|
|
417
478
|
key: 0,
|
|
418
479
|
style: { position: "fixed", bottom: "0", left: "0", right: "0", "z-index": "99999", background: "#1a1a1a", color: "#fff", padding: "20px 24px", "border-top": "1px solid #333", "font-family": "sans-serif" }
|
|
419
|
-
},
|
|
480
|
+
}, he = { style: { "max-width": "900px", margin: "0 auto" } }, we = {
|
|
420
481
|
key: 0,
|
|
421
482
|
style: { "margin-bottom": "12px", "font-size": "13px" }
|
|
422
|
-
},
|
|
483
|
+
}, Se = { style: { display: "flex", "align-items": "center", gap: "8px", "margin-bottom": "6px" } }, Ce = { style: { display: "flex", "align-items": "center", gap: "8px" } }, ze = { style: { display: "flex", gap: "8px", "flex-wrap": "wrap", "align-items": "center" } }, Pe = /* @__PURE__ */ E({
|
|
423
484
|
__name: "consent-banner",
|
|
424
485
|
emits: ["consent"],
|
|
425
|
-
setup(
|
|
426
|
-
const
|
|
427
|
-
function
|
|
428
|
-
|
|
486
|
+
setup(p, { emit: s }) {
|
|
487
|
+
const a = s, o = new L(), l = u(!1), t = u(!1), i = u(!1), b = u(!1);
|
|
488
|
+
function y() {
|
|
489
|
+
l.value = !0, t.value = !0;
|
|
429
490
|
}
|
|
430
|
-
|
|
491
|
+
N(() => {
|
|
431
492
|
const C = o.getConsent();
|
|
432
|
-
|
|
493
|
+
l.value = !C || o.isConsentExpired(), C && (i.value = C.analytics, b.value = C.marketing), typeof window < "u" && (window.addEventListener("feedpulse:open-consent", y), window.addEventListener("feedpulse:withdraw-consent", k));
|
|
433
494
|
});
|
|
434
|
-
function
|
|
435
|
-
o.setConsent({ analytics: !0, marketing: !0, version: "1.0" }),
|
|
495
|
+
function g() {
|
|
496
|
+
o.setConsent({ analytics: !0, marketing: !0, version: "1.0" }), a("consent", { analytics: !0, marketing: !0, action: "accept_all" }), l.value = !1;
|
|
436
497
|
}
|
|
437
|
-
function
|
|
438
|
-
o.setConsent({ analytics: !1, marketing: !1, version: "1.0" }), o.clearAnalyticsCookies(),
|
|
498
|
+
function x() {
|
|
499
|
+
o.setConsent({ analytics: !1, marketing: !1, version: "1.0" }), o.clearAnalyticsCookies(), a("consent", { analytics: !1, marketing: !1, action: "reject_all" }), l.value = !1;
|
|
439
500
|
}
|
|
440
|
-
function
|
|
441
|
-
o.setConsent({ analytics:
|
|
501
|
+
function m() {
|
|
502
|
+
o.setConsent({ analytics: i.value, marketing: b.value, version: "1.0" }), i.value || o.clearAnalyticsCookies(), a("consent", { analytics: i.value, marketing: b.value, action: "custom" }), l.value = !1;
|
|
442
503
|
}
|
|
443
|
-
function
|
|
444
|
-
o.setConsent({ analytics: !1, marketing: !1, version: "1.0" }), o.clearAnalyticsCookies(),
|
|
504
|
+
function k() {
|
|
505
|
+
o.setConsent({ analytics: !1, marketing: !1, version: "1.0" }), o.clearAnalyticsCookies(), i.value = !1, b.value = !1, a("consent", { analytics: !1, marketing: !1, action: "withdraw" }), l.value = !0;
|
|
445
506
|
}
|
|
446
|
-
return
|
|
447
|
-
typeof window < "u" && (window.removeEventListener("feedpulse:open-consent",
|
|
448
|
-
}), (C,
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
507
|
+
return Y(() => {
|
|
508
|
+
typeof window < "u" && (window.removeEventListener("feedpulse:open-consent", y), window.removeEventListener("feedpulse:withdraw-consent", k));
|
|
509
|
+
}), (C, v) => (r(), j(K, { to: "body" }, [
|
|
510
|
+
l.value ? (r(), f("div", ke, [
|
|
511
|
+
e("div", he, [
|
|
512
|
+
v[6] || (v[6] = e("p", { style: { margin: "0 0 12px", "font-size": "14px", "line-height": "1.5" } }, [
|
|
513
|
+
A(" We use cookies to improve reliability and understand usage. "),
|
|
514
|
+
e("a", {
|
|
454
515
|
href: "/privacy",
|
|
455
516
|
style: { color: "#818cf8" }
|
|
456
517
|
}, "Privacy Policy")
|
|
457
518
|
], -1)),
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
519
|
+
t.value ? (r(), f("div", we, [
|
|
520
|
+
v[5] || (v[5] = e("label", { style: { display: "flex", "align-items": "center", gap: "8px", "margin-bottom": "6px", opacity: "0.75" } }, [
|
|
521
|
+
e("input", {
|
|
461
522
|
type: "checkbox",
|
|
462
523
|
checked: "",
|
|
463
524
|
disabled: ""
|
|
464
525
|
}),
|
|
465
|
-
|
|
526
|
+
A(" Necessary (always on) ")
|
|
466
527
|
], -1)),
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
"onUpdate:modelValue":
|
|
528
|
+
e("label", Se, [
|
|
529
|
+
B(e("input", {
|
|
530
|
+
"onUpdate:modelValue": v[0] || (v[0] = (z) => i.value = z),
|
|
470
531
|
type: "checkbox"
|
|
471
532
|
}, null, 512), [
|
|
472
|
-
[
|
|
533
|
+
[q, i.value]
|
|
473
534
|
]),
|
|
474
|
-
|
|
535
|
+
v[3] || (v[3] = A(" Analytics ", -1))
|
|
475
536
|
]),
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
"onUpdate:modelValue":
|
|
537
|
+
e("label", Ce, [
|
|
538
|
+
B(e("input", {
|
|
539
|
+
"onUpdate:modelValue": v[1] || (v[1] = (z) => b.value = z),
|
|
479
540
|
type: "checkbox"
|
|
480
541
|
}, null, 512), [
|
|
481
|
-
[
|
|
542
|
+
[q, b.value]
|
|
482
543
|
]),
|
|
483
|
-
|
|
544
|
+
v[4] || (v[4] = A(" Marketing ", -1))
|
|
484
545
|
])
|
|
485
|
-
])) :
|
|
486
|
-
|
|
487
|
-
|
|
546
|
+
])) : h("", !0),
|
|
547
|
+
e("div", ze, [
|
|
548
|
+
e("button", {
|
|
488
549
|
style: { width: "130px", padding: "9px 12px", background: "#4f46e5", color: "#fff", border: "1px solid #4f46e5", "border-radius": "6px", "font-size": "13px", "font-weight": "600", cursor: "pointer" },
|
|
489
|
-
onClick:
|
|
550
|
+
onClick: g
|
|
490
551
|
}, " Accept All "),
|
|
491
|
-
|
|
552
|
+
e("button", {
|
|
492
553
|
style: { width: "130px", padding: "9px 12px", background: "transparent", color: "#fff", border: "1px solid #555", "border-radius": "6px", "font-size": "13px", "font-weight": "600", cursor: "pointer" },
|
|
493
|
-
onClick:
|
|
554
|
+
onClick: x
|
|
494
555
|
}, " Reject All "),
|
|
495
|
-
|
|
556
|
+
e("button", {
|
|
496
557
|
style: { padding: "9px 16px", background: "transparent", color: "#aaa", border: "1px solid #333", "border-radius": "6px", "font-size": "13px", cursor: "pointer" },
|
|
497
|
-
onClick:
|
|
498
|
-
},
|
|
558
|
+
onClick: v[2] || (v[2] = (z) => t.value ? m() : t.value = !0)
|
|
559
|
+
}, T(t.value ? "Save Preferences" : "Customize"), 1)
|
|
499
560
|
])
|
|
500
561
|
])
|
|
501
|
-
])) :
|
|
562
|
+
])) : h("", !0)
|
|
502
563
|
]));
|
|
503
564
|
}
|
|
504
|
-
}),
|
|
565
|
+
}), Me = /* @__PURE__ */ E({
|
|
505
566
|
__name: "FeedPulseProvider",
|
|
506
567
|
props: {
|
|
507
568
|
proxyEndpoint: { default: "/api/fp-proxy" },
|
|
508
569
|
debug: { type: Boolean },
|
|
509
570
|
consentRequired: { type: Boolean, default: !0 }
|
|
510
571
|
},
|
|
511
|
-
setup(
|
|
512
|
-
const
|
|
513
|
-
proxyEndpoint:
|
|
514
|
-
debug:
|
|
572
|
+
setup(p) {
|
|
573
|
+
const s = p, a = new L(), o = new ee({
|
|
574
|
+
proxyEndpoint: s.proxyEndpoint,
|
|
575
|
+
debug: s.debug
|
|
515
576
|
});
|
|
516
|
-
|
|
517
|
-
function
|
|
518
|
-
const
|
|
519
|
-
analytics:
|
|
520
|
-
marketing:
|
|
577
|
+
Q(V, o);
|
|
578
|
+
function l(t) {
|
|
579
|
+
const i = a.setConsent({
|
|
580
|
+
analytics: t.analytics,
|
|
581
|
+
marketing: t.marketing,
|
|
521
582
|
version: "1.0"
|
|
522
583
|
});
|
|
523
|
-
|
|
524
|
-
analytics:
|
|
525
|
-
marketing:
|
|
526
|
-
action:
|
|
584
|
+
t.analytics || a.clearAnalyticsCookies(), o.updateCookieData(a.getAllData(t.analytics)), o.track("consent", "__consent__", {
|
|
585
|
+
analytics: t.analytics,
|
|
586
|
+
marketing: t.marketing,
|
|
587
|
+
action: t.action,
|
|
527
588
|
userAgent: navigator.userAgent,
|
|
528
|
-
version:
|
|
589
|
+
version: i.version
|
|
529
590
|
});
|
|
530
591
|
}
|
|
531
|
-
return
|
|
532
|
-
const
|
|
533
|
-
|
|
534
|
-
}),
|
|
535
|
-
|
|
536
|
-
|
|
592
|
+
return N(() => {
|
|
593
|
+
const t = a.getConsent();
|
|
594
|
+
s.consentRequired === !1 ? (a.setConsent({ analytics: !0, marketing: !0, version: "1.0" }), o.updateCookieData(a.getAllData(!0))) : t && !a.isConsentExpired() ? o.updateCookieData(a.getAllData(t.analytics)) : o.updateCookieData(a.getAllData(!1)), o.init();
|
|
595
|
+
}), Y(() => o.destroy()), (t, i) => (r(), f(D, null, [
|
|
596
|
+
X(t.$slots, "default"),
|
|
597
|
+
p.consentRequired !== !1 ? (r(), j(Pe, {
|
|
537
598
|
key: 0,
|
|
538
|
-
onConsent:
|
|
539
|
-
})) :
|
|
599
|
+
onConsent: l
|
|
600
|
+
})) : h("", !0)
|
|
540
601
|
], 64));
|
|
541
602
|
}
|
|
542
|
-
}),
|
|
603
|
+
}), $e = {
|
|
543
604
|
key: 1,
|
|
544
605
|
style: { background: "#fff", border: "1px solid #e5e7eb", "border-radius": "12px", padding: "16px", width: "280px", "box-shadow": "0 10px 25px rgba(0,0,0,0.15)" }
|
|
545
|
-
},
|
|
606
|
+
}, Te = { style: { margin: "0 0 12px", "font-weight": "600", color: "#111" } }, Ie = { style: { display: "flex", gap: "6px", "margin-bottom": "12px" } }, Ae = ["onClick"], Ee = {
|
|
546
607
|
key: 1,
|
|
547
608
|
style: { "text-align": "center", padding: "16px", color: "#111" }
|
|
548
|
-
},
|
|
609
|
+
}, Fe = /* @__PURE__ */ E({
|
|
549
610
|
__name: "FeedPulseWidget",
|
|
550
611
|
props: {
|
|
551
612
|
id: {},
|
|
552
613
|
placeholder: {},
|
|
553
614
|
position: { default: "bottom-right" }
|
|
554
615
|
},
|
|
555
|
-
setup(
|
|
556
|
-
const
|
|
557
|
-
function
|
|
558
|
-
|
|
616
|
+
setup(p) {
|
|
617
|
+
const s = p, a = oe(), o = u(s.position === "inline"), l = u(null), t = u(""), i = u(!1);
|
|
618
|
+
function b(g) {
|
|
619
|
+
l.value = g;
|
|
559
620
|
}
|
|
560
|
-
function
|
|
561
|
-
!
|
|
562
|
-
o.value =
|
|
621
|
+
function y() {
|
|
622
|
+
!l.value && !t.value.trim() || (a?.trackFeedback(s.id ?? null, l.value, t.value || null), i.value = !0, setTimeout(() => {
|
|
623
|
+
o.value = s.position === "inline", i.value = !1, l.value = null, t.value = "";
|
|
563
624
|
}, 2e3));
|
|
564
625
|
}
|
|
565
|
-
return (
|
|
626
|
+
return (g, x) => (r(), f("div", {
|
|
566
627
|
class: "feedpulse-widget",
|
|
567
|
-
style:
|
|
628
|
+
style: $(p.position !== "inline" ? `position:fixed; ${p.position === "bottom-right" ? "right:24px" : "left:24px"}; bottom:24px; z-index:9999;` : "")
|
|
568
629
|
}, [
|
|
569
|
-
|
|
630
|
+
p.position !== "inline" ? (r(), f("button", {
|
|
570
631
|
key: 0,
|
|
571
632
|
style: { background: "#6366f1", color: "#fff", border: "none", "border-radius": "50%", width: "48px", height: "48px", "font-size": "20px", cursor: "pointer" },
|
|
572
|
-
onClick:
|
|
573
|
-
}, " 💬 ")) :
|
|
574
|
-
o.value ? (
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
])])) : (
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
(
|
|
582
|
-
key:
|
|
583
|
-
style:
|
|
584
|
-
onClick: (
|
|
585
|
-
}, " ⭐ ", 12,
|
|
633
|
+
onClick: x[0] || (x[0] = (m) => o.value = !o.value)
|
|
634
|
+
}, " 💬 ")) : h("", !0),
|
|
635
|
+
o.value ? (r(), f("div", $e, [
|
|
636
|
+
i.value ? (r(), f("div", Ee, [...x[2] || (x[2] = [
|
|
637
|
+
e("p", { style: { "font-size": "28px", margin: "0" } }, " 🎉 ", -1),
|
|
638
|
+
e("p", { style: { margin: "8px 0 0", "font-weight": "600" } }, " Thanks for your feedback! ", -1)
|
|
639
|
+
])])) : (r(), f(D, { key: 0 }, [
|
|
640
|
+
e("p", Te, T(p.placeholder ?? "How was your experience?"), 1),
|
|
641
|
+
e("div", Ie, [
|
|
642
|
+
(r(), f(D, null, O(5, (m) => e("button", {
|
|
643
|
+
key: m,
|
|
644
|
+
style: $({ background: "none", border: "none", cursor: "pointer", fontSize: "24px", opacity: l.value !== null && m <= l.value ? 1 : 0.3 }),
|
|
645
|
+
onClick: (k) => b(m)
|
|
646
|
+
}, " ⭐ ", 12, Ae)), 64))
|
|
586
647
|
]),
|
|
587
|
-
|
|
588
|
-
"onUpdate:modelValue":
|
|
648
|
+
B(e("textarea", {
|
|
649
|
+
"onUpdate:modelValue": x[1] || (x[1] = (m) => t.value = m),
|
|
589
650
|
placeholder: "Tell us more (optional)...",
|
|
590
651
|
rows: "3",
|
|
591
652
|
style: { width: "100%", padding: "8px", border: "1px solid #d1d5db", "border-radius": "8px", resize: "none", "font-size": "14px" }
|
|
592
653
|
}, null, 512), [
|
|
593
|
-
[
|
|
654
|
+
[H, t.value]
|
|
594
655
|
]),
|
|
595
|
-
|
|
656
|
+
e("button", {
|
|
596
657
|
style: { "margin-top": "10px", width: "100%", background: "#6366f1", color: "#fff", border: "none", "border-radius": "8px", padding: "10px", "font-weight": "600", cursor: "pointer" },
|
|
597
|
-
onClick:
|
|
658
|
+
onClick: y
|
|
598
659
|
}, " Submit Feedback ")
|
|
599
660
|
], 64))
|
|
600
|
-
])) :
|
|
661
|
+
])) : h("", !0)
|
|
601
662
|
], 4));
|
|
602
663
|
}
|
|
603
664
|
});
|
|
604
665
|
export {
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
666
|
+
Pe as ConsentBanner,
|
|
667
|
+
Be as FeedPulseBot,
|
|
668
|
+
Me as FeedPulseProvider,
|
|
669
|
+
Fe as FeedPulseWidget,
|
|
670
|
+
oe as useFeedPulse
|
|
610
671
|
};
|