@applica-software-guru/persona-sdk 0.1.44 → 0.1.45
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/bundle.cjs.js +2 -2
- package/dist/bundle.cjs.js.map +1 -1
- package/dist/bundle.es.js +131 -129
- package/dist/bundle.es.js.map +1 -1
- package/dist/bundle.iife.js +2 -2
- package/dist/bundle.iife.js.map +1 -1
- package/dist/bundle.umd.js +2 -2
- package/dist/bundle.umd.js.map +1 -1
- package/dist/protocol/webrtc.d.ts.map +1 -1
- package/package.json +1 -2
- package/playground/src/chat.tsx +1 -1
- package/src/protocol/webrtc.ts +3 -1
package/dist/bundle.es.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var U = Object.defineProperty;
|
|
2
2
|
var J = (i, t, e) => t in i ? U(i, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : i[t] = e;
|
|
3
3
|
var o = (i, t, e) => J(i, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
-
import { createContext as q, useContext as N, useState as
|
|
4
|
+
import { createContext as q, useContext as N, useState as b, useRef as K, useMemo as _, useEffect as B, useCallback as v } from "react";
|
|
5
5
|
import { useExternalStoreRuntime as Y, AssistantRuntimeProvider as G } from "@assistant-ui/react";
|
|
6
6
|
var z = { exports: {} }, w = {};
|
|
7
7
|
/**
|
|
@@ -19,16 +19,16 @@ function V() {
|
|
|
19
19
|
M = 1;
|
|
20
20
|
var i = Symbol.for("react.transitional.element"), t = Symbol.for("react.fragment");
|
|
21
21
|
function e(s, n, a) {
|
|
22
|
-
var
|
|
23
|
-
if (a !== void 0 && (
|
|
22
|
+
var c = null;
|
|
23
|
+
if (a !== void 0 && (c = "" + a), n.key !== void 0 && (c = "" + n.key), "key" in n) {
|
|
24
24
|
a = {};
|
|
25
|
-
for (var
|
|
26
|
-
|
|
25
|
+
for (var r in n)
|
|
26
|
+
r !== "key" && (a[r] = n[r]);
|
|
27
27
|
} else a = n;
|
|
28
28
|
return n = a.ref, {
|
|
29
29
|
$$typeof: i,
|
|
30
30
|
type: s,
|
|
31
|
-
key:
|
|
31
|
+
key: c,
|
|
32
32
|
ref: n !== void 0 ? n : null,
|
|
33
33
|
props: a
|
|
34
34
|
};
|
|
@@ -136,8 +136,8 @@ class T extends x {
|
|
|
136
136
|
this.session = e;
|
|
137
137
|
}
|
|
138
138
|
async send(e) {
|
|
139
|
-
const { apiUrl: s, apiKey: n, agentId: a } = this.config,
|
|
140
|
-
body: JSON.stringify({ userMessage:
|
|
139
|
+
const { apiUrl: s, apiKey: n, agentId: a } = this.config, c = this.session ?? "new", r = e, h = await (await fetch(`${s}/agents/${a}/sessions/${c}/messages`, {
|
|
140
|
+
body: JSON.stringify({ userMessage: r }),
|
|
141
141
|
method: "POST",
|
|
142
142
|
headers: {
|
|
143
143
|
"Content-Type": "application/json",
|
|
@@ -148,7 +148,7 @@ class T extends x {
|
|
|
148
148
|
this.notifyMessages(h.response.messages);
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
|
-
class
|
|
151
|
+
class $ extends x {
|
|
152
152
|
constructor(e) {
|
|
153
153
|
super();
|
|
154
154
|
o(this, "status");
|
|
@@ -169,13 +169,13 @@ class I extends x {
|
|
|
169
169
|
(s = this.config.logger) == null || s.debug("Syncing session with WebSocket protocol:", e), this.session = e, this.webSocket && this.status === "connected" && (this.disconnect(), this.connect(e));
|
|
170
170
|
}
|
|
171
171
|
connect(e) {
|
|
172
|
-
var
|
|
172
|
+
var r;
|
|
173
173
|
if (this.webSocket !== null && this.status === "connected")
|
|
174
174
|
return Promise.resolve(this.session);
|
|
175
175
|
const s = e || this.session || "new";
|
|
176
|
-
(
|
|
177
|
-
const n = encodeURIComponent(this.config.apiKey), a = this.config.agentId,
|
|
178
|
-
return this.setStatus("connecting"), this.webSocket = new WebSocket(
|
|
176
|
+
(r = this.config.logger) == null || r.debug("Connecting to WebSocket with sessionId:", s);
|
|
177
|
+
const n = encodeURIComponent(this.config.apiKey), a = this.config.agentId, c = `${this.config.webSocketUrl}?sessionCode=${s}&agentId=${a}&apiKey=${n}`;
|
|
178
|
+
return this.setStatus("connecting"), this.webSocket = new WebSocket(c), this.webSocket.addEventListener("open", () => {
|
|
179
179
|
this.setStatus("connected");
|
|
180
180
|
}), this.webSocket.addEventListener("message", (u) => {
|
|
181
181
|
const h = JSON.parse(u.data);
|
|
@@ -217,90 +217,92 @@ class Z {
|
|
|
217
217
|
this.config = t;
|
|
218
218
|
}
|
|
219
219
|
async connect(t) {
|
|
220
|
-
var
|
|
221
|
-
if (
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
220
|
+
var s;
|
|
221
|
+
if (this.isConnected) return;
|
|
222
|
+
this.isConnected = !0;
|
|
223
|
+
try {
|
|
224
|
+
this.localStream = await navigator.mediaDevices.getUserMedia({ audio: !0 });
|
|
225
|
+
} catch (n) {
|
|
226
|
+
(s = this.config.logger) == null || s.error("Error accessing microphone:", n);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
this.pc = new RTCPeerConnection({
|
|
230
|
+
iceServers: this.config.iceServers || [
|
|
231
|
+
{
|
|
232
|
+
urls: "stun:34.38.108.251:3478"
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
urls: "turn:34.38.108.251:3478",
|
|
236
|
+
username: "webrtc",
|
|
237
|
+
credential: "webrtc"
|
|
238
|
+
}
|
|
239
|
+
]
|
|
240
|
+
}), this.localStream.getTracks().forEach((n) => {
|
|
241
|
+
this.pc.addTrack(n, this.localStream);
|
|
242
|
+
}), this.pc.ontrack = (n) => {
|
|
243
|
+
n.streams[0].getTracks().forEach((c) => {
|
|
244
|
+
this.remoteStream.addTrack(c);
|
|
245
|
+
}), this.audioCtx || this._startAnalyzers();
|
|
246
|
+
const a = new Audio();
|
|
247
|
+
a.srcObject = this.remoteStream, a.play().catch((c) => {
|
|
248
|
+
var r;
|
|
249
|
+
(r = this.config.logger) == null || r.error("Error playing remote audio:", c);
|
|
250
|
+
});
|
|
251
|
+
}, this.pc.onicecandidate = (n) => {
|
|
252
|
+
var a;
|
|
253
|
+
n.candidate && ((a = this.ws) == null ? void 0 : a.readyState) === WebSocket.OPEN && this.ws.send(
|
|
254
|
+
JSON.stringify({
|
|
255
|
+
type: "CANDIDATE",
|
|
256
|
+
src: "client",
|
|
257
|
+
payload: { candidate: n.candidate }
|
|
258
|
+
})
|
|
259
|
+
);
|
|
260
|
+
}, this.pc.ondatachannel = (n) => {
|
|
261
|
+
const a = n.channel;
|
|
262
|
+
a.onmessage = (c) => {
|
|
263
|
+
this.messageCallbacks.forEach((r) => {
|
|
264
|
+
r(c);
|
|
250
265
|
});
|
|
251
|
-
}, this.pc.onicecandidate = (s) => {
|
|
252
|
-
var n;
|
|
253
|
-
s.candidate && ((n = this.ws) == null ? void 0 : n.readyState) === WebSocket.OPEN && this.ws.send(
|
|
254
|
-
JSON.stringify({
|
|
255
|
-
type: "CANDIDATE",
|
|
256
|
-
src: "client",
|
|
257
|
-
payload: { candidate: s.candidate }
|
|
258
|
-
})
|
|
259
|
-
);
|
|
260
|
-
}, this.pc.ondatachannel = (s) => {
|
|
261
|
-
const n = s.channel;
|
|
262
|
-
n.onmessage = (a) => {
|
|
263
|
-
this.messageCallbacks.forEach((r) => {
|
|
264
|
-
r(a);
|
|
265
|
-
});
|
|
266
|
-
};
|
|
267
|
-
}, this.ws = new WebSocket(this.config.webrtcUrl || "wss://persona.applica.guru/api/webrtc"), this.ws.onopen = async () => {
|
|
268
|
-
var r, l;
|
|
269
|
-
const s = await this.pc.createOffer();
|
|
270
|
-
await this.pc.setLocalDescription(s);
|
|
271
|
-
const n = {
|
|
272
|
-
agentId: this.config.agentId,
|
|
273
|
-
sessionCode: t
|
|
274
|
-
};
|
|
275
|
-
(r = this.config.logger) == null || r.debug("Opening connection to WebRTC server: ", n);
|
|
276
|
-
const a = {
|
|
277
|
-
type: "OFFER",
|
|
278
|
-
src: ((l = crypto.randomUUID) == null ? void 0 : l.call(crypto)) || "client_" + Date.now(),
|
|
279
|
-
payload: {
|
|
280
|
-
sdp: {
|
|
281
|
-
sdp: s.sdp,
|
|
282
|
-
type: s.type
|
|
283
|
-
},
|
|
284
|
-
connectionId: (Date.now() % 1e6).toString(),
|
|
285
|
-
metadata: n
|
|
286
|
-
}
|
|
287
|
-
};
|
|
288
|
-
this.ws.send(JSON.stringify(a));
|
|
289
|
-
}, this.ws.onmessage = async (s) => {
|
|
290
|
-
var a;
|
|
291
|
-
const n = JSON.parse(s.data);
|
|
292
|
-
if (n.type === "ANSWER")
|
|
293
|
-
await this.pc.setRemoteDescription(new RTCSessionDescription(n.payload.sdp));
|
|
294
|
-
else if (n.type === "CANDIDATE")
|
|
295
|
-
try {
|
|
296
|
-
await this.pc.addIceCandidate(new RTCIceCandidate(n.payload.candidate));
|
|
297
|
-
} catch (r) {
|
|
298
|
-
(a = this.config.logger) == null || a.error("Error adding ICE candidate:", r);
|
|
299
|
-
}
|
|
300
|
-
}, this.ws.onclose = () => {
|
|
301
|
-
this._stopAnalyzers();
|
|
302
266
|
};
|
|
303
|
-
}
|
|
267
|
+
};
|
|
268
|
+
const e = this.config.webrtcUrl || "wss://persona.applica.guru/api/webrtc";
|
|
269
|
+
this.ws = new WebSocket(`${e}?apiKey=${encodeURIComponent(this.config.apiKey)}`), this.ws.onopen = async () => {
|
|
270
|
+
var r, u;
|
|
271
|
+
const n = await this.pc.createOffer();
|
|
272
|
+
await this.pc.setLocalDescription(n);
|
|
273
|
+
const a = {
|
|
274
|
+
apiKey: this.config.apiKey,
|
|
275
|
+
agentId: this.config.agentId,
|
|
276
|
+
sessionCode: t
|
|
277
|
+
};
|
|
278
|
+
(r = this.config.logger) == null || r.debug("Opening connection to WebRTC server: ", a);
|
|
279
|
+
const c = {
|
|
280
|
+
type: "OFFER",
|
|
281
|
+
src: ((u = crypto.randomUUID) == null ? void 0 : u.call(crypto)) || "client_" + Date.now(),
|
|
282
|
+
payload: {
|
|
283
|
+
sdp: {
|
|
284
|
+
sdp: n.sdp,
|
|
285
|
+
type: n.type
|
|
286
|
+
},
|
|
287
|
+
connectionId: (Date.now() % 1e6).toString(),
|
|
288
|
+
metadata: a
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
this.ws.send(JSON.stringify(c));
|
|
292
|
+
}, this.ws.onmessage = async (n) => {
|
|
293
|
+
var c;
|
|
294
|
+
const a = JSON.parse(n.data);
|
|
295
|
+
if (a.type === "ANSWER")
|
|
296
|
+
await this.pc.setRemoteDescription(new RTCSessionDescription(a.payload.sdp));
|
|
297
|
+
else if (a.type === "CANDIDATE")
|
|
298
|
+
try {
|
|
299
|
+
await this.pc.addIceCandidate(new RTCIceCandidate(a.payload.candidate));
|
|
300
|
+
} catch (r) {
|
|
301
|
+
(c = this.config.logger) == null || c.error("Error adding ICE candidate:", r);
|
|
302
|
+
}
|
|
303
|
+
}, this.ws.onclose = () => {
|
|
304
|
+
this._stopAnalyzers();
|
|
305
|
+
};
|
|
304
306
|
}
|
|
305
307
|
async disconnect() {
|
|
306
308
|
var t;
|
|
@@ -341,11 +343,11 @@ class Z {
|
|
|
341
343
|
return;
|
|
342
344
|
const n = new Uint8Array(this.localAnalyser.frequencyBinCount), a = new Uint8Array(this.remoteAnalyser.frequencyBinCount);
|
|
343
345
|
this.localAnalyser.getByteFrequencyData(n), this.remoteAnalyser.getByteFrequencyData(a);
|
|
344
|
-
const
|
|
346
|
+
const c = n.reduce((u, h) => u + h, 0) / n.length, r = a.reduce((u, h) => u + h, 0) / a.length;
|
|
345
347
|
this.visualizerCallbacks.length > 0 && this.visualizerCallbacks.forEach((u) => {
|
|
346
348
|
u({
|
|
347
|
-
localAmplitude:
|
|
348
|
-
remoteAmplitude:
|
|
349
|
+
localAmplitude: c,
|
|
350
|
+
remoteAmplitude: r
|
|
349
351
|
});
|
|
350
352
|
}), this.analyzerFrame = requestAnimationFrame(s);
|
|
351
353
|
};
|
|
@@ -355,7 +357,7 @@ class Z {
|
|
|
355
357
|
this.analyzerFrame && (cancelAnimationFrame(this.analyzerFrame), this.analyzerFrame = null), this.localAnalyser = null, this.remoteAnalyser = null;
|
|
356
358
|
}
|
|
357
359
|
}
|
|
358
|
-
class
|
|
360
|
+
class I extends x {
|
|
359
361
|
constructor(e) {
|
|
360
362
|
super();
|
|
361
363
|
o(this, "status");
|
|
@@ -402,37 +404,37 @@ function ee({
|
|
|
402
404
|
session: n = "new",
|
|
403
405
|
...a
|
|
404
406
|
}) {
|
|
405
|
-
const [
|
|
407
|
+
const [c, r] = b(!1), [u, h] = b([]), [f, D] = b(n), [m, W] = b(/* @__PURE__ */ new Map()), R = K(!1), y = _(() => {
|
|
406
408
|
if (Array.isArray(t))
|
|
407
409
|
return t;
|
|
408
410
|
if (typeof t == "object" && t !== null) {
|
|
409
|
-
const
|
|
411
|
+
const l = i ? "localhost:8000" : "persona.applica.guru/api", p = i ? "http" : "https", g = i ? "ws" : "wss";
|
|
410
412
|
return Object.keys(t).map((d) => {
|
|
411
413
|
switch (d) {
|
|
412
414
|
case "rest":
|
|
413
|
-
const
|
|
414
|
-
return
|
|
415
|
-
apiUrl: `${p}://${
|
|
415
|
+
const C = t[d];
|
|
416
|
+
return C === !0 ? new T({
|
|
417
|
+
apiUrl: `${p}://${l}`,
|
|
416
418
|
apiKey: a.apiKey,
|
|
417
419
|
agentId: a.agentId,
|
|
418
420
|
logger: e
|
|
419
|
-
}) : new T(
|
|
421
|
+
}) : new T(C);
|
|
420
422
|
case "webrtc":
|
|
421
423
|
const A = t[d];
|
|
422
|
-
return A === !0 ? new
|
|
423
|
-
webrtcUrl: `${g}://${
|
|
424
|
+
return A === !0 ? new I({
|
|
425
|
+
webrtcUrl: `${g}://${l}/webrtc`,
|
|
424
426
|
apiKey: a.apiKey,
|
|
425
427
|
agentId: a.agentId,
|
|
426
428
|
logger: e
|
|
427
|
-
}) : new
|
|
429
|
+
}) : new I(A);
|
|
428
430
|
case "websocket":
|
|
429
431
|
const E = t[d];
|
|
430
|
-
return E === !0 ? new
|
|
431
|
-
webSocketUrl: `${g}://${
|
|
432
|
+
return E === !0 ? new $({
|
|
433
|
+
webSocketUrl: `${g}://${l}/websocket`,
|
|
432
434
|
apiKey: a.apiKey,
|
|
433
435
|
agentId: a.agentId,
|
|
434
436
|
logger: e
|
|
435
|
-
}) : new
|
|
437
|
+
}) : new $(E);
|
|
436
438
|
default:
|
|
437
439
|
throw new Error(`Unknown protocol: ${d}`);
|
|
438
440
|
}
|
|
@@ -440,27 +442,27 @@ function ee({
|
|
|
440
442
|
}
|
|
441
443
|
throw new Error("Invalid protocols configuration");
|
|
442
444
|
}, []);
|
|
443
|
-
|
|
445
|
+
B(() => {
|
|
444
446
|
R.current || (R.current = !0, e == null || e.debug(
|
|
445
447
|
"Initializing protocols: ",
|
|
446
|
-
y.map((
|
|
447
|
-
), y.forEach((
|
|
448
|
-
|
|
449
|
-
e == null || e.debug(`${
|
|
450
|
-
}),
|
|
451
|
-
h((g) => Q([...g, { ...p, protocol:
|
|
452
|
-
}),
|
|
448
|
+
y.map((l) => l.getName())
|
|
449
|
+
), y.forEach((l) => {
|
|
450
|
+
l.setSession(f), l.clearListeners(), l.addStatusChangeListener((p) => {
|
|
451
|
+
e == null || e.debug(`${l.getName()} has notified new status: ${p}`), m.set(l.getName(), p), W(new Map(m));
|
|
452
|
+
}), l.addMessageListener((p) => {
|
|
453
|
+
h((g) => Q([...g, { ...p, protocol: l.getName() }]));
|
|
454
|
+
}), l.autostart && l.status === "disconnected" && (e == null || e.debug(`Connecting to protocol: ${l.getName()}`), l.connect(f));
|
|
453
455
|
}));
|
|
454
456
|
}, [f, y, e, m]);
|
|
455
|
-
const L = async (
|
|
457
|
+
const L = async (l) => {
|
|
456
458
|
var S;
|
|
457
|
-
if (((S =
|
|
458
|
-
const p =
|
|
459
|
-
h((d) => [...d, { role: "user", type: "text", text: p }]),
|
|
460
|
-
const g = y.sort((d,
|
|
461
|
-
await (g == null ? void 0 : g.send(p)),
|
|
462
|
-
}, O = v(() => (
|
|
463
|
-
isRunning:
|
|
459
|
+
if (((S = l.content[0]) == null ? void 0 : S.type) !== "text") throw new Error("Only text messages are supported");
|
|
460
|
+
const p = l.content[0].text;
|
|
461
|
+
h((d) => [...d, { role: "user", type: "text", text: p }]), r(!0);
|
|
462
|
+
const g = y.sort((d, C) => C.getPriority() - d.getPriority()).find((d) => d.status === "connected");
|
|
463
|
+
await (g == null ? void 0 : g.send(p)), r(!1);
|
|
464
|
+
}, O = v(() => (r(!1), h([]), D("new"), Promise.resolve()), []), j = v(() => Promise.resolve(), []), F = Y({
|
|
465
|
+
isRunning: c,
|
|
464
466
|
messages: u,
|
|
465
467
|
convertMessage: X,
|
|
466
468
|
onNew: L,
|
|
@@ -527,8 +529,8 @@ export {
|
|
|
527
529
|
x as PersonaProtocolBase,
|
|
528
530
|
T as PersonaRESTProtocol,
|
|
529
531
|
ae as PersonaRuntimeProvider,
|
|
530
|
-
|
|
531
|
-
|
|
532
|
+
I as PersonaWebRTCProtocol,
|
|
533
|
+
$ as PersonaWebSocketProtocol,
|
|
532
534
|
oe as usePersonaRuntime,
|
|
533
535
|
te as usePersonaRuntimeProtocol,
|
|
534
536
|
re as usePersonaRuntimeWebRTCProtocol
|
package/dist/bundle.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.es.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/jsx-runtime.js","../src/messages.ts","../src/protocol/base.ts","../src/protocol/rest.ts","../src/protocol/websocket.ts","../src/protocol/webrtc.ts","../src/runtime.tsx","../src/logging.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { PersonaMessage } from './types';\nimport { ThreadMessageLike } from '@assistant-ui/react';\n\nfunction removeEmptyMessages(messages: PersonaMessage[]): PersonaMessage[] {\n return messages.filter((message) => {\n if (message.finishReason === 'stop') {\n return message.text !== null && message.text?.trim() !== '';\n }\n return true;\n });\n}\nfunction parseMessages(messages: PersonaMessage[]): PersonaMessage[] {\n const outputMessages: PersonaMessage[] = [];\n let currentMessage: PersonaMessage | null = null;\n\n for (const message of messages) {\n if (message.type === 'reasoning') {\n if (currentMessage != null) {\n outputMessages.push(currentMessage);\n currentMessage = null;\n }\n outputMessages.push(message);\n } else if (message.functionCalls) {\n if (currentMessage) {\n outputMessages.push(currentMessage);\n }\n outputMessages.push(message);\n currentMessage = null;\n } else if (message.functionResponse) {\n outputMessages[outputMessages.length - 1] = {\n ...outputMessages[outputMessages.length - 1],\n functionResponse: message.functionResponse,\n };\n } else if (\n currentMessage &&\n message.protocol === currentMessage.protocol &&\n (currentMessage.role === message.role || message.finishReason === 'stop')\n ) {\n currentMessage.text += message.text;\n } else {\n if (currentMessage) {\n outputMessages.push(currentMessage);\n }\n currentMessage = {\n ...message,\n };\n }\n }\n\n if (currentMessage) {\n outputMessages.push(currentMessage);\n }\n return removeEmptyMessages(outputMessages);\n}\n\nfunction convertMessage(message: PersonaMessage): ThreadMessageLike {\n if (message.role === 'function') {\n return {\n id: message.id!,\n role: 'assistant',\n status: message?.functionResponse === null ? { type: 'running' } : { type: 'complete', reason: 'stop' },\n content:\n message.functionCalls?.map((call) => ({\n type: 'tool-call',\n toolName: call.name,\n toolCallId: call.id,\n args: call.args,\n result: message.functionResponse?.result,\n })) ?? [],\n };\n }\n return {\n id: message.id!,\n role: message.role,\n content: message.type === 'reasoning' ? [{ type: 'reasoning', text: message.text }] : [{ type: 'text', text: message.text }],\n };\n}\n\nexport { parseMessages, convertMessage, removeEmptyMessages };\n","import { Message, MessageListenerCallback, PersonaMessage, PersonaProtocol, ProtocolStatus, Session, StatusChangeCallback } from '../types';\n\nabstract class PersonaProtocolBase implements PersonaProtocol {\n abstract status: ProtocolStatus;\n abstract session: Session;\n abstract autostart: boolean;\n\n private statusChangeCallbacks: StatusChangeCallback[] = [];\n private messageCallbacks: MessageListenerCallback[] = [];\n\n public addStatusChangeListener(callback: StatusChangeCallback) {\n this.statusChangeCallbacks.push(callback);\n }\n\n public addMessageListener(callback: MessageListenerCallback) {\n this.messageCallbacks.push(callback);\n }\n public async syncSession(session: Session): Promise<void> {\n this.session = session;\n }\n\n public async notifyMessage(message: PersonaMessage): Promise<void> {\n this.messageCallbacks.forEach((callback) => callback(message));\n }\n public async notifyMessages(messages: PersonaMessage[]): Promise<void> {\n messages.forEach((message) => {\n this.messageCallbacks.forEach((callback) => callback(message));\n });\n }\n\n public async setSession(session: Session): Promise<void> {\n this.session = session;\n }\n public async setStatus(status: ProtocolStatus): Promise<void> {\n const notify = this.status !== status;\n this.status = status;\n if (!notify) {\n return;\n }\n this.statusChangeCallbacks.forEach((callback) => callback(status));\n }\n\n public clearListeners(): void {\n this.statusChangeCallbacks = [];\n this.messageCallbacks = [];\n }\n\n abstract getName(): string;\n abstract getPriority(): number;\n abstract connect(session?: Session): Promise<Session>;\n abstract disconnect(): Promise<void>;\n abstract send(message: Message): Promise<void>;\n}\n\nexport { PersonaProtocolBase };\n","import { PersonaProtocolBase } from './base';\nimport { Message, PersonaResponse, Session, ProtocolStatus, PersonaProtocolBaseConfig } from '../types';\n\ntype PersonaRESTProtocolConfig = PersonaProtocolBaseConfig & {\n apiUrl: string;\n};\n\nclass PersonaRESTProtocol extends PersonaProtocolBase {\n status: ProtocolStatus;\n autostart: boolean;\n session: Session;\n config: PersonaRESTProtocolConfig;\n notify: boolean = true;\n\n constructor(config: PersonaRESTProtocolConfig) {\n super();\n this.config = config;\n this.status = 'disconnected';\n this.autostart = true;\n }\n\n public getName(): string {\n return 'rest';\n }\n\n public getPriority(): number {\n return 0;\n }\n\n public async connect(session: Session): Promise<Session> {\n this.setStatus('connected');\n return session;\n }\n\n public async disconnect(): Promise<void> {\n this.setStatus('disconnected');\n this.session = null;\n }\n\n public async syncSession(session: Session): Promise<void> {\n this.session = session;\n }\n\n public async send(message: Message): Promise<void> {\n const { apiUrl, apiKey, agentId } = this.config;\n const sessionId = this.session ?? 'new';\n const input = message;\n\n const response = await fetch(`${apiUrl}/agents/${agentId}/sessions/${sessionId}/messages`, {\n body: JSON.stringify({ userMessage: input }),\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-fox-apikey': apiKey,\n 'x-persona-apikey': apiKey,\n },\n });\n const personaResponse = (await response.json()) as PersonaResponse;\n this.notifyMessages(personaResponse.response.messages);\n }\n}\n\nexport { PersonaRESTProtocol };\nexport type { PersonaRESTProtocolConfig };\n","import { Message, PersonaMessage, PersonaProtocolBaseConfig, ProtocolStatus, Session } from '../types';\nimport { PersonaProtocolBase } from './base';\n\ntype PersonaWebSocketProtocolConfig = PersonaProtocolBaseConfig & {\n webSocketUrl: string;\n};\n\nclass PersonaWebSocketProtocol extends PersonaProtocolBase {\n status: ProtocolStatus;\n autostart: boolean;\n session: Session;\n config: PersonaWebSocketProtocolConfig;\n webSocket: WebSocket | null;\n\n constructor(config: PersonaWebSocketProtocolConfig) {\n super();\n this.config = config;\n this.status = 'disconnected';\n this.autostart = true;\n this.session = null;\n this.webSocket = null;\n }\n\n public getName(): string {\n return 'websocket';\n }\n\n public getPriority(): number {\n return 1;\n }\n\n public async syncSession(session: Session): Promise<void> {\n this.config.logger?.debug('Syncing session with WebSocket protocol:', session);\n this.session = session;\n if (this.webSocket && this.status === 'connected') {\n this.disconnect();\n this.connect(session);\n }\n }\n\n public connect(session?: Session): Promise<Session> {\n if (this.webSocket !== null && this.status === 'connected') {\n return Promise.resolve(this.session);\n }\n\n const sid = session || this.session || 'new';\n\n this.config.logger?.debug('Connecting to WebSocket with sessionId:', sid);\n\n const apiKey = encodeURIComponent(this.config.apiKey);\n const agentId = this.config.agentId;\n const webSocketUrl = `${this.config.webSocketUrl}?sessionCode=${sid}&agentId=${agentId}&apiKey=${apiKey}`;\n this.setStatus('connecting');\n this.webSocket = new WebSocket(webSocketUrl);\n this.webSocket.addEventListener('open', () => {\n this.setStatus('connected');\n });\n this.webSocket.addEventListener('message', (event) => {\n const data = JSON.parse(event.data) as { type: 'message' | unknown; payload: PersonaMessage | unknown };\n\n if (data.type !== 'message') {\n return;\n }\n const message = data.payload as PersonaMessage & { thought?: string };\n\n this.notifyMessage(message?.thought ? { role: 'assistant', type: 'reasoning', text: message.thought } : message);\n });\n this.webSocket.addEventListener('close', () => {\n this.setStatus('disconnected');\n this.webSocket = null;\n this.config.logger?.warn('WebSocket connection closed');\n });\n\n this.webSocket.addEventListener('error', (error) => {\n this.setStatus('disconnected');\n this.webSocket = null;\n this.config.logger?.error('WebSocket error', error);\n\n // TODO: Implement reconnection logic\n });\n\n return Promise.resolve(sid);\n }\n\n public disconnect(): Promise<void> {\n this.config.logger?.debug('Disconnecting WebSocket');\n if (this.webSocket && this.status === 'connected') {\n this.webSocket.close();\n this.setStatus('disconnected');\n this.webSocket = null;\n }\n return Promise.resolve();\n }\n\n public send(message: Message): Promise<void> {\n if (this.webSocket && this.status === 'connected') {\n this.webSocket.send(JSON.stringify({ type: 'request', payload: message }));\n return Promise.resolve();\n } else {\n return Promise.reject(new Error('WebSocket is not connected'));\n }\n }\n}\n\nexport { PersonaWebSocketProtocol };\nexport type { PersonaWebSocketProtocolConfig };\n","import { PersonaProtocolBase } from './base';\nimport { Message, PersonaMessage, PersonaProtocolBaseConfig, ProtocolStatus, Session } from '../types';\n\ntype AudioAnalysisData = {\n localAmplitude: number;\n remoteAmplitude: number;\n};\n\ntype AudioVisualizerCallback = (data: AudioAnalysisData) => void;\n\ntype PersonaWebRTCMessageCallback = (data: MessageEvent) => void;\n\ntype PersonaWebRTCConfig = PersonaProtocolBaseConfig & {\n webrtcUrl: string;\n iceServers?: RTCIceServer[];\n};\n\nclass PersonaWebRTCClient {\n private config: PersonaWebRTCConfig;\n private pc: RTCPeerConnection | null = null;\n private ws: WebSocket | null = null;\n private localStream: MediaStream | null = null;\n private remoteStream: MediaStream = new MediaStream();\n private audioCtx: AudioContext | null = null;\n\n private localAnalyser: AnalyserNode | null = null;\n private remoteAnalyser: AnalyserNode | null = null;\n private analyzerFrame: number | null = null;\n private dataChannel: RTCDataChannel | null = null;\n\n private isConnected: boolean = false;\n private visualizerCallbacks: AudioVisualizerCallback[] = [];\n private messageCallbacks: PersonaWebRTCMessageCallback[] = [];\n\n constructor(config: PersonaWebRTCConfig) {\n this.config = config;\n }\n\n public async connect(session: Session): Promise<Session> {\n if (this.isConnected) return;\n\n this.isConnected = true;\n\n try {\n this.localStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n } catch (err) {\n this.config.logger?.error('Error accessing microphone:', err);\n return;\n }\n\n this.pc = new RTCPeerConnection({\n iceServers: this.config.iceServers || [\n {\n urls: 'stun:34.38.108.251:3478',\n },\n {\n urls: 'turn:34.38.108.251:3478',\n username: 'webrtc',\n credential: 'webrtc',\n },\n ],\n });\n\n this.localStream.getTracks().forEach((track) => {\n this.pc!.addTrack(track, this.localStream!);\n });\n\n this.pc.ontrack = (event) => {\n event.streams[0].getTracks().forEach((track) => {\n this.remoteStream.addTrack(track);\n });\n\n if (!this.audioCtx) {\n this._startAnalyzers();\n }\n\n const remoteAudio = new Audio();\n remoteAudio.srcObject = this.remoteStream;\n remoteAudio.play().catch((e) => {\n this.config.logger?.error('Error playing remote audio:', e);\n });\n };\n\n this.pc.onicecandidate = (event) => {\n if (event.candidate && this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(\n JSON.stringify({\n type: 'CANDIDATE',\n src: 'client',\n payload: { candidate: event.candidate },\n }),\n );\n }\n };\n\n this.pc.ondatachannel = (event) => {\n const channel = event.channel;\n channel.onmessage = (msg) => {\n this.messageCallbacks.forEach((callback) => {\n callback(msg);\n });\n };\n };\n\n this.ws = new WebSocket(this.config.webrtcUrl || 'wss://persona.applica.guru/api/webrtc');\n this.ws.onopen = async () => {\n const offer = await this.pc!.createOffer();\n await this.pc!.setLocalDescription(offer);\n\n const metadata = {\n agentId: this.config.agentId,\n sessionCode: session as string,\n };\n this.config.logger?.debug('Opening connection to WebRTC server: ', metadata);\n\n const offerMessage = {\n type: 'OFFER',\n src: crypto.randomUUID?.() || 'client_' + Date.now(),\n payload: {\n sdp: {\n sdp: offer.sdp,\n type: offer.type,\n },\n connectionId: (Date.now() % 1000000).toString(),\n metadata,\n },\n };\n\n this.ws!.send(JSON.stringify(offerMessage));\n };\n\n this.ws.onmessage = async (event) => {\n const data = JSON.parse(event.data);\n if (data.type === 'ANSWER') {\n await this.pc!.setRemoteDescription(new RTCSessionDescription(data.payload.sdp));\n } else if (data.type === 'CANDIDATE') {\n try {\n await this.pc!.addIceCandidate(new RTCIceCandidate(data.payload.candidate));\n } catch (err) {\n this.config.logger?.error('Error adding ICE candidate:', err);\n }\n }\n };\n\n this.ws.onclose = () => {\n this._stopAnalyzers();\n };\n }\n\n public async disconnect(): Promise<void> {\n if (!this.isConnected) return;\n\n this.isConnected = false;\n\n if (this.ws?.readyState === WebSocket.OPEN) this.ws.close();\n if (this.pc) this.pc.close();\n if (this.localStream) {\n this.localStream.getTracks().forEach((track) => track.stop());\n }\n\n this.remoteStream = new MediaStream();\n if (this.audioCtx) {\n await this.audioCtx.close();\n this.audioCtx = null;\n }\n\n this._stopAnalyzers();\n }\n\n public addVisualizerCallback(callback: AudioVisualizerCallback): void {\n this.visualizerCallbacks.push(callback);\n }\n public addMessageCallback(callback: PersonaWebRTCMessageCallback): void {\n this.messageCallbacks.push(callback);\n }\n\n public createDataChannel(label = 'messages'): void {\n if (!this.pc) return;\n this.dataChannel = this.pc.createDataChannel(label);\n this.dataChannel.onopen = () => this.config.logger?.info('Data channel opened');\n this.dataChannel.onmessage = (msg: MessageEvent) => {\n this.messageCallbacks.forEach((callback) => {\n callback(msg);\n });\n };\n }\n\n public sendMessage(message: string): void {\n if (!this.dataChannel) {\n this.config.logger?.warn('Data channel is not open, cannot send message');\n return;\n }\n\n this.dataChannel.send(message);\n this.config.logger?.info('Sent message:', message);\n }\n\n private _startAnalyzers(): void {\n if (!this.localStream || !this.remoteStream || this.visualizerCallbacks.length === 0) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.audioCtx = new (window.AudioContext || (window as any).webkitAudioContext)();\n\n const localSource = this.audioCtx.createMediaStreamSource(this.localStream);\n const remoteSource = this.audioCtx.createMediaStreamSource(this.remoteStream);\n\n this.localAnalyser = this.audioCtx.createAnalyser();\n this.remoteAnalyser = this.audioCtx.createAnalyser();\n this.localAnalyser.fftSize = 256;\n this.remoteAnalyser.fftSize = 256;\n\n localSource.connect(this.localAnalyser);\n remoteSource.connect(this.remoteAnalyser);\n\n const loop = () => {\n if (!this.localAnalyser || !this.remoteAnalyser || this.visualizerCallbacks.length === 0) {\n return;\n }\n\n const localArray = new Uint8Array(this.localAnalyser.frequencyBinCount);\n const remoteArray = new Uint8Array(this.remoteAnalyser.frequencyBinCount);\n\n this.localAnalyser.getByteFrequencyData(localArray);\n this.remoteAnalyser.getByteFrequencyData(remoteArray);\n\n const localAmp = localArray.reduce((a, b) => a + b, 0) / localArray.length;\n const remoteAmp = remoteArray.reduce((a, b) => a + b, 0) / remoteArray.length;\n\n if (this.visualizerCallbacks.length > 0) {\n this.visualizerCallbacks.forEach((callback) => {\n callback({\n localAmplitude: localAmp,\n remoteAmplitude: remoteAmp,\n });\n });\n }\n\n this.analyzerFrame = requestAnimationFrame(loop);\n };\n\n this.analyzerFrame = requestAnimationFrame(loop);\n }\n\n private _stopAnalyzers(): void {\n if (this.analyzerFrame) {\n cancelAnimationFrame(this.analyzerFrame);\n this.analyzerFrame = null;\n }\n this.localAnalyser = null;\n this.remoteAnalyser = null;\n }\n}\n\ntype PersonaWebRTCProtocolConfig = PersonaWebRTCConfig & {\n autostart?: boolean;\n};\n\nclass PersonaWebRTCProtocol extends PersonaProtocolBase {\n status: ProtocolStatus;\n session: Session;\n autostart: boolean;\n config: PersonaWebRTCProtocolConfig;\n webRTCClient: PersonaWebRTCClient;\n\n constructor(config: PersonaWebRTCProtocolConfig) {\n super();\n this.config = config;\n this.status = 'disconnected';\n this.session = null;\n this.autostart = config?.autostart ?? false;\n this.webRTCClient = new PersonaWebRTCClient(config);\n this.webRTCClient.addMessageCallback((msg: MessageEvent) => {\n config.logger?.debug('Received data message:', msg.data);\n const data = JSON.parse(msg.data) as { type: 'message' | unknown; payload: PersonaMessage | unknown };\n if (data.type === 'message') {\n this.notifyMessage(data.payload as PersonaMessage);\n }\n });\n }\n\n public getName(): string {\n return 'webrtc';\n }\n public getPriority(): number {\n return 10;\n }\n\n public async syncSession(session: Session): Promise<void> {\n super.syncSession(session);\n if (this.status === 'connected') {\n await this.disconnect();\n await this.connect(session);\n }\n }\n\n public async connect(session?: Session): Promise<Session> {\n if (this.status === 'connected') {\n return Promise.resolve(this.session);\n }\n this.session = session || this.session || 'new';\n this.setStatus('connecting');\n\n this.config.logger?.debug('Connecting to WebRTC with sessionId:', this.session);\n await this.webRTCClient.connect(this.session);\n this.setStatus('connected');\n\n await this.webRTCClient.createDataChannel();\n\n return this.session;\n }\n\n public async disconnect(): Promise<void> {\n if (this.status === 'disconnected') {\n this.config.logger?.warn('Already disconnected');\n return Promise.resolve();\n }\n\n await this.webRTCClient.disconnect();\n\n this.setStatus('disconnected');\n this.config?.logger?.debug('Disconnected from WebRTC');\n }\n\n public send(message: Message): Promise<void> {\n if (this.status !== 'connected') {\n return Promise.reject(new Error('Not connected'));\n }\n\n this.webRTCClient.sendMessage(message as string);\n return Promise.resolve();\n }\n}\n\nexport { PersonaWebRTCProtocol };\nexport type { PersonaWebRTCProtocolConfig, AudioVisualizerCallback, AudioAnalysisData };\n","import { useState, useEffect, useCallback, PropsWithChildren, createContext, useContext, useMemo, useRef } from 'react';\nimport { useExternalStoreRuntime, AppendMessage, AssistantRuntimeProvider } from '@assistant-ui/react';\nimport {\n PersonaConfig,\n PersonaMessage,\n PersonaProtocol,\n PersonaProtocolBaseConfig,\n PersonaResponse,\n ProtocolStatus,\n Session,\n} from './types';\nimport { parseMessages, convertMessage } from './messages';\nimport {\n PersonaRESTProtocol,\n PersonaRESTProtocolConfig,\n PersonaWebRTCProtocol,\n PersonaWebRTCProtocolConfig,\n PersonaWebSocketProtocol,\n PersonaWebSocketProtocolConfig,\n} from './protocol';\n\ntype PersonaRuntimeContextType = {\n protocols: PersonaProtocol[];\n protocolsStatus: Map<string, ProtocolStatus>;\n};\n\nconst PersonaRuntimeContext = createContext<PersonaRuntimeContextType | undefined>(undefined);\n\nfunction PersonaRuntimeProviderInner({\n dev = false,\n protocols: _protocols,\n logger,\n children,\n session: defaultSession = 'new',\n ...config\n}: Readonly<PersonaConfig>) {\n const [isRunning, setIsRunning] = useState(false);\n const [messages, setMessages] = useState<PersonaMessage[]>([]);\n const [session, setSession] = useState<Session>(defaultSession);\n const [protocolsStatus, setProtocolsStatus] = useState<Map<string, ProtocolStatus>>(new Map());\n const didMount = useRef(false);\n\n const protocols = useMemo<PersonaProtocol[]>(() => {\n if (Array.isArray(_protocols)) {\n return _protocols;\n }\n\n if (typeof _protocols === 'object' && _protocols !== null) {\n const baseEndpoint = dev ? 'localhost:8000' : 'persona.applica.guru/api';\n const baseEndpointProtocol = dev ? 'http' : 'https';\n const baseWebSocketProtocol = dev ? 'ws' : 'wss';\n const availableProtocols = Object.keys(_protocols).map((key) => {\n switch (key) {\n case 'rest':\n const restConfig: PersonaProtocolBaseConfig | true | undefined = _protocols[key];\n if (restConfig === true) {\n return new PersonaRESTProtocol({\n apiUrl: `${baseEndpointProtocol}://${baseEndpoint}`,\n apiKey: config.apiKey,\n agentId: config.agentId,\n logger,\n });\n }\n return new PersonaRESTProtocol(restConfig as PersonaRESTProtocolConfig);\n case 'webrtc':\n const webrtcConfig: PersonaProtocolBaseConfig | true | undefined = _protocols[key];\n if (webrtcConfig === true) {\n return new PersonaWebRTCProtocol({\n webrtcUrl: `${baseWebSocketProtocol}://${baseEndpoint}/webrtc`,\n apiKey: config.apiKey,\n agentId: config.agentId,\n logger,\n });\n }\n return new PersonaWebRTCProtocol(webrtcConfig as PersonaWebRTCProtocolConfig);\n case 'websocket':\n const websocketConfig: PersonaProtocolBaseConfig | true | undefined = _protocols[key];\n if (websocketConfig === true) {\n return new PersonaWebSocketProtocol({\n webSocketUrl: `${baseWebSocketProtocol}://${baseEndpoint}/websocket`,\n apiKey: config.apiKey,\n agentId: config.agentId,\n logger,\n });\n }\n return new PersonaWebSocketProtocol(websocketConfig as PersonaWebSocketProtocolConfig);\n default:\n throw new Error(`Unknown protocol: ${key}`);\n }\n });\n return availableProtocols;\n }\n throw new Error('Invalid protocols configuration');\n }, []);\n\n useEffect(() => {\n if (didMount.current) return;\n\n didMount.current = true;\n logger?.debug(\n 'Initializing protocols: ',\n protocols.map((protocol) => protocol.getName()),\n );\n protocols.forEach((protocol) => {\n protocol.setSession(session);\n protocol.clearListeners();\n protocol.addStatusChangeListener((status: ProtocolStatus) => {\n logger?.debug(`${protocol.getName()} has notified new status: ${status}`);\n protocolsStatus.set(protocol.getName(), status);\n setProtocolsStatus(new Map(protocolsStatus));\n });\n protocol.addMessageListener((message: PersonaMessage) => {\n setMessages((currentConversation) => parseMessages([...currentConversation, ...[{ ...message, protocol: protocol.getName() }]]));\n });\n if (protocol.autostart && protocol.status === 'disconnected') {\n logger?.debug(`Connecting to protocol: ${protocol.getName()}`);\n protocol.connect(session);\n }\n });\n }, [session, protocols, logger, protocolsStatus]);\n\n const onNew = async (message: AppendMessage) => {\n if (message.content[0]?.type !== 'text') throw new Error('Only text messages are supported');\n\n const input = message.content[0].text;\n setMessages((currentConversation) => [...currentConversation, { role: 'user', type: 'text', text: input }]);\n setIsRunning(true);\n\n const protocol = protocols.sort((a, b) => b.getPriority() - a.getPriority()).find((protocol) => protocol.status === 'connected');\n\n await protocol?.send(input);\n\n setIsRunning(false);\n };\n\n const onCancel = useCallback(() => {\n setIsRunning(false);\n setMessages([]);\n setSession('new');\n return Promise.resolve();\n }, []);\n\n const onReload = useCallback(() => {\n return Promise.resolve();\n }, []);\n\n const runtime = useExternalStoreRuntime({\n isRunning,\n messages,\n convertMessage,\n onNew,\n onCancel,\n onReload,\n });\n\n return (\n <PersonaRuntimeContext.Provider value={{ protocols, protocolsStatus }}>\n <AssistantRuntimeProvider runtime={runtime}>{children}</AssistantRuntimeProvider>\n </PersonaRuntimeContext.Provider>\n );\n}\n\nfunction PersonaRuntimeProvider({ children, ...config }: PropsWithChildren<PersonaConfig>) {\n return <PersonaRuntimeProviderInner {...config}>{children}</PersonaRuntimeProviderInner>;\n}\n\nfunction usePersonaRuntime(): PersonaRuntimeContextType {\n const context = useContext(PersonaRuntimeContext);\n if (!context) {\n throw new Error('usePersonaRuntime must be used within a PersonaRuntimeProvider');\n }\n return context;\n}\n\n/**\n * Retrieves a specific protocol instance from the PersonaRuntimeContext.\n *\n * @param protocol - The name of the protocol to use.\n * @returns {PersonaProtocol | null} - The protocol instance or null if not found.\n * @throws {Error} - If the hook is used outside of a PersonaRuntimeProvider.\n */\nfunction usePersonaRuntimeProtocol(protocol: string): PersonaProtocol | null {\n const context = useContext(PersonaRuntimeContext);\n if (!context) {\n throw new Error('usePersonaRuntimeProtocol must be used within a PersonaRuntimeProvider');\n }\n\n const protocolInstance = context.protocols.find((p) => p.getName() === protocol);\n if (!protocolInstance) {\n return null;\n }\n\n const status = context.protocolsStatus.get(protocolInstance.getName());\n\n return {\n ...protocolInstance,\n connect: protocolInstance.connect.bind(protocolInstance),\n disconnect: protocolInstance.disconnect.bind(protocolInstance),\n send: protocolInstance.send.bind(protocolInstance),\n setSession: protocolInstance.setSession.bind(protocolInstance),\n addStatusChangeListener: protocolInstance.addStatusChangeListener.bind(protocolInstance),\n addMessageListener: protocolInstance.addMessageListener.bind(protocolInstance),\n getName: protocolInstance.getName.bind(protocolInstance),\n getPriority: protocolInstance.getPriority.bind(protocolInstance),\n status: status || protocolInstance.status,\n };\n}\n\nfunction usePersonaRuntimeWebRTCProtocol(): PersonaWebRTCProtocol | null {\n return usePersonaRuntimeProtocol('webrtc') as PersonaWebRTCProtocol;\n}\n\nexport { PersonaRuntimeProvider, usePersonaRuntime, usePersonaRuntimeProtocol, usePersonaRuntimeWebRTCProtocol };\nexport type { PersonaMessage, PersonaResponse };\n","interface PersonaLogger {\n log: (message: string, ...args: unknown[]) => void;\n info: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n debug: (message: string, ...args: unknown[]) => void;\n}\n\nclass PersonaConsoleLogger implements PersonaLogger {\n prefix = '[Persona]';\n\n log(message: string, ...args: unknown[]) {\n console.log(`${this.prefix} - ${message}`, ...args);\n }\n\n info(message: string, ...args: unknown[]) {\n console.info(`${this.prefix} - ${message}`, ...args);\n }\n\n warn(message: string, ...args: unknown[]) {\n console.warn(`${this.prefix} - ${message}`, ...args);\n }\n\n error(message: string, ...args: unknown[]) {\n console.error(`${this.prefix} - ${message}`, ...args);\n }\n\n debug(message: string, ...args: unknown[]) {\n console.debug(`${this.prefix} - ${message}`, ...args);\n }\n}\n\nexport { PersonaConsoleLogger };\nexport type { PersonaLogger };\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","jsxRuntimeModule","require$$0","removeEmptyMessages","messages","message","_a","parseMessages","outputMessages","currentMessage","convertMessage","call","PersonaProtocolBase","__publicField","callback","session","status","notify","PersonaRESTProtocol","apiUrl","apiKey","agentId","sessionId","input","personaResponse","PersonaWebSocketProtocol","sid","webSocketUrl","event","data","error","PersonaWebRTCClient","err","track","remoteAudio","e","channel","msg","offer","metadata","offerMessage","_b","label","localSource","remoteSource","loop","localArray","remoteArray","localAmp","a","b","remoteAmp","PersonaWebRTCProtocol","_c","PersonaRuntimeContext","createContext","PersonaRuntimeProviderInner","dev","_protocols","logger","children","defaultSession","isRunning","setIsRunning","useState","setMessages","setSession","protocolsStatus","setProtocolsStatus","didMount","useRef","protocols","useMemo","baseEndpoint","baseEndpointProtocol","baseWebSocketProtocol","restConfig","webrtcConfig","websocketConfig","useEffect","protocol","currentConversation","onNew","onCancel","useCallback","onReload","runtime","useExternalStoreRuntime","jsx","AssistantRuntimeProvider","PersonaRuntimeProvider","usePersonaRuntime","context","useContext","usePersonaRuntimeProtocol","protocolInstance","p","usePersonaRuntimeWebRTCProtocol","PersonaConsoleLogger","args"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
1
|
+
{"version":3,"file":"bundle.es.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/jsx-runtime.js","../src/messages.ts","../src/protocol/base.ts","../src/protocol/rest.ts","../src/protocol/websocket.ts","../src/protocol/webrtc.ts","../src/runtime.tsx","../src/logging.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { PersonaMessage } from './types';\nimport { ThreadMessageLike } from '@assistant-ui/react';\n\nfunction removeEmptyMessages(messages: PersonaMessage[]): PersonaMessage[] {\n return messages.filter((message) => {\n if (message.finishReason === 'stop') {\n return message.text !== null && message.text?.trim() !== '';\n }\n return true;\n });\n}\nfunction parseMessages(messages: PersonaMessage[]): PersonaMessage[] {\n const outputMessages: PersonaMessage[] = [];\n let currentMessage: PersonaMessage | null = null;\n\n for (const message of messages) {\n if (message.type === 'reasoning') {\n if (currentMessage != null) {\n outputMessages.push(currentMessage);\n currentMessage = null;\n }\n outputMessages.push(message);\n } else if (message.functionCalls) {\n if (currentMessage) {\n outputMessages.push(currentMessage);\n }\n outputMessages.push(message);\n currentMessage = null;\n } else if (message.functionResponse) {\n outputMessages[outputMessages.length - 1] = {\n ...outputMessages[outputMessages.length - 1],\n functionResponse: message.functionResponse,\n };\n } else if (\n currentMessage &&\n message.protocol === currentMessage.protocol &&\n (currentMessage.role === message.role || message.finishReason === 'stop')\n ) {\n currentMessage.text += message.text;\n } else {\n if (currentMessage) {\n outputMessages.push(currentMessage);\n }\n currentMessage = {\n ...message,\n };\n }\n }\n\n if (currentMessage) {\n outputMessages.push(currentMessage);\n }\n return removeEmptyMessages(outputMessages);\n}\n\nfunction convertMessage(message: PersonaMessage): ThreadMessageLike {\n if (message.role === 'function') {\n return {\n id: message.id!,\n role: 'assistant',\n status: message?.functionResponse === null ? { type: 'running' } : { type: 'complete', reason: 'stop' },\n content:\n message.functionCalls?.map((call) => ({\n type: 'tool-call',\n toolName: call.name,\n toolCallId: call.id,\n args: call.args,\n result: message.functionResponse?.result,\n })) ?? [],\n };\n }\n return {\n id: message.id!,\n role: message.role,\n content: message.type === 'reasoning' ? [{ type: 'reasoning', text: message.text }] : [{ type: 'text', text: message.text }],\n };\n}\n\nexport { parseMessages, convertMessage, removeEmptyMessages };\n","import { Message, MessageListenerCallback, PersonaMessage, PersonaProtocol, ProtocolStatus, Session, StatusChangeCallback } from '../types';\n\nabstract class PersonaProtocolBase implements PersonaProtocol {\n abstract status: ProtocolStatus;\n abstract session: Session;\n abstract autostart: boolean;\n\n private statusChangeCallbacks: StatusChangeCallback[] = [];\n private messageCallbacks: MessageListenerCallback[] = [];\n\n public addStatusChangeListener(callback: StatusChangeCallback) {\n this.statusChangeCallbacks.push(callback);\n }\n\n public addMessageListener(callback: MessageListenerCallback) {\n this.messageCallbacks.push(callback);\n }\n public async syncSession(session: Session): Promise<void> {\n this.session = session;\n }\n\n public async notifyMessage(message: PersonaMessage): Promise<void> {\n this.messageCallbacks.forEach((callback) => callback(message));\n }\n public async notifyMessages(messages: PersonaMessage[]): Promise<void> {\n messages.forEach((message) => {\n this.messageCallbacks.forEach((callback) => callback(message));\n });\n }\n\n public async setSession(session: Session): Promise<void> {\n this.session = session;\n }\n public async setStatus(status: ProtocolStatus): Promise<void> {\n const notify = this.status !== status;\n this.status = status;\n if (!notify) {\n return;\n }\n this.statusChangeCallbacks.forEach((callback) => callback(status));\n }\n\n public clearListeners(): void {\n this.statusChangeCallbacks = [];\n this.messageCallbacks = [];\n }\n\n abstract getName(): string;\n abstract getPriority(): number;\n abstract connect(session?: Session): Promise<Session>;\n abstract disconnect(): Promise<void>;\n abstract send(message: Message): Promise<void>;\n}\n\nexport { PersonaProtocolBase };\n","import { PersonaProtocolBase } from './base';\nimport { Message, PersonaResponse, Session, ProtocolStatus, PersonaProtocolBaseConfig } from '../types';\n\ntype PersonaRESTProtocolConfig = PersonaProtocolBaseConfig & {\n apiUrl: string;\n};\n\nclass PersonaRESTProtocol extends PersonaProtocolBase {\n status: ProtocolStatus;\n autostart: boolean;\n session: Session;\n config: PersonaRESTProtocolConfig;\n notify: boolean = true;\n\n constructor(config: PersonaRESTProtocolConfig) {\n super();\n this.config = config;\n this.status = 'disconnected';\n this.autostart = true;\n }\n\n public getName(): string {\n return 'rest';\n }\n\n public getPriority(): number {\n return 0;\n }\n\n public async connect(session: Session): Promise<Session> {\n this.setStatus('connected');\n return session;\n }\n\n public async disconnect(): Promise<void> {\n this.setStatus('disconnected');\n this.session = null;\n }\n\n public async syncSession(session: Session): Promise<void> {\n this.session = session;\n }\n\n public async send(message: Message): Promise<void> {\n const { apiUrl, apiKey, agentId } = this.config;\n const sessionId = this.session ?? 'new';\n const input = message;\n\n const response = await fetch(`${apiUrl}/agents/${agentId}/sessions/${sessionId}/messages`, {\n body: JSON.stringify({ userMessage: input }),\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-fox-apikey': apiKey,\n 'x-persona-apikey': apiKey,\n },\n });\n const personaResponse = (await response.json()) as PersonaResponse;\n this.notifyMessages(personaResponse.response.messages);\n }\n}\n\nexport { PersonaRESTProtocol };\nexport type { PersonaRESTProtocolConfig };\n","import { Message, PersonaMessage, PersonaProtocolBaseConfig, ProtocolStatus, Session } from '../types';\nimport { PersonaProtocolBase } from './base';\n\ntype PersonaWebSocketProtocolConfig = PersonaProtocolBaseConfig & {\n webSocketUrl: string;\n};\n\nclass PersonaWebSocketProtocol extends PersonaProtocolBase {\n status: ProtocolStatus;\n autostart: boolean;\n session: Session;\n config: PersonaWebSocketProtocolConfig;\n webSocket: WebSocket | null;\n\n constructor(config: PersonaWebSocketProtocolConfig) {\n super();\n this.config = config;\n this.status = 'disconnected';\n this.autostart = true;\n this.session = null;\n this.webSocket = null;\n }\n\n public getName(): string {\n return 'websocket';\n }\n\n public getPriority(): number {\n return 1;\n }\n\n public async syncSession(session: Session): Promise<void> {\n this.config.logger?.debug('Syncing session with WebSocket protocol:', session);\n this.session = session;\n if (this.webSocket && this.status === 'connected') {\n this.disconnect();\n this.connect(session);\n }\n }\n\n public connect(session?: Session): Promise<Session> {\n if (this.webSocket !== null && this.status === 'connected') {\n return Promise.resolve(this.session);\n }\n\n const sid = session || this.session || 'new';\n\n this.config.logger?.debug('Connecting to WebSocket with sessionId:', sid);\n\n const apiKey = encodeURIComponent(this.config.apiKey);\n const agentId = this.config.agentId;\n const webSocketUrl = `${this.config.webSocketUrl}?sessionCode=${sid}&agentId=${agentId}&apiKey=${apiKey}`;\n this.setStatus('connecting');\n this.webSocket = new WebSocket(webSocketUrl);\n this.webSocket.addEventListener('open', () => {\n this.setStatus('connected');\n });\n this.webSocket.addEventListener('message', (event) => {\n const data = JSON.parse(event.data) as { type: 'message' | unknown; payload: PersonaMessage | unknown };\n\n if (data.type !== 'message') {\n return;\n }\n const message = data.payload as PersonaMessage & { thought?: string };\n\n this.notifyMessage(message?.thought ? { role: 'assistant', type: 'reasoning', text: message.thought } : message);\n });\n this.webSocket.addEventListener('close', () => {\n this.setStatus('disconnected');\n this.webSocket = null;\n this.config.logger?.warn('WebSocket connection closed');\n });\n\n this.webSocket.addEventListener('error', (error) => {\n this.setStatus('disconnected');\n this.webSocket = null;\n this.config.logger?.error('WebSocket error', error);\n\n // TODO: Implement reconnection logic\n });\n\n return Promise.resolve(sid);\n }\n\n public disconnect(): Promise<void> {\n this.config.logger?.debug('Disconnecting WebSocket');\n if (this.webSocket && this.status === 'connected') {\n this.webSocket.close();\n this.setStatus('disconnected');\n this.webSocket = null;\n }\n return Promise.resolve();\n }\n\n public send(message: Message): Promise<void> {\n if (this.webSocket && this.status === 'connected') {\n this.webSocket.send(JSON.stringify({ type: 'request', payload: message }));\n return Promise.resolve();\n } else {\n return Promise.reject(new Error('WebSocket is not connected'));\n }\n }\n}\n\nexport { PersonaWebSocketProtocol };\nexport type { PersonaWebSocketProtocolConfig };\n","import { PersonaProtocolBase } from './base';\nimport { Message, PersonaMessage, PersonaProtocolBaseConfig, ProtocolStatus, Session } from '../types';\n\ntype AudioAnalysisData = {\n localAmplitude: number;\n remoteAmplitude: number;\n};\n\ntype AudioVisualizerCallback = (data: AudioAnalysisData) => void;\n\ntype PersonaWebRTCMessageCallback = (data: MessageEvent) => void;\n\ntype PersonaWebRTCConfig = PersonaProtocolBaseConfig & {\n webrtcUrl: string;\n iceServers?: RTCIceServer[];\n};\n\nclass PersonaWebRTCClient {\n private config: PersonaWebRTCConfig;\n private pc: RTCPeerConnection | null = null;\n private ws: WebSocket | null = null;\n private localStream: MediaStream | null = null;\n private remoteStream: MediaStream = new MediaStream();\n private audioCtx: AudioContext | null = null;\n\n private localAnalyser: AnalyserNode | null = null;\n private remoteAnalyser: AnalyserNode | null = null;\n private analyzerFrame: number | null = null;\n private dataChannel: RTCDataChannel | null = null;\n\n private isConnected: boolean = false;\n private visualizerCallbacks: AudioVisualizerCallback[] = [];\n private messageCallbacks: PersonaWebRTCMessageCallback[] = [];\n\n constructor(config: PersonaWebRTCConfig) {\n this.config = config;\n }\n\n public async connect(session: Session): Promise<Session> {\n if (this.isConnected) return;\n\n this.isConnected = true;\n\n try {\n this.localStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n } catch (err) {\n this.config.logger?.error('Error accessing microphone:', err);\n return;\n }\n\n this.pc = new RTCPeerConnection({\n iceServers: this.config.iceServers || [\n {\n urls: 'stun:34.38.108.251:3478',\n },\n {\n urls: 'turn:34.38.108.251:3478',\n username: 'webrtc',\n credential: 'webrtc',\n },\n ],\n });\n\n this.localStream.getTracks().forEach((track) => {\n this.pc!.addTrack(track, this.localStream!);\n });\n\n this.pc.ontrack = (event) => {\n event.streams[0].getTracks().forEach((track) => {\n this.remoteStream.addTrack(track);\n });\n\n if (!this.audioCtx) {\n this._startAnalyzers();\n }\n\n const remoteAudio = new Audio();\n remoteAudio.srcObject = this.remoteStream;\n remoteAudio.play().catch((e) => {\n this.config.logger?.error('Error playing remote audio:', e);\n });\n };\n\n this.pc.onicecandidate = (event) => {\n if (event.candidate && this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(\n JSON.stringify({\n type: 'CANDIDATE',\n src: 'client',\n payload: { candidate: event.candidate },\n }),\n );\n }\n };\n\n this.pc.ondatachannel = (event) => {\n const channel = event.channel;\n channel.onmessage = (msg) => {\n this.messageCallbacks.forEach((callback) => {\n callback(msg);\n });\n };\n };\n\n const url = this.config.webrtcUrl || 'wss://persona.applica.guru/api/webrtc';\n this.ws = new WebSocket(`${url}?apiKey=${encodeURIComponent(this.config.apiKey)}`);\n this.ws.onopen = async () => {\n const offer = await this.pc!.createOffer();\n await this.pc!.setLocalDescription(offer);\n\n const metadata = {\n apiKey: this.config.apiKey,\n agentId: this.config.agentId,\n sessionCode: session as string,\n };\n this.config.logger?.debug('Opening connection to WebRTC server: ', metadata);\n\n const offerMessage = {\n type: 'OFFER',\n src: crypto.randomUUID?.() || 'client_' + Date.now(),\n payload: {\n sdp: {\n sdp: offer.sdp,\n type: offer.type,\n },\n connectionId: (Date.now() % 1000000).toString(),\n metadata,\n },\n };\n\n this.ws!.send(JSON.stringify(offerMessage));\n };\n\n this.ws.onmessage = async (event) => {\n const data = JSON.parse(event.data);\n if (data.type === 'ANSWER') {\n await this.pc!.setRemoteDescription(new RTCSessionDescription(data.payload.sdp));\n } else if (data.type === 'CANDIDATE') {\n try {\n await this.pc!.addIceCandidate(new RTCIceCandidate(data.payload.candidate));\n } catch (err) {\n this.config.logger?.error('Error adding ICE candidate:', err);\n }\n }\n };\n\n this.ws.onclose = () => {\n this._stopAnalyzers();\n };\n }\n\n public async disconnect(): Promise<void> {\n if (!this.isConnected) return;\n\n this.isConnected = false;\n\n if (this.ws?.readyState === WebSocket.OPEN) this.ws.close();\n if (this.pc) this.pc.close();\n if (this.localStream) {\n this.localStream.getTracks().forEach((track) => track.stop());\n }\n\n this.remoteStream = new MediaStream();\n if (this.audioCtx) {\n await this.audioCtx.close();\n this.audioCtx = null;\n }\n\n this._stopAnalyzers();\n }\n\n public addVisualizerCallback(callback: AudioVisualizerCallback): void {\n this.visualizerCallbacks.push(callback);\n }\n public addMessageCallback(callback: PersonaWebRTCMessageCallback): void {\n this.messageCallbacks.push(callback);\n }\n\n public createDataChannel(label = 'messages'): void {\n if (!this.pc) return;\n this.dataChannel = this.pc.createDataChannel(label);\n this.dataChannel.onopen = () => this.config.logger?.info('Data channel opened');\n this.dataChannel.onmessage = (msg: MessageEvent) => {\n this.messageCallbacks.forEach((callback) => {\n callback(msg);\n });\n };\n }\n\n public sendMessage(message: string): void {\n if (!this.dataChannel) {\n this.config.logger?.warn('Data channel is not open, cannot send message');\n return;\n }\n\n this.dataChannel.send(message);\n this.config.logger?.info('Sent message:', message);\n }\n\n private _startAnalyzers(): void {\n if (!this.localStream || !this.remoteStream || this.visualizerCallbacks.length === 0) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.audioCtx = new (window.AudioContext || (window as any).webkitAudioContext)();\n\n const localSource = this.audioCtx.createMediaStreamSource(this.localStream);\n const remoteSource = this.audioCtx.createMediaStreamSource(this.remoteStream);\n\n this.localAnalyser = this.audioCtx.createAnalyser();\n this.remoteAnalyser = this.audioCtx.createAnalyser();\n this.localAnalyser.fftSize = 256;\n this.remoteAnalyser.fftSize = 256;\n\n localSource.connect(this.localAnalyser);\n remoteSource.connect(this.remoteAnalyser);\n\n const loop = () => {\n if (!this.localAnalyser || !this.remoteAnalyser || this.visualizerCallbacks.length === 0) {\n return;\n }\n\n const localArray = new Uint8Array(this.localAnalyser.frequencyBinCount);\n const remoteArray = new Uint8Array(this.remoteAnalyser.frequencyBinCount);\n\n this.localAnalyser.getByteFrequencyData(localArray);\n this.remoteAnalyser.getByteFrequencyData(remoteArray);\n\n const localAmp = localArray.reduce((a, b) => a + b, 0) / localArray.length;\n const remoteAmp = remoteArray.reduce((a, b) => a + b, 0) / remoteArray.length;\n\n if (this.visualizerCallbacks.length > 0) {\n this.visualizerCallbacks.forEach((callback) => {\n callback({\n localAmplitude: localAmp,\n remoteAmplitude: remoteAmp,\n });\n });\n }\n\n this.analyzerFrame = requestAnimationFrame(loop);\n };\n\n this.analyzerFrame = requestAnimationFrame(loop);\n }\n\n private _stopAnalyzers(): void {\n if (this.analyzerFrame) {\n cancelAnimationFrame(this.analyzerFrame);\n this.analyzerFrame = null;\n }\n this.localAnalyser = null;\n this.remoteAnalyser = null;\n }\n}\n\ntype PersonaWebRTCProtocolConfig = PersonaWebRTCConfig & {\n autostart?: boolean;\n};\n\nclass PersonaWebRTCProtocol extends PersonaProtocolBase {\n status: ProtocolStatus;\n session: Session;\n autostart: boolean;\n config: PersonaWebRTCProtocolConfig;\n webRTCClient: PersonaWebRTCClient;\n\n constructor(config: PersonaWebRTCProtocolConfig) {\n super();\n this.config = config;\n this.status = 'disconnected';\n this.session = null;\n this.autostart = config?.autostart ?? false;\n this.webRTCClient = new PersonaWebRTCClient(config);\n this.webRTCClient.addMessageCallback((msg: MessageEvent) => {\n config.logger?.debug('Received data message:', msg.data);\n const data = JSON.parse(msg.data) as { type: 'message' | unknown; payload: PersonaMessage | unknown };\n if (data.type === 'message') {\n this.notifyMessage(data.payload as PersonaMessage);\n }\n });\n }\n\n public getName(): string {\n return 'webrtc';\n }\n public getPriority(): number {\n return 10;\n }\n\n public async syncSession(session: Session): Promise<void> {\n super.syncSession(session);\n if (this.status === 'connected') {\n await this.disconnect();\n await this.connect(session);\n }\n }\n\n public async connect(session?: Session): Promise<Session> {\n if (this.status === 'connected') {\n return Promise.resolve(this.session);\n }\n this.session = session || this.session || 'new';\n this.setStatus('connecting');\n\n this.config.logger?.debug('Connecting to WebRTC with sessionId:', this.session);\n await this.webRTCClient.connect(this.session);\n this.setStatus('connected');\n\n await this.webRTCClient.createDataChannel();\n\n return this.session;\n }\n\n public async disconnect(): Promise<void> {\n if (this.status === 'disconnected') {\n this.config.logger?.warn('Already disconnected');\n return Promise.resolve();\n }\n\n await this.webRTCClient.disconnect();\n\n this.setStatus('disconnected');\n this.config?.logger?.debug('Disconnected from WebRTC');\n }\n\n public send(message: Message): Promise<void> {\n if (this.status !== 'connected') {\n return Promise.reject(new Error('Not connected'));\n }\n\n this.webRTCClient.sendMessage(message as string);\n return Promise.resolve();\n }\n}\n\nexport { PersonaWebRTCProtocol };\nexport type { PersonaWebRTCProtocolConfig, AudioVisualizerCallback, AudioAnalysisData };\n","import { useState, useEffect, useCallback, PropsWithChildren, createContext, useContext, useMemo, useRef } from 'react';\nimport { useExternalStoreRuntime, AppendMessage, AssistantRuntimeProvider } from '@assistant-ui/react';\nimport {\n PersonaConfig,\n PersonaMessage,\n PersonaProtocol,\n PersonaProtocolBaseConfig,\n PersonaResponse,\n ProtocolStatus,\n Session,\n} from './types';\nimport { parseMessages, convertMessage } from './messages';\nimport {\n PersonaRESTProtocol,\n PersonaRESTProtocolConfig,\n PersonaWebRTCProtocol,\n PersonaWebRTCProtocolConfig,\n PersonaWebSocketProtocol,\n PersonaWebSocketProtocolConfig,\n} from './protocol';\n\ntype PersonaRuntimeContextType = {\n protocols: PersonaProtocol[];\n protocolsStatus: Map<string, ProtocolStatus>;\n};\n\nconst PersonaRuntimeContext = createContext<PersonaRuntimeContextType | undefined>(undefined);\n\nfunction PersonaRuntimeProviderInner({\n dev = false,\n protocols: _protocols,\n logger,\n children,\n session: defaultSession = 'new',\n ...config\n}: Readonly<PersonaConfig>) {\n const [isRunning, setIsRunning] = useState(false);\n const [messages, setMessages] = useState<PersonaMessage[]>([]);\n const [session, setSession] = useState<Session>(defaultSession);\n const [protocolsStatus, setProtocolsStatus] = useState<Map<string, ProtocolStatus>>(new Map());\n const didMount = useRef(false);\n\n const protocols = useMemo<PersonaProtocol[]>(() => {\n if (Array.isArray(_protocols)) {\n return _protocols;\n }\n\n if (typeof _protocols === 'object' && _protocols !== null) {\n const baseEndpoint = dev ? 'localhost:8000' : 'persona.applica.guru/api';\n const baseEndpointProtocol = dev ? 'http' : 'https';\n const baseWebSocketProtocol = dev ? 'ws' : 'wss';\n const availableProtocols = Object.keys(_protocols).map((key) => {\n switch (key) {\n case 'rest':\n const restConfig: PersonaProtocolBaseConfig | true | undefined = _protocols[key];\n if (restConfig === true) {\n return new PersonaRESTProtocol({\n apiUrl: `${baseEndpointProtocol}://${baseEndpoint}`,\n apiKey: config.apiKey,\n agentId: config.agentId,\n logger,\n });\n }\n return new PersonaRESTProtocol(restConfig as PersonaRESTProtocolConfig);\n case 'webrtc':\n const webrtcConfig: PersonaProtocolBaseConfig | true | undefined = _protocols[key];\n if (webrtcConfig === true) {\n return new PersonaWebRTCProtocol({\n webrtcUrl: `${baseWebSocketProtocol}://${baseEndpoint}/webrtc`,\n apiKey: config.apiKey,\n agentId: config.agentId,\n logger,\n });\n }\n return new PersonaWebRTCProtocol(webrtcConfig as PersonaWebRTCProtocolConfig);\n case 'websocket':\n const websocketConfig: PersonaProtocolBaseConfig | true | undefined = _protocols[key];\n if (websocketConfig === true) {\n return new PersonaWebSocketProtocol({\n webSocketUrl: `${baseWebSocketProtocol}://${baseEndpoint}/websocket`,\n apiKey: config.apiKey,\n agentId: config.agentId,\n logger,\n });\n }\n return new PersonaWebSocketProtocol(websocketConfig as PersonaWebSocketProtocolConfig);\n default:\n throw new Error(`Unknown protocol: ${key}`);\n }\n });\n return availableProtocols;\n }\n throw new Error('Invalid protocols configuration');\n }, []);\n\n useEffect(() => {\n if (didMount.current) return;\n\n didMount.current = true;\n logger?.debug(\n 'Initializing protocols: ',\n protocols.map((protocol) => protocol.getName()),\n );\n protocols.forEach((protocol) => {\n protocol.setSession(session);\n protocol.clearListeners();\n protocol.addStatusChangeListener((status: ProtocolStatus) => {\n logger?.debug(`${protocol.getName()} has notified new status: ${status}`);\n protocolsStatus.set(protocol.getName(), status);\n setProtocolsStatus(new Map(protocolsStatus));\n });\n protocol.addMessageListener((message: PersonaMessage) => {\n setMessages((currentConversation) => parseMessages([...currentConversation, ...[{ ...message, protocol: protocol.getName() }]]));\n });\n if (protocol.autostart && protocol.status === 'disconnected') {\n logger?.debug(`Connecting to protocol: ${protocol.getName()}`);\n protocol.connect(session);\n }\n });\n }, [session, protocols, logger, protocolsStatus]);\n\n const onNew = async (message: AppendMessage) => {\n if (message.content[0]?.type !== 'text') throw new Error('Only text messages are supported');\n\n const input = message.content[0].text;\n setMessages((currentConversation) => [...currentConversation, { role: 'user', type: 'text', text: input }]);\n setIsRunning(true);\n\n const protocol = protocols.sort((a, b) => b.getPriority() - a.getPriority()).find((protocol) => protocol.status === 'connected');\n\n await protocol?.send(input);\n\n setIsRunning(false);\n };\n\n const onCancel = useCallback(() => {\n setIsRunning(false);\n setMessages([]);\n setSession('new');\n return Promise.resolve();\n }, []);\n\n const onReload = useCallback(() => {\n return Promise.resolve();\n }, []);\n\n const runtime = useExternalStoreRuntime({\n isRunning,\n messages,\n convertMessage,\n onNew,\n onCancel,\n onReload,\n });\n\n return (\n <PersonaRuntimeContext.Provider value={{ protocols, protocolsStatus }}>\n <AssistantRuntimeProvider runtime={runtime}>{children}</AssistantRuntimeProvider>\n </PersonaRuntimeContext.Provider>\n );\n}\n\nfunction PersonaRuntimeProvider({ children, ...config }: PropsWithChildren<PersonaConfig>) {\n return <PersonaRuntimeProviderInner {...config}>{children}</PersonaRuntimeProviderInner>;\n}\n\nfunction usePersonaRuntime(): PersonaRuntimeContextType {\n const context = useContext(PersonaRuntimeContext);\n if (!context) {\n throw new Error('usePersonaRuntime must be used within a PersonaRuntimeProvider');\n }\n return context;\n}\n\n/**\n * Retrieves a specific protocol instance from the PersonaRuntimeContext.\n *\n * @param protocol - The name of the protocol to use.\n * @returns {PersonaProtocol | null} - The protocol instance or null if not found.\n * @throws {Error} - If the hook is used outside of a PersonaRuntimeProvider.\n */\nfunction usePersonaRuntimeProtocol(protocol: string): PersonaProtocol | null {\n const context = useContext(PersonaRuntimeContext);\n if (!context) {\n throw new Error('usePersonaRuntimeProtocol must be used within a PersonaRuntimeProvider');\n }\n\n const protocolInstance = context.protocols.find((p) => p.getName() === protocol);\n if (!protocolInstance) {\n return null;\n }\n\n const status = context.protocolsStatus.get(protocolInstance.getName());\n\n return {\n ...protocolInstance,\n connect: protocolInstance.connect.bind(protocolInstance),\n disconnect: protocolInstance.disconnect.bind(protocolInstance),\n send: protocolInstance.send.bind(protocolInstance),\n setSession: protocolInstance.setSession.bind(protocolInstance),\n addStatusChangeListener: protocolInstance.addStatusChangeListener.bind(protocolInstance),\n addMessageListener: protocolInstance.addMessageListener.bind(protocolInstance),\n getName: protocolInstance.getName.bind(protocolInstance),\n getPriority: protocolInstance.getPriority.bind(protocolInstance),\n status: status || protocolInstance.status,\n };\n}\n\nfunction usePersonaRuntimeWebRTCProtocol(): PersonaWebRTCProtocol | null {\n return usePersonaRuntimeProtocol('webrtc') as PersonaWebRTCProtocol;\n}\n\nexport { PersonaRuntimeProvider, usePersonaRuntime, usePersonaRuntimeProtocol, usePersonaRuntimeWebRTCProtocol };\nexport type { PersonaMessage, PersonaResponse };\n","interface PersonaLogger {\n log: (message: string, ...args: unknown[]) => void;\n info: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n debug: (message: string, ...args: unknown[]) => void;\n}\n\nclass PersonaConsoleLogger implements PersonaLogger {\n prefix = '[Persona]';\n\n log(message: string, ...args: unknown[]) {\n console.log(`${this.prefix} - ${message}`, ...args);\n }\n\n info(message: string, ...args: unknown[]) {\n console.info(`${this.prefix} - ${message}`, ...args);\n }\n\n warn(message: string, ...args: unknown[]) {\n console.warn(`${this.prefix} - ${message}`, ...args);\n }\n\n error(message: string, ...args: unknown[]) {\n console.error(`${this.prefix} - ${message}`, ...args);\n }\n\n debug(message: string, ...args: unknown[]) {\n console.debug(`${this.prefix} - ${message}`, ...args);\n }\n}\n\nexport { PersonaConsoleLogger };\nexport type { PersonaLogger };\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","jsxRuntimeModule","require$$0","removeEmptyMessages","messages","message","_a","parseMessages","outputMessages","currentMessage","convertMessage","call","PersonaProtocolBase","__publicField","callback","session","status","notify","PersonaRESTProtocol","apiUrl","apiKey","agentId","sessionId","input","personaResponse","PersonaWebSocketProtocol","sid","webSocketUrl","event","data","error","PersonaWebRTCClient","err","track","remoteAudio","e","channel","msg","url","offer","metadata","offerMessage","_b","label","localSource","remoteSource","loop","localArray","remoteArray","localAmp","a","b","remoteAmp","PersonaWebRTCProtocol","_c","PersonaRuntimeContext","createContext","PersonaRuntimeProviderInner","dev","_protocols","logger","children","defaultSession","isRunning","setIsRunning","useState","setMessages","setSession","protocolsStatus","setProtocolsStatus","didMount","useRef","protocols","useMemo","baseEndpoint","baseEndpointProtocol","baseWebSocketProtocol","restConfig","webrtcConfig","websocketConfig","useEffect","protocol","currentConversation","onNew","onCancel","useCallback","onReload","runtime","useExternalStoreRuntime","jsx","AssistantRuntimeProvider","PersonaRuntimeProvider","usePersonaRuntime","context","useContext","usePersonaRuntimeProtocol","protocolInstance","p","usePersonaRuntimeWebRTCProtocol","PersonaConsoleLogger","args"],"mappings":"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","x_google_ignoreList":[0,1]}
|