@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.
Files changed (97) hide show
  1. package/dist/index.cjs +8 -8
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +1149 -977
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/api/api-caller.d.ts +67 -0
  6. package/dist/src/api/api-caller.d.ts.map +1 -1
  7. package/dist/src/api/elicitation.d.ts +60 -0
  8. package/dist/src/api/elicitation.d.ts.map +1 -0
  9. package/dist/src/api/schema.d.ts +517 -56
  10. package/dist/src/api/schema.d.ts.map +1 -1
  11. package/dist/src/context/active-session-polling.ctx.d.ts +2 -0
  12. package/dist/src/context/active-session-polling.ctx.d.ts.map +1 -1
  13. package/dist/src/context/message.ctx.d.ts +4 -0
  14. package/dist/src/context/message.ctx.d.ts.map +1 -1
  15. package/dist/src/context/session.ctx.d.ts +5 -0
  16. package/dist/src/context/session.ctx.d.ts.map +1 -1
  17. package/dist/src/context/widget.ctx.d.ts +6 -1
  18. package/dist/src/context/widget.ctx.d.ts.map +1 -1
  19. package/dist/src/index.d.ts +3 -0
  20. package/dist/src/index.d.ts.map +1 -1
  21. package/dist/src/types/messages.d.ts +2 -0
  22. package/dist/src/types/messages.d.ts.map +1 -1
  23. package/dist/src/types/widget-config.d.ts +2 -0
  24. package/dist/src/types/widget-config.d.ts.map +1 -1
  25. package/package.json +3 -2
  26. package/dist/src/__tests__/api/agent-stream-parts.spec.d.ts +0 -2
  27. package/dist/src/__tests__/api/agent-stream-parts.spec.d.ts.map +0 -1
  28. package/dist/src/__tests__/api/dictation-mint-cache.spec.d.ts +0 -2
  29. package/dist/src/__tests__/api/dictation-mint-cache.spec.d.ts.map +0 -1
  30. package/dist/src/__tests__/api/widget-api-wire.spec.d.ts +0 -2
  31. package/dist/src/__tests__/api/widget-api-wire.spec.d.ts.map +0 -1
  32. package/dist/src/__tests__/api-caller.mock.d.ts +0 -2
  33. package/dist/src/__tests__/api-caller.mock.d.ts.map +0 -1
  34. package/dist/src/__tests__/context/contact/auth/auto-create-unverified-anonymous.spec.d.ts +0 -1
  35. package/dist/src/__tests__/context/contact/auth/auto-create-unverified-anonymous.spec.d.ts.map +0 -1
  36. package/dist/src/__tests__/context/contact/auth/auto-create-unverified-with-user-data-provided-by-org.spec.d.ts +0 -1
  37. package/dist/src/__tests__/context/contact/auth/auto-create-unverified-with-user-data-provided-by-org.spec.d.ts.map +0 -1
  38. package/dist/src/__tests__/context/contact/auth/manually-create-unverified-with-user-data-provided-by-user.spec.d.ts +0 -1
  39. package/dist/src/__tests__/context/contact/auth/manually-create-unverified-with-user-data-provided-by-user.spec.d.ts.map +0 -1
  40. package/dist/src/__tests__/context/contact/auth/with-secure-token.spec.d.ts +0 -1
  41. package/dist/src/__tests__/context/contact/auth/with-secure-token.spec.d.ts.map +0 -1
  42. package/dist/src/__tests__/context/contact/should-collect-data.spec.d.ts +0 -1
  43. package/dist/src/__tests__/context/contact/should-collect-data.spec.d.ts.map +0 -1
  44. package/dist/src/__tests__/context/contact-ctx.create-failure.spec.d.ts +0 -2
  45. package/dist/src/__tests__/context/contact-ctx.create-failure.spec.d.ts.map +0 -1
  46. package/dist/src/__tests__/context/dictation-ctx.spec.d.ts +0 -1
  47. package/dist/src/__tests__/context/dictation-ctx.spec.d.ts.map +0 -1
  48. package/dist/src/__tests__/context/message/merge-send-context.spec.d.ts +0 -2
  49. package/dist/src/__tests__/context/message/merge-send-context.spec.d.ts.map +0 -1
  50. package/dist/src/__tests__/context/message/on-message-received-hook.spec.d.ts +0 -1
  51. package/dist/src/__tests__/context/message/on-message-received-hook.spec.d.ts.map +0 -1
  52. package/dist/src/__tests__/context/message/pending-user-messages.spec.d.ts +0 -1
  53. package/dist/src/__tests__/context/message/pending-user-messages.spec.d.ts.map +0 -1
  54. package/dist/src/__tests__/context/message/sent-text-history.spec.d.ts +0 -1
  55. package/dist/src/__tests__/context/message/sent-text-history.spec.d.ts.map +0 -1
  56. package/dist/src/__tests__/context/message-ctx.agent-handlers.spec.d.ts +0 -2
  57. package/dist/src/__tests__/context/message-ctx.agent-handlers.spec.d.ts.map +0 -1
  58. package/dist/src/__tests__/context/message-ctx.client-context.spec.d.ts +0 -2
  59. package/dist/src/__tests__/context/message-ctx.client-context.spec.d.ts.map +0 -1
  60. package/dist/src/__tests__/context/message-ctx.mentions.spec.d.ts +0 -2
  61. package/dist/src/__tests__/context/message-ctx.mentions.spec.d.ts.map +0 -1
  62. package/dist/src/__tests__/context/message-ctx.page-mark-chips.spec.d.ts +0 -2
  63. package/dist/src/__tests__/context/message-ctx.page-mark-chips.spec.d.ts.map +0 -1
  64. package/dist/src/__tests__/context/message-ctx.send-acceptance.spec.d.ts +0 -2
  65. package/dist/src/__tests__/context/message-ctx.send-acceptance.spec.d.ts.map +0 -1
  66. package/dist/src/__tests__/context/message-ctx.send-features.spec.d.ts +0 -2
  67. package/dist/src/__tests__/context/message-ctx.send-features.spec.d.ts.map +0 -1
  68. package/dist/src/__tests__/context/reconcile-after-stream.spec.d.ts +0 -1
  69. package/dist/src/__tests__/context/reconcile-after-stream.spec.d.ts.map +0 -1
  70. package/dist/src/__tests__/context/resolve-client-presentation.spec.d.ts +0 -2
  71. package/dist/src/__tests__/context/resolve-client-presentation.spec.d.ts.map +0 -1
  72. package/dist/src/__tests__/context/restore-last-session.spec.d.ts +0 -2
  73. package/dist/src/__tests__/context/restore-last-session.spec.d.ts.map +0 -1
  74. package/dist/src/__tests__/context/session-ctx.stale-token-retry.spec.d.ts +0 -2
  75. package/dist/src/__tests__/context/session-ctx.stale-token-retry.spec.d.ts.map +0 -1
  76. package/dist/src/__tests__/context/storage-ctx.spec.d.ts +0 -2
  77. package/dist/src/__tests__/context/storage-ctx.spec.d.ts.map +0 -1
  78. package/dist/src/__tests__/context/streaming-engine.spec.d.ts +0 -1
  79. package/dist/src/__tests__/context/streaming-engine.spec.d.ts.map +0 -1
  80. package/dist/src/__tests__/context/upload.ctx.spec.d.ts +0 -2
  81. package/dist/src/__tests__/context/upload.ctx.spec.d.ts.map +0 -1
  82. package/dist/src/__tests__/context/widget-ctx.conversations.spec.d.ts +0 -1
  83. package/dist/src/__tests__/context/widget-ctx.conversations.spec.d.ts.map +0 -1
  84. package/dist/src/__tests__/context/widget-ctx.features.spec.d.ts +0 -1
  85. package/dist/src/__tests__/context/widget-ctx.features.spec.d.ts.map +0 -1
  86. package/dist/src/__tests__/dictation/dictation-commands.utils.spec.d.ts +0 -2
  87. package/dist/src/__tests__/dictation/dictation-commands.utils.spec.d.ts.map +0 -1
  88. package/dist/src/__tests__/test-utils.d.ts +0 -452
  89. package/dist/src/__tests__/test-utils.d.ts.map +0 -1
  90. package/dist/src/__tests__/translation.spec.d.ts +0 -2
  91. package/dist/src/__tests__/translation.spec.d.ts.map +0 -1
  92. package/dist/src/__tests__/utils/Poller.spec.d.ts +0 -2
  93. package/dist/src/__tests__/utils/Poller.spec.d.ts.map +0 -1
  94. package/dist/src/__tests__/utils/PrimitiveState.spec.d.ts +0 -2
  95. package/dist/src/__tests__/utils/PrimitiveState.spec.d.ts.map +0 -1
  96. package/dist/src/__tests__/utils/companion-layout.spec.d.ts +0 -2
  97. package/dist/src/__tests__/utils/companion-layout.spec.d.ts.map +0 -1
package/dist/index.js CHANGED
@@ -1,154 +1,287 @@
1
- import ae from "openapi-fetch";
2
- import te from "lodash.isequal";
3
- import { v4 as D } from "uuid";
4
- const Fa = (n) => n.type === "data-keepalive", Oa = (n) => n.type === "data-turn-steered", L = "[opencx]", h = {
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(`${L} ${n}`, ...e);
48
+ console.warn(`${O} ${n}`, ...e);
7
49
  },
8
50
  error: (n, ...e) => {
9
- console.error(`${L} ${n}`, ...e);
51
+ console.error(`${O} ${n}`, ...e);
10
52
  }
11
- }, se = (n) => {
12
- h.error("request failed", n.error);
13
- }, oe = (n) => {
14
- const e = ae({
53
+ }, _e = (n) => {
54
+ k.error("request failed", n.error);
55
+ }, le = (n) => {
56
+ const e = se({
15
57
  baseUrl: n.baseUrl
16
- }), a = {
58
+ }), t = {
17
59
  onRequest: n.onRequest,
18
60
  onResponse: n.onResponse,
19
- onError: n.onError || se
61
+ onError: n.onError || _e
20
62
  };
21
- return e.use(a), e;
22
- }, ne = "/backend/widget/v5/chat/stream", ie = "/backend/widget/v5/chat/{sessionId}/stream", F = (n, e, a) => `${n.replace(/\/$/, "")}${a ? e.replace("{sessionId}", encodeURIComponent(a)) : e}`;
23
- class O {
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 i, _;
26
- this.userToken = null, this.constructClientOptions = (o) => {
27
- const t = this.config.apiUrl || "https://api.open.cx", r = {
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: o ? `Bearer ${o}` : void 0
84
+ Authorization: s ? `Bearer ${s}` : void 0
32
85
  };
33
- return { baseUrl: t, headers: r };
86
+ return { baseUrl: a, headers: i };
34
87
  }, this.createOpenAPIClient = ({
35
- baseUrl: o,
36
- headers: t
37
- }) => oe({
38
- baseUrl: o,
39
- onRequest: ({ request: r }) => {
40
- Object.entries(t).forEach(([c, d]) => {
41
- d && r.headers.set(c, 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.setAuthToken = (o) => {
45
- this.userToken = o;
46
- const { baseUrl: t, headers: r } = this.constructClientOptions(o);
47
- this.client = this.createOpenAPIClient({ baseUrl: t, headers: r });
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: o, headers: t } = this.constructClientOptions(this.userToken), r = {};
50
- for (const [c, d] of Object.entries(t))
51
- typeof d == "string" && (["content-type", "accept"].includes(c.toLowerCase()) || (r[c] = d));
52
- return { baseUrl: o, headers: r };
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: o, headers: t } = this.getStreamAuthContext();
184
+ const { baseUrl: s, headers: a } = this.getStreamAuthContext();
55
185
  return {
56
- api: F(o, ne),
57
- reconnectApi: (r) => F(o, ie, r),
58
- headers: t
186
+ api: U(s, de),
187
+ reconnectApi: (i) => U(s, ue, i),
188
+ headers: a
59
189
  };
60
- }, this.stopStream = async (o) => {
61
- const { response: t } = await this.client.POST(
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: o } } }
193
+ { params: { path: { sessionId: s } } }
64
194
  );
65
- if (!t.ok)
66
- throw new Error(`Failed to stop stream: ${t.status}`);
67
- }, this.getAgentTurnMessages = async (o, t) => {
68
- const { data: r, response: c } = await this.client.GET(
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: o },
202
+ path: { sessionId: s },
73
203
  query: {
74
- toolActivity: t == null ? void 0 : t.toolActivity,
75
- reasoning: (t == null ? void 0 : t.reasoning) === void 0 ? void 0 : t.reasoning ? "true" : "false"
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 r || (h.warn("agent turn messages fetch failed", c.status), null);
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: o
215
+ language: s
83
216
  }) => {
84
- const { data: t, response: r } = await this.client.POST(
217
+ const { data: a, response: i } = await this.client.POST(
85
218
  "/backend/widget/v5/dictation/sessions",
86
- { body: o ? { language: o } : {} }
219
+ { body: s ? { language: s } : {} }
87
220
  );
88
- if (!t)
89
- throw new Error(`Failed to start dictation: ${r.status}`);
90
- return t;
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 (o, t) => await this.client.POST("/backend/widget/v2/chat/send", {
96
- body: o,
97
- signal: t
98
- }), this.createUnverifiedContact = async (o) => await this.client.POST(
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: o
235
+ body: s
103
236
  }
104
- ), this.createSession = async (o, t) => await this.client.POST("/backend/widget/v2/create-session", {
105
- body: o,
106
- signal: t
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: o,
109
- abortSignal: t
241
+ sessionId: s,
242
+ abortSignal: a
110
243
  }) => await this.client.GET("/backend/widget/v2/poll/{sessionId}", {
111
- params: { path: { sessionId: o } },
112
- signal: t
244
+ params: { path: { sessionId: s } },
245
+ signal: a
113
246
  }), this.getSessions = async ({
114
- cursor: o,
115
- filters: t,
116
- abortSignal: r
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: o,
121
- filters: JSON.stringify(t)
253
+ offset: s,
254
+ filters: JSON.stringify(a)
122
255
  }
123
256
  },
124
- signal: r
257
+ signal: i
125
258
  }), this.uploadFile = async ({
126
- file: o,
127
- abortSignal: t,
128
- onProgress: r
259
+ file: s,
260
+ abortSignal: a,
261
+ onProgress: i
129
262
  }) => new Promise((c, d) => {
130
- var v;
131
- const l = new FormData();
132
- l.append("file", o);
263
+ var f;
264
+ const _ = new FormData();
265
+ _.append("file", s);
133
266
  const p = new XMLHttpRequest();
134
- if (t && (t.addEventListener("abort", () => {
267
+ if (a && (a.addEventListener("abort", () => {
135
268
  p.abort(), d(new DOMException("Aborted", "AbortError"));
136
- }), t.aborted)) {
269
+ }), a.aborted)) {
137
270
  d(new DOMException("Aborted", "AbortError"));
138
271
  return;
139
272
  }
140
- p.upload.addEventListener("progress", (k) => {
141
- if (k.lengthComputable && r) {
142
- const y = Math.round(k.loaded / k.total * 100);
143
- r(y);
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 k = JSON.parse(p.responseText);
149
- c(k);
150
- } catch (k) {
151
- d(new Error(`Failed to parse response: ${k}`));
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 ?? ((v = this.config.user) == null ? void 0 : v.token) ? p.setRequestHeader("Authorization", `Bearer ${this.userToken}`) : h.error("user token not set"), p.send(l);
162
- }), this.vote = async (o) => await this.client.POST("/backend/widget/v2/chat/vote", { body: o }), this.resolveSession = async (o, t) => await this.client.POST("/backend/widget/v2/session/resolve", {
163
- body: o,
164
- signal: t
165
- }), this.createStateCheckpoint = async (o) => await this.client.POST("/backend/widget/v2/checkpoint", {
166
- body: o
167
- }), this.submitCsat = async (o) => await this.client.POST("/backend/widget/v2/submit-csat", { body: o }), this.config = e, this.userToken = ((i = e.user) == null ? void 0 : i.token) || null;
168
- const { baseUrl: a, headers: s } = this.constructClientOptions(
169
- (_ = e.user) == null ? void 0 : _.token
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: a, headers: s });
304
+ this.client = this.createOpenAPIClient({ baseUrl: t, headers: o });
172
305
  }
173
306
  }
174
- function re(n, e) {
175
- h.error(`missing case for ${n} in ${e}`);
307
+ function me(n, e) {
308
+ k.error(`missing case for ${n} in ${e}`);
176
309
  }
177
- class j {
310
+ class S {
178
311
  constructor(e) {
179
- this.subscribers = /* @__PURE__ */ new Set(), this.get = () => this.state, this.set = (a) => {
180
- te(this.state, a) || (this.state = a, this.notifySubscribers(a));
181
- }, this.setPartial = (a) => {
182
- if (a == null) return;
183
- const s = { ...this.state, ...a };
184
- this.set(s);
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 = (a) => {
188
- Array.from(this.subscribers).forEach((i) => {
320
+ }, this.notifySubscribers = (t) => {
321
+ Array.from(this.subscribers).forEach((r) => {
189
322
  try {
190
- i(a);
191
- } catch (_) {
192
- h.error("state subscriber threw", _);
323
+ r(t);
324
+ } catch (l) {
325
+ k.error("state subscriber threw", l);
193
326
  }
194
327
  });
195
- }, this.subscribe = (a) => (this.subscribers.add(a), () => {
196
- this.subscribers.delete(a);
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 Z {
333
+ class G {
201
334
  constructor() {
202
- this.state = new j({
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, a) => {
341
+ }, this.stopPolling = null, this.startPolling = (e, t) => {
209
342
  if (this.stopPolling) return;
210
- const s = [], i = async () => {
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
- h.error("failed to poll", _), this.state.setPartial({ isError: !0 });
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 || s.push(setTimeout(i, a));
354
+ this.abortController.signal.aborted || o.push(setTimeout(r, t));
222
355
  };
223
- i(), this.stopPolling = () => {
224
- s.forEach(clearTimeout), this.state.reset();
356
+ r(), this.stopPolling = () => {
357
+ o.forEach(clearTimeout), this.state.reset();
225
358
  };
226
359
  };
227
360
  }
228
361
  }
229
- function G(n) {
362
+ function $(n) {
230
363
  try {
231
364
  const e = n();
232
- return e instanceof Promise ? e.then((a) => ({ data: a })).catch((a) => ({ error: a })) : { data: e };
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 _e {
370
+ class he {
238
371
  constructor({
239
372
  api: e,
240
- config: a,
241
- sessionCtx: s,
242
- messageCtx: i,
243
- sessionPollingIntervalSeconds: _
373
+ config: t,
374
+ sessionCtx: o,
375
+ messageCtx: r,
376
+ sessionPollingIntervalSeconds: l
244
377
  }) {
245
- this.poller = new Z(), this.fetchSessionAndFullHistoryAbortController = new AbortController(), this.reconcileAbortController = new AbortController(), this.reconcilingSessionId = null, this.registerPolling = () => {
246
- this.sessionCtx.sessionState.subscribe(({ session: o }) => {
247
- o != null && o.id ? this.poller.startPolling(async (t) => {
248
- this.fetchSessionAndHistory({ sessionId: o.id, abortSignal: t });
249
- }, this.sessionPollingIntervalSeconds * 1e3) : this.poller.reset();
250
- }), this.sessionCtx.sessionState.subscribe(({ session: o }) => {
251
- if (o != null && o.id && !o.isOpened)
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
- } catch (t) {
258
- this.fetchSessionAndFullHistoryAbortController.signal.aborted || h.error("failed to fetch session and full history", t);
259
- }
260
- else
261
- this.fetchSessionAndFullHistoryAbortController.abort();
262
- }), this.sessionCtx.sessionState.subscribe(({ session: o }) => {
263
- this.reconcilingSessionId !== null && (o == null ? void 0 : o.id) !== this.reconcilingSessionId && this.reconcileAbortController.abort();
264
- });
265
- }, this.reconcileAfterStream = async (o) => {
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: t } = this.reconcileAbortController;
268
- this.reconcilingSessionId = o;
411
+ const { signal: a } = this.reconcileAbortController;
412
+ this.reconcilingSessionId = s;
269
413
  try {
270
- await this.fetchSessionAndHistory({ sessionId: o, abortSignal: t });
271
- } catch (r) {
272
- if (!t.aborted) throw r;
414
+ await this.fetchSessionAndHistory({ sessionId: s, abortSignal: a });
415
+ } catch (i) {
416
+ if (!a.aborted) throw i;
273
417
  } finally {
274
- this.reconcilingSessionId === o && (this.reconcilingSessionId = null);
418
+ this.reconcilingSessionId === s && (this.reconcilingSessionId = null);
275
419
  }
276
420
  }, this.fetchSessionAndHistory = async ({
277
- sessionId: o,
278
- abortSignal: t
421
+ sessionId: s,
422
+ abortSignal: a
279
423
  }) => {
280
- const r = this.messageCtx.state.get().messages.length === 0;
281
- r && this.messageCtx.state.setPartial({ isInitialFetchLoading: !0 });
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: o,
284
- abortSignal: t
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, l = c.history.map(this.mapHistoryToMessage).filter((p) => p !== null).filter(
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 (l.length > 0)
434
+ if (_.length > 0)
291
435
  if (this.messageCtx.state.setPartial({
292
- messages: [...d, ...l]
293
- }), r)
436
+ messages: [...d, ..._]
437
+ }), i)
294
438
  this.messageCtx.markAsDispatchedToOnMessageReceivedHook(
295
- l.map((p) => p.id)
439
+ _.map((p) => p.id)
296
440
  );
297
441
  else
298
- for (const p of l)
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 = (o) => {
303
- var r;
304
- const t = {
305
- id: o.publicId,
306
- timestamp: o.sentAt || "",
307
- attachments: o.attachments || void 0
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 (o.sender.kind === "user")
453
+ if (s.sender.kind === "user")
310
454
  return {
311
- ...t,
455
+ ...a,
312
456
  type: "USER",
313
- content: o.content.text || "",
457
+ content: s.content.text || "",
314
458
  // Backend field name (schema.ts) → widget vocabulary.
315
- markedElements: o.pickedElements
459
+ markedElements: s.pickedElements
316
460
  };
317
- if (o.sender.kind === "agent")
461
+ if (s.sender.kind === "agent")
318
462
  return {
319
- ...t,
463
+ ...a,
320
464
  type: "AGENT",
321
465
  component: "agent_message",
322
466
  data: {
323
- message: o.content.text || ""
467
+ message: s.content.text || ""
324
468
  },
325
469
  agent: {
326
- name: o.sender.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: o.sender.avatar || null,
330
- avatar: o.sender.avatar || null,
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 (o.sender.kind === "ai") {
336
- const c = o.actionCalls && o.actionCalls.length > 0 ? o.actionCalls[o.actionCalls.length - 1] : void 0;
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
- ...t,
482
+ ...a,
339
483
  type: "AI",
340
484
  component: "bot_message",
341
485
  agent: {
342
486
  id: null,
343
- name: ((r = this.config.bot) == null ? void 0 : r.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: o.content.text || "",
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 (o.sender.kind === "system") {
359
- const c = this.constructSystemMessage(o);
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 = (o) => {
364
- if (!o || !o.systemMessagePayload) return null;
365
- switch (o.systemMessagePayload.type) {
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: o.publicId,
512
+ id: s.publicId,
369
513
  type: "SYSTEM",
370
514
  subtype: "state_checkpoint",
371
- data: { payload: o.systemMessagePayload.payload },
372
- timestamp: o.sentAt || "",
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: o.publicId,
521
+ id: s.publicId,
378
522
  type: "SYSTEM",
379
523
  subtype: "csat_requested",
380
524
  data: { payload: void 0 },
381
- timestamp: o.sentAt || "",
525
+ timestamp: s.sentAt || "",
382
526
  attachments: void 0
383
527
  };
384
528
  case "csat_submitted":
385
529
  return {
386
- id: o.publicId,
530
+ id: s.publicId,
387
531
  type: "SYSTEM",
388
532
  subtype: "csat_submitted",
389
533
  data: {
390
534
  payload: {
391
- score: o.systemMessagePayload.payload.score ?? void 0,
392
- feedback: o.systemMessagePayload.payload.feedback ?? void 0
535
+ score: s.systemMessagePayload.payload.score ?? void 0,
536
+ feedback: s.systemMessagePayload.payload.feedback ?? void 0
393
537
  }
394
538
  },
395
- timestamp: o.sentAt || "",
539
+ timestamp: s.sentAt || "",
396
540
  attachments: void 0
397
541
  };
398
542
  case "none":
399
543
  return null;
400
544
  default:
401
- return re(
402
- o.systemMessagePayload,
545
+ return me(
546
+ s.systemMessagePayload,
403
547
  this.constructSystemMessage.name
404
548
  ), null;
405
549
  }
406
- }, this.extractActionResult = (o) => {
407
- const t = o.result;
408
- if (t === null || typeof t != "object") return t;
409
- if ("responseBodyText" in t && typeof t.responseBodyText == "string") {
410
- const r = t.responseBodyText, c = G(() => JSON.parse(r)).data;
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 o.result;
414
- }, this.api = e, this.config = a, this.sessionCtx = s, this.messageCtx = i, this.sessionPollingIntervalSeconds = _, this.registerPolling();
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 le {
561
+ class ge {
418
562
  constructor({
419
563
  config: e,
420
- api: a,
421
- storageCtx: s
564
+ api: t,
565
+ storageCtx: o
422
566
  }) {
423
- var i;
567
+ var r;
424
568
  this.shouldCollectData = () => {
425
- var _;
426
- return !!(!((_ = this.state.get().contact) != null && _.token) && this.config.collectUserData);
569
+ var l;
570
+ return !!(!((l = this.state.get().contact) != null && l.token) && this.config.collectUserData);
427
571
  }, this.autoCreateUnverifiedUserIfNotExists = async () => {
428
- var _, o, t, r, c, d, l, p, u, m, g, b, v, k;
429
- if (!((_ = this.config.user) != null && _.token)) {
430
- if (this.config.collectUserData && !((t = (o = this.config.user) == null ? void 0 : o.data) != null && t.email)) {
431
- if ((r = this.config.extraDataCollectionFields) != null && r.length)
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 y = await ((c = this.storageCtx) == null ? void 0 : c.getContactToken());
434
- y && await this.setUnverifiedContact(y);
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 (!((l = (d = this.config.user) == null ? void 0 : d.data) != null && l.email)) {
438
- const y = await ((p = this.storageCtx) == null ? void 0 : p.getContactToken());
439
- if (y) {
440
- await this.setUnverifiedContact(y);
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: (b = (g = this.config.user) == null ? void 0 : g.data) == null ? void 0 : b.name,
447
- non_verified_custom_data: (k = (v = this.config.user) == null ? void 0 : v.data) == null ? void 0 : k.customData
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 (_, o) => {
451
- this.state.setPartial({ extraCollectedData: o });
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: t } = await this.api.createUnverifiedContact(_);
458
- t != null && t.token ? await this.setUnverifiedContact(t.token) : this.state.setPartial({ isErrorCreatingUnverifiedContact: !0 });
459
- } catch (t) {
460
- this.state.setPartial({ isErrorCreatingUnverifiedContact: !0 }), h.error("failed to create an unverified contact", {
461
- _e: t instanceof Error ? t.message : String(t)
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 _, o, t, r, c, d, l, p, u, m;
468
- if ((_ = this.config.user) != null && _.token) return !1;
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 ((o = this.storageCtx) == null ? void 0 : o.clearContactToken()), await ((t = this.storageCtx) == null ? void 0 : t.clearActiveSessionId());
615
+ await ((s = this.storageCtx) == null ? void 0 : s.clearContactToken()), await ((a = this.storageCtx) == null ? void 0 : a.clearActiveSessionId());
472
616
  } catch (g) {
473
- h.warn("failed to clear a stale contact token", {
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 = (r = this.config.user) == null ? void 0 : r.data) == null ? void 0 : c.email,
479
- non_verified_name: (l = (d = this.config.user) == null ? void 0 : d.data) == null ? void 0 : l.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 r, c, d, l;
484
- const o = await ((r = this.storageCtx) == null ? void 0 : r.getExternalContactId()), t = ((c = this.config.user) == null ? void 0 : c.externalId) || o || D();
485
- this.api.setAuthToken(_), await ((d = this.storageCtx) == null ? void 0 : d.setContactToken(_)), await ((l = this.storageCtx) == null ? void 0 : l.setExternalContactId(t)), this.state.setPartial({ contact: { token: _, externalId: t } });
486
- }, this.config = e, this.storageCtx = s, this.api = a, this.state = new j({
487
- contact: (i = e.user) != null && i.token ? {
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 ce {
642
+ class ke {
499
643
  constructor(e) {
500
- this.api = e, this.state = new j([]), this.controllers = /* @__PURE__ */ new Map(), this.appendFiles = (a) => {
501
- const s = a.map(
502
- (i) => ({
503
- file: i,
504
- id: D(),
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(), ...s]), s.forEach((i) => void this.upload(i));
510
- }, this.cancel = (a) => {
511
- var s;
512
- (s = this.controllers.get(a)) == null || s.abort(), this.controllers.delete(a), this.state.set(this.state.get().filter((i) => i.id !== a));
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((a) => a.abort()), this.controllers.clear(), this.state.reset();
658
+ this.controllers.forEach((t) => t.abort()), this.controllers.clear(), this.state.reset();
515
659
  };
516
660
  }
517
- update(e, a) {
661
+ update(e, t) {
518
662
  this.state.set(
519
- this.state.get().map((s) => s.id === e ? { ...s, ...a } : s)
663
+ this.state.get().map((o) => o.id === e ? { ...o, ...t } : o)
520
664
  );
521
665
  }
522
666
  async upload(e) {
523
- const a = new AbortController();
524
- this.controllers.set(e.id, a), this.update(e.id, { status: "uploading" });
667
+ const t = new AbortController();
668
+ this.controllers.set(e.id, t), this.update(e.id, { status: "uploading" });
525
669
  try {
526
- const s = await this.api.uploadFile({
670
+ const o = await this.api.uploadFile({
527
671
  file: e.file,
528
- abortSignal: a.signal,
529
- onProgress: (i) => this.update(e.id, { progress: i })
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: s.fileUrl,
677
+ fileUrl: o.fileUrl,
534
678
  progress: 100
535
679
  });
536
- } catch (s) {
537
- a.signal.aborted || this.update(e.id, {
680
+ } catch (o) {
681
+ t.signal.aborted || this.update(e.id, {
538
682
  status: "error",
539
683
  progress: 0,
540
- error: s instanceof Error ? s.message : "Upload failed"
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 D();
692
+ return N();
549
693
  }
550
- class pe {
694
+ class be {
551
695
  constructor({
552
696
  api: e,
553
- sessionCtx: a,
554
- messageCtx: s
697
+ sessionCtx: t,
698
+ messageCtx: o
555
699
  }) {
556
- this.submitCsat = async (i) => {
700
+ this.submitCsat = async (r) => {
557
701
  var c;
558
- const _ = (c = this.sessionCtx.sessionState.get().session) == null ? void 0 : c.id;
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 o = x();
705
+ const s = x();
562
706
  this.messageCtx.state.setPartial({
563
707
  messages: [
564
708
  ...this.messageCtx.state.get().messages,
565
709
  {
566
- id: o,
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: i.score,
573
- feedback: i.feedback
716
+ score: r.score,
717
+ feedback: r.feedback
574
718
  }
575
719
  }
576
720
  }
577
721
  ]
578
722
  });
579
- const { data: t, error: r } = await this.api.submitCsat({
580
- ...i,
581
- system_message_uuid: o,
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: t, error: r };
585
- }, this.api = e, this.sessionCtx = a, this.messageCtx = s;
728
+ return { data: a, error: i };
729
+ }, this.api = e, this.sessionCtx = t, this.messageCtx = o;
586
730
  }
587
731
  }
588
- const de = [
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
- ], ue = [
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 me(n) {
672
- return ue.includes(n);
815
+ function ye(n) {
816
+ return fe.includes(n);
673
817
  }
674
- function he(n) {
818
+ function we(n) {
675
819
  return n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
676
820
  }
677
- function ge(n) {
678
- const e = de.flatMap(
679
- (i) => n.flatMap(
680
- (_) => i.phrases[_].map((o) => ({ phrase: o, action: i.action }))
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
- ), a = e.map((i) => he(i.phrase)).sort((i, _) => _.length - i.length).join("|"), s = String.raw`(?<=^\s{0,3}|[.!?\n]\s{0,3})`;
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
- `${s}(${a})` + String.raw`([.,!?;:])(?=\s|$)`,
829
+ `${o}(${t})` + String.raw`([.,!?;:])(?=\s|$)`,
686
830
  "giu"
687
831
  ),
688
832
  finalRegex: new RegExp(
689
- `${s}(${a})` + String.raw`([.,!?;:]?)(?=\s|$)`,
833
+ `${o}(${t})` + String.raw`([.,!?;:]?)(?=\s|$)`,
690
834
  "giu"
691
835
  ),
692
836
  phraseToAction: new Map(
693
- e.map((i) => [i.phrase.toLowerCase(), i.action])
837
+ e.map((r) => [r.phrase.toLowerCase(), r.action])
694
838
  ),
695
- longestPhrase: Math.max(...e.map((i) => i.phrase.length))
839
+ longestPhrase: Math.max(...e.map((r) => r.phrase.length))
696
840
  };
697
841
  }
698
- const U = /* @__PURE__ */ new Map();
699
- function T(n) {
700
- const e = n && me(n) && n !== "en" ? n : null, a = e ?? "en";
701
- let s = U.get(a);
702
- return s || (s = ge(e ? ["en", e] : ["en"]), U.set(a, s)), s;
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 ke(n) {
848
+ function Se(n) {
705
849
  const e = n.replace(/\s+$/, "");
706
850
  if (!e) return "";
707
- const a = e.replace(/[.!?]+$/, "");
708
- let s = -1;
709
- for (let i = a.length - 1; i >= 0; i--) {
710
- const _ = a[i];
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
- s = i + 1;
857
+ o = r + 1;
714
858
  break;
715
859
  }
716
860
  }
717
- return s === -1 ? "" : `${a.slice(0, s)} `.replace(/\n $/, `
861
+ return o === -1 ? "" : `${t.slice(0, o)} `.replace(/\n $/, `
718
862
  `);
719
863
  }
720
- const be = new RegExp(
864
+ const ze = new RegExp(
721
865
  String.raw`(^- |\n(?:- )?)(\p{Ll})`,
722
866
  "gu"
723
867
  );
724
- function ve(n) {
868
+ function Ce(n) {
725
869
  return n.replace(
726
- be,
727
- (e, a, s) => a + s.toUpperCase()
870
+ ze,
871
+ (e, t, o) => t + o.toUpperCase()
728
872
  );
729
873
  }
730
- function fe(n) {
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 C {
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, a) {
740
- const s = T(a == null ? void 0 : a.language), i = a != null && a.final ? "" : C.commandPrefixTail(e, a == null ? void 0 : a.language), _ = e.slice(0, e.length - i.length), o = a != null && a.final ? s.finalRegex : s.regex;
741
- let t = "", r = null, c = 0;
742
- for (const l of Array.from(_.matchAll(o))) {
743
- const [, p = ""] = l, u = s.phraseToAction.get(p.toLowerCase());
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 (t += _.slice(c, l.index), c = l.index + l[0].length, u === "newline") t = `${t.replace(/[ \t]+$/, "")}
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
- t = `${t.replace(/[ \t]+$/, "")}
892
+ a = `${a.replace(/[ \t]+$/, "")}
749
893
 
750
894
  `;
751
895
  else if (u === "bullet") {
752
- const m = t.replace(/[ \t]+$/, "");
753
- t = m === "" || m.endsWith(`
896
+ const m = a.replace(/[ \t]+$/, "");
897
+ a = m === "" || m.endsWith(`
754
898
  `) ? `${m}- ` : `${m}
755
899
  - `;
756
- } else if (u === "scratch") t = ke(t);
900
+ } else if (u === "scratch") a = Se(a);
757
901
  else {
758
- r = u === "send" ? "send" : "stop";
902
+ i = u === "send" ? "send" : "stop";
759
903
  break;
760
904
  }
761
905
  }
762
- return r === null && (t += _.slice(c)), { text: ve(
763
- t.replace(/^\s+/, "").replace(/[ \t]+\n/g, `
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: i, control: r };
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, a) {
780
- const s = T(a), i = Math.min(e.length, s.longestPhrase + 2);
781
- for (let _ = i; _ > 0; _--) {
782
- const o = e.length - _;
783
- if (!fe(e.slice(0, o))) continue;
784
- const t = e.slice(o).toLowerCase(), r = t.replace(/^\s+/, "");
785
- if (r) {
786
- for (const c of Array.from(s.phraseToAction.keys()))
787
- if (c.startsWith(r))
788
- return e.slice(o + (t.length - r.length));
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, a) {
799
- const s = C.commandPrefixTail(e, a).trim().toLowerCase();
800
- return s ? T(a).phraseToAction.has(s) : !1;
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 ye = 55, we = 90;
804
- class B {
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: a
957
+ processed: t
814
958
  }) {
815
- if (a.length <= e.length) return a;
816
- const s = a.length - e.length;
817
- if (s > we)
818
- return a.slice(0, e.length + Math.ceil(s / 3));
819
- let i = e.length;
820
- for (; i < a.length && /\s/.test(a.charAt(i)); ) i++;
821
- for (; i < a.length && !/\s/.test(a.charAt(i)); ) i++;
822
- return i - e.length > 12 && (i = e.length + 6), a.slice(0, Math.max(i, e.length + 1));
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 a = e.toLowerCase();
828
- if (/^zh-(cn|tw|hk)$/.test(a)) return a;
829
- const s = a.split("-")[0];
830
- return s && /^[a-z]{2,3}$/.test(s) ? s : void 0;
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 je = 2e4;
834
- class ze {
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() < je ? (this.cached = null, null) : this.cached;
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 a = this.get();
850
- return a || (this.inflight || (this.inflight = e().then((s) => (this.cached = s, s)).finally(() => {
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 V(n) {
1003
+ function Z(n) {
860
1004
  return typeof n == "object" && n !== null && !Array.isArray(n);
861
1005
  }
862
- function Se(n) {
863
- if (!V(n) || typeof n.type != "string") return null;
864
- const e = V(n.error) ? n.error : null;
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 xe = "https://api.openai.com/v1/realtime/calls", Ce = 600 * 1e3, qe = 15e3, Ae = 5e3;
872
- class E extends Error {
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 Ee {
1018
+ class Re {
875
1019
  constructor({
876
1020
  mintToken: e,
877
- onDelta: a,
878
- onState: s,
879
- onError: i,
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 = a, this.onState = s, this.onError = i, this.onLevel = _;
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
- }, qe)
890
- ), this.timers.push(setTimeout(() => this.stop(), Ce));
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((l) => l.stop());
1038
+ (this.isTornDown() || this.stream && this.stream !== d) && d.getTracks().forEach((_) => _.stop());
895
1039
  }).catch(() => {
896
1040
  });
897
- const [a, s] = await Promise.all([e, this.mintToken()]);
1041
+ const [t, o] = await Promise.all([e, this.mintToken()]);
898
1042
  if (this.isTornDown()) {
899
- a.getTracks().forEach((d) => d.stop());
1043
+ t.getTracks().forEach((d) => d.stop());
900
1044
  return;
901
1045
  }
902
- this.stream = a, this.startLevelMeter(a);
903
- const i = new RTCPeerConnection();
904
- this.pc = i;
905
- const [_] = a.getAudioTracks();
906
- if (!_) throw new E("No audio track");
907
- i.addTrack(_, a);
908
- const o = i.createDataChannel("oai-events");
909
- this.dc = o, o.addEventListener(
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
- ), o.addEventListener("open", () => {
1056
+ ), s.addEventListener("open", () => {
913
1057
  this.state === "connecting" && this.setState("listening");
914
- }), i.addEventListener("connectionstatechange", () => {
915
- if (i.connectionState === "failed") {
1058
+ }), r.addEventListener("connectionstatechange", () => {
1059
+ if (r.connectionState === "failed") {
916
1060
  this.fail("unavailable");
917
1061
  return;
918
1062
  }
919
- i.connectionState === "disconnected" && this.timers.push(
1063
+ r.connectionState === "disconnected" && this.timers.push(
920
1064
  setTimeout(() => {
921
- this.pc === i && i.connectionState !== "connected" && this.fail("unavailable");
922
- }, Ae)
1065
+ this.pc === r && r.connectionState !== "connected" && this.fail("unavailable");
1066
+ }, Ne)
923
1067
  );
924
1068
  });
925
- const t = await i.createOffer();
926
- await i.setLocalDescription(t);
927
- const r = await fetch(xe, {
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 ${s.token}`,
1074
+ Authorization: `Bearer ${o.token}`,
931
1075
  "Content-Type": "application/sdp"
932
1076
  },
933
- body: t.sdp
1077
+ body: a.sdp
934
1078
  });
935
- if (!r.ok)
936
- throw new Error(`Realtime handshake failed (${r.status})`);
937
- const c = await r.text();
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 i.setRemoteDescription({ type: "answer", sdp: c });
1083
+ await r.setRemoteDescription({ type: "answer", sdp: c });
940
1084
  } catch (e) {
941
- e instanceof E ? this.fail("microphone") : (h.error("dictation session failed to start", {
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 E("Microphone is not supported");
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 (a) {
963
- throw new E(
964
- a instanceof DOMException ? a.name : "Could not access the microphone"
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 a;
1114
+ let t;
971
1115
  try {
972
- a = JSON.parse(e);
1116
+ t = JSON.parse(e);
973
1117
  } catch {
974
- this.loggedParseFailure || (this.loggedParseFailure = !0, h.error("dictation server event was not valid JSON", {
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 s = Se(a);
980
- if (!s) return;
981
- const { type: i, delta: _ } = s;
982
- if (i === "session.created" || i === "transcription_session.created") {
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 (i === "conversation.item.input_audio_transcription.delta" && _) {
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
- i === "error" && (h.error("dictation server event error", {
991
- _e: s.errorMessage ?? "unknown"
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 a = new AudioContext();
998
- this.audioContext = a;
999
- const s = a.createMediaStreamSource(e), i = a.createAnalyser();
1000
- i.fftSize = 512, s.connect(i);
1001
- const _ = new Uint8Array(i.frequencyBinCount), o = () => {
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
- i.getByteTimeDomainData(_);
1004
- let t = 0;
1005
- for (let d = 0; d < _.length; d++) {
1006
- const l = ((_[d] ?? 128) - 128) / 128;
1007
- t += l * l;
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 r = Math.sqrt(t / _.length);
1010
- (c = this.onLevel) == null || c.call(this, Math.min(1, r * 4)), this.levelRaf = requestAnimationFrame(o);
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(o);
1013
- } catch (a) {
1014
- h.error("dictation level meter unavailable", {
1015
- _e: a instanceof Error ? a.message : String(a)
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, a, s, i;
1027
- this.timers.forEach((_) => clearTimeout(_)), this.timers = [], this.levelRaf && cancelAnimationFrame(this.levelRaf), this.levelRaf = 0, (e = this.dc) == null || e.close(), this.dc = null, (a = this.pc) == null || a.close(), this.pc = null, (s = this.stream) == null || s.getTracks().forEach((_) => _.stop()), this.stream = null, (i = this.audioContext) == null || i.close().catch((_) => {
1028
- h.error("failed to close dictation audio context", {
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 Pe = 1300, Te = { status: "idle", error: null };
1038
- class Me {
1039
- constructor({ api: e, config: a }) {
1040
- this.state = new j(Te), this.levelRef = { current: 0 }, this.mintCache = new ze(), 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 = () => {
1041
- this.mintToken().catch((s) => {
1042
- this.mintCache.clear(), h.error("dictation token prewarm failed", {
1043
- _e: s instanceof Error ? s.message : String(s)
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 = (s) => {
1047
- this.session && this.teardown(), this.target = s, this.language = B.languageHint(
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 = s.getValue(), this.raw = "", this.processed = "", this.displayed = "";
1050
- const i = new Ee({
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
- i === this.session && (_ === "connecting" && this.state.set({ status: "connecting", error: null }), _ === "listening" && this.state.set({ status: "listening", error: null }), _ === "stopped" && this.teardown());
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
- i === this.session && (this.mintCache.clear(), this.teardown({ error: _, executeFinalCommand: !1 }));
1202
+ onError: (l) => {
1203
+ r === this.session && (this.mintCache.clear(), this.teardown({ error: l, executeFinalCommand: !1 }));
1060
1204
  },
1061
- onDelta: (_) => {
1062
- if (i !== this.session || !this.target) return;
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 o = this.ingest();
1069
- if (o === "stop") {
1211
+ this.raw += l;
1212
+ const s = this.ingest();
1213
+ if (s === "stop") {
1070
1214
  this.teardown();
1071
1215
  return;
1072
1216
  }
1073
- if (o === "send") {
1217
+ if (s === "send") {
1074
1218
  this.teardown({ send: !0 });
1075
1219
  return;
1076
1220
  }
1077
- this.stopSilenceTimer(), C.pendingTailIsCompletePhrase(
1221
+ this.stopSilenceTimer(), q.pendingTailIsCompletePhrase(
1078
1222
  this.raw,
1079
1223
  this.language
1080
1224
  ) && (this.silenceTimer = setTimeout(() => {
1081
- if (i !== this.session) return;
1225
+ if (r !== this.session) return;
1082
1226
  this.raw = `${this.raw}.`;
1083
- const t = this.ingest();
1084
- t === "stop" ? this.teardown() : t === "send" && this.teardown({ send: !0 });
1085
- }, Pe));
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 = i, this.state.set({ status: "connecting", error: null }), this.dripTimer = setInterval(() => {
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
- B.nextDripText({
1239
+ H.nextDripText({
1096
1240
  displayed: this.displayed,
1097
1241
  processed: this.processed
1098
1242
  })
1099
1243
  );
1100
1244
  }
1101
- }, ye), i.start();
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 = a;
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 a = C.process(this.raw, {
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 = a.text, a.text.startsWith(this.displayed) || this.applyDisplayed(a.text), a.control;
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 a = this.session, s = this.target;
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 i = (e == null ? void 0 : e.send) ?? !1;
1132
- if (s && this.isConsistent()) {
1133
- const o = this.ingest({ final: !0 });
1134
- (e == null ? void 0 : e.executeFinalCommand) !== !1 && o === "send" && (i = !0), this.processed !== this.displayed && this.applyDisplayed(this.processed);
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, a == null || a.stop(), this.levelRef.current = 0, this.state.set({ status: "idle", error: (e == null ? void 0 : e.error) ?? null }), i && ((_ = s == null ? void 0 : s.onSend) == null || _.call(s));
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 Ie = {
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
- }, De = {
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
- }, Ne = {
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
- }, Re = {
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
- }, Ke = {
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
- }, Le = {
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
- }, Fe = {
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
- }, W = {
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
- }, Oe = {
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
- }, Ue = {
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
- }, Be = {
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
- }, Ve = {
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
- }, He = {
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
- }, Ze = {
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
- }, Ge = {
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
- }, We = {
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
- }, Je = {
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
- }, $e = {
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
- }, Ye = {
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
- }, Qe = {
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
- }, Xe = {
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
- }, ea = {
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
- }, aa = {
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
- }, ta = {
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
- }, sa = {
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
- }, oa = {
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
- }, na = {
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
- }, ia = {
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
- }, ra = {
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
- }, _a = {
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
- }, la = {
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
- }, ca = {
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
- }, pa = {
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
- }, da = {
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
- }, ua = {
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
- }, ma = {
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
- }, ha = {
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
- }, ga = {
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
- }, J = {
4850
- ar: Ie,
4851
- bn: De,
4852
- bg: Ne,
4853
- cs: Re,
4854
- da: Ke,
4855
- de: Fe,
4856
- el: Le,
4857
- en: W,
4858
- es: Oe,
4859
- et: _a,
4860
- fi: Be,
4861
- fil: Ue,
4862
- fr: Ve,
4863
- hi: He,
4864
- hr: ra,
4865
- hu: la,
4866
- is: ca,
4867
- it: Ze,
4868
- ja: Ge,
4869
- ko: We,
4870
- lb: ua,
4871
- lt: da,
4872
- lv: pa,
4873
- mt: ma,
4874
- nb: ha,
4875
- nl: Je,
4876
- no: $e,
4877
- pl: Ye,
4878
- pt: Qe,
4879
- ro: Xe,
4880
- ru: aa,
4881
- sk: ga,
4882
- sv: ea,
4883
- th: ta,
4884
- tr: sa,
4885
- ur: oa,
4886
- vi: na,
4887
- "zh-cn": ia
4888
- }, ka = Object.keys(J);
4889
- function ba(n) {
4890
- return ka.includes(n);
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 va = /* @__PURE__ */ new Set(["ar", "ur"]);
4893
- function Ua(n) {
4894
- return va.has(n);
5036
+ const Ca = /* @__PURE__ */ new Set(["ar", "ur"]);
5037
+ function Ja(n) {
5038
+ return Ca.has(n);
4895
5039
  }
4896
- function fa(n) {
4897
- return ba(n) ? n : "en";
5040
+ function xa(n) {
5041
+ return za(n) ? n : "en";
4898
5042
  }
4899
- function ya(n, e, a, s) {
4900
- var _;
4901
- const i = ((_ = a == null ? void 0 : a[e]) == null ? void 0 : _[n]) || J[e][n] || W[n] || n;
4902
- return s ? i.replace(
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
- (o, t) => t in s ? String(s[t]) : o
4905
- ) : i;
5048
+ (s, a) => a in o ? String(o[a]) : s
5049
+ ) : r;
4906
5050
  }
4907
- function wa(n, e, a) {
4908
- return ya(
5051
+ function Ea(n, e, t) {
5052
+ return qa(
4909
5053
  e,
4910
- fa(n.language),
5054
+ xa(n.language),
4911
5055
  n.translationOverrides,
4912
- a
5056
+ t
4913
5057
  );
4914
5058
  }
4915
- class ja {
5059
+ class Aa {
4916
5060
  constructor({
4917
5061
  config: e,
4918
- api: a,
4919
- contactCtx: s,
4920
- storageCtx: i,
4921
- sessionsPollingIntervalSeconds: _,
4922
- sharedSessions: o
5062
+ api: t,
5063
+ contactCtx: o,
5064
+ storageCtx: r,
5065
+ sessionsPollingIntervalSeconds: l,
5066
+ sharedSessions: s
4923
5067
  }) {
4924
- this.sessionsRefresher = new Z(), this.persistedSessionId = null, this.sessionAbortController = new AbortController(), this.sessionState = new j({
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 j({
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 t;
4943
- (t = this.stopPersistingSession) == null || t.call(this), this.stopPersistingSession = void 0, this.registerActiveSessionPersistence();
4944
- }, this.trackActiveSession = (t) => {
4945
- var r;
4946
- (r = this.stopPersistingSession) == null || r.call(this), this.stopPersistingSession = t.sessionState.subscribe(
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(t.sessionState.get());
4949
- }, this.persistSession = ({ session: t }) => {
4950
- const r = this.storageCtx;
4951
- if (!r) return;
4952
- const c = t != null && t.isOpened ? t.id : null;
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 ? r.setActiveSessionId(c) : r.clearActiveSessionId()).catch((l) => {
4955
- h.warn("failed to persist the active session", {
4956
- error: l instanceof Error ? l.message : String(l)
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 t;
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
- (t = this.contactCtx.state.get().contact) != null && t.token && !this.sessionsState.get().didStartInitialFetch ? this.registerSessionsRefresher() : this.contactCtx.state.subscribe(({ contact: r }) => {
4972
- r != null && r.token && !this.sessionsState.get().didStartInitialFetch && this.registerSessionsRefresher();
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
- ([t, r]) => {
5134
+ ([a, i]) => {
4981
5135
  var c;
4982
- return typeof r == "string" ? [t, r] : typeof r == "boolean" ? [t, r] : typeof r == "number" ? [t, r] : [t, ((c = G(() => JSON.stringify(r))) == null ? void 0 : c.data) || ""];
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: t } = this.sessionAbortController;
5140
+ const { signal: a } = this.sessionAbortController;
4987
5141
  this.sessionState.setPartial({ session: null, isCreatingSession: !0 });
4988
5142
  try {
4989
- const r = await this.requestSession(t);
4990
- if (t.aborted) return null;
4991
- if (r.session) return r.session;
4992
- if (r.status === 401 && await this.contactCtx.recoverFromStaleToken()) {
4993
- if (t.aborted) return null;
4994
- const c = await this.requestSession(t);
4995
- return t.aborted ? null : c.session ? c.session : (h.error("failed to create session", c.error), null);
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 h.error("failed to create session", r.error), null;
4998
- } catch (r) {
4999
- return t.aborted || h.error("failed to create session", r), null;
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
- t.aborted || this.sessionState.setPartial({ isCreatingSession: !1 });
5155
+ a.aborted || this.sessionState.setPartial({ isCreatingSession: !1 });
5002
5156
  }
5003
- }, this.requestSession = async (t) => {
5157
+ }, this.requestSession = async (a) => {
5004
5158
  var u, m, g;
5005
- const r = (u = this.contactCtx.state.get().contact) == null ? void 0 : u.externalId, c = {
5159
+ const i = (u = this.contactCtx.state.get().contact) == null ? void 0 : u.externalId, c = {
5006
5160
  ...this.getParsedCustomData(),
5007
- ...r ? { external_id: r } : {}
5161
+ ...i ? { external_id: i } : {}
5008
5162
  }, {
5009
5163
  data: d,
5010
- error: l,
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
- t
5170
+ a
5017
5171
  );
5018
- if (t.aborted || !d)
5019
- return { session: null, status: p == null ? void 0 : p.status, error: l };
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 (b) {
5024
- h.error("onSessionCreated hook failed", b);
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: t } = await this.getSessions({
5183
+ const { data: a } = await this.getSessions({
5030
5184
  cursor: this.sessionsState.get().cursor
5031
5185
  });
5032
- if (t) {
5033
- const c = [...this.sessionsState.get().data, ...t.items].filter(
5034
- (d, l, p) => l === p.findIndex((u) => d.id === u.id)
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: t.next || void 0,
5039
- isLastPage: t.next === null
5192
+ cursor: a.next || void 0,
5193
+ isLastPage: a.next === null
5040
5194
  });
5041
5195
  }
5042
- }, this.getSessions = async ({ cursor: t }) => {
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 r = (d = this.contactCtx.state.get().contact) == null ? void 0 : d.externalId;
5199
+ const i = (d = this.contactCtx.state.get().contact) == null ? void 0 : d.externalId;
5046
5200
  return await this.api.getSessions({
5047
- cursor: t,
5048
- filters: r ? {
5049
- external_id: r
5201
+ cursor: a,
5202
+ filters: i ? {
5203
+ external_id: i
5050
5204
  } : {}
5051
5205
  });
5052
- }, this.setSessions = (t) => {
5053
- const r = [...t, ...this.sessionsState.get().data].filter(
5054
- (c, d, l) => d === l.findIndex((p) => c.id === p.id)
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: r });
5210
+ this.sessionsState.setPartial({ data: i });
5057
5211
  }, this.refreshSessions = async () => {
5058
- const { data: t } = await this.getSessions({ cursor: void 0 });
5059
- t && this.setSessions(t.items);
5212
+ const { data: a } = await this.getSessions({ cursor: void 0 });
5213
+ a && this.setSessions(a.items);
5060
5214
  }, this.resolveSession = async () => {
5061
- const t = this.sessionState.get().session;
5062
- if (!t || !t.isOpened)
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: r } = this.sessionAbortController, c = await this.api.resolveSession({ session_id: t.id }, r).catch((p) => {
5066
- if (r.aborted) return null;
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 || r.aborted)
5223
+ if (!c || i.aborted)
5070
5224
  return { success: !1, error: "Session was reset" };
5071
- const { data: d, error: l } = c;
5072
- return d ? (this.sessionState.setPartial({ session: d, isResolvingSession: !1 }), { success: !0, data: d }) : (this.sessionState.setPartial({ isResolvingSession: !1 }), { success: !1, error: l });
5073
- }, this.createStateCheckpoint = async (t) => {
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 r = (d = this.sessionState.get().session) == null ? void 0 : d.id;
5076
- if (!r) return;
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: r,
5079
- payload: t
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 = a, this.contactCtx = s, this.storageCtx = i, this.sessionsPollingIntervalSeconds = _, o ? this.sessionsState = o : this.registerSessionsRefresherWrapper(), this.registerActiveSessionPersistence();
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 za = (n, e, { sendsPageContext: a }) => {
5086
- const s = Ca(n), i = a && e.mentions && e.mentions.length > 0 ? { mentions: e.mentions.map(Sa) } : void 0, _ = a && (e.clientContext || i) ? { ...s, ...e.clientContext, ...i } : s;
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.withPageEntity === !1 && _ && "entity" in _ ? xa(_, "entity") : _,
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
- }, Sa = ({ type: n, id: e, title: a, meta: s }) => ({
5251
+ }, Ta = ({ type: n, id: e, title: t, meta: o }) => ({
5095
5252
  type: n,
5096
5253
  id: e,
5097
- title: a,
5098
- ...s ? { meta: s } : {}
5099
- }), xa = (n, e) => {
5100
- const { [e]: a, ...s } = n;
5101
- return Object.keys(s).length > 0 ? s : void 0;
5102
- }, Ca = (n) => {
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
- h.error("context getter threw; sending without context", e);
5264
+ k.error("context getter threw; sending without context", e);
5108
5265
  return;
5109
5266
  }
5110
- }, qa = (n) => {
5267
+ }, Da = (n) => {
5111
5268
  const e = n.features;
5112
5269
  if (!e) return;
5113
- const a = {};
5114
- return e.preamble !== void 0 && (a.preamble = e.preamble), e.inlineUi !== void 0 && (a.inline_ui = e.inlineUi), e.pageContext !== void 0 && (a.page_context = e.pageContext), e.clientTools !== void 0 && (a.client_tools = e.clientTools), Object.keys(a).length > 0 ? a : void 0;
5115
- }, Aa = ({
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: a,
5119
- sessionId: s,
5120
- content: i,
5121
- initialMessages: _,
5122
- sendsPageContext: o
5275
+ uuid: t,
5276
+ sessionId: o,
5277
+ content: r,
5278
+ initialMessages: l,
5279
+ sendsPageContext: s
5123
5280
  }) => {
5124
- var t, r, c, d, l, p;
5281
+ var a, i, c, d, _, p, u, m;
5125
5282
  return {
5126
- uuid: a,
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: s,
5132
- content: i,
5288
+ session_id: o,
5289
+ content: r,
5133
5290
  attachments: e.attachments,
5134
- ...za(n, e, { sendsPageContext: o }),
5291
+ ...Pa(n, e, { sendsPageContext: s }),
5135
5292
  language: n.language,
5136
- features: qa(n),
5293
+ features: Da(n),
5137
5294
  presentation: n.presentation,
5138
5295
  capabilities: [
5139
- (t = n.capabilities) == null ? void 0 : t.structuredQuestions,
5140
- (r = n.capabilities) == null ? void 0 : r.richReplies,
5141
- (c = n.capabilities) == null ? void 0 : c.pageEffects
5142
- ].some((u) => u !== void 0) ? {
5143
- structured_questions: (d = n.capabilities) == null ? void 0 : d.structuredQuestions,
5144
- rich_replies: (l = n.capabilities) == null ? void 0 : l.richReplies,
5145
- page_effects: (p = n.capabilities) == null ? void 0 : p.pageEffects
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: _.length > 0 ? _.map((u) => ({ uuid: u.id, content: u.data.message })) : void 0
5307
+ initial_messages: l.length > 0 ? l.map((g) => ({ uuid: g.id, content: g.data.message })) : void 0
5149
5308
  };
5150
- }, S = class S {
5309
+ }, C = class C {
5151
5310
  constructor({
5152
5311
  config: e,
5153
- api: a,
5154
- sessionCtx: s,
5155
- contactCtx: i,
5156
- streaming: _,
5157
- sendsPageContext: o,
5158
- getClientCapabilities: t,
5159
- getRequestConfig: r,
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 j({
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 j({
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 = (l) => {
5176
- const p = l.trim();
5177
- !p || this.sentTextHistory.at(-1) === p || (this.sentTextHistory.push(p), this.sentTextHistory.length > S.SENT_TEXT_HISTORY_MAX && this.sentTextHistory.shift());
5178
- }, this.getSentTextHistory = () => this.sentTextHistory, this.registerAgentHandlers = (l) => {
5179
- this.agentHandlers = l;
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
- S.dispatchToEngine(l, u);
5341
+ C.dispatchToEngine(_, u);
5183
5342
  });
5184
- }, this.unregisterAgentHandlers = (l) => {
5185
- this.agentHandlers === l && (this.agentHandlers = null);
5186
- }, this.dispatchToOnMessageReceivedHook = (l) => {
5343
+ }, this.unregisterAgentHandlers = (_) => {
5344
+ this.agentHandlers === _ && (this.agentHandlers = null);
5345
+ }, this.dispatchToOnMessageReceivedHook = (_) => {
5187
5346
  var u, m;
5188
- if (l.type === "USER" || this.messageIdsDispatchedToOnMessageReceivedHook.has(l.id))
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(l.id), (m = (u = this.config.hooks) == null ? void 0 : u.onMessageReceived) == null || m.call(u, { message: l, session: p }));
5192
- }, this.markAsDispatchedToOnMessageReceivedHook = (l) => {
5193
- l.forEach(
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 l, p;
5210
- if (!((l = this.sessionCtx.sessionState.get().session) != null && l.id)) {
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 = (l) => {
5216
- if (l.length === 0) return;
5217
- const p = new Set(l), u = this.state.get().messages, m = u.filter((g) => !p.has(g.id));
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 = (l) => {
5378
+ }, this.notifySendAccepted = (_) => {
5220
5379
  var p;
5221
5380
  try {
5222
- (p = l.onAccepted) == null || p.call(l);
5381
+ (p = _.onAccepted) == null || p.call(_);
5223
5382
  } catch (u) {
5224
- h.error("send acceptance callback failed", u);
5383
+ k.error("send acceptance callback failed", u);
5225
5384
  }
5226
- }, this.stageUserTurn = async (l, { pending: p }) => {
5227
- const u = this.buildUserMessage(l);
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(), b = [
5230
- ...g.map((k) => k.id),
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: [...g, ...this.state.get().messages, m]
5393
+ messages: [
5394
+ ...g,
5395
+ ...this.state.get().messages,
5396
+ ...m.background ? [] : [m]
5397
+ ]
5235
5398
  });
5236
- let v;
5399
+ let f;
5237
5400
  try {
5238
- v = await this.ensureSessionId();
5239
- } catch (k) {
5240
- throw this.rollbackOptimisticMessages(b), k;
5401
+ f = await this.ensureSessionId();
5402
+ } catch (b) {
5403
+ throw this.rollbackOptimisticMessages(v), b;
5241
5404
  }
5242
- return v ? { sessionId: v, userMessage: m, initialMessages: g } : (this.rollbackOptimisticMessages(b), null);
5243
- }, this.buildQueuedUserMessage = (l) => {
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(l);
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 = (l) => {
5412
+ }, this.buildUserMessage = (_) => {
5250
5413
  var p;
5251
- return !l.content.trim() && (!l.attachments || l.attachments.length === 0) ? (h.warn("cannot send an empty message of no content or attachments"), null) : this.toUserMessage(
5252
- l.content.trim(),
5253
- l.attachments || void 0,
5254
- this.sendsPageContext ? S.markedElementNames(l.clientContext) : void 0,
5255
- this.sendsPageContext && ((p = l.mentions) != null && p.length) ? l.mentions : void 0
5256
- );
5257
- }, this.appendUserMessageIfAbsent = (l) => {
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 === l.id) || this.state.setPartial({ messages: [...p, l] });
5260
- }, this.markUserMessageDelivered = (l) => {
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
- (b) => b.id === l && b.type === "USER" && b.pending
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 (l) => {
5272
- var u, m, g, b, v;
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(l);
5442
+ this.bufferedAgentSends.push(_);
5276
5443
  return;
5277
5444
  }
5278
- await this.agentHandlers.send(l);
5445
+ await this.agentHandlers.send(_);
5279
5446
  return;
5280
5447
  }
5281
5448
  let p;
5282
5449
  try {
5283
- const k = this.sessionCtx.sessionState.get().session, N = (k == null ? void 0 : k.assignee.kind) === "ai", Y = this.state.get().isSendingMessageToAI, q = this.state.get().messages.at(-1);
5284
- if (this.blocksSendWhileAwaitingReply && (Y || // If last message is from user, then bot response did not arrive yet
5285
- N && (q == null ? void 0 : q.type) === "USER" && q.id !== this.state.get().settledAgentUserMessageId)) {
5286
- h.warn("cannot send messages while awaiting AI response");
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: !!N || !k
5459
+ isSendingMessageToAI: !!R || !b
5293
5460
  });
5294
- const R = await this.stageUserTurn(l, { pending: !1 });
5295
- if (!R) return;
5296
- const { sessionId: Q, userMessage: K, initialMessages: X } = R;
5297
- this.notifySendAccepted(l);
5298
- const { data: f } = await this.api.sendMessage(
5299
- Aa({
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: l,
5305
- uuid: K.id,
5306
- sessionId: Q,
5307
- content: K.content,
5308
- initialMessages: X,
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 (f != null && f.success) {
5314
- const z = this.toBotMessage(f);
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
- (ee) => ee.id === z.id
5485
+ (te) => te.id === z.id
5319
5486
  )) {
5320
5487
  this.state.setPartial({
5321
- lastAIResMightSolveUserIssue: ((u = f.autopilotResponse) == null ? void 0 : u.mightSolveUserIssue) || ((m = f.uiResponse) == null ? void 0 : m.mightSolveUserIssue)
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 = f.autopilotResponse) == null ? void 0 : g.mightSolveUserIssue) || ((b = f.uiResponse) == null ? void 0 : b.mightSolveUserIssue)
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
- f.session && this.sessionCtx.sessionState.setPartial({ session: f.session });
5497
+ y.session && this.sessionCtx.sessionState.setPartial({ session: y.session });
5331
5498
  } else {
5332
5499
  const z = this.toBotErrorMessage(
5333
- ((v = f == null ? void 0 : f.error) == null ? void 0 : v.message) || wa(this.config, "turn_failed_message")
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 (k) {
5340
- p != null && p.signal.aborted || h.error("failed to send message", k);
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 = (l, p, u, m) => {
5514
+ }, this.toUserMessage = (_, p, u, m) => {
5348
5515
  const g = (() => {
5349
- const b = this.contactCtx.state.get().extraCollectedData;
5350
- return this.state.get().messages.length === 0 && b && Object.keys(b).length > 0 ? `${Object.entries(b).filter(([k, y]) => !!y).map(([k, y]) => `${k}: ${y}`).join(`
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
- ${l}` : l;
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 = (l) => {
5531
+ }, this.toBotMessage = (_) => {
5365
5532
  var p;
5366
- return l.success && l.autopilotResponse ? {
5533
+ return _.success && _.autopilotResponse ? {
5367
5534
  type: "AI",
5368
- id: l.autopilotResponse.id || x(),
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: l.autopilotResponse.value.content,
5381
- action: (p = l.uiResponse) != null && p.value.name ? {
5382
- name: l.uiResponse.value.name,
5383
- data: l.uiResponse.value.request_response
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 = (l) => ({
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: l,
5560
+ message: _,
5394
5561
  variant: "error",
5395
5562
  action: void 0
5396
5563
  }
5397
- }), this.config = e, this.getClientCapabilities = t ?? (() => this.getRequestConfig().capabilities), this.api = a, this.sessionCtx = s, this.contactCtx = i, this.isStreaming = c ?? (() => _), this.getRequestConfig = r ?? (() => this.config), this.getSendsPageContext = d ?? (() => o);
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, a) {
5577
+ static dispatchToEngine(e, t) {
5411
5578
  try {
5412
- Promise.resolve(e.send(a)).catch((s) => {
5413
- h.error("streaming send failed", s);
5579
+ Promise.resolve(e.send(t)).catch((o) => {
5580
+ k.error("streaming send failed", o);
5414
5581
  });
5415
- } catch (s) {
5416
- h.error("streaming send failed", s);
5582
+ } catch (o) {
5583
+ k.error("streaming send failed", o);
5417
5584
  }
5418
5585
  }
5419
5586
  get hasPendingAgentWork() {
5420
- var e, a;
5421
- return this.bufferedAgentSends.length > 0 || (((a = (e = this.agentHandlers) == null ? void 0 : e.hasPendingWork) == null ? void 0 : a.call(e)) ?? !1);
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 a = e == null ? void 0 : e.page_marks;
5432
- if (!Array.isArray(a)) return;
5433
- const s = a.flatMap((i) => {
5434
- if (typeof i != "object" || i === null) return [];
5435
- const _ = i.elements, o = Array.isArray(_) ? _[0] : void 0, t = typeof o == "object" && o !== null && "name" in o ? o.name : void 0;
5436
- if (typeof t != "string" || t.length === 0) return [];
5437
- const r = i.note, c = i.snapshotUrl;
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: t,
5441
- ...typeof r == "string" && r.length > 0 ? { note: r } : {},
5607
+ name: a,
5608
+ ...typeof i == "string" && i.length > 0 ? { note: i } : {},
5442
5609
  ...typeof c == "string" && c.length > 0 ? { snapshotUrl: c } : {},
5443
- mark: i
5610
+ mark: r
5444
5611
  }
5445
5612
  ];
5446
5613
  });
5447
- return s.length > 0 ? s : void 0;
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
- S.SENT_TEXT_HISTORY_MAX = 50;
5458
- let I = S;
5459
- class Ea {
5624
+ C.SENT_TEXT_HISTORY_MAX = 50;
5625
+ let D = C;
5626
+ class Ra {
5460
5627
  constructor(e) {
5461
- var a, s;
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((i) => {
5468
- this.restorableSessionId = i;
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: i }) => {
5475
- var _;
5476
- i != null && i.token && this.state.get().screen === "welcome" && this.state.setPartial({
5477
- screen: (_ = this.config.router) != null && _.chatScreenOnly ? "chat" : "sessions"
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: i,
5485
- data: _
5651
+ isInitialFetchLoading: r,
5652
+ data: l
5486
5653
  }) => {
5487
- var o, t, r, c, d;
5654
+ var s, a, i, c, d;
5488
5655
  if (!(this.disposed || !this.didReadStoredSession)) {
5489
- if (this.restorableSessionId && !((o = this.sessionCtx.sessionState.get().session) != null && o.id)) {
5490
- const l = _.find(
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 (l) {
5494
- this.restorableSessionId = null, this.toChatScreen(l.id);
5660
+ if (_) {
5661
+ this.restorableSessionId = null, this.toChatScreen(_.id);
5495
5662
  return;
5496
5663
  }
5497
- if (i) return;
5664
+ if (r) return;
5498
5665
  this.restorableSessionId = null;
5499
5666
  }
5500
- if ((t = this.config.router) != null && t.chatScreenOnly && // Do not route to a chat if we are currently inside one already
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
- !((r = this.sessionCtx.sessionState.get().session) != null && r.id)) {
5503
- const l = (c = _.find((p) => p.isOpened)) == null ? void 0 : c.id;
5504
- return l ? this.toChatScreen(l) : void 0;
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
- _.length || ((d = this.config.router) == null ? void 0 : d.goToChatIfNoSessions) !== !1 && !i && this.state.get().screen !== "chat" && this.toChatScreen();
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((i) => i()), this.subscriptions = [], this.navigateConversation = void 0;
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 = (i) => {
5513
- var o, t;
5514
- if (this.navigateConversation) return this.navigateConversation(i);
5679
+ }, this.toChatScreen = (r) => {
5680
+ var s, a;
5681
+ if (this.navigateConversation) return this.navigateConversation(r);
5515
5682
  this.resetChat();
5516
- let _;
5517
- if (i) {
5518
- if (_ = this.sessionCtx.sessionsState.get().data.find((r) => r.id === i), !_) return;
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" }), (t = (o = this.config.hooks) == null ? void 0 : o.onNavigateToChat) == null || t.call(o, { session: _ }), this.widget;
5522
- }, this.config = e.config, this.contactCtx = e.contactCtx, this.sessionCtx = e.sessionCtx, this.resetChat = e.resetChat, this.state = new j({
5523
- screen: this.contactCtx.shouldCollectData() ? "welcome" : (a = this.config.router) != null && a.chatScreenOnly ? "chat" : "sessions"
5524
- }), this.shouldRestoreLastSession = ((s = this.config.router) == null ? void 0 : s.restoreLastSession) ?? !1, this.readStoredSession(), this.registerRoutingListener();
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 Pa {
5694
+ class Ka {
5528
5695
  constructor({
5529
5696
  storage: e,
5530
- config: a
5697
+ config: t
5531
5698
  }) {
5532
5699
  this.KEYS = {
5533
- contactToken: (s) => `opencx-widget:org-token-${s}:contact-token`,
5534
- externalContactId: (s) => `opencx-widget:org-token-${s}:external-contact-id`,
5535
- companionPreference: (s, i) => `opencx-widget:org-token-${s}:companion-${i}`,
5536
- activeSession: (s) => `opencx-widget:org-token-${s}:active-session`
5537
- }, this.setContactToken = async (s) => {
5538
- await this.storage.set(this.KEYS.contactToken(this.config.token), s);
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 (s) => {
5542
- await this.storage.set(this.activeSessionKey(), s);
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 (s) => {
5546
- await this.storage.set(this.KEYS.externalContactId(this.config.token), s);
5547
- }, this.getExternalContactId = async () => this.storage.get(this.KEYS.externalContactId(this.config.token)), this.companionKey = (s) => this.KEYS.companionPreference(this.config.token, s), this.getFiniteNumber = async (s) => {
5548
- const i = await this.storage.get(s);
5549
- if (i === null) return null;
5550
- const _ = Number(i);
5551
- return Number.isFinite(_) ? _ : null;
5552
- }, this.getCompanionPillOffsetX = async () => this.getFiniteNumber(this.companionKey("pill-offset-x")), this.setCompanionPillOffsetX = async (s) => {
5553
- Number.isFinite(s) && await this.storage.set(this.companionKey("pill-offset-x"), String(s));
5554
- }, this.getCompanionSidebarWidth = async () => this.getFiniteNumber(this.companionKey("sidebar-width")), this.setCompanionSidebarWidth = async (s) => {
5555
- Number.isFinite(s) && await this.storage.set(this.companionKey("sidebar-width"), String(s));
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 s = await this.storage.get(this.companionKey("sidebar-side"));
5558
- return s === "left" || s === "right" ? s : null;
5559
- }, this.setCompanionSidebarSide = async (s) => {
5560
- await this.storage.set(this.companionKey("sidebar-side"), s);
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 s = await this.storage.get(this.companionKey("layout"));
5563
- return s === "compact" || s === "sidebar" ? s : null;
5564
- }, this.setCompanionLayout = async (s) => {
5565
- await this.storage.set(this.companionKey("layout"), s);
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 s = await this.storage.get(this.companionKey("sidebar-mode"));
5568
- return s === "docked" || s === "floating" ? s : null;
5569
- }, this.setCompanionSidebarMode = async (s) => {
5570
- await this.storage.set(this.companionKey("sidebar-mode"), s);
5571
- }, this.storage = e, this.config = a;
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 Ta({
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 Ma(n, e) {
5605
- const a = e.features;
5771
+ function Fa(n, e) {
5772
+ const t = e.features;
5606
5773
  return {
5607
- dictation: M(n.features.dictation, a == null ? void 0 : a.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
- a == null ? void 0 : a.pageContext
5778
+ t == null ? void 0 : t.pageContext
5612
5779
  ),
5613
5780
  clientTools: M(
5614
5781
  n.features.clientTools,
5615
- a == null ? void 0 : a.clientTools
5782
+ t == null ? void 0 : t.clientTools
5616
5783
  )
5617
5784
  };
5618
5785
  }
5619
- class Ia extends Error {
5620
- constructor(e, a, s) {
5621
- super(a), this.name = "WidgetInitializationError", this.code = e, this.details = s;
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 w = class w {
5791
+ const j = class j {
5625
5792
  constructor({
5626
5793
  config: e,
5627
- storage: a,
5628
- getClientCapabilities: s,
5629
- getRequestConfig: i,
5630
- modes: _,
5631
- org: o,
5632
- agent: t,
5633
- parent: r
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 w({
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.routerCtx.dispose(), this.resetChat();
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), !w.pollingIntervalsSeconds)
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 = i ?? (() => this.config), this.getClientCapabilities = s, this.org = o, this.agent = t, this.api = (r == null ? void 0 : r.api) ?? new O({ config: e }), this.storageCtx = (r == null ? void 0 : r.storageCtx) ?? (a ? new Pa({ storage: a, config: e }) : void 0), this.modes = _, this.contactCtx = (r == null ? void 0 : r.contactCtx) ?? new le({
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 ja({
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: r ? void 0 : this.storageCtx,
5674
- sharedSessions: r == null ? void 0 : r.sessionCtx.sessionsState,
5675
- sessionsPollingIntervalSeconds: w.pollingIntervalsSeconds.sessions
5676
- }), this.messageCtx = new I({
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: s,
5688
- getRequestConfig: i
5689
- }), this.uploadCtx = new ce(this.api), this.csatCtx = new pe({
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 Me({
5863
+ }), this.dictationCtx = new Fe({
5694
5864
  api: this.api,
5695
5865
  config: this.config
5696
- }), this.activeSessionPollingCtx = new _e({
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: w.pollingIntervalsSeconds.session
5702
- }), this.routerCtx = new Ea(this);
5871
+ sessionPollingIntervalSeconds: j.pollingIntervalsSeconds.session
5872
+ }), this.routerCtx = new Ra(this);
5703
5873
  }
5704
5874
  get streaming() {
5705
- var e, a;
5706
- return (e = this.messageCtx) != null && e.hasPendingAgentWork ? !0 : (a = this.messageCtx) != null && a.state.get().isSendingMessage ? !1 : this.agent.streaming && this.getRequestConfig().streaming !== !1;
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 Ma(this.agent, this.getRequestConfig());
5883
+ return Fa(this.agent, this.getRequestConfig());
5714
5884
  }
5715
5885
  };
5716
- w.pollingIntervalsSeconds = null, w.initialize = async ({
5886
+ j.pollingIntervalsSeconds = null, j.initialize = async ({
5717
5887
  config: e,
5718
- storage: a,
5719
- getClientCapabilities: s,
5720
- getRequestConfig: i
5888
+ storage: t,
5889
+ getClientCapabilities: o,
5890
+ getRequestConfig: r
5721
5891
  }) => {
5722
- var o, t;
5723
- const _ = await new O({
5892
+ var s, a;
5893
+ const l = await new B({
5724
5894
  config: e
5725
5895
  }).getExternalWidgetConfig();
5726
- if (!_.data)
5727
- throw h.error("widget config fetch failed", _.error), new Ia(
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
- _.error
5900
+ l.error
5731
5901
  );
5732
- return w.pollingIntervalsSeconds = {
5733
- session: ((o = _.data) == null ? void 0 : o.sessionPollingIntervalSeconds) || 10,
5734
- sessions: ((t = _.data) == null ? void 0 : t.sessionsPollingIntervalSeconds) || 60
5735
- }, new w({
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: a,
5738
- getClientCapabilities: s,
5739
- getRequestConfig: i,
5740
- modes: _.data.modes || [],
5907
+ storage: t,
5908
+ getClientCapabilities: o,
5909
+ getRequestConfig: r,
5910
+ modes: l.data.modes || [],
5741
5911
  org: {
5742
- id: _.data.org.id,
5743
- name: _.data.org.name
5912
+ id: l.data.org.id,
5913
+ name: l.data.org.name
5744
5914
  },
5745
- agent: Ta(_.data)
5915
+ agent: La(l.data)
5746
5916
  });
5747
5917
  };
5748
- let H = w;
5749
- function Ba(n, e) {
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 Va {
5757
- constructor({ attack: e, release: a }) {
5758
- this.value = 0, this.attack = e, this.release = a;
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 P = [
5937
+ const T = [
5768
5938
  "compact",
5769
5939
  "sidebar",
5770
5940
  "fullscreen"
5771
- ], Da = new Set(
5772
- P
5941
+ ], Ua = new Set(
5942
+ T
5773
5943
  );
5774
- function $(n) {
5775
- return Da.has(n);
5944
+ function Q(n) {
5945
+ return Ua.has(n);
5776
5946
  }
5777
- function Ha(n) {
5778
- if (!Array.isArray(n)) return P;
5779
- const e = [], a = /* @__PURE__ */ new Set();
5780
- for (const s of n)
5781
- !$(s) || a.has(s) || (a.add(s), e.push(s));
5782
- return e.length > 0 ? e : P;
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 Za(n, e) {
5785
- return $(n) && e.includes(n) ? n : e[0] ?? P[0];
5954
+ function et(n, e) {
5955
+ return Q(n) && e.includes(n) ? n : e[0] ?? T[0];
5786
5956
  }
5787
- function Ga(n, e) {
5957
+ function at(n, e) {
5788
5958
  return n === "left" || n === "right" ? n : e === "rtl" ? "left" : "right";
5789
5959
  }
5790
- function Wa(n) {
5960
+ function tt(n) {
5791
5961
  return n === "docked" ? "docked" : "floating";
5792
5962
  }
5793
5963
  export {
5794
- Va as DictationLevelSmoother,
5795
- j as PrimitiveState,
5796
- H as WidgetCtx,
5797
- Ia as WidgetInitializationError,
5798
- Aa as buildSendMessageBody,
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
- ya as getTranslation,
5801
- Fa as isAgentStreamKeepalive,
5802
- re as isExhaustive,
5803
- V as isRecord,
5804
- Ua as isRtlLanguage,
5805
- ba as isSupportedLanguage,
5806
- Oa as isTurnSteeredPart,
5807
- h as log,
5808
- Ha as normalizeCompanionLayouts,
5809
- Ba as resolveClientPresentation,
5810
- Za as resolveCompanionDefaultLayout,
5811
- Ca as resolveConfigContext,
5812
- fa as resolveLanguage,
5813
- Wa as resolveSidebarMode,
5814
- Ga as resolveSidebarSide,
5815
- wa as translate
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