@d-id/client-sdk 2.0.7 → 2.0.8
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/README.md +21 -20
- package/dist/{index-DeKPoqBL.js → index-CeqOE8FZ.js} +2280 -2269
- package/dist/index.js +22 -21
- package/dist/index.umd.cjs +5 -5
- package/dist/{livekit-manager-D7YZEQiJ.js → livekit-manager-aJg_E0hR.js} +160 -149
- package/dist/src/services/agent-manager/connect-to-manager.d.ts +2 -1
- package/dist/src/services/socket-manager/message-queue.d.ts +1 -1
- package/dist/src/types/entities/agents/manager.d.ts +2 -1
- package/dist/src/types/stream/stream.d.ts +19 -0
- package/dist/src/utils/stream-end.d.ts +5 -0
- package/dist/src/utils/stream-end.test.d.ts +1 -0
- package/package.json +1 -1
|
@@ -1,94 +1,96 @@
|
|
|
1
|
-
import { c as
|
|
2
|
-
function
|
|
1
|
+
import { c as Qe, C as J, S as l, a as We, b as qe, A as m, d as Ge, l as he, e as He, t as Xe, f as A, g as U, h as Ze, D as me, i as Ye, j as b, n as en } from "./index-CeqOE8FZ.js";
|
|
2
|
+
function nn() {
|
|
3
3
|
try {
|
|
4
4
|
return Intl.DateTimeFormat().resolvedOptions().timeZone ?? "";
|
|
5
5
|
} catch {
|
|
6
6
|
return "";
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
|
-
function
|
|
9
|
+
function tn() {
|
|
10
10
|
if (typeof navigator > "u")
|
|
11
11
|
return "";
|
|
12
|
-
const
|
|
12
|
+
const f = navigator.userAgent ?? "", C = (navigator.platform ?? "").toLowerCase();
|
|
13
13
|
let u = "Unknown";
|
|
14
|
-
/android/i.test(
|
|
15
|
-
const i = u === "Android" || u === "iOS" || /Mobi/i.test(
|
|
14
|
+
/android/i.test(f) ? u = "Android" : /iphone|ipad|ipod/i.test(f) ? u = "iOS" : C.includes("win") ? u = "Windows" : C.includes("mac") ? u = "Mac OS X" : C.includes("linux") && (u = "Linux");
|
|
15
|
+
const i = u === "Android" || u === "iOS" || /Mobi/i.test(f);
|
|
16
16
|
return `${u}, ${i ? "Mobile" : "Desktop"}`;
|
|
17
17
|
}
|
|
18
|
-
function
|
|
19
|
-
const
|
|
20
|
-
C && (
|
|
21
|
-
const u =
|
|
22
|
-
return u && (
|
|
18
|
+
function on() {
|
|
19
|
+
const f = {}, C = nn();
|
|
20
|
+
C && (f.timezone = C);
|
|
21
|
+
const u = tn();
|
|
22
|
+
return u && (f.device = u), f;
|
|
23
23
|
}
|
|
24
|
-
function
|
|
25
|
-
const k =
|
|
24
|
+
function rn(f, C, u, i) {
|
|
25
|
+
const k = Qe(f, `${C}/v2/agents/${u}`, i);
|
|
26
26
|
return {
|
|
27
27
|
async createStream(g) {
|
|
28
28
|
return k.post("/sessions", g);
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
|
-
const
|
|
33
|
-
[
|
|
34
|
-
[
|
|
35
|
-
},
|
|
36
|
-
async function
|
|
32
|
+
const an = {
|
|
33
|
+
[l.ChatAnswer]: J.Answer,
|
|
34
|
+
[l.ChatPartial]: J.Partial
|
|
35
|
+
}, Ce = 2e4, cn = [];
|
|
36
|
+
async function sn() {
|
|
37
37
|
try {
|
|
38
|
-
return await import("./index-
|
|
38
|
+
return await import("./index-CeqOE8FZ.js").then((f) => f.G);
|
|
39
39
|
} catch {
|
|
40
40
|
throw new Error(
|
|
41
41
|
"LiveKit client is required for this streaming manager. Please install it using: npm install livekit-client"
|
|
42
42
|
);
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
|
-
const
|
|
45
|
+
const un = {
|
|
46
46
|
excellent: U.Strong,
|
|
47
47
|
good: U.Strong,
|
|
48
48
|
poor: U.Weak,
|
|
49
49
|
lost: U.Unknown,
|
|
50
50
|
unknown: U.Unknown
|
|
51
|
-
},
|
|
52
|
-
function
|
|
51
|
+
}, j = (f = "Stream Error") => new He(f);
|
|
52
|
+
function Se(f, C, u) {
|
|
53
53
|
var i, k;
|
|
54
|
-
throw C("Failed to connect to LiveKit room:",
|
|
54
|
+
throw C("Failed to connect to LiveKit room:", f), (i = u.onConnectionStateChange) == null || i.call(u, A.Fail, "internal:init-error"), (k = u.onError) == null || k.call(u, f, { sessionId: "" }), f;
|
|
55
55
|
}
|
|
56
|
-
async function
|
|
57
|
-
var
|
|
58
|
-
const i =
|
|
56
|
+
async function ln(f, C, u) {
|
|
57
|
+
var de;
|
|
58
|
+
const i = We(u.debug || !1, "LiveKitStreamingManager"), { Room: k, RoomEvent: g, ConnectionState: I, Track: ee } = await sn(), { callbacks: n, auth: Te, baseURL: ye, analytics: ne } = u;
|
|
59
59
|
let a = null, E = !1;
|
|
60
|
-
const
|
|
60
|
+
const te = qe.Fluent;
|
|
61
61
|
let L = null;
|
|
62
62
|
const P = { isPublishing: !1, publication: null }, Q = { isPublishing: !1, publication: null };
|
|
63
|
-
let h = null, S = null,
|
|
63
|
+
let h = null, S = null, O = null, K = !1;
|
|
64
64
|
a = new k({
|
|
65
65
|
adaptiveStream: !1,
|
|
66
66
|
// Must be false to use mediaStreamTrack directly
|
|
67
67
|
dynacast: !0
|
|
68
68
|
});
|
|
69
|
+
for (const [e, t] of u.rpcMethods ?? [])
|
|
70
|
+
a.registerRpcMethod(e, t);
|
|
69
71
|
let R = null, M = m.Idle, W = !0;
|
|
70
72
|
const y = /* @__PURE__ */ new Map();
|
|
71
|
-
let x = null;
|
|
72
|
-
const
|
|
73
|
-
let v, _, $,
|
|
73
|
+
let x = null, q = null;
|
|
74
|
+
const ve = rn(Te, ye || Ge, f, n.onError);
|
|
75
|
+
let v, _, $, ie = !0;
|
|
74
76
|
try {
|
|
75
|
-
const e = await
|
|
77
|
+
const e = await ve.createStream({
|
|
76
78
|
transport: C.transport,
|
|
77
79
|
chat_persist: C.chat_persist ?? !0,
|
|
78
80
|
verbose: u.verbose ?? !1
|
|
79
81
|
}), { id: t, session_token: o, session_url: r, interrupt_enabled: c } = e;
|
|
80
|
-
(
|
|
82
|
+
(de = n.onStreamCreated) == null || de.call(n, { session_id: t, stream_id: t, agent_id: f }), v = t, _ = o, $ = r, ie = c ?? !0, await a.prepareConnection($, _);
|
|
81
83
|
} catch (e) {
|
|
82
|
-
|
|
84
|
+
Se(e, i, n);
|
|
83
85
|
}
|
|
84
86
|
if (!$ || !_ || !v)
|
|
85
87
|
return Promise.reject(new Error("Failed to initialize LiveKit stream"));
|
|
86
|
-
a.on(g.ConnectionStateChanged,
|
|
87
|
-
function
|
|
88
|
-
t != null && t.isLocal &&
|
|
88
|
+
a.on(g.ConnectionStateChanged, Ee).on(g.ConnectionQualityChanged, Re).on(g.ParticipantConnected, be).on(g.ParticipantDisconnected, Le).on(g.TrackSubscribed, Me).on(g.TrackUnsubscribed, ke).on(g.DataReceived, Ve).on(g.MediaDevicesError, Fe).on(g.TranscriptionReceived, we).on(g.EncryptionError, Ue).on(g.TrackSubscriptionFailed, je);
|
|
89
|
+
function we(e, t) {
|
|
90
|
+
t != null && t.isLocal && he.update();
|
|
89
91
|
}
|
|
90
|
-
async function
|
|
91
|
-
const e =
|
|
92
|
+
async function Ae() {
|
|
93
|
+
const e = on();
|
|
92
94
|
if (!(!a || Object.keys(e).length === 0))
|
|
93
95
|
try {
|
|
94
96
|
await a.localParticipant.setAttributes(e);
|
|
@@ -97,24 +99,24 @@ async function un(l, C, u) {
|
|
|
97
99
|
}
|
|
98
100
|
}
|
|
99
101
|
try {
|
|
100
|
-
await a.connect($, _), i("LiveKit room joined successfully"),
|
|
102
|
+
await a.connect($, _), i("LiveKit room joined successfully"), Ae(), R = setTimeout(() => {
|
|
101
103
|
var t;
|
|
102
104
|
i(
|
|
103
|
-
`Track subscription timeout - no track subscribed within ${
|
|
105
|
+
`Track subscription timeout - no track subscribed within ${Ce / 1e3} seconds after connect`
|
|
104
106
|
), R = null;
|
|
105
|
-
const e =
|
|
106
|
-
|
|
107
|
-
error:
|
|
107
|
+
const e = j("Track subscription timeout");
|
|
108
|
+
ne.track("connectivity-error", {
|
|
109
|
+
error: Xe(e),
|
|
108
110
|
sessionId: v
|
|
109
|
-
}), (t = n.onError) == null || t.call(n, e, { sessionId: v }),
|
|
110
|
-
},
|
|
111
|
+
}), (t = n.onError) == null || t.call(n, e, { sessionId: v }), Y("internal:track-subscription-timeout");
|
|
112
|
+
}, Ce);
|
|
111
113
|
} catch (e) {
|
|
112
|
-
|
|
114
|
+
Se(e, i, n);
|
|
113
115
|
}
|
|
114
|
-
|
|
115
|
-
"stream-type":
|
|
116
|
+
ne.enrich({
|
|
117
|
+
"stream-type": te
|
|
116
118
|
});
|
|
117
|
-
function
|
|
119
|
+
function Ee(e) {
|
|
118
120
|
var t, o, r, c;
|
|
119
121
|
switch (i("Connection state changed:", e), e) {
|
|
120
122
|
case I.Connecting:
|
|
@@ -124,7 +126,11 @@ async function un(l, C, u) {
|
|
|
124
126
|
i("LiveKit room connected successfully"), E = !0;
|
|
125
127
|
break;
|
|
126
128
|
case I.Disconnected:
|
|
127
|
-
i("LiveKit room disconnected"), E = !1, K = !1, P.publication = null, Q.publication = null, (o = n.onConnectionStateChange) == null || o.call(
|
|
129
|
+
i("LiveKit room disconnected"), E = !1, K = !1, P.publication = null, Q.publication = null, (o = n.onConnectionStateChange) == null || o.call(
|
|
130
|
+
n,
|
|
131
|
+
A.Disconnected,
|
|
132
|
+
q ?? "livekit:disconnected"
|
|
133
|
+
);
|
|
128
134
|
break;
|
|
129
135
|
case I.Reconnecting:
|
|
130
136
|
i("LiveKit room reconnecting..."), (r = n.onConnectionStateChange) == null || r.call(n, A.Connecting, "livekit:reconnecting");
|
|
@@ -134,25 +140,25 @@ async function un(l, C, u) {
|
|
|
134
140
|
break;
|
|
135
141
|
}
|
|
136
142
|
}
|
|
137
|
-
function
|
|
143
|
+
function Re(e, t) {
|
|
138
144
|
var o;
|
|
139
|
-
i("Connection quality:", e), t != null && t.isLocal && ((o = n.onConnectivityStateChange) == null || o.call(n,
|
|
145
|
+
i("Connection quality:", e), t != null && t.isLocal && ((o = n.onConnectivityStateChange) == null || o.call(n, un[e]));
|
|
140
146
|
}
|
|
141
|
-
function
|
|
147
|
+
function be(e) {
|
|
142
148
|
i("Participant connected:", e.identity);
|
|
143
149
|
}
|
|
144
|
-
function
|
|
145
|
-
i("Participant disconnected:", e.identity),
|
|
150
|
+
function Le(e) {
|
|
151
|
+
i("Participant disconnected:", e.identity), Y("livekit:participant-disconnected");
|
|
146
152
|
}
|
|
147
|
-
function
|
|
153
|
+
function Pe() {
|
|
148
154
|
var e;
|
|
149
|
-
|
|
155
|
+
O !== b.Start && (i("CALLBACK: onVideoStateChange(Start)"), O = b.Start, (e = n.onVideoStateChange) == null || e.call(n, b.Start));
|
|
150
156
|
}
|
|
151
|
-
function
|
|
157
|
+
function oe(e) {
|
|
152
158
|
var t;
|
|
153
|
-
|
|
159
|
+
O !== b.Stop && (i("CALLBACK: onVideoStateChange(Stop)"), O = b.Stop, (t = n.onVideoStateChange) == null || t.call(n, b.Stop, e));
|
|
154
160
|
}
|
|
155
|
-
function
|
|
161
|
+
function Me(e, t, o) {
|
|
156
162
|
var c, d, s;
|
|
157
163
|
i(`Track subscribed: ${e.kind} from ${o.identity}`);
|
|
158
164
|
const r = e.mediaStreamTrack;
|
|
@@ -160,39 +166,39 @@ async function un(l, C, u) {
|
|
|
160
166
|
i(`No mediaStreamTrack available for ${e.kind}`);
|
|
161
167
|
return;
|
|
162
168
|
}
|
|
163
|
-
L ? (L.addTrack(r), i(`Added ${e.kind} track to shared MediaStream`)) : (L = new MediaStream([r]), i(`Created shared MediaStream with ${e.kind} track`)), e.kind === "audio" && (S =
|
|
169
|
+
L ? (L.addTrack(r), i(`Added ${e.kind} track to shared MediaStream`)) : (L = new MediaStream([r]), i(`Created shared MediaStream with ${e.kind} track`)), e.kind === "audio" && (S = Ye(
|
|
164
170
|
() => e.getRTCStatsReport(),
|
|
165
171
|
({ sttLatency: p, serviceLatency: T }) => {
|
|
166
|
-
var
|
|
167
|
-
const V =
|
|
172
|
+
var le, fe, pe;
|
|
173
|
+
const V = he.get(!0);
|
|
168
174
|
let F = 0;
|
|
169
175
|
if (p) {
|
|
170
|
-
const
|
|
171
|
-
F =
|
|
176
|
+
const ge = ((fe = (le = h == null ? void 0 : h.getReport()) == null ? void 0 : le.webRTCStats) == null ? void 0 : fe.avgRtt) ?? 0;
|
|
177
|
+
F = ge > 0 ? Math.round(ge * 1e3) : 0;
|
|
172
178
|
}
|
|
173
179
|
const D = V > 0 ? V + (p ?? 0) + F : void 0, w = D !== void 0 && T !== void 0 ? D - T : void 0;
|
|
174
|
-
(
|
|
180
|
+
(pe = n.onFirstAudioDetected) == null || pe.call(n, { latency: D, networkLatency: w });
|
|
175
181
|
}
|
|
176
|
-
)), e.kind === "video" && ((c = n.onStreamReady) == null || c.call(n), i("CALLBACK: onSrcObjectReady"), (d = n.onSrcObjectReady) == null || d.call(n, L), K || (K = !0, i("CALLBACK: onConnectionStateChange(Connected)"), (s = n.onConnectionStateChange) == null || s.call(n, A.Connected, "livekit:track-subscribed")), h =
|
|
182
|
+
)), e.kind === "video" && ((c = n.onStreamReady) == null || c.call(n), i("CALLBACK: onSrcObjectReady"), (d = n.onSrcObjectReady) == null || d.call(n, L), K || (K = !0, i("CALLBACK: onConnectionStateChange(Connected)"), (s = n.onConnectionStateChange) == null || s.call(n, A.Connected, "livekit:track-subscribed")), h = Ze(
|
|
177
183
|
() => e.getRTCStatsReport(),
|
|
178
184
|
() => E,
|
|
179
|
-
|
|
185
|
+
en,
|
|
180
186
|
(p, T) => {
|
|
181
|
-
i(`Video state change: ${p}`), p === b.Start ? (R && (clearTimeout(R), R = null, i("Track subscription timeout cleared")),
|
|
187
|
+
i(`Video state change: ${p}`), p === b.Start ? (R && (clearTimeout(R), R = null, i("Track subscription timeout cleared")), Pe()) : p === b.Stop && oe(T);
|
|
182
188
|
}
|
|
183
189
|
), h.start());
|
|
184
190
|
}
|
|
185
|
-
function
|
|
186
|
-
i(`Track unsubscribed: ${e.kind} from ${o.identity}`), e.kind === "audio" && (S == null || S.destroy(), S = null), e.kind === "video" && (
|
|
191
|
+
function ke(e, t, o) {
|
|
192
|
+
i(`Track unsubscribed: ${e.kind} from ${o.identity}`), e.kind === "audio" && (S == null || S.destroy(), S = null), e.kind === "video" && (oe(h == null ? void 0 : h.getReport()), h == null || h.stop(), h = null);
|
|
187
193
|
}
|
|
188
|
-
function
|
|
194
|
+
function re(e, t) {
|
|
189
195
|
var r;
|
|
190
|
-
const o =
|
|
196
|
+
const o = an[e];
|
|
191
197
|
o && ((r = n.onMessage) == null || r.call(n, o, { event: o, ...t }));
|
|
192
198
|
}
|
|
193
|
-
function
|
|
199
|
+
function G(e, t) {
|
|
194
200
|
var o, r, c, d;
|
|
195
|
-
if (e ===
|
|
201
|
+
if (e === l.ToolCallStarted) {
|
|
196
202
|
const s = t;
|
|
197
203
|
y.set(s.call_id, {
|
|
198
204
|
call: {
|
|
@@ -202,23 +208,23 @@ async function un(l, C, u) {
|
|
|
202
208
|
},
|
|
203
209
|
interruptible: s.interruptible === !0,
|
|
204
210
|
turnId: s.turn_id ?? x
|
|
205
|
-
}), N(), z(), M = m.ToolActive, (o = n.onAgentActivityStateChange) == null || o.call(n, m.ToolActive), (r = n.onToolEvent) == null || r.call(n,
|
|
211
|
+
}), N(), z(), M = m.ToolActive, (o = n.onAgentActivityStateChange) == null || o.call(n, m.ToolActive), (r = n.onToolEvent) == null || r.call(n, l.ToolCallStarted, s);
|
|
206
212
|
return;
|
|
207
213
|
}
|
|
208
|
-
if (e ===
|
|
214
|
+
if (e === l.ToolCallDone) {
|
|
209
215
|
const s = t;
|
|
210
|
-
|
|
216
|
+
ae(s.call_id), (c = n.onToolEvent) == null || c.call(n, l.ToolCallDone, s);
|
|
211
217
|
return;
|
|
212
218
|
}
|
|
213
|
-
if (e ===
|
|
219
|
+
if (e === l.ToolCallError) {
|
|
214
220
|
const s = t;
|
|
215
|
-
|
|
221
|
+
ae(s.call_id), (d = n.onToolEvent) == null || d.call(n, l.ToolCallError, s);
|
|
216
222
|
}
|
|
217
223
|
}
|
|
218
|
-
function
|
|
224
|
+
function ae(e) {
|
|
219
225
|
y.delete(e) && (N(), z());
|
|
220
226
|
}
|
|
221
|
-
function
|
|
227
|
+
function Ie(e) {
|
|
222
228
|
let t = !1;
|
|
223
229
|
for (const [o, r] of y)
|
|
224
230
|
r.call.executionMode === "blocking" && (e !== null && r.turnId !== null && r.turnId !== e || (y.delete(o), t = !0));
|
|
@@ -233,12 +239,12 @@ async function un(l, C, u) {
|
|
|
233
239
|
var e;
|
|
234
240
|
(e = n.onRunningToolCallsChange) == null || e.call(
|
|
235
241
|
n,
|
|
236
|
-
y.size === 0 ?
|
|
242
|
+
y.size === 0 ? cn : [...y.values()].map(({ call: t }) => t)
|
|
237
243
|
);
|
|
238
244
|
}
|
|
239
|
-
function
|
|
245
|
+
function _e(e, t) {
|
|
240
246
|
var o, r, c;
|
|
241
|
-
if (e ===
|
|
247
|
+
if (e === l.StreamVideoCreated) {
|
|
242
248
|
M = m.Talking, (o = n.onAgentActivityStateChange) == null || o.call(n, m.Talking), S == null || S.arm({
|
|
243
249
|
sttLatency: (r = t == null ? void 0 : t.stt) == null ? void 0 : r.latency,
|
|
244
250
|
serviceLatency: t == null ? void 0 : t.serviceLatency
|
|
@@ -256,61 +262,66 @@ async function un(l, C, u) {
|
|
|
256
262
|
u.debug && ((p = t == null ? void 0 : t.metadata) != null && p.sentiment) && (c.sentiment = {
|
|
257
263
|
id: t.metadata.sentiment.id,
|
|
258
264
|
name: t.metadata.sentiment.sentiment
|
|
259
|
-
}), (T = n.onMessage) == null || T.call(n, e, c),
|
|
265
|
+
}), (T = n.onMessage) == null || T.call(n, e, c), _e(e, t);
|
|
260
266
|
}
|
|
261
|
-
function
|
|
267
|
+
function $e(e, t) {
|
|
262
268
|
var o;
|
|
263
269
|
(o = n.onMessage) == null || o.call(n, J.Transcribe, { event: J.Transcribe, ...t }), queueMicrotask(() => {
|
|
264
270
|
var r;
|
|
265
271
|
(r = n.onAgentActivityStateChange) == null || r.call(n, m.Loading);
|
|
266
272
|
});
|
|
267
273
|
}
|
|
268
|
-
function
|
|
274
|
+
function De(e, t) {
|
|
269
275
|
var o;
|
|
270
276
|
x = (t == null ? void 0 : t.turn_id) ?? null, M = m.Loading, (o = n.onAgentActivityStateChange) == null || o.call(n, m.Loading);
|
|
271
277
|
}
|
|
272
|
-
function
|
|
278
|
+
function Ke(e, t) {
|
|
273
279
|
var r;
|
|
274
280
|
const o = (t == null ? void 0 : t.turn_id) ?? null;
|
|
275
|
-
x !== null && o !== null && o < x || (
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
[
|
|
282
|
-
[
|
|
283
|
-
[
|
|
284
|
-
[
|
|
285
|
-
[
|
|
286
|
-
[
|
|
287
|
-
[
|
|
288
|
-
[
|
|
289
|
-
[
|
|
281
|
+
x !== null && o !== null && o < x || (Ie(o), M = m.Idle, (r = n.onAgentActivityStateChange) == null || r.call(n, m.Idle));
|
|
282
|
+
}
|
|
283
|
+
function ce(e, t) {
|
|
284
|
+
q = (t == null ? void 0 : t.reason) ?? null;
|
|
285
|
+
}
|
|
286
|
+
const xe = {
|
|
287
|
+
[l.ChatAnswer]: re,
|
|
288
|
+
[l.ChatPartial]: re,
|
|
289
|
+
[l.ToolCallStarted]: G,
|
|
290
|
+
[l.ToolCallDone]: G,
|
|
291
|
+
[l.ToolCallError]: G,
|
|
292
|
+
[l.StreamVideoCreated]: B,
|
|
293
|
+
[l.StreamVideoDone]: B,
|
|
294
|
+
[l.StreamVideoError]: B,
|
|
295
|
+
[l.StreamVideoRejected]: B,
|
|
296
|
+
[l.ChatAudioTranscribed]: $e,
|
|
297
|
+
[l.TurnStarted]: De,
|
|
298
|
+
[l.TurnEnded]: Ke,
|
|
299
|
+
[l.StreamDone]: ce,
|
|
300
|
+
[l.StreamFailed]: ce
|
|
290
301
|
};
|
|
291
|
-
function
|
|
302
|
+
function Ve(e, t, o, r) {
|
|
292
303
|
const c = new TextDecoder().decode(e);
|
|
293
304
|
try {
|
|
294
305
|
const d = JSON.parse(c), s = r || d.subject;
|
|
295
306
|
if (i("Data received:", { subject: s, data: d }), !s) return;
|
|
296
|
-
const p =
|
|
307
|
+
const p = xe[s];
|
|
297
308
|
p == null || p(s, d);
|
|
298
309
|
} catch (d) {
|
|
299
310
|
i("Failed to parse data channel message:", d);
|
|
300
311
|
}
|
|
301
312
|
}
|
|
302
|
-
function
|
|
313
|
+
function Fe(e) {
|
|
303
314
|
var t;
|
|
304
|
-
i("Media devices error:", e), (t = n.onError) == null || t.call(n,
|
|
315
|
+
i("Media devices error:", e), (t = n.onError) == null || t.call(n, j(), { sessionId: v });
|
|
305
316
|
}
|
|
306
|
-
function
|
|
317
|
+
function Ue(e) {
|
|
307
318
|
var t;
|
|
308
|
-
i("Encryption error:", e), (t = n.onError) == null || t.call(n,
|
|
319
|
+
i("Encryption error:", e), (t = n.onError) == null || t.call(n, j(), { sessionId: v });
|
|
309
320
|
}
|
|
310
|
-
function
|
|
321
|
+
function je(e, t, o) {
|
|
311
322
|
i("Track subscription failed:", { trackSid: e, participant: t, reason: o });
|
|
312
323
|
}
|
|
313
|
-
function
|
|
324
|
+
function Oe(e, t, o) {
|
|
314
325
|
for (const [r, c] of o)
|
|
315
326
|
if (c.source === t && c.track) {
|
|
316
327
|
const d = c.track.mediaStreamTrack;
|
|
@@ -319,7 +330,7 @@ async function un(l, C, u) {
|
|
|
319
330
|
}
|
|
320
331
|
return null;
|
|
321
332
|
}
|
|
322
|
-
async function
|
|
333
|
+
async function se(e, t, o, r, c, d) {
|
|
323
334
|
var V, F, D;
|
|
324
335
|
if (!E || !a)
|
|
325
336
|
throw i(`Room is not connected, cannot publish ${r} stream`), new Error("Room is not connected");
|
|
@@ -330,7 +341,7 @@ async function un(l, C, u) {
|
|
|
330
341
|
const s = o(t);
|
|
331
342
|
if (s.length === 0)
|
|
332
343
|
throw new Error(`No ${r} track found in the provided MediaStream`);
|
|
333
|
-
const p = s[0], T =
|
|
344
|
+
const p = s[0], T = Oe(p, r, c());
|
|
334
345
|
if (T) {
|
|
335
346
|
i(`${r} track is already published, skipping`, {
|
|
336
347
|
trackId: p.id,
|
|
@@ -351,7 +362,7 @@ async function un(l, C, u) {
|
|
|
351
362
|
e.isPublishing = !1;
|
|
352
363
|
}
|
|
353
364
|
}
|
|
354
|
-
async function
|
|
365
|
+
async function ue(e, t) {
|
|
355
366
|
if (!(!e.publication || !e.publication.track))
|
|
356
367
|
try {
|
|
357
368
|
a && (await a.localParticipant.unpublishTrack(e.publication.track, !1), i(`${t} track unpublished`));
|
|
@@ -361,20 +372,20 @@ async function un(l, C, u) {
|
|
|
361
372
|
e.publication = null;
|
|
362
373
|
}
|
|
363
374
|
}
|
|
364
|
-
async function
|
|
365
|
-
return
|
|
375
|
+
async function Ne(e) {
|
|
376
|
+
return se(
|
|
366
377
|
P,
|
|
367
378
|
e,
|
|
368
379
|
(t) => t.getAudioTracks(),
|
|
369
|
-
|
|
380
|
+
ee.Source.Microphone,
|
|
370
381
|
() => a.localParticipant.audioTrackPublications,
|
|
371
|
-
|
|
382
|
+
H
|
|
372
383
|
);
|
|
373
384
|
}
|
|
374
|
-
async function
|
|
375
|
-
return
|
|
385
|
+
async function H() {
|
|
386
|
+
return ue(P, "Microphone");
|
|
376
387
|
}
|
|
377
|
-
async function
|
|
388
|
+
async function ze(e) {
|
|
378
389
|
if (!E || !a)
|
|
379
390
|
throw i("Cannot replace microphone track: room is not connected"), new Error("Room is not connected");
|
|
380
391
|
if (e.kind !== "audio")
|
|
@@ -390,26 +401,26 @@ async function un(l, C, u) {
|
|
|
390
401
|
P.isPublishing = !1;
|
|
391
402
|
}
|
|
392
403
|
}
|
|
393
|
-
async function
|
|
394
|
-
return
|
|
404
|
+
async function Be(e) {
|
|
405
|
+
return se(
|
|
395
406
|
Q,
|
|
396
407
|
e,
|
|
397
408
|
(t) => t.getVideoTracks(),
|
|
398
|
-
|
|
409
|
+
ee.Source.Camera,
|
|
399
410
|
() => a.localParticipant.videoTrackPublications,
|
|
400
|
-
|
|
411
|
+
X
|
|
401
412
|
);
|
|
402
413
|
}
|
|
403
|
-
async function
|
|
404
|
-
return
|
|
414
|
+
async function X() {
|
|
415
|
+
return ue(Q, "Camera");
|
|
405
416
|
}
|
|
406
|
-
function
|
|
417
|
+
function Je() {
|
|
407
418
|
L && (L.getTracks().forEach((e) => e.stop()), L = null);
|
|
408
419
|
}
|
|
409
|
-
async function
|
|
420
|
+
async function Z(e, t) {
|
|
410
421
|
var o, r;
|
|
411
422
|
if (!E || !a) {
|
|
412
|
-
i("Room is not connected for sending messages"), (o = n.onError) == null || o.call(n,
|
|
423
|
+
i("Room is not connected for sending messages"), (o = n.onError) == null || o.call(n, j(), {
|
|
413
424
|
sessionId: v
|
|
414
425
|
});
|
|
415
426
|
return;
|
|
@@ -417,19 +428,19 @@ async function un(l, C, u) {
|
|
|
417
428
|
try {
|
|
418
429
|
await a.localParticipant.sendText(t, { topic: e }), i("Message sent successfully:", t);
|
|
419
430
|
} catch (c) {
|
|
420
|
-
i("Failed to send message:", c), (r = n.onError) == null || r.call(n,
|
|
431
|
+
i("Failed to send message:", c), (r = n.onError) == null || r.call(n, j(), { sessionId: v });
|
|
421
432
|
}
|
|
422
433
|
}
|
|
423
|
-
async function
|
|
434
|
+
async function Y(e) {
|
|
424
435
|
var t, o;
|
|
425
|
-
R && (clearTimeout(R), R = null), S == null || S.destroy(), S = null, a && ((t = n.onConnectionStateChange) == null || t.call(n, A.Disconnecting, e), await Promise.all([
|
|
436
|
+
R && (clearTimeout(R), R = null), S == null || S.destroy(), S = null, a && ((t = n.onConnectionStateChange) == null || t.call(n, A.Disconnecting, e), await Promise.all([H(), X()]), await a.disconnect()), Je(), E = !1, K = !1, y.size > 0 && (y.clear(), N(), z()), x = null, (o = n.onAgentActivityStateChange) == null || o.call(n, m.Idle), M = m.Idle;
|
|
426
437
|
}
|
|
427
438
|
return {
|
|
428
439
|
speak(e) {
|
|
429
440
|
const t = typeof e == "string" ? e : JSON.stringify(e);
|
|
430
|
-
return
|
|
441
|
+
return Z(me.Speak, t);
|
|
431
442
|
},
|
|
432
|
-
disconnect: () =>
|
|
443
|
+
disconnect: () => Y("user:disconnect"),
|
|
433
444
|
async reconnect() {
|
|
434
445
|
var e, t;
|
|
435
446
|
if ((a == null ? void 0 : a.state) === I.Connected) {
|
|
@@ -438,7 +449,7 @@ async function un(l, C, u) {
|
|
|
438
449
|
}
|
|
439
450
|
if (!a || !$ || !_)
|
|
440
451
|
throw i("Cannot reconnect: missing room, URL or token"), new Error("Cannot reconnect: session not available");
|
|
441
|
-
i("Reconnecting to LiveKit room, state:", a.state), K = !1, (e = n.onConnectionStateChange) == null || e.call(n, A.Connecting, "user:reconnect");
|
|
452
|
+
i("Reconnecting to LiveKit room, state:", a.state), K = !1, q = null, (e = n.onConnectionStateChange) == null || e.call(n, A.Connecting, "user:reconnect");
|
|
442
453
|
try {
|
|
443
454
|
if (await a.connect($, _), i("Room reconnected"), E = !0, a.remoteParticipants.size === 0) {
|
|
444
455
|
if (i("Waiting for agent to join..."), !await new Promise((r) => {
|
|
@@ -456,14 +467,14 @@ async function un(l, C, u) {
|
|
|
456
467
|
throw i("Failed to reconnect:", o), (t = n.onConnectionStateChange) == null || t.call(n, A.Fail, "user:reconnect-failed"), o;
|
|
457
468
|
}
|
|
458
469
|
},
|
|
459
|
-
sendDataChannelMessage:
|
|
460
|
-
publishMicrophoneStream:
|
|
461
|
-
unpublishMicrophoneStream:
|
|
462
|
-
replaceMicrophoneTrack:
|
|
463
|
-
publishCameraStream:
|
|
464
|
-
unpublishCameraStream:
|
|
470
|
+
sendDataChannelMessage: Z,
|
|
471
|
+
publishMicrophoneStream: Ne,
|
|
472
|
+
unpublishMicrophoneStream: H,
|
|
473
|
+
replaceMicrophoneTrack: ze,
|
|
474
|
+
publishCameraStream: Be,
|
|
475
|
+
unpublishCameraStream: X,
|
|
465
476
|
interrupt(e) {
|
|
466
|
-
e !== "text" &&
|
|
477
|
+
e !== "text" && Z(me.Interrupt, "");
|
|
467
478
|
},
|
|
468
479
|
registerRpcMethod(e, t) {
|
|
469
480
|
a == null || a.registerRpcMethod(e, t);
|
|
@@ -473,12 +484,12 @@ async function un(l, C, u) {
|
|
|
473
484
|
},
|
|
474
485
|
sessionId: v,
|
|
475
486
|
streamId: v,
|
|
476
|
-
streamType:
|
|
477
|
-
interruptAvailable:
|
|
487
|
+
streamType: te,
|
|
488
|
+
interruptAvailable: ie,
|
|
478
489
|
isInterruptible: W
|
|
479
490
|
};
|
|
480
491
|
}
|
|
481
492
|
export {
|
|
482
|
-
|
|
483
|
-
|
|
493
|
+
ln as createLiveKitStreamingManager,
|
|
494
|
+
Se as handleInitError
|
|
484
495
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { StreamingManager } from '../streaming-manager';
|
|
2
|
-
import { Agent, AgentManagerOptions, AgentsAPI, AudioDetectionMetrics, Chat, ChatProgressCallback, CreateSessionV2Options, CreateStreamOptions } from '../../types';
|
|
2
|
+
import { Agent, AgentManagerOptions, AgentsAPI, AudioDetectionMetrics, Chat, ChatProgressCallback, CreateSessionV2Options, CreateStreamOptions, StreamingManagerOptions } from '../../types';
|
|
3
3
|
import { Analytics } from '../analytics/mixpanel';
|
|
4
4
|
|
|
5
5
|
type ConnectToManagerOptions = AgentManagerOptions & {
|
|
@@ -10,6 +10,7 @@ type ConnectToManagerOptions = AgentManagerOptions & {
|
|
|
10
10
|
onFirstAudioDetected?: (metrics: AudioDetectionMetrics) => void;
|
|
11
11
|
};
|
|
12
12
|
chatId?: string;
|
|
13
|
+
rpcMethods?: StreamingManagerOptions['rpcMethods'];
|
|
13
14
|
};
|
|
14
15
|
export declare function initializeStreamAndChat(agent: Agent, options: ConnectToManagerOptions, agentsApi: AgentsAPI, analytics: Analytics, chat?: Chat): Promise<{
|
|
15
16
|
chat?: Chat;
|
|
@@ -6,7 +6,7 @@ export interface ChatEventQueue {
|
|
|
6
6
|
[sequence: number]: string;
|
|
7
7
|
answer?: string;
|
|
8
8
|
}
|
|
9
|
-
export declare function createMessageEventQueue(analytics: Analytics, items: AgentManagerItems, options: AgentManagerOptions, agentEntity: Agent, onStreamDone: () => void): {
|
|
9
|
+
export declare function createMessageEventQueue(analytics: Analytics, items: AgentManagerItems, options: AgentManagerOptions, agentEntity: Agent, onStreamDone: (reason?: string) => void): {
|
|
10
10
|
clearQueue: () => void;
|
|
11
11
|
onMessage: (event: ChatProgress | StreamEvents, data: any) => void;
|
|
12
12
|
};
|
|
@@ -42,8 +42,9 @@ interface ManagerCallbacks {
|
|
|
42
42
|
/**
|
|
43
43
|
* Optional callback will be triggered each time the RTC connection changes state
|
|
44
44
|
* @param state
|
|
45
|
+
* @param reason - a `StreamEndReason` when the server ended the stream, otherwise a diagnostic string
|
|
45
46
|
*/
|
|
46
|
-
onConnectionStateChange?(state: ConnectionState): void;
|
|
47
|
+
onConnectionStateChange?(state: ConnectionState, reason?: string): void;
|
|
47
48
|
/**
|
|
48
49
|
* Optional callback function that will be triggered each time video events happen
|
|
49
50
|
* @param state
|
|
@@ -70,6 +70,10 @@ export declare enum StreamType {
|
|
|
70
70
|
Legacy = "legacy",
|
|
71
71
|
Fluent = "fluent"
|
|
72
72
|
}
|
|
73
|
+
/** @internal */
|
|
74
|
+
export type RpcMethodHandler = (data: {
|
|
75
|
+
payload: string;
|
|
76
|
+
}) => Promise<string>;
|
|
73
77
|
export interface ManagerCallbacks {
|
|
74
78
|
onMessage?: ChatProgressCallback;
|
|
75
79
|
onConnectionStateChange?: (state: ConnectionState, reason?: string) => void;
|
|
@@ -128,6 +132,12 @@ export interface StreamingManagerOptions {
|
|
|
128
132
|
* Supported by LiveKit streaming managers.
|
|
129
133
|
*/
|
|
130
134
|
microphoneStream?: MediaStream;
|
|
135
|
+
/**
|
|
136
|
+
* RPC methods to register on the room before it connects, so the agent can
|
|
137
|
+
* call them from the moment this participant joins.
|
|
138
|
+
* @internal
|
|
139
|
+
*/
|
|
140
|
+
rpcMethods?: ReadonlyMap<string, RpcMethodHandler>;
|
|
131
141
|
}
|
|
132
142
|
export interface SlimRTCStatsReport {
|
|
133
143
|
index: number;
|
|
@@ -240,6 +250,15 @@ export type ToolEventPayload = ToolCallStartedPayload | ToolCallDonePayload | To
|
|
|
240
250
|
export interface TurnEventPayload {
|
|
241
251
|
turn_id: number | null;
|
|
242
252
|
}
|
|
253
|
+
export declare enum StreamEndReason {
|
|
254
|
+
Ok = "ok",
|
|
255
|
+
UnknownError = "unknown_error",
|
|
256
|
+
NetworkIssue = "network_issue",
|
|
257
|
+
MessageLimit = "message_limit",
|
|
258
|
+
TimeLimit = "time_limit",
|
|
259
|
+
Inactivity = "inactivity",
|
|
260
|
+
EndedByAgent = "ended_by_agent"
|
|
261
|
+
}
|
|
243
262
|
export type ToolEventCallback = {
|
|
244
263
|
(event: StreamEvents.ToolCallStarted, data: ToolCallStartedPayload): void;
|
|
245
264
|
(event: StreamEvents.ToolCallDone, data: ToolCallDonePayload): void;
|