@opencx/widget-core 5.0.0-beta.6 → 5.0.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +8 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1149 -977
- package/dist/index.js.map +1 -1
- package/dist/src/api/api-caller.d.ts +67 -0
- package/dist/src/api/api-caller.d.ts.map +1 -1
- package/dist/src/api/elicitation.d.ts +60 -0
- package/dist/src/api/elicitation.d.ts.map +1 -0
- package/dist/src/api/schema.d.ts +517 -56
- package/dist/src/api/schema.d.ts.map +1 -1
- package/dist/src/context/active-session-polling.ctx.d.ts +2 -0
- package/dist/src/context/active-session-polling.ctx.d.ts.map +1 -1
- package/dist/src/context/message.ctx.d.ts +4 -0
- package/dist/src/context/message.ctx.d.ts.map +1 -1
- package/dist/src/context/session.ctx.d.ts +5 -0
- package/dist/src/context/session.ctx.d.ts.map +1 -1
- package/dist/src/context/widget.ctx.d.ts +6 -1
- package/dist/src/context/widget.ctx.d.ts.map +1 -1
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/types/messages.d.ts +2 -0
- package/dist/src/types/messages.d.ts.map +1 -1
- package/dist/src/types/widget-config.d.ts +2 -0
- package/dist/src/types/widget-config.d.ts.map +1 -1
- package/package.json +3 -2
- package/dist/src/__tests__/api/agent-stream-parts.spec.d.ts +0 -2
- package/dist/src/__tests__/api/agent-stream-parts.spec.d.ts.map +0 -1
- package/dist/src/__tests__/api/dictation-mint-cache.spec.d.ts +0 -2
- package/dist/src/__tests__/api/dictation-mint-cache.spec.d.ts.map +0 -1
- package/dist/src/__tests__/api/widget-api-wire.spec.d.ts +0 -2
- package/dist/src/__tests__/api/widget-api-wire.spec.d.ts.map +0 -1
- package/dist/src/__tests__/api-caller.mock.d.ts +0 -2
- package/dist/src/__tests__/api-caller.mock.d.ts.map +0 -1
- package/dist/src/__tests__/context/contact/auth/auto-create-unverified-anonymous.spec.d.ts +0 -1
- package/dist/src/__tests__/context/contact/auth/auto-create-unverified-anonymous.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/contact/auth/auto-create-unverified-with-user-data-provided-by-org.spec.d.ts +0 -1
- package/dist/src/__tests__/context/contact/auth/auto-create-unverified-with-user-data-provided-by-org.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/contact/auth/manually-create-unverified-with-user-data-provided-by-user.spec.d.ts +0 -1
- package/dist/src/__tests__/context/contact/auth/manually-create-unverified-with-user-data-provided-by-user.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/contact/auth/with-secure-token.spec.d.ts +0 -1
- package/dist/src/__tests__/context/contact/auth/with-secure-token.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/contact/should-collect-data.spec.d.ts +0 -1
- package/dist/src/__tests__/context/contact/should-collect-data.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/contact-ctx.create-failure.spec.d.ts +0 -2
- package/dist/src/__tests__/context/contact-ctx.create-failure.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/dictation-ctx.spec.d.ts +0 -1
- package/dist/src/__tests__/context/dictation-ctx.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/message/merge-send-context.spec.d.ts +0 -2
- package/dist/src/__tests__/context/message/merge-send-context.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/message/on-message-received-hook.spec.d.ts +0 -1
- package/dist/src/__tests__/context/message/on-message-received-hook.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/message/pending-user-messages.spec.d.ts +0 -1
- package/dist/src/__tests__/context/message/pending-user-messages.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/message/sent-text-history.spec.d.ts +0 -1
- package/dist/src/__tests__/context/message/sent-text-history.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/message-ctx.agent-handlers.spec.d.ts +0 -2
- package/dist/src/__tests__/context/message-ctx.agent-handlers.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/message-ctx.client-context.spec.d.ts +0 -2
- package/dist/src/__tests__/context/message-ctx.client-context.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/message-ctx.mentions.spec.d.ts +0 -2
- package/dist/src/__tests__/context/message-ctx.mentions.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/message-ctx.page-mark-chips.spec.d.ts +0 -2
- package/dist/src/__tests__/context/message-ctx.page-mark-chips.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/message-ctx.send-acceptance.spec.d.ts +0 -2
- package/dist/src/__tests__/context/message-ctx.send-acceptance.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/message-ctx.send-features.spec.d.ts +0 -2
- package/dist/src/__tests__/context/message-ctx.send-features.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/reconcile-after-stream.spec.d.ts +0 -1
- package/dist/src/__tests__/context/reconcile-after-stream.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/resolve-client-presentation.spec.d.ts +0 -2
- package/dist/src/__tests__/context/resolve-client-presentation.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/restore-last-session.spec.d.ts +0 -2
- package/dist/src/__tests__/context/restore-last-session.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/session-ctx.stale-token-retry.spec.d.ts +0 -2
- package/dist/src/__tests__/context/session-ctx.stale-token-retry.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/storage-ctx.spec.d.ts +0 -2
- package/dist/src/__tests__/context/storage-ctx.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/streaming-engine.spec.d.ts +0 -1
- package/dist/src/__tests__/context/streaming-engine.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/upload.ctx.spec.d.ts +0 -2
- package/dist/src/__tests__/context/upload.ctx.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/widget-ctx.conversations.spec.d.ts +0 -1
- package/dist/src/__tests__/context/widget-ctx.conversations.spec.d.ts.map +0 -1
- package/dist/src/__tests__/context/widget-ctx.features.spec.d.ts +0 -1
- package/dist/src/__tests__/context/widget-ctx.features.spec.d.ts.map +0 -1
- package/dist/src/__tests__/dictation/dictation-commands.utils.spec.d.ts +0 -2
- package/dist/src/__tests__/dictation/dictation-commands.utils.spec.d.ts.map +0 -1
- package/dist/src/__tests__/test-utils.d.ts +0 -452
- package/dist/src/__tests__/test-utils.d.ts.map +0 -1
- package/dist/src/__tests__/translation.spec.d.ts +0 -2
- package/dist/src/__tests__/translation.spec.d.ts.map +0 -1
- package/dist/src/__tests__/utils/Poller.spec.d.ts +0 -2
- package/dist/src/__tests__/utils/Poller.spec.d.ts.map +0 -1
- package/dist/src/__tests__/utils/PrimitiveState.spec.d.ts +0 -2
- package/dist/src/__tests__/utils/PrimitiveState.spec.d.ts.map +0 -1
- package/dist/src/__tests__/utils/companion-layout.spec.d.ts +0 -2
- package/dist/src/__tests__/utils/companion-layout.spec.d.ts.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,154 +1,287 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
|
|
1
|
+
import { z as h } from "zod";
|
|
2
|
+
import se from "openapi-fetch";
|
|
3
|
+
import oe from "lodash.isequal";
|
|
4
|
+
import { v4 as N } from "uuid";
|
|
5
|
+
const Ga = (n) => n.type === "data-keepalive", $a = (n) => n.type === "data-turn-steered", F = h.object({ const: h.string(), title: h.string().optional() }), ne = h.object({
|
|
6
|
+
type: h.enum(["string", "number", "integer", "boolean", "array"]),
|
|
7
|
+
title: h.string().optional(),
|
|
8
|
+
description: h.string().optional(),
|
|
9
|
+
default: h.union([h.string(), h.number(), h.boolean(), h.array(h.string())]).optional(),
|
|
10
|
+
enum: h.array(h.string()).optional(),
|
|
11
|
+
oneOf: h.array(F).optional(),
|
|
12
|
+
items: h.object({
|
|
13
|
+
enum: h.array(h.string()).optional(),
|
|
14
|
+
anyOf: h.array(F).optional()
|
|
15
|
+
}).optional(),
|
|
16
|
+
minItems: h.number().int().nonnegative().optional(),
|
|
17
|
+
maxItems: h.number().int().nonnegative().optional(),
|
|
18
|
+
minimum: h.number().optional(),
|
|
19
|
+
maximum: h.number().optional(),
|
|
20
|
+
minLength: h.number().optional(),
|
|
21
|
+
maxLength: h.number().optional(),
|
|
22
|
+
format: h.string().optional()
|
|
23
|
+
}), ie = h.array(
|
|
24
|
+
h.object({
|
|
25
|
+
id: h.string(),
|
|
26
|
+
serverId: h.string(),
|
|
27
|
+
serverName: h.string(),
|
|
28
|
+
expiresAt: h.number(),
|
|
29
|
+
approvalKey: h.string().optional(),
|
|
30
|
+
form: h.object({
|
|
31
|
+
message: h.string(),
|
|
32
|
+
requestedSchema: h.object({
|
|
33
|
+
properties: h.record(h.string(), ne),
|
|
34
|
+
required: h.array(h.string()).optional()
|
|
35
|
+
})
|
|
36
|
+
})
|
|
37
|
+
})
|
|
38
|
+
), re = h.array(
|
|
39
|
+
h.object({
|
|
40
|
+
key: h.string(),
|
|
41
|
+
serverId: h.string(),
|
|
42
|
+
serverName: h.string(),
|
|
43
|
+
message: h.string(),
|
|
44
|
+
toolName: h.string()
|
|
45
|
+
})
|
|
46
|
+
), O = "[opencx]", k = {
|
|
5
47
|
warn: (n, ...e) => {
|
|
6
|
-
console.warn(`${
|
|
48
|
+
console.warn(`${O} ${n}`, ...e);
|
|
7
49
|
},
|
|
8
50
|
error: (n, ...e) => {
|
|
9
|
-
console.error(`${
|
|
51
|
+
console.error(`${O} ${n}`, ...e);
|
|
10
52
|
}
|
|
11
|
-
},
|
|
12
|
-
|
|
13
|
-
},
|
|
14
|
-
const e =
|
|
53
|
+
}, _e = (n) => {
|
|
54
|
+
k.error("request failed", n.error);
|
|
55
|
+
}, le = (n) => {
|
|
56
|
+
const e = se({
|
|
15
57
|
baseUrl: n.baseUrl
|
|
16
|
-
}),
|
|
58
|
+
}), t = {
|
|
17
59
|
onRequest: n.onRequest,
|
|
18
60
|
onResponse: n.onResponse,
|
|
19
|
-
onError: n.onError ||
|
|
61
|
+
onError: n.onError || _e
|
|
20
62
|
};
|
|
21
|
-
return e.use(
|
|
22
|
-
}
|
|
23
|
-
class
|
|
63
|
+
return e.use(t), e;
|
|
64
|
+
};
|
|
65
|
+
class ce extends Error {
|
|
66
|
+
constructor() {
|
|
67
|
+
super("This connection request expired. Preparing a new request."), this.name = "ConnectionRequestExpiredError";
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
class pe extends Error {
|
|
71
|
+
constructor() {
|
|
72
|
+
super("This connection attempt is no longer available."), this.name = "ConnectionAttemptUnavailableError";
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const de = "/backend/widget/v5/chat/stream", ue = "/backend/widget/v5/chat/{sessionId}/stream", U = (n, e, t) => `${n.replace(/\/$/, "")}${t ? e.replace("{sessionId}", encodeURIComponent(t)) : e}`;
|
|
76
|
+
class B {
|
|
24
77
|
constructor({ config: e }) {
|
|
25
|
-
var
|
|
26
|
-
this.userToken = null, this.constructClientOptions = (
|
|
27
|
-
const
|
|
78
|
+
var r, l;
|
|
79
|
+
this.userToken = null, this.constructClientOptions = (s) => {
|
|
80
|
+
const a = this.config.apiUrl || "https://api.open.cx", i = {
|
|
28
81
|
"X-Bot-Token": this.config.token,
|
|
29
82
|
"Content-Type": "application/json",
|
|
30
83
|
Accept: "application/json",
|
|
31
|
-
Authorization:
|
|
84
|
+
Authorization: s ? `Bearer ${s}` : void 0
|
|
32
85
|
};
|
|
33
|
-
return { baseUrl:
|
|
86
|
+
return { baseUrl: a, headers: i };
|
|
34
87
|
}, this.createOpenAPIClient = ({
|
|
35
|
-
baseUrl:
|
|
36
|
-
headers:
|
|
37
|
-
}) =>
|
|
38
|
-
baseUrl:
|
|
39
|
-
onRequest: ({ request:
|
|
40
|
-
Object.entries(
|
|
41
|
-
d &&
|
|
88
|
+
baseUrl: s,
|
|
89
|
+
headers: a
|
|
90
|
+
}) => le({
|
|
91
|
+
baseUrl: s,
|
|
92
|
+
onRequest: ({ request: i }) => {
|
|
93
|
+
Object.entries(a).forEach(([c, d]) => {
|
|
94
|
+
d && i.headers.set(c, d);
|
|
42
95
|
});
|
|
43
96
|
}
|
|
44
|
-
}), this.
|
|
45
|
-
this.
|
|
46
|
-
|
|
47
|
-
|
|
97
|
+
}), this.listApprovalPreferences = async () => {
|
|
98
|
+
const { baseUrl: s, headers: a } = this.getStreamAuthContext(), i = await fetch(
|
|
99
|
+
`${s}/backend/widget/v5/connections/approval-preferences`,
|
|
100
|
+
{ headers: a }
|
|
101
|
+
);
|
|
102
|
+
if (!i.ok) throw new Error("Could not load permissions.");
|
|
103
|
+
return re.parse(await i.json());
|
|
104
|
+
}, this.revokeApprovalPreference = async (s, a) => {
|
|
105
|
+
const { baseUrl: i, headers: c } = this.getStreamAuthContext();
|
|
106
|
+
if (!(await fetch(
|
|
107
|
+
`${i}/backend/widget/v5/connections/${encodeURIComponent(s)}/approval-preferences/${encodeURIComponent(a)}`,
|
|
108
|
+
{ method: "DELETE", headers: c }
|
|
109
|
+
)).ok) throw new Error("Could not reset permission.");
|
|
110
|
+
}, this.listElicitations = async (s, a) => {
|
|
111
|
+
const { baseUrl: i, headers: c } = this.getStreamAuthContext(), d = await fetch(
|
|
112
|
+
`${i}/backend/widget/v5/connections/elicitation/${encodeURIComponent(s)}`,
|
|
113
|
+
{ headers: c, signal: a }
|
|
114
|
+
);
|
|
115
|
+
if (!d.ok) throw new Error("Could not load the request.");
|
|
116
|
+
return ie.parse(await d.json());
|
|
117
|
+
}, this.answerElicitation = async (s, a, i) => {
|
|
118
|
+
const { baseUrl: c, headers: d } = this.getStreamAuthContext(), _ = await fetch(
|
|
119
|
+
`${c}/backend/widget/v5/connections/elicitation/${encodeURIComponent(s)}/${encodeURIComponent(a)}`,
|
|
120
|
+
{
|
|
121
|
+
method: "POST",
|
|
122
|
+
headers: { ...d, "Content-Type": "application/json" },
|
|
123
|
+
body: JSON.stringify(i)
|
|
124
|
+
}
|
|
125
|
+
);
|
|
126
|
+
if (!_.ok)
|
|
127
|
+
throw new Error(
|
|
128
|
+
_.status === 400 ? "Check your answers and try again." : "This request has ended. Ask the agent to try again."
|
|
129
|
+
);
|
|
130
|
+
}, this.listConnections = async (s) => {
|
|
131
|
+
const { data: a, error: i } = await this.client.GET(
|
|
132
|
+
"/backend/widget/v5/connections",
|
|
133
|
+
{ signal: s }
|
|
134
|
+
);
|
|
135
|
+
if (i || !a)
|
|
136
|
+
throw new Error("Could not load connections. Sign in and try again.");
|
|
137
|
+
return a;
|
|
138
|
+
}, this.startConnection = async (s, a, i) => {
|
|
139
|
+
const { data: c, error: d, response: _ } = await this.client.POST(
|
|
140
|
+
"/backend/widget/v5/connections/{serverId}/start",
|
|
141
|
+
{
|
|
142
|
+
params: { path: { serverId: s } },
|
|
143
|
+
body: { request_id: a },
|
|
144
|
+
signal: i
|
|
145
|
+
}
|
|
146
|
+
);
|
|
147
|
+
if (_.status === 410) throw new ce();
|
|
148
|
+
if (_.status === 404)
|
|
149
|
+
throw new Error("This connection request is no longer available.");
|
|
150
|
+
if (d || !c)
|
|
151
|
+
throw new Error("Could not start this connection. Please try again.");
|
|
152
|
+
return c;
|
|
153
|
+
}, this.getConnectionAttempt = async (s, a, i) => {
|
|
154
|
+
const { data: c, error: d, response: _ } = await this.client.GET(
|
|
155
|
+
"/backend/widget/v5/connections/{serverId}/attempts/{attemptId}",
|
|
156
|
+
{
|
|
157
|
+
params: { path: { serverId: s, attemptId: a } },
|
|
158
|
+
signal: i
|
|
159
|
+
}
|
|
160
|
+
);
|
|
161
|
+
if ([401, 403, 404].includes(_.status))
|
|
162
|
+
throw new pe();
|
|
163
|
+
if (d || !c)
|
|
164
|
+
throw new Error(`Could not check the connection (${_.status}).`);
|
|
165
|
+
return c.status;
|
|
166
|
+
}, this.disconnectConnection = async (s) => {
|
|
167
|
+
const { error: a } = await this.client.DELETE(
|
|
168
|
+
"/backend/widget/v5/connections/{serverId}",
|
|
169
|
+
{
|
|
170
|
+
params: { path: { serverId: s } }
|
|
171
|
+
}
|
|
172
|
+
);
|
|
173
|
+
if (a) throw new Error("Could not disconnect. Please try again.");
|
|
174
|
+
}, this.setAuthToken = (s) => {
|
|
175
|
+
this.userToken = s;
|
|
176
|
+
const { baseUrl: a, headers: i } = this.constructClientOptions(s);
|
|
177
|
+
this.client = this.createOpenAPIClient({ baseUrl: a, headers: i });
|
|
48
178
|
}, this.getStreamAuthContext = () => {
|
|
49
|
-
const { baseUrl:
|
|
50
|
-
for (const [c, d] of Object.entries(
|
|
51
|
-
typeof d == "string" && (["content-type", "accept"].includes(c.toLowerCase()) || (
|
|
52
|
-
return { baseUrl:
|
|
179
|
+
const { baseUrl: s, headers: a } = this.constructClientOptions(this.userToken), i = {};
|
|
180
|
+
for (const [c, d] of Object.entries(a))
|
|
181
|
+
typeof d == "string" && (["content-type", "accept"].includes(c.toLowerCase()) || (i[c] = d));
|
|
182
|
+
return { baseUrl: s, headers: i };
|
|
53
183
|
}, this.getStreamTransportOptions = () => {
|
|
54
|
-
const { baseUrl:
|
|
184
|
+
const { baseUrl: s, headers: a } = this.getStreamAuthContext();
|
|
55
185
|
return {
|
|
56
|
-
api:
|
|
57
|
-
reconnectApi: (
|
|
58
|
-
headers:
|
|
186
|
+
api: U(s, de),
|
|
187
|
+
reconnectApi: (i) => U(s, ue, i),
|
|
188
|
+
headers: a
|
|
59
189
|
};
|
|
60
|
-
}, this.stopStream = async (
|
|
61
|
-
const { response:
|
|
190
|
+
}, this.stopStream = async (s) => {
|
|
191
|
+
const { response: a } = await this.client.POST(
|
|
62
192
|
"/backend/widget/v5/chat/{sessionId}/stop",
|
|
63
|
-
{ params: { path: { sessionId:
|
|
193
|
+
{ params: { path: { sessionId: s } } }
|
|
64
194
|
);
|
|
65
|
-
if (!
|
|
66
|
-
throw new Error(`Failed to stop stream: ${
|
|
67
|
-
}, this.getAgentTurnMessages = async (
|
|
68
|
-
const { data:
|
|
195
|
+
if (!a.ok)
|
|
196
|
+
throw new Error(`Failed to stop stream: ${a.status}`);
|
|
197
|
+
}, this.getAgentTurnMessages = async (s, a) => {
|
|
198
|
+
const { data: i, response: c } = await this.client.GET(
|
|
69
199
|
"/backend/widget/v5/chat/{sessionId}/messages",
|
|
70
200
|
{
|
|
71
201
|
params: {
|
|
72
|
-
path: { sessionId:
|
|
202
|
+
path: { sessionId: s },
|
|
73
203
|
query: {
|
|
74
|
-
toolActivity:
|
|
75
|
-
reasoning: (
|
|
204
|
+
toolActivity: a == null ? void 0 : a.toolActivity,
|
|
205
|
+
reasoning: (a == null ? void 0 : a.reasoning) === void 0 ? void 0 : a.reasoning ? "true" : "false"
|
|
76
206
|
}
|
|
77
207
|
}
|
|
78
208
|
}
|
|
79
209
|
);
|
|
80
|
-
return
|
|
210
|
+
return i ? {
|
|
211
|
+
...i,
|
|
212
|
+
handled_connection_request_ids: i.handled_connection_request_ids ?? []
|
|
213
|
+
} : (k.warn("agent turn messages fetch failed", c.status), null);
|
|
81
214
|
}, this.createDictationSession = async ({
|
|
82
|
-
language:
|
|
215
|
+
language: s
|
|
83
216
|
}) => {
|
|
84
|
-
const { data:
|
|
217
|
+
const { data: a, response: i } = await this.client.POST(
|
|
85
218
|
"/backend/widget/v5/dictation/sessions",
|
|
86
|
-
{ body:
|
|
219
|
+
{ body: s ? { language: s } : {} }
|
|
87
220
|
);
|
|
88
|
-
if (!
|
|
89
|
-
throw new Error(`Failed to start dictation: ${
|
|
90
|
-
return
|
|
221
|
+
if (!a)
|
|
222
|
+
throw new Error(`Failed to start dictation: ${i.status}`);
|
|
223
|
+
return a;
|
|
91
224
|
}, this.getExternalWidgetConfig = async () => await this.client.GET("/backend/widget/v2/config", {
|
|
92
225
|
params: {
|
|
93
226
|
header: { "x-bot-token": this.config.token }
|
|
94
227
|
}
|
|
95
|
-
}), this.sendMessage = async (
|
|
96
|
-
body:
|
|
97
|
-
signal:
|
|
98
|
-
}), this.createUnverifiedContact = async (
|
|
228
|
+
}), this.sendMessage = async (s, a) => await this.client.POST("/backend/widget/v2/chat/send", {
|
|
229
|
+
body: s,
|
|
230
|
+
signal: a
|
|
231
|
+
}), this.createUnverifiedContact = async (s) => await this.client.POST(
|
|
99
232
|
"/backend/widget/v2/contact/create-unverified",
|
|
100
233
|
{
|
|
101
234
|
params: { header: { "x-bot-token": this.config.token } },
|
|
102
|
-
body:
|
|
235
|
+
body: s
|
|
103
236
|
}
|
|
104
|
-
), this.createSession = async (
|
|
105
|
-
body:
|
|
106
|
-
signal:
|
|
237
|
+
), this.createSession = async (s, a) => await this.client.POST("/backend/widget/v2/create-session", {
|
|
238
|
+
body: s,
|
|
239
|
+
signal: a
|
|
107
240
|
}), this.pollSessionAndHistory = async ({
|
|
108
|
-
sessionId:
|
|
109
|
-
abortSignal:
|
|
241
|
+
sessionId: s,
|
|
242
|
+
abortSignal: a
|
|
110
243
|
}) => await this.client.GET("/backend/widget/v2/poll/{sessionId}", {
|
|
111
|
-
params: { path: { sessionId:
|
|
112
|
-
signal:
|
|
244
|
+
params: { path: { sessionId: s } },
|
|
245
|
+
signal: a
|
|
113
246
|
}), this.getSessions = async ({
|
|
114
|
-
cursor:
|
|
115
|
-
filters:
|
|
116
|
-
abortSignal:
|
|
247
|
+
cursor: s,
|
|
248
|
+
filters: a,
|
|
249
|
+
abortSignal: i
|
|
117
250
|
}) => await this.client.GET("/backend/widget/v2/sessions", {
|
|
118
251
|
params: {
|
|
119
252
|
query: {
|
|
120
|
-
offset:
|
|
121
|
-
filters: JSON.stringify(
|
|
253
|
+
offset: s,
|
|
254
|
+
filters: JSON.stringify(a)
|
|
122
255
|
}
|
|
123
256
|
},
|
|
124
|
-
signal:
|
|
257
|
+
signal: i
|
|
125
258
|
}), this.uploadFile = async ({
|
|
126
|
-
file:
|
|
127
|
-
abortSignal:
|
|
128
|
-
onProgress:
|
|
259
|
+
file: s,
|
|
260
|
+
abortSignal: a,
|
|
261
|
+
onProgress: i
|
|
129
262
|
}) => new Promise((c, d) => {
|
|
130
|
-
var
|
|
131
|
-
const
|
|
132
|
-
|
|
263
|
+
var f;
|
|
264
|
+
const _ = new FormData();
|
|
265
|
+
_.append("file", s);
|
|
133
266
|
const p = new XMLHttpRequest();
|
|
134
|
-
if (
|
|
267
|
+
if (a && (a.addEventListener("abort", () => {
|
|
135
268
|
p.abort(), d(new DOMException("Aborted", "AbortError"));
|
|
136
|
-
}),
|
|
269
|
+
}), a.aborted)) {
|
|
137
270
|
d(new DOMException("Aborted", "AbortError"));
|
|
138
271
|
return;
|
|
139
272
|
}
|
|
140
|
-
p.upload.addEventListener("progress", (
|
|
141
|
-
if (
|
|
142
|
-
const
|
|
143
|
-
|
|
273
|
+
p.upload.addEventListener("progress", (b) => {
|
|
274
|
+
if (b.lengthComputable && i) {
|
|
275
|
+
const w = Math.round(b.loaded / b.total * 100);
|
|
276
|
+
i(w);
|
|
144
277
|
}
|
|
145
278
|
}), p.addEventListener("load", () => {
|
|
146
279
|
if (p.status >= 200 && p.status < 300)
|
|
147
280
|
try {
|
|
148
|
-
const
|
|
149
|
-
c(
|
|
150
|
-
} catch (
|
|
151
|
-
d(new Error(`Failed to parse response: ${
|
|
281
|
+
const b = JSON.parse(p.responseText);
|
|
282
|
+
c(b);
|
|
283
|
+
} catch (b) {
|
|
284
|
+
d(new Error(`Failed to parse response: ${b}`));
|
|
152
285
|
}
|
|
153
286
|
else
|
|
154
287
|
d(new Error(`Upload failed with status: ${p.status}`));
|
|
@@ -158,196 +291,207 @@ class O {
|
|
|
158
291
|
d(new Error("Upload timed out"));
|
|
159
292
|
});
|
|
160
293
|
const { baseUrl: u } = this.constructClientOptions(this.userToken), g = `${u}/backend/widget/v2/upload`;
|
|
161
|
-
p.open("POST", g), p.setRequestHeader("X-Bot-Token", this.config.token), this.userToken ?? ((
|
|
162
|
-
}), this.vote = async (
|
|
163
|
-
body:
|
|
164
|
-
signal:
|
|
165
|
-
}), this.createStateCheckpoint = async (
|
|
166
|
-
body:
|
|
167
|
-
}), this.submitCsat = async (
|
|
168
|
-
const { baseUrl:
|
|
169
|
-
(
|
|
294
|
+
p.open("POST", g), p.setRequestHeader("X-Bot-Token", this.config.token), this.userToken ?? ((f = this.config.user) == null ? void 0 : f.token) ? p.setRequestHeader("Authorization", `Bearer ${this.userToken}`) : k.error("user token not set"), p.send(_);
|
|
295
|
+
}), this.vote = async (s) => await this.client.POST("/backend/widget/v2/chat/vote", { body: s }), this.resolveSession = async (s, a) => await this.client.POST("/backend/widget/v2/session/resolve", {
|
|
296
|
+
body: s,
|
|
297
|
+
signal: a
|
|
298
|
+
}), this.createStateCheckpoint = async (s) => await this.client.POST("/backend/widget/v2/checkpoint", {
|
|
299
|
+
body: s
|
|
300
|
+
}), this.submitCsat = async (s) => await this.client.POST("/backend/widget/v2/submit-csat", { body: s }), this.config = e, this.userToken = ((r = e.user) == null ? void 0 : r.token) || null;
|
|
301
|
+
const { baseUrl: t, headers: o } = this.constructClientOptions(
|
|
302
|
+
(l = e.user) == null ? void 0 : l.token
|
|
170
303
|
);
|
|
171
|
-
this.client = this.createOpenAPIClient({ baseUrl:
|
|
304
|
+
this.client = this.createOpenAPIClient({ baseUrl: t, headers: o });
|
|
172
305
|
}
|
|
173
306
|
}
|
|
174
|
-
function
|
|
175
|
-
|
|
307
|
+
function me(n, e) {
|
|
308
|
+
k.error(`missing case for ${n} in ${e}`);
|
|
176
309
|
}
|
|
177
|
-
class
|
|
310
|
+
class S {
|
|
178
311
|
constructor(e) {
|
|
179
|
-
this.subscribers = /* @__PURE__ */ new Set(), this.get = () => this.state, this.set = (
|
|
180
|
-
|
|
181
|
-
}, this.setPartial = (
|
|
182
|
-
if (
|
|
183
|
-
const
|
|
184
|
-
this.set(
|
|
312
|
+
this.subscribers = /* @__PURE__ */ new Set(), this.get = () => this.state, this.set = (t) => {
|
|
313
|
+
oe(this.state, t) || (this.state = t, this.notifySubscribers(t));
|
|
314
|
+
}, this.setPartial = (t) => {
|
|
315
|
+
if (t == null) return;
|
|
316
|
+
const o = { ...this.state, ...t };
|
|
317
|
+
this.set(o);
|
|
185
318
|
}, this.reset = () => {
|
|
186
319
|
this.set(this.initialState);
|
|
187
|
-
}, this.notifySubscribers = (
|
|
188
|
-
Array.from(this.subscribers).forEach((
|
|
320
|
+
}, this.notifySubscribers = (t) => {
|
|
321
|
+
Array.from(this.subscribers).forEach((r) => {
|
|
189
322
|
try {
|
|
190
|
-
|
|
191
|
-
} catch (
|
|
192
|
-
|
|
323
|
+
r(t);
|
|
324
|
+
} catch (l) {
|
|
325
|
+
k.error("state subscriber threw", l);
|
|
193
326
|
}
|
|
194
327
|
});
|
|
195
|
-
}, this.subscribe = (
|
|
196
|
-
this.subscribers.delete(
|
|
328
|
+
}, this.subscribe = (t) => (this.subscribers.add(t), () => {
|
|
329
|
+
this.subscribers.delete(t);
|
|
197
330
|
}), this.state = e, this.initialState = e;
|
|
198
331
|
}
|
|
199
332
|
}
|
|
200
|
-
class
|
|
333
|
+
class G {
|
|
201
334
|
constructor() {
|
|
202
|
-
this.state = new
|
|
335
|
+
this.state = new S({
|
|
203
336
|
isPolling: !1,
|
|
204
337
|
isError: !1
|
|
205
338
|
}), this.abortController = new AbortController(), this.reset = () => {
|
|
206
339
|
var e;
|
|
207
340
|
this.abortController.abort("Resetting poller"), (e = this.stopPolling) == null || e.call(this), this.stopPolling = null;
|
|
208
|
-
}, this.stopPolling = null, this.startPolling = (e,
|
|
341
|
+
}, this.stopPolling = null, this.startPolling = (e, t) => {
|
|
209
342
|
if (this.stopPolling) return;
|
|
210
|
-
const
|
|
343
|
+
const o = [], r = async () => {
|
|
211
344
|
this.abortController = new AbortController(), this.state.setPartial({ isPolling: !0 });
|
|
212
345
|
try {
|
|
213
346
|
await e(this.abortController.signal);
|
|
214
|
-
} catch (
|
|
347
|
+
} catch (l) {
|
|
215
348
|
if (this.abortController.signal.aborted)
|
|
216
349
|
return;
|
|
217
|
-
|
|
350
|
+
k.error("failed to poll", l), this.state.setPartial({ isError: !0 });
|
|
218
351
|
} finally {
|
|
219
352
|
this.state.setPartial({ isPolling: !1 });
|
|
220
353
|
}
|
|
221
|
-
this.abortController.signal.aborted ||
|
|
354
|
+
this.abortController.signal.aborted || o.push(setTimeout(r, t));
|
|
222
355
|
};
|
|
223
|
-
|
|
224
|
-
|
|
356
|
+
r(), this.stopPolling = () => {
|
|
357
|
+
o.forEach(clearTimeout), this.state.reset();
|
|
225
358
|
};
|
|
226
359
|
};
|
|
227
360
|
}
|
|
228
361
|
}
|
|
229
|
-
function
|
|
362
|
+
function $(n) {
|
|
230
363
|
try {
|
|
231
364
|
const e = n();
|
|
232
|
-
return e instanceof Promise ? e.then((
|
|
365
|
+
return e instanceof Promise ? e.then((t) => ({ data: t })).catch((t) => ({ error: t })) : { data: e };
|
|
233
366
|
} catch (e) {
|
|
234
367
|
return { error: e };
|
|
235
368
|
}
|
|
236
369
|
}
|
|
237
|
-
class
|
|
370
|
+
class he {
|
|
238
371
|
constructor({
|
|
239
372
|
api: e,
|
|
240
|
-
config:
|
|
241
|
-
sessionCtx:
|
|
242
|
-
messageCtx:
|
|
243
|
-
sessionPollingIntervalSeconds:
|
|
373
|
+
config: t,
|
|
374
|
+
sessionCtx: o,
|
|
375
|
+
messageCtx: r,
|
|
376
|
+
sessionPollingIntervalSeconds: l
|
|
244
377
|
}) {
|
|
245
|
-
this.poller = new
|
|
246
|
-
this.
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
try {
|
|
253
|
-
this.fetchSessionAndFullHistoryAbortController = new AbortController(), this.fetchSessionAndHistory({
|
|
254
|
-
sessionId: o.id,
|
|
255
|
-
abortSignal: this.fetchSessionAndFullHistoryAbortController.signal
|
|
378
|
+
this.poller = new G(), this.fetchSessionAndFullHistoryAbortController = new AbortController(), this.reconcileAbortController = new AbortController(), this.subscriptions = [], this.reconcilingSessionId = null, this.registerPolling = () => {
|
|
379
|
+
this.subscriptions.push(
|
|
380
|
+
this.sessionCtx.sessionState.subscribe(({ session: s }) => {
|
|
381
|
+
s != null && s.id ? this.poller.startPolling(async (a) => {
|
|
382
|
+
this.fetchSessionAndHistory({
|
|
383
|
+
sessionId: s.id,
|
|
384
|
+
abortSignal: a
|
|
256
385
|
});
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
386
|
+
}, this.sessionPollingIntervalSeconds * 1e3) : this.poller.reset();
|
|
387
|
+
})
|
|
388
|
+
), this.subscriptions.push(
|
|
389
|
+
this.sessionCtx.sessionState.subscribe(({ session: s }) => {
|
|
390
|
+
if (s != null && s.id && !s.isOpened)
|
|
391
|
+
try {
|
|
392
|
+
this.fetchSessionAndFullHistoryAbortController = new AbortController(), this.fetchSessionAndHistory({
|
|
393
|
+
sessionId: s.id,
|
|
394
|
+
abortSignal: this.fetchSessionAndFullHistoryAbortController.signal
|
|
395
|
+
});
|
|
396
|
+
} catch (a) {
|
|
397
|
+
this.fetchSessionAndFullHistoryAbortController.signal.aborted || k.error("failed to fetch session and full history", a);
|
|
398
|
+
}
|
|
399
|
+
else
|
|
400
|
+
this.fetchSessionAndFullHistoryAbortController.abort();
|
|
401
|
+
})
|
|
402
|
+
), this.subscriptions.push(
|
|
403
|
+
this.sessionCtx.sessionState.subscribe(({ session: s }) => {
|
|
404
|
+
this.reconcilingSessionId !== null && (s == null ? void 0 : s.id) !== this.reconcilingSessionId && this.reconcileAbortController.abort();
|
|
405
|
+
})
|
|
406
|
+
);
|
|
407
|
+
}, this.dispose = () => {
|
|
408
|
+
this.poller.reset(), this.fetchSessionAndFullHistoryAbortController.abort(), this.reconcileAbortController.abort(), this.reconcilingSessionId = null, this.subscriptions.forEach((s) => s()), this.subscriptions = [];
|
|
409
|
+
}, this.reconcileAfterStream = async (s) => {
|
|
266
410
|
this.reconcileAbortController.abort(), this.reconcileAbortController = new AbortController();
|
|
267
|
-
const { signal:
|
|
268
|
-
this.reconcilingSessionId =
|
|
411
|
+
const { signal: a } = this.reconcileAbortController;
|
|
412
|
+
this.reconcilingSessionId = s;
|
|
269
413
|
try {
|
|
270
|
-
await this.fetchSessionAndHistory({ sessionId:
|
|
271
|
-
} catch (
|
|
272
|
-
if (!
|
|
414
|
+
await this.fetchSessionAndHistory({ sessionId: s, abortSignal: a });
|
|
415
|
+
} catch (i) {
|
|
416
|
+
if (!a.aborted) throw i;
|
|
273
417
|
} finally {
|
|
274
|
-
this.reconcilingSessionId ===
|
|
418
|
+
this.reconcilingSessionId === s && (this.reconcilingSessionId = null);
|
|
275
419
|
}
|
|
276
420
|
}, this.fetchSessionAndHistory = async ({
|
|
277
|
-
sessionId:
|
|
278
|
-
abortSignal:
|
|
421
|
+
sessionId: s,
|
|
422
|
+
abortSignal: a
|
|
279
423
|
}) => {
|
|
280
|
-
const
|
|
281
|
-
|
|
424
|
+
const i = this.messageCtx.state.get().messages.length === 0;
|
|
425
|
+
i && this.messageCtx.state.setPartial({ isInitialFetchLoading: !0 });
|
|
282
426
|
const { data: c } = await this.api.pollSessionAndHistory({
|
|
283
|
-
sessionId:
|
|
284
|
-
abortSignal:
|
|
427
|
+
sessionId: s,
|
|
428
|
+
abortSignal: a
|
|
285
429
|
});
|
|
286
430
|
if (c != null && c.session && (this.sessionCtx.sessionState.setPartial({ session: c.session }), this.sessionCtx.setSessions([c.session])), c != null && c.history && c.history.length > 0) {
|
|
287
|
-
const d = this.messageCtx.state.get().messages,
|
|
431
|
+
const d = this.messageCtx.state.get().messages, _ = c.history.map(this.mapHistoryToMessage).filter((p) => p !== null).filter(
|
|
288
432
|
(p) => !d.some((u) => u.id === p.id)
|
|
289
433
|
);
|
|
290
|
-
if (
|
|
434
|
+
if (_.length > 0)
|
|
291
435
|
if (this.messageCtx.state.setPartial({
|
|
292
|
-
messages: [...d, ...
|
|
293
|
-
}),
|
|
436
|
+
messages: [...d, ..._]
|
|
437
|
+
}), i)
|
|
294
438
|
this.messageCtx.markAsDispatchedToOnMessageReceivedHook(
|
|
295
|
-
|
|
439
|
+
_.map((p) => p.id)
|
|
296
440
|
);
|
|
297
441
|
else
|
|
298
|
-
for (const p of
|
|
442
|
+
for (const p of _)
|
|
299
443
|
this.messageCtx.dispatchToOnMessageReceivedHook(p);
|
|
300
444
|
}
|
|
301
445
|
this.messageCtx.state.get().isInitialFetchLoading && this.messageCtx.state.setPartial({ isInitialFetchLoading: !1 });
|
|
302
|
-
}, this.mapHistoryToMessage = (
|
|
303
|
-
var
|
|
304
|
-
const
|
|
305
|
-
id:
|
|
306
|
-
timestamp:
|
|
307
|
-
attachments:
|
|
446
|
+
}, this.mapHistoryToMessage = (s) => {
|
|
447
|
+
var i;
|
|
448
|
+
const a = {
|
|
449
|
+
id: s.publicId,
|
|
450
|
+
timestamp: s.sentAt || "",
|
|
451
|
+
attachments: s.attachments || void 0
|
|
308
452
|
};
|
|
309
|
-
if (
|
|
453
|
+
if (s.sender.kind === "user")
|
|
310
454
|
return {
|
|
311
|
-
...
|
|
455
|
+
...a,
|
|
312
456
|
type: "USER",
|
|
313
|
-
content:
|
|
457
|
+
content: s.content.text || "",
|
|
314
458
|
// Backend field name (schema.ts) → widget vocabulary.
|
|
315
|
-
markedElements:
|
|
459
|
+
markedElements: s.pickedElements
|
|
316
460
|
};
|
|
317
|
-
if (
|
|
461
|
+
if (s.sender.kind === "agent")
|
|
318
462
|
return {
|
|
319
|
-
...
|
|
463
|
+
...a,
|
|
320
464
|
type: "AGENT",
|
|
321
465
|
component: "agent_message",
|
|
322
466
|
data: {
|
|
323
|
-
message:
|
|
467
|
+
message: s.content.text || ""
|
|
324
468
|
},
|
|
325
469
|
agent: {
|
|
326
|
-
name:
|
|
470
|
+
name: s.sender.name || "",
|
|
327
471
|
// Do not set avatarUrl from config here... let it be taken from the config at render time
|
|
328
472
|
// Only set avatar url from the backend's response
|
|
329
|
-
avatarUrl:
|
|
330
|
-
avatar:
|
|
473
|
+
avatarUrl: s.sender.avatar || null,
|
|
474
|
+
avatar: s.sender.avatar || null,
|
|
331
475
|
id: null,
|
|
332
476
|
isAi: !1
|
|
333
477
|
}
|
|
334
478
|
};
|
|
335
|
-
if (
|
|
336
|
-
const c =
|
|
479
|
+
if (s.sender.kind === "ai") {
|
|
480
|
+
const c = s.actionCalls && s.actionCalls.length > 0 ? s.actionCalls[s.actionCalls.length - 1] : void 0;
|
|
337
481
|
return {
|
|
338
|
-
...
|
|
482
|
+
...a,
|
|
339
483
|
type: "AI",
|
|
340
484
|
component: "bot_message",
|
|
341
485
|
agent: {
|
|
342
486
|
id: null,
|
|
343
|
-
name: ((
|
|
487
|
+
name: ((i = this.config.bot) == null ? void 0 : i.name) || "",
|
|
344
488
|
isAi: !0,
|
|
345
489
|
// Do not set avatarUrl from config here... let it be taken from the config at render time
|
|
346
490
|
avatarUrl: null,
|
|
347
491
|
avatar: null
|
|
348
492
|
},
|
|
349
493
|
data: {
|
|
350
|
-
message:
|
|
494
|
+
message: s.content.text || "",
|
|
351
495
|
action: c ? {
|
|
352
496
|
name: c.actionName,
|
|
353
497
|
data: this.extractActionResult(c)
|
|
@@ -355,136 +499,136 @@ class _e {
|
|
|
355
499
|
}
|
|
356
500
|
};
|
|
357
501
|
}
|
|
358
|
-
if (
|
|
359
|
-
const c = this.constructSystemMessage(
|
|
502
|
+
if (s.sender.kind === "system") {
|
|
503
|
+
const c = this.constructSystemMessage(s);
|
|
360
504
|
return c === null ? null : { ...c };
|
|
361
505
|
}
|
|
362
506
|
return null;
|
|
363
|
-
}, this.constructSystemMessage = (
|
|
364
|
-
if (!
|
|
365
|
-
switch (
|
|
507
|
+
}, this.constructSystemMessage = (s) => {
|
|
508
|
+
if (!s || !s.systemMessagePayload) return null;
|
|
509
|
+
switch (s.systemMessagePayload.type) {
|
|
366
510
|
case "state_checkpoint":
|
|
367
511
|
return {
|
|
368
|
-
id:
|
|
512
|
+
id: s.publicId,
|
|
369
513
|
type: "SYSTEM",
|
|
370
514
|
subtype: "state_checkpoint",
|
|
371
|
-
data: { payload:
|
|
372
|
-
timestamp:
|
|
515
|
+
data: { payload: s.systemMessagePayload.payload },
|
|
516
|
+
timestamp: s.sentAt || "",
|
|
373
517
|
attachments: void 0
|
|
374
518
|
};
|
|
375
519
|
case "csat_requested":
|
|
376
520
|
return {
|
|
377
|
-
id:
|
|
521
|
+
id: s.publicId,
|
|
378
522
|
type: "SYSTEM",
|
|
379
523
|
subtype: "csat_requested",
|
|
380
524
|
data: { payload: void 0 },
|
|
381
|
-
timestamp:
|
|
525
|
+
timestamp: s.sentAt || "",
|
|
382
526
|
attachments: void 0
|
|
383
527
|
};
|
|
384
528
|
case "csat_submitted":
|
|
385
529
|
return {
|
|
386
|
-
id:
|
|
530
|
+
id: s.publicId,
|
|
387
531
|
type: "SYSTEM",
|
|
388
532
|
subtype: "csat_submitted",
|
|
389
533
|
data: {
|
|
390
534
|
payload: {
|
|
391
|
-
score:
|
|
392
|
-
feedback:
|
|
535
|
+
score: s.systemMessagePayload.payload.score ?? void 0,
|
|
536
|
+
feedback: s.systemMessagePayload.payload.feedback ?? void 0
|
|
393
537
|
}
|
|
394
538
|
},
|
|
395
|
-
timestamp:
|
|
539
|
+
timestamp: s.sentAt || "",
|
|
396
540
|
attachments: void 0
|
|
397
541
|
};
|
|
398
542
|
case "none":
|
|
399
543
|
return null;
|
|
400
544
|
default:
|
|
401
|
-
return
|
|
402
|
-
|
|
545
|
+
return me(
|
|
546
|
+
s.systemMessagePayload,
|
|
403
547
|
this.constructSystemMessage.name
|
|
404
548
|
), null;
|
|
405
549
|
}
|
|
406
|
-
}, this.extractActionResult = (
|
|
407
|
-
const
|
|
408
|
-
if (
|
|
409
|
-
if ("responseBodyText" in
|
|
410
|
-
const
|
|
550
|
+
}, this.extractActionResult = (s) => {
|
|
551
|
+
const a = s.result;
|
|
552
|
+
if (a === null || typeof a != "object") return a;
|
|
553
|
+
if ("responseBodyText" in a && typeof a.responseBodyText == "string") {
|
|
554
|
+
const i = a.responseBodyText, c = $(() => JSON.parse(i)).data;
|
|
411
555
|
if (c) return c;
|
|
412
556
|
}
|
|
413
|
-
return
|
|
414
|
-
}, this.api = e, this.config =
|
|
557
|
+
return s.result;
|
|
558
|
+
}, this.api = e, this.config = t, this.sessionCtx = o, this.messageCtx = r, this.sessionPollingIntervalSeconds = l, this.registerPolling();
|
|
415
559
|
}
|
|
416
560
|
}
|
|
417
|
-
class
|
|
561
|
+
class ge {
|
|
418
562
|
constructor({
|
|
419
563
|
config: e,
|
|
420
|
-
api:
|
|
421
|
-
storageCtx:
|
|
564
|
+
api: t,
|
|
565
|
+
storageCtx: o
|
|
422
566
|
}) {
|
|
423
|
-
var
|
|
567
|
+
var r;
|
|
424
568
|
this.shouldCollectData = () => {
|
|
425
|
-
var
|
|
426
|
-
return !!(!((
|
|
569
|
+
var l;
|
|
570
|
+
return !!(!((l = this.state.get().contact) != null && l.token) && this.config.collectUserData);
|
|
427
571
|
}, this.autoCreateUnverifiedUserIfNotExists = async () => {
|
|
428
|
-
var
|
|
429
|
-
if (!((
|
|
430
|
-
if (this.config.collectUserData && !((
|
|
431
|
-
if ((
|
|
572
|
+
var l, s, a, i, c, d, _, p, u, m, g, v, f, b;
|
|
573
|
+
if (!((l = this.config.user) != null && l.token)) {
|
|
574
|
+
if (this.config.collectUserData && !((a = (s = this.config.user) == null ? void 0 : s.data) != null && a.email)) {
|
|
575
|
+
if ((i = this.config.extraDataCollectionFields) != null && i.length)
|
|
432
576
|
return;
|
|
433
|
-
const
|
|
434
|
-
|
|
577
|
+
const w = await ((c = this.storageCtx) == null ? void 0 : c.getContactToken());
|
|
578
|
+
w && await this.setUnverifiedContact(w);
|
|
435
579
|
return;
|
|
436
580
|
}
|
|
437
|
-
if (!((
|
|
438
|
-
const
|
|
439
|
-
if (
|
|
440
|
-
await this.setUnverifiedContact(
|
|
581
|
+
if (!((_ = (d = this.config.user) == null ? void 0 : d.data) != null && _.email)) {
|
|
582
|
+
const w = await ((p = this.storageCtx) == null ? void 0 : p.getContactToken());
|
|
583
|
+
if (w) {
|
|
584
|
+
await this.setUnverifiedContact(w);
|
|
441
585
|
return;
|
|
442
586
|
}
|
|
443
587
|
}
|
|
444
588
|
await this.createUnverifiedContact({
|
|
445
589
|
email: (m = (u = this.config.user) == null ? void 0 : u.data) == null ? void 0 : m.email,
|
|
446
|
-
non_verified_name: (
|
|
447
|
-
non_verified_custom_data: (
|
|
590
|
+
non_verified_name: (v = (g = this.config.user) == null ? void 0 : g.data) == null ? void 0 : v.name,
|
|
591
|
+
non_verified_custom_data: (b = (f = this.config.user) == null ? void 0 : f.data) == null ? void 0 : b.customData
|
|
448
592
|
});
|
|
449
593
|
}
|
|
450
|
-
}, this.createUnverifiedContact = async (
|
|
451
|
-
this.state.setPartial({ extraCollectedData:
|
|
594
|
+
}, this.createUnverifiedContact = async (l, s) => {
|
|
595
|
+
this.state.setPartial({ extraCollectedData: s });
|
|
452
596
|
try {
|
|
453
597
|
this.state.setPartial({
|
|
454
598
|
isCreatingUnverifiedContact: !0,
|
|
455
599
|
isErrorCreatingUnverifiedContact: !1
|
|
456
600
|
});
|
|
457
|
-
const { data:
|
|
458
|
-
|
|
459
|
-
} catch (
|
|
460
|
-
this.state.setPartial({ isErrorCreatingUnverifiedContact: !0 }),
|
|
461
|
-
_e:
|
|
601
|
+
const { data: a } = await this.api.createUnverifiedContact(l);
|
|
602
|
+
a != null && a.token ? await this.setUnverifiedContact(a.token) : this.state.setPartial({ isErrorCreatingUnverifiedContact: !0 });
|
|
603
|
+
} catch (a) {
|
|
604
|
+
this.state.setPartial({ isErrorCreatingUnverifiedContact: !0 }), k.error("failed to create an unverified contact", {
|
|
605
|
+
_e: a instanceof Error ? a.message : String(a)
|
|
462
606
|
});
|
|
463
607
|
} finally {
|
|
464
608
|
this.state.setPartial({ isCreatingUnverifiedContact: !1 });
|
|
465
609
|
}
|
|
466
610
|
}, this.recoverFromStaleToken = async () => {
|
|
467
|
-
var
|
|
468
|
-
if ((
|
|
611
|
+
var l, s, a, i, c, d, _, p, u, m;
|
|
612
|
+
if ((l = this.config.user) != null && l.token) return !1;
|
|
469
613
|
this.api.setAuthToken(""), this.state.setPartial({ contact: null });
|
|
470
614
|
try {
|
|
471
|
-
await ((
|
|
615
|
+
await ((s = this.storageCtx) == null ? void 0 : s.clearContactToken()), await ((a = this.storageCtx) == null ? void 0 : a.clearActiveSessionId());
|
|
472
616
|
} catch (g) {
|
|
473
|
-
|
|
617
|
+
k.warn("failed to clear a stale contact token", {
|
|
474
618
|
error: g instanceof Error ? g.message : String(g)
|
|
475
619
|
});
|
|
476
620
|
}
|
|
477
621
|
return await this.createUnverifiedContact({
|
|
478
|
-
email: (c = (
|
|
479
|
-
non_verified_name: (
|
|
622
|
+
email: (c = (i = this.config.user) == null ? void 0 : i.data) == null ? void 0 : c.email,
|
|
623
|
+
non_verified_name: (_ = (d = this.config.user) == null ? void 0 : d.data) == null ? void 0 : _.name,
|
|
480
624
|
non_verified_custom_data: (u = (p = this.config.user) == null ? void 0 : p.data) == null ? void 0 : u.customData
|
|
481
625
|
}), !!((m = this.state.get().contact) != null && m.token);
|
|
482
|
-
}, this.setUnverifiedContact = async (
|
|
483
|
-
var
|
|
484
|
-
const
|
|
485
|
-
this.api.setAuthToken(
|
|
486
|
-
}, this.config = e, this.storageCtx =
|
|
487
|
-
contact: (
|
|
626
|
+
}, this.setUnverifiedContact = async (l) => {
|
|
627
|
+
var i, c, d, _;
|
|
628
|
+
const s = await ((i = this.storageCtx) == null ? void 0 : i.getExternalContactId()), a = ((c = this.config.user) == null ? void 0 : c.externalId) || s || N();
|
|
629
|
+
this.api.setAuthToken(l), await ((d = this.storageCtx) == null ? void 0 : d.setContactToken(l)), await ((_ = this.storageCtx) == null ? void 0 : _.setExternalContactId(a)), this.state.setPartial({ contact: { token: l, externalId: a } });
|
|
630
|
+
}, this.config = e, this.storageCtx = o, this.api = t, this.state = new S({
|
|
631
|
+
contact: (r = e.user) != null && r.token ? {
|
|
488
632
|
token: e.user.token,
|
|
489
633
|
// Set optional externalId from config... not local storage
|
|
490
634
|
externalId: e.user.externalId
|
|
@@ -495,49 +639,49 @@ class le {
|
|
|
495
639
|
}), this.autoCreateUnverifiedUserIfNotExists();
|
|
496
640
|
}
|
|
497
641
|
}
|
|
498
|
-
class
|
|
642
|
+
class ke {
|
|
499
643
|
constructor(e) {
|
|
500
|
-
this.api = e, this.state = new
|
|
501
|
-
const
|
|
502
|
-
(
|
|
503
|
-
file:
|
|
504
|
-
id:
|
|
644
|
+
this.api = e, this.state = new S([]), this.controllers = /* @__PURE__ */ new Map(), this.appendFiles = (t) => {
|
|
645
|
+
const o = t.map(
|
|
646
|
+
(r) => ({
|
|
647
|
+
file: r,
|
|
648
|
+
id: N(),
|
|
505
649
|
status: "pending",
|
|
506
650
|
progress: 0
|
|
507
651
|
})
|
|
508
652
|
);
|
|
509
|
-
this.state.set([...this.state.get(), ...
|
|
510
|
-
}, this.cancel = (
|
|
511
|
-
var
|
|
512
|
-
(
|
|
653
|
+
this.state.set([...this.state.get(), ...o]), o.forEach((r) => void this.upload(r));
|
|
654
|
+
}, this.cancel = (t) => {
|
|
655
|
+
var o;
|
|
656
|
+
(o = this.controllers.get(t)) == null || o.abort(), this.controllers.delete(t), this.state.set(this.state.get().filter((r) => r.id !== t));
|
|
513
657
|
}, this.reset = () => {
|
|
514
|
-
this.controllers.forEach((
|
|
658
|
+
this.controllers.forEach((t) => t.abort()), this.controllers.clear(), this.state.reset();
|
|
515
659
|
};
|
|
516
660
|
}
|
|
517
|
-
update(e,
|
|
661
|
+
update(e, t) {
|
|
518
662
|
this.state.set(
|
|
519
|
-
this.state.get().map((
|
|
663
|
+
this.state.get().map((o) => o.id === e ? { ...o, ...t } : o)
|
|
520
664
|
);
|
|
521
665
|
}
|
|
522
666
|
async upload(e) {
|
|
523
|
-
const
|
|
524
|
-
this.controllers.set(e.id,
|
|
667
|
+
const t = new AbortController();
|
|
668
|
+
this.controllers.set(e.id, t), this.update(e.id, { status: "uploading" });
|
|
525
669
|
try {
|
|
526
|
-
const
|
|
670
|
+
const o = await this.api.uploadFile({
|
|
527
671
|
file: e.file,
|
|
528
|
-
abortSignal:
|
|
529
|
-
onProgress: (
|
|
672
|
+
abortSignal: t.signal,
|
|
673
|
+
onProgress: (r) => this.update(e.id, { progress: r })
|
|
530
674
|
});
|
|
531
675
|
this.update(e.id, {
|
|
532
676
|
status: "success",
|
|
533
|
-
fileUrl:
|
|
677
|
+
fileUrl: o.fileUrl,
|
|
534
678
|
progress: 100
|
|
535
679
|
});
|
|
536
|
-
} catch (
|
|
537
|
-
|
|
680
|
+
} catch (o) {
|
|
681
|
+
t.signal.aborted || this.update(e.id, {
|
|
538
682
|
status: "error",
|
|
539
683
|
progress: 0,
|
|
540
|
-
error:
|
|
684
|
+
error: o instanceof Error ? o.message : "Upload failed"
|
|
541
685
|
});
|
|
542
686
|
} finally {
|
|
543
687
|
this.controllers.delete(e.id);
|
|
@@ -545,47 +689,47 @@ class ce {
|
|
|
545
689
|
}
|
|
546
690
|
}
|
|
547
691
|
function x() {
|
|
548
|
-
return
|
|
692
|
+
return N();
|
|
549
693
|
}
|
|
550
|
-
class
|
|
694
|
+
class be {
|
|
551
695
|
constructor({
|
|
552
696
|
api: e,
|
|
553
|
-
sessionCtx:
|
|
554
|
-
messageCtx:
|
|
697
|
+
sessionCtx: t,
|
|
698
|
+
messageCtx: o
|
|
555
699
|
}) {
|
|
556
|
-
this.submitCsat = async (
|
|
700
|
+
this.submitCsat = async (r) => {
|
|
557
701
|
var c;
|
|
558
|
-
const
|
|
559
|
-
if (!
|
|
702
|
+
const l = (c = this.sessionCtx.sessionState.get().session) == null ? void 0 : c.id;
|
|
703
|
+
if (!l)
|
|
560
704
|
return { data: null, error: "No session id found" };
|
|
561
|
-
const
|
|
705
|
+
const s = x();
|
|
562
706
|
this.messageCtx.state.setPartial({
|
|
563
707
|
messages: [
|
|
564
708
|
...this.messageCtx.state.get().messages,
|
|
565
709
|
{
|
|
566
|
-
id:
|
|
710
|
+
id: s,
|
|
567
711
|
type: "SYSTEM",
|
|
568
712
|
subtype: "csat_submitted",
|
|
569
713
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
570
714
|
data: {
|
|
571
715
|
payload: {
|
|
572
|
-
score:
|
|
573
|
-
feedback:
|
|
716
|
+
score: r.score,
|
|
717
|
+
feedback: r.feedback
|
|
574
718
|
}
|
|
575
719
|
}
|
|
576
720
|
}
|
|
577
721
|
]
|
|
578
722
|
});
|
|
579
|
-
const { data:
|
|
580
|
-
...
|
|
581
|
-
system_message_uuid:
|
|
582
|
-
session_id:
|
|
723
|
+
const { data: a, error: i } = await this.api.submitCsat({
|
|
724
|
+
...r,
|
|
725
|
+
system_message_uuid: s,
|
|
726
|
+
session_id: l
|
|
583
727
|
});
|
|
584
|
-
return { data:
|
|
585
|
-
}, this.api = e, this.sessionCtx =
|
|
728
|
+
return { data: a, error: i };
|
|
729
|
+
}, this.api = e, this.sessionCtx = t, this.messageCtx = o;
|
|
586
730
|
}
|
|
587
731
|
}
|
|
588
|
-
const
|
|
732
|
+
const ve = [
|
|
589
733
|
{
|
|
590
734
|
action: "newparagraph",
|
|
591
735
|
phrases: {
|
|
@@ -660,7 +804,7 @@ const de = [
|
|
|
660
804
|
it: ["invia messaggio"]
|
|
661
805
|
}
|
|
662
806
|
}
|
|
663
|
-
],
|
|
807
|
+
], fe = [
|
|
664
808
|
"en",
|
|
665
809
|
"es",
|
|
666
810
|
"fr",
|
|
@@ -668,104 +812,104 @@ const de = [
|
|
|
668
812
|
"pt",
|
|
669
813
|
"it"
|
|
670
814
|
];
|
|
671
|
-
function
|
|
672
|
-
return
|
|
815
|
+
function ye(n) {
|
|
816
|
+
return fe.includes(n);
|
|
673
817
|
}
|
|
674
|
-
function
|
|
818
|
+
function we(n) {
|
|
675
819
|
return n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
676
820
|
}
|
|
677
|
-
function
|
|
678
|
-
const e =
|
|
679
|
-
(
|
|
680
|
-
(
|
|
821
|
+
function je(n) {
|
|
822
|
+
const e = ve.flatMap(
|
|
823
|
+
(r) => n.flatMap(
|
|
824
|
+
(l) => r.phrases[l].map((s) => ({ phrase: s, action: r.action }))
|
|
681
825
|
)
|
|
682
|
-
),
|
|
826
|
+
), t = e.map((r) => we(r.phrase)).sort((r, l) => l.length - r.length).join("|"), o = String.raw`(?<=^\s{0,3}|[.!?\n]\s{0,3})`;
|
|
683
827
|
return {
|
|
684
828
|
regex: new RegExp(
|
|
685
|
-
`${
|
|
829
|
+
`${o}(${t})` + String.raw`([.,!?;:])(?=\s|$)`,
|
|
686
830
|
"giu"
|
|
687
831
|
),
|
|
688
832
|
finalRegex: new RegExp(
|
|
689
|
-
`${
|
|
833
|
+
`${o}(${t})` + String.raw`([.,!?;:]?)(?=\s|$)`,
|
|
690
834
|
"giu"
|
|
691
835
|
),
|
|
692
836
|
phraseToAction: new Map(
|
|
693
|
-
e.map((
|
|
837
|
+
e.map((r) => [r.phrase.toLowerCase(), r.action])
|
|
694
838
|
),
|
|
695
|
-
longestPhrase: Math.max(...e.map((
|
|
839
|
+
longestPhrase: Math.max(...e.map((r) => r.phrase.length))
|
|
696
840
|
};
|
|
697
841
|
}
|
|
698
|
-
const
|
|
699
|
-
function
|
|
700
|
-
const e = n &&
|
|
701
|
-
let
|
|
702
|
-
return
|
|
842
|
+
const V = /* @__PURE__ */ new Map();
|
|
843
|
+
function I(n) {
|
|
844
|
+
const e = n && ye(n) && n !== "en" ? n : null, t = e ?? "en";
|
|
845
|
+
let o = V.get(t);
|
|
846
|
+
return o || (o = je(e ? ["en", e] : ["en"]), V.set(t, o)), o;
|
|
703
847
|
}
|
|
704
|
-
function
|
|
848
|
+
function Se(n) {
|
|
705
849
|
const e = n.replace(/\s+$/, "");
|
|
706
850
|
if (!e) return "";
|
|
707
|
-
const
|
|
708
|
-
let
|
|
709
|
-
for (let
|
|
710
|
-
const
|
|
711
|
-
if (
|
|
851
|
+
const t = e.replace(/[.!?]+$/, "");
|
|
852
|
+
let o = -1;
|
|
853
|
+
for (let r = t.length - 1; r >= 0; r--) {
|
|
854
|
+
const l = t[r];
|
|
855
|
+
if (l === "." || l === "!" || l === "?" || l === `
|
|
712
856
|
`) {
|
|
713
|
-
|
|
857
|
+
o = r + 1;
|
|
714
858
|
break;
|
|
715
859
|
}
|
|
716
860
|
}
|
|
717
|
-
return
|
|
861
|
+
return o === -1 ? "" : `${t.slice(0, o)} `.replace(/\n $/, `
|
|
718
862
|
`);
|
|
719
863
|
}
|
|
720
|
-
const
|
|
864
|
+
const ze = new RegExp(
|
|
721
865
|
String.raw`(^- |\n(?:- )?)(\p{Ll})`,
|
|
722
866
|
"gu"
|
|
723
867
|
);
|
|
724
|
-
function
|
|
868
|
+
function Ce(n) {
|
|
725
869
|
return n.replace(
|
|
726
|
-
|
|
727
|
-
(e,
|
|
870
|
+
ze,
|
|
871
|
+
(e, t, o) => t + o.toUpperCase()
|
|
728
872
|
);
|
|
729
873
|
}
|
|
730
|
-
function
|
|
874
|
+
function xe(n) {
|
|
731
875
|
return n.length <= 3 && /^\s*$/.test(n) ? !0 : /[.!?\n]\s{0,3}$/.test(n.slice(-6));
|
|
732
876
|
}
|
|
733
|
-
class
|
|
877
|
+
class q {
|
|
734
878
|
/**
|
|
735
879
|
* Process the full raw transcript accumulated so far into insertable text.
|
|
736
880
|
* Pure and deterministic: always called with the entire raw string so the
|
|
737
881
|
* result never depends on delta chunking.
|
|
738
882
|
*/
|
|
739
|
-
static process(e,
|
|
740
|
-
const
|
|
741
|
-
let
|
|
742
|
-
for (const
|
|
743
|
-
const [, p = ""] =
|
|
883
|
+
static process(e, t) {
|
|
884
|
+
const o = I(t == null ? void 0 : t.language), r = t != null && t.final ? "" : q.commandPrefixTail(e, t == null ? void 0 : t.language), l = e.slice(0, e.length - r.length), s = t != null && t.final ? o.finalRegex : o.regex;
|
|
885
|
+
let a = "", i = null, c = 0;
|
|
886
|
+
for (const _ of Array.from(l.matchAll(s))) {
|
|
887
|
+
const [, p = ""] = _, u = o.phraseToAction.get(p.toLowerCase());
|
|
744
888
|
if (u)
|
|
745
|
-
if (
|
|
889
|
+
if (a += l.slice(c, _.index), c = _.index + _[0].length, u === "newline") a = `${a.replace(/[ \t]+$/, "")}
|
|
746
890
|
`;
|
|
747
891
|
else if (u === "newparagraph")
|
|
748
|
-
|
|
892
|
+
a = `${a.replace(/[ \t]+$/, "")}
|
|
749
893
|
|
|
750
894
|
`;
|
|
751
895
|
else if (u === "bullet") {
|
|
752
|
-
const m =
|
|
753
|
-
|
|
896
|
+
const m = a.replace(/[ \t]+$/, "");
|
|
897
|
+
a = m === "" || m.endsWith(`
|
|
754
898
|
`) ? `${m}- ` : `${m}
|
|
755
899
|
- `;
|
|
756
|
-
} else if (u === "scratch")
|
|
900
|
+
} else if (u === "scratch") a = Se(a);
|
|
757
901
|
else {
|
|
758
|
-
|
|
902
|
+
i = u === "send" ? "send" : "stop";
|
|
759
903
|
break;
|
|
760
904
|
}
|
|
761
905
|
}
|
|
762
|
-
return
|
|
763
|
-
|
|
906
|
+
return i === null && (a += l.slice(c)), { text: Ce(
|
|
907
|
+
a.replace(/^\s+/, "").replace(/[ \t]+\n/g, `
|
|
764
908
|
`).replace(/\n[ \t]+/g, `
|
|
765
909
|
`).replace(/(^|\n)- +/g, "$1- ").replace(/ {2,}/g, " ").replace(/\n{3,}/g, `
|
|
766
910
|
|
|
767
911
|
`)
|
|
768
|
-
), pendingTail:
|
|
912
|
+
), pendingTail: r, control: i };
|
|
769
913
|
}
|
|
770
914
|
/**
|
|
771
915
|
* Longest suffix of `raw` that could still become a command — a proper
|
|
@@ -776,16 +920,16 @@ class C {
|
|
|
776
920
|
* control command from an intermediate delta would stop or submit
|
|
777
921
|
* mid-sentence.
|
|
778
922
|
*/
|
|
779
|
-
static commandPrefixTail(e,
|
|
780
|
-
const
|
|
781
|
-
for (let
|
|
782
|
-
const
|
|
783
|
-
if (!
|
|
784
|
-
const
|
|
785
|
-
if (
|
|
786
|
-
for (const c of Array.from(
|
|
787
|
-
if (c.startsWith(
|
|
788
|
-
return e.slice(
|
|
923
|
+
static commandPrefixTail(e, t) {
|
|
924
|
+
const o = I(t), r = Math.min(e.length, o.longestPhrase + 2);
|
|
925
|
+
for (let l = r; l > 0; l--) {
|
|
926
|
+
const s = e.length - l;
|
|
927
|
+
if (!xe(e.slice(0, s))) continue;
|
|
928
|
+
const a = e.slice(s).toLowerCase(), i = a.replace(/^\s+/, "");
|
|
929
|
+
if (i) {
|
|
930
|
+
for (const c of Array.from(o.phraseToAction.keys()))
|
|
931
|
+
if (c.startsWith(i))
|
|
932
|
+
return e.slice(s + (a.length - i.length));
|
|
789
933
|
}
|
|
790
934
|
}
|
|
791
935
|
return "";
|
|
@@ -795,13 +939,13 @@ class C {
|
|
|
795
939
|
* prefix) — i.e. a silence pause would resolve it into a command. Used by
|
|
796
940
|
* the manager's silence timer.
|
|
797
941
|
*/
|
|
798
|
-
static pendingTailIsCompletePhrase(e,
|
|
799
|
-
const
|
|
800
|
-
return
|
|
942
|
+
static pendingTailIsCompletePhrase(e, t) {
|
|
943
|
+
const o = q.commandPrefixTail(e, t).trim().toLowerCase();
|
|
944
|
+
return o ? I(t).phraseToAction.has(o) : !1;
|
|
801
945
|
}
|
|
802
946
|
}
|
|
803
|
-
const
|
|
804
|
-
class
|
|
947
|
+
const qe = 55, Ee = 90;
|
|
948
|
+
class H {
|
|
805
949
|
/**
|
|
806
950
|
* Next paced step toward `processed`: normally one word per tick so text
|
|
807
951
|
* flows evenly instead of landing in bursty chunks; proportionally larger
|
|
@@ -810,28 +954,28 @@ class B {
|
|
|
810
954
|
*/
|
|
811
955
|
static nextDripText({
|
|
812
956
|
displayed: e,
|
|
813
|
-
processed:
|
|
957
|
+
processed: t
|
|
814
958
|
}) {
|
|
815
|
-
if (
|
|
816
|
-
const
|
|
817
|
-
if (
|
|
818
|
-
return
|
|
819
|
-
let
|
|
820
|
-
for (;
|
|
821
|
-
for (;
|
|
822
|
-
return
|
|
959
|
+
if (t.length <= e.length) return t;
|
|
960
|
+
const o = t.length - e.length;
|
|
961
|
+
if (o > Ee)
|
|
962
|
+
return t.slice(0, e.length + Math.ceil(o / 3));
|
|
963
|
+
let r = e.length;
|
|
964
|
+
for (; r < t.length && /\s/.test(t.charAt(r)); ) r++;
|
|
965
|
+
for (; r < t.length && !/\s/.test(t.charAt(r)); ) r++;
|
|
966
|
+
return r - e.length > 12 && (r = e.length + 6), t.slice(0, Math.max(r, e.length + 1));
|
|
823
967
|
}
|
|
824
968
|
/** Normalize a BCP-47 browser locale into the hint OpenAI accepts. */
|
|
825
969
|
static languageHint(e) {
|
|
826
970
|
if (!e) return;
|
|
827
|
-
const
|
|
828
|
-
if (/^zh-(cn|tw|hk)$/.test(
|
|
829
|
-
const
|
|
830
|
-
return
|
|
971
|
+
const t = e.toLowerCase();
|
|
972
|
+
if (/^zh-(cn|tw|hk)$/.test(t)) return t;
|
|
973
|
+
const o = t.split("-")[0];
|
|
974
|
+
return o && /^[a-z]{2,3}$/.test(o) ? o : void 0;
|
|
831
975
|
}
|
|
832
976
|
}
|
|
833
|
-
const
|
|
834
|
-
class
|
|
977
|
+
const Ae = 2e4;
|
|
978
|
+
class Pe {
|
|
835
979
|
constructor() {
|
|
836
980
|
this.cached = null, this.inflight = null;
|
|
837
981
|
}
|
|
@@ -839,15 +983,15 @@ class ze {
|
|
|
839
983
|
get() {
|
|
840
984
|
if (!this.cached) return null;
|
|
841
985
|
const e = Date.parse(this.cached.expiresAt);
|
|
842
|
-
return Number.isNaN(e) || e - Date.now() <
|
|
986
|
+
return Number.isNaN(e) || e - Date.now() < Ae ? (this.cached = null, null) : this.cached;
|
|
843
987
|
}
|
|
844
988
|
/**
|
|
845
989
|
* Resolve a mint, deduping concurrent requests (hover-prewarm racing a
|
|
846
990
|
* click reuses the same in-flight promise instead of double-minting).
|
|
847
991
|
*/
|
|
848
992
|
async resolve(e) {
|
|
849
|
-
const
|
|
850
|
-
return
|
|
993
|
+
const t = this.get();
|
|
994
|
+
return t || (this.inflight || (this.inflight = e().then((o) => (this.cached = o, o)).finally(() => {
|
|
851
995
|
this.inflight = null;
|
|
852
996
|
})), this.inflight);
|
|
853
997
|
}
|
|
@@ -856,89 +1000,89 @@ class ze {
|
|
|
856
1000
|
this.cached = null;
|
|
857
1001
|
}
|
|
858
1002
|
}
|
|
859
|
-
function
|
|
1003
|
+
function Z(n) {
|
|
860
1004
|
return typeof n == "object" && n !== null && !Array.isArray(n);
|
|
861
1005
|
}
|
|
862
|
-
function
|
|
863
|
-
if (!
|
|
864
|
-
const e =
|
|
1006
|
+
function Te(n) {
|
|
1007
|
+
if (!Z(n) || typeof n.type != "string") return null;
|
|
1008
|
+
const e = Z(n.error) ? n.error : null;
|
|
865
1009
|
return {
|
|
866
1010
|
type: n.type,
|
|
867
1011
|
delta: typeof n.delta == "string" ? n.delta : void 0,
|
|
868
1012
|
errorMessage: e && typeof e.message == "string" ? e.message : void 0
|
|
869
1013
|
};
|
|
870
1014
|
}
|
|
871
|
-
const
|
|
872
|
-
class
|
|
1015
|
+
const Ie = "https://api.openai.com/v1/realtime/calls", Me = 600 * 1e3, De = 15e3, Ne = 5e3;
|
|
1016
|
+
class P extends Error {
|
|
873
1017
|
}
|
|
874
|
-
class
|
|
1018
|
+
class Re {
|
|
875
1019
|
constructor({
|
|
876
1020
|
mintToken: e,
|
|
877
|
-
onDelta:
|
|
878
|
-
onState:
|
|
879
|
-
onError:
|
|
880
|
-
onLevel:
|
|
1021
|
+
onDelta: t,
|
|
1022
|
+
onState: o,
|
|
1023
|
+
onError: r,
|
|
1024
|
+
onLevel: l
|
|
881
1025
|
}) {
|
|
882
|
-
this.state = "idle", this.pc = null, this.dc = null, this.stream = null, this.audioContext = null, this.levelRaf = 0, this.timers = [], this.loggedParseFailure = !1, this.mintToken = e, this.onDelta =
|
|
1026
|
+
this.state = "idle", this.pc = null, this.dc = null, this.stream = null, this.audioContext = null, this.levelRaf = 0, this.timers = [], this.loggedParseFailure = !1, this.mintToken = e, this.onDelta = t, this.onState = o, this.onError = r, this.onLevel = l;
|
|
883
1027
|
}
|
|
884
1028
|
async start() {
|
|
885
1029
|
if (this.state === "idle") {
|
|
886
1030
|
this.setState("connecting"), this.timers.push(
|
|
887
1031
|
setTimeout(() => {
|
|
888
1032
|
this.state === "connecting" && this.fail("unavailable");
|
|
889
|
-
},
|
|
890
|
-
), this.timers.push(setTimeout(() => this.stop(),
|
|
1033
|
+
}, De)
|
|
1034
|
+
), this.timers.push(setTimeout(() => this.stop(), Me));
|
|
891
1035
|
try {
|
|
892
1036
|
const e = this.requestMicrophone();
|
|
893
1037
|
e.then((d) => {
|
|
894
|
-
(this.isTornDown() || this.stream && this.stream !== d) && d.getTracks().forEach((
|
|
1038
|
+
(this.isTornDown() || this.stream && this.stream !== d) && d.getTracks().forEach((_) => _.stop());
|
|
895
1039
|
}).catch(() => {
|
|
896
1040
|
});
|
|
897
|
-
const [
|
|
1041
|
+
const [t, o] = await Promise.all([e, this.mintToken()]);
|
|
898
1042
|
if (this.isTornDown()) {
|
|
899
|
-
|
|
1043
|
+
t.getTracks().forEach((d) => d.stop());
|
|
900
1044
|
return;
|
|
901
1045
|
}
|
|
902
|
-
this.stream =
|
|
903
|
-
const
|
|
904
|
-
this.pc =
|
|
905
|
-
const [
|
|
906
|
-
if (!
|
|
907
|
-
|
|
908
|
-
const
|
|
909
|
-
this.dc =
|
|
1046
|
+
this.stream = t, this.startLevelMeter(t);
|
|
1047
|
+
const r = new RTCPeerConnection();
|
|
1048
|
+
this.pc = r;
|
|
1049
|
+
const [l] = t.getAudioTracks();
|
|
1050
|
+
if (!l) throw new P("No audio track");
|
|
1051
|
+
r.addTrack(l, t);
|
|
1052
|
+
const s = r.createDataChannel("oai-events");
|
|
1053
|
+
this.dc = s, s.addEventListener(
|
|
910
1054
|
"message",
|
|
911
1055
|
(d) => this.handleServerEvent(d.data)
|
|
912
|
-
),
|
|
1056
|
+
), s.addEventListener("open", () => {
|
|
913
1057
|
this.state === "connecting" && this.setState("listening");
|
|
914
|
-
}),
|
|
915
|
-
if (
|
|
1058
|
+
}), r.addEventListener("connectionstatechange", () => {
|
|
1059
|
+
if (r.connectionState === "failed") {
|
|
916
1060
|
this.fail("unavailable");
|
|
917
1061
|
return;
|
|
918
1062
|
}
|
|
919
|
-
|
|
1063
|
+
r.connectionState === "disconnected" && this.timers.push(
|
|
920
1064
|
setTimeout(() => {
|
|
921
|
-
this.pc ===
|
|
922
|
-
},
|
|
1065
|
+
this.pc === r && r.connectionState !== "connected" && this.fail("unavailable");
|
|
1066
|
+
}, Ne)
|
|
923
1067
|
);
|
|
924
1068
|
});
|
|
925
|
-
const
|
|
926
|
-
await
|
|
927
|
-
const
|
|
1069
|
+
const a = await r.createOffer();
|
|
1070
|
+
await r.setLocalDescription(a);
|
|
1071
|
+
const i = await fetch(Ie, {
|
|
928
1072
|
method: "POST",
|
|
929
1073
|
headers: {
|
|
930
|
-
Authorization: `Bearer ${
|
|
1074
|
+
Authorization: `Bearer ${o.token}`,
|
|
931
1075
|
"Content-Type": "application/sdp"
|
|
932
1076
|
},
|
|
933
|
-
body:
|
|
1077
|
+
body: a.sdp
|
|
934
1078
|
});
|
|
935
|
-
if (!
|
|
936
|
-
throw new Error(`Realtime handshake failed (${
|
|
937
|
-
const c = await
|
|
1079
|
+
if (!i.ok)
|
|
1080
|
+
throw new Error(`Realtime handshake failed (${i.status})`);
|
|
1081
|
+
const c = await i.text();
|
|
938
1082
|
if (this.isTornDown()) return;
|
|
939
|
-
await
|
|
1083
|
+
await r.setRemoteDescription({ type: "answer", sdp: c });
|
|
940
1084
|
} catch (e) {
|
|
941
|
-
e instanceof
|
|
1085
|
+
e instanceof P ? this.fail("microphone") : (k.error("dictation session failed to start", {
|
|
942
1086
|
_e: e instanceof Error ? e.message : String(e)
|
|
943
1087
|
}), this.fail("unavailable"));
|
|
944
1088
|
}
|
|
@@ -950,7 +1094,7 @@ class Ee {
|
|
|
950
1094
|
async requestMicrophone() {
|
|
951
1095
|
var e;
|
|
952
1096
|
if (!((e = navigator.mediaDevices) != null && e.getUserMedia))
|
|
953
|
-
throw new
|
|
1097
|
+
throw new P("Microphone is not supported");
|
|
954
1098
|
try {
|
|
955
1099
|
return await navigator.mediaDevices.getUserMedia({
|
|
956
1100
|
audio: {
|
|
@@ -959,60 +1103,60 @@ class Ee {
|
|
|
959
1103
|
autoGainControl: !0
|
|
960
1104
|
}
|
|
961
1105
|
});
|
|
962
|
-
} catch (
|
|
963
|
-
throw new
|
|
964
|
-
|
|
1106
|
+
} catch (t) {
|
|
1107
|
+
throw new P(
|
|
1108
|
+
t instanceof DOMException ? t.name : "Could not access the microphone"
|
|
965
1109
|
);
|
|
966
1110
|
}
|
|
967
1111
|
}
|
|
968
1112
|
handleServerEvent(e) {
|
|
969
1113
|
if (typeof e != "string") return;
|
|
970
|
-
let
|
|
1114
|
+
let t;
|
|
971
1115
|
try {
|
|
972
|
-
|
|
1116
|
+
t = JSON.parse(e);
|
|
973
1117
|
} catch {
|
|
974
|
-
this.loggedParseFailure || (this.loggedParseFailure = !0,
|
|
1118
|
+
this.loggedParseFailure || (this.loggedParseFailure = !0, k.error("dictation server event was not valid JSON", {
|
|
975
1119
|
snippet: e.slice(0, 120)
|
|
976
1120
|
}));
|
|
977
1121
|
return;
|
|
978
1122
|
}
|
|
979
|
-
const
|
|
980
|
-
if (!
|
|
981
|
-
const { type:
|
|
982
|
-
if (
|
|
1123
|
+
const o = Te(t);
|
|
1124
|
+
if (!o) return;
|
|
1125
|
+
const { type: r, delta: l } = o;
|
|
1126
|
+
if (r === "session.created" || r === "transcription_session.created") {
|
|
983
1127
|
this.setState("listening");
|
|
984
1128
|
return;
|
|
985
1129
|
}
|
|
986
|
-
if (
|
|
987
|
-
this.state === "connecting" && this.setState("listening"), this.onDelta(
|
|
1130
|
+
if (r === "conversation.item.input_audio_transcription.delta" && l) {
|
|
1131
|
+
this.state === "connecting" && this.setState("listening"), this.onDelta(l);
|
|
988
1132
|
return;
|
|
989
1133
|
}
|
|
990
|
-
|
|
991
|
-
_e:
|
|
1134
|
+
r === "error" && (k.error("dictation server event error", {
|
|
1135
|
+
_e: o.errorMessage ?? "unknown"
|
|
992
1136
|
}), this.fail("unavailable"));
|
|
993
1137
|
}
|
|
994
1138
|
startLevelMeter(e) {
|
|
995
1139
|
if (this.onLevel)
|
|
996
1140
|
try {
|
|
997
|
-
const
|
|
998
|
-
this.audioContext =
|
|
999
|
-
const
|
|
1000
|
-
|
|
1001
|
-
const
|
|
1141
|
+
const t = new AudioContext();
|
|
1142
|
+
this.audioContext = t;
|
|
1143
|
+
const o = t.createMediaStreamSource(e), r = t.createAnalyser();
|
|
1144
|
+
r.fftSize = 512, o.connect(r);
|
|
1145
|
+
const l = new Uint8Array(r.frequencyBinCount), s = () => {
|
|
1002
1146
|
var c;
|
|
1003
|
-
|
|
1004
|
-
let
|
|
1005
|
-
for (let d = 0; d <
|
|
1006
|
-
const
|
|
1007
|
-
|
|
1147
|
+
r.getByteTimeDomainData(l);
|
|
1148
|
+
let a = 0;
|
|
1149
|
+
for (let d = 0; d < l.length; d++) {
|
|
1150
|
+
const _ = ((l[d] ?? 128) - 128) / 128;
|
|
1151
|
+
a += _ * _;
|
|
1008
1152
|
}
|
|
1009
|
-
const
|
|
1010
|
-
(c = this.onLevel) == null || c.call(this, Math.min(1,
|
|
1153
|
+
const i = Math.sqrt(a / l.length);
|
|
1154
|
+
(c = this.onLevel) == null || c.call(this, Math.min(1, i * 4)), this.levelRaf = requestAnimationFrame(s);
|
|
1011
1155
|
};
|
|
1012
|
-
this.levelRaf = requestAnimationFrame(
|
|
1013
|
-
} catch (
|
|
1014
|
-
|
|
1015
|
-
_e:
|
|
1156
|
+
this.levelRaf = requestAnimationFrame(s);
|
|
1157
|
+
} catch (t) {
|
|
1158
|
+
k.error("dictation level meter unavailable", {
|
|
1159
|
+
_e: t instanceof Error ? t.message : String(t)
|
|
1016
1160
|
});
|
|
1017
1161
|
}
|
|
1018
1162
|
}
|
|
@@ -1023,10 +1167,10 @@ class Ee {
|
|
|
1023
1167
|
this.isTornDown() || (this.teardown(), this.setState("error"), this.onError(e));
|
|
1024
1168
|
}
|
|
1025
1169
|
teardown() {
|
|
1026
|
-
var e,
|
|
1027
|
-
this.timers.forEach((
|
|
1028
|
-
|
|
1029
|
-
_e: String(
|
|
1170
|
+
var e, t, o, r;
|
|
1171
|
+
this.timers.forEach((l) => clearTimeout(l)), this.timers = [], this.levelRaf && cancelAnimationFrame(this.levelRaf), this.levelRaf = 0, (e = this.dc) == null || e.close(), this.dc = null, (t = this.pc) == null || t.close(), this.pc = null, (o = this.stream) == null || o.getTracks().forEach((l) => l.stop()), this.stream = null, (r = this.audioContext) == null || r.close().catch((l) => {
|
|
1172
|
+
k.error("failed to close dictation audio context", {
|
|
1173
|
+
_e: String(l)
|
|
1030
1174
|
});
|
|
1031
1175
|
}), this.audioContext = null;
|
|
1032
1176
|
}
|
|
@@ -1034,76 +1178,76 @@ class Ee {
|
|
|
1034
1178
|
this.state !== e && (this.state = e, this.onState(e));
|
|
1035
1179
|
}
|
|
1036
1180
|
}
|
|
1037
|
-
const
|
|
1038
|
-
class
|
|
1039
|
-
constructor({ api: e, config:
|
|
1040
|
-
this.state = new
|
|
1041
|
-
this.mintToken().catch((
|
|
1042
|
-
this.mintCache.clear(),
|
|
1043
|
-
_e:
|
|
1181
|
+
const Ke = 1300, Le = { status: "idle", error: null };
|
|
1182
|
+
class Fe {
|
|
1183
|
+
constructor({ api: e, config: t }) {
|
|
1184
|
+
this.state = new S(Le), this.levelRef = { current: 0 }, this.mintCache = new Pe(), this.session = null, this.target = null, this.prefix = "", this.raw = "", this.processed = "", this.displayed = "", this.dripTimer = null, this.silenceTimer = null, this.isActive = () => this.session !== null, this.prewarm = () => {
|
|
1185
|
+
this.mintToken().catch((o) => {
|
|
1186
|
+
this.mintCache.clear(), k.error("dictation token prewarm failed", {
|
|
1187
|
+
_e: o instanceof Error ? o.message : String(o)
|
|
1044
1188
|
});
|
|
1045
1189
|
});
|
|
1046
|
-
}, this.start = (
|
|
1047
|
-
this.session && this.teardown(), this.target =
|
|
1190
|
+
}, this.start = (o) => {
|
|
1191
|
+
this.session && this.teardown(), this.target = o, this.language = H.languageHint(
|
|
1048
1192
|
this.config.language ?? navigator.language
|
|
1049
|
-
), this.prefix =
|
|
1050
|
-
const
|
|
1193
|
+
), this.prefix = o.getValue(), this.raw = "", this.processed = "", this.displayed = "";
|
|
1194
|
+
const r = new Re({
|
|
1051
1195
|
mintToken: this.mintToken,
|
|
1052
|
-
onLevel: (
|
|
1053
|
-
this.levelRef.current =
|
|
1196
|
+
onLevel: (l) => {
|
|
1197
|
+
this.levelRef.current = l;
|
|
1054
1198
|
},
|
|
1055
|
-
onState: (
|
|
1056
|
-
|
|
1199
|
+
onState: (l) => {
|
|
1200
|
+
r === this.session && (l === "connecting" && this.state.set({ status: "connecting", error: null }), l === "listening" && this.state.set({ status: "listening", error: null }), l === "stopped" && this.teardown());
|
|
1057
1201
|
},
|
|
1058
|
-
onError: (
|
|
1059
|
-
|
|
1202
|
+
onError: (l) => {
|
|
1203
|
+
r === this.session && (this.mintCache.clear(), this.teardown({ error: l, executeFinalCommand: !1 }));
|
|
1060
1204
|
},
|
|
1061
|
-
onDelta: (
|
|
1062
|
-
if (
|
|
1205
|
+
onDelta: (l) => {
|
|
1206
|
+
if (r !== this.session || !this.target) return;
|
|
1063
1207
|
if (!this.isConsistent()) {
|
|
1064
1208
|
this.teardown();
|
|
1065
1209
|
return;
|
|
1066
1210
|
}
|
|
1067
|
-
this.raw +=
|
|
1068
|
-
const
|
|
1069
|
-
if (
|
|
1211
|
+
this.raw += l;
|
|
1212
|
+
const s = this.ingest();
|
|
1213
|
+
if (s === "stop") {
|
|
1070
1214
|
this.teardown();
|
|
1071
1215
|
return;
|
|
1072
1216
|
}
|
|
1073
|
-
if (
|
|
1217
|
+
if (s === "send") {
|
|
1074
1218
|
this.teardown({ send: !0 });
|
|
1075
1219
|
return;
|
|
1076
1220
|
}
|
|
1077
|
-
this.stopSilenceTimer(),
|
|
1221
|
+
this.stopSilenceTimer(), q.pendingTailIsCompletePhrase(
|
|
1078
1222
|
this.raw,
|
|
1079
1223
|
this.language
|
|
1080
1224
|
) && (this.silenceTimer = setTimeout(() => {
|
|
1081
|
-
if (
|
|
1225
|
+
if (r !== this.session) return;
|
|
1082
1226
|
this.raw = `${this.raw}.`;
|
|
1083
|
-
const
|
|
1084
|
-
|
|
1085
|
-
},
|
|
1227
|
+
const a = this.ingest();
|
|
1228
|
+
a === "stop" ? this.teardown() : a === "send" && this.teardown({ send: !0 });
|
|
1229
|
+
}, Ke));
|
|
1086
1230
|
}
|
|
1087
1231
|
});
|
|
1088
|
-
this.session =
|
|
1232
|
+
this.session = r, this.state.set({ status: "connecting", error: null }), this.dripTimer = setInterval(() => {
|
|
1089
1233
|
if (this.target && this.processed !== this.displayed) {
|
|
1090
1234
|
if (!this.isConsistent()) {
|
|
1091
1235
|
this.teardown();
|
|
1092
1236
|
return;
|
|
1093
1237
|
}
|
|
1094
1238
|
this.applyDisplayed(
|
|
1095
|
-
|
|
1239
|
+
H.nextDripText({
|
|
1096
1240
|
displayed: this.displayed,
|
|
1097
1241
|
processed: this.processed
|
|
1098
1242
|
})
|
|
1099
1243
|
);
|
|
1100
1244
|
}
|
|
1101
|
-
},
|
|
1245
|
+
}, qe), r.start();
|
|
1102
1246
|
}, this.stop = () => {
|
|
1103
1247
|
this.session && this.teardown();
|
|
1104
1248
|
}, this.mintToken = async () => this.mintCache.resolve(
|
|
1105
1249
|
() => this.api.createDictationSession({ language: this.language })
|
|
1106
|
-
), this.api = e, this.config =
|
|
1250
|
+
), this.api = e, this.config = t;
|
|
1107
1251
|
}
|
|
1108
1252
|
/** Applied text = prefix + dictated. A mismatch means the visitor edited. */
|
|
1109
1253
|
isConsistent() {
|
|
@@ -1115,28 +1259,28 @@ class Me {
|
|
|
1115
1259
|
/** Process the transcript and apply the outcome. Shared by the delta path,
|
|
1116
1260
|
* the silence timer, and (with `final`) teardown. Returns the control. */
|
|
1117
1261
|
ingest(e) {
|
|
1118
|
-
const
|
|
1262
|
+
const t = q.process(this.raw, {
|
|
1119
1263
|
language: this.language,
|
|
1120
1264
|
final: e == null ? void 0 : e.final
|
|
1121
1265
|
});
|
|
1122
|
-
return this.processed =
|
|
1266
|
+
return this.processed = t.text, t.text.startsWith(this.displayed) || this.applyDisplayed(t.text), t.control;
|
|
1123
1267
|
}
|
|
1124
1268
|
stopSilenceTimer() {
|
|
1125
1269
|
this.silenceTimer && clearTimeout(this.silenceTimer), this.silenceTimer = null;
|
|
1126
1270
|
}
|
|
1127
1271
|
teardown(e) {
|
|
1128
|
-
var
|
|
1129
|
-
const
|
|
1272
|
+
var l;
|
|
1273
|
+
const t = this.session, o = this.target;
|
|
1130
1274
|
this.dripTimer && clearInterval(this.dripTimer), this.dripTimer = null, this.stopSilenceTimer();
|
|
1131
|
-
let
|
|
1132
|
-
if (
|
|
1133
|
-
const
|
|
1134
|
-
(e == null ? void 0 : e.executeFinalCommand) !== !1 &&
|
|
1275
|
+
let r = (e == null ? void 0 : e.send) ?? !1;
|
|
1276
|
+
if (o && this.isConsistent()) {
|
|
1277
|
+
const s = this.ingest({ final: !0 });
|
|
1278
|
+
(e == null ? void 0 : e.executeFinalCommand) !== !1 && s === "send" && (r = !0), this.processed !== this.displayed && this.applyDisplayed(this.processed);
|
|
1135
1279
|
}
|
|
1136
|
-
this.session = null, this.target = null,
|
|
1280
|
+
this.session = null, this.target = null, t == null || t.stop(), this.levelRef.current = 0, this.state.set({ status: "idle", error: (e == null ? void 0 : e.error) ?? null }), r && ((l = o == null ? void 0 : o.onSend) == null || l.call(o));
|
|
1137
1281
|
}
|
|
1138
1282
|
}
|
|
1139
|
-
const
|
|
1283
|
+
const Oe = {
|
|
1140
1284
|
write_a_message_placeholder: "اكتب رسالة...",
|
|
1141
1285
|
your_issue_has_been_resolved: "تم حل مشكلتك!",
|
|
1142
1286
|
new_conversation: "محادثة جديدة",
|
|
@@ -1245,7 +1389,7 @@ const Ie = {
|
|
|
1245
1389
|
zoom_out: "تصغير",
|
|
1246
1390
|
reset_zoom: "إعادة تعيين التكبير",
|
|
1247
1391
|
support_chat_aria_label: "دردشة الدعم"
|
|
1248
|
-
},
|
|
1392
|
+
}, Ue = {
|
|
1249
1393
|
write_a_message_placeholder: "একটি বার্তা লিখুন...",
|
|
1250
1394
|
your_issue_has_been_resolved: "আপনার সমস্যা সমাধান হয়েছে!",
|
|
1251
1395
|
new_conversation: "নতুন কথোপকথন",
|
|
@@ -1342,7 +1486,7 @@ const Ie = {
|
|
|
1342
1486
|
zoom_out: "ছোট করুন",
|
|
1343
1487
|
reset_zoom: "জুম রিসেট করুন",
|
|
1344
1488
|
support_chat_aria_label: "সাপোর্ট চ্যাট"
|
|
1345
|
-
},
|
|
1489
|
+
}, Be = {
|
|
1346
1490
|
write_a_message_placeholder: "Напишете съобщение...",
|
|
1347
1491
|
your_issue_has_been_resolved: "Вашият проблем е разрешен!",
|
|
1348
1492
|
new_conversation: "Нов разговор",
|
|
@@ -1439,7 +1583,7 @@ const Ie = {
|
|
|
1439
1583
|
zoom_out: "Намаляване",
|
|
1440
1584
|
reset_zoom: "Нулиране на мащаба",
|
|
1441
1585
|
support_chat_aria_label: "Чат за поддръжка"
|
|
1442
|
-
},
|
|
1586
|
+
}, Ve = {
|
|
1443
1587
|
write_a_message_placeholder: "Napište zprávu...",
|
|
1444
1588
|
your_issue_has_been_resolved: "Váš problém byl vyřešen!",
|
|
1445
1589
|
new_conversation: "Nová konverzace",
|
|
@@ -1536,7 +1680,7 @@ const Ie = {
|
|
|
1536
1680
|
zoom_out: "Oddálit",
|
|
1537
1681
|
reset_zoom: "Obnovit přiblížení",
|
|
1538
1682
|
support_chat_aria_label: "Chat podpory"
|
|
1539
|
-
},
|
|
1683
|
+
}, He = {
|
|
1540
1684
|
write_a_message_placeholder: "Skriv en besked...",
|
|
1541
1685
|
your_issue_has_been_resolved: "Dit problem er løst!",
|
|
1542
1686
|
new_conversation: "Ny samtale",
|
|
@@ -1633,7 +1777,7 @@ const Ie = {
|
|
|
1633
1777
|
zoom_out: "Zoom ud",
|
|
1634
1778
|
reset_zoom: "Nulstil zoom",
|
|
1635
1779
|
support_chat_aria_label: "Supportchat"
|
|
1636
|
-
},
|
|
1780
|
+
}, Ze = {
|
|
1637
1781
|
write_a_message_placeholder: "Γράψτε ένα μήνυμα...",
|
|
1638
1782
|
your_issue_has_been_resolved: "Το πρόβλημά σας επιλύθηκε!",
|
|
1639
1783
|
new_conversation: "Νέα συνομιλία",
|
|
@@ -1730,7 +1874,7 @@ const Ie = {
|
|
|
1730
1874
|
zoom_out: "Σμίκρυνση",
|
|
1731
1875
|
reset_zoom: "Επαναφορά ζουμ",
|
|
1732
1876
|
support_chat_aria_label: "Συνομιλία υποστήριξης"
|
|
1733
|
-
},
|
|
1877
|
+
}, We = {
|
|
1734
1878
|
write_a_message_placeholder: "Nachricht schreiben...",
|
|
1735
1879
|
your_issue_has_been_resolved: "Ihr Problem wurde gelöst!",
|
|
1736
1880
|
new_conversation: "Neue Konversation",
|
|
@@ -1827,7 +1971,7 @@ const Ie = {
|
|
|
1827
1971
|
zoom_out: "Verkleinern",
|
|
1828
1972
|
reset_zoom: "Zoom zurücksetzen",
|
|
1829
1973
|
support_chat_aria_label: "Support-Chat"
|
|
1830
|
-
},
|
|
1974
|
+
}, J = {
|
|
1831
1975
|
write_a_message_placeholder: "Write a message...",
|
|
1832
1976
|
your_issue_has_been_resolved: "Your issue has been resolved!",
|
|
1833
1977
|
new_conversation: "New conversation",
|
|
@@ -1936,7 +2080,7 @@ const Ie = {
|
|
|
1936
2080
|
zoom_out: "Zoom out",
|
|
1937
2081
|
reset_zoom: "Reset zoom",
|
|
1938
2082
|
support_chat_aria_label: "Support chat"
|
|
1939
|
-
},
|
|
2083
|
+
}, Ge = {
|
|
1940
2084
|
write_a_message_placeholder: "Escribe un mensaje...",
|
|
1941
2085
|
your_issue_has_been_resolved: "¡Tu problema fue resuelto!",
|
|
1942
2086
|
new_conversation: "Nueva conversación",
|
|
@@ -2033,7 +2177,7 @@ const Ie = {
|
|
|
2033
2177
|
zoom_out: "Alejar",
|
|
2034
2178
|
reset_zoom: "Restablecer zoom",
|
|
2035
2179
|
support_chat_aria_label: "Chat de soporte"
|
|
2036
|
-
},
|
|
2180
|
+
}, $e = {
|
|
2037
2181
|
write_a_message_placeholder: "Magsulat ng mensahe...",
|
|
2038
2182
|
your_issue_has_been_resolved: "Nalutas na ang iyong isyu!",
|
|
2039
2183
|
new_conversation: "Bagong usapan",
|
|
@@ -2130,7 +2274,7 @@ const Ie = {
|
|
|
2130
2274
|
zoom_out: "Paliitin",
|
|
2131
2275
|
reset_zoom: "I-reset ang zoom",
|
|
2132
2276
|
support_chat_aria_label: "Chat ng suporta"
|
|
2133
|
-
},
|
|
2277
|
+
}, Je = {
|
|
2134
2278
|
write_a_message_placeholder: "Kirjoita viesti...",
|
|
2135
2279
|
your_issue_has_been_resolved: "Ongelmasi on ratkaistu!",
|
|
2136
2280
|
new_conversation: "Uusi keskustelu",
|
|
@@ -2227,7 +2371,7 @@ const Ie = {
|
|
|
2227
2371
|
zoom_out: "Loitonna",
|
|
2228
2372
|
reset_zoom: "Palauta zoomaus",
|
|
2229
2373
|
support_chat_aria_label: "Tukichat"
|
|
2230
|
-
},
|
|
2374
|
+
}, Ye = {
|
|
2231
2375
|
write_a_message_placeholder: "Écrivez un message...",
|
|
2232
2376
|
your_issue_has_been_resolved: "Votre problème a été résolu !",
|
|
2233
2377
|
new_conversation: "Nouvelle conversation",
|
|
@@ -2324,7 +2468,7 @@ const Ie = {
|
|
|
2324
2468
|
zoom_out: "Zoom arrière",
|
|
2325
2469
|
reset_zoom: "Réinitialiser le zoom",
|
|
2326
2470
|
support_chat_aria_label: "Chat de support"
|
|
2327
|
-
},
|
|
2471
|
+
}, Qe = {
|
|
2328
2472
|
write_a_message_placeholder: "एक संदेश लिखें...",
|
|
2329
2473
|
your_issue_has_been_resolved: "आपकी समस्या हल हो गई है!",
|
|
2330
2474
|
new_conversation: "नई बातचीत",
|
|
@@ -2421,7 +2565,7 @@ const Ie = {
|
|
|
2421
2565
|
zoom_out: "ज़ूम आउट",
|
|
2422
2566
|
reset_zoom: "ज़ूम रीसेट करें",
|
|
2423
2567
|
support_chat_aria_label: "सहायता चैट"
|
|
2424
|
-
},
|
|
2568
|
+
}, Xe = {
|
|
2425
2569
|
write_a_message_placeholder: "Scrivi un messaggio...",
|
|
2426
2570
|
your_issue_has_been_resolved: "Il tuo problema è stato risolto!",
|
|
2427
2571
|
new_conversation: "Nuova conversazione",
|
|
@@ -2518,7 +2662,7 @@ const Ie = {
|
|
|
2518
2662
|
zoom_out: "Riduci",
|
|
2519
2663
|
reset_zoom: "Reimposta zoom",
|
|
2520
2664
|
support_chat_aria_label: "Chat di supporto"
|
|
2521
|
-
},
|
|
2665
|
+
}, ea = {
|
|
2522
2666
|
write_a_message_placeholder: "メッセージを入力...",
|
|
2523
2667
|
your_issue_has_been_resolved: "問題が解決しました!",
|
|
2524
2668
|
new_conversation: "新しい会話",
|
|
@@ -2615,7 +2759,7 @@ const Ie = {
|
|
|
2615
2759
|
zoom_out: "縮小",
|
|
2616
2760
|
reset_zoom: "ズームをリセット",
|
|
2617
2761
|
support_chat_aria_label: "サポートチャット"
|
|
2618
|
-
},
|
|
2762
|
+
}, aa = {
|
|
2619
2763
|
write_a_message_placeholder: "메시지를 입력하세요...",
|
|
2620
2764
|
your_issue_has_been_resolved: "문제가 해결되었습니다!",
|
|
2621
2765
|
new_conversation: "새 대화",
|
|
@@ -2712,7 +2856,7 @@ const Ie = {
|
|
|
2712
2856
|
zoom_out: "축소",
|
|
2713
2857
|
reset_zoom: "확대/축소 초기화",
|
|
2714
2858
|
support_chat_aria_label: "고객 지원 채팅"
|
|
2715
|
-
},
|
|
2859
|
+
}, ta = {
|
|
2716
2860
|
write_a_message_placeholder: "Schrijf een bericht...",
|
|
2717
2861
|
your_issue_has_been_resolved: "Uw probleem is opgelost!",
|
|
2718
2862
|
new_conversation: "Nieuw gesprek",
|
|
@@ -2809,7 +2953,7 @@ const Ie = {
|
|
|
2809
2953
|
zoom_out: "Uitzoomen",
|
|
2810
2954
|
reset_zoom: "Zoom herstellen",
|
|
2811
2955
|
support_chat_aria_label: "Supportchat"
|
|
2812
|
-
},
|
|
2956
|
+
}, sa = {
|
|
2813
2957
|
write_a_message_placeholder: "Skriv en melding...",
|
|
2814
2958
|
your_issue_has_been_resolved: "Problemet ditt er løst!",
|
|
2815
2959
|
new_conversation: "Ny samtale",
|
|
@@ -2906,7 +3050,7 @@ const Ie = {
|
|
|
2906
3050
|
zoom_out: "Zoom ut",
|
|
2907
3051
|
reset_zoom: "Tilbakestill zoom",
|
|
2908
3052
|
support_chat_aria_label: "Support-chat"
|
|
2909
|
-
},
|
|
3053
|
+
}, oa = {
|
|
2910
3054
|
write_a_message_placeholder: "Napisz wiadomość...",
|
|
2911
3055
|
your_issue_has_been_resolved: "Twój problem został rozwiązany!",
|
|
2912
3056
|
new_conversation: "Nowa rozmowa",
|
|
@@ -3003,7 +3147,7 @@ const Ie = {
|
|
|
3003
3147
|
zoom_out: "Pomniejsz",
|
|
3004
3148
|
reset_zoom: "Resetuj powiększenie",
|
|
3005
3149
|
support_chat_aria_label: "Czat pomocy"
|
|
3006
|
-
},
|
|
3150
|
+
}, na = {
|
|
3007
3151
|
write_a_message_placeholder: "Escreva uma mensagem...",
|
|
3008
3152
|
your_issue_has_been_resolved: "Seu problema foi resolvido!",
|
|
3009
3153
|
new_conversation: "Nova conversa",
|
|
@@ -3100,7 +3244,7 @@ const Ie = {
|
|
|
3100
3244
|
zoom_out: "Reduzir",
|
|
3101
3245
|
reset_zoom: "Redefinir zoom",
|
|
3102
3246
|
support_chat_aria_label: "Chat de suporte"
|
|
3103
|
-
},
|
|
3247
|
+
}, ia = {
|
|
3104
3248
|
write_a_message_placeholder: "Scrie un mesaj...",
|
|
3105
3249
|
your_issue_has_been_resolved: "Problema ta a fost rezolvată!",
|
|
3106
3250
|
new_conversation: "Conversație nouă",
|
|
@@ -3197,7 +3341,7 @@ const Ie = {
|
|
|
3197
3341
|
zoom_out: "Micșorează",
|
|
3198
3342
|
reset_zoom: "Resetează zoomul",
|
|
3199
3343
|
support_chat_aria_label: "Chat de asistență"
|
|
3200
|
-
},
|
|
3344
|
+
}, ra = {
|
|
3201
3345
|
write_a_message_placeholder: "Skriv ett meddelande...",
|
|
3202
3346
|
your_issue_has_been_resolved: "Ditt problem har lösts!",
|
|
3203
3347
|
new_conversation: "Ny konversation",
|
|
@@ -3294,7 +3438,7 @@ const Ie = {
|
|
|
3294
3438
|
zoom_out: "Zooma ut",
|
|
3295
3439
|
reset_zoom: "Återställ zoom",
|
|
3296
3440
|
support_chat_aria_label: "Supportchatt"
|
|
3297
|
-
},
|
|
3441
|
+
}, _a = {
|
|
3298
3442
|
write_a_message_placeholder: "Напишите сообщение...",
|
|
3299
3443
|
your_issue_has_been_resolved: "Ваша проблема решена!",
|
|
3300
3444
|
new_conversation: "Новый разговор",
|
|
@@ -3391,7 +3535,7 @@ const Ie = {
|
|
|
3391
3535
|
zoom_out: "Уменьшить",
|
|
3392
3536
|
reset_zoom: "Сбросить масштаб",
|
|
3393
3537
|
support_chat_aria_label: "Чат поддержки"
|
|
3394
|
-
},
|
|
3538
|
+
}, la = {
|
|
3395
3539
|
write_a_message_placeholder: "เขียนข้อความ...",
|
|
3396
3540
|
your_issue_has_been_resolved: "ปัญหาของคุณได้รับการแก้ไขแล้ว!",
|
|
3397
3541
|
new_conversation: "การสนทนาใหม่",
|
|
@@ -3488,7 +3632,7 @@ const Ie = {
|
|
|
3488
3632
|
zoom_out: "ย่อ",
|
|
3489
3633
|
reset_zoom: "รีเซ็ตการซูม",
|
|
3490
3634
|
support_chat_aria_label: "แชทฝ่ายสนับสนุน"
|
|
3491
|
-
},
|
|
3635
|
+
}, ca = {
|
|
3492
3636
|
write_a_message_placeholder: "Bir mesaj yazın...",
|
|
3493
3637
|
your_issue_has_been_resolved: "Sorununuz çözüldü!",
|
|
3494
3638
|
new_conversation: "Yeni konuşma",
|
|
@@ -3585,7 +3729,7 @@ const Ie = {
|
|
|
3585
3729
|
zoom_out: "Uzaklaştır",
|
|
3586
3730
|
reset_zoom: "Yakınlaştırmayı sıfırla",
|
|
3587
3731
|
support_chat_aria_label: "Destek sohbeti"
|
|
3588
|
-
},
|
|
3732
|
+
}, pa = {
|
|
3589
3733
|
write_a_message_placeholder: "پیغام لکھیں...",
|
|
3590
3734
|
your_issue_has_been_resolved: "آپ کا مسئلہ حل ہو گیا ہے!",
|
|
3591
3735
|
new_conversation: "نئی گفتگو",
|
|
@@ -3682,7 +3826,7 @@ const Ie = {
|
|
|
3682
3826
|
zoom_out: "زوم آؤٹ",
|
|
3683
3827
|
reset_zoom: "زوم دوبارہ ترتیب دیں",
|
|
3684
3828
|
support_chat_aria_label: "سپورٹ چیٹ"
|
|
3685
|
-
},
|
|
3829
|
+
}, da = {
|
|
3686
3830
|
write_a_message_placeholder: "Viết tin nhắn...",
|
|
3687
3831
|
your_issue_has_been_resolved: "Vấn đề của bạn đã được giải quyết!",
|
|
3688
3832
|
new_conversation: "Cuộc trò chuyện mới",
|
|
@@ -3779,7 +3923,7 @@ const Ie = {
|
|
|
3779
3923
|
zoom_out: "Thu nhỏ",
|
|
3780
3924
|
reset_zoom: "Đặt lại thu phóng",
|
|
3781
3925
|
support_chat_aria_label: "Trò chuyện hỗ trợ"
|
|
3782
|
-
},
|
|
3926
|
+
}, ua = {
|
|
3783
3927
|
write_a_message_placeholder: "写一条消息...",
|
|
3784
3928
|
your_issue_has_been_resolved: "您的问题已解决!",
|
|
3785
3929
|
new_conversation: "新对话",
|
|
@@ -3876,7 +4020,7 @@ const Ie = {
|
|
|
3876
4020
|
zoom_out: "缩小",
|
|
3877
4021
|
reset_zoom: "重置缩放",
|
|
3878
4022
|
support_chat_aria_label: "支持对话"
|
|
3879
|
-
},
|
|
4023
|
+
}, ma = {
|
|
3880
4024
|
write_a_message_placeholder: "Napišite poruku...",
|
|
3881
4025
|
your_issue_has_been_resolved: "Vaš problem je riješen!",
|
|
3882
4026
|
new_conversation: "Novi razgovor",
|
|
@@ -3973,7 +4117,7 @@ const Ie = {
|
|
|
3973
4117
|
zoom_out: "Udalji",
|
|
3974
4118
|
reset_zoom: "Poništi zumiranje",
|
|
3975
4119
|
support_chat_aria_label: "Chat za podršku"
|
|
3976
|
-
},
|
|
4120
|
+
}, ha = {
|
|
3977
4121
|
write_a_message_placeholder: "Kirjuta sõnum...",
|
|
3978
4122
|
your_issue_has_been_resolved: "Teie probleem on lahendatud!",
|
|
3979
4123
|
new_conversation: "Uus vestlus",
|
|
@@ -4070,7 +4214,7 @@ const Ie = {
|
|
|
4070
4214
|
zoom_out: "Vähenda",
|
|
4071
4215
|
reset_zoom: "Lähtesta suurendus",
|
|
4072
4216
|
support_chat_aria_label: "Tugivestlus"
|
|
4073
|
-
},
|
|
4217
|
+
}, ga = {
|
|
4074
4218
|
write_a_message_placeholder: "Írjon üzenetet...",
|
|
4075
4219
|
your_issue_has_been_resolved: "A problémája megoldódott!",
|
|
4076
4220
|
new_conversation: "Új beszélgetés",
|
|
@@ -4167,7 +4311,7 @@ const Ie = {
|
|
|
4167
4311
|
zoom_out: "Kicsinyítés",
|
|
4168
4312
|
reset_zoom: "Nagyítás visszaállítása",
|
|
4169
4313
|
support_chat_aria_label: "Ügyfélszolgálati chat"
|
|
4170
|
-
},
|
|
4314
|
+
}, ka = {
|
|
4171
4315
|
write_a_message_placeholder: "Skrifaðu skilaboð...",
|
|
4172
4316
|
your_issue_has_been_resolved: "Málið þitt hefur verið leyst!",
|
|
4173
4317
|
new_conversation: "Nýtt samtal",
|
|
@@ -4264,7 +4408,7 @@ const Ie = {
|
|
|
4264
4408
|
zoom_out: "Minnka aðdrátt",
|
|
4265
4409
|
reset_zoom: "Endurstilla aðdrátt",
|
|
4266
4410
|
support_chat_aria_label: "Þjónustuspjall"
|
|
4267
|
-
},
|
|
4411
|
+
}, ba = {
|
|
4268
4412
|
write_a_message_placeholder: "Rakstiet ziņojumu...",
|
|
4269
4413
|
your_issue_has_been_resolved: "Jūsu problēma ir atrisināta!",
|
|
4270
4414
|
new_conversation: "Jauna saruna",
|
|
@@ -4361,7 +4505,7 @@ const Ie = {
|
|
|
4361
4505
|
zoom_out: "Attālināt",
|
|
4362
4506
|
reset_zoom: "Atiestatīt tālummaiņu",
|
|
4363
4507
|
support_chat_aria_label: "Atbalsta tērzēšana"
|
|
4364
|
-
},
|
|
4508
|
+
}, va = {
|
|
4365
4509
|
write_a_message_placeholder: "Parašykite žinutę...",
|
|
4366
4510
|
your_issue_has_been_resolved: "Jūsų problema išspręsta!",
|
|
4367
4511
|
new_conversation: "Naujas pokalbis",
|
|
@@ -4458,7 +4602,7 @@ const Ie = {
|
|
|
4458
4602
|
zoom_out: "Nutolinti",
|
|
4459
4603
|
reset_zoom: "Atstatyti mastelį",
|
|
4460
4604
|
support_chat_aria_label: "Pagalbos pokalbis"
|
|
4461
|
-
},
|
|
4605
|
+
}, fa = {
|
|
4462
4606
|
write_a_message_placeholder: "Schreift eng Noriicht...",
|
|
4463
4607
|
your_issue_has_been_resolved: "Äert Problem gouf geléist!",
|
|
4464
4608
|
new_conversation: "Nei Konversatioun",
|
|
@@ -4555,7 +4699,7 @@ const Ie = {
|
|
|
4555
4699
|
zoom_out: "Erauszoomen",
|
|
4556
4700
|
reset_zoom: "Zoom zrécksetzen",
|
|
4557
4701
|
support_chat_aria_label: "Support-Chat"
|
|
4558
|
-
},
|
|
4702
|
+
}, ya = {
|
|
4559
4703
|
write_a_message_placeholder: "Ikteb messaġġ...",
|
|
4560
4704
|
your_issue_has_been_resolved: "Il-problema tiegħek ġiet riżolta!",
|
|
4561
4705
|
new_conversation: "Konversazzjoni ġdida",
|
|
@@ -4652,7 +4796,7 @@ const Ie = {
|
|
|
4652
4796
|
zoom_out: "Ċekken",
|
|
4653
4797
|
reset_zoom: "Irrisettja ż-zoom",
|
|
4654
4798
|
support_chat_aria_label: "Chat ta’ appoġġ"
|
|
4655
|
-
},
|
|
4799
|
+
}, wa = {
|
|
4656
4800
|
write_a_message_placeholder: "Skriv en melding...",
|
|
4657
4801
|
your_issue_has_been_resolved: "Saken din er løst!",
|
|
4658
4802
|
new_conversation: "Ny samtale",
|
|
@@ -4749,7 +4893,7 @@ const Ie = {
|
|
|
4749
4893
|
zoom_out: "Zoom ut",
|
|
4750
4894
|
reset_zoom: "Tilbakestill zoom",
|
|
4751
4895
|
support_chat_aria_label: "Support-chat"
|
|
4752
|
-
},
|
|
4896
|
+
}, ja = {
|
|
4753
4897
|
write_a_message_placeholder: "Napíšte správu...",
|
|
4754
4898
|
your_issue_has_been_resolved: "Váš problém bol vyriešený!",
|
|
4755
4899
|
new_conversation: "Nová konverzácia",
|
|
@@ -4846,86 +4990,86 @@ const Ie = {
|
|
|
4846
4990
|
zoom_out: "Oddialiť",
|
|
4847
4991
|
reset_zoom: "Obnoviť priblíženie",
|
|
4848
4992
|
support_chat_aria_label: "Chat podpory"
|
|
4849
|
-
},
|
|
4850
|
-
ar:
|
|
4851
|
-
bn:
|
|
4852
|
-
bg:
|
|
4853
|
-
cs:
|
|
4854
|
-
da:
|
|
4855
|
-
de:
|
|
4856
|
-
el:
|
|
4857
|
-
en:
|
|
4858
|
-
es:
|
|
4859
|
-
et:
|
|
4860
|
-
fi:
|
|
4861
|
-
fil:
|
|
4862
|
-
fr:
|
|
4863
|
-
hi:
|
|
4864
|
-
hr:
|
|
4865
|
-
hu:
|
|
4866
|
-
is:
|
|
4867
|
-
it:
|
|
4868
|
-
ja:
|
|
4869
|
-
ko:
|
|
4870
|
-
lb:
|
|
4871
|
-
lt:
|
|
4872
|
-
lv:
|
|
4873
|
-
mt:
|
|
4874
|
-
nb:
|
|
4875
|
-
nl:
|
|
4876
|
-
no:
|
|
4877
|
-
pl:
|
|
4878
|
-
pt:
|
|
4879
|
-
ro:
|
|
4880
|
-
ru:
|
|
4881
|
-
sk:
|
|
4882
|
-
sv:
|
|
4883
|
-
th:
|
|
4884
|
-
tr:
|
|
4885
|
-
ur:
|
|
4886
|
-
vi:
|
|
4887
|
-
"zh-cn":
|
|
4888
|
-
},
|
|
4889
|
-
function
|
|
4890
|
-
return
|
|
4993
|
+
}, Y = {
|
|
4994
|
+
ar: Oe,
|
|
4995
|
+
bn: Ue,
|
|
4996
|
+
bg: Be,
|
|
4997
|
+
cs: Ve,
|
|
4998
|
+
da: He,
|
|
4999
|
+
de: We,
|
|
5000
|
+
el: Ze,
|
|
5001
|
+
en: J,
|
|
5002
|
+
es: Ge,
|
|
5003
|
+
et: ha,
|
|
5004
|
+
fi: Je,
|
|
5005
|
+
fil: $e,
|
|
5006
|
+
fr: Ye,
|
|
5007
|
+
hi: Qe,
|
|
5008
|
+
hr: ma,
|
|
5009
|
+
hu: ga,
|
|
5010
|
+
is: ka,
|
|
5011
|
+
it: Xe,
|
|
5012
|
+
ja: ea,
|
|
5013
|
+
ko: aa,
|
|
5014
|
+
lb: fa,
|
|
5015
|
+
lt: va,
|
|
5016
|
+
lv: ba,
|
|
5017
|
+
mt: ya,
|
|
5018
|
+
nb: wa,
|
|
5019
|
+
nl: ta,
|
|
5020
|
+
no: sa,
|
|
5021
|
+
pl: oa,
|
|
5022
|
+
pt: na,
|
|
5023
|
+
ro: ia,
|
|
5024
|
+
ru: _a,
|
|
5025
|
+
sk: ja,
|
|
5026
|
+
sv: ra,
|
|
5027
|
+
th: la,
|
|
5028
|
+
tr: ca,
|
|
5029
|
+
ur: pa,
|
|
5030
|
+
vi: da,
|
|
5031
|
+
"zh-cn": ua
|
|
5032
|
+
}, Sa = Object.keys(Y);
|
|
5033
|
+
function za(n) {
|
|
5034
|
+
return Sa.includes(n);
|
|
4891
5035
|
}
|
|
4892
|
-
const
|
|
4893
|
-
function
|
|
4894
|
-
return
|
|
5036
|
+
const Ca = /* @__PURE__ */ new Set(["ar", "ur"]);
|
|
5037
|
+
function Ja(n) {
|
|
5038
|
+
return Ca.has(n);
|
|
4895
5039
|
}
|
|
4896
|
-
function
|
|
4897
|
-
return
|
|
5040
|
+
function xa(n) {
|
|
5041
|
+
return za(n) ? n : "en";
|
|
4898
5042
|
}
|
|
4899
|
-
function
|
|
4900
|
-
var
|
|
4901
|
-
const
|
|
4902
|
-
return
|
|
5043
|
+
function qa(n, e, t, o) {
|
|
5044
|
+
var l;
|
|
5045
|
+
const r = ((l = t == null ? void 0 : t[e]) == null ? void 0 : l[n]) || Y[e][n] || J[n] || n;
|
|
5046
|
+
return o ? r.replace(
|
|
4903
5047
|
/\{(\w+)\}/g,
|
|
4904
|
-
(
|
|
4905
|
-
) :
|
|
5048
|
+
(s, a) => a in o ? String(o[a]) : s
|
|
5049
|
+
) : r;
|
|
4906
5050
|
}
|
|
4907
|
-
function
|
|
4908
|
-
return
|
|
5051
|
+
function Ea(n, e, t) {
|
|
5052
|
+
return qa(
|
|
4909
5053
|
e,
|
|
4910
|
-
|
|
5054
|
+
xa(n.language),
|
|
4911
5055
|
n.translationOverrides,
|
|
4912
|
-
|
|
5056
|
+
t
|
|
4913
5057
|
);
|
|
4914
5058
|
}
|
|
4915
|
-
class
|
|
5059
|
+
class Aa {
|
|
4916
5060
|
constructor({
|
|
4917
5061
|
config: e,
|
|
4918
|
-
api:
|
|
4919
|
-
contactCtx:
|
|
4920
|
-
storageCtx:
|
|
4921
|
-
sessionsPollingIntervalSeconds:
|
|
4922
|
-
sharedSessions:
|
|
5062
|
+
api: t,
|
|
5063
|
+
contactCtx: o,
|
|
5064
|
+
storageCtx: r,
|
|
5065
|
+
sessionsPollingIntervalSeconds: l,
|
|
5066
|
+
sharedSessions: s
|
|
4923
5067
|
}) {
|
|
4924
|
-
this.sessionsRefresher = new
|
|
5068
|
+
this.sessionsRefresher = new G(), this.persistedSessionId = null, this.sessionAbortController = new AbortController(), this.sessionState = new S({
|
|
4925
5069
|
session: null,
|
|
4926
5070
|
isCreatingSession: !1,
|
|
4927
5071
|
isResolvingSession: !1
|
|
4928
|
-
}), this.sessionsState = new
|
|
5072
|
+
}), this.sessionsState = new S({
|
|
4929
5073
|
data: [],
|
|
4930
5074
|
cursor: void 0,
|
|
4931
5075
|
isLastPage: !1,
|
|
@@ -4939,21 +5083,21 @@ class ja {
|
|
|
4939
5083
|
this.persistSession
|
|
4940
5084
|
));
|
|
4941
5085
|
}, this.restoreActiveSessionTracking = () => {
|
|
4942
|
-
var
|
|
4943
|
-
(
|
|
4944
|
-
}, this.trackActiveSession = (
|
|
4945
|
-
var
|
|
4946
|
-
(
|
|
5086
|
+
var a;
|
|
5087
|
+
(a = this.stopPersistingSession) == null || a.call(this), this.stopPersistingSession = void 0, this.registerActiveSessionPersistence();
|
|
5088
|
+
}, this.trackActiveSession = (a) => {
|
|
5089
|
+
var i;
|
|
5090
|
+
(i = this.stopPersistingSession) == null || i.call(this), this.stopPersistingSession = a.sessionState.subscribe(
|
|
4947
5091
|
this.persistSession
|
|
4948
|
-
), this.persistSession(
|
|
4949
|
-
}, this.persistSession = ({ session:
|
|
4950
|
-
const
|
|
4951
|
-
if (!
|
|
4952
|
-
const c =
|
|
5092
|
+
), this.persistSession(a.sessionState.get());
|
|
5093
|
+
}, this.persistSession = ({ session: a }) => {
|
|
5094
|
+
const i = this.storageCtx;
|
|
5095
|
+
if (!i) return;
|
|
5096
|
+
const c = a != null && a.isOpened ? a.id : null;
|
|
4953
5097
|
if (c === this.persistedSessionId || !c && this.persistedSessionId === null) return;
|
|
4954
|
-
this.persistedSessionId = c, (c ?
|
|
4955
|
-
|
|
4956
|
-
error:
|
|
5098
|
+
this.persistedSessionId = c, (c ? i.setActiveSessionId(c) : i.clearActiveSessionId()).catch((_) => {
|
|
5099
|
+
k.warn("failed to persist the active session", {
|
|
5100
|
+
error: _ instanceof Error ? _.message : String(_)
|
|
4957
5101
|
});
|
|
4958
5102
|
});
|
|
4959
5103
|
}, this.getLastActiveSessionId = async () => {
|
|
@@ -4966,231 +5110,246 @@ class ja {
|
|
|
4966
5110
|
}, this.reset = async () => {
|
|
4967
5111
|
this.sessionAbortController.abort(), this.sessionAbortController = new AbortController(), this.sessionState.reset();
|
|
4968
5112
|
}, this.registerSessionsRefresherWrapper = () => {
|
|
4969
|
-
var
|
|
5113
|
+
var a;
|
|
4970
5114
|
// If the widget config was initially provided with a contact token, no state change would be triggered, so we just fetch
|
|
4971
|
-
(
|
|
4972
|
-
|
|
4973
|
-
|
|
5115
|
+
(a = this.contactCtx.state.get().contact) != null && a.token && !this.sessionsState.get().didStartInitialFetch ? this.registerSessionsRefresher() : this.stopWaitingForContact = this.contactCtx.state.subscribe(
|
|
5116
|
+
({ contact: i }) => {
|
|
5117
|
+
i != null && i.token && !this.sessionsState.get().didStartInitialFetch && this.registerSessionsRefresher();
|
|
5118
|
+
}
|
|
5119
|
+
);
|
|
4974
5120
|
}, this.registerSessionsRefresher = () => {
|
|
4975
5121
|
this.sessionsRefresher.startPolling(async () => {
|
|
4976
5122
|
this.sessionsState.get().didStartInitialFetch === !1 && this.sessionsState.setPartial({ didStartInitialFetch: !0 }), await this.refreshSessions(), this.sessionsState.get().isInitialFetchLoading === !0 && this.sessionsState.setPartial({ isInitialFetchLoading: !1 });
|
|
4977
5123
|
}, this.sessionsPollingIntervalSeconds * 1e3);
|
|
5124
|
+
}, this.dispose = ({ clearActiveSession: a = !1 } = {}) => {
|
|
5125
|
+
var i, c;
|
|
5126
|
+
if (this.sessionsRefresher.reset(), this.sessionAbortController.abort(), (i = this.stopPersistingSession) == null || i.call(this), this.stopPersistingSession = void 0, (c = this.stopWaitingForContact) == null || c.call(this), this.stopWaitingForContact = void 0, this.sessionState.reset(), a && this.storageCtx)
|
|
5127
|
+
return this.persistedSessionId = null, this.storageCtx.clearActiveSessionId().catch((d) => {
|
|
5128
|
+
k.warn("failed to clear the replaced session", {
|
|
5129
|
+
error: d instanceof Error ? d.message : String(d)
|
|
5130
|
+
});
|
|
5131
|
+
});
|
|
4978
5132
|
}, this.getParsedCustomData = () => Object.fromEntries(
|
|
4979
5133
|
Object.entries(this.config.sessionCustomData || {}).map(
|
|
4980
|
-
([
|
|
5134
|
+
([a, i]) => {
|
|
4981
5135
|
var c;
|
|
4982
|
-
return typeof
|
|
5136
|
+
return typeof i == "string" ? [a, i] : typeof i == "boolean" ? [a, i] : typeof i == "number" ? [a, i] : [a, ((c = $(() => JSON.stringify(i))) == null ? void 0 : c.data) || ""];
|
|
4983
5137
|
}
|
|
4984
5138
|
)
|
|
4985
5139
|
), this.createSession = async () => {
|
|
4986
|
-
const { signal:
|
|
5140
|
+
const { signal: a } = this.sessionAbortController;
|
|
4987
5141
|
this.sessionState.setPartial({ session: null, isCreatingSession: !0 });
|
|
4988
5142
|
try {
|
|
4989
|
-
const
|
|
4990
|
-
if (
|
|
4991
|
-
if (
|
|
4992
|
-
if (
|
|
4993
|
-
if (
|
|
4994
|
-
const c = await this.requestSession(
|
|
4995
|
-
return
|
|
5143
|
+
const i = await this.requestSession(a);
|
|
5144
|
+
if (a.aborted) return null;
|
|
5145
|
+
if (i.session) return i.session;
|
|
5146
|
+
if (i.status === 401 && await this.contactCtx.recoverFromStaleToken()) {
|
|
5147
|
+
if (a.aborted) return null;
|
|
5148
|
+
const c = await this.requestSession(a);
|
|
5149
|
+
return a.aborted ? null : c.session ? c.session : (k.error("failed to create session", c.error), null);
|
|
4996
5150
|
}
|
|
4997
|
-
return
|
|
4998
|
-
} catch (
|
|
4999
|
-
return
|
|
5151
|
+
return k.error("failed to create session", i.error), null;
|
|
5152
|
+
} catch (i) {
|
|
5153
|
+
return a.aborted || k.error("failed to create session", i), null;
|
|
5000
5154
|
} finally {
|
|
5001
|
-
|
|
5155
|
+
a.aborted || this.sessionState.setPartial({ isCreatingSession: !1 });
|
|
5002
5156
|
}
|
|
5003
|
-
}, this.requestSession = async (
|
|
5157
|
+
}, this.requestSession = async (a) => {
|
|
5004
5158
|
var u, m, g;
|
|
5005
|
-
const
|
|
5159
|
+
const i = (u = this.contactCtx.state.get().contact) == null ? void 0 : u.externalId, c = {
|
|
5006
5160
|
...this.getParsedCustomData(),
|
|
5007
|
-
...
|
|
5161
|
+
...i ? { external_id: i } : {}
|
|
5008
5162
|
}, {
|
|
5009
5163
|
data: d,
|
|
5010
|
-
error:
|
|
5164
|
+
error: _,
|
|
5011
5165
|
response: p
|
|
5012
5166
|
} = await this.api.createSession(
|
|
5013
5167
|
{
|
|
5014
5168
|
customData: Object.keys(c).length > 0 ? c : void 0
|
|
5015
5169
|
},
|
|
5016
|
-
|
|
5170
|
+
a
|
|
5017
5171
|
);
|
|
5018
|
-
if (
|
|
5019
|
-
return { session: null, status: p == null ? void 0 : p.status, error:
|
|
5172
|
+
if (a.aborted || !d)
|
|
5173
|
+
return { session: null, status: p == null ? void 0 : p.status, error: _ };
|
|
5020
5174
|
this.sessionState.setPartial({ session: d });
|
|
5021
5175
|
try {
|
|
5022
5176
|
(g = (m = this.config.hooks) == null ? void 0 : m.onSessionCreated) == null || g.call(m, { session: d });
|
|
5023
|
-
} catch (
|
|
5024
|
-
|
|
5177
|
+
} catch (v) {
|
|
5178
|
+
k.error("onSessionCreated hook failed", v);
|
|
5025
5179
|
}
|
|
5026
5180
|
return { session: d, status: p.status, error: void 0 };
|
|
5027
5181
|
}, this.loadMoreSessions = async () => {
|
|
5028
5182
|
if (this.sessionsState.get().isLastPage) return;
|
|
5029
|
-
const { data:
|
|
5183
|
+
const { data: a } = await this.getSessions({
|
|
5030
5184
|
cursor: this.sessionsState.get().cursor
|
|
5031
5185
|
});
|
|
5032
|
-
if (
|
|
5033
|
-
const c = [...this.sessionsState.get().data, ...
|
|
5034
|
-
(d,
|
|
5186
|
+
if (a) {
|
|
5187
|
+
const c = [...this.sessionsState.get().data, ...a.items].filter(
|
|
5188
|
+
(d, _, p) => _ === p.findIndex((u) => d.id === u.id)
|
|
5035
5189
|
);
|
|
5036
5190
|
this.sessionsState.setPartial({
|
|
5037
5191
|
data: c,
|
|
5038
|
-
cursor:
|
|
5039
|
-
isLastPage:
|
|
5192
|
+
cursor: a.next || void 0,
|
|
5193
|
+
isLastPage: a.next === null
|
|
5040
5194
|
});
|
|
5041
5195
|
}
|
|
5042
|
-
}, this.getSessions = async ({ cursor:
|
|
5196
|
+
}, this.getSessions = async ({ cursor: a }) => {
|
|
5043
5197
|
var c, d;
|
|
5044
5198
|
if (!((c = this.contactCtx.state.get().contact) != null && c.token)) return { data: null };
|
|
5045
|
-
const
|
|
5199
|
+
const i = (d = this.contactCtx.state.get().contact) == null ? void 0 : d.externalId;
|
|
5046
5200
|
return await this.api.getSessions({
|
|
5047
|
-
cursor:
|
|
5048
|
-
filters:
|
|
5049
|
-
external_id:
|
|
5201
|
+
cursor: a,
|
|
5202
|
+
filters: i ? {
|
|
5203
|
+
external_id: i
|
|
5050
5204
|
} : {}
|
|
5051
5205
|
});
|
|
5052
|
-
}, this.setSessions = (
|
|
5053
|
-
const
|
|
5054
|
-
(c, d,
|
|
5206
|
+
}, this.setSessions = (a) => {
|
|
5207
|
+
const i = [...a, ...this.sessionsState.get().data].filter(
|
|
5208
|
+
(c, d, _) => d === _.findIndex((p) => c.id === p.id)
|
|
5055
5209
|
);
|
|
5056
|
-
this.sessionsState.setPartial({ data:
|
|
5210
|
+
this.sessionsState.setPartial({ data: i });
|
|
5057
5211
|
}, this.refreshSessions = async () => {
|
|
5058
|
-
const { data:
|
|
5059
|
-
|
|
5212
|
+
const { data: a } = await this.getSessions({ cursor: void 0 });
|
|
5213
|
+
a && this.setSessions(a.items);
|
|
5060
5214
|
}, this.resolveSession = async () => {
|
|
5061
|
-
const
|
|
5062
|
-
if (!
|
|
5215
|
+
const a = this.sessionState.get().session;
|
|
5216
|
+
if (!a || !a.isOpened)
|
|
5063
5217
|
return { success: !1, error: "Session is not opened" };
|
|
5064
5218
|
this.sessionState.setPartial({ isResolvingSession: !0 });
|
|
5065
|
-
const { signal:
|
|
5066
|
-
if (
|
|
5219
|
+
const { signal: i } = this.sessionAbortController, c = await this.api.resolveSession({ session_id: a.id }, i).catch((p) => {
|
|
5220
|
+
if (i.aborted) return null;
|
|
5067
5221
|
throw p;
|
|
5068
5222
|
});
|
|
5069
|
-
if (!c ||
|
|
5223
|
+
if (!c || i.aborted)
|
|
5070
5224
|
return { success: !1, error: "Session was reset" };
|
|
5071
|
-
const { data: d, error:
|
|
5072
|
-
return d ? (this.sessionState.setPartial({ session: d, isResolvingSession: !1 }), { success: !0, data: d }) : (this.sessionState.setPartial({ isResolvingSession: !1 }), { success: !1, error:
|
|
5073
|
-
}, this.createStateCheckpoint = async (
|
|
5225
|
+
const { data: d, error: _ } = c;
|
|
5226
|
+
return d ? (this.sessionState.setPartial({ session: d, isResolvingSession: !1 }), { success: !0, data: d }) : (this.sessionState.setPartial({ isResolvingSession: !1 }), { success: !1, error: _ });
|
|
5227
|
+
}, this.createStateCheckpoint = async (a) => {
|
|
5074
5228
|
var d;
|
|
5075
|
-
const
|
|
5076
|
-
if (!
|
|
5229
|
+
const i = (d = this.sessionState.get().session) == null ? void 0 : d.id;
|
|
5230
|
+
if (!i) return;
|
|
5077
5231
|
const { data: c } = await this.api.createStateCheckpoint({
|
|
5078
|
-
session_id:
|
|
5079
|
-
payload:
|
|
5232
|
+
session_id: i,
|
|
5233
|
+
payload: a
|
|
5080
5234
|
});
|
|
5081
5235
|
return c != null && c.success ? { success: !0 } : { success: !1 };
|
|
5082
|
-
}, this.config = e, this.api =
|
|
5236
|
+
}, this.config = e, this.api = t, this.contactCtx = o, this.storageCtx = r, this.sessionsPollingIntervalSeconds = l, s ? this.sessionsState = s : this.registerSessionsRefresherWrapper(), this.registerActiveSessionPersistence();
|
|
5083
5237
|
}
|
|
5084
5238
|
}
|
|
5085
|
-
const
|
|
5086
|
-
const
|
|
5239
|
+
const Pa = (n, e, { sendsPageContext: t }) => {
|
|
5240
|
+
const o = Ma(n), r = t && e.mentions && e.mentions.length > 0 ? { mentions: e.mentions.map(Ta) } : void 0, l = t && (e.clientContext || r) ? { ...o, ...e.clientContext, ...r } : o, s = e.connectionRequestId ? {
|
|
5241
|
+
...l,
|
|
5242
|
+
opencx__connection_request_id: e.connectionRequestId
|
|
5243
|
+
} : l, a = e.withPageEntity === !1 && s && "entity" in s ? Ia(s, "entity") : s;
|
|
5087
5244
|
return {
|
|
5088
|
-
clientContext: e.
|
|
5245
|
+
clientContext: e.background ? { ...a, opencx__background: !0 } : a,
|
|
5089
5246
|
custom_data: {
|
|
5090
5247
|
...n.messageCustomData || {},
|
|
5091
5248
|
...e.customData || {}
|
|
5092
5249
|
}
|
|
5093
5250
|
};
|
|
5094
|
-
},
|
|
5251
|
+
}, Ta = ({ type: n, id: e, title: t, meta: o }) => ({
|
|
5095
5252
|
type: n,
|
|
5096
5253
|
id: e,
|
|
5097
|
-
title:
|
|
5098
|
-
...
|
|
5099
|
-
}),
|
|
5100
|
-
const { [e]:
|
|
5101
|
-
return Object.keys(
|
|
5102
|
-
},
|
|
5254
|
+
title: t,
|
|
5255
|
+
...o ? { meta: o } : {}
|
|
5256
|
+
}), Ia = (n, e) => {
|
|
5257
|
+
const { [e]: t, ...o } = n;
|
|
5258
|
+
return Object.keys(o).length > 0 ? o : void 0;
|
|
5259
|
+
}, Ma = (n) => {
|
|
5103
5260
|
if (typeof n.context != "function") return n.context;
|
|
5104
5261
|
try {
|
|
5105
5262
|
return n.context();
|
|
5106
5263
|
} catch (e) {
|
|
5107
|
-
|
|
5264
|
+
k.error("context getter threw; sending without context", e);
|
|
5108
5265
|
return;
|
|
5109
5266
|
}
|
|
5110
|
-
},
|
|
5267
|
+
}, Da = (n) => {
|
|
5111
5268
|
const e = n.features;
|
|
5112
5269
|
if (!e) return;
|
|
5113
|
-
const
|
|
5114
|
-
return e.preamble !== void 0 && (
|
|
5115
|
-
},
|
|
5270
|
+
const t = {};
|
|
5271
|
+
return e.preamble !== void 0 && (t.preamble = e.preamble), e.inlineUi !== void 0 && (t.inline_ui = e.inlineUi), e.pageContext !== void 0 && (t.page_context = e.pageContext), e.clientTools !== void 0 && (t.client_tools = e.clientTools), Object.keys(t).length > 0 ? t : void 0;
|
|
5272
|
+
}, Na = ({
|
|
5116
5273
|
config: n,
|
|
5117
5274
|
input: e,
|
|
5118
|
-
uuid:
|
|
5119
|
-
sessionId:
|
|
5120
|
-
content:
|
|
5121
|
-
initialMessages:
|
|
5122
|
-
sendsPageContext:
|
|
5275
|
+
uuid: t,
|
|
5276
|
+
sessionId: o,
|
|
5277
|
+
content: r,
|
|
5278
|
+
initialMessages: l,
|
|
5279
|
+
sendsPageContext: s
|
|
5123
5280
|
}) => {
|
|
5124
|
-
var
|
|
5281
|
+
var a, i, c, d, _, p, u, m;
|
|
5125
5282
|
return {
|
|
5126
|
-
uuid:
|
|
5283
|
+
uuid: t,
|
|
5127
5284
|
bot_token: n.token,
|
|
5128
5285
|
headers: n.headers,
|
|
5129
5286
|
query_params: n.queryParams,
|
|
5130
5287
|
body_properties: n.bodyProperties,
|
|
5131
|
-
session_id:
|
|
5132
|
-
content:
|
|
5288
|
+
session_id: o,
|
|
5289
|
+
content: r,
|
|
5133
5290
|
attachments: e.attachments,
|
|
5134
|
-
...
|
|
5291
|
+
...Pa(n, e, { sendsPageContext: s }),
|
|
5135
5292
|
language: n.language,
|
|
5136
|
-
features:
|
|
5293
|
+
features: Da(n),
|
|
5137
5294
|
presentation: n.presentation,
|
|
5138
5295
|
capabilities: [
|
|
5139
|
-
(
|
|
5140
|
-
(
|
|
5141
|
-
(c = n.capabilities) == null ? void 0 : c.
|
|
5142
|
-
|
|
5143
|
-
|
|
5144
|
-
|
|
5145
|
-
|
|
5296
|
+
(a = n.capabilities) == null ? void 0 : a.connections,
|
|
5297
|
+
(i = n.capabilities) == null ? void 0 : i.structuredQuestions,
|
|
5298
|
+
(c = n.capabilities) == null ? void 0 : c.richReplies,
|
|
5299
|
+
(d = n.capabilities) == null ? void 0 : d.pageEffects
|
|
5300
|
+
].some((g) => g !== void 0) ? {
|
|
5301
|
+
connections: (_ = n.capabilities) == null ? void 0 : _.connections,
|
|
5302
|
+
structured_questions: (p = n.capabilities) == null ? void 0 : p.structuredQuestions,
|
|
5303
|
+
rich_replies: (u = n.capabilities) == null ? void 0 : u.richReplies,
|
|
5304
|
+
page_effects: (m = n.capabilities) == null ? void 0 : m.pageEffects
|
|
5146
5305
|
} : void 0,
|
|
5147
5306
|
exit_mode_prompt: e.exitModePrompt,
|
|
5148
|
-
initial_messages:
|
|
5307
|
+
initial_messages: l.length > 0 ? l.map((g) => ({ uuid: g.id, content: g.data.message })) : void 0
|
|
5149
5308
|
};
|
|
5150
|
-
},
|
|
5309
|
+
}, C = class C {
|
|
5151
5310
|
constructor({
|
|
5152
5311
|
config: e,
|
|
5153
|
-
api:
|
|
5154
|
-
sessionCtx:
|
|
5155
|
-
contactCtx:
|
|
5156
|
-
streaming:
|
|
5157
|
-
sendsPageContext:
|
|
5158
|
-
getClientCapabilities:
|
|
5159
|
-
getRequestConfig:
|
|
5312
|
+
api: t,
|
|
5313
|
+
sessionCtx: o,
|
|
5314
|
+
contactCtx: r,
|
|
5315
|
+
streaming: l,
|
|
5316
|
+
sendsPageContext: s,
|
|
5317
|
+
getClientCapabilities: a,
|
|
5318
|
+
getRequestConfig: i,
|
|
5160
5319
|
isStreaming: c,
|
|
5161
5320
|
getSendsPageContext: d
|
|
5162
5321
|
}) {
|
|
5163
|
-
this.state = new
|
|
5322
|
+
this.state = new S({
|
|
5164
5323
|
messages: [],
|
|
5165
5324
|
isSendingMessage: !1,
|
|
5166
5325
|
isSendingMessageToAI: !1,
|
|
5167
5326
|
settledAgentUserMessageId: null,
|
|
5168
5327
|
lastAIResMightSolveUserIssue: !1,
|
|
5169
5328
|
isInitialFetchLoading: !1
|
|
5170
|
-
}), this.draftState = new
|
|
5329
|
+
}), this.draftState = new S({
|
|
5171
5330
|
text: "",
|
|
5172
5331
|
mentions: []
|
|
5173
5332
|
}), this.agentHandlers = null, this.bufferedAgentSends = [], this.sendMessageAbortController = new AbortController(), this.messageIdsDispatchedToOnMessageReceivedHook = /* @__PURE__ */ new Set(), this.sentTextHistory = [], this.reset = () => {
|
|
5174
5333
|
this.sendMessageAbortController.abort("Resetting chat"), this.bufferedAgentSends = [], this.state.reset(), this.messageIdsDispatchedToOnMessageReceivedHook.clear(), this.sentTextHistory = [], this.draftState.reset();
|
|
5175
|
-
}, this.rememberSentText = (
|
|
5176
|
-
const p =
|
|
5177
|
-
!p || this.sentTextHistory.at(-1) === p || (this.sentTextHistory.push(p), this.sentTextHistory.length >
|
|
5178
|
-
}, this.getSentTextHistory = () => this.sentTextHistory, this.registerAgentHandlers = (
|
|
5179
|
-
this.agentHandlers =
|
|
5334
|
+
}, this.rememberSentText = (_) => {
|
|
5335
|
+
const p = _.trim();
|
|
5336
|
+
!p || this.sentTextHistory.at(-1) === p || (this.sentTextHistory.push(p), this.sentTextHistory.length > C.SENT_TEXT_HISTORY_MAX && this.sentTextHistory.shift());
|
|
5337
|
+
}, this.getSentTextHistory = () => this.sentTextHistory, this.registerAgentHandlers = (_) => {
|
|
5338
|
+
this.agentHandlers = _;
|
|
5180
5339
|
const p = this.bufferedAgentSends;
|
|
5181
5340
|
this.bufferedAgentSends = [], p.forEach((u) => {
|
|
5182
|
-
|
|
5341
|
+
C.dispatchToEngine(_, u);
|
|
5183
5342
|
});
|
|
5184
|
-
}, this.unregisterAgentHandlers = (
|
|
5185
|
-
this.agentHandlers ===
|
|
5186
|
-
}, this.dispatchToOnMessageReceivedHook = (
|
|
5343
|
+
}, this.unregisterAgentHandlers = (_) => {
|
|
5344
|
+
this.agentHandlers === _ && (this.agentHandlers = null);
|
|
5345
|
+
}, this.dispatchToOnMessageReceivedHook = (_) => {
|
|
5187
5346
|
var u, m;
|
|
5188
|
-
if (
|
|
5347
|
+
if (_.type === "USER" || this.messageIdsDispatchedToOnMessageReceivedHook.has(_.id))
|
|
5189
5348
|
return;
|
|
5190
5349
|
const p = this.sessionCtx.sessionState.get().session;
|
|
5191
|
-
p && (this.messageIdsDispatchedToOnMessageReceivedHook.add(
|
|
5192
|
-
}, this.markAsDispatchedToOnMessageReceivedHook = (
|
|
5193
|
-
|
|
5350
|
+
p && (this.messageIdsDispatchedToOnMessageReceivedHook.add(_.id), (m = (u = this.config.hooks) == null ? void 0 : u.onMessageReceived) == null || m.call(u, { message: _, session: p }));
|
|
5351
|
+
}, this.markAsDispatchedToOnMessageReceivedHook = (_) => {
|
|
5352
|
+
_.forEach(
|
|
5194
5353
|
(p) => this.messageIdsDispatchedToOnMessageReceivedHook.add(p)
|
|
5195
5354
|
);
|
|
5196
5355
|
}, this.buildPersistentInitialMessages = () => {
|
|
@@ -5206,60 +5365,68 @@ const za = (n, e, { sendsPageContext: a }) => {
|
|
|
5206
5365
|
})
|
|
5207
5366
|
) : [];
|
|
5208
5367
|
}, this.ensureSessionId = async () => {
|
|
5209
|
-
var
|
|
5210
|
-
if (!((
|
|
5368
|
+
var _, p;
|
|
5369
|
+
if (!((_ = this.sessionCtx.sessionState.get().session) != null && _.id)) {
|
|
5211
5370
|
if (!await this.sessionCtx.createSession()) return null;
|
|
5212
5371
|
this.sessionCtx.refreshSessions();
|
|
5213
5372
|
}
|
|
5214
5373
|
return ((p = this.sessionCtx.sessionState.get().session) == null ? void 0 : p.id) ?? null;
|
|
5215
|
-
}, this.rollbackOptimisticMessages = (
|
|
5216
|
-
if (
|
|
5217
|
-
const p = new Set(
|
|
5374
|
+
}, this.rollbackOptimisticMessages = (_) => {
|
|
5375
|
+
if (_.length === 0) return;
|
|
5376
|
+
const p = new Set(_), u = this.state.get().messages, m = u.filter((g) => !p.has(g.id));
|
|
5218
5377
|
m.length !== u.length && this.state.setPartial({ messages: m });
|
|
5219
|
-
}, this.notifySendAccepted = (
|
|
5378
|
+
}, this.notifySendAccepted = (_) => {
|
|
5220
5379
|
var p;
|
|
5221
5380
|
try {
|
|
5222
|
-
(p =
|
|
5381
|
+
(p = _.onAccepted) == null || p.call(_);
|
|
5223
5382
|
} catch (u) {
|
|
5224
|
-
|
|
5383
|
+
k.error("send acceptance callback failed", u);
|
|
5225
5384
|
}
|
|
5226
|
-
}, this.stageUserTurn = async (
|
|
5227
|
-
const u = this.buildUserMessage(
|
|
5385
|
+
}, this.stageUserTurn = async (_, { pending: p }) => {
|
|
5386
|
+
const u = this.buildUserMessage(_);
|
|
5228
5387
|
if (!u) return null;
|
|
5229
|
-
const m = p ? { ...u, pending: !0 } : u, g = this.buildPersistentInitialMessages(),
|
|
5230
|
-
...g.map((
|
|
5388
|
+
const m = p ? { ...u, pending: !0 } : u, g = this.buildPersistentInitialMessages(), v = [
|
|
5389
|
+
...g.map((b) => b.id),
|
|
5231
5390
|
m.id
|
|
5232
5391
|
];
|
|
5233
5392
|
this.state.setPartial({
|
|
5234
|
-
messages: [
|
|
5393
|
+
messages: [
|
|
5394
|
+
...g,
|
|
5395
|
+
...this.state.get().messages,
|
|
5396
|
+
...m.background ? [] : [m]
|
|
5397
|
+
]
|
|
5235
5398
|
});
|
|
5236
|
-
let
|
|
5399
|
+
let f;
|
|
5237
5400
|
try {
|
|
5238
|
-
|
|
5239
|
-
} catch (
|
|
5240
|
-
throw this.rollbackOptimisticMessages(
|
|
5401
|
+
f = await this.ensureSessionId();
|
|
5402
|
+
} catch (b) {
|
|
5403
|
+
throw this.rollbackOptimisticMessages(v), b;
|
|
5241
5404
|
}
|
|
5242
|
-
return
|
|
5243
|
-
}, this.buildQueuedUserMessage = (
|
|
5405
|
+
return f ? { sessionId: f, userMessage: m, initialMessages: g } : (this.rollbackOptimisticMessages(v), null);
|
|
5406
|
+
}, this.buildQueuedUserMessage = (_) => {
|
|
5244
5407
|
var m;
|
|
5245
|
-
const p = this.buildUserMessage(
|
|
5408
|
+
const p = this.buildUserMessage(_);
|
|
5246
5409
|
if (!p) return null;
|
|
5247
5410
|
const u = (m = this.sessionCtx.sessionState.get().session) == null ? void 0 : m.id;
|
|
5248
5411
|
return u ? { sessionId: u, userMessage: { ...p, pending: !0 } } : null;
|
|
5249
|
-
}, this.buildUserMessage = (
|
|
5412
|
+
}, this.buildUserMessage = (_) => {
|
|
5250
5413
|
var p;
|
|
5251
|
-
return !
|
|
5252
|
-
|
|
5253
|
-
|
|
5254
|
-
|
|
5255
|
-
|
|
5256
|
-
|
|
5257
|
-
|
|
5414
|
+
return !_.content.trim() && (!_.attachments || _.attachments.length === 0) ? (k.warn("cannot send an empty message of no content or attachments"), null) : {
|
|
5415
|
+
...this.toUserMessage(
|
|
5416
|
+
_.content.trim(),
|
|
5417
|
+
_.attachments || void 0,
|
|
5418
|
+
this.sendsPageContext ? C.markedElementNames(_.clientContext) : void 0,
|
|
5419
|
+
this.sendsPageContext && ((p = _.mentions) != null && p.length) ? _.mentions : void 0
|
|
5420
|
+
),
|
|
5421
|
+
..._.background ? { background: !0 } : {}
|
|
5422
|
+
};
|
|
5423
|
+
}, this.appendUserMessageIfAbsent = (_) => {
|
|
5424
|
+
if (_.background) return;
|
|
5258
5425
|
const p = this.state.get().messages;
|
|
5259
|
-
p.some((u) => u.id ===
|
|
5260
|
-
}, this.markUserMessageDelivered = (
|
|
5426
|
+
p.some((u) => u.id === _.id) || this.state.setPartial({ messages: [...p, _] });
|
|
5427
|
+
}, this.markUserMessageDelivered = (_) => {
|
|
5261
5428
|
const p = this.state.get().messages, u = p.findIndex(
|
|
5262
|
-
(
|
|
5429
|
+
(v) => v.id === _ && v.type === "USER" && v.pending
|
|
5263
5430
|
);
|
|
5264
5431
|
if (u === -1) return;
|
|
5265
5432
|
const m = p[u];
|
|
@@ -5268,89 +5435,89 @@ const za = (n, e, { sendsPageContext: a }) => {
|
|
|
5268
5435
|
g[u] = { ...m, pending: !1 }, this.state.setPartial({
|
|
5269
5436
|
messages: g
|
|
5270
5437
|
});
|
|
5271
|
-
}, this.sendMessage = async (
|
|
5272
|
-
var u, m, g,
|
|
5438
|
+
}, this.sendMessage = async (_) => {
|
|
5439
|
+
var u, m, g, v, f;
|
|
5273
5440
|
if (this.streaming) {
|
|
5274
5441
|
if (!this.agentHandlers) {
|
|
5275
|
-
this.bufferedAgentSends.push(
|
|
5442
|
+
this.bufferedAgentSends.push(_);
|
|
5276
5443
|
return;
|
|
5277
5444
|
}
|
|
5278
|
-
await this.agentHandlers.send(
|
|
5445
|
+
await this.agentHandlers.send(_);
|
|
5279
5446
|
return;
|
|
5280
5447
|
}
|
|
5281
5448
|
let p;
|
|
5282
5449
|
try {
|
|
5283
|
-
const
|
|
5284
|
-
if (this.blocksSendWhileAwaitingReply && (
|
|
5285
|
-
|
|
5286
|
-
|
|
5450
|
+
const b = this.sessionCtx.sessionState.get().session, R = (b == null ? void 0 : b.assignee.kind) === "ai", X = this.state.get().isSendingMessageToAI, E = this.state.get().messages.at(-1);
|
|
5451
|
+
if (this.blocksSendWhileAwaitingReply && (X || // If last message is from user, then bot response did not arrive yet
|
|
5452
|
+
R && (E == null ? void 0 : E.type) === "USER" && E.id !== this.state.get().settledAgentUserMessageId)) {
|
|
5453
|
+
k.warn("cannot send messages while awaiting AI response");
|
|
5287
5454
|
return;
|
|
5288
5455
|
}
|
|
5289
5456
|
this.sendMessageAbortController.abort("Superseded by a newer message"), this.sendMessageAbortController = new AbortController(), p = this.sendMessageAbortController, this.state.setPartial({
|
|
5290
5457
|
lastAIResMightSolveUserIssue: !1,
|
|
5291
5458
|
isSendingMessage: !0,
|
|
5292
|
-
isSendingMessageToAI: !!
|
|
5459
|
+
isSendingMessageToAI: !!R || !b
|
|
5293
5460
|
});
|
|
5294
|
-
const
|
|
5295
|
-
if (!
|
|
5296
|
-
const { sessionId:
|
|
5297
|
-
this.notifySendAccepted(
|
|
5298
|
-
const { data:
|
|
5299
|
-
|
|
5461
|
+
const K = await this.stageUserTurn(_, { pending: !1 });
|
|
5462
|
+
if (!K) return;
|
|
5463
|
+
const { sessionId: ee, userMessage: L, initialMessages: ae } = K;
|
|
5464
|
+
this.notifySendAccepted(_);
|
|
5465
|
+
const { data: y } = await this.api.sendMessage(
|
|
5466
|
+
Na({
|
|
5300
5467
|
config: {
|
|
5301
5468
|
...this.getRequestConfig(),
|
|
5302
5469
|
capabilities: this.getClientCapabilities()
|
|
5303
5470
|
},
|
|
5304
|
-
input:
|
|
5305
|
-
uuid:
|
|
5306
|
-
sessionId:
|
|
5307
|
-
content:
|
|
5308
|
-
initialMessages:
|
|
5471
|
+
input: _,
|
|
5472
|
+
uuid: L.id,
|
|
5473
|
+
sessionId: ee,
|
|
5474
|
+
content: L.content,
|
|
5475
|
+
initialMessages: ae,
|
|
5309
5476
|
sendsPageContext: this.sendsPageContext
|
|
5310
5477
|
}),
|
|
5311
5478
|
p.signal
|
|
5312
5479
|
);
|
|
5313
|
-
if (
|
|
5314
|
-
const z = this.toBotMessage(
|
|
5480
|
+
if (y != null && y.success) {
|
|
5481
|
+
const z = this.toBotMessage(y);
|
|
5315
5482
|
if (z) {
|
|
5316
5483
|
const A = this.state.get().messages;
|
|
5317
5484
|
if (!!A.some(
|
|
5318
|
-
(
|
|
5485
|
+
(te) => te.id === z.id
|
|
5319
5486
|
)) {
|
|
5320
5487
|
this.state.setPartial({
|
|
5321
|
-
lastAIResMightSolveUserIssue: ((u =
|
|
5488
|
+
lastAIResMightSolveUserIssue: ((u = y.autopilotResponse) == null ? void 0 : u.mightSolveUserIssue) || ((m = y.uiResponse) == null ? void 0 : m.mightSolveUserIssue)
|
|
5322
5489
|
});
|
|
5323
5490
|
return;
|
|
5324
5491
|
}
|
|
5325
5492
|
this.state.setPartial({
|
|
5326
5493
|
messages: [...A, z],
|
|
5327
|
-
lastAIResMightSolveUserIssue: ((g =
|
|
5494
|
+
lastAIResMightSolveUserIssue: ((g = y.autopilotResponse) == null ? void 0 : g.mightSolveUserIssue) || ((v = y.uiResponse) == null ? void 0 : v.mightSolveUserIssue)
|
|
5328
5495
|
}), this.dispatchToOnMessageReceivedHook(z);
|
|
5329
5496
|
}
|
|
5330
|
-
|
|
5497
|
+
y.session && this.sessionCtx.sessionState.setPartial({ session: y.session });
|
|
5331
5498
|
} else {
|
|
5332
5499
|
const z = this.toBotErrorMessage(
|
|
5333
|
-
((
|
|
5500
|
+
((f = y == null ? void 0 : y.error) == null ? void 0 : f.message) || Ea(this.config, "turn_failed_message")
|
|
5334
5501
|
), A = this.state.get().messages;
|
|
5335
5502
|
this.state.setPartial({
|
|
5336
5503
|
messages: [...A, z]
|
|
5337
5504
|
});
|
|
5338
5505
|
}
|
|
5339
|
-
} catch (
|
|
5340
|
-
p != null && p.signal.aborted ||
|
|
5506
|
+
} catch (b) {
|
|
5507
|
+
p != null && p.signal.aborted || k.error("failed to send message", b);
|
|
5341
5508
|
} finally {
|
|
5342
5509
|
p != null && p.signal.aborted || this.state.setPartial({
|
|
5343
5510
|
isSendingMessage: !1,
|
|
5344
5511
|
isSendingMessageToAI: !1
|
|
5345
5512
|
});
|
|
5346
5513
|
}
|
|
5347
|
-
}, this.toUserMessage = (
|
|
5514
|
+
}, this.toUserMessage = (_, p, u, m) => {
|
|
5348
5515
|
const g = (() => {
|
|
5349
|
-
const
|
|
5350
|
-
return this.state.get().messages.length === 0 &&
|
|
5516
|
+
const v = this.contactCtx.state.get().extraCollectedData;
|
|
5517
|
+
return this.state.get().messages.length === 0 && v && Object.keys(v).length > 0 ? `${Object.entries(v).filter(([b, w]) => !!w).map(([b, w]) => `${b}: ${w}`).join(`
|
|
5351
5518
|
`)}
|
|
5352
5519
|
|
|
5353
|
-
${
|
|
5520
|
+
${_}` : _;
|
|
5354
5521
|
})();
|
|
5355
5522
|
return {
|
|
5356
5523
|
id: x(),
|
|
@@ -5361,11 +5528,11 @@ ${l}` : l;
|
|
|
5361
5528
|
mentions: m,
|
|
5362
5529
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
5363
5530
|
};
|
|
5364
|
-
}, this.toBotMessage = (
|
|
5531
|
+
}, this.toBotMessage = (_) => {
|
|
5365
5532
|
var p;
|
|
5366
|
-
return
|
|
5533
|
+
return _.success && _.autopilotResponse ? {
|
|
5367
5534
|
type: "AI",
|
|
5368
|
-
id:
|
|
5535
|
+
id: _.autopilotResponse.id || x(),
|
|
5369
5536
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
5370
5537
|
component: "bot_message",
|
|
5371
5538
|
agent: this.config.bot ? {
|
|
@@ -5377,24 +5544,24 @@ ${l}` : l;
|
|
|
5377
5544
|
id: null
|
|
5378
5545
|
} : void 0,
|
|
5379
5546
|
data: {
|
|
5380
|
-
message:
|
|
5381
|
-
action: (p =
|
|
5382
|
-
name:
|
|
5383
|
-
data:
|
|
5547
|
+
message: _.autopilotResponse.value.content,
|
|
5548
|
+
action: (p = _.uiResponse) != null && p.value.name ? {
|
|
5549
|
+
name: _.uiResponse.value.name,
|
|
5550
|
+
data: _.uiResponse.value.request_response
|
|
5384
5551
|
} : void 0
|
|
5385
5552
|
}
|
|
5386
5553
|
} : null;
|
|
5387
|
-
}, this.toBotErrorMessage = (
|
|
5554
|
+
}, this.toBotErrorMessage = (_) => ({
|
|
5388
5555
|
type: "AI",
|
|
5389
5556
|
id: x(),
|
|
5390
5557
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
5391
5558
|
component: "bot_message",
|
|
5392
5559
|
data: {
|
|
5393
|
-
message:
|
|
5560
|
+
message: _,
|
|
5394
5561
|
variant: "error",
|
|
5395
5562
|
action: void 0
|
|
5396
5563
|
}
|
|
5397
|
-
}), this.config = e, this.getClientCapabilities =
|
|
5564
|
+
}), this.config = e, this.getClientCapabilities = a ?? (() => this.getRequestConfig().capabilities), this.api = t, this.sessionCtx = o, this.contactCtx = r, this.isStreaming = c ?? (() => l), this.getRequestConfig = i ?? (() => this.config), this.getSendsPageContext = d ?? (() => s);
|
|
5398
5565
|
}
|
|
5399
5566
|
/**
|
|
5400
5567
|
* Current transport choice. The org or this embed may request polling
|
|
@@ -5407,18 +5574,18 @@ ${l}` : l;
|
|
|
5407
5574
|
return this.getSendsPageContext();
|
|
5408
5575
|
}
|
|
5409
5576
|
/** Hand a send to the streaming engine; its failure can never propagate. */
|
|
5410
|
-
static dispatchToEngine(e,
|
|
5577
|
+
static dispatchToEngine(e, t) {
|
|
5411
5578
|
try {
|
|
5412
|
-
Promise.resolve(e.send(
|
|
5413
|
-
|
|
5579
|
+
Promise.resolve(e.send(t)).catch((o) => {
|
|
5580
|
+
k.error("streaming send failed", o);
|
|
5414
5581
|
});
|
|
5415
|
-
} catch (
|
|
5416
|
-
|
|
5582
|
+
} catch (o) {
|
|
5583
|
+
k.error("streaming send failed", o);
|
|
5417
5584
|
}
|
|
5418
5585
|
}
|
|
5419
5586
|
get hasPendingAgentWork() {
|
|
5420
|
-
var e,
|
|
5421
|
-
return this.bufferedAgentSends.length > 0 || (((
|
|
5587
|
+
var e, t;
|
|
5588
|
+
return this.bufferedAgentSends.length > 0 || (((t = (e = this.agentHandlers) == null ? void 0 : e.hasPendingWork) == null ? void 0 : t.call(e)) ?? !1);
|
|
5422
5589
|
}
|
|
5423
5590
|
/**
|
|
5424
5591
|
* Defensive read of `clientContext.page_marks` → the user bubble's context
|
|
@@ -5428,23 +5595,23 @@ ${l}` : l;
|
|
|
5428
5595
|
* without a usable name are dropped.
|
|
5429
5596
|
*/
|
|
5430
5597
|
static markedElementNames(e) {
|
|
5431
|
-
const
|
|
5432
|
-
if (!Array.isArray(
|
|
5433
|
-
const
|
|
5434
|
-
if (typeof
|
|
5435
|
-
const
|
|
5436
|
-
if (typeof
|
|
5437
|
-
const
|
|
5598
|
+
const t = e == null ? void 0 : e.page_marks;
|
|
5599
|
+
if (!Array.isArray(t)) return;
|
|
5600
|
+
const o = t.flatMap((r) => {
|
|
5601
|
+
if (typeof r != "object" || r === null) return [];
|
|
5602
|
+
const l = r.elements, s = Array.isArray(l) ? l[0] : void 0, a = typeof s == "object" && s !== null && "name" in s ? s.name : void 0;
|
|
5603
|
+
if (typeof a != "string" || a.length === 0) return [];
|
|
5604
|
+
const i = r.note, c = r.snapshotUrl;
|
|
5438
5605
|
return [
|
|
5439
5606
|
{
|
|
5440
|
-
name:
|
|
5441
|
-
...typeof
|
|
5607
|
+
name: a,
|
|
5608
|
+
...typeof i == "string" && i.length > 0 ? { note: i } : {},
|
|
5442
5609
|
...typeof c == "string" && c.length > 0 ? { snapshotUrl: c } : {},
|
|
5443
|
-
mark:
|
|
5610
|
+
mark: r
|
|
5444
5611
|
}
|
|
5445
5612
|
];
|
|
5446
5613
|
});
|
|
5447
|
-
return
|
|
5614
|
+
return o.length > 0 ? o : void 0;
|
|
5448
5615
|
}
|
|
5449
5616
|
/**
|
|
5450
5617
|
* The blocking engine refuses a send while the AI reply is pending unless
|
|
@@ -5454,124 +5621,124 @@ ${l}` : l;
|
|
|
5454
5621
|
return !this.streaming && this.config.disableSendingWhenAwaitingAIReply !== !1;
|
|
5455
5622
|
}
|
|
5456
5623
|
};
|
|
5457
|
-
|
|
5458
|
-
let
|
|
5459
|
-
class
|
|
5624
|
+
C.SENT_TEXT_HISTORY_MAX = 50;
|
|
5625
|
+
let D = C;
|
|
5626
|
+
class Ra {
|
|
5460
5627
|
constructor(e) {
|
|
5461
|
-
var
|
|
5628
|
+
var t, o;
|
|
5462
5629
|
this.widget = e, this.subscriptions = [], this.disposed = !1, this.restorableSessionId = null, this.didReadStoredSession = !1, this.readStoredSession = () => {
|
|
5463
5630
|
if (!this.shouldRestoreLastSession) {
|
|
5464
5631
|
this.didReadStoredSession = !0;
|
|
5465
5632
|
return;
|
|
5466
5633
|
}
|
|
5467
|
-
this.sessionCtx.getLastActiveSessionId().then((
|
|
5468
|
-
this.restorableSessionId =
|
|
5634
|
+
this.sessionCtx.getLastActiveSessionId().then((r) => {
|
|
5635
|
+
this.restorableSessionId = r;
|
|
5469
5636
|
}).finally(() => {
|
|
5470
5637
|
this.didReadStoredSession = !0, this.routeFromSessions(this.sessionCtx.sessionsState.get());
|
|
5471
5638
|
});
|
|
5472
5639
|
}, this.registerRoutingListener = () => {
|
|
5473
5640
|
this.subscriptions.push(
|
|
5474
|
-
this.contactCtx.state.subscribe(({ contact:
|
|
5475
|
-
var
|
|
5476
|
-
|
|
5477
|
-
screen: (
|
|
5641
|
+
this.contactCtx.state.subscribe(({ contact: r }) => {
|
|
5642
|
+
var l;
|
|
5643
|
+
r != null && r.token && this.state.get().screen === "welcome" && this.state.setPartial({
|
|
5644
|
+
screen: (l = this.config.router) != null && l.chatScreenOnly ? "chat" : "sessions"
|
|
5478
5645
|
});
|
|
5479
5646
|
})
|
|
5480
5647
|
), this.subscriptions.push(
|
|
5481
5648
|
this.sessionCtx.sessionsState.subscribe(this.routeFromSessions)
|
|
5482
5649
|
);
|
|
5483
5650
|
}, this.routeFromSessions = ({
|
|
5484
|
-
isInitialFetchLoading:
|
|
5485
|
-
data:
|
|
5651
|
+
isInitialFetchLoading: r,
|
|
5652
|
+
data: l
|
|
5486
5653
|
}) => {
|
|
5487
|
-
var
|
|
5654
|
+
var s, a, i, c, d;
|
|
5488
5655
|
if (!(this.disposed || !this.didReadStoredSession)) {
|
|
5489
|
-
if (this.restorableSessionId && !((
|
|
5490
|
-
const
|
|
5656
|
+
if (this.restorableSessionId && !((s = this.sessionCtx.sessionState.get().session) != null && s.id)) {
|
|
5657
|
+
const _ = l.find(
|
|
5491
5658
|
(p) => p.id === this.restorableSessionId && p.isOpened
|
|
5492
5659
|
);
|
|
5493
|
-
if (
|
|
5494
|
-
this.restorableSessionId = null, this.toChatScreen(
|
|
5660
|
+
if (_) {
|
|
5661
|
+
this.restorableSessionId = null, this.toChatScreen(_.id);
|
|
5495
5662
|
return;
|
|
5496
5663
|
}
|
|
5497
|
-
if (
|
|
5664
|
+
if (r) return;
|
|
5498
5665
|
this.restorableSessionId = null;
|
|
5499
5666
|
}
|
|
5500
|
-
if ((
|
|
5667
|
+
if ((a = this.config.router) != null && a.chatScreenOnly && // Do not route to a chat if we are currently inside one already
|
|
5501
5668
|
// This also applies to newly created sessions; the new session will be in `sessionState` before it is refreshed and included in `sessionsState`
|
|
5502
|
-
!((
|
|
5503
|
-
const
|
|
5504
|
-
return
|
|
5669
|
+
!((i = this.sessionCtx.sessionState.get().session) != null && i.id)) {
|
|
5670
|
+
const _ = (c = l.find((p) => p.isOpened)) == null ? void 0 : c.id;
|
|
5671
|
+
return _ ? this.toChatScreen(_) : void 0;
|
|
5505
5672
|
}
|
|
5506
|
-
|
|
5673
|
+
l.length || ((d = this.config.router) == null ? void 0 : d.goToChatIfNoSessions) !== !1 && !r && this.state.get().screen !== "chat" && this.toChatScreen();
|
|
5507
5674
|
}
|
|
5508
5675
|
}, this.dispose = () => {
|
|
5509
|
-
this.disposed = !0, this.subscriptions.forEach((
|
|
5676
|
+
this.disposed = !0, this.subscriptions.forEach((r) => r()), this.subscriptions = [], this.navigateConversation = void 0;
|
|
5510
5677
|
}, this.toSessionsScreen = () => {
|
|
5511
5678
|
this.navigateConversation || this.resetChat(), this.state.setPartial({ screen: "sessions" });
|
|
5512
|
-
}, this.toChatScreen = (
|
|
5513
|
-
var
|
|
5514
|
-
if (this.navigateConversation) return this.navigateConversation(
|
|
5679
|
+
}, this.toChatScreen = (r) => {
|
|
5680
|
+
var s, a;
|
|
5681
|
+
if (this.navigateConversation) return this.navigateConversation(r);
|
|
5515
5682
|
this.resetChat();
|
|
5516
|
-
let
|
|
5517
|
-
if (
|
|
5518
|
-
if (
|
|
5519
|
-
this.sessionCtx.sessionState.setPartial({ session:
|
|
5683
|
+
let l;
|
|
5684
|
+
if (r) {
|
|
5685
|
+
if (l = this.sessionCtx.sessionsState.get().data.find((i) => i.id === r), !l) return;
|
|
5686
|
+
this.sessionCtx.sessionState.setPartial({ session: l });
|
|
5520
5687
|
}
|
|
5521
|
-
return this.state.setPartial({ screen: "chat" }), (
|
|
5522
|
-
}, this.config = e.config, this.contactCtx = e.contactCtx, this.sessionCtx = e.sessionCtx, this.resetChat = e.resetChat, this.state = new
|
|
5523
|
-
screen: this.contactCtx.shouldCollectData() ? "welcome" : (
|
|
5524
|
-
}), this.shouldRestoreLastSession = ((
|
|
5688
|
+
return this.state.setPartial({ screen: "chat" }), (a = (s = this.config.hooks) == null ? void 0 : s.onNavigateToChat) == null || a.call(s, { session: l }), this.widget;
|
|
5689
|
+
}, this.config = e.config, this.contactCtx = e.contactCtx, this.sessionCtx = e.sessionCtx, this.resetChat = e.resetChat, this.state = new S({
|
|
5690
|
+
screen: this.contactCtx.shouldCollectData() ? "welcome" : (t = this.config.router) != null && t.chatScreenOnly ? "chat" : "sessions"
|
|
5691
|
+
}), this.shouldRestoreLastSession = ((o = this.config.router) == null ? void 0 : o.restoreLastSession) ?? !1, this.readStoredSession(), this.registerRoutingListener();
|
|
5525
5692
|
}
|
|
5526
5693
|
}
|
|
5527
|
-
class
|
|
5694
|
+
class Ka {
|
|
5528
5695
|
constructor({
|
|
5529
5696
|
storage: e,
|
|
5530
|
-
config:
|
|
5697
|
+
config: t
|
|
5531
5698
|
}) {
|
|
5532
5699
|
this.KEYS = {
|
|
5533
|
-
contactToken: (
|
|
5534
|
-
externalContactId: (
|
|
5535
|
-
companionPreference: (
|
|
5536
|
-
activeSession: (
|
|
5537
|
-
}, this.setContactToken = async (
|
|
5538
|
-
await this.storage.set(this.KEYS.contactToken(this.config.token),
|
|
5700
|
+
contactToken: (o) => `opencx-widget:org-token-${o}:contact-token`,
|
|
5701
|
+
externalContactId: (o) => `opencx-widget:org-token-${o}:external-contact-id`,
|
|
5702
|
+
companionPreference: (o, r) => `opencx-widget:org-token-${o}:companion-${r}`,
|
|
5703
|
+
activeSession: (o) => `opencx-widget:org-token-${o}:active-session`
|
|
5704
|
+
}, this.setContactToken = async (o) => {
|
|
5705
|
+
await this.storage.set(this.KEYS.contactToken(this.config.token), o);
|
|
5539
5706
|
}, this.getContactToken = async () => this.storage.get(this.KEYS.contactToken(this.config.token)), this.clearContactToken = async () => {
|
|
5540
5707
|
await this.storage.remove(this.KEYS.contactToken(this.config.token));
|
|
5541
|
-
}, this.activeSessionKey = () => this.KEYS.activeSession(this.config.token), this.getActiveSessionId = async () => this.storage.get(this.activeSessionKey()), this.setActiveSessionId = async (
|
|
5542
|
-
await this.storage.set(this.activeSessionKey(),
|
|
5708
|
+
}, this.activeSessionKey = () => this.KEYS.activeSession(this.config.token), this.getActiveSessionId = async () => this.storage.get(this.activeSessionKey()), this.setActiveSessionId = async (o) => {
|
|
5709
|
+
await this.storage.set(this.activeSessionKey(), o);
|
|
5543
5710
|
}, this.clearActiveSessionId = async () => {
|
|
5544
5711
|
await this.storage.remove(this.activeSessionKey());
|
|
5545
|
-
}, this.setExternalContactId = async (
|
|
5546
|
-
await this.storage.set(this.KEYS.externalContactId(this.config.token),
|
|
5547
|
-
}, this.getExternalContactId = async () => this.storage.get(this.KEYS.externalContactId(this.config.token)), this.companionKey = (
|
|
5548
|
-
const
|
|
5549
|
-
if (
|
|
5550
|
-
const
|
|
5551
|
-
return Number.isFinite(
|
|
5552
|
-
}, this.getCompanionPillOffsetX = async () => this.getFiniteNumber(this.companionKey("pill-offset-x")), this.setCompanionPillOffsetX = async (
|
|
5553
|
-
Number.isFinite(
|
|
5554
|
-
}, this.getCompanionSidebarWidth = async () => this.getFiniteNumber(this.companionKey("sidebar-width")), this.setCompanionSidebarWidth = async (
|
|
5555
|
-
Number.isFinite(
|
|
5712
|
+
}, this.setExternalContactId = async (o) => {
|
|
5713
|
+
await this.storage.set(this.KEYS.externalContactId(this.config.token), o);
|
|
5714
|
+
}, this.getExternalContactId = async () => this.storage.get(this.KEYS.externalContactId(this.config.token)), this.companionKey = (o) => this.KEYS.companionPreference(this.config.token, o), this.getFiniteNumber = async (o) => {
|
|
5715
|
+
const r = await this.storage.get(o);
|
|
5716
|
+
if (r === null) return null;
|
|
5717
|
+
const l = Number(r);
|
|
5718
|
+
return Number.isFinite(l) ? l : null;
|
|
5719
|
+
}, this.getCompanionPillOffsetX = async () => this.getFiniteNumber(this.companionKey("pill-offset-x")), this.setCompanionPillOffsetX = async (o) => {
|
|
5720
|
+
Number.isFinite(o) && await this.storage.set(this.companionKey("pill-offset-x"), String(o));
|
|
5721
|
+
}, this.getCompanionSidebarWidth = async () => this.getFiniteNumber(this.companionKey("sidebar-width")), this.setCompanionSidebarWidth = async (o) => {
|
|
5722
|
+
Number.isFinite(o) && await this.storage.set(this.companionKey("sidebar-width"), String(o));
|
|
5556
5723
|
}, this.getCompanionSidebarSide = async () => {
|
|
5557
|
-
const
|
|
5558
|
-
return
|
|
5559
|
-
}, this.setCompanionSidebarSide = async (
|
|
5560
|
-
await this.storage.set(this.companionKey("sidebar-side"),
|
|
5724
|
+
const o = await this.storage.get(this.companionKey("sidebar-side"));
|
|
5725
|
+
return o === "left" || o === "right" ? o : null;
|
|
5726
|
+
}, this.setCompanionSidebarSide = async (o) => {
|
|
5727
|
+
await this.storage.set(this.companionKey("sidebar-side"), o);
|
|
5561
5728
|
}, this.getCompanionLayout = async () => {
|
|
5562
|
-
const
|
|
5563
|
-
return
|
|
5564
|
-
}, this.setCompanionLayout = async (
|
|
5565
|
-
await this.storage.set(this.companionKey("layout"),
|
|
5729
|
+
const o = await this.storage.get(this.companionKey("layout"));
|
|
5730
|
+
return o === "compact" || o === "sidebar" ? o : null;
|
|
5731
|
+
}, this.setCompanionLayout = async (o) => {
|
|
5732
|
+
await this.storage.set(this.companionKey("layout"), o);
|
|
5566
5733
|
}, this.getCompanionSidebarMode = async () => {
|
|
5567
|
-
const
|
|
5568
|
-
return
|
|
5569
|
-
}, this.setCompanionSidebarMode = async (
|
|
5570
|
-
await this.storage.set(this.companionKey("sidebar-mode"),
|
|
5571
|
-
}, this.storage = e, this.config =
|
|
5734
|
+
const o = await this.storage.get(this.companionKey("sidebar-mode"));
|
|
5735
|
+
return o === "docked" || o === "floating" ? o : null;
|
|
5736
|
+
}, this.setCompanionSidebarMode = async (o) => {
|
|
5737
|
+
await this.storage.set(this.companionKey("sidebar-mode"), o);
|
|
5738
|
+
}, this.storage = e, this.config = t;
|
|
5572
5739
|
}
|
|
5573
5740
|
}
|
|
5574
|
-
function
|
|
5741
|
+
function La({
|
|
5575
5742
|
org: n,
|
|
5576
5743
|
agent: e
|
|
5577
5744
|
}) {
|
|
@@ -5601,39 +5768,39 @@ function Ta({
|
|
|
5601
5768
|
function M(n, e) {
|
|
5602
5769
|
return n && e !== !1;
|
|
5603
5770
|
}
|
|
5604
|
-
function
|
|
5605
|
-
const
|
|
5771
|
+
function Fa(n, e) {
|
|
5772
|
+
const t = e.features;
|
|
5606
5773
|
return {
|
|
5607
|
-
dictation: M(n.features.dictation,
|
|
5774
|
+
dictation: M(n.features.dictation, t == null ? void 0 : t.dictation),
|
|
5608
5775
|
attachments: n.features.attachments,
|
|
5609
5776
|
pageContext: M(
|
|
5610
5777
|
n.features.pageContext,
|
|
5611
|
-
|
|
5778
|
+
t == null ? void 0 : t.pageContext
|
|
5612
5779
|
),
|
|
5613
5780
|
clientTools: M(
|
|
5614
5781
|
n.features.clientTools,
|
|
5615
|
-
|
|
5782
|
+
t == null ? void 0 : t.clientTools
|
|
5616
5783
|
)
|
|
5617
5784
|
};
|
|
5618
5785
|
}
|
|
5619
|
-
class
|
|
5620
|
-
constructor(e,
|
|
5621
|
-
super(
|
|
5786
|
+
class Oa extends Error {
|
|
5787
|
+
constructor(e, t, o) {
|
|
5788
|
+
super(t), this.name = "WidgetInitializationError", this.code = e, this.details = o;
|
|
5622
5789
|
}
|
|
5623
5790
|
}
|
|
5624
|
-
const
|
|
5791
|
+
const j = class j {
|
|
5625
5792
|
constructor({
|
|
5626
5793
|
config: e,
|
|
5627
|
-
storage:
|
|
5628
|
-
getClientCapabilities:
|
|
5629
|
-
getRequestConfig:
|
|
5630
|
-
modes:
|
|
5631
|
-
org:
|
|
5632
|
-
agent:
|
|
5633
|
-
parent:
|
|
5794
|
+
storage: t,
|
|
5795
|
+
getClientCapabilities: o,
|
|
5796
|
+
getRequestConfig: r,
|
|
5797
|
+
modes: l,
|
|
5798
|
+
org: s,
|
|
5799
|
+
agent: a,
|
|
5800
|
+
parent: i
|
|
5634
5801
|
}) {
|
|
5635
|
-
if (this.modes = [], this.createConversation = () => {
|
|
5636
|
-
const c = new
|
|
5802
|
+
if (this.modes = [], this.disposed = !1, this.createConversation = () => {
|
|
5803
|
+
const c = new j({
|
|
5637
5804
|
config: {
|
|
5638
5805
|
...this.config,
|
|
5639
5806
|
router: {
|
|
@@ -5653,27 +5820,30 @@ const w = class w {
|
|
|
5653
5820
|
return c.routerCtx.state.setPartial({
|
|
5654
5821
|
screen: this.contactCtx.shouldCollectData() ? "welcome" : "chat"
|
|
5655
5822
|
}), c;
|
|
5656
|
-
}, this.releaseConversation = () => {
|
|
5657
|
-
this.
|
|
5823
|
+
}, this.releaseConversation = () => this.dispose(), this.dispose = ({ clearActiveSession: c = !1 } = {}) => {
|
|
5824
|
+
if (this.disposed) return;
|
|
5825
|
+
this.disposed = !0, this.routerCtx.dispose(), this.activeSessionPollingCtx.dispose();
|
|
5826
|
+
const d = this.sessionCtx.dispose({ clearActiveSession: c });
|
|
5827
|
+
return this.messageCtx.reset(), this.uploadCtx.reset(), this.dictationCtx.stop(), d;
|
|
5658
5828
|
}, this.resetChat = () => {
|
|
5659
5829
|
this.sessionCtx.reset(), this.messageCtx.reset(), this.uploadCtx.reset();
|
|
5660
|
-
}, this.reconcileAfterStream = (c) => this.activeSessionPollingCtx.reconcileAfterStream(c), !
|
|
5830
|
+
}, this.reconcileAfterStream = (c) => this.activeSessionPollingCtx.reconcileAfterStream(c), !j.pollingIntervalsSeconds)
|
|
5661
5831
|
throw Error(
|
|
5662
5832
|
"Widget polling values are not defined, did you call WidgetCtx.initialize()"
|
|
5663
5833
|
);
|
|
5664
|
-
this.config = e, this.getRequestConfig =
|
|
5834
|
+
this.config = e, this.getRequestConfig = r ?? (() => this.config), this.getClientCapabilities = o, this.org = s, this.agent = a, this.api = (i == null ? void 0 : i.api) ?? new B({ config: e }), this.storageCtx = (i == null ? void 0 : i.storageCtx) ?? (t ? new Ka({ storage: t, config: e }) : void 0), this.modes = l, this.contactCtx = (i == null ? void 0 : i.contactCtx) ?? new ge({
|
|
5665
5835
|
api: this.api,
|
|
5666
5836
|
config: this.config,
|
|
5667
5837
|
storageCtx: this.storageCtx
|
|
5668
|
-
}), this.sessionCtx = new
|
|
5838
|
+
}), this.sessionCtx = new Aa({
|
|
5669
5839
|
config: this.config,
|
|
5670
5840
|
api: this.api,
|
|
5671
5841
|
contactCtx: this.contactCtx,
|
|
5672
5842
|
// Remembers the open conversation so a reload can return to it.
|
|
5673
|
-
storageCtx:
|
|
5674
|
-
sharedSessions:
|
|
5675
|
-
sessionsPollingIntervalSeconds:
|
|
5676
|
-
}), this.messageCtx = new
|
|
5843
|
+
storageCtx: i ? void 0 : this.storageCtx,
|
|
5844
|
+
sharedSessions: i == null ? void 0 : i.sessionCtx.sessionsState,
|
|
5845
|
+
sessionsPollingIntervalSeconds: j.pollingIntervalsSeconds.sessions
|
|
5846
|
+
}), this.messageCtx = new D({
|
|
5677
5847
|
config: this.config,
|
|
5678
5848
|
api: this.api,
|
|
5679
5849
|
sessionCtx: this.sessionCtx,
|
|
@@ -5684,78 +5854,78 @@ const w = class w {
|
|
|
5684
5854
|
isStreaming: () => this.streaming,
|
|
5685
5855
|
sendsPageContext: this.features.pageContext,
|
|
5686
5856
|
getSendsPageContext: () => this.features.pageContext,
|
|
5687
|
-
getClientCapabilities:
|
|
5688
|
-
getRequestConfig:
|
|
5689
|
-
}), this.uploadCtx = new
|
|
5857
|
+
getClientCapabilities: o,
|
|
5858
|
+
getRequestConfig: r
|
|
5859
|
+
}), this.uploadCtx = new ke(this.api), this.csatCtx = new be({
|
|
5690
5860
|
api: this.api,
|
|
5691
5861
|
sessionCtx: this.sessionCtx,
|
|
5692
5862
|
messageCtx: this.messageCtx
|
|
5693
|
-
}), this.dictationCtx = new
|
|
5863
|
+
}), this.dictationCtx = new Fe({
|
|
5694
5864
|
api: this.api,
|
|
5695
5865
|
config: this.config
|
|
5696
|
-
}), this.activeSessionPollingCtx = new
|
|
5866
|
+
}), this.activeSessionPollingCtx = new he({
|
|
5697
5867
|
api: this.api,
|
|
5698
5868
|
config: this.config,
|
|
5699
5869
|
sessionCtx: this.sessionCtx,
|
|
5700
5870
|
messageCtx: this.messageCtx,
|
|
5701
|
-
sessionPollingIntervalSeconds:
|
|
5702
|
-
}), this.routerCtx = new
|
|
5871
|
+
sessionPollingIntervalSeconds: j.pollingIntervalsSeconds.session
|
|
5872
|
+
}), this.routerCtx = new Ra(this);
|
|
5703
5873
|
}
|
|
5704
5874
|
get streaming() {
|
|
5705
|
-
var e,
|
|
5706
|
-
return (e = this.messageCtx) != null && e.hasPendingAgentWork ? !0 : (
|
|
5875
|
+
var e, t;
|
|
5876
|
+
return (e = this.messageCtx) != null && e.hasPendingAgentWork ? !0 : (t = this.messageCtx) != null && t.state.get().isSendingMessage ? !1 : this.agent.streaming && this.getRequestConfig().streaming !== !1;
|
|
5707
5877
|
}
|
|
5708
5878
|
/**
|
|
5709
5879
|
* The org's features narrowed by this embed's `config.features` — the
|
|
5710
5880
|
* answers the UI asks for, resolved against the current options.
|
|
5711
5881
|
*/
|
|
5712
5882
|
get features() {
|
|
5713
|
-
return
|
|
5883
|
+
return Fa(this.agent, this.getRequestConfig());
|
|
5714
5884
|
}
|
|
5715
5885
|
};
|
|
5716
|
-
|
|
5886
|
+
j.pollingIntervalsSeconds = null, j.initialize = async ({
|
|
5717
5887
|
config: e,
|
|
5718
|
-
storage:
|
|
5719
|
-
getClientCapabilities:
|
|
5720
|
-
getRequestConfig:
|
|
5888
|
+
storage: t,
|
|
5889
|
+
getClientCapabilities: o,
|
|
5890
|
+
getRequestConfig: r
|
|
5721
5891
|
}) => {
|
|
5722
|
-
var
|
|
5723
|
-
const
|
|
5892
|
+
var s, a;
|
|
5893
|
+
const l = await new B({
|
|
5724
5894
|
config: e
|
|
5725
5895
|
}).getExternalWidgetConfig();
|
|
5726
|
-
if (!
|
|
5727
|
-
throw
|
|
5896
|
+
if (!l.data)
|
|
5897
|
+
throw k.error("widget config fetch failed", l.error), new Oa(
|
|
5728
5898
|
"config-fetch-failed",
|
|
5729
5899
|
"Failed to fetch widget config",
|
|
5730
|
-
|
|
5900
|
+
l.error
|
|
5731
5901
|
);
|
|
5732
|
-
return
|
|
5733
|
-
session: ((
|
|
5734
|
-
sessions: ((
|
|
5735
|
-
}, new
|
|
5902
|
+
return j.pollingIntervalsSeconds = {
|
|
5903
|
+
session: ((s = l.data) == null ? void 0 : s.sessionPollingIntervalSeconds) || 10,
|
|
5904
|
+
sessions: ((a = l.data) == null ? void 0 : a.sessionsPollingIntervalSeconds) || 60
|
|
5905
|
+
}, new j({
|
|
5736
5906
|
config: e,
|
|
5737
|
-
storage:
|
|
5738
|
-
getClientCapabilities:
|
|
5739
|
-
getRequestConfig:
|
|
5740
|
-
modes:
|
|
5907
|
+
storage: t,
|
|
5908
|
+
getClientCapabilities: o,
|
|
5909
|
+
getRequestConfig: r,
|
|
5910
|
+
modes: l.data.modes || [],
|
|
5741
5911
|
org: {
|
|
5742
|
-
id:
|
|
5743
|
-
name:
|
|
5912
|
+
id: l.data.org.id,
|
|
5913
|
+
name: l.data.org.name
|
|
5744
5914
|
},
|
|
5745
|
-
agent:
|
|
5915
|
+
agent: La(l.data)
|
|
5746
5916
|
});
|
|
5747
5917
|
};
|
|
5748
|
-
let
|
|
5749
|
-
function
|
|
5918
|
+
let W = j;
|
|
5919
|
+
function Ya(n, e) {
|
|
5750
5920
|
return n ? {
|
|
5751
5921
|
streaming: n.streaming && (e == null ? void 0 : e.streaming) !== !1,
|
|
5752
5922
|
toolActivity: n.toolActivity === "hidden" || (e == null ? void 0 : e.toolActivity) === "hidden" ? "hidden" : n.toolActivity === "status" || (e == null ? void 0 : e.toolActivity) === "status" ? "status" : "details",
|
|
5753
5923
|
reasoning: n.reasoning && (e == null ? void 0 : e.reasoning) !== !1
|
|
5754
5924
|
} : e;
|
|
5755
5925
|
}
|
|
5756
|
-
class
|
|
5757
|
-
constructor({ attack: e, release:
|
|
5758
|
-
this.value = 0, this.attack = e, this.release =
|
|
5926
|
+
class Qa {
|
|
5927
|
+
constructor({ attack: e, release: t }) {
|
|
5928
|
+
this.value = 0, this.attack = e, this.release = t;
|
|
5759
5929
|
}
|
|
5760
5930
|
next(e) {
|
|
5761
5931
|
return this.value += (e - this.value) * (e > this.value ? this.attack : this.release), this.value;
|
|
@@ -5764,54 +5934,56 @@ class Va {
|
|
|
5764
5934
|
return this.value;
|
|
5765
5935
|
}
|
|
5766
5936
|
}
|
|
5767
|
-
const
|
|
5937
|
+
const T = [
|
|
5768
5938
|
"compact",
|
|
5769
5939
|
"sidebar",
|
|
5770
5940
|
"fullscreen"
|
|
5771
|
-
],
|
|
5772
|
-
|
|
5941
|
+
], Ua = new Set(
|
|
5942
|
+
T
|
|
5773
5943
|
);
|
|
5774
|
-
function
|
|
5775
|
-
return
|
|
5944
|
+
function Q(n) {
|
|
5945
|
+
return Ua.has(n);
|
|
5776
5946
|
}
|
|
5777
|
-
function
|
|
5778
|
-
if (!Array.isArray(n)) return
|
|
5779
|
-
const e = [],
|
|
5780
|
-
for (const
|
|
5781
|
-
|
|
5782
|
-
return e.length > 0 ? e :
|
|
5947
|
+
function Xa(n) {
|
|
5948
|
+
if (!Array.isArray(n)) return T;
|
|
5949
|
+
const e = [], t = /* @__PURE__ */ new Set();
|
|
5950
|
+
for (const o of n)
|
|
5951
|
+
!Q(o) || t.has(o) || (t.add(o), e.push(o));
|
|
5952
|
+
return e.length > 0 ? e : T;
|
|
5783
5953
|
}
|
|
5784
|
-
function
|
|
5785
|
-
return
|
|
5954
|
+
function et(n, e) {
|
|
5955
|
+
return Q(n) && e.includes(n) ? n : e[0] ?? T[0];
|
|
5786
5956
|
}
|
|
5787
|
-
function
|
|
5957
|
+
function at(n, e) {
|
|
5788
5958
|
return n === "left" || n === "right" ? n : e === "rtl" ? "left" : "right";
|
|
5789
5959
|
}
|
|
5790
|
-
function
|
|
5960
|
+
function tt(n) {
|
|
5791
5961
|
return n === "docked" ? "docked" : "floating";
|
|
5792
5962
|
}
|
|
5793
5963
|
export {
|
|
5794
|
-
|
|
5795
|
-
|
|
5796
|
-
|
|
5797
|
-
|
|
5798
|
-
|
|
5964
|
+
pe as ConnectionAttemptUnavailableError,
|
|
5965
|
+
ce as ConnectionRequestExpiredError,
|
|
5966
|
+
Qa as DictationLevelSmoother,
|
|
5967
|
+
S as PrimitiveState,
|
|
5968
|
+
W as WidgetCtx,
|
|
5969
|
+
Oa as WidgetInitializationError,
|
|
5970
|
+
Na as buildSendMessageBody,
|
|
5799
5971
|
x as genUuid,
|
|
5800
|
-
|
|
5801
|
-
|
|
5802
|
-
|
|
5803
|
-
|
|
5804
|
-
|
|
5805
|
-
|
|
5806
|
-
|
|
5807
|
-
|
|
5808
|
-
|
|
5809
|
-
|
|
5810
|
-
|
|
5811
|
-
|
|
5812
|
-
|
|
5813
|
-
|
|
5814
|
-
|
|
5815
|
-
|
|
5972
|
+
qa as getTranslation,
|
|
5973
|
+
Ga as isAgentStreamKeepalive,
|
|
5974
|
+
me as isExhaustive,
|
|
5975
|
+
Z as isRecord,
|
|
5976
|
+
Ja as isRtlLanguage,
|
|
5977
|
+
za as isSupportedLanguage,
|
|
5978
|
+
$a as isTurnSteeredPart,
|
|
5979
|
+
k as log,
|
|
5980
|
+
Xa as normalizeCompanionLayouts,
|
|
5981
|
+
Ya as resolveClientPresentation,
|
|
5982
|
+
et as resolveCompanionDefaultLayout,
|
|
5983
|
+
Ma as resolveConfigContext,
|
|
5984
|
+
xa as resolveLanguage,
|
|
5985
|
+
tt as resolveSidebarMode,
|
|
5986
|
+
at as resolveSidebarSide,
|
|
5987
|
+
Ea as translate
|
|
5816
5988
|
};
|
|
5817
5989
|
//# sourceMappingURL=index.js.map
|