@d-id/client-sdk 1.1.0-beta.1 → 1.1.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,320 +1,519 @@
1
- var me = Object.defineProperty;
2
- var ue = (e, t, a) => t in e ? me(e, t, { enumerable: !0, configurable: !0, writable: !0, value: a }) : e[t] = a;
3
- var H = (e, t, a) => (ue(e, typeof t != "symbol" ? t + "" : t, a), a);
4
- class J extends Error {
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => {
4
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
+ return value;
6
+ };
7
+ class BaseError extends Error {
5
8
  constructor({
6
- kind: a,
7
- description: n,
8
- error: s
9
+ kind,
10
+ description,
11
+ error
9
12
  }) {
10
13
  super(JSON.stringify({
11
- kind: a,
12
- description: n
14
+ kind,
15
+ description
13
16
  }));
14
- H(this, "kind");
15
- H(this, "description");
16
- H(this, "error");
17
- this.kind = a, this.description = n, this.error = s;
17
+ __publicField(this, "kind");
18
+ __publicField(this, "description");
19
+ __publicField(this, "error");
20
+ this.kind = kind;
21
+ this.description = description;
22
+ this.error = error;
18
23
  }
19
24
  }
20
- class fe extends J {
21
- constructor(t, a) {
25
+ class ChatCreationFailed extends BaseError {
26
+ constructor(mode, persistent) {
22
27
  super({
23
28
  kind: "ChatCreationFailed",
24
- description: `Failed to create ${a ? "persistent" : ""} chat, mode: ${t}`
29
+ description: `Failed to create ${persistent ? "persistent" : ""} chat, mode: ${mode}`
25
30
  });
26
31
  }
27
32
  }
28
- class ge extends J {
29
- constructor(t) {
33
+ class ChatModeDowngraded extends BaseError {
34
+ constructor(mode) {
30
35
  super({
31
36
  kind: "ChatModeDowngraded",
32
- description: `Chat mode downgraded to ${t}`
37
+ description: `Chat mode downgraded to ${mode}`
33
38
  });
34
39
  }
35
40
  }
36
- class B extends J {
37
- constructor(a, n) {
41
+ class ValidationError extends BaseError {
42
+ constructor(message, key) {
38
43
  super({
39
44
  kind: "ValidationError",
40
- description: a
45
+ description: message
41
46
  });
42
- H(this, "key");
43
- this.key = n;
47
+ __publicField(this, "key");
48
+ this.key = key;
44
49
  }
45
50
  }
46
- class he extends J {
47
- constructor(t) {
51
+ class WsError extends BaseError {
52
+ constructor(message) {
48
53
  super({
49
54
  kind: "WSError",
50
- description: t
55
+ description: message
51
56
  });
52
57
  }
53
58
  }
54
- var we = /* @__PURE__ */ ((e) => (e.TRIAL = "trial", e.BASIC = "basic", e.ENTERPRISE = "enterprise", e.LITE = "lite", e.ADVANCED = "advanced", e))(we || {}), pe = /* @__PURE__ */ ((e) => (e.TRIAL = "deid-trial", e.PRO = "deid-pro", e.ENTERPRISE = "deid-enterprise", e.LITE = "deid-lite", e.ADVANCED = "deid-advanced", e.BUILD = "deid-api-build", e.LAUNCH = "deid-api-launch", e.SCALE = "deid-api-scale", e))(pe || {}), ye = /* @__PURE__ */ ((e) => (e.Created = "created", e.Started = "started", e.Done = "done", e.Error = "error", e.Rejected = "rejected", e.Ready = "ready", e))(ye || {}), ve = /* @__PURE__ */ ((e) => (e.Unrated = "Unrated", e.Positive = "Positive", e.Negative = "Negative", e))(ve || {}), b = /* @__PURE__ */ ((e) => (e.Functional = "Functional", e.TextOnly = "TextOnly", e.Maintenance = "Maintenance", e.Playground = "Playground", e.DirectPlayback = "DirectPlayback", e))(b || {}), F = /* @__PURE__ */ ((e) => (e.Embed = "embed", e.Query = "query", e.Partial = "partial", e.Answer = "answer", e.Complete = "done", e))(F || {}), ke = /* @__PURE__ */ ((e) => (e.KnowledgeProcessing = "knowledge/processing", e.KnowledgeIndexing = "knowledge/indexing", e.KnowledgeFailed = "knowledge/error", e.KnowledgeDone = "knowledge/done", e))(ke || {}), Re = /* @__PURE__ */ ((e) => (e.Knowledge = "knowledge", e.Document = "document", e.Record = "record", e))(Re || {}), Ce = /* @__PURE__ */ ((e) => (e.Pdf = "pdf", e.Text = "text", e.Html = "html", e.Word = "word", e.Json = "json", e.Markdown = "markdown", e.Csv = "csv", e.Excel = "excel", e.Powerpoint = "powerpoint", e.Archive = "archive", e.Image = "image", e.Audio = "audio", e.Video = "video", e))(Ce || {}), ne = /* @__PURE__ */ ((e) => (e.Clip = "clip", e.Talk = "talk", e))(ne || {});
55
- const Se = (e) => {
56
- switch (e) {
59
+ var UserPlan = /* @__PURE__ */ ((UserPlan2) => {
60
+ UserPlan2["TRIAL"] = "trial";
61
+ UserPlan2["BASIC"] = "basic";
62
+ UserPlan2["ENTERPRISE"] = "enterprise";
63
+ UserPlan2["LITE"] = "lite";
64
+ UserPlan2["ADVANCED"] = "advanced";
65
+ return UserPlan2;
66
+ })(UserPlan || {});
67
+ var PlanGroup = /* @__PURE__ */ ((PlanGroup2) => {
68
+ PlanGroup2["TRIAL"] = "deid-trial";
69
+ PlanGroup2["PRO"] = "deid-pro";
70
+ PlanGroup2["ENTERPRISE"] = "deid-enterprise";
71
+ PlanGroup2["LITE"] = "deid-lite";
72
+ PlanGroup2["ADVANCED"] = "deid-advanced";
73
+ PlanGroup2["BUILD"] = "deid-api-build";
74
+ PlanGroup2["LAUNCH"] = "deid-api-launch";
75
+ PlanGroup2["SCALE"] = "deid-api-scale";
76
+ return PlanGroup2;
77
+ })(PlanGroup || {});
78
+ var AgentStatus = /* @__PURE__ */ ((AgentStatus2) => {
79
+ AgentStatus2["Created"] = "created";
80
+ AgentStatus2["Started"] = "started";
81
+ AgentStatus2["Done"] = "done";
82
+ AgentStatus2["Error"] = "error";
83
+ AgentStatus2["Rejected"] = "rejected";
84
+ AgentStatus2["Ready"] = "ready";
85
+ return AgentStatus2;
86
+ })(AgentStatus || {});
87
+ var RateState = /* @__PURE__ */ ((RateState2) => {
88
+ RateState2["Unrated"] = "Unrated";
89
+ RateState2["Positive"] = "Positive";
90
+ RateState2["Negative"] = "Negative";
91
+ return RateState2;
92
+ })(RateState || {});
93
+ var ChatMode = /* @__PURE__ */ ((ChatMode2) => {
94
+ ChatMode2["Functional"] = "Functional";
95
+ ChatMode2["TextOnly"] = "TextOnly";
96
+ ChatMode2["Maintenance"] = "Maintenance";
97
+ ChatMode2["Playground"] = "Playground";
98
+ ChatMode2["DirectPlayback"] = "DirectPlayback";
99
+ return ChatMode2;
100
+ })(ChatMode || {});
101
+ var ChatProgress = /* @__PURE__ */ ((ChatProgress2) => {
102
+ ChatProgress2["Embed"] = "embed";
103
+ ChatProgress2["Query"] = "query";
104
+ ChatProgress2["Partial"] = "partial";
105
+ ChatProgress2["Answer"] = "answer";
106
+ ChatProgress2["Complete"] = "done";
107
+ return ChatProgress2;
108
+ })(ChatProgress || {});
109
+ var Subject = /* @__PURE__ */ ((Subject2) => {
110
+ Subject2["KnowledgeProcessing"] = "knowledge/processing";
111
+ Subject2["KnowledgeIndexing"] = "knowledge/indexing";
112
+ Subject2["KnowledgeFailed"] = "knowledge/error";
113
+ Subject2["KnowledgeDone"] = "knowledge/done";
114
+ return Subject2;
115
+ })(Subject || {});
116
+ var KnowledgeType = /* @__PURE__ */ ((KnowledgeType2) => {
117
+ KnowledgeType2["Knowledge"] = "knowledge";
118
+ KnowledgeType2["Document"] = "document";
119
+ KnowledgeType2["Record"] = "record";
120
+ return KnowledgeType2;
121
+ })(KnowledgeType || {});
122
+ var DocumentType = /* @__PURE__ */ ((DocumentType2) => {
123
+ DocumentType2["Pdf"] = "pdf";
124
+ DocumentType2["Text"] = "text";
125
+ DocumentType2["Html"] = "html";
126
+ DocumentType2["Word"] = "word";
127
+ DocumentType2["Json"] = "json";
128
+ DocumentType2["Markdown"] = "markdown";
129
+ DocumentType2["Csv"] = "csv";
130
+ DocumentType2["Excel"] = "excel";
131
+ DocumentType2["Powerpoint"] = "powerpoint";
132
+ DocumentType2["Archive"] = "archive";
133
+ DocumentType2["Image"] = "image";
134
+ DocumentType2["Audio"] = "audio";
135
+ DocumentType2["Video"] = "video";
136
+ return DocumentType2;
137
+ })(DocumentType || {});
138
+ var VideoType = /* @__PURE__ */ ((VideoType2) => {
139
+ VideoType2["Clip"] = "clip";
140
+ VideoType2["Talk"] = "talk";
141
+ return VideoType2;
142
+ })(VideoType || {});
143
+ const mapVideoType = (type) => {
144
+ switch (type) {
57
145
  case "clip":
58
146
  return "clip";
59
147
  case "talk":
60
148
  return "talk";
61
149
  default:
62
- throw new Error(`Unknown video type: ${e}`);
150
+ throw new Error(`Unknown video type: ${type}`);
63
151
  }
64
152
  };
65
- var D = /* @__PURE__ */ ((e) => (e.Start = "START", e.Stop = "STOP", e))(D || {}), U = /* @__PURE__ */ ((e) => (e.ChatAnswer = "chat/answer", e.ChatPartial = "chat/partial", e.StreamDone = "stream/done", e.StreamStarted = "stream/started", e.StreamFailed = "stream/error", e.StreamReady = "stream/ready", e.StreamCreated = "stream/created", e.StreamVideoCreated = "stream-video/started", e.StreamVideoDone = "stream-video/done", e.StreamVideoError = "stream-video/error", e.StreamVideoRejected = "stream-video/rejected", e))(U || {}), S = /* @__PURE__ */ ((e) => (e.New = "new", e.Fail = "fail", e.Connected = "connected", e.Connecting = "connecting", e.Closed = "closed", e.Completed = "completed", e.Disconnected = "disconnected", e))(S || {}), De = /* @__PURE__ */ ((e) => (e.Amazon = "amazon", e.Microsoft = "microsoft", e.Afflorithmics = "afflorithmics", e.Elevenlabs = "elevenlabs", e))(De || {}), _e = /* @__PURE__ */ ((e) => (e.Public = "public", e.Premium = "premium", e.Private = "private", e))(_e || {});
66
- const Me = 45 * 1e3, Ee = "X-Playground-Chat", K = "https://api.d-id.com", be = "wss://notifications.d-id.com", Ie = "79f81a83a67430be2bc0fd61042b8faa", ae = (e) => new Promise((t) => setTimeout(t, e)), q = () => Math.random().toString(16).slice(2);
67
- function Pe(e, t) {
68
- let a;
153
+ var StreamingState = /* @__PURE__ */ ((StreamingState2) => {
154
+ StreamingState2["Start"] = "START";
155
+ StreamingState2["Stop"] = "STOP";
156
+ return StreamingState2;
157
+ })(StreamingState || {});
158
+ var ConnectivityState = /* @__PURE__ */ ((ConnectivityState2) => {
159
+ ConnectivityState2["Strong"] = "STRONG";
160
+ ConnectivityState2["Weak"] = "WEAK";
161
+ ConnectivityState2["Unknown"] = "UNKNOWN";
162
+ return ConnectivityState2;
163
+ })(ConnectivityState || {});
164
+ var AgentActivityState = /* @__PURE__ */ ((AgentActivityState2) => {
165
+ AgentActivityState2["Idle"] = "IDLE";
166
+ AgentActivityState2["Talking"] = "TALKING";
167
+ return AgentActivityState2;
168
+ })(AgentActivityState || {});
169
+ const DataChannelSignalMap = {
170
+ "stream/started": "START",
171
+ "stream/done": "STOP"
172
+ /* Stop */
173
+ };
174
+ var StreamEvents = /* @__PURE__ */ ((StreamEvents2) => {
175
+ StreamEvents2["ChatAnswer"] = "chat/answer";
176
+ StreamEvents2["ChatPartial"] = "chat/partial";
177
+ StreamEvents2["StreamDone"] = "stream/done";
178
+ StreamEvents2["StreamStarted"] = "stream/started";
179
+ StreamEvents2["StreamFailed"] = "stream/error";
180
+ StreamEvents2["StreamReady"] = "stream/ready";
181
+ StreamEvents2["StreamCreated"] = "stream/created";
182
+ StreamEvents2["StreamVideoCreated"] = "stream-video/started";
183
+ StreamEvents2["StreamVideoDone"] = "stream-video/done";
184
+ StreamEvents2["StreamVideoError"] = "stream-video/error";
185
+ StreamEvents2["StreamVideoRejected"] = "stream-video/rejected";
186
+ return StreamEvents2;
187
+ })(StreamEvents || {});
188
+ var ConnectionState = /* @__PURE__ */ ((ConnectionState2) => {
189
+ ConnectionState2["New"] = "new";
190
+ ConnectionState2["Fail"] = "fail";
191
+ ConnectionState2["Connected"] = "connected";
192
+ ConnectionState2["Connecting"] = "connecting";
193
+ ConnectionState2["Closed"] = "closed";
194
+ ConnectionState2["Completed"] = "completed";
195
+ ConnectionState2["Disconnected"] = "disconnected";
196
+ return ConnectionState2;
197
+ })(ConnectionState || {});
198
+ var StreamType = /* @__PURE__ */ ((StreamType2) => {
199
+ StreamType2["Legacy"] = "legacy";
200
+ StreamType2["Fluent"] = "fluent";
201
+ return StreamType2;
202
+ })(StreamType || {});
203
+ var Providers = /* @__PURE__ */ ((Providers2) => {
204
+ Providers2["Amazon"] = "amazon";
205
+ Providers2["Microsoft"] = "microsoft";
206
+ Providers2["Afflorithmics"] = "afflorithmics";
207
+ Providers2["Elevenlabs"] = "elevenlabs";
208
+ return Providers2;
209
+ })(Providers || {});
210
+ var VoiceAccess = /* @__PURE__ */ ((VoiceAccess2) => {
211
+ VoiceAccess2["Public"] = "public";
212
+ VoiceAccess2["Premium"] = "premium";
213
+ VoiceAccess2["Private"] = "private";
214
+ return VoiceAccess2;
215
+ })(VoiceAccess || {});
216
+ const CONNECTION_RETRY_TIMEOUT_MS = 45 * 1e3;
217
+ const PLAYGROUND_HEADER = "X-Playground-Chat";
218
+ const didApiUrl = "https://api-dev.d-id.com";
219
+ const didSocketApiUrl = "wss://notifications-dev.d-id.com";
220
+ const mixpanelKey = "79f81a83a67430be2bc0fd61042b8faa";
221
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
222
+ const getRandom = () => Math.random().toString(16).slice(2);
223
+ function createRacePromise(timeout, timeoutErrorMessage) {
224
+ let timeId;
225
+ const promise = new Promise((_, reject) => {
226
+ timeId = setTimeout(() => reject(new Error(timeoutErrorMessage)), timeout);
227
+ });
69
228
  return {
70
- promise: new Promise((s, i) => {
71
- a = setTimeout(() => i(new Error(t)), e);
72
- }),
73
- clear: () => clearTimeout(a)
229
+ promise,
230
+ clear: () => clearTimeout(timeId)
74
231
  };
75
232
  }
76
- async function X(e, t) {
77
- const a = {
78
- limit: (t == null ? void 0 : t.limit) ?? 3,
79
- delayMs: (t == null ? void 0 : t.delayMs) ?? 0,
80
- timeout: (t == null ? void 0 : t.timeout) ?? 3e4,
81
- timeoutErrorMessage: (t == null ? void 0 : t.timeoutErrorMessage) || "Timeout error",
82
- shouldRetryFn: (t == null ? void 0 : t.shouldRetryFn) ?? (() => !0),
83
- onRetry: (t == null ? void 0 : t.onRetry) ?? (() => {
233
+ async function retryOperation(operation, userOptions) {
234
+ const options = {
235
+ limit: (userOptions == null ? void 0 : userOptions.limit) ?? 3,
236
+ delayMs: (userOptions == null ? void 0 : userOptions.delayMs) ?? 0,
237
+ timeout: (userOptions == null ? void 0 : userOptions.timeout) ?? 3e4,
238
+ timeoutErrorMessage: (userOptions == null ? void 0 : userOptions.timeoutErrorMessage) || "Timeout error",
239
+ shouldRetryFn: (userOptions == null ? void 0 : userOptions.shouldRetryFn) ?? (() => true),
240
+ onRetry: (userOptions == null ? void 0 : userOptions.onRetry) ?? (() => {
84
241
  })
85
242
  };
86
- let n;
87
- for (let s = 1; s <= a.limit; s++)
243
+ let lastError;
244
+ for (let attempt = 1; attempt <= options.limit; attempt++) {
88
245
  try {
89
- if (!a.timeout)
90
- return await e();
246
+ if (!options.timeout) {
247
+ return await operation();
248
+ }
91
249
  const {
92
- promise: i,
93
- clear: r
94
- } = Pe(a.timeout, a.timeoutErrorMessage), o = e().finally(r);
95
- return await Promise.race([o, i]);
96
- } catch (i) {
97
- if (n = i, !a.shouldRetryFn(i) || s >= a.limit)
98
- throw i;
99
- await ae(a.delayMs), a.onRetry(i);
250
+ promise,
251
+ clear
252
+ } = createRacePromise(options.timeout, options.timeoutErrorMessage);
253
+ const operationPromise = operation().finally(clear);
254
+ return await Promise.race([operationPromise, promise]);
255
+ } catch (error) {
256
+ lastError = error;
257
+ if (!options.shouldRetryFn(error) || attempt >= options.limit) {
258
+ throw error;
259
+ }
260
+ await sleep(options.delayMs);
261
+ options.onRetry(error);
100
262
  }
101
- throw n;
263
+ }
264
+ throw lastError;
102
265
  }
103
- function ie() {
104
- let e = window.localStorage.getItem("did_external_key_id");
105
- return e || (e = Math.random().toString(16).slice(2), window.localStorage.setItem("did_external_key_id", e)), e;
266
+ function getExternalId() {
267
+ let key = window.localStorage.getItem("did_external_key_id");
268
+ if (!key) {
269
+ key = Math.random().toString(16).slice(2);
270
+ window.localStorage.setItem("did_external_key_id", key);
271
+ }
272
+ return key;
106
273
  }
107
- let Te = q();
108
- function se(e) {
109
- if (e.type === "bearer")
110
- return `Bearer ${e.token}`;
111
- if (e.type === "basic")
112
- return `Basic ${btoa(`${e.username}:${e.password}`)}`;
113
- if (e.type === "key")
114
- return `Client-Key ${e.clientKey}.${ie()}_${Te}`;
115
- throw new Error(`Unknown auth type: ${e}`);
274
+ let sessionKey = getRandom();
275
+ function getAuthHeader(auth) {
276
+ if (auth.type === "bearer") {
277
+ return `Bearer ${auth.token}`;
278
+ } else if (auth.type === "basic") {
279
+ return `Basic ${btoa(`${auth.username}:${auth.password}`)}`;
280
+ } else if (auth.type === "key") {
281
+ return `Client-Key ${auth.clientKey}.${getExternalId()}_${sessionKey}`;
282
+ } else {
283
+ throw new Error(`Unknown auth type: ${auth}`);
284
+ }
116
285
  }
117
- const $e = (e) => X(e, {
286
+ const retryHttpTooManyRequests = (operation) => retryOperation(operation, {
118
287
  limit: 3,
119
288
  delayMs: 1e3,
120
289
  timeout: 0,
121
- shouldRetryFn: (t) => t.status === 429
290
+ shouldRetryFn: (error) => error.status === 429
122
291
  });
123
- function Q(e, t = K, a) {
124
- const n = async (s, i) => {
292
+ function createClient(auth, host = didApiUrl, onError) {
293
+ const client = async (url, options) => {
125
294
  const {
126
- skipErrorHandler: r,
127
- ...o
128
- } = i || {}, c = await $e(() => fetch(t + (s != null && s.startsWith("/") ? s : `/${s}`), {
129
- ...o,
295
+ skipErrorHandler,
296
+ ...fetchOptions
297
+ } = options || {};
298
+ const request = await retryHttpTooManyRequests(() => fetch(host + ((url == null ? void 0 : url.startsWith("/")) ? url : `/${url}`), {
299
+ ...fetchOptions,
130
300
  headers: {
131
- ...o.headers,
132
- Authorization: se(e),
301
+ ...fetchOptions.headers,
302
+ Authorization: getAuthHeader(auth),
133
303
  "Content-Type": "application/json"
134
304
  }
135
305
  }));
136
- if (!c.ok) {
137
- let u = await c.text().catch(() => `Failed to fetch with status ${c.status}`);
138
- const d = new Error(u);
139
- throw a && !r && a(d, {
140
- url: s,
141
- options: o,
142
- headers: c.headers
143
- }), d;
306
+ if (!request.ok) {
307
+ let errorText = await request.text().catch(() => `Failed to fetch with status ${request.status}`);
308
+ const error = new Error(errorText);
309
+ if (onError && !skipErrorHandler) {
310
+ onError(error, {
311
+ url,
312
+ options: fetchOptions,
313
+ headers: request.headers
314
+ });
315
+ }
316
+ throw error;
144
317
  }
145
- return c.json();
318
+ return request.json();
146
319
  };
147
320
  return {
148
- get(s, i) {
149
- return n(s, {
150
- ...i,
321
+ get(url, options) {
322
+ return client(url, {
323
+ ...options,
151
324
  method: "GET"
152
325
  });
153
326
  },
154
- post(s, i, r) {
155
- return n(s, {
156
- ...r,
157
- body: JSON.stringify(i),
327
+ post(url, body, options) {
328
+ return client(url, {
329
+ ...options,
330
+ body: JSON.stringify(body),
158
331
  method: "POST"
159
332
  });
160
333
  },
161
- delete(s, i, r) {
162
- return n(s, {
163
- ...r,
164
- body: JSON.stringify(i),
334
+ delete(url, body, options) {
335
+ return client(url, {
336
+ ...options,
337
+ body: JSON.stringify(body),
165
338
  method: "DELETE"
166
339
  });
167
340
  },
168
- patch(s, i, r) {
169
- return n(s, {
170
- ...r,
171
- body: JSON.stringify(i),
341
+ patch(url, body, options) {
342
+ return client(url, {
343
+ ...options,
344
+ body: JSON.stringify(body),
172
345
  method: "PATCH"
173
346
  });
174
347
  }
175
348
  };
176
349
  }
177
- function oe(e, t = K, a) {
178
- const n = Q(e, `${t}/agents`, a);
350
+ function createAgentsApi(auth, host = didApiUrl, onError) {
351
+ const client = createClient(auth, `${host}/agents`, onError);
179
352
  return {
180
- create(s, i) {
181
- return n.post("/", s, i);
353
+ create(payload, options) {
354
+ return client.post(`/`, payload, options);
182
355
  },
183
- getAgents(s, i) {
184
- return n.get(`/${s ? `?tag=${s}` : ""}`, i).then((r) => r ?? []);
356
+ getAgents(tag, options) {
357
+ return client.get(`/${tag ? `?tag=${tag}` : ""}`, options).then((agents) => agents ?? []);
185
358
  },
186
- getById(s, i) {
187
- return n.get(`/${s}`, i);
359
+ getById(id, options) {
360
+ return client.get(`/${id}`, options);
188
361
  },
189
- delete(s, i) {
190
- return n.delete(`/${s}`, void 0, i);
362
+ delete(id, options) {
363
+ return client.delete(`/${id}`, void 0, options);
191
364
  },
192
- update(s, i, r) {
193
- return n.patch(`/${s}`, i, r);
365
+ update(id, payload, options) {
366
+ return client.patch(`/${id}`, payload, options);
194
367
  },
195
- newChat(s, i, r) {
196
- return n.post(`/${s}/chat`, i, r);
368
+ newChat(agentId, payload, options) {
369
+ return client.post(`/${agentId}/chat`, payload, options);
197
370
  },
198
- chat(s, i, r, o) {
199
- return n.post(`/${s}/chat/${i}`, r, o);
371
+ chat(agentId, chatId, payload, options) {
372
+ return client.post(`/${agentId}/chat/${chatId}`, payload, options);
200
373
  },
201
- createRating(s, i, r, o) {
202
- return n.post(`/${s}/chat/${i}/ratings`, r, o);
374
+ createRating(agentId, chatId, payload, options) {
375
+ return client.post(`/${agentId}/chat/${chatId}/ratings`, payload, options);
203
376
  },
204
- updateRating(s, i, r, o, c) {
205
- return n.patch(`/${s}/chat/${i}/ratings/${r}`, o, c);
377
+ updateRating(agentId, chatId, ratingId, payload, options) {
378
+ return client.patch(`/${agentId}/chat/${chatId}/ratings/${ratingId}`, payload, options);
206
379
  },
207
- deleteRating(s, i, r, o) {
208
- return n.delete(`/${s}/chat/${i}/ratings/${r}`, o);
380
+ deleteRating(agentId, chatId, ratingId, options) {
381
+ return client.delete(`/${agentId}/chat/${chatId}/ratings/${ratingId}`, options);
209
382
  },
210
- getSTTToken(s, i) {
211
- return n.get(`/${s}/stt-token`, i);
383
+ getSTTToken(agentId, options) {
384
+ return client.get(`/${agentId}/stt-token`, options);
212
385
  }
213
386
  };
214
387
  }
215
- const Z = (e) => e.type === "clip" && e.presenter_id.startsWith("v2_") ? "clip_v2" : e.type;
216
- function Ae(e) {
217
- var s, i, r, o;
218
- const t = () => /Mobi|Android/i.test(navigator.userAgent) ? "Mobile" : "Desktop", a = () => {
219
- const c = navigator.platform;
220
- return c.toLowerCase().includes("win") ? "Windows" : c.toLowerCase().includes("mac") ? "Mac OS X" : c.toLowerCase().includes("linux") ? "Linux" : "Unknown";
221
- }, n = e.presenter;
388
+ const getAgentType = (presenter) => presenter.type === "clip" && presenter.presenter_id.startsWith("v2_") ? "clip_v2" : presenter.type;
389
+ function getAnalyticsInfo(agent) {
390
+ var _a, _b, _c, _d;
391
+ const mobileOrDesktop = () => {
392
+ return /Mobi|Android/i.test(navigator.userAgent) ? "Mobile" : "Desktop";
393
+ };
394
+ const getUserOS = () => {
395
+ const platform = navigator.platform;
396
+ if (platform.toLowerCase().includes("win")) {
397
+ return "Windows";
398
+ } else if (platform.toLowerCase().includes("mac")) {
399
+ return "Mac OS X";
400
+ } else if (platform.toLowerCase().includes("linux")) {
401
+ return "Linux";
402
+ } else {
403
+ return "Unknown";
404
+ }
405
+ };
406
+ const presenter = agent.presenter;
222
407
  return {
223
- $os: `${a()}`,
224
- isMobile: `${t() == "Mobile"}`,
408
+ $os: `${getUserOS()}`,
409
+ isMobile: `${mobileOrDesktop() == "Mobile"}`,
225
410
  browser: navigator.userAgent,
226
411
  origin: window.location.origin,
227
- agentType: Z(n),
412
+ agentType: getAgentType(presenter),
228
413
  agentVoice: {
229
- voiceId: (i = (s = e.presenter) == null ? void 0 : s.voice) == null ? void 0 : i.voice_id,
230
- provider: (o = (r = e.presenter) == null ? void 0 : r.voice) == null ? void 0 : o.type
414
+ voiceId: (_b = (_a = agent.presenter) == null ? void 0 : _a.voice) == null ? void 0 : _b.voice_id,
415
+ provider: (_d = (_c = agent.presenter) == null ? void 0 : _c.voice) == null ? void 0 : _d.type
231
416
  }
232
417
  };
233
418
  }
234
- function ze(e, t, a) {
235
- var c, u, d;
419
+ const sumFunc = (numbers) => numbers.reduce((total, aNumber) => total + aNumber, 0);
420
+ const average = (numbers) => sumFunc(numbers) / numbers.length;
421
+ function getStreamAnalyticsProps(data, agent, additionalProps) {
422
+ var _a, _b, _c;
236
423
  const {
237
- event: n,
238
- ...s
239
- } = e, {
240
- template: i
241
- } = (t == null ? void 0 : t.llm) || {}, {
242
- language: r
243
- } = ((c = t == null ? void 0 : t.presenter) == null ? void 0 : c.voice) || {};
244
- return {
245
- ...s,
424
+ event,
425
+ ...baseProps
426
+ } = data;
427
+ const {
428
+ template
429
+ } = (agent == null ? void 0 : agent.llm) || {};
430
+ const {
431
+ language
432
+ } = ((_a = agent == null ? void 0 : agent.presenter) == null ? void 0 : _a.voice) || {};
433
+ const props = {
434
+ ...baseProps,
246
435
  llm: {
247
- ...s.llm,
248
- template: i
436
+ ...baseProps.llm,
437
+ template
249
438
  },
250
439
  script: {
251
- ...s.script,
440
+ ...baseProps.script,
252
441
  provider: {
253
- ...(u = s == null ? void 0 : s.script) == null ? void 0 : u.provider,
254
- language: r
442
+ ...(_b = baseProps == null ? void 0 : baseProps.script) == null ? void 0 : _b.provider,
443
+ language
255
444
  }
256
445
  },
257
- stitch: (t == null ? void 0 : t.presenter.type) === "talk" ? (d = t == null ? void 0 : t.presenter) == null ? void 0 : d.stitch : void 0,
258
- ...a
446
+ stitch: (agent == null ? void 0 : agent.presenter.type) === "talk" ? (_c = agent == null ? void 0 : agent.presenter) == null ? void 0 : _c.stitch : void 0,
447
+ ...additionalProps
259
448
  };
449
+ return props;
260
450
  }
261
- let V = {};
262
- const Le = "https://api-js.mixpanel.com/track/?verbose=1&ip=1";
263
- function je(e) {
264
- var i, r, o, c, u, d;
265
- const t = window != null && window.hasOwnProperty("DID_AGENTS_API") ? "agents-ui" : "agents-sdk", a = e.agent.presenter, n = (i = e.agent.llm) == null ? void 0 : i.prompt_customization, s = {
266
- token: e.token || "testKey",
267
- distinct_id: e.distinctId || ie(),
268
- agentId: e.agent.id,
269
- agentType: Z(a),
270
- owner_id: e.agent.owner_id ?? "",
271
- promptVersion: (r = e.agent.llm) == null ? void 0 : r.prompt_version,
451
+ let mixpanelEvents = {};
452
+ const mixpanelUrl = "https://api-js.mixpanel.com/track/?verbose=1&ip=1";
453
+ function initializeAnalytics(config) {
454
+ var _a, _b, _c, _d, _e, _f;
455
+ const source = (window == null ? void 0 : window.hasOwnProperty("DID_AGENTS_API")) ? "agents-ui" : "agents-sdk";
456
+ const presenter = config.agent.presenter;
457
+ const promptCustomization = (_a = config.agent.llm) == null ? void 0 : _a.prompt_customization;
458
+ const analyticProps = {
459
+ token: config.token || "testKey",
460
+ distinct_id: config.distinctId || getExternalId(),
461
+ agentId: config.agent.id,
462
+ agentType: getAgentType(presenter),
463
+ owner_id: config.agent.owner_id ?? "",
464
+ promptVersion: (_b = config.agent.llm) == null ? void 0 : _b.prompt_version,
272
465
  behavior: {
273
- role: n == null ? void 0 : n.role,
274
- personality: n == null ? void 0 : n.personality,
275
- instructions: (o = e.agent.llm) == null ? void 0 : o.instructions
466
+ role: promptCustomization == null ? void 0 : promptCustomization.role,
467
+ personality: promptCustomization == null ? void 0 : promptCustomization.personality,
468
+ instructions: (_c = config.agent.llm) == null ? void 0 : _c.instructions
276
469
  },
277
- temperature: (c = e.agent.llm) == null ? void 0 : c.temperature,
278
- knowledgeSource: n == null ? void 0 : n.knowledge_source,
279
- starterQuestionsCount: (d = (u = e.agent.knowledge) == null ? void 0 : u.starter_message) == null ? void 0 : d.length,
280
- topicsToAvoid: n == null ? void 0 : n.topics_to_avoid,
281
- maxResponseLength: n == null ? void 0 : n.max_response_length
470
+ temperature: (_d = config.agent.llm) == null ? void 0 : _d.temperature,
471
+ knowledgeSource: promptCustomization == null ? void 0 : promptCustomization.knowledge_source,
472
+ starterQuestionsCount: (_f = (_e = config.agent.knowledge) == null ? void 0 : _e.starter_message) == null ? void 0 : _f.length,
473
+ topicsToAvoid: promptCustomization == null ? void 0 : promptCustomization.topics_to_avoid,
474
+ maxResponseLength: promptCustomization == null ? void 0 : promptCustomization.max_response_length
282
475
  };
283
476
  return {
284
- ...s,
477
+ ...analyticProps,
285
478
  additionalProperties: {},
286
- isEnabled: e.isEnabled ?? !0,
479
+ isEnabled: config.isEnabled ?? true,
287
480
  getRandom: () => Math.random().toString(16).slice(2),
288
- enrich(g) {
289
- const R = {};
290
- if (g && typeof g != "object")
481
+ enrich(properties) {
482
+ const props = {};
483
+ if (properties && typeof properties !== "object") {
291
484
  throw new Error("properties must be a flat json object");
292
- for (let h in g)
293
- (typeof g[h] == "string" || typeof g[h] == "number") && (R[h] = g[h]);
485
+ }
486
+ for (let prop in properties) {
487
+ if (typeof properties[prop] === "string" || typeof properties[prop] === "number") {
488
+ props[prop] = properties[prop];
489
+ }
490
+ }
294
491
  this.additionalProperties = {
295
492
  ...this.additionalProperties,
296
- ...R
493
+ ...props
297
494
  };
298
495
  },
299
- async track(g, R) {
300
- if (!this.isEnabled)
496
+ async track(event, props) {
497
+ if (!this.isEnabled) {
301
498
  return Promise.resolve();
499
+ }
302
500
  const {
303
- audioPath: h,
304
- ...y
305
- } = R || {}, v = {
501
+ audioPath,
502
+ ...sendProps
503
+ } = props || {};
504
+ const options = {
306
505
  method: "POST",
307
506
  headers: {
308
507
  "Content-Type": "application/x-www-form-urlencoded"
309
508
  },
310
509
  body: new URLSearchParams({
311
510
  data: JSON.stringify([{
312
- event: g,
511
+ event,
313
512
  properties: {
314
513
  ...this.additionalProperties,
315
- ...y,
316
- ...s,
317
- source: t,
514
+ ...sendProps,
515
+ ...analyticProps,
516
+ source,
318
517
  time: Date.now(),
319
518
  $insert_id: this.getRandom(),
320
519
  origin: window.location.href,
@@ -326,861 +525,1261 @@ function je(e) {
326
525
  })
327
526
  };
328
527
  try {
329
- return await fetch(Le, v).then((C) => C.json());
330
- } catch (C) {
331
- return console.error(C);
528
+ return await fetch(mixpanelUrl, options).then((res) => res.json());
529
+ } catch (err) {
530
+ return console.error(err);
332
531
  }
333
532
  },
334
- linkTrack(g, R, h, y) {
335
- V[g] || (V[g] = {
336
- events: {},
337
- resolvedDependencies: []
338
- }), y.includes(h) || y.push(h);
339
- const v = V[g];
340
- if (v.events[h] = {
341
- props: R
342
- }, v.resolvedDependencies.push(h), y.every((A) => v.resolvedDependencies.includes(A))) {
343
- const A = y.reduce((I, l) => v.events[l] ? {
344
- ...I,
345
- ...v.events[l].props
346
- } : I, {});
347
- this.track(g, A), v.resolvedDependencies = v.resolvedDependencies.filter((I) => !y.includes(I)), y.forEach((I) => {
348
- delete v.events[I];
533
+ linkTrack(mixpanelEvent, props, event, dependencies) {
534
+ if (!mixpanelEvents[mixpanelEvent]) {
535
+ mixpanelEvents[mixpanelEvent] = {
536
+ events: {},
537
+ resolvedDependencies: []
538
+ };
539
+ }
540
+ if (!dependencies.includes(event)) {
541
+ dependencies.push(event);
542
+ }
543
+ const linkedEvent = mixpanelEvents[mixpanelEvent];
544
+ linkedEvent.events[event] = {
545
+ props
546
+ };
547
+ linkedEvent.resolvedDependencies.push(event);
548
+ const allDependenciesResolved = dependencies.every((value) => linkedEvent.resolvedDependencies.includes(value));
549
+ if (allDependenciesResolved) {
550
+ const aggregatedProps = dependencies.reduce((acc, curr) => {
551
+ if (linkedEvent.events[curr]) {
552
+ return {
553
+ ...acc,
554
+ ...linkedEvent.events[curr].props
555
+ };
556
+ }
557
+ return acc;
558
+ }, {});
559
+ this.track(mixpanelEvent, aggregatedProps);
560
+ linkedEvent.resolvedDependencies = linkedEvent.resolvedDependencies.filter((event2) => !dependencies.includes(event2));
561
+ dependencies.forEach((event2) => {
562
+ delete linkedEvent.events[event2];
349
563
  });
350
564
  }
351
565
  }
352
566
  };
353
567
  }
354
- function xe() {
355
- let e = 0;
568
+ function createTimestampTracker() {
569
+ let timestamp = 0;
356
570
  return {
357
- reset: () => e = 0,
358
- update: () => e = Date.now(),
359
- get: (t = !1) => t ? Date.now() - e : e
571
+ reset: () => timestamp = 0,
572
+ update: () => timestamp = Date.now(),
573
+ get: (delta = false) => delta ? Date.now() - timestamp : timestamp
360
574
  };
361
575
  }
362
- const N = xe();
363
- function ce(e) {
364
- return e === b.Playground ? {
576
+ const timestampTracker = createTimestampTracker();
577
+ function getRequestHeaders(chatMode) {
578
+ return chatMode === ChatMode.Playground ? {
365
579
  headers: {
366
- [Ee]: "true"
580
+ [PLAYGROUND_HEADER]: "true"
367
581
  }
368
582
  } : {};
369
583
  }
370
- async function de(e, t, a, n, s = !1, i) {
584
+ async function createChat(agent, agentsApi, analytics, chatMode, persist = false, chat) {
371
585
  try {
372
- return !i && n !== b.DirectPlayback && (i = await t.newChat(e.id, {
373
- persist: s
374
- }, ce(n)), a.track("agent-chat", {
375
- event: "created",
376
- chat_id: i.id,
377
- agent_id: e.id,
378
- mode: n
379
- })), {
380
- chat: i,
381
- chatMode: (i == null ? void 0 : i.chat_mode) ?? n
586
+ if (!chat && chatMode !== ChatMode.DirectPlayback) {
587
+ chat = await agentsApi.newChat(agent.id, {
588
+ persist
589
+ }, getRequestHeaders(chatMode));
590
+ analytics.track("agent-chat", {
591
+ event: "created",
592
+ chat_id: chat.id,
593
+ agent_id: agent.id,
594
+ mode: chatMode
595
+ });
596
+ }
597
+ return {
598
+ chat,
599
+ chatMode: (chat == null ? void 0 : chat.chat_mode) ?? chatMode
382
600
  };
383
- } catch (r) {
601
+ } catch (error) {
384
602
  try {
385
- const o = JSON.parse(r.message);
386
- if ((o == null ? void 0 : o.kind) === "InsufficientCreditsError")
603
+ const parsedError = JSON.parse(error.message);
604
+ if ((parsedError == null ? void 0 : parsedError.kind) === "InsufficientCreditsError") {
387
605
  throw new Error("InsufficientCreditsError");
388
- } catch (o) {
389
- console.error("Error parsing the error message:", o);
606
+ }
607
+ } catch (e) {
608
+ console.error("Error parsing the error message:", e);
390
609
  }
391
610
  throw new Error("Cannot create new chat");
392
611
  }
393
612
  }
394
- function Ne(e) {
395
- var a;
396
- const t = ((a = e.greetings) == null ? void 0 : a.filter((n) => n.length > 0)) ?? [];
397
- return t.length > 0 ? t[Math.floor(Math.random() * t.length)] : `Hi! I'm ${e.preview_name || "My Agent"}. How can I help you?`;
613
+ function getGreetings(agent) {
614
+ var _a;
615
+ const greetings = ((_a = agent.greetings) == null ? void 0 : _a.filter((greeting) => greeting.length > 0)) ?? [];
616
+ if (greetings.length > 0) {
617
+ return greetings[Math.floor(Math.random() * greetings.length)];
618
+ }
619
+ return `Hi! I'm ${agent.preview_name || "My Agent"}. How can I help you?`;
398
620
  }
399
- function ee(e, t) {
400
- return t && t.length > 0 ? t : [{
401
- content: e,
402
- id: q(),
621
+ function getInitialMessages(content, initialMessages) {
622
+ if (initialMessages && initialMessages.length > 0) {
623
+ return initialMessages;
624
+ }
625
+ return [{
626
+ content,
627
+ id: getRandom(),
403
628
  role: "assistant",
404
629
  created_at: (/* @__PURE__ */ new Date()).toISOString()
405
630
  }];
406
631
  }
407
- function Be(e) {
408
- return new Promise((t, a) => {
632
+ function connect(options) {
633
+ return new Promise((resolve, reject) => {
634
+ const {
635
+ callbacks,
636
+ host,
637
+ auth
638
+ } = options;
409
639
  const {
410
- callbacks: n,
411
- host: s,
412
- auth: i
413
- } = e, {
414
- onMessage: r = null,
415
- onOpen: o = null,
416
- onClose: c = null,
417
- onError: u = null
418
- } = n || {}, d = new WebSocket(`${s}?authorization=${se(i)}`);
419
- d.onmessage = r, d.onclose = c, d.onerror = (g) => {
420
- console.error(g), u == null || u("Websocket failed to connect", g), a(g);
421
- }, d.onopen = (g) => {
422
- o == null || o(g), t(d);
640
+ onMessage = null,
641
+ onOpen = null,
642
+ onClose = null,
643
+ onError = null
644
+ } = callbacks || {};
645
+ const socket = new WebSocket(`${host}?authorization=${getAuthHeader(auth)}`);
646
+ socket.onmessage = onMessage;
647
+ socket.onclose = onClose;
648
+ socket.onerror = (e) => {
649
+ console.error(e);
650
+ onError == null ? void 0 : onError("Websocket failed to connect", e);
651
+ reject(e);
652
+ };
653
+ socket.onopen = (e) => {
654
+ onOpen == null ? void 0 : onOpen(e);
655
+ resolve(socket);
423
656
  };
424
657
  });
425
658
  }
426
- async function Fe(e) {
659
+ async function connectWithRetries(options) {
427
660
  const {
428
- retries: t = 1
429
- } = e;
430
- let a = null;
431
- for (let n = 0; (a == null ? void 0 : a.readyState) !== WebSocket.OPEN; n++)
661
+ retries = 1
662
+ } = options;
663
+ let socket = null;
664
+ for (let attempt = 0; (socket == null ? void 0 : socket.readyState) !== WebSocket.OPEN; attempt++) {
432
665
  try {
433
- a = await Be(e);
434
- } catch (s) {
435
- if (n === t)
436
- throw s;
437
- await ae(n * 500);
666
+ socket = await connect(options);
667
+ } catch (e) {
668
+ if (attempt === retries) {
669
+ throw e;
670
+ }
671
+ await sleep(attempt * 500);
438
672
  }
439
- return a;
673
+ }
674
+ return socket;
440
675
  }
441
- async function We(e, t, a) {
442
- const n = a != null && a.onMessage ? [a.onMessage] : [], s = await Fe({
443
- auth: e,
444
- host: t,
676
+ async function createSocketManager(auth, host, callbacks) {
677
+ const messageCallbacks = (callbacks == null ? void 0 : callbacks.onMessage) ? [callbacks.onMessage] : [];
678
+ const socket = await connectWithRetries({
679
+ auth,
680
+ host,
445
681
  callbacks: {
446
- onError: (i) => {
447
- var r;
448
- return (r = a.onError) == null ? void 0 : r.call(a, new he(i));
682
+ onError: (error) => {
683
+ var _a;
684
+ return (_a = callbacks.onError) == null ? void 0 : _a.call(callbacks, new WsError(error));
449
685
  },
450
- onMessage(i) {
451
- const r = JSON.parse(i.data);
452
- n.forEach((o) => o(r.event, r));
686
+ onMessage(event) {
687
+ const parsedData = JSON.parse(event.data);
688
+ messageCallbacks.forEach((callback) => callback(parsedData.event, parsedData));
453
689
  }
454
690
  }
455
691
  });
456
692
  return {
457
- socket: s,
458
- disconnect: () => s.close(),
459
- subscribeToEvents: (i) => n.push(i)
693
+ socket,
694
+ disconnect: () => socket.close(),
695
+ subscribeToEvents: (callback) => messageCallbacks.push(callback)
460
696
  };
461
697
  }
462
- function He(e) {
463
- if (e.answer !== void 0)
464
- return e.answer;
465
- let t = 0, a = "";
466
- for (; t in e; )
467
- a += e[t++];
468
- return a;
698
+ function getMessageContent(chatEventQueue) {
699
+ if (chatEventQueue["answer"] !== void 0) {
700
+ return chatEventQueue["answer"];
701
+ }
702
+ let currentSequence = 0;
703
+ let content = "";
704
+ while (currentSequence in chatEventQueue) {
705
+ content += chatEventQueue[currentSequence++];
706
+ }
707
+ return content;
469
708
  }
470
- function Ke(e, t, a, n, s) {
471
- const i = n.messages[n.messages.length - 1];
472
- if (!(e === F.Partial || e === F.Answer) || (i == null ? void 0 : i.role) !== "assistant")
709
+ function processChatEvent(event, data, chatEventQueue, items, onNewMessage) {
710
+ const lastMessage = items.messages[items.messages.length - 1];
711
+ if (!(event === ChatProgress.Partial || event === ChatProgress.Answer) || (lastMessage == null ? void 0 : lastMessage.role) !== "assistant") {
473
712
  return;
713
+ }
474
714
  const {
475
- content: r,
476
- sequence: o
477
- } = t;
478
- e === F.Partial ? a[o] = r : a.answer = r;
479
- const c = He(a);
480
- (i.content !== c || e === F.Answer) && (i.content = c, s == null || s([...n.messages], e));
715
+ content,
716
+ sequence
717
+ } = data;
718
+ if (event === ChatProgress.Partial) {
719
+ chatEventQueue[sequence] = content;
720
+ } else {
721
+ chatEventQueue["answer"] = content;
722
+ }
723
+ const messageContent = getMessageContent(chatEventQueue);
724
+ if (lastMessage.content !== messageContent || event === ChatProgress.Answer) {
725
+ lastMessage.content = messageContent;
726
+ onNewMessage == null ? void 0 : onNewMessage([...items.messages], event);
727
+ }
481
728
  }
482
- function Ue(e, t, a, n, s) {
483
- let i = {};
729
+ function createMessageEventQueue(analytics, items, options, agentEntity, onStreamDone) {
730
+ let chatEventQueue = {};
484
731
  return {
485
- clearQueue: () => i = {},
486
- onMessage: (r, o) => {
487
- var c, u;
488
- if ("content" in o)
489
- Ke(r, o, i, t, a.callbacks.onNewMessage), r === F.Answer && e.track("agent-message-received", {
490
- messages: t.messages.length,
491
- mode: t.chatMode
492
- });
493
- else {
494
- const d = U, g = [d.StreamVideoDone, d.StreamVideoError, d.StreamVideoRejected], R = [d.StreamFailed, d.StreamVideoError, d.StreamVideoRejected], h = ze(o, n, {
495
- mode: t.chatMode
732
+ clearQueue: () => chatEventQueue = {},
733
+ onMessage: (event, data) => {
734
+ var _a, _b;
735
+ if ("content" in data) {
736
+ processChatEvent(event, data, chatEventQueue, items, options.callbacks.onNewMessage);
737
+ if (event === ChatProgress.Answer) {
738
+ analytics.track("agent-message-received", {
739
+ messages: items.messages.length,
740
+ mode: items.chatMode
741
+ });
742
+ }
743
+ } else {
744
+ const SEvent = StreamEvents;
745
+ const completedEvents = [SEvent.StreamVideoDone, SEvent.StreamVideoError, SEvent.StreamVideoRejected];
746
+ const failedEvents = [SEvent.StreamFailed, SEvent.StreamVideoError, SEvent.StreamVideoRejected];
747
+ const props = getStreamAnalyticsProps(data, agentEntity, {
748
+ mode: items.chatMode
496
749
  });
497
- if (r = r, r === d.StreamVideoCreated)
498
- e.linkTrack("agent-video", h, d.StreamVideoCreated, ["start"]);
499
- else if (g.includes(r)) {
500
- const y = r.split("/")[1];
501
- R.includes(r) ? e.track("agent-video", {
502
- ...h,
503
- event: y
504
- }) : e.linkTrack("agent-video", {
505
- ...h,
506
- event: y
507
- }, r, ["done"]);
750
+ event = event;
751
+ if (event === SEvent.StreamVideoCreated) {
752
+ analytics.linkTrack("agent-video", props, SEvent.StreamVideoCreated, ["start"]);
753
+ } else if (completedEvents.includes(event)) {
754
+ const streamEvent = event.split("/")[1];
755
+ if (failedEvents.includes(event)) {
756
+ analytics.track("agent-video", {
757
+ ...props,
758
+ event: streamEvent
759
+ });
760
+ } else {
761
+ analytics.linkTrack("agent-video", {
762
+ ...props,
763
+ event: streamEvent
764
+ }, event, ["done"]);
765
+ }
766
+ }
767
+ if (failedEvents.includes(event)) {
768
+ (_b = (_a = options.callbacks).onError) == null ? void 0 : _b.call(_a, new Error(`Stream failed with event ${event}`), {
769
+ data
770
+ });
771
+ }
772
+ if (data.event === SEvent.StreamDone) {
773
+ onStreamDone();
508
774
  }
509
- R.includes(r) && ((u = (c = a.callbacks).onError) == null || u.call(c, new Error(`Stream failed with event ${r}`), {
510
- data: o
511
- })), o.event === d.StreamDone && s();
512
775
  }
513
776
  }
514
777
  };
515
778
  }
516
- function qe(e, t, a, n) {
517
- const s = Q(e, `${t}/agents/${a}`, n);
779
+ function createClipApi(auth, host, agentId, onError) {
780
+ const client = createClient(auth, `${host}/agents/${agentId}`, onError);
518
781
  return {
519
- createStream(i) {
520
- return s.post("/streams", {
521
- output_resolution: i.output_resolution,
522
- compatibility_mode: i.compatibility_mode,
523
- stream_warmup: i.stream_warmup,
524
- session_timeout: i.session_timeout,
525
- stream_greeting: i.stream_greeting
782
+ createStream(options) {
783
+ return client.post("/streams", {
784
+ output_resolution: options.output_resolution,
785
+ compatibility_mode: options.compatibility_mode,
786
+ stream_warmup: options.stream_warmup,
787
+ session_timeout: options.session_timeout,
788
+ stream_greeting: options.stream_greeting
526
789
  });
527
790
  },
528
- startConnection(i, r, o) {
529
- return s.post(`/streams/${i}/sdp`, {
530
- session_id: o,
531
- answer: r
791
+ startConnection(streamId, answer, sessionId) {
792
+ return client.post(`/streams/${streamId}/sdp`, {
793
+ session_id: sessionId,
794
+ answer
532
795
  });
533
796
  },
534
- addIceCandidate(i, r, o) {
535
- return s.post(`/streams/${i}/ice`, {
536
- session_id: o,
537
- ...r
797
+ addIceCandidate(streamId, candidate, sessionId) {
798
+ return client.post(`/streams/${streamId}/ice`, {
799
+ session_id: sessionId,
800
+ ...candidate
538
801
  });
539
802
  },
540
- sendStreamRequest(i, r, o) {
541
- return s.post(`/streams/${i}`, {
542
- session_id: r,
543
- ...o
803
+ sendStreamRequest(streamId, sessionId, payload) {
804
+ return client.post(`/streams/${streamId}`, {
805
+ session_id: sessionId,
806
+ ...payload
544
807
  });
545
808
  },
546
- close(i, r) {
547
- return s.delete(`/streams/${i}`, {
548
- session_id: r
809
+ close(streamId, sessionId) {
810
+ return client.delete(`/streams/${streamId}`, {
811
+ session_id: sessionId
549
812
  });
550
813
  }
551
814
  };
552
815
  }
553
- function Je(e, t, a, n) {
554
- const s = Q(e, `${t}/agents/${a}`, n);
816
+ function createTalkApi(auth, host, agentId, onError) {
817
+ const client = createClient(auth, `${host}/agents/${agentId}`, onError);
555
818
  return {
556
- createStream(i, r) {
557
- return s.post("/streams", {
558
- driver_url: i.driver_url,
559
- face: i.face,
560
- config: i.config,
561
- output_resolution: i.output_resolution,
562
- compatibility_mode: i.compatibility_mode,
563
- stream_warmup: i.stream_warmup,
564
- session_timeout: i.session_timeout,
565
- stream_greeting: i.stream_greeting
566
- }, r);
819
+ createStream(streamOptions, options) {
820
+ return client.post("/streams", {
821
+ driver_url: streamOptions.driver_url,
822
+ face: streamOptions.face,
823
+ config: streamOptions.config,
824
+ output_resolution: streamOptions.output_resolution,
825
+ compatibility_mode: streamOptions.compatibility_mode,
826
+ stream_warmup: streamOptions.stream_warmup,
827
+ session_timeout: streamOptions.session_timeout,
828
+ stream_greeting: streamOptions.stream_greeting
829
+ }, options);
567
830
  },
568
- startConnection(i, r, o, c) {
569
- return s.post(`/streams/${i}/sdp`, {
570
- session_id: o,
571
- answer: r
572
- }, c);
831
+ startConnection(streamId, answer, sessionId, options) {
832
+ return client.post(`/streams/${streamId}/sdp`, {
833
+ session_id: sessionId,
834
+ answer
835
+ }, options);
573
836
  },
574
- addIceCandidate(i, r, o, c) {
575
- return s.post(`/streams/${i}/ice`, {
576
- session_id: o,
577
- ...r
578
- }, c);
837
+ addIceCandidate(streamId, candidate, sessionId, options) {
838
+ return client.post(`/streams/${streamId}/ice`, {
839
+ session_id: sessionId,
840
+ ...candidate
841
+ }, options);
579
842
  },
580
- sendStreamRequest(i, r, o, c) {
581
- return s.post(`/streams/${i}`, {
582
- session_id: r,
583
- ...o
584
- }, c);
843
+ sendStreamRequest(streamId, sessionId, payload, options) {
844
+ return client.post(`/streams/${streamId}`, {
845
+ session_id: sessionId,
846
+ ...payload
847
+ }, options);
585
848
  },
586
- close(i, r, o) {
587
- return s.delete(`/streams/${i}`, {
588
- session_id: r
589
- }, o);
849
+ close(streamId, sessionId, options) {
850
+ return client.delete(`/streams/${streamId}`, {
851
+ session_id: sessionId
852
+ }, options);
590
853
  }
591
854
  };
592
855
  }
593
- function Ve(e, t, a) {
594
- const n = (t.timestamp - e.timestamp) / 1e3;
856
+ function createAggregateReport(start, end, lowFpsCount) {
857
+ const duration = (end.timestamp - start.timestamp) / 1e3;
595
858
  return {
596
- duration: n,
597
- bytesReceived: t.bytesReceived - e.bytesReceived,
598
- bitrate: Math.round((t.bytesReceived - e.bytesReceived) * 8 / n),
599
- packetsReceived: t.packetsReceived - e.packetsReceived,
600
- packetsLost: t.packetsLost - e.packetsLost,
601
- framesDropped: t.framesDropped - e.framesDropped,
602
- framesDecoded: t.framesDecoded - e.framesDecoded,
603
- jitter: t.jitter,
604
- jitterBufferDelay: (t.jitterBufferDelay - e.jitterBufferDelay) / n,
605
- framesPerSecond: t.framesPerSecond,
606
- freezeCount: t.freezeCount - e.freezeCount,
607
- freezeDuration: t.freezeDuration - e.freezeDuration,
608
- lowFpsCount: a
859
+ duration,
860
+ bytesReceived: end.bytesReceived - start.bytesReceived,
861
+ bitrate: Math.round((end.bytesReceived - start.bytesReceived) * 8 / duration),
862
+ packetsReceived: end.packetsReceived - start.packetsReceived,
863
+ packetsLost: end.packetsLost - start.packetsLost,
864
+ framesDropped: end.framesDropped - start.framesDropped,
865
+ framesDecoded: end.framesDecoded - start.framesDecoded,
866
+ jitter: end.jitter,
867
+ avgJitterDelayInInterval: (end.jitterBufferDelay - start.jitterBufferDelay) / (end.jitterBufferEmittedCount - start.jitterBufferEmittedCount),
868
+ jitterBufferEmittedCount: end.jitterBufferEmittedCount - start.jitterBufferEmittedCount,
869
+ jitterBufferDelay: (end.jitterBufferDelay - start.jitterBufferDelay) / duration,
870
+ framesPerSecond: end.framesPerSecond,
871
+ freezeCount: end.freezeCount - start.freezeCount,
872
+ freezeDuration: end.freezeDuration - start.freezeDuration,
873
+ lowFpsCount
609
874
  };
610
875
  }
611
- function Xe(e) {
612
- return e.filter((t) => t.freezeCount > 0 || t.framesPerSecond < 21 || t.framesDropped > 0 || t.packetsLost > 0).map((t) => {
876
+ function extractAnomalies(stats) {
877
+ return stats.filter((report) => report.freezeCount > 0 || report.framesPerSecond < 21 || report.framesDropped > 0 || report.packetsLost > 0).map((report) => {
613
878
  const {
614
- timestamp: a,
615
- ...n
616
- } = t, s = [];
617
- return t.freezeCount > 0 && s.push("freeze"), t.framesPerSecond < 21 && s.push("low fps"), t.framesDropped > 0 && s.push("frames dropped"), t.packetsLost > 0 && s.push("packet loss"), {
618
- ...n,
619
- causes: s
879
+ timestamp,
880
+ ...updatedReport
881
+ } = report;
882
+ const causes = [];
883
+ if (report.freezeCount > 0) {
884
+ causes.push("freeze");
885
+ }
886
+ if (report.framesPerSecond < 21) {
887
+ causes.push("low fps");
888
+ }
889
+ if (report.framesDropped > 0) {
890
+ causes.push("frames dropped");
891
+ }
892
+ if (report.packetsLost > 0) {
893
+ causes.push("packet loss");
894
+ }
895
+ return {
896
+ ...updatedReport,
897
+ causes
620
898
  };
621
899
  });
622
900
  }
623
- function Ye(e) {
624
- let t = "";
625
- for (const a of e.values())
626
- if (a && a.type === "codec" && a.mimeType.startsWith("video") && (t = a.mimeType.split("/")[1]), a && a.type === "inbound-rtp" && a.kind === "video")
901
+ function formatStats(stats) {
902
+ let codec = "";
903
+ for (const report of stats.values()) {
904
+ if (report && report.type === "codec" && report.mimeType.startsWith("video")) {
905
+ codec = report.mimeType.split("/")[1];
906
+ }
907
+ if (report && report.type === "inbound-rtp" && report.kind === "video") {
627
908
  return {
628
- codec: t,
629
- timestamp: a.timestamp,
630
- bytesReceived: a.bytesReceived,
631
- packetsReceived: a.packetsReceived,
632
- packetsLost: a.packetsLost,
633
- framesDropped: a.framesDropped,
634
- framesDecoded: a.framesDecoded,
635
- jitter: a.jitter,
636
- jitterBufferDelay: a.jitterBufferDelay,
637
- frameWidth: a.frameWidth,
638
- frameHeight: a.frameHeight,
639
- framesPerSecond: a.framesPerSecond,
640
- freezeCount: a.freezeCount,
641
- freezeDuration: a.totalFreezesDuration
909
+ codec,
910
+ timestamp: report.timestamp,
911
+ bytesReceived: report.bytesReceived,
912
+ packetsReceived: report.packetsReceived,
913
+ packetsLost: report.packetsLost,
914
+ framesDropped: report.framesDropped,
915
+ framesDecoded: report.framesDecoded,
916
+ jitter: report.jitter,
917
+ jitterBufferDelay: report.jitterBufferDelay,
918
+ jitterBufferEmittedCount: report.jitterBufferEmittedCount,
919
+ avgJitterDelayInInterval: report.jitterBufferDelay / report.jitterBufferEmittedCount,
920
+ frameWidth: report.frameWidth,
921
+ frameHeight: report.frameHeight,
922
+ framesPerSecond: report.framesPerSecond,
923
+ freezeCount: report.freezeCount,
924
+ freezeDuration: report.totalFreezesDuration
642
925
  };
926
+ }
927
+ }
643
928
  return {};
644
929
  }
645
- function Qe(e, t, a) {
646
- const n = e.map((r, o) => o === 0 ? a ? {
647
- timestamp: r.timestamp,
648
- duration: 0,
649
- bytesReceived: r.bytesReceived - a.bytesReceived,
650
- bitrate: (r.bytesReceived - a.bytesReceived) * 8 / (t / 1e3),
651
- packetsReceived: r.packetsReceived - a.packetsReceived,
652
- packetsLost: r.packetsLost - a.packetsLost,
653
- framesDropped: r.framesDropped - a.framesDropped,
654
- framesDecoded: r.framesDecoded - a.framesDecoded,
655
- jitter: r.jitter,
656
- jitterBufferDelay: r.jitterBufferDelay - a.jitterBufferDelay,
657
- framesPerSecond: r.framesPerSecond,
658
- freezeCount: r.freezeCount - a.freezeCount,
659
- freezeDuration: r.freezeDuration - a.freezeDuration
660
- } : {
661
- timestamp: r.timestamp,
662
- duration: 0,
663
- bytesReceived: r.bytesReceived,
664
- bitrate: r.bytesReceived * 8 / (t / 1e3),
665
- packetsReceived: r.packetsReceived,
666
- packetsLost: r.packetsLost,
667
- framesDropped: r.framesDropped,
668
- framesDecoded: r.framesDecoded,
669
- jitter: r.jitter,
670
- jitterBufferDelay: r.jitterBufferDelay,
671
- framesPerSecond: r.framesPerSecond,
672
- freezeCount: r.freezeCount,
673
- freezeDuration: r.freezeDuration
674
- } : {
675
- timestamp: r.timestamp,
676
- duration: t * o / 1e3,
677
- bytesReceived: r.bytesReceived - e[o - 1].bytesReceived,
678
- bitrate: (r.bytesReceived - e[o - 1].bytesReceived) * 8 / (t / 1e3),
679
- packetsReceived: r.packetsReceived - e[o - 1].packetsReceived,
680
- packetsLost: r.packetsLost - e[o - 1].packetsLost,
681
- framesDropped: r.framesDropped - e[o - 1].framesDropped,
682
- framesDecoded: r.framesDecoded - e[o - 1].framesDecoded,
683
- jitter: r.jitter,
684
- jitterBufferDelay: r.jitterBufferDelay - e[o - 1].jitterBufferDelay,
685
- framesPerSecond: r.framesPerSecond,
686
- freezeCount: r.freezeCount - e[o - 1].freezeCount,
687
- freezeDuration: r.freezeDuration - e[o - 1].freezeDuration
688
- }), s = Xe(n), i = s.reduce((r, o) => r + (o.causes.includes("low fps") ? 1 : 0), 0);
930
+ function createVideoStatsReport(stats, interval2, previousStats) {
931
+ const differentialReport = stats.map((report, index) => {
932
+ if (index === 0) {
933
+ if (!previousStats) {
934
+ return {
935
+ timestamp: report.timestamp,
936
+ duration: 0,
937
+ bytesReceived: report.bytesReceived,
938
+ bitrate: report.bytesReceived * 8 / (interval2 / 1e3),
939
+ packetsReceived: report.packetsReceived,
940
+ packetsLost: report.packetsLost,
941
+ framesDropped: report.framesDropped,
942
+ framesDecoded: report.framesDecoded,
943
+ jitter: report.jitter,
944
+ jitterBufferDelay: report.jitterBufferDelay,
945
+ jitterBufferEmittedCount: report.jitterBufferEmittedCount,
946
+ avgJitterDelayInInterval: report.jitterBufferDelay / report.jitterBufferEmittedCount,
947
+ framesPerSecond: report.framesPerSecond,
948
+ freezeCount: report.freezeCount,
949
+ freezeDuration: report.freezeDuration
950
+ };
951
+ }
952
+ return {
953
+ timestamp: report.timestamp,
954
+ duration: 0,
955
+ bytesReceived: report.bytesReceived - previousStats.bytesReceived,
956
+ bitrate: (report.bytesReceived - previousStats.bytesReceived) * 8 / (interval2 / 1e3),
957
+ packetsReceived: report.packetsReceived - previousStats.packetsReceived,
958
+ packetsLost: report.packetsLost - previousStats.packetsLost,
959
+ framesDropped: report.framesDropped - previousStats.framesDropped,
960
+ framesDecoded: report.framesDecoded - previousStats.framesDecoded,
961
+ jitter: report.jitter,
962
+ jitterBufferDelay: report.jitterBufferDelay - previousStats.jitterBufferDelay,
963
+ jitterBufferEmittedCount: report.jitterBufferEmittedCount - previousStats.jitterBufferEmittedCount,
964
+ avgJitterDelayInInterval: (report.jitterBufferDelay - previousStats.jitterBufferDelay) / (report.jitterBufferEmittedCount - previousStats.jitterBufferEmittedCount),
965
+ framesPerSecond: report.framesPerSecond,
966
+ freezeCount: report.freezeCount - previousStats.freezeCount,
967
+ freezeDuration: report.freezeDuration - previousStats.freezeDuration
968
+ };
969
+ }
970
+ return {
971
+ timestamp: report.timestamp,
972
+ duration: interval2 * index / 1e3,
973
+ bytesReceived: report.bytesReceived - stats[index - 1].bytesReceived,
974
+ bitrate: (report.bytesReceived - stats[index - 1].bytesReceived) * 8 / (interval2 / 1e3),
975
+ packetsReceived: report.packetsReceived - stats[index - 1].packetsReceived,
976
+ packetsLost: report.packetsLost - stats[index - 1].packetsLost,
977
+ framesDropped: report.framesDropped - stats[index - 1].framesDropped,
978
+ framesDecoded: report.framesDecoded - stats[index - 1].framesDecoded,
979
+ jitter: report.jitter,
980
+ jitterBufferDelay: report.jitterBufferDelay - stats[index - 1].jitterBufferDelay,
981
+ jitterBufferEmittedCount: report.jitterBufferEmittedCount - stats[index - 1].jitterBufferEmittedCount,
982
+ avgJitterDelayInInterval: (report.jitterBufferDelay - stats[index - 1].jitterBufferDelay) / (report.jitterBufferEmittedCount - stats[index - 1].jitterBufferEmittedCount),
983
+ framesPerSecond: report.framesPerSecond,
984
+ freezeCount: report.freezeCount - stats[index - 1].freezeCount,
985
+ freezeDuration: report.freezeDuration - stats[index - 1].freezeDuration
986
+ };
987
+ });
988
+ const anomalies = extractAnomalies(differentialReport);
989
+ const lowFpsCount = anomalies.reduce((acc, report) => acc + (report.causes.includes("low fps") ? 1 : 0), 0);
990
+ const avgJittersSamples = differentialReport.map((stat) => stat.avgJitterDelayInInterval);
689
991
  return {
690
992
  webRTCStats: {
691
- anomalies: s,
692
- aggregateReport: Ve(e[0], e[e.length - 1], i)
993
+ anomalies,
994
+ aggregateReport: createAggregateReport(stats[0], stats[stats.length - 1], lowFpsCount),
995
+ minJitterDelayInInterval: Math.min(...avgJittersSamples),
996
+ maxJitterDelayInInterval: Math.max(...avgJittersSamples),
997
+ avgJitterDelayInInterval: average(avgJittersSamples)
693
998
  },
694
- codec: e[0].codec,
695
- resolution: `${e[0].frameWidth}x${e[0].frameHeight}`
999
+ codec: stats[0].codec,
1000
+ resolution: `${stats[0].frameWidth}x${stats[0].frameHeight}`
696
1001
  };
697
1002
  }
698
- const Y = 200, Ze = Math.max(Math.ceil(400 / Y), 1);
699
- function Ge() {
700
- let e = 0;
701
- return (t) => {
702
- for (const a of t.values())
703
- if (a && a.type === "inbound-rtp" && a.kind === "video") {
704
- const n = a.bytesReceived, s = n - e > 0;
705
- return e = n, s;
1003
+ const interval = 100;
1004
+ const notReceivingIntervalsThreshold = Math.max(Math.ceil(400 / interval), 1);
1005
+ const LOW_JITTER_TRESHOLD = 0.25;
1006
+ const HIGH_JITTER_TRESHOLD = 0.28;
1007
+ function createVideoStatsAnalyzer() {
1008
+ let lastFramesReceived = 0;
1009
+ let prevDelay;
1010
+ let prevCount;
1011
+ let avgJitterDelayInInterval = 0;
1012
+ return (stats) => {
1013
+ for (const report of stats.values()) {
1014
+ if (report && report.type === "inbound-rtp" && report.kind === "video") {
1015
+ const delay = report.jitterBufferDelay;
1016
+ const count = report.jitterBufferEmittedCount;
1017
+ if (prevCount && count > prevCount) {
1018
+ const deltaDelay = delay - prevDelay;
1019
+ const deltaCount = count - prevCount;
1020
+ avgJitterDelayInInterval = deltaDelay / deltaCount;
1021
+ }
1022
+ prevDelay = delay;
1023
+ prevCount = count;
1024
+ const currFramesReceived = report.framesDecoded;
1025
+ const isReceiving = currFramesReceived - lastFramesReceived > 0;
1026
+ lastFramesReceived = currFramesReceived;
1027
+ return {
1028
+ isReceiving,
1029
+ avgJitterDelayInInterval,
1030
+ freezeCount: report.freezeCount
1031
+ };
706
1032
  }
707
- return !1;
1033
+ }
1034
+ return {
1035
+ isReceiving: false,
1036
+ avgJitterDelayInInterval
1037
+ };
708
1038
  };
709
1039
  }
710
- function Oe(e, t, a, n, s = !1, i = !1) {
711
- const r = s ? 1 : 0;
712
- let o = [], c, u = 0, d = !1, g = 0;
713
- const R = Ge();
1040
+ function pollStats(peerConnection, getIsConnected, onConnected, onVideoStateChange, onConnectivityStateChange, warmup = false, shouldWaitForGreeting = false) {
1041
+ const streamsBeforeReady = warmup ? 1 : 0;
1042
+ let allStats = [];
1043
+ let previousStats;
1044
+ let notReceivingNumIntervals = 0;
1045
+ let isStreaming = false;
1046
+ let streamsCount = 0;
1047
+ let prevLowConnState = ConnectivityState.Unknown;
1048
+ let currLowConnState = ConnectivityState.Unknown;
1049
+ let currFreezeCount = 0;
1050
+ let prevFreezeCount = 0;
1051
+ const isReceivingVideoBytes = createVideoStatsAnalyzer();
714
1052
  return setInterval(async () => {
715
- const h = await e.getStats(), y = R(h), v = Ye(h);
716
- if (y)
717
- u = 0, d || (n == null || n(D.Start), i && g >= r && !t() && a(), c = o[o.length - 1], o = [], g++, d = !0), o.push(v);
718
- else if (d && (u++, u >= Ze)) {
719
- const C = Qe(o, Y, c);
720
- n == null || n(D.Stop, C), !i && !t() && a(), d = !1;
1053
+ const stats = await peerConnection.getStats();
1054
+ const {
1055
+ isReceiving,
1056
+ avgJitterDelayInInterval,
1057
+ freezeCount
1058
+ } = isReceivingVideoBytes(stats);
1059
+ const slimStats = formatStats(stats);
1060
+ if (isReceiving) {
1061
+ notReceivingNumIntervals = 0;
1062
+ currFreezeCount = freezeCount - prevFreezeCount;
1063
+ currLowConnState = avgJitterDelayInInterval < LOW_JITTER_TRESHOLD ? ConnectivityState.Strong : avgJitterDelayInInterval > HIGH_JITTER_TRESHOLD && currFreezeCount > 1 ? ConnectivityState.Weak : prevLowConnState;
1064
+ if (currLowConnState !== prevLowConnState) {
1065
+ onConnectivityStateChange == null ? void 0 : onConnectivityStateChange(currLowConnState);
1066
+ prevLowConnState = currLowConnState;
1067
+ prevFreezeCount += currFreezeCount;
1068
+ currFreezeCount = 0;
1069
+ }
1070
+ if (!isStreaming) {
1071
+ onVideoStateChange == null ? void 0 : onVideoStateChange(StreamingState.Start);
1072
+ if (shouldWaitForGreeting && streamsCount >= streamsBeforeReady && !getIsConnected()) {
1073
+ onConnected();
1074
+ }
1075
+ previousStats = allStats[allStats.length - 1];
1076
+ allStats = [];
1077
+ streamsCount++;
1078
+ isStreaming = true;
1079
+ }
1080
+ allStats.push(slimStats);
1081
+ } else if (isStreaming) {
1082
+ notReceivingNumIntervals++;
1083
+ if (notReceivingNumIntervals >= notReceivingIntervalsThreshold) {
1084
+ const statsReport = createVideoStatsReport(allStats, interval, previousStats);
1085
+ onVideoStateChange == null ? void 0 : onVideoStateChange(StreamingState.Stop, statsReport);
1086
+ if (!shouldWaitForGreeting && !getIsConnected()) {
1087
+ onConnected();
1088
+ }
1089
+ isStreaming = false;
1090
+ }
721
1091
  }
722
- }, Y);
1092
+ }, interval);
723
1093
  }
724
- let le = !1;
725
- const L = (e, t) => le && console.log(e, t), et = (window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection).bind(window);
726
- function te(e) {
727
- switch (e) {
1094
+ let _debug = false;
1095
+ const log = (message, extra) => _debug && console.log(message, extra);
1096
+ const actualRTCPC = (window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection).bind(window);
1097
+ function mapConnectionState(state) {
1098
+ switch (state) {
728
1099
  case "connected":
729
- return S.Connected;
1100
+ return ConnectionState.Connected;
730
1101
  case "checking":
731
- return S.Connecting;
1102
+ return ConnectionState.Connecting;
732
1103
  case "failed":
733
- return S.Fail;
1104
+ return ConnectionState.Fail;
734
1105
  case "new":
735
- return S.New;
1106
+ return ConnectionState.New;
736
1107
  case "closed":
737
- return S.Closed;
1108
+ return ConnectionState.Closed;
738
1109
  case "disconnected":
739
- return S.Disconnected;
1110
+ return ConnectionState.Disconnected;
740
1111
  case "completed":
741
- return S.Completed;
1112
+ return ConnectionState.Completed;
742
1113
  default:
743
- return S.New;
1114
+ return ConnectionState.New;
744
1115
  }
745
1116
  }
746
- function re(e, t, a, n) {
747
- e === D.Start && t === D.Start ? a == null || a(D.Start) : e === D.Stop && t === D.Stop && (a == null || a(D.Stop, n));
1117
+ function handleLegacyStreamState({
1118
+ statsSignal,
1119
+ dataChannelSignal,
1120
+ onVideoStateChange,
1121
+ report
1122
+ }) {
1123
+ if (statsSignal === StreamingState.Start && dataChannelSignal === StreamingState.Start) {
1124
+ onVideoStateChange == null ? void 0 : onVideoStateChange(StreamingState.Start);
1125
+ } else if (statsSignal === StreamingState.Stop && dataChannelSignal === StreamingState.Stop) {
1126
+ onVideoStateChange == null ? void 0 : onVideoStateChange(StreamingState.Stop, report);
1127
+ }
1128
+ }
1129
+ function handleFluentStreamState({
1130
+ statsSignal,
1131
+ dataChannelSignal,
1132
+ onVideoStateChange,
1133
+ onAgentActivityStateChange,
1134
+ report
1135
+ }) {
1136
+ if (statsSignal === StreamingState.Start) {
1137
+ onVideoStateChange == null ? void 0 : onVideoStateChange(StreamingState.Start);
1138
+ } else if (statsSignal === StreamingState.Stop) {
1139
+ onVideoStateChange == null ? void 0 : onVideoStateChange(StreamingState.Stop, report);
1140
+ }
1141
+ if (dataChannelSignal === StreamingState.Start) {
1142
+ onAgentActivityStateChange == null ? void 0 : onAgentActivityStateChange(AgentActivityState.Talking);
1143
+ } else if (dataChannelSignal === StreamingState.Stop) {
1144
+ onAgentActivityStateChange == null ? void 0 : onAgentActivityStateChange(AgentActivityState.Idle);
1145
+ }
748
1146
  }
749
- async function tt(e, t, {
750
- debug: a = !1,
751
- callbacks: n,
752
- auth: s,
753
- baseURL: i = K,
754
- warmup: r
1147
+ function handleStreamState({
1148
+ statsSignal,
1149
+ dataChannelSignal,
1150
+ onVideoStateChange,
1151
+ onAgentActivityStateChange,
1152
+ streamType,
1153
+ report
755
1154
  }) {
756
- le = a;
757
- let o = !1, c = !1, u = D.Stop, d = D.Stop;
1155
+ if (streamType === StreamType.Legacy) {
1156
+ handleLegacyStreamState({
1157
+ statsSignal,
1158
+ dataChannelSignal,
1159
+ onVideoStateChange,
1160
+ report
1161
+ });
1162
+ } else if (streamType === StreamType.Fluent) {
1163
+ handleFluentStreamState({
1164
+ statsSignal,
1165
+ dataChannelSignal,
1166
+ onVideoStateChange,
1167
+ onAgentActivityStateChange,
1168
+ report
1169
+ });
1170
+ }
1171
+ }
1172
+ async function createStreamingManager(agentId, agent, {
1173
+ debug = false,
1174
+ callbacks,
1175
+ auth,
1176
+ baseURL = didApiUrl
1177
+ }) {
1178
+ _debug = debug;
1179
+ let isConnected = false;
1180
+ let isDatachannelOpen = false;
1181
+ let dataChannelSignal = StreamingState.Stop;
1182
+ let statsSignal = StreamingState.Stop;
1183
+ let connectivityState = ConnectivityState.Unknown;
758
1184
  const {
759
- startConnection: g,
760
- sendStreamRequest: R,
761
- close: h,
762
- createStream: y,
763
- addIceCandidate: v
764
- } = t.videoType === ne.Clip ? qe(s, i, e, n.onError) : Je(s, i, e, n.onError), {
765
- id: C,
766
- offer: A,
767
- ice_servers: I,
768
- session_id: l
769
- } = await y(t), m = new et({
770
- iceServers: I
771
- }), k = m.createDataChannel("JanusDataChannel");
772
- if (!l)
1185
+ startConnection,
1186
+ sendStreamRequest,
1187
+ close,
1188
+ createStream,
1189
+ addIceCandidate
1190
+ } = agent.videoType === VideoType.Clip ? createClipApi(auth, baseURL, agentId, callbacks.onError) : createTalkApi(auth, baseURL, agentId, callbacks.onError);
1191
+ const {
1192
+ id: streamIdFromServer,
1193
+ offer,
1194
+ ice_servers,
1195
+ session_id,
1196
+ fluent
1197
+ } = await createStream(agent);
1198
+ const peerConnection = new actualRTCPC({
1199
+ iceServers: ice_servers
1200
+ });
1201
+ const pcDataChannel = peerConnection.createDataChannel("JanusDataChannel");
1202
+ if (!session_id) {
773
1203
  throw new Error("Could not create session_id");
774
- const P = () => o, T = () => {
775
- var f;
776
- o = !0, c && ((f = n.onConnectionStateChange) == null || f.call(n, S.Connected));
777
- }, _ = Oe(m, P, T, (f, w) => re(d = f, u, n.onVideoStateChange, w), r, !!t.stream_greeting);
778
- m.onicecandidate = (f) => {
779
- var w;
780
- L("peerConnection.onicecandidate", f);
1204
+ }
1205
+ const streamType = fluent ? StreamType.Fluent : StreamType.Legacy;
1206
+ const warmup = agent.stream_warmup && !fluent;
1207
+ const getIsConnected = () => isConnected;
1208
+ const onConnected = () => {
1209
+ var _a;
1210
+ isConnected = true;
1211
+ if (isDatachannelOpen) {
1212
+ (_a = callbacks.onConnectionStateChange) == null ? void 0 : _a.call(callbacks, ConnectionState.Connected);
1213
+ }
1214
+ };
1215
+ const videoStatsInterval = pollStats(peerConnection, getIsConnected, onConnected, (state, report) => handleStreamState({
1216
+ statsSignal: state,
1217
+ dataChannelSignal: streamType === StreamType.Legacy ? dataChannelSignal : void 0,
1218
+ onVideoStateChange: callbacks.onVideoStateChange,
1219
+ onAgentActivityStateChange: callbacks.onAgentActivityStateChange,
1220
+ report,
1221
+ streamType
1222
+ }), (state) => {
1223
+ var _a;
1224
+ return (_a = callbacks.onConnectivityStateChange) == null ? void 0 : _a.call(callbacks, connectivityState);
1225
+ }, warmup, !!agent.stream_greeting);
1226
+ peerConnection.onicecandidate = (event) => {
1227
+ var _a;
1228
+ log("peerConnection.onicecandidate", event);
781
1229
  try {
782
- f.candidate && f.candidate.sdpMid && f.candidate.sdpMLineIndex !== null ? v(C, {
783
- candidate: f.candidate.candidate,
784
- sdpMid: f.candidate.sdpMid,
785
- sdpMLineIndex: f.candidate.sdpMLineIndex
786
- }, l) : v(C, {
787
- candidate: null
788
- }, l);
789
- } catch (p) {
790
- (w = n.onError) == null || w.call(n, p, {
791
- streamId: C
1230
+ if (event.candidate && event.candidate.sdpMid && event.candidate.sdpMLineIndex !== null) {
1231
+ addIceCandidate(streamIdFromServer, {
1232
+ candidate: event.candidate.candidate,
1233
+ sdpMid: event.candidate.sdpMid,
1234
+ sdpMLineIndex: event.candidate.sdpMLineIndex
1235
+ }, session_id);
1236
+ } else {
1237
+ addIceCandidate(streamIdFromServer, {
1238
+ candidate: null
1239
+ }, session_id);
1240
+ }
1241
+ } catch (e) {
1242
+ (_a = callbacks.onError) == null ? void 0 : _a.call(callbacks, e, {
1243
+ streamId: streamIdFromServer
792
1244
  });
793
1245
  }
794
- }, k.onopen = () => {
795
- c = !0, (!t.stream_warmup && !t.stream_greeting || o) && T();
796
- }, k.onmessage = (f) => {
797
- f.data === "stream/started" ? u = D.Start : f.data === "stream/done" && (u = D.Stop), re(d, u, n.onVideoStateChange);
798
- }, m.oniceconnectionstatechange = () => {
799
- var w;
800
- L("peerConnection.oniceconnectionstatechange => " + m.iceConnectionState);
801
- const f = te(m.iceConnectionState);
802
- f !== S.Connected && ((w = n.onConnectionStateChange) == null || w.call(n, f));
803
- }, m.ontrack = (f) => {
804
- var w;
805
- L("peerConnection.ontrack", f), (w = n.onSrcObjectReady) == null || w.call(n, f.streams[0]);
806
- }, await m.setRemoteDescription(A), L("set remote description OK");
807
- const $ = await m.createAnswer();
808
- return L("create answer OK"), await m.setLocalDescription($), L("set local description OK"), await g(C, $, l), L("start connection OK"), {
1246
+ };
1247
+ pcDataChannel.onopen = () => {
1248
+ isDatachannelOpen = true;
1249
+ if (!warmup && !agent.stream_greeting || isConnected) {
1250
+ onConnected();
1251
+ }
1252
+ };
1253
+ pcDataChannel.onmessage = (event) => {
1254
+ if (event.data in DataChannelSignalMap) {
1255
+ dataChannelSignal = DataChannelSignalMap[event.data];
1256
+ handleStreamState({
1257
+ statsSignal: streamType === StreamType.Legacy ? statsSignal : void 0,
1258
+ dataChannelSignal,
1259
+ onVideoStateChange: callbacks.onVideoStateChange,
1260
+ onAgentActivityStateChange: callbacks.onAgentActivityStateChange,
1261
+ streamType
1262
+ });
1263
+ }
1264
+ };
1265
+ peerConnection.oniceconnectionstatechange = () => {
1266
+ var _a;
1267
+ log("peerConnection.oniceconnectionstatechange => " + peerConnection.iceConnectionState);
1268
+ const newState = mapConnectionState(peerConnection.iceConnectionState);
1269
+ if (newState !== ConnectionState.Connected) {
1270
+ (_a = callbacks.onConnectionStateChange) == null ? void 0 : _a.call(callbacks, newState);
1271
+ }
1272
+ };
1273
+ peerConnection.ontrack = (event) => {
1274
+ var _a;
1275
+ log("peerConnection.ontrack", event);
1276
+ (_a = callbacks.onSrcObjectReady) == null ? void 0 : _a.call(callbacks, event.streams[0]);
1277
+ };
1278
+ await peerConnection.setRemoteDescription(offer);
1279
+ log("set remote description OK");
1280
+ const sessionClientAnswer = await peerConnection.createAnswer();
1281
+ log("create answer OK");
1282
+ await peerConnection.setLocalDescription(sessionClientAnswer);
1283
+ log("set local description OK");
1284
+ await startConnection(streamIdFromServer, sessionClientAnswer, session_id);
1285
+ log("start connection OK");
1286
+ return {
809
1287
  /**
810
1288
  * Method to send request to server to get clip or talk depend on you payload
811
1289
  * @param payload
812
1290
  */
813
- speak(f) {
814
- return R(C, l, f);
1291
+ speak(payload) {
1292
+ return sendStreamRequest(streamIdFromServer, session_id, payload);
815
1293
  },
816
1294
  /**
817
1295
  * Method to close RTC connection
818
1296
  */
819
1297
  async disconnect() {
820
- var f, w;
821
- if (C) {
822
- const p = te(m.iceConnectionState);
823
- if (m) {
824
- if (p === S.New) {
825
- (f = n.onVideoStateChange) == null || f.call(n, D.Stop), clearInterval(_);
1298
+ var _a, _b, _c;
1299
+ if (streamIdFromServer) {
1300
+ const state = mapConnectionState(peerConnection.iceConnectionState);
1301
+ if (peerConnection) {
1302
+ if (state === ConnectionState.New) {
1303
+ (_a = callbacks.onVideoStateChange) == null ? void 0 : _a.call(callbacks, StreamingState.Stop);
1304
+ clearInterval(videoStatsInterval);
826
1305
  return;
827
1306
  }
828
- m.close(), m.oniceconnectionstatechange = null, m.onnegotiationneeded = null, m.onicecandidate = null, m.ontrack = null;
1307
+ peerConnection.close();
1308
+ peerConnection.oniceconnectionstatechange = null;
1309
+ peerConnection.onnegotiationneeded = null;
1310
+ peerConnection.onicecandidate = null;
1311
+ peerConnection.ontrack = null;
829
1312
  }
830
1313
  try {
831
- p === S.Connected && await h(C, l).catch((M) => {
832
- });
833
- } catch (M) {
834
- L("Error on close stream connection", M);
1314
+ if (state === ConnectionState.Connected) {
1315
+ await close(streamIdFromServer, session_id).catch((_) => {
1316
+ });
1317
+ }
1318
+ } catch (e) {
1319
+ log("Error on close stream connection", e);
835
1320
  }
836
- (w = n.onVideoStateChange) == null || w.call(n, D.Stop), clearInterval(_);
1321
+ (_b = callbacks.onVideoStateChange) == null ? void 0 : _b.call(callbacks, StreamingState.Stop);
1322
+ (_c = callbacks.onAgentActivityStateChange) == null ? void 0 : _c.call(callbacks, AgentActivityState.Idle);
1323
+ clearInterval(videoStatsInterval);
837
1324
  }
838
1325
  },
839
1326
  /**
840
1327
  * Session identifier information, should be returned in the body of all streaming requests
841
1328
  */
842
- sessionId: l,
1329
+ sessionId: session_id,
843
1330
  /**
844
1331
  * Id of current RTC stream
845
1332
  */
846
- streamId: C
1333
+ streamId: streamIdFromServer,
1334
+ streamType
847
1335
  };
848
1336
  }
849
- function rt(e, t, a) {
850
- var s;
1337
+ function getAgentStreamArgs(agent, options, greeting) {
1338
+ var _a;
851
1339
  const {
852
- streamOptions: n
853
- } = t ?? {};
1340
+ streamOptions
1341
+ } = options ?? {};
854
1342
  return {
855
- videoType: Se(e.presenter.type),
856
- output_resolution: n == null ? void 0 : n.outputResolution,
857
- session_timeout: n == null ? void 0 : n.sessionTimeout,
858
- stream_warmup: n == null ? void 0 : n.streamWarmup,
859
- compatibility_mode: n == null ? void 0 : n.compatibilityMode,
860
- stream_greeting: Z(e.presenter) !== "clip" && ((s = t == null ? void 0 : t.streamOptions) != null && s.streamGreeting) ? a : void 0
1343
+ videoType: mapVideoType(agent.presenter.type),
1344
+ output_resolution: streamOptions == null ? void 0 : streamOptions.outputResolution,
1345
+ session_timeout: streamOptions == null ? void 0 : streamOptions.sessionTimeout,
1346
+ stream_warmup: streamOptions == null ? void 0 : streamOptions.streamWarmup,
1347
+ compatibility_mode: streamOptions == null ? void 0 : streamOptions.compatibilityMode,
1348
+ stream_greeting: getAgentType(agent.presenter) !== "clip" && ((_a = options == null ? void 0 : options.streamOptions) == null ? void 0 : _a.streamGreeting) ? greeting : void 0
861
1349
  };
862
1350
  }
863
- function nt(e, t, a, n) {
864
- N.get() > 0 && (e === D.Start ? n.linkTrack("agent-video", {
865
- event: "start",
866
- latency: N.get(!0)
867
- }, "start", [U.StreamVideoCreated]) : e === D.Stop && n.linkTrack("agent-video", {
868
- event: "stop",
869
- is_greenscreen: t.presenter.type === "clip" && t.presenter.is_greenscreen,
870
- background: t.presenter.type === "clip" && t.presenter.background,
871
- ...a
872
- }, "done", [U.StreamVideoDone]));
1351
+ function handleStateChange(state, agent, statsReport, analytics) {
1352
+ if (timestampTracker.get() > 0) {
1353
+ if (state === StreamingState.Start) {
1354
+ analytics.linkTrack("agent-video", {
1355
+ event: "start",
1356
+ latency: timestampTracker.get(true)
1357
+ }, "start", [StreamEvents.StreamVideoCreated]);
1358
+ } else if (state === StreamingState.Stop) {
1359
+ analytics.linkTrack("agent-video", {
1360
+ event: "stop",
1361
+ is_greenscreen: agent.presenter.type === "clip" && agent.presenter.is_greenscreen,
1362
+ background: agent.presenter.type === "clip" && agent.presenter.background,
1363
+ ...statsReport
1364
+ }, "done", [StreamEvents.StreamVideoDone]);
1365
+ }
1366
+ }
873
1367
  }
874
- function at(e, t, a, n) {
875
- return N.reset(), new Promise(async (s, i) => {
876
- var r;
1368
+ function connectToManager(agent, options, analytics, greeting) {
1369
+ timestampTracker.reset();
1370
+ return new Promise(async (resolve, reject) => {
877
1371
  try {
878
- const o = await tt(e.id, rt(e, t, n), {
879
- ...t,
880
- analytics: a,
881
- warmup: (r = t.streamOptions) == null ? void 0 : r.streamWarmup,
1372
+ const streamingManager = await createStreamingManager(agent.id, getAgentStreamArgs(agent, options, greeting), {
1373
+ ...options,
1374
+ analytics,
882
1375
  callbacks: {
883
- ...t.callbacks,
884
- onConnectionStateChange: (c) => {
885
- var u, d;
886
- (d = (u = t.callbacks).onConnectionStateChange) == null || d.call(u, c), c === S.Connected && s(o);
1376
+ ...options.callbacks,
1377
+ onConnectionStateChange: (state) => {
1378
+ var _a, _b;
1379
+ (_b = (_a = options.callbacks).onConnectionStateChange) == null ? void 0 : _b.call(_a, state);
1380
+ if (state === ConnectionState.Connected) {
1381
+ resolve(streamingManager);
1382
+ }
887
1383
  },
888
- onVideoStateChange: (c, u) => {
889
- var d, g;
890
- (g = (d = t.callbacks).onVideoStateChange) == null || g.call(d, c), nt(c, e, u, a);
1384
+ onVideoStateChange: (state, statsReport) => {
1385
+ var _a, _b;
1386
+ (_b = (_a = options.callbacks).onVideoStateChange) == null ? void 0 : _b.call(_a, state);
1387
+ handleStateChange(state, agent, statsReport, analytics);
891
1388
  }
892
1389
  }
893
1390
  });
894
- } catch (o) {
895
- i(o);
1391
+ } catch (error) {
1392
+ reject(error);
896
1393
  }
897
1394
  });
898
1395
  }
899
- async function it(e, t, a, n, s, i) {
900
- var u, d, g, R;
1396
+ async function initializeStreamAndChat(agent, options, agentsApi, analytics, chat, greeting) {
1397
+ var _a, _b, _c, _d;
901
1398
  const {
902
- chat: r,
903
- chatMode: o
904
- } = await de(e, a, n, t.mode, t.persistentChat, s);
905
- if (o && o !== t.mode && (t.mode = o, (d = (u = t.callbacks).onModeChange) == null || d.call(u, o), o === b.TextOnly))
906
- return (R = (g = t.callbacks).onError) == null || R.call(g, new ge(o)), {
907
- chat: r
908
- };
909
- const c = await at(e, t, n, i);
1399
+ chat: newChat,
1400
+ chatMode
1401
+ } = await createChat(agent, agentsApi, analytics, options.mode, options.persistentChat, chat);
1402
+ if (chatMode && chatMode !== options.mode) {
1403
+ options.mode = chatMode;
1404
+ (_b = (_a = options.callbacks).onModeChange) == null ? void 0 : _b.call(_a, chatMode);
1405
+ if (chatMode === ChatMode.TextOnly) {
1406
+ (_d = (_c = options.callbacks).onError) == null ? void 0 : _d.call(_c, new ChatModeDowngraded(chatMode));
1407
+ return {
1408
+ chat: newChat
1409
+ };
1410
+ }
1411
+ }
1412
+ const streamingManager = await connectToManager(agent, options, analytics, greeting);
910
1413
  return {
911
- chat: r,
912
- streamingManager: c
1414
+ chat: newChat,
1415
+ streamingManager
913
1416
  };
914
1417
  }
915
- async function ot(e, t) {
916
- var C, A, I;
917
- let a = !0;
918
- const n = t.mixpanelKey || Ie, s = t.wsURL || be, i = t.baseURL || K, r = {
1418
+ async function createAgentManager(agent, options) {
1419
+ var _a, _b, _c;
1420
+ let firstConnection = true;
1421
+ const mxKey = options.mixpanelKey || mixpanelKey;
1422
+ const wsURL = options.wsURL || didSocketApiUrl;
1423
+ const baseURL = options.baseURL || didApiUrl;
1424
+ const items = {
919
1425
  messages: [],
920
- chatMode: t.mode || b.Functional
921
- }, o = oe(t.auth, i, t.callbacks.onError), c = await o.getById(e), u = Ne(c), d = je({
922
- token: n,
923
- agent: c,
924
- isEnabled: t.enableAnalitics,
925
- distinctId: t.distinctId
926
- }), {
927
- onMessage: g,
928
- clearQueue: R
929
- } = Ue(d, r, t, c, () => {
930
- var l;
931
- return (l = r.socketManager) == null ? void 0 : l.disconnect();
1426
+ chatMode: options.mode || ChatMode.Functional
1427
+ };
1428
+ const agentsApi = createAgentsApi(options.auth, baseURL, options.callbacks.onError);
1429
+ const agentEntity = await agentsApi.getById(agent);
1430
+ const greeting = getGreetings(agentEntity);
1431
+ const analytics = initializeAnalytics({
1432
+ token: mxKey,
1433
+ agent: agentEntity,
1434
+ isEnabled: options.enableAnalitics,
1435
+ distinctId: options.distinctId
932
1436
  });
933
- r.messages = ee(u, t.initialMessages), (A = (C = t.callbacks).onNewMessage) == null || A.call(C, [...r.messages], "answer"), d.track("agent-sdk", {
1437
+ const {
1438
+ onMessage,
1439
+ clearQueue
1440
+ } = createMessageEventQueue(analytics, items, options, agentEntity, () => {
1441
+ var _a2;
1442
+ return (_a2 = items.socketManager) == null ? void 0 : _a2.disconnect();
1443
+ });
1444
+ items.messages = getInitialMessages(greeting, options.initialMessages);
1445
+ (_b = (_a = options.callbacks).onNewMessage) == null ? void 0 : _b.call(_a, [...items.messages], "answer");
1446
+ analytics.track("agent-sdk", {
934
1447
  event: "loaded",
935
- ...Ae(c)
1448
+ ...getAnalyticsInfo(agentEntity)
936
1449
  });
937
- async function h(l) {
938
- var $, f, w, p, M, E, j;
939
- (f = ($ = t.callbacks).onConnectionStateChange) == null || f.call($, S.Connecting), N.reset(), l && !a && (delete r.chat, r.messages = ee(u), (p = (w = t.callbacks).onNewMessage) == null || p.call(w, [...r.messages], "answer"));
940
- const m = t.mode === b.DirectPlayback ? Promise.resolve(void 0) : We(t.auth, s, {
941
- onMessage: g,
942
- onError: t.callbacks.onError
943
- }), k = X(() => it(c, t, o, d, r.chat, l ? u : void 0), {
1450
+ async function connect2(newChat) {
1451
+ var _a2, _b2, _c2, _d, _e, _f, _g;
1452
+ (_b2 = (_a2 = options.callbacks).onConnectionStateChange) == null ? void 0 : _b2.call(_a2, ConnectionState.Connecting);
1453
+ timestampTracker.reset();
1454
+ if (newChat && !firstConnection) {
1455
+ delete items.chat;
1456
+ items.messages = getInitialMessages(greeting);
1457
+ (_d = (_c2 = options.callbacks).onNewMessage) == null ? void 0 : _d.call(_c2, [...items.messages], "answer");
1458
+ }
1459
+ const websocketPromise = options.mode === ChatMode.DirectPlayback ? Promise.resolve(void 0) : createSocketManager(options.auth, wsURL, {
1460
+ onMessage,
1461
+ onError: options.callbacks.onError
1462
+ });
1463
+ const initPromise = retryOperation(() => {
1464
+ return initializeStreamAndChat(agentEntity, options, agentsApi, analytics, items.chat, newChat ? greeting : void 0);
1465
+ }, {
944
1466
  limit: 3,
945
- timeout: Me,
1467
+ timeout: CONNECTION_RETRY_TIMEOUT_MS,
946
1468
  timeoutErrorMessage: "Timeout initializing the stream",
947
1469
  // Retry on all errors except for connection errors and rate limit errors, these are already handled in client level.
948
- shouldRetryFn: (z) => (z == null ? void 0 : z.message) !== "Could not connect" && z.status !== 429,
1470
+ shouldRetryFn: (error) => (error == null ? void 0 : error.message) !== "Could not connect" && error.status !== 429,
949
1471
  delayMs: 1e3
950
- }).catch((z) => {
951
- var x, W;
952
- throw v(b.Maintenance), (W = (x = t.callbacks).onConnectionStateChange) == null || W.call(x, S.Fail), z;
953
- }), [P, {
954
- streamingManager: T,
955
- chat: _
956
- }] = await Promise.all([m, k]);
957
- _ && _.id !== ((M = r.chat) == null ? void 0 : M.id) && ((j = (E = t.callbacks).onNewChat) == null || j.call(E, _.id)), r.streamingManager = T, r.socketManager = P, r.chat = _, a = !1, v((_ == null ? void 0 : _.chat_mode) ?? t.mode ?? b.Functional);
1472
+ }).catch((e) => {
1473
+ var _a3, _b3;
1474
+ changeMode(ChatMode.Maintenance);
1475
+ (_b3 = (_a3 = options.callbacks).onConnectionStateChange) == null ? void 0 : _b3.call(_a3, ConnectionState.Fail);
1476
+ throw e;
1477
+ });
1478
+ const [socketManager, {
1479
+ streamingManager,
1480
+ chat
1481
+ }] = await Promise.all([websocketPromise, initPromise]);
1482
+ if (chat && chat.id !== ((_e = items.chat) == null ? void 0 : _e.id)) {
1483
+ (_g = (_f = options.callbacks).onNewChat) == null ? void 0 : _g.call(_f, chat.id);
1484
+ }
1485
+ items.streamingManager = streamingManager;
1486
+ items.socketManager = socketManager;
1487
+ items.chat = chat;
1488
+ firstConnection = false;
1489
+ changeMode((chat == null ? void 0 : chat.chat_mode) ?? options.mode ?? ChatMode.Functional);
958
1490
  }
959
- async function y() {
960
- var l, m, k, P;
961
- (l = r.socketManager) == null || l.disconnect(), await ((m = r.streamingManager) == null ? void 0 : m.disconnect()), delete r.streamingManager, delete r.socketManager, (P = (k = t.callbacks).onConnectionStateChange) == null || P.call(k, S.Disconnected);
1491
+ async function disconnect() {
1492
+ var _a2, _b2, _c2, _d;
1493
+ (_a2 = items.socketManager) == null ? void 0 : _a2.disconnect();
1494
+ await ((_b2 = items.streamingManager) == null ? void 0 : _b2.disconnect());
1495
+ delete items.streamingManager;
1496
+ delete items.socketManager;
1497
+ (_d = (_c2 = options.callbacks).onConnectionStateChange) == null ? void 0 : _d.call(_c2, ConnectionState.Disconnected);
962
1498
  }
963
- async function v(l) {
964
- var m, k;
965
- l !== r.chatMode && (d.track("agent-mode-change", {
966
- mode: l
967
- }), r.chatMode = l, r.chatMode !== b.Functional && await y(), (k = (m = t.callbacks).onModeChange) == null || k.call(m, l));
1499
+ async function changeMode(mode) {
1500
+ var _a2, _b2;
1501
+ if (mode !== items.chatMode) {
1502
+ analytics.track("agent-mode-change", {
1503
+ mode
1504
+ });
1505
+ items.chatMode = mode;
1506
+ if (items.chatMode !== ChatMode.Functional) {
1507
+ await disconnect();
1508
+ }
1509
+ (_b2 = (_a2 = options.callbacks).onModeChange) == null ? void 0 : _b2.call(_a2, mode);
1510
+ }
968
1511
  }
969
1512
  return {
970
- agent: c,
971
- starterMessages: ((I = c.knowledge) == null ? void 0 : I.starter_message) || [],
972
- getSTTToken: () => o.getSTTToken(c.id),
973
- changeMode: v,
974
- enrichAnalytics: d.enrich,
1513
+ agent: agentEntity,
1514
+ getStreamType: () => {
1515
+ var _a2;
1516
+ return ((_a2 = items.streamingManager) == null ? void 0 : _a2.streamType) || StreamType.Legacy;
1517
+ },
1518
+ starterMessages: ((_c = agentEntity.knowledge) == null ? void 0 : _c.starter_message) || [],
1519
+ getSTTToken: () => agentsApi.getSTTToken(agentEntity.id),
1520
+ changeMode,
1521
+ enrichAnalytics: analytics.enrich,
975
1522
  async connect() {
976
- var l;
977
- await h(!0), d.track("agent-chat", {
1523
+ var _a2;
1524
+ await connect2(true);
1525
+ analytics.track("agent-chat", {
978
1526
  event: "connect",
979
- chatId: (l = r.chat) == null ? void 0 : l.id,
980
- agentId: c.id,
981
- mode: r.chatMode
1527
+ chatId: (_a2 = items.chat) == null ? void 0 : _a2.id,
1528
+ agentId: agentEntity.id,
1529
+ mode: items.chatMode
982
1530
  });
983
1531
  },
984
1532
  async reconnect() {
985
- var l;
986
- await y(), await h(!1), d.track("agent-chat", {
1533
+ var _a2;
1534
+ await disconnect();
1535
+ await connect2(false);
1536
+ analytics.track("agent-chat", {
987
1537
  event: "reconnect",
988
- chatId: (l = r.chat) == null ? void 0 : l.id,
989
- agentId: c.id,
990
- mode: r.chatMode
1538
+ chatId: (_a2 = items.chat) == null ? void 0 : _a2.id,
1539
+ agentId: agentEntity.id,
1540
+ mode: items.chatMode
991
1541
  });
992
1542
  },
993
1543
  async disconnect() {
994
- var l;
995
- await y(), d.track("agent-chat", {
1544
+ var _a2;
1545
+ await disconnect();
1546
+ analytics.track("agent-chat", {
996
1547
  event: "disconnect",
997
- chatId: (l = r.chat) == null ? void 0 : l.id,
998
- agentId: c.id,
999
- mode: r.chatMode
1548
+ chatId: (_a2 = items.chat) == null ? void 0 : _a2.id,
1549
+ agentId: agentEntity.id,
1550
+ mode: items.chatMode
1000
1551
  });
1001
1552
  },
1002
- async chat(l) {
1003
- var T, _, $, f, w;
1004
- const m = () => {
1005
- if (t.mode === b.DirectPlayback)
1006
- throw new B("Direct playback is enabled, chat is disabled");
1007
- if (l.length >= 800)
1008
- throw new B("Message cannot be more than 800 characters");
1009
- if (l.length === 0)
1010
- throw new B("Message cannot be empty");
1011
- if (r.chatMode === b.Maintenance)
1012
- throw new B("Chat is in maintenance mode");
1013
- if (![b.TextOnly, b.Playground].includes(r.chatMode)) {
1014
- if (!r.streamingManager)
1015
- throw new B("Streaming manager is not initialized");
1016
- if (!r.chat)
1017
- throw new B("Chat is not initialized");
1553
+ async chat(userMessage) {
1554
+ var _a2, _b2, _c2, _d, _e;
1555
+ const validateChatRequest = () => {
1556
+ if (options.mode === ChatMode.DirectPlayback) {
1557
+ throw new ValidationError("Direct playback is enabled, chat is disabled");
1558
+ } else if (userMessage.length >= 800) {
1559
+ throw new ValidationError("Message cannot be more than 800 characters");
1560
+ } else if (userMessage.length === 0) {
1561
+ throw new ValidationError("Message cannot be empty");
1562
+ } else if (items.chatMode === ChatMode.Maintenance) {
1563
+ throw new ValidationError("Chat is in maintenance mode");
1564
+ } else if (![ChatMode.TextOnly, ChatMode.Playground].includes(items.chatMode)) {
1565
+ if (!items.streamingManager) {
1566
+ throw new ValidationError("Streaming manager is not initialized");
1567
+ }
1568
+ if (!items.chat) {
1569
+ throw new ValidationError("Chat is not initialized");
1570
+ }
1018
1571
  }
1019
- }, k = async () => {
1020
- var p, M;
1021
- if (!r.chat) {
1022
- const E = await de(c, o, d, r.chatMode, t.persistentChat);
1023
- if (!E.chat)
1024
- throw new fe(r.chatMode, !!t.persistentChat);
1025
- r.chat = E.chat, (M = (p = t.callbacks).onNewChat) == null || M.call(p, r.chat.id);
1572
+ };
1573
+ const initializeChat = async () => {
1574
+ var _a3, _b3;
1575
+ if (!items.chat) {
1576
+ const newChat = await createChat(agentEntity, agentsApi, analytics, items.chatMode, options.persistentChat);
1577
+ if (!newChat.chat) {
1578
+ throw new ChatCreationFailed(items.chatMode, !!options.persistentChat);
1579
+ }
1580
+ items.chat = newChat.chat;
1581
+ (_b3 = (_a3 = options.callbacks).onNewChat) == null ? void 0 : _b3.call(_a3, items.chat.id);
1026
1582
  }
1027
- return r.chat.id;
1028
- }, P = async (p, M) => X(() => {
1029
- var E, j;
1030
- return o.chat(c.id, M, {
1031
- chatMode: r.chatMode,
1032
- streamId: (E = r.streamingManager) == null ? void 0 : E.streamId,
1033
- sessionId: (j = r.streamingManager) == null ? void 0 : j.sessionId,
1034
- messages: p.map(({
1035
- matches: z,
1036
- ...x
1037
- }) => x)
1583
+ return items.chat.id;
1584
+ };
1585
+ const sendChatRequest = async (messages, chatId) => {
1586
+ return retryOperation(() => {
1587
+ var _a3, _b3;
1588
+ return agentsApi.chat(agentEntity.id, chatId, {
1589
+ chatMode: items.chatMode,
1590
+ streamId: (_a3 = items.streamingManager) == null ? void 0 : _a3.streamId,
1591
+ sessionId: (_b3 = items.streamingManager) == null ? void 0 : _b3.sessionId,
1592
+ messages: messages.map(({
1593
+ matches,
1594
+ ...message
1595
+ }) => message)
1596
+ }, {
1597
+ ...getRequestHeaders(items.chatMode),
1598
+ skipErrorHandler: true
1599
+ });
1038
1600
  }, {
1039
- ...ce(r.chatMode),
1040
- skipErrorHandler: !0
1601
+ limit: 2,
1602
+ shouldRetryFn: (error) => {
1603
+ var _a3, _b3, _c3, _d2;
1604
+ const isInvalidSessionId = (_a3 = error == null ? void 0 : error.message) == null ? void 0 : _a3.includes("missing or invalid session_id");
1605
+ const isStreamError = (_b3 = error == null ? void 0 : error.message) == null ? void 0 : _b3.includes("Stream Error");
1606
+ if (!isStreamError && !isInvalidSessionId) {
1607
+ (_d2 = (_c3 = options.callbacks).onError) == null ? void 0 : _d2.call(_c3, error);
1608
+ return false;
1609
+ }
1610
+ return true;
1611
+ },
1612
+ onRetry: async () => {
1613
+ await disconnect();
1614
+ await connect2(false);
1615
+ }
1041
1616
  });
1042
- }, {
1043
- limit: 2,
1044
- shouldRetryFn: (E) => {
1045
- var x, W, G, O;
1046
- const j = (x = E == null ? void 0 : E.message) == null ? void 0 : x.includes("missing or invalid session_id");
1047
- return !((W = E == null ? void 0 : E.message) == null ? void 0 : W.includes("Stream Error")) && !j ? ((O = (G = t.callbacks).onError) == null || O.call(G, E), !1) : !0;
1048
- },
1049
- onRetry: async () => {
1050
- await y(), await h(!1);
1051
- }
1052
- });
1617
+ };
1053
1618
  try {
1054
- R(), m(), r.messages.push({
1055
- id: q(),
1619
+ clearQueue();
1620
+ validateChatRequest();
1621
+ items.messages.push({
1622
+ id: getRandom(),
1056
1623
  role: "user",
1057
- content: l,
1058
- created_at: new Date(N.update()).toISOString()
1059
- }), (_ = (T = t.callbacks).onNewMessage) == null || _.call(T, [...r.messages], "user");
1060
- const p = await k(), M = await P([...r.messages], p);
1061
- return r.messages.push({
1062
- id: q(),
1624
+ content: userMessage,
1625
+ created_at: new Date(timestampTracker.update()).toISOString()
1626
+ });
1627
+ (_b2 = (_a2 = options.callbacks).onNewMessage) == null ? void 0 : _b2.call(_a2, [...items.messages], "user");
1628
+ const chatId = await initializeChat();
1629
+ const response = await sendChatRequest([...items.messages], chatId);
1630
+ items.messages.push({
1631
+ id: getRandom(),
1063
1632
  role: "assistant",
1064
- content: M.result || "",
1633
+ content: response.result || "",
1065
1634
  created_at: (/* @__PURE__ */ new Date()).toISOString(),
1066
- context: M.context,
1067
- matches: M.matches
1068
- }), d.track("agent-message-send", {
1635
+ context: response.context,
1636
+ matches: response.matches
1637
+ });
1638
+ analytics.track("agent-message-send", {
1069
1639
  event: "success",
1070
- mode: r.chatMode,
1071
- messages: r.messages.length + 1
1072
- }), M.result && ((f = ($ = t.callbacks).onNewMessage) == null || f.call($, [...r.messages], "answer"), d.track("agent-message-received", {
1073
- latency: N.get(!0),
1074
- mode: r.chatMode,
1075
- messages: r.messages.length
1076
- })), M;
1077
- } catch (p) {
1078
- throw ((w = r.messages[r.messages.length - 1]) == null ? void 0 : w.role) === "assistant" && r.messages.pop(), d.track("agent-message-send", {
1640
+ mode: items.chatMode,
1641
+ messages: items.messages.length + 1
1642
+ });
1643
+ if (response.result) {
1644
+ (_d = (_c2 = options.callbacks).onNewMessage) == null ? void 0 : _d.call(_c2, [...items.messages], "answer");
1645
+ analytics.track("agent-message-received", {
1646
+ latency: timestampTracker.get(true),
1647
+ mode: items.chatMode,
1648
+ messages: items.messages.length
1649
+ });
1650
+ }
1651
+ return response;
1652
+ } catch (e) {
1653
+ if (((_e = items.messages[items.messages.length - 1]) == null ? void 0 : _e.role) === "assistant") {
1654
+ items.messages.pop();
1655
+ }
1656
+ analytics.track("agent-message-send", {
1079
1657
  event: "error",
1080
- mode: r.chatMode,
1081
- messages: r.messages.length
1082
- }), p;
1658
+ mode: items.chatMode,
1659
+ messages: items.messages.length
1660
+ });
1661
+ throw e;
1083
1662
  }
1084
1663
  },
1085
- rate(l, m, k) {
1086
- var _, $, f, w;
1087
- const P = r.messages.find((p) => p.id === l);
1088
- if (r.chat) {
1089
- if (!P)
1090
- throw new Error("Message not found");
1091
- } else
1664
+ rate(messageId, score, rateId) {
1665
+ var _a2, _b2, _c2, _d;
1666
+ const message = items.messages.find((message2) => message2.id === messageId);
1667
+ if (!items.chat) {
1092
1668
  throw new Error("Chat is not initialized");
1093
- const T = ((_ = P.matches) == null ? void 0 : _.map((p) => [p.document_id, p.id])) ?? [];
1094
- return d.track("agent-rate", {
1095
- event: k ? "update" : "create",
1096
- thumb: m === 1 ? "up" : "down",
1097
- knowledge_id: (($ = c.knowledge) == null ? void 0 : $.id) ?? "",
1098
- mode: r.chatMode,
1099
- matches: T,
1100
- score: m
1101
- }), k ? o.updateRating(c.id, r.chat.id, k, {
1102
- knowledge_id: ((f = c.knowledge) == null ? void 0 : f.id) ?? "",
1103
- message_id: l,
1104
- matches: T,
1105
- score: m
1106
- }) : o.createRating(c.id, r.chat.id, {
1107
- knowledge_id: ((w = c.knowledge) == null ? void 0 : w.id) ?? "",
1108
- message_id: l,
1109
- matches: T,
1110
- score: m
1669
+ } else if (!message) {
1670
+ throw new Error("Message not found");
1671
+ }
1672
+ const matches = ((_a2 = message.matches) == null ? void 0 : _a2.map((match) => [match.document_id, match.id])) ?? [];
1673
+ analytics.track("agent-rate", {
1674
+ event: rateId ? "update" : "create",
1675
+ thumb: score === 1 ? "up" : "down",
1676
+ knowledge_id: ((_b2 = agentEntity.knowledge) == null ? void 0 : _b2.id) ?? "",
1677
+ mode: items.chatMode,
1678
+ matches,
1679
+ score
1680
+ });
1681
+ if (rateId) {
1682
+ return agentsApi.updateRating(agentEntity.id, items.chat.id, rateId, {
1683
+ knowledge_id: ((_c2 = agentEntity.knowledge) == null ? void 0 : _c2.id) ?? "",
1684
+ message_id: messageId,
1685
+ matches,
1686
+ score
1687
+ });
1688
+ }
1689
+ return agentsApi.createRating(agentEntity.id, items.chat.id, {
1690
+ knowledge_id: ((_d = agentEntity.knowledge) == null ? void 0 : _d.id) ?? "",
1691
+ message_id: messageId,
1692
+ matches,
1693
+ score
1111
1694
  });
1112
1695
  },
1113
- deleteRate(l) {
1114
- var m;
1115
- if (!r.chat)
1696
+ deleteRate(id) {
1697
+ var _a2;
1698
+ if (!items.chat) {
1116
1699
  throw new Error("Chat is not initialized");
1117
- return d.track("agent-rate-delete", {
1700
+ }
1701
+ analytics.track("agent-rate-delete", {
1118
1702
  type: "text",
1119
- chat_id: (m = r.chat) == null ? void 0 : m.id,
1120
- id: l,
1121
- mode: r.chatMode
1122
- }), o.deleteRating(c.id, r.chat.id, l);
1703
+ chat_id: (_a2 = items.chat) == null ? void 0 : _a2.id,
1704
+ id,
1705
+ mode: items.chatMode
1706
+ });
1707
+ return agentsApi.deleteRating(agentEntity.id, items.chat.id, id);
1123
1708
  },
1124
- speak(l) {
1125
- if (!r.streamingManager)
1709
+ speak(payload) {
1710
+ var _a2;
1711
+ if (!items.streamingManager) {
1126
1712
  throw new Error("Please connect to the agent first");
1127
- function m() {
1128
- if (typeof l == "string") {
1129
- if (!c.presenter.voice)
1713
+ }
1714
+ function getScript() {
1715
+ if (typeof payload === "string") {
1716
+ if (!agentEntity.presenter.voice) {
1130
1717
  throw new Error("Presenter voice is not initialized");
1718
+ }
1131
1719
  return {
1132
1720
  type: "text",
1133
- provider: c.presenter.voice,
1134
- input: l,
1135
- ssml: !1
1721
+ provider: agentEntity.presenter.voice,
1722
+ input: payload,
1723
+ ssml: false
1136
1724
  };
1137
1725
  }
1138
- if (l.type === "text" && !l.provider) {
1139
- if (!c.presenter.voice)
1726
+ if (payload.type === "text" && !payload.provider) {
1727
+ if (!agentEntity.presenter.voice) {
1140
1728
  throw new Error("Presenter voice is not initialized");
1729
+ }
1141
1730
  return {
1142
1731
  type: "text",
1143
- provider: c.presenter.voice,
1144
- input: l.input,
1145
- ssml: l.ssml
1732
+ provider: agentEntity.presenter.voice,
1733
+ input: payload.input,
1734
+ ssml: payload.ssml
1146
1735
  };
1147
1736
  }
1148
- return l;
1737
+ return payload;
1149
1738
  }
1150
- const k = m();
1151
- return d.track("agent-speak", k), N.update(), r.streamingManager.speak({
1152
- script: k
1739
+ const script = getScript();
1740
+ analytics.track("agent-speak", script);
1741
+ timestampTracker.update();
1742
+ return items.streamingManager.speak({
1743
+ script,
1744
+ metadata: {
1745
+ chat_id: (_a2 = items.chat) == null ? void 0 : _a2.id,
1746
+ agent_id: agentEntity.id
1747
+ }
1153
1748
  });
1154
1749
  }
1155
1750
  };
1156
1751
  }
1157
- function ct(e, t, a) {
1752
+ function getAgent(agentId, auth, baseURL) {
1158
1753
  const {
1159
- getById: n
1160
- } = oe(t, a || K);
1161
- return n(e);
1754
+ getById
1755
+ } = createAgentsApi(auth, baseURL || didApiUrl);
1756
+ return getById(agentId);
1162
1757
  }
1163
1758
  export {
1164
- ye as AgentStatus,
1165
- fe as ChatCreationFailed,
1166
- b as ChatMode,
1167
- ge as ChatModeDowngraded,
1168
- F as ChatProgress,
1169
- S as ConnectionState,
1170
- Ce as DocumentType,
1171
- Re as KnowledgeType,
1172
- pe as PlanGroup,
1173
- De as Providers,
1174
- ve as RateState,
1175
- U as StreamEvents,
1176
- D as StreamingState,
1177
- ke as Subject,
1178
- we as UserPlan,
1179
- B as ValidationError,
1180
- ne as VideoType,
1181
- _e as VoiceAccess,
1182
- he as WsError,
1183
- ot as createAgentManager,
1184
- ct as getAgent,
1185
- Se as mapVideoType
1759
+ AgentActivityState,
1760
+ AgentStatus,
1761
+ ChatCreationFailed,
1762
+ ChatMode,
1763
+ ChatModeDowngraded,
1764
+ ChatProgress,
1765
+ ConnectionState,
1766
+ ConnectivityState,
1767
+ DataChannelSignalMap,
1768
+ DocumentType,
1769
+ KnowledgeType,
1770
+ PlanGroup,
1771
+ Providers,
1772
+ RateState,
1773
+ StreamEvents,
1774
+ StreamType,
1775
+ StreamingState,
1776
+ Subject,
1777
+ UserPlan,
1778
+ ValidationError,
1779
+ VideoType,
1780
+ VoiceAccess,
1781
+ WsError,
1782
+ createAgentManager,
1783
+ getAgent,
1784
+ mapVideoType
1186
1785
  };