@d-id/client-sdk
Version:
d-id client sdk
1,381 lines • 59.1 kB
JavaScript
var We = Object.defineProperty;
var Je = (e, t, r) => t in e ? We(e, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[t] = r;
var Z = (e, t, r) => Je(e, typeof t != "symbol" ? t + "" : t, r);
class ce extends Error {
constructor({ kind: r, description: a, error: c }) {
super(JSON.stringify({ kind: r, description: a }));
Z(this, "kind");
Z(this, "description");
Z(this, "error");
this.kind = r, this.description = a, this.error = c;
}
}
class Oe extends ce {
constructor(t, r) {
super({
kind: "ChatCreationFailed",
description: `Failed to create ${r ? "persistent" : ""} chat, mode: ${t}`
});
}
}
class He extends ce {
constructor(t) {
super({ kind: "ChatModeDowngraded", description: `Chat mode downgraded to ${t}` });
}
}
class G extends ce {
constructor(r, a) {
super({ kind: "ValidationError", description: r });
Z(this, "key");
this.key = a;
}
}
class qe extends ce {
constructor(t) {
super({ kind: "WSError", description: t });
}
}
var Xe = /* @__PURE__ */ ((e) => (e.TRIAL = "trial", e.BASIC = "basic", e.ENTERPRISE = "enterprise", e.LITE = "lite", e.ADVANCED = "advanced", e))(Xe || {}), Ye = /* @__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))(Ye || {}), Ge = /* @__PURE__ */ ((e) => (e.Created = "created", e.Started = "started", e.Done = "done", e.Error = "error", e.Rejected = "rejected", e.Ready = "ready", e))(Ge || {}), Qe = /* @__PURE__ */ ((e) => (e.Unrated = "Unrated", e.Positive = "Positive", e.Negative = "Negative", e))(Qe || {}), x = /* @__PURE__ */ ((e) => (e.Functional = "Functional", e.TextOnly = "TextOnly", e.Maintenance = "Maintenance", e.Playground = "Playground", e.DirectPlayback = "DirectPlayback", e.Off = "Off", e))(x || {}), U = /* @__PURE__ */ ((e) => (e.Embed = "embed", e.Query = "query", e.Partial = "partial", e.Answer = "answer", e.Transcribe = "transcribe", e.Complete = "done", e))(U || {}), Ze = /* @__PURE__ */ ((e) => (e.KnowledgeProcessing = "knowledge/processing", e.KnowledgeIndexing = "knowledge/indexing", e.KnowledgeFailed = "knowledge/error", e.KnowledgeDone = "knowledge/done", e))(Ze || {}), et = /* @__PURE__ */ ((e) => (e.Knowledge = "knowledge", e.Document = "document", e.Record = "record", e))(et || {}), tt = /* @__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))(tt || {}), Pe = /* @__PURE__ */ ((e) => (e.Clip = "clip", e.Talk = "talk", e.Expressive = "expressive", e))(Pe || {});
const sr = (e) => {
switch (e) {
case "clip":
return "clip";
case "talk":
return "talk";
case "expressive":
return "expressive";
default:
throw new Error(`Unknown video type: ${e}`);
}
};
var S = /* @__PURE__ */ ((e) => (e.Start = "START", e.Stop = "STOP", e))(S || {}), te = /* @__PURE__ */ ((e) => (e.Strong = "STRONG", e.Weak = "WEAK", e.Unknown = "UNKNOWN", e))(te || {}), ne = /* @__PURE__ */ ((e) => (e.Idle = "IDLE", e.Loading = "LOADING", e.Talking = "TALKING", e.ToolActive = "TOOL_ACTIVE", e))(ne || {}), P = /* @__PURE__ */ ((e) => (e.ChatAnswer = "chat/answer", e.ChatPartial = "chat/partial", e.ChatAudioTranscribed = "chat/audio-transcribed", e.StreamDone = "stream/done", e.StreamStarted = "stream/started", e.StreamFailed = "stream/error", e.StreamReady = "stream/ready", e.StreamCreated = "stream/created", e.StreamInterrupt = "stream/interrupt", e.StreamVideoCreated = "stream-video/started", e.StreamVideoDone = "stream-video/done", e.StreamVideoError = "stream-video/error", e.StreamVideoRejected = "stream-video/rejected", e.ToolCallStarted = "tool-call/started", e.ToolCallDone = "tool-call/done", e.ToolCallError = "tool-call/error", e))(P || {}), L = /* @__PURE__ */ ((e) => (e.New = "new", e.Fail = "fail", e.Connected = "connected", e.Connecting = "connecting", e.Closed = "closed", e.Completed = "completed", e.Disconnecting = "disconnecting", e.Disconnected = "disconnected", e))(L || {}), W = /* @__PURE__ */ ((e) => (e.Legacy = "legacy", e.Fluent = "fluent", e))(W || {}), he = /* @__PURE__ */ ((e) => (e.Livekit = "livekit", e))(he || {}), rt = /* @__PURE__ */ ((e) => (e.Amazon = "amazon", e.AzureOpenAi = "azure-openai", e.Microsoft = "microsoft", e.Afflorithmics = "afflorithmics", e.Elevenlabs = "elevenlabs", e))(rt || {}), nt = /* @__PURE__ */ ((e) => (e.Public = "public", e.Premium = "premium", e.Private = "private", e))(nt || {});
const at = 45 * 1e3, it = "X-Playground-Chat", de = "https://api.d-id.com", st = "wss://notifications.d-id.com", ot = "79f81a83a67430be2bc0fd61042b8faa", or = (...e) => {
}, je = (e) => new Promise((t) => setTimeout(t, e)), Q = (e = 16) => {
const t = new Uint8Array(e);
return window.crypto.getRandomValues(t), Array.from(t, (r) => r.toString(16).padStart(2, "0")).join("").slice(0, 13);
}, Be = (e) => e.type === "clip" && e.presenter_id.startsWith("v2_") ? "clip_v2" : e.type, ct = (e) => {
switch (e.type) {
case "expressive":
return "v4";
case "clip":
return "v3-pro";
case "talk":
return "v2";
}
}, dt = (e) => e.type === "talk" ? e.source_url : e.presenter_id, pe = (e) => e === Pe.Expressive, lt = (e) => [x.TextOnly, x.Playground, x.Maintenance].includes(e), $e = (e) => e && [x.DirectPlayback, x.Off].includes(e), Se = /\[!\[([^\[\]]*)\]\(([^)\s]+)\)\]\(([^)\s]+)\)/g, ke = /!\[([^\[\]]*)\]\(([^)\s]+)\)/g, ut = [".mp4", ".webm", ".mkv", ".mov", ".m4v", ".ogv"];
function mt(e) {
const t = e.split("?")[0].split("#")[0].toLowerCase();
return ut.some((r) => t.endsWith(r));
}
const Re = new RegExp("(?<!!)\\[([^\\[\\]]+)\\]\\(([^)\\s]+)\\)", "g"), De = /<a\s+href="([^"]*)"[^>]*?>([^<]*)<\/a>/gi;
function ft(e) {
if (e.length === 0)
return [];
const t = [];
let r;
for (Se.lastIndex = 0; (r = Se.exec(e)) !== null; )
t.push({
index: r.index,
length: r[0].length,
part: { type: "video", src: r[3], alt: r[1], thumbnail: r[2] }
});
for (ke.lastIndex = 0; (r = ke.exec(e)) !== null; )
if (!t.some((o) => r.index >= o.index && r.index < o.index + o.length)) {
const o = r[2], n = r[1];
let i;
mt(o) ? i = { type: "video", src: o, alt: n } : (i = { type: "image", src: o, alt: n }, o.toLowerCase().endsWith(".gif") && (i.mimeType = "image/gif")), t.push({ index: r.index, length: r[0].length, part: i });
}
for (Re.lastIndex = 0; (r = Re.exec(e)) !== null; )
t.some((o) => r.index >= o.index && r.index < o.index + o.length) || t.push({
index: r.index,
length: r[0].length,
part: { type: "link", href: r[2], label: r[1] }
});
for (De.lastIndex = 0; (r = De.exec(e)) !== null; )
t.some((o) => r.index >= o.index && r.index < o.index + o.length) || t.push({
index: r.index,
length: r[0].length,
part: { type: "link", href: r[1], label: r[2] }
});
if (t.length === 0)
return [{ type: "text", text: e }];
t.sort((s, o) => s.index - o.index);
const a = [];
let c = 0;
for (const s of t)
s.index > c && a.push({ type: "text", text: e.slice(c, s.index) }), a.push(s.part), c = s.index + s.length;
return c < e.length && a.push({ type: "text", text: e.slice(c) }), a;
}
let Ie = "", le = [];
function re(e) {
return e === Ie || (Ie = e, le = ft(e)), le;
}
function gt(e, t) {
let r;
return {
promise: new Promise((c, s) => {
r = setTimeout(() => s(new Error(t)), e);
}),
clear: () => clearTimeout(r)
};
}
async function ue(e, t) {
const r = {
limit: (t == null ? void 0 : t.limit) ?? 3,
delayMs: (t == null ? void 0 : t.delayMs) ?? 0,
timeout: (t == null ? void 0 : t.timeout) ?? 3e4,
timeoutErrorMessage: (t == null ? void 0 : t.timeoutErrorMessage) || "Timeout error",
shouldRetryFn: (t == null ? void 0 : t.shouldRetryFn) ?? (() => !0),
onRetry: (t == null ? void 0 : t.onRetry) ?? (() => {
})
};
let a;
for (let c = 1; c <= r.limit; c++)
try {
if (!r.timeout)
return await e();
const { promise: s, clear: o } = gt(r.timeout, r.timeoutErrorMessage), n = e().finally(o);
return await Promise.race([n, s]);
} catch (s) {
if (a = s, !r.shouldRetryFn(s) || c >= r.limit)
throw s;
await je(r.delayMs), r.onRetry(s);
}
throw a;
}
function me(e) {
if (e !== void 0)
return window.localStorage.setItem("did_external_key_id", e), e;
let t = window.localStorage.getItem("did_external_key_id");
if (!t) {
let r = Q();
window.localStorage.setItem("did_external_key_id", r), t = r;
}
return t;
}
let ht = Q();
function ze(e, t) {
if (e.type === "bearer")
return `Bearer ${e.token}`;
if (e.type === "basic")
return `Basic ${"token" in e ? e.token : btoa(`${e.username}:${e.password}`)}`;
if (e.type === "key")
return `Client-Key ${e.clientKey}.${me(t)}_${ht}`;
throw new Error(`Unknown auth type: ${e}`);
}
const pt = (e) => ue(e, {
limit: 3,
delayMs: 1e3,
timeout: 0,
shouldRetryFn: (t) => t.status === 429
});
function Fe(e, t = de, r, a) {
const c = async (s, o) => {
const { skipErrorHandler: n, ...i } = o || {};
let d;
try {
d = await pt(
() => fetch(t + (s != null && s.startsWith("/") ? s : `/${s}`), {
...i,
headers: {
...i.headers,
Authorization: ze(e, a),
"Content-Type": "application/json"
}
})
);
} catch (m) {
throw !((m == null ? void 0 : m.name) === "AbortError") && r && !n && r(m, { url: s, options: i }), m;
}
if (!d.ok) {
let m = await d.text().catch(() => `Failed to fetch with status ${d.status}`);
const l = new Error(m);
throw r && !n && r(l, { url: s, options: i, headers: d.headers }), l;
}
return d.json();
};
return {
get(s, o) {
return c(s, { ...o, method: "GET" });
},
post(s, o, n) {
return c(s, { ...n, body: JSON.stringify(o), method: "POST" });
},
delete(s, o, n) {
return c(s, { ...n, body: JSON.stringify(o), method: "DELETE" });
},
patch(s, o, n) {
return c(s, { ...n, body: JSON.stringify(o), method: "PATCH" });
}
};
}
function wt(e, t = de, r, a) {
const c = Fe(e, `${t}/agents`, r, a);
return {
create(s, o) {
return c.post("/", s, o);
},
getAgents(s, o) {
return c.get(`/${s ? `?tag=${s}` : ""}`, o).then((n) => n ?? []);
},
getById(s, o) {
return c.get(`/${s}`, o);
},
delete(s, o) {
return c.delete(`/${s}`, void 0, o);
},
update(s, o, n) {
return c.patch(`/${s}`, o, n);
},
newChat(s, o, n) {
return c.post(`/${s}/chat`, o, n);
},
chat(s, o, n, i) {
return c.post(`/${s}/chat/${o}`, n, i);
},
createRating(s, o, n, i) {
return c.post(`/${s}/chat/${o}/ratings`, n, i);
},
updateRating(s, o, n, i, d) {
return c.patch(`/${s}/chat/${o}/ratings/${n}`, i, d);
},
deleteRating(s, o, n, i) {
return c.delete(`/${s}/chat/${o}/ratings/${n}`, i);
},
getSTTToken(s, o) {
return c.get(`/${s}/stt-token`, o);
}
};
}
function vt(e) {
var c, s, o, n;
const t = () => /Mobi|Android/i.test(navigator.userAgent) ? "Mobile" : "Desktop", r = () => {
const i = navigator.platform;
return i.toLowerCase().includes("win") ? "Windows" : i.toLowerCase().includes("mac") ? "Mac OS X" : i.toLowerCase().includes("linux") ? "Linux" : "Unknown";
}, a = e.presenter;
return {
$os: `${r()}`,
isMobile: `${t() == "Mobile"}`,
browser: navigator.userAgent,
origin: window.location.origin,
agentType: Be(a),
agentVoice: {
voiceId: (s = (c = e.presenter) == null ? void 0 : c.voice) == null ? void 0 : s.voice_id,
provider: (n = (o = e.presenter) == null ? void 0 : o.voice) == null ? void 0 : n.type
}
};
}
function yt(e) {
var r, a, c, s, o, n;
const t = (r = e.llm) == null ? void 0 : r.prompt_customization;
return {
agentType: Be(e.presenter),
presenterType: ct(e.presenter),
presenter: dt(e.presenter),
owner_id: e.owner_id ?? "",
promptVersion: (a = e.llm) == null ? void 0 : a.prompt_version,
behavior: {
role: t == null ? void 0 : t.role,
personality: t == null ? void 0 : t.personality,
instructions: (c = e.llm) == null ? void 0 : c.instructions
},
temperature: (s = e.llm) == null ? void 0 : s.temperature,
knowledgeSource: t == null ? void 0 : t.knowledge_source,
starterQuestionsCount: (n = (o = e.knowledge) == null ? void 0 : o.starter_message) == null ? void 0 : n.length,
topicsToAvoid: t == null ? void 0 : t.topics_to_avoid,
maxResponseLength: t == null ? void 0 : t.max_response_length,
agentId: e.id,
access: e.access,
agentName: e.preview_name,
...e.access === "public" ? { from: "agent-template" } : {}
};
}
const Ct = (e) => e.reduce((t, r) => t + r, 0), Me = (e) => Ct(e) / e.length;
function St(e, t, r) {
var i, d, m;
const { event: a, ...c } = e, { template: s } = (t == null ? void 0 : t.llm) || {}, { language: o } = ((i = t == null ? void 0 : t.presenter) == null ? void 0 : i.voice) || {};
return {
...c,
llm: { ...c.llm, template: s },
script: { ...c.script, provider: { ...(d = c == null ? void 0 : c.script) == null ? void 0 : d.provider, language: o } },
stitch: (t == null ? void 0 : t.presenter.type) === "talk" ? (m = t == null ? void 0 : t.presenter) == null ? void 0 : m.stitch : void 0,
...r
};
}
function Ee(e) {
"requestIdleCallback" in window ? requestIdleCallback(e, { timeout: 2e3 }) : setTimeout(e, 0);
}
const kt = "https://api-js.mixpanel.com/track/?verbose=1&ip=1";
function Rt(e) {
const t = window != null && window.hasOwnProperty("DID_AGENTS_API") ? "agents-ui" : "agents-sdk", r = {};
return {
token: e.token || "testKey",
distinct_id: me(e.externalId),
agentId: e.agentId,
additionalProperties: {
id: me(e.externalId),
...e.mixpanelAdditionalProperties || {}
},
isEnabled: e.isEnabled ?? !0,
getRandom: Q,
enrich(a) {
this.additionalProperties = { ...this.additionalProperties, ...a };
},
async track(a, c, s) {
if (!this.isEnabled)
return Promise.resolve();
const { audioPath: o, ...n } = c || {}, i = s || Date.now(), d = {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: new URLSearchParams({
data: JSON.stringify([
{
event: a,
properties: {
...this.additionalProperties,
...n,
agentId: this.agentId,
source: t,
token: this.token,
time: i,
$insert_id: this.getRandom(),
origin: window.location.href,
"Screen Height": window.screen.height || window.innerWidth,
"Screen Width": window.screen.width || window.innerHeight,
"User Agent": navigator.userAgent
}
}
])
})
};
return fetch(kt, d).catch((m) => console.error("Analytics tracking error:", m)), Promise.resolve();
},
linkTrack(a, c, s, o) {
r[a] || (r[a] = { events: {}, resolvedDependencies: [] }), o.includes(s) || o.push(s);
const n = r[a];
if (n.events[s] = { props: c }, n.resolvedDependencies.push(s), o.every(
(d) => n.resolvedDependencies.includes(d)
)) {
const d = o.reduce((m, l) => n.events[l] ? { ...m, ...n.events[l].props } : m, {});
this.track(a, d), n.resolvedDependencies = n.resolvedDependencies.filter(
(m) => !o.includes(m)
), o.forEach((m) => {
delete n.events[m];
});
}
}
};
}
function we() {
let e = 0;
return {
reset: () => e = 0,
update: () => e = Date.now(),
get: (t = !1) => t ? Date.now() - e : e
};
}
const H = we(), fe = we(), Te = we();
function Ne(e) {
return e === x.Playground ? { headers: { [it]: "true" } } : {};
}
async function Ve(e, t, r, a, c = !1, s) {
try {
return !s && !$e(a) && (s = await t.newChat(e.id, { persist: c }, Ne(a)), r.track("agent-chat", {
event: "created",
chatId: s.id,
mode: a
})), { chat: s, chatMode: (s == null ? void 0 : s.chat_mode) ?? a };
} catch (o) {
throw Dt(o) === "InsufficientCreditsError" ? new Error("InsufficientCreditsError") : new Error("Cannot create new chat");
}
}
const Dt = (e) => {
try {
const t = JSON.parse(e.message);
return t == null ? void 0 : t.kind;
} catch {
return "UnknownError";
}
};
function It(e) {
return e && e.length > 0 ? e : [];
}
function Mt(e) {
return new Promise((t, r) => {
const { callbacks: a, host: c, auth: s, externalId: o } = e, { onMessage: n = null, onOpen: i = null, onClose: d = null, onError: m = null } = a || {}, l = new WebSocket(`${c}?authorization=${encodeURIComponent(ze(s, o))}`);
l.onmessage = n, l.onclose = d, l.onerror = (w) => {
console.error(w), m == null || m("Websocket failed to connect", w), r(w);
}, l.onopen = (w) => {
i == null || i(w), t(l);
};
});
}
async function Et(e) {
const { retries: t = 1 } = e;
let r = null;
for (let a = 0; (r == null ? void 0 : r.readyState) !== WebSocket.OPEN; a++)
try {
r = await Mt(e);
} catch (c) {
if (a === t)
throw c;
await je(a * 500);
}
return r;
}
async function Tt(e, t, r, a) {
const c = r != null && r.onMessage ? [r.onMessage] : [], s = await Et({
auth: e,
host: t,
externalId: a,
callbacks: {
onError: (o) => {
var n;
return (n = r.onError) == null ? void 0 : n.call(r, new qe(o));
},
onMessage(o) {
const n = JSON.parse(o.data);
c.forEach((i) => i(n.event, n));
}
}
});
return {
socket: s,
disconnect: () => s.close(),
subscribeToEvents: (o) => c.push(o)
};
}
function _t(e) {
if (e.answer !== void 0)
return e.answer;
let t = 0, r = "";
for (; t in e; )
r += e[t++];
return r;
}
function bt(e, t, r) {
if (!e.content)
return;
const a = t.messages[t.messages.length - 1];
(a == null ? void 0 : a.role) === "assistant" && !a.interrupted && (a.interrupted = !0);
const c = {
id: e.id || `user-${Date.now()}`,
role: e.role,
content: e.content,
parts: re(e.content),
created_at: e.created_at || (/* @__PURE__ */ new Date()).toISOString(),
transcribed: !0
};
t.messages.push(c), r == null || r([...t.messages], "user");
}
function At(e, t, r, a, c, s) {
if (e === U.Transcribe && t.content) {
bt(t, a, c);
return;
}
if (!(e === U.Partial || e === U.Answer))
return;
const o = a.messages[a.messages.length - 1], n = t.id && (o == null ? void 0 : o.role) === "assistant" && o.id !== t.id;
let i;
if ((o == null ? void 0 : o.role) === "assistant" && !n)
i = o;
else if (!o || o.transcribed && o.role === "user" || n)
n && s(), i = {
id: t.id || `assistant-${Date.now()}`,
role: t.role || "assistant",
content: t.content || "",
parts: [],
created_at: t.created_at || (/* @__PURE__ */ new Date()).toISOString()
}, a.messages.push(i);
else
return;
const { content: d, sequence: m } = t;
e === U.Partial ? r[m] = d : r.answer = d;
const l = _t(r);
(i.content !== l || e === U.Answer) && (i.content = l, i.parts = re(l), c == null || c([...a.messages], e));
}
function xt(e, t, r, a, c) {
let s = {};
const o = () => s = {};
let n = "answer";
const i = (d, m) => {
var l, w;
m === "user" && o(), n = m, (w = (l = r.callbacks).onNewMessage) == null || w.call(l, d, m);
};
return {
clearQueue: o,
onMessage: (d, m) => {
var l, w;
if ("content" in m) {
const v = d === P.ChatAnswer ? U.Answer : d === P.ChatAudioTranscribed ? U.Transcribe : d;
At(v, m, s, t, i, o), v === U.Answer && e.track("agent-message-received", {
content: m.content,
messages: t.messages.length,
mode: t.chatMode
});
} else {
const v = P, k = [v.StreamVideoDone, v.StreamVideoError, v.StreamVideoRejected], B = [v.StreamFailed, v.StreamVideoError, v.StreamVideoRejected], M = St(m, a, { mode: t.chatMode });
if (d = d, d === v.StreamVideoCreated && (e.linkTrack("agent-video", M, v.StreamVideoCreated, ["start"]), m.sentiment)) {
const D = t.messages[t.messages.length - 1];
if ((D == null ? void 0 : D.role) === "assistant") {
const $ = { ...D, sentiment: m.sentiment };
t.messages[t.messages.length - 1] = $, i == null || i([...t.messages], n);
}
}
if (k.includes(d)) {
const D = d.split("/")[1];
B.includes(d) ? e.track("agent-video", { ...M, event: D }) : e.linkTrack("agent-video", { ...M, event: D }, d, ["done"]);
}
B.includes(d) && ((w = (l = r.callbacks).onError) == null || w.call(l, new Error(`Stream failed with event ${d}`), { data: m })), m.event === v.StreamDone && c();
}
}
};
}
function Lt(e, t, r, a) {
const c = Fe(e, `${t}/agents/${r}`, a);
return {
createStream(s, o) {
return c.post("/streams", s, { signal: o });
},
startConnection(s, o, n, i) {
return c.post(
`/streams/${s}/sdp`,
{
session_id: n,
answer: o
},
{ signal: i }
);
},
addIceCandidate(s, o, n, i) {
return c.post(
`/streams/${s}/ice`,
{
session_id: n,
...o
},
{ signal: i }
);
},
sendStreamRequest(s, o, n) {
return c.post(`/streams/${s}`, {
session_id: o,
...n
});
},
close(s, o) {
return c.delete(`/streams/${s}`, { session_id: o });
}
};
}
const Pt = (e, t) => (r, a) => e && console.log(`[${t}] ${r}`, a ?? "");
function jt(e, t, r) {
const a = (t.timestamp - e.timestamp) / 1e3;
return {
duration: a,
bytesReceived: t.bytesReceived - e.bytesReceived,
bitrate: Math.round((t.bytesReceived - e.bytesReceived) * 8 / a),
packetsReceived: t.packetsReceived - e.packetsReceived,
packetsLost: t.packetsLost - e.packetsLost,
framesDropped: t.framesDropped - e.framesDropped,
framesDecoded: t.framesDecoded - e.framesDecoded,
jitter: t.jitter,
avgJitterDelayInInterval: (t.jitterBufferDelay - e.jitterBufferDelay) / (t.jitterBufferEmittedCount - e.jitterBufferEmittedCount),
jitterBufferEmittedCount: t.jitterBufferEmittedCount - e.jitterBufferEmittedCount,
jitterBufferDelay: (t.jitterBufferDelay - e.jitterBufferDelay) / a,
framesPerSecond: t.framesPerSecond,
freezeCount: t.freezeCount - e.freezeCount,
freezeDuration: t.freezeDuration - e.freezeDuration,
lowFpsCount: r
};
}
function Bt(e) {
return e.filter(
(t) => t.freezeCount > 0 || t.framesPerSecond < 21 || t.framesDropped > 0 || t.packetsLost > 0
).map((t) => {
const { timestamp: r, ...a } = t, c = [];
return t.freezeCount > 0 && c.push("freeze"), t.framesPerSecond < 21 && c.push("low fps"), t.framesDropped > 0 && c.push("frames dropped"), t.packetsLost > 0 && c.push("packet loss"), {
...a,
causes: c
};
});
}
function $t(e) {
var o;
let t = "", r = 0, a = null;
const c = /* @__PURE__ */ new Map();
for (const n of e.values())
if (n)
if (n.type === "codec" && ((o = n.mimeType) != null && o.startsWith("video")))
c.set(n.id, n.mimeType.split("/")[1]);
else if (n.type === "candidate-pair") {
const i = n, d = i.currentRoundTripTime ?? 0;
d > 0 && (i.nominated === !0 || r === 0) && (r = d);
} else n.type === "inbound-rtp" && n.kind === "video" && (a = n);
if (!a)
return {};
const s = a;
return s.codecId && c.has(s.codecId) ? t = c.get(s.codecId) : c.size > 0 && (t = c.values().next().value ?? ""), {
codec: t,
rtt: r,
timestamp: s.timestamp,
bytesReceived: s.bytesReceived,
packetsReceived: s.packetsReceived,
packetsLost: s.packetsLost,
framesDropped: s.framesDropped,
framesDecoded: s.framesDecoded,
jitter: s.jitter,
jitterBufferDelay: s.jitterBufferDelay,
jitterBufferEmittedCount: s.jitterBufferEmittedCount,
avgJitterDelayInInterval: s.jitterBufferDelay / s.jitterBufferEmittedCount,
frameWidth: s.frameWidth,
frameHeight: s.frameHeight,
framesPerSecond: s.framesPerSecond,
freezeCount: s.freezeCount,
freezeDuration: s.totalFreezesDuration
};
}
function _e(e, t, r) {
const a = e.map((i, d) => d === 0 ? r ? {
timestamp: i.timestamp,
duration: 0,
rtt: i.rtt,
bytesReceived: i.bytesReceived - r.bytesReceived,
bitrate: (i.bytesReceived - r.bytesReceived) * 8 / (t / 1e3),
packetsReceived: i.packetsReceived - r.packetsReceived,
packetsLost: i.packetsLost - r.packetsLost,
framesDropped: i.framesDropped - r.framesDropped,
framesDecoded: i.framesDecoded - r.framesDecoded,
jitter: i.jitter,
jitterBufferDelay: i.jitterBufferDelay - r.jitterBufferDelay,
jitterBufferEmittedCount: i.jitterBufferEmittedCount - r.jitterBufferEmittedCount,
avgJitterDelayInInterval: (i.jitterBufferDelay - r.jitterBufferDelay) / (i.jitterBufferEmittedCount - r.jitterBufferEmittedCount),
framesPerSecond: i.framesPerSecond,
freezeCount: i.freezeCount - r.freezeCount,
freezeDuration: i.freezeDuration - r.freezeDuration
} : {
timestamp: i.timestamp,
rtt: i.rtt,
duration: 0,
bytesReceived: i.bytesReceived,
bitrate: i.bytesReceived * 8 / (t / 1e3),
packetsReceived: i.packetsReceived,
packetsLost: i.packetsLost,
framesDropped: i.framesDropped,
framesDecoded: i.framesDecoded,
jitter: i.jitter,
jitterBufferDelay: i.jitterBufferDelay,
jitterBufferEmittedCount: i.jitterBufferEmittedCount,
avgJitterDelayInInterval: i.jitterBufferDelay / i.jitterBufferEmittedCount,
framesPerSecond: i.framesPerSecond,
freezeCount: i.freezeCount,
freezeDuration: i.freezeDuration
} : {
timestamp: i.timestamp,
duration: t * d / 1e3,
rtt: i.rtt,
bytesReceived: i.bytesReceived - e[d - 1].bytesReceived,
bitrate: (i.bytesReceived - e[d - 1].bytesReceived) * 8 / (t / 1e3),
packetsReceived: i.packetsReceived - e[d - 1].packetsReceived,
packetsLost: i.packetsLost - e[d - 1].packetsLost,
framesDropped: i.framesDropped - e[d - 1].framesDropped,
framesDecoded: i.framesDecoded - e[d - 1].framesDecoded,
jitter: i.jitter,
jitterBufferDelay: i.jitterBufferDelay - e[d - 1].jitterBufferDelay,
jitterBufferEmittedCount: i.jitterBufferEmittedCount - e[d - 1].jitterBufferEmittedCount,
avgJitterDelayInInterval: (i.jitterBufferDelay - e[d - 1].jitterBufferDelay) / (i.jitterBufferEmittedCount - e[d - 1].jitterBufferEmittedCount),
framesPerSecond: i.framesPerSecond,
freezeCount: i.freezeCount - e[d - 1].freezeCount,
freezeDuration: i.freezeDuration - e[d - 1].freezeDuration
}), c = Bt(a), s = c.reduce((i, d) => i + (d.causes.includes("low fps") ? 1 : 0), 0), o = a.filter((i) => !!i.avgJitterDelayInInterval).map((i) => i.avgJitterDelayInInterval), n = a.filter((i) => !!i.rtt).map((i) => i.rtt);
return {
webRTCStats: {
anomalies: c,
minRtt: Math.min(...n),
avgRtt: Me(n),
maxRtt: Math.max(...n),
aggregateReport: jt(e[0], e[e.length - 1], s),
minJitterDelayInInterval: Math.min(...o),
maxJitterDelayInInterval: Math.max(...o),
avgJitterDelayInInterval: Me(o)
},
codec: e[0].codec,
resolution: `${e[0].frameWidth}x${e[0].frameHeight}`
};
}
function Ke(e, t) {
for (const r of e.values())
if ((r == null ? void 0 : r.type) === "inbound-rtp" && r.kind === t)
return r;
return null;
}
const ee = 10;
function cr(e, t) {
let r = !1, a = !1, c = null, s = 0, o = 0, n = {};
async function i() {
if (r) {
try {
const d = await e();
if (!d) {
c = setTimeout(i, ee);
return;
}
const m = Ke(d, "audio");
if (!m) {
c = setTimeout(i, ee);
return;
}
const l = m.totalAudioEnergy ?? 0, w = m.totalSamplesReceived ?? 0;
if (!a) {
s = l, o = w, a = !0, c = setTimeout(i, ee);
return;
}
const v = l - s, k = w - o;
if (s = l, o = w, k > 0 && v > 0) {
r = !1, t(n);
return;
}
} catch {
}
r && (c = setTimeout(i, ee));
}
}
return {
arm(d = {}) {
n = d, r = !0, a = !1, performance.now(), c !== null && clearTimeout(c), c = setTimeout(i, ee);
},
destroy() {
r = !1, c !== null && (clearTimeout(c), c = null);
}
};
}
const oe = 100, zt = Math.max(Math.ceil(400 / oe), 1), Ft = 0.25, Nt = 0.28;
function Vt() {
let e = 0, t, r, a = 0;
return (c) => {
const s = Ke(c, "video");
if (!s)
return { isReceiving: !1, avgJitterDelayInInterval: a };
const o = s.jitterBufferDelay, n = s.jitterBufferEmittedCount;
if (r && n > r) {
const m = o - t, l = n - r;
a = m / l;
}
t = o, r = n;
const i = s.framesDecoded, d = i - e > 0;
return e = i, { isReceiving: d, avgJitterDelayInInterval: a, freezeCount: s.freezeCount };
};
}
function Kt(e, t, r, a, c) {
let s = null, o = [], n, i = 0, d = !1, m = te.Unknown, l = te.Unknown, w = 0, v = 0;
const k = Vt();
async function B() {
const M = await e();
if (!M)
return;
const { isReceiving: D, avgJitterDelayInInterval: $, freezeCount: _ } = k(M), q = $t(M);
if (D)
i = 0, w = _ - v, l = $ < Ft ? te.Strong : $ > Nt && w > 1 ? te.Weak : m, l !== m && (c == null || c(l), m = l, v += w, w = 0), d || (a == null || a(S.Start), n = o[o.length - 1], o = [], d = !0), o.push(q);
else if (d && (i++, i >= zt)) {
const J = _e(o, oe, n);
a == null || a(S.Stop, J), t() || r(), v = _, d = !1;
}
}
return {
start: () => {
s || (s = setInterval(B, oe));
},
stop: () => {
s && (clearInterval(s), s = null);
},
getReport: () => _e(o, oe, n)
};
}
const Ut = (window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection).bind(window);
function be(e) {
switch (e) {
case "connected":
return L.Connected;
case "checking":
return L.Connecting;
case "failed":
return L.Fail;
case "new":
return L.New;
case "closed":
return L.Closed;
case "disconnected":
return L.Disconnected;
case "completed":
return L.Completed;
default:
return L.New;
}
}
const Wt = (e) => (t) => {
const [r, a = ""] = t.split(/:(.+)/);
try {
const c = JSON.parse(a);
return e("parsed data channel message", { subject: r, data: c }), { subject: r, data: c };
} catch (c) {
return e("Failed to parse data channel message, returning data as string", { subject: r, rawData: a, error: c }), { subject: r, data: a };
}
};
function Jt({
statsSignal: e,
dataChannelSignal: t,
onVideoStateChange: r,
report: a,
log: c
}) {
e === S.Start && t === S.Start ? (c("CALLBACK: onVideoStateChange(Start)"), r == null || r(S.Start)) : e === S.Stop && t === S.Stop && (c("CALLBACK: onVideoStateChange(Stop)"), r == null || r(S.Stop, a));
}
function Ot({
statsSignal: e,
dataChannelSignal: t,
onVideoStateChange: r,
onAgentActivityStateChange: a,
report: c,
log: s
}) {
e === S.Start ? (s("CALLBACK: onVideoStateChange(Start)"), r == null || r(S.Start)) : e === S.Stop && (s("CALLBACK: onVideoStateChange(Stop)"), r == null || r(S.Stop, c)), t === S.Start ? a == null || a(ne.Talking) : t === S.Stop && (a == null || a(ne.Idle));
}
function Ae({
statsSignal: e,
dataChannelSignal: t,
onVideoStateChange: r,
onAgentActivityStateChange: a,
streamType: c,
report: s,
log: o
}) {
c === W.Legacy ? Jt({ statsSignal: e, dataChannelSignal: t, onVideoStateChange: r, report: s, log: o }) : c === W.Fluent && Ot({
statsSignal: e,
dataChannelSignal: t,
onVideoStateChange: r,
onAgentActivityStateChange: a,
report: s,
log: o
});
}
async function Ht(e, t, { debug: r = !1, callbacks: a, auth: c, baseURL: s = de, analytics: o }, n) {
var E;
const i = Pt(r, "WebRTCStreamingManager"), d = Wt(i);
let m = !1, l = !1, w = S.Stop, v = S.Stop;
const { startConnection: k, sendStreamRequest: B, close: M, createStream: D, addIceCandidate: $ } = Lt(
c,
s,
e,
a.onError
), {
id: _,
offer: q,
ice_servers: J,
session_id: N,
fluent: X,
interrupt_enabled: O
} = await D(t, n);
(E = a.onStreamCreated) == null || E.call(a, { stream_id: _, session_id: N, agent_id: e });
const I = new Ut({ iceServers: J }), Y = I.createDataChannel("JanusDataChannel");
if (!N)
throw new Error("Could not create session_id");
const V = X ? W.Fluent : W.Legacy;
o.enrich({
"stream-type": V
});
const ae = t.stream_warmup && !X, ie = () => m, u = () => {
var f;
m = !0, l && (i("CALLBACK: onConnectionStateChange(Connected)"), (f = a.onConnectionStateChange) == null || f.call(a, L.Connected));
}, g = Kt(
() => I.getStats(),
ie,
u,
(f, h) => Ae({
statsSignal: v = f,
dataChannelSignal: V === W.Legacy ? w : void 0,
onVideoStateChange: a.onVideoStateChange,
onAgentActivityStateChange: a.onAgentActivityStateChange,
report: h,
streamType: V,
log: i
}),
(f) => {
var h;
return (h = a.onConnectivityStateChange) == null ? void 0 : h.call(a, f);
}
);
g.start(), I.onicecandidate = (f) => {
var h;
i("peerConnection.onicecandidate", f);
try {
f.candidate && f.candidate.sdpMid && f.candidate.sdpMLineIndex !== null ? $(
_,
{
candidate: f.candidate.candidate,
sdpMid: f.candidate.sdpMid,
sdpMLineIndex: f.candidate.sdpMLineIndex
},
N,
n
) : $(_, { candidate: null }, N, n);
} catch (b) {
(h = a.onError) == null || h.call(a, b, { streamId: _ });
}
}, Y.onopen = () => {
l = !0, (!ae || m) && u();
};
let p = null;
const y = (f) => {
var h;
p = f, (h = a.onVideoIdChange) == null || h.call(a, f);
};
function C(f, h) {
if (f === P.StreamStarted && typeof h == "object" && "metadata" in h) {
const b = h.metadata;
y(b.videoId);
}
f === P.StreamDone && y(null), w = f === P.StreamStarted ? S.Start : S.Stop, Ae({
statsSignal: V === W.Legacy ? v : void 0,
dataChannelSignal: w,
onVideoStateChange: a.onVideoStateChange,
onAgentActivityStateChange: a.onAgentActivityStateChange,
streamType: V,
log: i
});
}
function R(f, h) {
var T;
const b = typeof h == "string" ? h : h == null ? void 0 : h.metadata;
b && o.enrich({ streamMetadata: b }), (T = a.onStreamReady) == null || T.call(a);
}
const j = {
[P.StreamStarted]: C,
[P.StreamDone]: C,
[P.StreamReady]: R
};
Y.onmessage = (f) => {
var T;
const { subject: h, data: b } = d(f.data);
(T = j[h]) == null || T.call(j, h, b);
}, I.oniceconnectionstatechange = () => {
var h;
i("peerConnection.oniceconnectionstatechange => " + I.iceConnectionState);
const f = be(I.iceConnectionState);
f !== L.Connected && ((h = a.onConnectionStateChange) == null || h.call(a, f));
}, I.ontrack = (f) => {
var h;
i("peerConnection.ontrack", f), i("CALLBACK: onSrcObjectReady"), (h = a.onSrcObjectReady) == null || h.call(a, f.streams[0]);
}, await I.setRemoteDescription(q), i("set remote description OK");
const z = await I.createAnswer();
i("create answer OK"), await I.setLocalDescription(z), i("set local description OK"), await k(_, z, N, n), i("start connection OK");
function F(f) {
var h, b;
if (!m || Y.readyState !== "open") {
i("Data channel is not ready for sending messages"), (h = a.onError) == null || h.call(a, new Error("Data channel is not ready for sending messages"), {
streamId: _
});
return;
}
try {
Y.send(f);
} catch (T) {
i("Error sending data channel message", T), (b = a.onError) == null || b.call(a, T, { streamId: _ });
}
}
return {
/**
* Method to send request to server to get clip or talk depend on you payload
* @param payload
*/
speak(f) {
return B(_, N, f);
},
/**
* Method to close RTC connection
*/
async disconnect() {
var f;
if (_) {
const h = be(I.iceConnectionState);
if (I) {
if (h === L.New) {
g.stop();
return;
}
I.close(), I.oniceconnectionstatechange = null, I.onnegotiationneeded = null, I.onicecandidate = null, I.ontrack = null;
}
try {
h === L.Connected && await M(_, N).catch((b) => {
});
} catch (b) {
i("Error on close stream connection", b);
}
(f = a.onAgentActivityStateChange) == null || f.call(a, ne.Idle), g.stop();
}
},
sendDataChannelMessage: F,
/**
* Session identifier information, should be returned in the body of all streaming requests
*/
sessionId: N,
/**
* Id of current RTC stream
*/
streamId: _,
streamType: V,
interruptAvailable: O ?? !1,
isInterruptible: !0,
interrupt(f) {
if (!O)
throw new Error("Interrupt is not enabled for this stream");
if (V !== W.Fluent)
throw new Error("Interrupt only available for Fluent streams");
if (!p)
throw new Error("No active video to interrupt");
const h = {
type: P.StreamInterrupt,
videoId: p,
timestamp: Date.now()
};
F(JSON.stringify(h));
}
};
}
var ge = /* @__PURE__ */ ((e) => (e.V1 = "v1", e.V2 = "v2", e))(ge || {});
async function qt(e, t, r, a) {
const c = e.id;
switch (t.version) {
case "v1": {
const { version: s, ...o } = t;
return Ht(c, o, r, a);
}
case "v2": {
const { version: s, ...o } = t;
switch (o.transport.provider) {
case he.Livekit:
const { createLiveKitStreamingManager: n } = await import("./livekit-manager-BtTtY9lx.js");
return n(c, o, r);
default:
throw new Error(`Unsupported transport provider: ${o.transport.provider}`);
}
}
default:
throw new Error(`Invalid stream version: ${t.version}`);
}
}
const Xt = "cht";
function Yt() {
return {
transport: {
provider: he.Livekit
}
};
}
function Gt(e) {
var c, s;
const { streamOptions: t } = e ?? {}, r = ((c = e == null ? void 0 : e.mixpanelAdditionalProperties) == null ? void 0 : c.plan) !== void 0 ? {
plan: (s = e.mixpanelAdditionalProperties) == null ? void 0 : s.plan
} : void 0;
return { ...{
output_resolution: t == null ? void 0 : t.outputResolution,
session_timeout: t == null ? void 0 : t.sessionTimeout,
stream_warmup: t == null ? void 0 : t.streamWarmup,
compatibility_mode: t == null ? void 0 : t.compatibilityMode,
fluent: t == null ? void 0 : t.fluent
}, ...r && { end_user_data: r } };
}
function Qt(e, t) {
return pe(e.presenter.type) ? { version: ge.V2, ...Yt() } : { version: ge.V1, ...Gt(t) };
}
function Zt(e, t, r) {
r.track("agent-connection-state-change", { state: e, ...t && { reason: t } });
}
function er(e, t, r, a, c) {
c === W.Fluent ? tr(e, t, r, a, c) : rr(e, t, r, a, c);
}
function tr(e, t, r, a, c) {
e === S.Start ? a.track("stream-session", { event: "start", "stream-type": c }) : e === S.Stop && a.track("stream-session", {
event: "stop",
is_greenscreen: t.presenter.type === "clip" && t.presenter.is_greenscreen,
background: t.presenter.type === "clip" && t.presenter.background,
"stream-type": c,
...r
});
}
function xe(e, t, r, a, c) {
e === S.Start ? r.linkTrack("agent-video", { event: "start", ...c, "stream-type": a }, "start", [
P.StreamVideoCreated
]) : e === S.Stop && r.linkTrack(
"agent-video",
{
event: "stop",
is_greenscreen: t.presenter.type === "clip" && t.presenter.is_greenscreen,
background: t.presenter.type === "clip" && t.presenter.background,
"stream-type": a
},
"done",
[P.StreamVideoDone]
);
}
function rr(e, t, r, a, c) {
e === S.Start ? a.linkTrack(
"agent-video",
{ event: "start", latency: H.get(!0), "stream-type": c },
"start",
[P.StreamVideoCreated]
) : e === S.Stop && a.linkTrack(
"agent-video",
{
event: "stop",
is_greenscreen: t.presenter.type === "clip" && t.presenter.is_greenscreen,
background: t.presenter.type === "clip" && t.presenter.background,
"stream-type": c,
...r
},
"done",
[P.StreamVideoDone]
);
}
function nr(e, t, r) {
const a = {
call_id: t.call_id,
name: t.name
};
if (e === P.ToolCallStarted) {
r.track("agent-tool-call", { ...a, event: "started" });
return;
}
const c = t;
r.track("agent-tool-call", {
...a,
event: e === P.ToolCallDone ? "done" : "error",
duration_ms: c.duration_ms,
extra_keys: c.extra ? Object.keys(c.extra).length : 0
});
}
function Le(e, t, r, a) {
return H.reset(), Te.update(), new Promise(async (c, s) => {
try {
let o, n = !1;
const i = Qt(e, t);
r.enrich({
"stream-version": i.version.toString()
});
let d = null;
const m = e.presenter.type === "expressive";
o = await qt(
e,
i,
{
...t,
analytics: r,
callbacks: {
...t.callbacks,
onConnectionStateChange: (l, w) => {
var v, k;
(k = (v = t.callbacks).onConnectionStateChange) == null || k.call(v, l), Zt(l, w, r), l === L.Connected && (o ? c(o) : n = !0);
},
onVideoStateChange: (l, w) => {
var v, k;
(k = (v = t.callbacks).onVideoStateChange) == null || k.call(v, l), er(
l,
e,
w,
r,
o.streamType
);
},
onAgentActivityStateChange: (l) => {
var w, v;
(v = (w = t.callbacks).onAgentActivityStateChange) == null || v.call(w, l), l === ne.Talking ? (fe.update(), d = (k) => {
xe(
S.Start,
e,
r,
o.streamType,
k
), d = null;
}, m || d({ latency: H.get(!0) })) : (fe.reset(), d = null, xe(
S.Stop,
e,
r,
o.streamType
));
},
onFirstAudioDetected: (l) => {
d == null || d(l);
},
onStreamReady: () => {
const l = Te.get(!0);
r.track("agent-chat", { event: "ready", latency: l });
},
onToolEvent: (l, w) => {
var v, k;
(k = (v = t.callbacks).onToolEvent) == null || k.call(v, l, w), nr(l, w, r);
}
}
},
a
), n && c(o);
} catch (o) {
s(o);
}
});
}
async function ar(e, t, r, a, c) {
var m, l, w, v;
const s = async () => {
if (pe(e.presenter.type)) {
const k = await Le(e, t, a), B = `${Xt}_${k.sessionId}`, M = (/* @__PURE__ */ new Date()).toISOString();
return { chatResult: {
chatMode: x.Functional,
chat: {
id: B,
agent_id: e.id,
owner_id: e.owner_id ?? "",
created: M,
modified: M,
agent_id__created_at: M,
agent_id__modified_at: M,
chat_mode: x.Functional,
messages: []
}
}, streamingManager: k };
} else {
const k = new AbortController(), B = k.signal;
let M;
try {
const D = Ve(
e,
r,
a,
t.mode,
t.persistentChat,
c
), $ = Le(e, t, a, B).then((J) => (M = J, J)), [_, q] = await Promise.all([D, $]);
return { chatResult: _, streamingManager: q };
} catch (D) {
throw k.abort(), M && await M.disconnect().catch(() => {
}), D;
}
}
}, { chatResult: o, streamingManager: n } = await s(), { chat: i, chatMode: d } = o;
return d && t.mode !== void 0 && d !== t.mode && (t.mode = d, (l = (m = t.callbacks).onModeChange) == null || l.call(m, d), d !== x.Functional) ? ((v = (w = t.callbacks).onError) == null || v.call(w, new He(d)), n == null || n.disconnect(), { chat: i }) : { chat: i, streamingManager: n };
}
async function dr(e, t) {
var Y, V, ae, ie;
let r = !0;
const a = t.mixpanelKey || ot, c = t.wsURL || st, s = t.baseURL || de, o = t.mode || x.Functional, n = {
messages: [],
chatMode: o
}, i = Rt({
token: a,
agentId: e,
isEnabled: t.enableAnalitics,
externalId: t.externalId,
mixpanelAdditionalProperties: t.mixpanelAdditionalProperties
}), d = Date.now();
Ee(() => {
i.track("agent-sdk", { event: "init" }, d);
});
const m = wt(t.auth, s, t.callbacks.onError, t.externalId), l = await m.getById(e);
t.debug = t.debug || ((Y = l == null ? void 0 : l.advanced_settings) == null ? void 0 : Y.ui_debug_mode);
const w = pe(l.presenter.type);
i.enrich(yt(l));
const { onMessage: v, clearQueue: k } = xt(i, n, t, l, () => {
var u, g, p;
(u = n.socketManager) == null || u.disconnect(), (p = (g = t.callbacks).onConnectionStateChange) == null || p.call(g, L.Disconnected);
});
n.messages = It(t.initialMessages), (ae = (V = t.callbacks).onNewMessage) == null || ae.call(V, [...n.messages], "answer");
const B = (u) => {
}, M = ({ type: u }) => {
var p, y, C, R;
if (!((p = n.streamingManager) != null && p.interruptAvailable) || !((y = n.streamingManager) != null && y.isInterruptible)) return;
const g = n.messages[n.messages.length - 1];
i.track("agent-video-interrupt", {
type: u || "click",
video_duration_to_interrupt: fe.get(!0),
message_duration_to_interrupt: H.get(!0)
}), g.interrupted = !0, (R = (C = t.callbacks).onNewMessage) == null || R.call(C, [...n.messages], "answer"), n.streamingManager.interrupt(u);
}, D = /* @__PURE__ */ new Map();
function $(u) {
return async (g) => {
const p = D.get(u);
if (!p)
throw new Error(`No handler registered for client tool: ${u}`);
try {
const y = JSON.parse(g.payload);
return await p(y);
} catch (y) {
throw new Error(`Client tool "${u}" failed: ${y.message}`);
}
};
}
function _() {
var u, g, p, y;
for (const [C] of D)
(g = (u = n.streamingManager) == null ? void 0 : u.unregisterRpcMethod) == null || g.call(u, C), (y = (p = n.streamingManager) == null ? void 0 : p.registerRpcMethod) == null || y.call(p, C, $(C));
}
function q(u, g) {
var y, C;
const p = !D.has(u);
D.set(u, g), p && ((C = (y = n.streamingManager) == null ? void 0 : y.registerRpcMethod) == null || C.call(y, u, $(u)));
}
function J(u) {
var g, p;
D.delete(u), (p = (g = n.streamingManager) == null ? void 0 : g.unregisterRpcMethod) == null || p.call(g, u);
}
const N = Date.now();
Ee(() => {
i.track("agent-sdk", { event: "loaded", ...vt(l) }, N);
});
async function X(u) {
var j, z, F, E, f, h, b;
(z = (j = t.callbacks).onConnectionStateChange) == null || z.call(j, L.Connecting), H.reset(), u && !r && (delete n.chat, (E = (F = t.callbacks).onNewMessage) == null || E.call(F, [...n.messages], "answer"));
const g = o === x.DirectPlayback || w ? Promise.resolve(void 0) : Tt(
t.auth,
c,
{ onMessage: v, onError: t.callbacks.onError },
t.externalId
), p = ue(
() => ar(
l,
{
...t,
mode: o,
callbacks: {
...t.callbacks,
onVideoIdChange: B,
onMessage: v
}
},
m,
i,
n.chat
),
{
limit: 3,
timeout: at,
timeoutErrorMessage: "Timeout initializing the stream",
shouldRetryFn: (T) => (T == null ? void 0 : T.message) !== "Could not connect" && T.status !== 429 && (T == null ? void 0 : T.message) !== "InsufficientCreditsError",
delayMs: 1e3
}
).catch((T) => {
var A, K;
throw I(x.Maintenance), (K = (A = t.callbacks).onConnectionStateChange) == null || K.call(A, L.Fail), T;
}), [y, { streamingManager: C, chat: R }] = await Promise.all([g, p]);
R && R.id !== ((f = n.chat) == null ? void 0 : f.id) && ((b = (h = t.callbacks).onNewChat) == null || b.call(h, R.id)), n.streamingManager = C, n.socketManager = y, n.chat = R, _(), r = !1, i.enrich({
chatId: R == null ? void 0 : R.id,
streamId: C == null ? void 0 : C.streamId,
mode: n.chatMode
}), I((R == null ? void 0 : R.chat_mode) ?? o);
}
async function O() {
var u, g, p, y;
(u = n.socketManager) == null || u.disconnect(), await ((g = n.streamingManager) == null ? void 0 : g.disconnect()), delete n.streamingManager, delete n.socketManager, (y = (p = t.callbacks).onConnectionStateChange) == null || y.call(p, L.Disconnected);
}
async function I(u) {
var g, p;
u !== n.chatMode && (i.track("agent-mode-change", { mode: u }), n.chatMode = u, n.chatMode !== x.F