@applica-software-guru/persona-sdk 0.1.44-preview9 → 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.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 C, useRef as _, useMemo as B, useEffect as K, useCallback as v } from "react";
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 r = null;
23
- if (a !== void 0 && (r = "" + a), n.key !== void 0 && (r = "" + n.key), "key" in n) {
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 l in n)
26
- l !== "key" && (a[l] = n[l]);
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: r,
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, r = this.session ?? "new", l = e, h = await (await fetch(`${s}/agents/${a}/sessions/${r}/messages`, {
140
- body: JSON.stringify({ userMessage: l }),
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 I extends x {
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 l;
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
- (l = this.config.logger) == null || l.debug("Connecting to WebSocket with sessionId:", s);
177
- const n = encodeURIComponent(this.config.apiKey), a = this.config.agentId, r = `${this.config.webSocketUrl}?sessionCode=${s}&agentId=${a}&apiKey=${n}`;
178
- return this.setStatus("connecting"), this.webSocket = new WebSocket(r), this.webSocket.addEventListener("open", () => {
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 e;
221
- if (!this.isConnected) {
222
- this.isConnected = !0;
223
- try {
224
- this.localStream = await navigator.mediaDevices.getUserMedia({ audio: !0 });
225
- } catch (s) {
226
- (e = this.config.logger) == null || e.error("Error accessing microphone:", s);
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((s) => {
241
- this.pc.addTrack(s, this.localStream);
242
- }), this.pc.ontrack = (s) => {
243
- s.streams[0].getTracks().forEach((a) => {
244
- this.remoteStream.addTrack(a);
245
- }), this.audioCtx || this._startAnalyzers();
246
- const n = new Audio();
247
- n.srcObject = this.remoteStream, n.play().catch((a) => {
248
- var r;
249
- (r = this.config.logger) == null || r.error("Error playing remote audio:", a);
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 r = n.reduce((u, h) => u + h, 0) / n.length, l = a.reduce((u, h) => u + h, 0) / a.length;
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: r,
348
- remoteAmplitude: l
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 $ extends x {
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 [r, l] = C(!1), [u, h] = C([]), [f, D] = C(n), [m, W] = C(/* @__PURE__ */ new Map()), R = _(!1), y = B(() => {
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 c = i ? "localhost:8000" : "persona.applica.guru/api", p = i ? "http" : "https", g = i ? "ws" : "wss";
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 b = t[d];
414
- return b === !0 ? new T({
415
- apiUrl: `${p}://${c}`,
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(b);
421
+ }) : new T(C);
420
422
  case "webrtc":
421
423
  const A = t[d];
422
- return A === !0 ? new $({
423
- webrtcUrl: `${g}://${c}/webrtc`,
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 $(A);
429
+ }) : new I(A);
428
430
  case "websocket":
429
431
  const E = t[d];
430
- return E === !0 ? new I({
431
- webSocketUrl: `${g}://${c}/websocket`,
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 I(E);
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
- K(() => {
445
+ B(() => {
444
446
  R.current || (R.current = !0, e == null || e.debug(
445
447
  "Initializing protocols: ",
446
- y.map((c) => c.getName())
447
- ), y.forEach((c) => {
448
- c.setSession(f), c.clearListeners(), c.addStatusChangeListener((p) => {
449
- e == null || e.debug(`${c.getName()} has notified new status: ${p}`), m.set(c.getName(), p), W(new Map(m));
450
- }), c.addMessageListener((p) => {
451
- h((g) => Q([...g, { ...p, protocol: c.getName() }]));
452
- }), c.autostart && c.status === "disconnected" && (e == null || e.debug(`Connecting to protocol: ${c.getName()}`), c.connect(f));
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 (c) => {
457
+ const L = async (l) => {
456
458
  var S;
457
- if (((S = c.content[0]) == null ? void 0 : S.type) !== "text") throw new Error("Only text messages are supported");
458
- const p = c.content[0].text;
459
- h((d) => [...d, { role: "user", type: "text", text: p }]), l(!0);
460
- const g = y.sort((d, b) => b.getPriority() - d.getPriority()).find((d) => d.status === "connected");
461
- await (g == null ? void 0 : g.send(p)), l(!1);
462
- }, O = v(() => (l(!1), h([]), D("new"), Promise.resolve()), []), j = v(() => Promise.resolve(), []), F = Y({
463
- isRunning: r,
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
- $ as PersonaWebRTCProtocol,
531
- I as PersonaWebSocketProtocol,
532
+ I as PersonaWebRTCProtocol,
533
+ $ as PersonaWebSocketProtocol,
532
534
  oe as usePersonaRuntime,
533
535
  te as usePersonaRuntimeProtocol,
534
536
  re as usePersonaRuntimeWebRTCProtocol
@@ -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","'use strict';\n'use client';\nimport { 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","'use strict';\n'use client';\nimport { 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","'use strict';\n'use client';\nimport { 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","'use strict';\n'use client';\n\nimport { 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]}