@applica-software-guru/persona-sdk 0.1.57 → 0.1.58

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 J = Object.defineProperty;
2
2
  var K = (a, t, e) => t in a ? J(a, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : a[t] = e;
3
3
  var o = (a, t, e) => K(a, typeof t != "symbol" ? t + "" : t, e);
4
- import { createContext as q, useContext as E, useState as P, useRef as _, useMemo as B, useEffect as Y, useCallback as v } from "react";
4
+ import { createContext as q, useContext as E, useState as x, useRef as _, useMemo as B, useEffect as Y, useCallback as v } from "react";
5
5
  import { useExternalStoreRuntime as G, CompositeAttachmentAdapter as V, SimpleImageAttachmentAdapter as H, AssistantRuntimeProvider as Q } from "@assistant-ui/react";
6
6
  var D = { exports: {} }, C = {};
7
7
  /**
@@ -84,7 +84,7 @@ function ee(a) {
84
84
  content: a.type === "reasoning" ? [{ type: "reasoning", text: a.text }, ...t] : [{ type: "text", text: a.text }, ...t]
85
85
  };
86
86
  }
87
- class x {
87
+ class P {
88
88
  constructor() {
89
89
  o(this, "statusChangeCallbacks", []);
90
90
  o(this, "messageCallbacks", []);
@@ -119,7 +119,7 @@ class x {
119
119
  onTransaction(t) {
120
120
  }
121
121
  }
122
- class N extends x {
122
+ class N extends P {
123
123
  constructor(e) {
124
124
  super();
125
125
  o(this, "status");
@@ -145,7 +145,7 @@ class N extends x {
145
145
  this.session = e;
146
146
  }
147
147
  async send(e) {
148
- const { apiUrl: n, apiKey: s, agentId: i } = this.config, c = this.session ?? "new", l = e, h = await (await fetch(`${n}/agents/${i}/sessions/${c}/messages`, {
148
+ const { apiUrl: n, apiKey: s, agentId: i } = this.config, c = this.session ?? "new", l = e, f = await (await fetch(`${n}/agents/${i}/sessions/${c}/messages`, {
149
149
  body: JSON.stringify({ userMessage: l }),
150
150
  method: "POST",
151
151
  headers: {
@@ -155,14 +155,14 @@ class N extends x {
155
155
  }
156
156
  })).json();
157
157
  this.notifyMessages(
158
- h.response.messages.map((b) => ({
158
+ f.response.messages.map((b) => ({
159
159
  type: "message",
160
160
  payload: b
161
161
  }))
162
162
  );
163
163
  }
164
164
  }
165
- class I extends x {
165
+ class I extends P {
166
166
  constructor(e) {
167
167
  super();
168
168
  o(this, "status");
@@ -192,14 +192,14 @@ class I extends x {
192
192
  return this.setStatus("connecting"), this.webSocket = new WebSocket(c), this.webSocket.addEventListener("open", () => {
193
193
  this.setStatus("connected");
194
194
  }), this.webSocket.addEventListener("message", (u) => {
195
- const h = JSON.parse(u.data);
196
- this.notifyMessage(h);
195
+ const f = JSON.parse(u.data);
196
+ this.notifyMessage(f);
197
197
  }), this.webSocket.addEventListener("close", () => {
198
198
  var u;
199
199
  this.setStatus("disconnected"), this.webSocket = null, (u = this.config.logger) == null || u.warn("WebSocket connection closed");
200
200
  }), this.webSocket.addEventListener("error", (u) => {
201
- var h;
202
- this.setStatus("disconnected"), this.webSocket = null, (h = this.config.logger) == null || h.error("WebSocket error", u);
201
+ var f;
202
+ this.setStatus("disconnected"), this.webSocket = null, (f = this.config.logger) == null || f.error("WebSocket error", u);
203
203
  }), Promise.resolve(n);
204
204
  }
205
205
  disconnect() {
@@ -354,7 +354,7 @@ class te {
354
354
  return;
355
355
  const s = new Uint8Array(this.localAnalyser.frequencyBinCount), i = new Uint8Array(this.remoteAnalyser.frequencyBinCount);
356
356
  this.localAnalyser.getByteFrequencyData(s), this.remoteAnalyser.getByteFrequencyData(i);
357
- const c = s.reduce((u, h) => u + h, 0) / s.length, l = i.reduce((u, h) => u + h, 0) / i.length;
357
+ const c = s.reduce((u, f) => u + f, 0) / s.length, l = i.reduce((u, f) => u + f, 0) / i.length;
358
358
  this.visualizerCallbacks.length > 0 && this.visualizerCallbacks.forEach((u) => {
359
359
  u({
360
360
  localAmplitude: c,
@@ -368,7 +368,7 @@ class te {
368
368
  this.analyzerFrame && (cancelAnimationFrame(this.analyzerFrame), this.analyzerFrame = null), this.localAnalyser = null, this.remoteAnalyser = null;
369
369
  }
370
370
  }
371
- class z extends x {
371
+ class z extends P {
372
372
  constructor(e) {
373
373
  super();
374
374
  o(this, "status");
@@ -463,7 +463,7 @@ class ne {
463
463
  await this.manager.fail(this.transaction, { success: !1, output: null, error: t });
464
464
  }
465
465
  }
466
- class ie extends x {
466
+ class ie extends P {
467
467
  constructor(e) {
468
468
  super();
469
469
  o(this, "status");
@@ -522,52 +522,52 @@ function oe({
522
522
  session: s = "new",
523
523
  ...i
524
524
  }) {
525
- const [c, l] = P(!1), [u, h] = P([]), [b, W] = P(s), [S, j] = P(/* @__PURE__ */ new Map()), T = _(!1), m = B(() => {
525
+ const [c, l] = x(!1), [u, f] = x([]), [b, U] = x(s), [S, W] = x(/* @__PURE__ */ new Map()), T = _(!1), m = B(() => {
526
526
  if (Array.isArray(t))
527
527
  return t;
528
528
  if (typeof t == "object" && t !== null) {
529
- const r = a ? "localhost:8000" : "persona.applica.guru/api", f = a ? "http" : "https", y = a ? "ws" : "wss";
530
- let g = Object.keys(t).map((p) => {
531
- switch (p) {
529
+ const r = a ? "localhost:8000" : "persona.applica.guru/api", p = a ? "http" : "https", d = a ? "ws" : "wss";
530
+ let y = Object.keys(t).map((g) => {
531
+ switch (g) {
532
532
  case "rest":
533
- const d = t[p];
534
- return d === !0 ? new N({
535
- apiUrl: `${f}://${r}`,
533
+ const h = t[g];
534
+ return h === !0 ? new N({
535
+ apiUrl: `${p}://${r}`,
536
536
  apiKey: i.apiKey,
537
537
  agentId: i.agentId,
538
538
  logger: e
539
- }) : typeof d == "object" && d !== null ? new N(d) : null;
539
+ }) : typeof h == "object" && h !== null ? new N(h) : null;
540
540
  case "webrtc":
541
- const w = t[p];
541
+ const w = t[g];
542
542
  return w === !0 ? new z({
543
- webrtcUrl: `${y}://${r}/webrtc`,
543
+ webrtcUrl: `${d}://${r}/webrtc`,
544
544
  apiKey: i.apiKey,
545
545
  agentId: i.agentId,
546
546
  logger: e
547
547
  }) : typeof w == "object" && w !== null ? new z(w) : null;
548
548
  case "websocket":
549
- const k = t[p];
549
+ const k = t[g];
550
550
  return k === !0 ? new I({
551
- webSocketUrl: `${y}://${r}/websocket`,
551
+ webSocketUrl: `${d}://${r}/websocket`,
552
552
  apiKey: i.apiKey,
553
553
  agentId: i.agentId,
554
554
  logger: e
555
555
  }) : typeof k == "object" && k !== null ? new I(k) : null;
556
556
  default:
557
- throw new Error(`Unknown protocol: ${p}`);
557
+ throw new Error(`Unknown protocol: ${g}`);
558
558
  }
559
- }).filter((p) => p !== null);
560
- return i.tools && g.push(
559
+ }).filter((g) => g !== null);
560
+ return i.tools && y.push(
561
561
  new ie({
562
- apiUrl: `${f}://${r}`,
562
+ apiUrl: `${p}://${r}`,
563
563
  apiKey: i.apiKey,
564
564
  agentId: i.agentId,
565
- onTransaction: async (p) => {
566
- await p.invoke(i.tools);
565
+ onTransaction: async (g) => {
566
+ await g.invoke(i.tools);
567
567
  },
568
568
  logger: e
569
569
  })
570
- ), g;
570
+ ), y;
571
571
  }
572
572
  throw new Error("Invalid protocols configuration");
573
573
  }, []);
@@ -576,51 +576,56 @@ function oe({
576
576
  "Initializing protocols: ",
577
577
  m.map((r) => r.getName())
578
578
  ), m.forEach((r) => {
579
- r.setSession(b), r.clearListeners(), r.addStatusChangeListener((f) => {
580
- e == null || e.debug(`${r.getName()} has notified new status: ${f}`), S.set(r.getName(), f), j(new Map(S));
581
- }), r.addMessageListener((f) => {
582
- if (f.type === "message") {
583
- const y = f.payload;
584
- h(
585
- (g) => M([...g, { ...y, protocol: r.getName() }])
579
+ r.setSession(b), r.clearListeners(), r.addStatusChangeListener((p) => {
580
+ e == null || e.debug(`${r.getName()} has notified new status: ${p}`), S.set(r.getName(), p), W(new Map(S));
581
+ }), r.addMessageListener((p) => {
582
+ if (p.type === "message") {
583
+ const d = p.payload;
584
+ f(
585
+ (y) => M([...y, { ...d, protocol: r.getName() }])
586
586
  );
587
- } else if (f.type === "reasoning") {
588
- const g = { type: "reasoning", text: f.payload.thought, role: "assistant", finishReason: "stop" };
589
- h(
590
- (p) => M([...p, { ...g, protocol: r.getName() }])
587
+ } else if (p.type === "reasoning") {
588
+ const d = p.payload;
589
+ let y = d.thought;
590
+ d.imageUrl && (y += `
591
+
592
+ ![image](https://persona.applica.guru/api/files/${d.imageUrl})`);
593
+ const g = { type: "reasoning", text: y, role: "assistant", finishReason: "stop" };
594
+ f(
595
+ (h) => M([...h, { ...g, protocol: r.getName() }])
591
596
  );
592
- } else f.type === "transaction" && m.filter((y) => y !== r).forEach((y) => y.onTransaction(f.payload));
597
+ } else p.type === "transaction" && m.filter((d) => d !== r).forEach((d) => d.onTransaction(p.payload));
593
598
  }), r.autostart && r.status === "disconnected" && (e == null || e.debug(`Connecting to protocol: ${r.getName()}`), r.connect(b));
594
599
  }));
595
600
  }, [b, m, e, S]);
596
- const O = async (r) => {
597
- var p;
598
- if (((p = r.content[0]) == null ? void 0 : p.type) !== "text") throw new Error("Only text messages are supported");
599
- const f = r.content[0].text;
600
- h((d) => [...d, { role: "user", type: "text", text: f }]), l(!0);
601
- const y = m.sort((d, w) => w.getPriority() - d.getPriority()).find((d) => d.status === "connected"), g = [];
601
+ const j = async (r) => {
602
+ var g;
603
+ if (((g = r.content[0]) == null ? void 0 : g.type) !== "text") throw new Error("Only text messages are supported");
604
+ const p = r.content[0].text;
605
+ f((h) => [...h, { role: "user", type: "text", text: p }]), l(!0);
606
+ const d = m.sort((h, w) => w.getPriority() - h.getPriority()).find((h) => h.status === "connected"), y = [];
602
607
  if (r.attachments)
603
- for (const d of r.attachments)
604
- d.contentType.startsWith("image/") && d.file && g.push({
608
+ for (const h of r.attachments)
609
+ h.contentType.startsWith("image/") && h.file && y.push({
605
610
  role: "user",
606
611
  image: {
607
- contentType: d.contentType,
608
- content: await ae(d.file)
612
+ contentType: h.contentType,
613
+ content: await ae(h.file)
609
614
  },
610
615
  text: "",
611
616
  type: "text"
612
617
  });
613
- r.content && g.push({
618
+ r.content && y.push({
614
619
  role: "user",
615
620
  text: r.content[0].text,
616
621
  type: "text"
617
- }), e == null || e.debug("Sending message:", g), await (y == null ? void 0 : y.send(g)), l(!1);
618
- }, U = v(() => (l(!1), h([]), W("new"), Promise.resolve()), []), L = v(() => Promise.resolve(), []), F = G({
622
+ }), e == null || e.debug("Sending message:", y), await (d == null ? void 0 : d.send(y)), l(!1);
623
+ }, O = v(() => (l(!1), f([]), U("new"), Promise.resolve()), []), L = v(() => Promise.resolve(), []), F = G({
619
624
  isRunning: c,
620
625
  messages: u,
621
626
  convertMessage: ee,
622
- onNew: O,
623
- onCancel: U,
627
+ onNew: j,
628
+ onCancel: O,
624
629
  onReload: L,
625
630
  adapters: {
626
631
  attachments: new V([new H()])
@@ -670,7 +675,7 @@ function fe() {
670
675
  function pe() {
671
676
  return re("webrtc");
672
677
  }
673
- class ye {
678
+ class ge {
674
679
  constructor() {
675
680
  o(this, "prefix", "[Persona]");
676
681
  }
@@ -691,8 +696,8 @@ class ye {
691
696
  }
692
697
  }
693
698
  export {
694
- ye as PersonaConsoleLogger,
695
- x as PersonaProtocolBase,
699
+ ge as PersonaConsoleLogger,
700
+ P as PersonaProtocolBase,
696
701
  N as PersonaRESTProtocol,
697
702
  he as PersonaRuntimeProvider,
698
703
  ie as PersonaTransactionProtocol,
@@ -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/protocol/transaction.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 { FileContentPart, 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 === 'transaction') {\n continue;\n }\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 currentMessage.files = [...(currentMessage.files ?? []), ...(message.files ?? [])];\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 const cleanMessages = removeEmptyMessages(outputMessages);\n return cleanMessages;\n}\n\nfunction convertMessage(message: PersonaMessage): ThreadMessageLike {\n const files =\n message.files?.map(\n (file) =>\n ({\n type: 'file',\n data: file.url,\n mimeType: file.contentType,\n } as FileContentPart),\n ) ?? [];\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:\n message.type === 'reasoning'\n ? [{ type: 'reasoning', text: message.text }, ...files]\n : [{ type: 'text', text: message.text }, ...files],\n };\n}\n\nexport { parseMessages, convertMessage, removeEmptyMessages };\n","import {\n MessageListenerCallback,\n PersonaMessage,\n PersonaPayload,\n PersonaProtocol,\n PersonaTransaction,\n ProtocolStatus,\n Session,\n StatusChangeCallback,\n} 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: PersonaPayload): Promise<void> {\n this.messageCallbacks.forEach((callback) => callback(message));\n }\n public async notifyMessages(messages: PersonaPayload[]): 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: Array<PersonaMessage> | PersonaMessage): Promise<void>;\n\n public onTransaction(_: PersonaTransaction) {}\n}\n\nexport { PersonaProtocolBase };\n","import { PersonaProtocolBase } from './base';\nimport { PersonaResponse, Session, ProtocolStatus, PersonaProtocolBaseConfig, PersonaMessage } 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 100;\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: Array<PersonaMessage> | PersonaMessage): 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(\n personaResponse.response.messages.map((payload) => ({\n type: 'message',\n payload,\n })),\n );\n }\n}\n\nexport { PersonaRESTProtocol };\nexport type { PersonaRESTProtocolConfig };\n","import { PersonaMessage, PersonaPayload, 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 500;\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 PersonaPayload;\n this.notifyMessage(data);\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: Array<PersonaMessage> | PersonaMessage): 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 { PersonaMessage, PersonaPayload, 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: Array<PersonaMessage> | PersonaMessage): 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(JSON.stringify({ type: 'request', payload: 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 const data = JSON.parse(msg.data) as PersonaPayload;\n this.notifyMessage(data);\n });\n }\n\n public getName(): string {\n return 'webrtc';\n }\n public getPriority(): number {\n return 1000;\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: Array<PersonaMessage> | PersonaMessage): Promise<void> {\n if (this.status !== 'connected') {\n return Promise.reject(new Error('Not connected'));\n }\n\n this.webRTCClient.sendMessage(message);\n return Promise.resolve();\n }\n}\n\nexport { PersonaWebRTCProtocol };\nexport type { PersonaWebRTCProtocolConfig, AudioVisualizerCallback, AudioAnalysisData };\n","import { PersonaProtocolBase } from './base';\nimport {\n Session,\n ProtocolStatus,\n PersonaProtocolBaseConfig,\n PersonaTransaction,\n FunctionCall,\n ReadonlyJSONObject,\n PersonaMessage,\n} from '../types';\n\ntype FinishTransactionRequest = {\n success: boolean;\n output: any;\n error: string | null;\n};\n\nclass PersonaTransactionsManager {\n private config: PersonaTransactionProtocolConfig;\n\n constructor(config: PersonaTransactionProtocolConfig) {\n this.config = config;\n }\n\n async complete(transaction: PersonaTransaction, request: FinishTransactionRequest): Promise<void> {\n await this.persist(transaction, { ...request, success: true });\n this.config.logger?.debug('Transaction completed:', transaction);\n }\n\n async fail(transaction: PersonaTransaction, request: FinishTransactionRequest): Promise<void> {\n await this.persist(transaction, { ...request, success: false });\n this.config.logger?.debug('Transaction failed:', { ...transaction, ...request });\n }\n\n async persist(transaction: PersonaTransaction, request: FinishTransactionRequest): Promise<void> {\n await fetch(`${this.config.apiUrl}/transactions/${transaction.id}`, {\n body: JSON.stringify(request),\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-persona-apikey': this.config.apiKey,\n },\n });\n }\n}\n\nexport type PersonaToolCallback = (args: ReadonlyJSONObject | undefined) => void;\nexport type PersonaTools = {\n [key: string]: PersonaToolCallback;\n};\n\nclass PersonaPersistableTransaction {\n private transaction: PersonaTransaction;\n private manager: PersonaTransactionsManager;\n\n constructor(transaction: PersonaTransaction, manager: PersonaTransactionsManager) {\n this.transaction = transaction;\n this.manager = manager;\n }\n\n public getFunctionCall(): FunctionCall | null {\n return this.transaction.functionCall;\n }\n\n async invoke(tools: PersonaTools): Promise<void> {\n const functionCall = this.transaction.functionCall;\n if (!functionCall) {\n await this.fail('No function call found');\n return;\n }\n const functionName = functionCall.name;\n const functionArgs = functionCall.args;\n const tool = tools[functionName];\n if (!tool) {\n await this.fail(`Tool ${functionName} not found`);\n return;\n }\n try {\n const result = await tool(functionArgs);\n await this.complete(result);\n } catch (error) {\n await this.fail(`Error executing tool ${functionName}: ${error}`);\n }\n }\n async complete(output: any): Promise<void> {\n await this.manager.complete(this.transaction, { success: true, output, error: null });\n }\n async fail(error: string): Promise<void> {\n await this.manager.fail(this.transaction, { success: false, output: null, error });\n }\n}\n\ntype PersonaTransactionCallback = (transaction: PersonaPersistableTransaction) => void;\n\ntype PersonaTransactionProtocolConfig = PersonaProtocolBaseConfig & {\n apiUrl: string;\n onTransaction: PersonaTransactionCallback;\n};\n\nclass PersonaTransactionProtocol extends PersonaProtocolBase {\n status: ProtocolStatus;\n autostart: boolean;\n session: Session;\n config: PersonaTransactionProtocolConfig;\n notify: boolean = true;\n\n constructor(config: PersonaTransactionProtocolConfig) {\n super();\n this.config = config;\n this.status = 'disconnected';\n this.autostart = true;\n }\n\n public getName(): string {\n return 'transaction';\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: Array<PersonaMessage> | PersonaMessage): Promise<void> {\n this.config.logger?.debug('Sending message:', message);\n throw new Error('Not implemented');\n }\n\n public onTransaction(transaction: PersonaTransaction): void {\n if (!this.config.onTransaction) {\n this.config.logger?.error('Transaction protocol config is not set');\n return;\n }\n const manager = new PersonaTransactionsManager(this.config);\n const persistable = new PersonaPersistableTransaction(transaction, manager);\n this.config.onTransaction(persistable);\n }\n}\n\nexport { PersonaTransactionProtocol };\nexport type { PersonaTransactionProtocolConfig, FinishTransactionRequest, PersonaPersistableTransaction, PersonaTransactionCallback };\n","import { useState, useEffect, useCallback, PropsWithChildren, createContext, useContext, useMemo, useRef } from 'react';\nimport {\n useExternalStoreRuntime,\n AppendMessage,\n AssistantRuntimeProvider,\n CompositeAttachmentAdapter,\n SimpleImageAttachmentAdapter,\n} from '@assistant-ui/react';\nimport {\n PersonaConfig,\n PersonaMessage,\n PersonaPayload,\n PersonaProtocol,\n PersonaProtocolBaseConfig,\n PersonaReasoning,\n PersonaResponse,\n PersonaTransaction,\n ProtocolStatus,\n Session,\n} from './types';\nimport { parseMessages, convertMessage } from './messages';\nimport {\n PersonaPersistableTransaction,\n PersonaRESTProtocol,\n PersonaRESTProtocolConfig,\n PersonaTransactionProtocol,\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 fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file); // Converte il file in Data URL (base64)\n\n reader.onload = () => {\n //remove data url using ;base64, to split\n const base64 = reader.result as string;\n const base64WithoutPrefix = base64.split(';base64,')[1];\n resolve(base64WithoutPrefix);\n };\n\n reader.onerror = (error) => {\n reject(error);\n };\n });\n}\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 let availableProtocols = Object.keys(_protocols)\n .map((key) => {\n switch (key) {\n case 'rest':\n const restConfig: PersonaProtocolBaseConfig | boolean | 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 } else if (typeof restConfig === 'object' && restConfig !== null) {\n return new PersonaRESTProtocol(restConfig as PersonaRESTProtocolConfig);\n } else {\n return null;\n }\n case 'webrtc':\n const webrtcConfig: PersonaProtocolBaseConfig | boolean | 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 } else if (typeof webrtcConfig === 'object' && webrtcConfig !== null) {\n return new PersonaWebRTCProtocol(webrtcConfig as PersonaWebRTCProtocolConfig);\n } else {\n return null;\n }\n case 'websocket':\n const websocketConfig: PersonaProtocolBaseConfig | boolean | 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 } else if (typeof websocketConfig === 'object' && websocketConfig !== null) {\n return new PersonaWebSocketProtocol(websocketConfig as PersonaWebSocketProtocolConfig);\n } else {\n return null;\n }\n default:\n throw new Error(`Unknown protocol: ${key}`);\n }\n })\n .filter((protocol) => protocol !== null) as PersonaProtocol[];\n\n if (config.tools) {\n availableProtocols.push(\n new PersonaTransactionProtocol({\n apiUrl: `${baseEndpointProtocol}://${baseEndpoint}`,\n apiKey: config.apiKey,\n agentId: config.agentId,\n onTransaction: async (transaction: PersonaPersistableTransaction) => {\n await transaction.invoke(config.tools!);\n },\n logger,\n }),\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: PersonaPayload) => {\n if (message.type === 'message') {\n const personaMessage = message.payload as PersonaMessage;\n setMessages((currentConversation) =>\n parseMessages([...currentConversation, ...[{ ...personaMessage, protocol: protocol.getName() }]]),\n );\n } else if (message.type === 'reasoning') {\n const personaReasoning = message.payload as PersonaReasoning;\n const personaMessage: PersonaMessage = {\"type\": \"reasoning\", \"text\": personaReasoning.thought, \"role\": \"assistant\", \"finishReason\": \"stop\"};\n \n setMessages((currentConversation) =>\n parseMessages([...currentConversation, ...[{ ...personaMessage, protocol: protocol.getName() }]]),\n );\n\n } else if (message.type === 'transaction') {\n protocols.filter((p) => p !== protocol).forEach((p) => p.onTransaction(message.payload as PersonaTransaction));\n }\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 const content: Array<PersonaMessage> = [];\n if (message.attachments) {\n for (const attachment of message.attachments) {\n if (attachment.contentType.startsWith('image/') && attachment.file) {\n content.push({\n role: 'user',\n image: {\n contentType: attachment.contentType,\n content: await fileToBase64(attachment.file),\n },\n text: '',\n type: 'text',\n });\n }\n }\n }\n\n if (message.content) {\n content.push({\n role: 'user',\n text: message.content[0].text,\n type: 'text',\n });\n }\n logger?.debug('Sending message:', content);\n await protocol?.send(content);\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 adapters: {\n attachments: new CompositeAttachmentAdapter([new SimpleImageAttachmentAdapter()]),\n },\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 usePersonaRuntimeEndpoint(): string {\n const context = useContext(PersonaRuntimeContext);\n if (!context) {\n throw new Error('usePersonaRuntimeEndpoint must be used within a PersonaRuntimeProvider');\n }\n for (const protocol of context.protocols) {\n if (protocol.getName() === 'rest') {\n return (protocol as PersonaRESTProtocol).config.apiUrl;\n }\n }\n throw new Error('REST protocol not found');\n}\n\nfunction usePersonaRuntimeWebRTCProtocol(): PersonaWebRTCProtocol | null {\n return usePersonaRuntimeProtocol('webrtc') as PersonaWebRTCProtocol;\n}\n\nexport { PersonaRuntimeProvider, usePersonaRuntimeEndpoint, 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","files","file","_b","call","PersonaProtocolBase","__publicField","callback","session","status","notify","_","PersonaRESTProtocol","apiUrl","apiKey","agentId","sessionId","input","personaResponse","payload","PersonaWebSocketProtocol","sid","webSocketUrl","event","data","error","PersonaWebRTCClient","err","track","remoteAudio","e","channel","msg","url","offer","metadata","offerMessage","label","localSource","remoteSource","loop","localArray","remoteArray","localAmp","a","b","remoteAmp","PersonaWebRTCProtocol","_c","PersonaTransactionsManager","transaction","request","PersonaPersistableTransaction","manager","tools","functionCall","functionName","functionArgs","tool","result","output","PersonaTransactionProtocol","persistable","PersonaRuntimeContext","createContext","fileToBase64","resolve","reject","reader","base64WithoutPrefix","PersonaRuntimeProviderInner","dev","_protocols","logger","children","defaultSession","isRunning","setIsRunning","useState","setMessages","setSession","protocolsStatus","setProtocolsStatus","didMount","useRef","protocols","useMemo","baseEndpoint","baseEndpointProtocol","baseWebSocketProtocol","availableProtocols","restConfig","webrtcConfig","websocketConfig","protocol","useEffect","personaMessage","currentConversation","p","onNew","content","attachment","onCancel","useCallback","onReload","runtime","useExternalStoreRuntime","CompositeAttachmentAdapter","SimpleImageAttachmentAdapter","jsx","AssistantRuntimeProvider","PersonaRuntimeProvider","usePersonaRuntime","context","useContext","usePersonaRuntimeProtocol","protocolInstance","usePersonaRuntimeEndpoint","usePersonaRuntimeWebRTCProtocol","PersonaConsoleLogger","args"],"mappings":";;;;;;;;;;;;;;;;;;;AAWA,MAAIA,IAAqB,OAAO,IAAI,4BAA4B,GAC9DC,IAAsB,OAAO,IAAI,gBAAgB;AACnD,WAASC,EAAQC,GAAMC,GAAQC,GAAU;AACvC,QAAIC,IAAM;AAGV,QAFWD,MAAX,WAAwBC,IAAM,KAAKD,IACxBD,EAAO,QAAlB,WAA0BE,IAAM,KAAKF,EAAO,MACxC,SAASA,GAAQ;AACnB,MAAAC,IAAW,CAAE;AACb,eAASE,KAAYH;AACnB,QAAUG,MAAV,UAAuBF,EAASE,CAAQ,IAAIH,EAAOG,CAAQ;AAAA,IAC9D,MAAM,CAAAF,IAAWD;AAClB,WAAAA,IAASC,EAAS,KACX;AAAA,MACL,UAAUL;AAAA,MACV,MAAMG;AAAA,MACN,KAAKG;AAAA,MACL,KAAgBF,MAAX,SAAoBA,IAAS;AAAA,MAClC,OAAOC;AAAA,IACR;AAAA;AAEa,SAAAG,EAAA,WAAGP,GACRO,EAAA,MAAGN,GACdM,EAAA,OAAeN;;AC9BNO,EAAA,UAAUC,EAA+C;;ACAlE,SAASC,EAAoBC,GAA8C;AAClE,SAAAA,EAAS,OAAO,CAACC,MAAY;;AAC9B,WAAAA,EAAQ,iBAAiB,SACpBA,EAAQ,SAAS,UAAQC,IAAAD,EAAQ,SAAR,gBAAAC,EAAc,YAAW,KAEpD;AAAA,EAAA,CACR;AACH;AACA,SAASC,EAAcH,GAA8C;AACnE,QAAMI,IAAmC,CAAC;AAC1C,MAAIC,IAAwC;AAE5C,aAAWJ,KAAWD;AAChB,IAAAC,EAAQ,SAAS,kBAGjBA,EAAQ,SAAS,eACfI,KAAkB,SACpBD,EAAe,KAAKC,CAAc,GACjBA,IAAA,OAEnBD,EAAe,KAAKH,CAAO,KAClBA,EAAQ,iBACbI,KACFD,EAAe,KAAKC,CAAc,GAEpCD,EAAe,KAAKH,CAAO,GACVI,IAAA,QACRJ,EAAQ,mBACFG,EAAAA,EAAe,SAAS,CAAC,IAAI;AAAA,MAC1C,GAAGA,EAAeA,EAAe,SAAS,CAAC;AAAA,MAC3C,kBAAkBH,EAAQ;AAAA,IAC5B,IAEAI,KACAJ,EAAQ,aAAaI,EAAe,aACnCA,EAAe,SAASJ,EAAQ,QAAQA,EAAQ,iBAAiB,WAElEI,EAAe,QAAQJ,EAAQ,MAChBI,EAAA,QAAQ,CAAC,GAAIA,EAAe,SAAS,CAAA,GAAK,GAAIJ,EAAQ,SAAS,EAAG,MAE7EI,KACFD,EAAe,KAAKC,CAAc,GAEnBA,IAAA;AAAA,MACf,GAAGJ;AAAA,IACL;AAIJ,SAAII,KACFD,EAAe,KAAKC,CAAc,GAEdN,EAAoBK,CAAc;AAE1D;AAEA,SAASE,GAAeL,GAA4C;;AAC5D,QAAAM,MACJL,IAAAD,EAAQ,UAAR,gBAAAC,EAAe;AAAA,IACb,CAACM,OACE;AAAA,MACC,MAAM;AAAA,MACN,MAAMA,EAAK;AAAA,MACX,UAAUA,EAAK;AAAA,IACjB;AAAA,QACC,CAAC;AACJ,SAAAP,EAAQ,SAAS,aACZ;AAAA,IACL,IAAIA,EAAQ;AAAA,IACZ,MAAM;AAAA,IACN,SAAQA,KAAA,gBAAAA,EAAS,sBAAqB,OAAO,EAAE,MAAM,UAAU,IAAI,EAAE,MAAM,YAAY,QAAQ,OAAO;AAAA,IACtG,WACEQ,IAAAR,EAAQ,kBAAR,gBAAAQ,EAAuB,IAAI,CAACC,MAAU;;AAAA;AAAA,QACpC,MAAM;AAAA,QACN,UAAUA,EAAK;AAAA,QACf,YAAYA,EAAK;AAAA,QACjB,MAAMA,EAAK;AAAA,QACX,SAAQR,IAAAD,EAAQ,qBAAR,gBAAAC,EAA0B;AAAA,MACpC;AAAA,WAAO,CAAA;AAAA,EACX,IAEK;AAAA,IACL,IAAID,EAAQ;AAAA,IACZ,MAAMA,EAAQ;AAAA,IACd,SACEA,EAAQ,SAAS,cACb,CAAC,EAAE,MAAM,aAAa,MAAMA,EAAQ,KAAK,GAAG,GAAGM,CAAK,IACpD,CAAC,EAAE,MAAM,QAAQ,MAAMN,EAAQ,KAAQ,GAAA,GAAGM,CAAK;AAAA,EACvD;AACF;AClFA,MAAeI,EAA+C;AAAA,EAA9D;AAKU,IAAAC,EAAA,+BAAgD,CAAC;AACjD,IAAAA,EAAA,0BAA8C,CAAC;AAAA;AAAA,EAEhD,wBAAwBC,GAAgC;AACxD,SAAA,sBAAsB,KAAKA,CAAQ;AAAA,EAAA;AAAA,EAGnC,mBAAmBA,GAAmC;AACtD,SAAA,iBAAiB,KAAKA,CAAQ;AAAA,EAAA;AAAA,EAErC,MAAa,YAAYC,GAAiC;AACxD,SAAK,UAAUA;AAAA,EAAA;AAAA,EAGjB,MAAa,cAAcb,GAAwC;AACjE,SAAK,iBAAiB,QAAQ,CAACY,MAAaA,EAASZ,CAAO,CAAC;AAAA,EAAA;AAAA,EAE/D,MAAa,eAAeD,GAA2C;AAC5D,IAAAA,EAAA,QAAQ,CAACC,MAAY;AAC5B,WAAK,iBAAiB,QAAQ,CAACY,MAAaA,EAASZ,CAAO,CAAC;AAAA,IAAA,CAC9D;AAAA,EAAA;AAAA,EAGH,MAAa,WAAWa,GAAiC;AACvD,SAAK,UAAUA;AAAA,EAAA;AAAA,EAEjB,MAAa,UAAUC,GAAuC;AACtD,UAAAC,IAAS,KAAK,WAAWD;AAE/B,IADA,KAAK,SAASA,GACTC,KAGL,KAAK,sBAAsB,QAAQ,CAACH,MAAaA,EAASE,CAAM,CAAC;AAAA,EAAA;AAAA,EAG5D,iBAAuB;AAC5B,SAAK,wBAAwB,CAAC,GAC9B,KAAK,mBAAmB,CAAC;AAAA,EAAA;AAAA,EASpB,cAAcE,GAAuB;AAAA,EAAA;AAC9C;ACxDA,MAAMC,UAA4BP,EAAoB;AAAA,EAOpD,YAAYnB,GAAmC;AACvC,UAAA;AAPR,IAAAoB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,gBAAkB;AAIhB,SAAK,SAASpB,GACd,KAAK,SAAS,gBACd,KAAK,YAAY;AAAA,EAAA;AAAA,EAGZ,UAAkB;AAChB,WAAA;AAAA,EAAA;AAAA,EAGF,cAAsB;AACpB,WAAA;AAAA,EAAA;AAAA,EAGT,MAAa,QAAQsB,GAAoC;AACvD,gBAAK,UAAU,WAAW,GACnBA;AAAA,EAAA;AAAA,EAGT,MAAa,aAA4B;AACvC,SAAK,UAAU,cAAc,GAC7B,KAAK,UAAU;AAAA,EAAA;AAAA,EAGjB,MAAa,YAAYA,GAAiC;AACxD,SAAK,UAAUA;AAAA,EAAA;AAAA,EAGjB,MAAa,KAAKb,GAAgE;AAChF,UAAM,EAAE,QAAAkB,GAAQ,QAAAC,GAAQ,SAAAC,MAAY,KAAK,QACnCC,IAAY,KAAK,WAAW,OAC5BC,IAAQtB,GAWRuB,IAAmB,OATR,MAAM,MAAM,GAAGL,CAAM,WAAWE,CAAO,aAAaC,CAAS,aAAa;AAAA,MACzF,MAAM,KAAK,UAAU,EAAE,aAAaC,GAAO;AAAA,MAC3C,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,gBAAgBH;AAAA,QAChB,oBAAoBA;AAAA,MAAA;AAAA,IACtB,CACD,GACuC,KAAK;AACxC,SAAA;AAAA,MACHI,EAAgB,SAAS,SAAS,IAAI,CAACC,OAAa;AAAA,QAClD,MAAM;AAAA,QACN,SAAAA;AAAA,MAAA,EACA;AAAA,IACJ;AAAA,EAAA;AAEJ;AC1DA,MAAMC,UAAiCf,EAAoB;AAAA,EAOzD,YAAYnB,GAAwC;AAC5C,UAAA;AAPR,IAAAoB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAIE,SAAK,SAASpB,GACd,KAAK,SAAS,gBACd,KAAK,YAAY,IACjB,KAAK,UAAU,MACf,KAAK,YAAY;AAAA,EAAA;AAAA,EAGZ,UAAkB;AAChB,WAAA;AAAA,EAAA;AAAA,EAGF,cAAsB;AACpB,WAAA;AAAA,EAAA;AAAA,EAGT,MAAa,YAAYsB,GAAiC;;AACxD,KAAAZ,IAAA,KAAK,OAAO,WAAZ,QAAAA,EAAoB,MAAM,4CAA4CY,IACtE,KAAK,UAAUA,GACX,KAAK,aAAa,KAAK,WAAW,gBACpC,KAAK,WAAW,GAChB,KAAK,QAAQA,CAAO;AAAA,EACtB;AAAA,EAGK,QAAQA,GAAqC;;AAClD,QAAI,KAAK,cAAc,QAAQ,KAAK,WAAW;AACtC,aAAA,QAAQ,QAAQ,KAAK,OAAO;AAG/B,UAAAa,IAAMb,KAAW,KAAK,WAAW;AAEvC,KAAAZ,IAAA,KAAK,OAAO,WAAZ,QAAAA,EAAoB,MAAM,2CAA2CyB;AAErE,UAAMP,IAAS,mBAAmB,KAAK,OAAO,MAAM,GAC9CC,IAAU,KAAK,OAAO,SACtBO,IAAe,GAAG,KAAK,OAAO,YAAY,gBAAgBD,CAAG,YAAYN,CAAO,WAAWD,CAAM;AACvG,gBAAK,UAAU,YAAY,GACtB,KAAA,YAAY,IAAI,UAAUQ,CAAY,GACtC,KAAA,UAAU,iBAAiB,QAAQ,MAAM;AAC5C,WAAK,UAAU,WAAW;AAAA,IAAA,CAC3B,GACD,KAAK,UAAU,iBAAiB,WAAW,CAACC,MAAU;AACpD,YAAMC,IAAO,KAAK,MAAMD,EAAM,IAAI;AAClC,WAAK,cAAcC,CAAI;AAAA,IAAA,CACxB,GACI,KAAA,UAAU,iBAAiB,SAAS,MAAM;;AAC7C,WAAK,UAAU,cAAc,GAC7B,KAAK,YAAY,OACZ5B,IAAA,KAAA,OAAO,WAAP,QAAAA,EAAe,KAAK;AAAA,IAA6B,CACvD,GAED,KAAK,UAAU,iBAAiB,SAAS,CAAC6B,MAAU;;AAClD,WAAK,UAAU,cAAc,GAC7B,KAAK,YAAY,OACjB7B,IAAA,KAAK,OAAO,WAAZ,QAAAA,EAAoB,MAAM,mBAAmB6B;AAAA,IAAK,CAGnD,GAEM,QAAQ,QAAQJ,CAAG;AAAA,EAAA;AAAA,EAGrB,aAA4B;;AAC5B,YAAAzB,IAAA,KAAA,OAAO,WAAP,QAAAA,EAAe,MAAM,4BACtB,KAAK,aAAa,KAAK,WAAW,gBACpC,KAAK,UAAU,MAAM,GACrB,KAAK,UAAU,cAAc,GAC7B,KAAK,YAAY,OAEZ,QAAQ,QAAQ;AAAA,EAAA;AAAA,EAGlB,KAAKD,GAAgE;AAC1E,WAAI,KAAK,aAAa,KAAK,WAAW,eAC/B,KAAA,UAAU,KAAK,KAAK,UAAU,EAAE,MAAM,WAAW,SAASA,EAAQ,CAAC,CAAC,GAClE,QAAQ,QAAQ,KAEhB,QAAQ,OAAO,IAAI,MAAM,4BAA4B,CAAC;AAAA,EAC/D;AAEJ;AC/EA,MAAM+B,GAAoB;AAAA,EAiBxB,YAAYxC,GAA6B;AAhBjC,IAAAoB,EAAA;AACA,IAAAA,EAAA,YAA+B;AAC/B,IAAAA,EAAA,YAAuB;AACvB,IAAAA,EAAA,qBAAkC;AAClC,IAAAA,EAAA,sBAA4B,IAAI,YAAY;AAC5C,IAAAA,EAAA,kBAAgC;AAEhC,IAAAA,EAAA,uBAAqC;AACrC,IAAAA,EAAA,wBAAsC;AACtC,IAAAA,EAAA,uBAA+B;AAC/B,IAAAA,EAAA,qBAAqC;AAErC,IAAAA,EAAA,qBAAuB;AACvB,IAAAA,EAAA,6BAAiD,CAAC;AAClD,IAAAA,EAAA,0BAAmD,CAAC;AAG1D,SAAK,SAASpB;AAAA,EAAA;AAAA,EAGhB,MAAa,QAAQsB,GAAoC;;AACvD,QAAI,KAAK,YAAa;AAEtB,SAAK,cAAc;AAEf,QAAA;AACG,WAAA,cAAc,MAAM,UAAU,aAAa,aAAa,EAAE,OAAO,IAAM;AAAA,aACrEmB,GAAK;AACZ,OAAA/B,IAAA,KAAK,OAAO,WAAZ,QAAAA,EAAoB,MAAM,+BAA+B+B;AACzD;AAAA,IAAA;AAGG,SAAA,KAAK,IAAI,kBAAkB;AAAA,MAC9B,YAAY,KAAK,OAAO,cAAc;AAAA,QACpC;AAAA,UACE,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,UAAU;AAAA,UACV,YAAY;AAAA,QAAA;AAAA,MACd;AAAA,IACF,CACD,GAED,KAAK,YAAY,UAAY,EAAA,QAAQ,CAACC,MAAU;AAC9C,WAAK,GAAI,SAASA,GAAO,KAAK,WAAY;AAAA,IAAA,CAC3C,GAEI,KAAA,GAAG,UAAU,CAACL,MAAU;AAC3B,MAAAA,EAAM,QAAQ,CAAC,EAAE,YAAY,QAAQ,CAACK,MAAU;AACzC,aAAA,aAAa,SAASA,CAAK;AAAA,MAAA,CACjC,GAEI,KAAK,YACR,KAAK,gBAAgB;AAGjB,YAAAC,IAAc,IAAI,MAAM;AAC9B,MAAAA,EAAY,YAAY,KAAK,cAC7BA,EAAY,KAAK,EAAE,MAAM,CAACC,MAAM;;AAC9B,SAAAlC,IAAA,KAAK,OAAO,WAAZ,QAAAA,EAAoB,MAAM,+BAA+BkC;AAAA,MAAC,CAC3D;AAAA,IACH,GAEK,KAAA,GAAG,iBAAiB,CAACP,MAAU;;AAClC,MAAIA,EAAM,eAAa3B,IAAA,KAAK,OAAL,gBAAAA,EAAS,gBAAe,UAAU,QACvD,KAAK,GAAG;AAAA,QACN,KAAK,UAAU;AAAA,UACb,MAAM;AAAA,UACN,KAAK;AAAA,UACL,SAAS,EAAE,WAAW2B,EAAM,UAAU;AAAA,QACvC,CAAA;AAAA,MACH;AAAA,IAEJ,GAEK,KAAA,GAAG,gBAAgB,CAACA,MAAU;AACjC,YAAMQ,IAAUR,EAAM;AACd,MAAAQ,EAAA,YAAY,CAACC,MAAQ;AACtB,aAAA,iBAAiB,QAAQ,CAACzB,MAAa;AAC1C,UAAAA,EAASyB,CAAG;AAAA,QAAA,CACb;AAAA,MACH;AAAA,IACF;AAEM,UAAAC,IAAM,KAAK,OAAO,aAAa;AAChC,SAAA,KAAK,IAAI,UAAU,GAAGA,CAAG,WAAW,mBAAmB,KAAK,OAAO,MAAM,CAAC,EAAE,GAC5E,KAAA,GAAG,SAAS,YAAY;;AAC3B,YAAMC,IAAQ,MAAM,KAAK,GAAI,YAAY;AACnC,YAAA,KAAK,GAAI,oBAAoBA,CAAK;AAExC,YAAMC,IAAW;AAAA,QACf,QAAQ,KAAK,OAAO;AAAA,QACpB,SAAS,KAAK,OAAO;AAAA,QACrB,aAAa3B;AAAA,MACf;AACA,OAAAZ,IAAA,KAAK,OAAO,WAAZ,QAAAA,EAAoB,MAAM,yCAAyCuC;AAEnE,YAAMC,IAAe;AAAA,QACnB,MAAM;AAAA,QACN,OAAKjC,IAAA,OAAO,eAAP,gBAAAA,EAAA,iBAAyB,YAAY,KAAK,IAAI;AAAA,QACnD,SAAS;AAAA,UACP,KAAK;AAAA,YACH,KAAK+B,EAAM;AAAA,YACX,MAAMA,EAAM;AAAA,UACd;AAAA,UACA,eAAe,KAAK,IAAI,IAAI,KAAS,SAAS;AAAA,UAC9C,UAAAC;AAAA,QAAA;AAAA,MAEJ;AAEA,WAAK,GAAI,KAAK,KAAK,UAAUC,CAAY,CAAC;AAAA,IAC5C,GAEK,KAAA,GAAG,YAAY,OAAOb,MAAU;;AACnC,YAAMC,IAAO,KAAK,MAAMD,EAAM,IAAI;AAC9B,UAAAC,EAAK,SAAS;AACV,cAAA,KAAK,GAAI,qBAAqB,IAAI,sBAAsBA,EAAK,QAAQ,GAAG,CAAC;AAAA,eACtEA,EAAK,SAAS;AACnB,YAAA;AACI,gBAAA,KAAK,GAAI,gBAAgB,IAAI,gBAAgBA,EAAK,QAAQ,SAAS,CAAC;AAAA,iBACnEG,GAAK;AACZ,WAAA/B,IAAA,KAAK,OAAO,WAAZ,QAAAA,EAAoB,MAAM,+BAA+B+B;AAAA,QAAG;AAAA,IAGlE,GAEK,KAAA,GAAG,UAAU,MAAM;AACtB,WAAK,eAAe;AAAA,IACtB;AAAA,EAAA;AAAA,EAGF,MAAa,aAA4B;;AACnC,IAAC,KAAK,gBAEV,KAAK,cAAc,MAEf/B,IAAA,KAAK,OAAL,gBAAAA,EAAS,gBAAe,UAAU,QAAM,KAAK,GAAG,MAAM,GACtD,KAAK,MAAS,KAAA,GAAG,MAAM,GACvB,KAAK,eACF,KAAA,YAAY,YAAY,QAAQ,CAACgC,MAAUA,EAAM,MAAM,GAGzD,KAAA,eAAe,IAAI,YAAY,GAChC,KAAK,aACD,MAAA,KAAK,SAAS,MAAM,GAC1B,KAAK,WAAW,OAGlB,KAAK,eAAe;AAAA,EAAA;AAAA,EAGf,sBAAsBrB,GAAyC;AAC/D,SAAA,oBAAoB,KAAKA,CAAQ;AAAA,EAAA;AAAA,EAEjC,mBAAmBA,GAA8C;AACjE,SAAA,iBAAiB,KAAKA,CAAQ;AAAA,EAAA;AAAA,EAG9B,kBAAkB8B,IAAQ,YAAkB;AAC7C,IAAC,KAAK,OACV,KAAK,cAAc,KAAK,GAAG,kBAAkBA,CAAK,GAClD,KAAK,YAAY,SAAS,MAAM;;AAAA,cAAAzC,IAAA,KAAK,OAAO,WAAZ,gBAAAA,EAAoB,KAAK;AAAA,OACpD,KAAA,YAAY,YAAY,CAACoC,MAAsB;AAC7C,WAAA,iBAAiB,QAAQ,CAACzB,MAAa;AAC1C,QAAAA,EAASyB,CAAG;AAAA,MAAA,CACb;AAAA,IACH;AAAA,EAAA;AAAA,EAGK,YAAYrC,GAAuD;;AACpE,QAAA,CAAC,KAAK,aAAa;AAChB,OAAAC,IAAA,KAAA,OAAO,WAAP,QAAAA,EAAe,KAAK;AACzB;AAAA,IAAA;AAGG,SAAA,YAAY,KAAK,KAAK,UAAU,EAAE,MAAM,WAAW,SAASD,EAAQ,CAAC,CAAC,IAC3EQ,IAAA,KAAK,OAAO,WAAZ,QAAAA,EAAoB,KAAK,iBAAiBR;AAAA,EAAO;AAAA,EAG3C,kBAAwB;AAC1B,QAAA,CAAC,KAAK,eAAe,CAAC,KAAK,gBAAgB,KAAK,oBAAoB,WAAW;AACjF;AAIF,SAAK,WAAW,KAAK,OAAO,gBAAiB,OAAe,oBAAoB;AAEhF,UAAM2C,IAAc,KAAK,SAAS,wBAAwB,KAAK,WAAW,GACpEC,IAAe,KAAK,SAAS,wBAAwB,KAAK,YAAY;AAEvE,SAAA,gBAAgB,KAAK,SAAS,eAAe,GAC7C,KAAA,iBAAiB,KAAK,SAAS,eAAe,GACnD,KAAK,cAAc,UAAU,KAC7B,KAAK,eAAe,UAAU,KAElBD,EAAA,QAAQ,KAAK,aAAa,GACzBC,EAAA,QAAQ,KAAK,cAAc;AAExC,UAAMC,IAAO,MAAM;AACb,UAAA,CAAC,KAAK,iBAAiB,CAAC,KAAK,kBAAkB,KAAK,oBAAoB,WAAW;AACrF;AAGF,YAAMC,IAAa,IAAI,WAAW,KAAK,cAAc,iBAAiB,GAChEC,IAAc,IAAI,WAAW,KAAK,eAAe,iBAAiB;AAEnE,WAAA,cAAc,qBAAqBD,CAAU,GAC7C,KAAA,eAAe,qBAAqBC,CAAW;AAE9C,YAAAC,IAAWF,EAAW,OAAO,CAACG,GAAGC,MAAMD,IAAIC,GAAG,CAAC,IAAIJ,EAAW,QAC9DK,IAAYJ,EAAY,OAAO,CAACE,GAAGC,MAAMD,IAAIC,GAAG,CAAC,IAAIH,EAAY;AAEnE,MAAA,KAAK,oBAAoB,SAAS,KAC/B,KAAA,oBAAoB,QAAQ,CAACnC,MAAa;AACpC,QAAAA,EAAA;AAAA,UACP,gBAAgBoC;AAAA,UAChB,iBAAiBG;AAAA,QAAA,CAClB;AAAA,MAAA,CACF,GAGE,KAAA,gBAAgB,sBAAsBN,CAAI;AAAA,IACjD;AAEK,SAAA,gBAAgB,sBAAsBA,CAAI;AAAA,EAAA;AAAA,EAGzC,iBAAuB;AAC7B,IAAI,KAAK,kBACP,qBAAqB,KAAK,aAAa,GACvC,KAAK,gBAAgB,OAEvB,KAAK,gBAAgB,MACrB,KAAK,iBAAiB;AAAA,EAAA;AAE1B;AAMA,MAAMO,UAA8B1C,EAAoB;AAAA,EAOtD,YAAYnB,GAAqC;AACzC,UAAA;AAPR,IAAAoB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAIE,SAAK,SAASpB,GACd,KAAK,SAAS,gBACd,KAAK,UAAU,MACV,KAAA,aAAYA,KAAA,gBAAAA,EAAQ,cAAa,IACjC,KAAA,eAAe,IAAIwC,GAAoBxC,CAAM,GAC7C,KAAA,aAAa,mBAAmB,CAAC8C,MAAsB;AAC1D,YAAMR,IAAO,KAAK,MAAMQ,EAAI,IAAI;AAChC,WAAK,cAAcR,CAAI;AAAA,IAAA,CACxB;AAAA,EAAA;AAAA,EAGI,UAAkB;AAChB,WAAA;AAAA,EAAA;AAAA,EAEF,cAAsB;AACpB,WAAA;AAAA,EAAA;AAAA,EAGT,MAAa,YAAYhB,GAAiC;AACxD,UAAM,YAAYA,CAAO,GACrB,KAAK,WAAW,gBAClB,MAAM,KAAK,WAAW,GAChB,MAAA,KAAK,QAAQA,CAAO;AAAA,EAC5B;AAAA,EAGF,MAAa,QAAQA,GAAqC;;AACpD,WAAA,KAAK,WAAW,cACX,QAAQ,QAAQ,KAAK,OAAO,KAEhC,KAAA,UAAUA,KAAW,KAAK,WAAW,OAC1C,KAAK,UAAU,YAAY,IAE3BZ,IAAA,KAAK,OAAO,WAAZ,QAAAA,EAAoB,MAAM,wCAAwC,KAAK,UACvE,MAAM,KAAK,aAAa,QAAQ,KAAK,OAAO,GAC5C,KAAK,UAAU,WAAW,GAEpB,MAAA,KAAK,aAAa,kBAAkB,GAEnC,KAAK;AAAA,EAAA;AAAA,EAGd,MAAa,aAA4B;;AACnC,QAAA,KAAK,WAAW;AACb,cAAAA,IAAA,KAAA,OAAO,WAAP,QAAAA,EAAe,KAAK,yBAClB,QAAQ,QAAQ;AAGnB,UAAA,KAAK,aAAa,WAAW,GAEnC,KAAK,UAAU,cAAc,IACxBoD,KAAA7C,IAAA,KAAA,WAAA,gBAAAA,EAAQ,WAAR,QAAA6C,EAAgB,MAAM;AAAA,EAA0B;AAAA,EAGhD,KAAKrD,GAAgE;AACtE,WAAA,KAAK,WAAW,cACX,QAAQ,OAAO,IAAI,MAAM,eAAe,CAAC,KAG7C,KAAA,aAAa,YAAYA,CAAO,GAC9B,QAAQ,QAAQ;AAAA,EAAA;AAE3B;AC3TA,MAAMsD,GAA2B;AAAA,EAG/B,YAAY/D,GAA0C;AAF9C,IAAAoB,EAAA;AAGN,SAAK,SAASpB;AAAA,EAAA;AAAA,EAGhB,MAAM,SAASgE,GAAiCC,GAAkD;;AAC1F,UAAA,KAAK,QAAQD,GAAa,EAAE,GAAGC,GAAS,SAAS,IAAM,IAC7DvD,IAAA,KAAK,OAAO,WAAZ,QAAAA,EAAoB,MAAM,0BAA0BsD;AAAA,EAAW;AAAA,EAGjE,MAAM,KAAKA,GAAiCC,GAAkD;;AACtF,UAAA,KAAK,QAAQD,GAAa,EAAE,GAAGC,GAAS,SAAS,IAAO,IACzDvD,IAAA,KAAA,OAAO,WAAP,QAAAA,EAAe,MAAM,uBAAuB,EAAE,GAAGsD,GAAa,GAAGC;EAAS;AAAA,EAGjF,MAAM,QAAQD,GAAiCC,GAAkD;AACzF,UAAA,MAAM,GAAG,KAAK,OAAO,MAAM,iBAAiBD,EAAY,EAAE,IAAI;AAAA,MAClE,MAAM,KAAK,UAAUC,CAAO;AAAA,MAC5B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,oBAAoB,KAAK,OAAO;AAAA,MAAA;AAAA,IAClC,CACD;AAAA,EAAA;AAEL;AAOA,MAAMC,GAA8B;AAAA,EAIlC,YAAYF,GAAiCG,GAAqC;AAH1E,IAAA/C,EAAA;AACA,IAAAA,EAAA;AAGN,SAAK,cAAc4C,GACnB,KAAK,UAAUG;AAAA,EAAA;AAAA,EAGV,kBAAuC;AAC5C,WAAO,KAAK,YAAY;AAAA,EAAA;AAAA,EAG1B,MAAM,OAAOC,GAAoC;AACzC,UAAAC,IAAe,KAAK,YAAY;AACtC,QAAI,CAACA,GAAc;AACX,YAAA,KAAK,KAAK,wBAAwB;AACxC;AAAA,IAAA;AAEF,UAAMC,IAAeD,EAAa,MAC5BE,IAAeF,EAAa,MAC5BG,IAAOJ,EAAME,CAAY;AAC/B,QAAI,CAACE,GAAM;AACT,YAAM,KAAK,KAAK,QAAQF,CAAY,YAAY;AAChD;AAAA,IAAA;AAEE,QAAA;AACI,YAAAG,IAAS,MAAMD,EAAKD,CAAY;AAChC,YAAA,KAAK,SAASE,CAAM;AAAA,aACnBlC,GAAO;AACd,YAAM,KAAK,KAAK,wBAAwB+B,CAAY,KAAK/B,CAAK,EAAE;AAAA,IAAA;AAAA,EAClE;AAAA,EAEF,MAAM,SAASmC,GAA4B;AACnC,UAAA,KAAK,QAAQ,SAAS,KAAK,aAAa,EAAE,SAAS,IAAM,QAAAA,GAAQ,OAAO,KAAA,CAAM;AAAA,EAAA;AAAA,EAEtF,MAAM,KAAKnC,GAA8B;AACjC,UAAA,KAAK,QAAQ,KAAK,KAAK,aAAa,EAAE,SAAS,IAAO,QAAQ,MAAM,OAAAA,EAAA,CAAO;AAAA,EAAA;AAErF;AASA,MAAMoC,WAAmCxD,EAAoB;AAAA,EAO3D,YAAYnB,GAA0C;AAC9C,UAAA;AAPR,IAAAoB,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,gBAAkB;AAIhB,SAAK,SAASpB,GACd,KAAK,SAAS,gBACd,KAAK,YAAY;AAAA,EAAA;AAAA,EAGZ,UAAkB;AAChB,WAAA;AAAA,EAAA;AAAA,EAGF,cAAsB;AACpB,WAAA;AAAA,EAAA;AAAA,EAGT,MAAa,QAAQsB,GAAoC;AACvD,gBAAK,UAAU,WAAW,GACnBA;AAAA,EAAA;AAAA,EAGT,MAAa,aAA4B;AACvC,SAAK,UAAU,cAAc,GAC7B,KAAK,UAAU;AAAA,EAAA;AAAA,EAGjB,MAAa,YAAYA,GAAiC;AACxD,SAAK,UAAUA;AAAA,EAAA;AAAA,EAGjB,MAAa,KAAKb,GAAgE;;AAChF,WAAAC,IAAA,KAAK,OAAO,WAAZ,QAAAA,EAAoB,MAAM,oBAAoBD,IACxC,IAAI,MAAM,iBAAiB;AAAA,EAAA;AAAA,EAG5B,cAAcuD,GAAuC;;AACtD,QAAA,CAAC,KAAK,OAAO,eAAe;AACzB,OAAAtD,IAAA,KAAA,OAAO,WAAP,QAAAA,EAAe,MAAM;AAC1B;AAAA,IAAA;AAEF,UAAMyD,IAAU,IAAIJ,GAA2B,KAAK,MAAM,GACpDa,IAAc,IAAIV,GAA8BF,GAAaG,CAAO;AACrE,SAAA,OAAO,cAAcS,CAAW;AAAA,EAAA;AAEzC;ACjHA,MAAMC,IAAwBC,EAAqD,MAAS;AAE5F,SAASC,GAAa/D,GAA6B;AACjD,SAAO,IAAI,QAAQ,CAACgE,GAASC,MAAW;AAChC,UAAAC,IAAS,IAAI,WAAW;AAC9B,IAAAA,EAAO,cAAclE,CAAI,GAEzBkE,EAAO,SAAS,MAAM;AAGpB,YAAMC,IADSD,EAAO,OACa,MAAM,UAAU,EAAE,CAAC;AACtD,MAAAF,EAAQG,CAAmB;AAAA,IAC7B,GAEOD,EAAA,UAAU,CAAC3C,MAAU;AAC1B,MAAA0C,EAAO1C,CAAK;AAAA,IACd;AAAA,EAAA,CACD;AACH;AAEA,SAAS6C,GAA4B;AAAA,EACnC,KAAAC,IAAM;AAAA,EACN,WAAWC;AAAA,EACX,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAASC,IAAiB;AAAA,EAC1B,GAAGzF;AACL,GAA4B;AAC1B,QAAM,CAAC0F,GAAWC,CAAY,IAAIC,EAAS,EAAK,GAC1C,CAACpF,GAAUqF,CAAW,IAAID,EAA2B,CAAA,CAAE,GACvD,CAACtE,GAASwE,CAAU,IAAIF,EAAkBH,CAAc,GACxD,CAACM,GAAiBC,CAAkB,IAAIJ,EAAsC,oBAAI,KAAK,GACvFK,IAAWC,EAAO,EAAK,GAEvBC,IAAYC,EAA2B,MAAM;AAC7C,QAAA,MAAM,QAAQd,CAAU;AACnB,aAAAA;AAGT,QAAI,OAAOA,KAAe,YAAYA,MAAe,MAAM;AACnD,YAAAe,IAAehB,IAAM,mBAAmB,4BACxCiB,IAAuBjB,IAAM,SAAS,SACtCkB,IAAwBlB,IAAM,OAAO;AAC3C,UAAImB,IAAqB,OAAO,KAAKlB,CAAU,EAC5C,IAAI,CAACpF,MAAQ;AACZ,gBAAQA,GAAK;AAAA,UACX,KAAK;AACG,kBAAAuG,IAA8DnB,EAAWpF,CAAG;AAClF,mBAAIuG,MAAe,KACV,IAAI/E,EAAoB;AAAA,cAC7B,QAAQ,GAAG4E,CAAoB,MAAMD,CAAY;AAAA,cACjD,QAAQrG,EAAO;AAAA,cACf,SAASA,EAAO;AAAA,cAChB,QAAAuF;AAAA,YAAA,CACD,IACQ,OAAOkB,KAAe,YAAYA,MAAe,OACnD,IAAI/E,EAAoB+E,CAAuC,IAE/D;AAAA,UAEX,KAAK;AACG,kBAAAC,IAAgEpB,EAAWpF,CAAG;AACpF,mBAAIwG,MAAiB,KACZ,IAAI7C,EAAsB;AAAA,cAC/B,WAAW,GAAG0C,CAAqB,MAAMF,CAAY;AAAA,cACrD,QAAQrG,EAAO;AAAA,cACf,SAASA,EAAO;AAAA,cAChB,QAAAuF;AAAA,YAAA,CACD,IACQ,OAAOmB,KAAiB,YAAYA,MAAiB,OACvD,IAAI7C,EAAsB6C,CAA2C,IAErE;AAAA,UAEX,KAAK;AACG,kBAAAC,IAAmErB,EAAWpF,CAAG;AACvF,mBAAIyG,MAAoB,KACf,IAAIzE,EAAyB;AAAA,cAClC,cAAc,GAAGqE,CAAqB,MAAMF,CAAY;AAAA,cACxD,QAAQrG,EAAO;AAAA,cACf,SAASA,EAAO;AAAA,cAChB,QAAAuF;AAAA,YAAA,CACD,IACQ,OAAOoB,KAAoB,YAAYA,MAAoB,OAC7D,IAAIzE,EAAyByE,CAAiD,IAE9E;AAAA,UAEX;AACE,kBAAM,IAAI,MAAM,qBAAqBzG,CAAG,EAAE;AAAA,QAAA;AAAA,MAE/C,CAAA,EACA,OAAO,CAAC0G,MAAaA,MAAa,IAAI;AAEzC,aAAI5G,EAAO,SACUwG,EAAA;AAAA,QACjB,IAAI7B,GAA2B;AAAA,UAC7B,QAAQ,GAAG2B,CAAoB,MAAMD,CAAY;AAAA,UACjD,QAAQrG,EAAO;AAAA,UACf,SAASA,EAAO;AAAA,UAChB,eAAe,OAAOgE,MAA+C;AAC7D,kBAAAA,EAAY,OAAOhE,EAAO,KAAM;AAAA,UACxC;AAAA,UACA,QAAAuF;AAAA,QACD,CAAA;AAAA,MACH,GAEKiB;AAAA,IAAA;AAEH,UAAA,IAAI,MAAM,iCAAiC;AAAA,EACnD,GAAG,EAAE;AAEL,EAAAK,EAAU,MAAM;AACd,IAAIZ,EAAS,YAEbA,EAAS,UAAU,IACXV,KAAA,QAAAA,EAAA;AAAA,MACN;AAAA,MACAY,EAAU,IAAI,CAACS,MAAaA,EAAS,QAAS,CAAA;AAAA,OAEtCT,EAAA,QAAQ,CAACS,MAAa;AAC9B,MAAAA,EAAS,WAAWtF,CAAO,GAC3BsF,EAAS,eAAe,GACfA,EAAA,wBAAwB,CAACrF,MAA2B;AAC3D,QAAAgE,KAAA,QAAAA,EAAQ,MAAM,GAAGqB,EAAS,SAAS,6BAA6BrF,CAAM,KACtEwE,EAAgB,IAAIa,EAAS,QAAQ,GAAGrF,CAAM,GAC3ByE,EAAA,IAAI,IAAID,CAAe,CAAC;AAAA,MAAA,CAC5C,GACQa,EAAA,mBAAmB,CAACnG,MAA4B;AACnD,YAAAA,EAAQ,SAAS,WAAW;AAC9B,gBAAMqG,IAAiBrG,EAAQ;AAC/B,UAAAoF;AAAA,YAAY,CAACkB,MACXpG,EAAc,CAAC,GAAGoG,GAAyB,EAAE,GAAGD,GAAgB,UAAUF,EAAS,UAAW,CAAC,CAAC;AAAA,UAClG;AAAA,QAAA,WACSnG,EAAQ,SAAS,aAAa;AAEjC,gBAAAqG,IAAiC,EAAC,MAAQ,aAAa,MADpCrG,EAAQ,QACqD,SAAS,MAAQ,aAAa,cAAgB,OAAM;AAE1I,UAAAoF;AAAA,YAAY,CAACkB,MACXpG,EAAc,CAAC,GAAGoG,GAAyB,EAAE,GAAGD,GAAgB,UAAUF,EAAS,UAAW,CAAC,CAAC;AAAA,UAClG;AAAA,QAAA,MAEF,CAAWnG,EAAQ,SAAS,iBAC1B0F,EAAU,OAAO,CAACa,MAAMA,MAAMJ,CAAQ,EAAE,QAAQ,CAACI,MAAMA,EAAE,cAAcvG,EAAQ,OAA6B,CAAC;AAAA,MAC/G,CACD,GACGmG,EAAS,aAAaA,EAAS,WAAW,mBAC5CrB,KAAA,QAAAA,EAAQ,MAAM,2BAA2BqB,EAAS,QAAS,CAAA,KAC3DA,EAAS,QAAQtF,CAAO;AAAA,IAC1B,CACD;AAAA,KACA,CAACA,GAAS6E,GAAWZ,GAAQQ,CAAe,CAAC;AAE1C,QAAAkB,IAAQ,OAAOxG,MAA2B;;AAC1C,UAAAC,IAAAD,EAAQ,QAAQ,CAAC,MAAjB,gBAAAC,EAAoB,UAAS,OAAQ,OAAM,IAAI,MAAM,kCAAkC;AAE3F,UAAMqB,IAAQtB,EAAQ,QAAQ,CAAC,EAAE;AACjC,IAAAoF,EAAY,CAACkB,MAAwB,CAAC,GAAGA,GAAqB,EAAE,MAAM,QAAQ,MAAM,QAAQ,MAAMhF,EAAO,CAAA,CAAC,GAC1G4D,EAAa,EAAI;AAEjB,UAAMiB,IAAWT,EAAU,KAAK,CAACzC,GAAGC,MAAMA,EAAE,YAAY,IAAID,EAAE,YAAa,CAAA,EAAE,KAAK,CAACkD,MAAaA,EAAS,WAAW,WAAW,GACzHM,IAAiC,CAAC;AACxC,QAAIzG,EAAQ;AACC,iBAAA0G,KAAc1G,EAAQ;AAC/B,QAAI0G,EAAW,YAAY,WAAW,QAAQ,KAAKA,EAAW,QAC5DD,EAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,OAAO;AAAA,YACL,aAAaC,EAAW;AAAA,YACxB,SAAS,MAAMpC,GAAaoC,EAAW,IAAI;AAAA,UAC7C;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,QAAA,CACP;AAKP,IAAI1G,EAAQ,WACVyG,EAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,MAAMzG,EAAQ,QAAQ,CAAC,EAAE;AAAA,MACzB,MAAM;AAAA,IAAA,CACP,GAEK8E,KAAA,QAAAA,EAAA,MAAM,oBAAoB2B,IAC5B,OAAAN,KAAA,gBAAAA,EAAU,KAAKM,KAErBvB,EAAa,EAAK;AAAA,EACpB,GAEMyB,IAAWC,EAAY,OAC3B1B,EAAa,EAAK,GAClBE,EAAY,CAAA,CAAE,GACdC,EAAW,KAAK,GACT,QAAQ,QAAQ,IACtB,EAAE,GAECwB,IAAWD,EAAY,MACpB,QAAQ,QAAQ,GACtB,EAAE,GAECE,IAAUC,EAAwB;AAAA,IACtC,WAAA9B;AAAA,IACA,UAAAlF;AAAA,IACA,gBAAAM;AAAA,IACA,OAAAmG;AAAA,IACA,UAAAG;AAAA,IACA,UAAAE;AAAA,IACA,UAAU;AAAA,MACR,aAAa,IAAIG,EAA2B,CAAC,IAAIC,EAAA,CAA8B,CAAC;AAAA,IAAA;AAAA,EAClF,CACD;AAED,SACGC,gBAAAA,EAAAA,IAAA9C,EAAsB,UAAtB,EAA+B,OAAO,EAAE,WAAAsB,GAAW,iBAAAJ,EAClD,GAAA,UAAA4B,gBAAAA,EAAA,IAACC,GAAyB,EAAA,SAAAL,GAAmB,UAAA/B,EAAS,CAAA,GACxD;AAEJ;AAEA,SAASqC,GAAuB,EAAE,UAAArC,GAAU,GAAGxF,KAA4C;AACzF,SAAQ2H,gBAAAA,EAAA,IAAAvC,IAAA,EAA6B,GAAGpF,GAAS,UAAAwF,EAAS,CAAA;AAC5D;AAEA,SAASsC,KAA+C;AAChD,QAAAC,IAAUC,EAAWnD,CAAqB;AAChD,MAAI,CAACkD;AACG,UAAA,IAAI,MAAM,gEAAgE;AAE3E,SAAAA;AACT;AASA,SAASE,GAA0BrB,GAA0C;AACrE,QAAAmB,IAAUC,EAAWnD,CAAqB;AAChD,MAAI,CAACkD;AACG,UAAA,IAAI,MAAM,wEAAwE;AAGpF,QAAAG,IAAmBH,EAAQ,UAAU,KAAK,CAACf,MAAMA,EAAE,QAAQ,MAAMJ,CAAQ;AAC/E,MAAI,CAACsB;AACI,WAAA;AAGT,QAAM3G,IAASwG,EAAQ,gBAAgB,IAAIG,EAAiB,SAAS;AAE9D,SAAA;AAAA,IACL,GAAGA;AAAA,IACH,SAASA,EAAiB,QAAQ,KAAKA,CAAgB;AAAA,IACvD,YAAYA,EAAiB,WAAW,KAAKA,CAAgB;AAAA,IAC7D,MAAMA,EAAiB,KAAK,KAAKA,CAAgB;AAAA,IACjD,YAAYA,EAAiB,WAAW,KAAKA,CAAgB;AAAA,IAC7D,yBAAyBA,EAAiB,wBAAwB,KAAKA,CAAgB;AAAA,IACvF,oBAAoBA,EAAiB,mBAAmB,KAAKA,CAAgB;AAAA,IAC7E,SAASA,EAAiB,QAAQ,KAAKA,CAAgB;AAAA,IACvD,aAAaA,EAAiB,YAAY,KAAKA,CAAgB;AAAA,IAC/D,QAAQ3G,KAAU2G,EAAiB;AAAA,EACrC;AACF;AAEA,SAASC,KAAoC;AACrC,QAAAJ,IAAUC,EAAWnD,CAAqB;AAChD,MAAI,CAACkD;AACG,UAAA,IAAI,MAAM,wEAAwE;AAE/E,aAAAnB,KAAYmB,EAAQ;AACzB,QAAAnB,EAAS,QAAQ,MAAM;AACzB,aAAQA,EAAiC,OAAO;AAG9C,QAAA,IAAI,MAAM,yBAAyB;AAC3C;AAEA,SAASwB,KAAgE;AACvE,SAAOH,GAA0B,QAAQ;AAC3C;ACvTA,MAAMI,GAA8C;AAAA,EAApD;AACE,IAAAjH,EAAA,gBAAS;AAAA;AAAA,EAET,IAAIX,MAAoB6H,GAAiB;AAC/B,YAAA,IAAI,GAAG,KAAK,MAAM,MAAM7H,CAAO,IAAI,GAAG6H,CAAI;AAAA,EAAA;AAAA,EAGpD,KAAK7H,MAAoB6H,GAAiB;AAChC,YAAA,KAAK,GAAG,KAAK,MAAM,MAAM7H,CAAO,IAAI,GAAG6H,CAAI;AAAA,EAAA;AAAA,EAGrD,KAAK7H,MAAoB6H,GAAiB;AAChC,YAAA,KAAK,GAAG,KAAK,MAAM,MAAM7H,CAAO,IAAI,GAAG6H,CAAI;AAAA,EAAA;AAAA,EAGrD,MAAM7H,MAAoB6H,GAAiB;AACjC,YAAA,MAAM,GAAG,KAAK,MAAM,MAAM7H,CAAO,IAAI,GAAG6H,CAAI;AAAA,EAAA;AAAA,EAGtD,MAAM7H,MAAoB6H,GAAiB;AACjC,YAAA,MAAM,GAAG,KAAK,MAAM,MAAM7H,CAAO,IAAI,GAAG6H,CAAI;AAAA,EAAA;AAExD;","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/protocol/transaction.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 { FileContentPart, 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 === 'transaction') {\n continue;\n }\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 currentMessage.files = [...(currentMessage.files ?? []), ...(message.files ?? [])];\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 const cleanMessages = removeEmptyMessages(outputMessages);\n return cleanMessages;\n}\n\nfunction convertMessage(message: PersonaMessage): ThreadMessageLike {\n const files =\n message.files?.map(\n (file) =>\n ({\n type: 'file',\n data: file.url,\n mimeType: file.contentType,\n } as FileContentPart),\n ) ?? [];\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:\n message.type === 'reasoning'\n ? [{ type: 'reasoning', text: message.text }, ...files]\n : [{ type: 'text', text: message.text }, ...files],\n };\n}\n\nexport { parseMessages, convertMessage, removeEmptyMessages };\n","import {\n MessageListenerCallback,\n PersonaMessage,\n PersonaPayload,\n PersonaProtocol,\n PersonaTransaction,\n ProtocolStatus,\n Session,\n StatusChangeCallback,\n} 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: PersonaPayload): Promise<void> {\n this.messageCallbacks.forEach((callback) => callback(message));\n }\n public async notifyMessages(messages: PersonaPayload[]): 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: Array<PersonaMessage> | PersonaMessage): Promise<void>;\n\n public onTransaction(_: PersonaTransaction) {}\n}\n\nexport { PersonaProtocolBase };\n","import { PersonaProtocolBase } from './base';\nimport { PersonaResponse, Session, ProtocolStatus, PersonaProtocolBaseConfig, PersonaMessage } 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 100;\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: Array<PersonaMessage> | PersonaMessage): 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(\n personaResponse.response.messages.map((payload) => ({\n type: 'message',\n payload,\n })),\n );\n }\n}\n\nexport { PersonaRESTProtocol };\nexport type { PersonaRESTProtocolConfig };\n","import { PersonaMessage, PersonaPayload, 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 500;\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 PersonaPayload;\n this.notifyMessage(data);\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: Array<PersonaMessage> | PersonaMessage): 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 { PersonaMessage, PersonaPayload, 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: Array<PersonaMessage> | PersonaMessage): 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(JSON.stringify({ type: 'request', payload: 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 const data = JSON.parse(msg.data) as PersonaPayload;\n this.notifyMessage(data);\n });\n }\n\n public getName(): string {\n return 'webrtc';\n }\n public getPriority(): number {\n return 1000;\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: Array<PersonaMessage> | PersonaMessage): Promise<void> {\n if (this.status !== 'connected') {\n return Promise.reject(new Error('Not connected'));\n }\n\n this.webRTCClient.sendMessage(message);\n return Promise.resolve();\n }\n}\n\nexport { PersonaWebRTCProtocol };\nexport type { PersonaWebRTCProtocolConfig, AudioVisualizerCallback, AudioAnalysisData };\n","import { PersonaProtocolBase } from './base';\nimport {\n Session,\n ProtocolStatus,\n PersonaProtocolBaseConfig,\n PersonaTransaction,\n FunctionCall,\n ReadonlyJSONObject,\n PersonaMessage,\n} from '../types';\n\ntype FinishTransactionRequest = {\n success: boolean;\n output: any;\n error: string | null;\n};\n\nclass PersonaTransactionsManager {\n private config: PersonaTransactionProtocolConfig;\n\n constructor(config: PersonaTransactionProtocolConfig) {\n this.config = config;\n }\n\n async complete(transaction: PersonaTransaction, request: FinishTransactionRequest): Promise<void> {\n await this.persist(transaction, { ...request, success: true });\n this.config.logger?.debug('Transaction completed:', transaction);\n }\n\n async fail(transaction: PersonaTransaction, request: FinishTransactionRequest): Promise<void> {\n await this.persist(transaction, { ...request, success: false });\n this.config.logger?.debug('Transaction failed:', { ...transaction, ...request });\n }\n\n async persist(transaction: PersonaTransaction, request: FinishTransactionRequest): Promise<void> {\n await fetch(`${this.config.apiUrl}/transactions/${transaction.id}`, {\n body: JSON.stringify(request),\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-persona-apikey': this.config.apiKey,\n },\n });\n }\n}\n\nexport type PersonaToolCallback = (args: ReadonlyJSONObject | undefined) => void;\nexport type PersonaTools = {\n [key: string]: PersonaToolCallback;\n};\n\nclass PersonaPersistableTransaction {\n private transaction: PersonaTransaction;\n private manager: PersonaTransactionsManager;\n\n constructor(transaction: PersonaTransaction, manager: PersonaTransactionsManager) {\n this.transaction = transaction;\n this.manager = manager;\n }\n\n public getFunctionCall(): FunctionCall | null {\n return this.transaction.functionCall;\n }\n\n async invoke(tools: PersonaTools): Promise<void> {\n const functionCall = this.transaction.functionCall;\n if (!functionCall) {\n await this.fail('No function call found');\n return;\n }\n const functionName = functionCall.name;\n const functionArgs = functionCall.args;\n const tool = tools[functionName];\n if (!tool) {\n await this.fail(`Tool ${functionName} not found`);\n return;\n }\n try {\n const result = await tool(functionArgs);\n await this.complete(result);\n } catch (error) {\n await this.fail(`Error executing tool ${functionName}: ${error}`);\n }\n }\n async complete(output: any): Promise<void> {\n await this.manager.complete(this.transaction, { success: true, output, error: null });\n }\n async fail(error: string): Promise<void> {\n await this.manager.fail(this.transaction, { success: false, output: null, error });\n }\n}\n\ntype PersonaTransactionCallback = (transaction: PersonaPersistableTransaction) => void;\n\ntype PersonaTransactionProtocolConfig = PersonaProtocolBaseConfig & {\n apiUrl: string;\n onTransaction: PersonaTransactionCallback;\n};\n\nclass PersonaTransactionProtocol extends PersonaProtocolBase {\n status: ProtocolStatus;\n autostart: boolean;\n session: Session;\n config: PersonaTransactionProtocolConfig;\n notify: boolean = true;\n\n constructor(config: PersonaTransactionProtocolConfig) {\n super();\n this.config = config;\n this.status = 'disconnected';\n this.autostart = true;\n }\n\n public getName(): string {\n return 'transaction';\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: Array<PersonaMessage> | PersonaMessage): Promise<void> {\n this.config.logger?.debug('Sending message:', message);\n throw new Error('Not implemented');\n }\n\n public onTransaction(transaction: PersonaTransaction): void {\n if (!this.config.onTransaction) {\n this.config.logger?.error('Transaction protocol config is not set');\n return;\n }\n const manager = new PersonaTransactionsManager(this.config);\n const persistable = new PersonaPersistableTransaction(transaction, manager);\n this.config.onTransaction(persistable);\n }\n}\n\nexport { PersonaTransactionProtocol };\nexport type { PersonaTransactionProtocolConfig, FinishTransactionRequest, PersonaPersistableTransaction, PersonaTransactionCallback };\n","import { useState, useEffect, useCallback, PropsWithChildren, createContext, useContext, useMemo, useRef } from 'react';\nimport {\n useExternalStoreRuntime,\n AppendMessage,\n AssistantRuntimeProvider,\n CompositeAttachmentAdapter,\n SimpleImageAttachmentAdapter,\n} from '@assistant-ui/react';\nimport {\n PersonaConfig,\n PersonaMessage,\n PersonaPayload,\n PersonaProtocol,\n PersonaProtocolBaseConfig,\n PersonaReasoning,\n PersonaResponse,\n PersonaTransaction,\n ProtocolStatus,\n Session,\n} from './types';\nimport { parseMessages, convertMessage } from './messages';\nimport {\n PersonaPersistableTransaction,\n PersonaRESTProtocol,\n PersonaRESTProtocolConfig,\n PersonaTransactionProtocol,\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 fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file); // Converte il file in Data URL (base64)\n\n reader.onload = () => {\n //remove data url using ;base64, to split\n const base64 = reader.result as string;\n const base64WithoutPrefix = base64.split(';base64,')[1];\n resolve(base64WithoutPrefix);\n };\n\n reader.onerror = (error) => {\n reject(error);\n };\n });\n}\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 let availableProtocols = Object.keys(_protocols)\n .map((key) => {\n switch (key) {\n case 'rest':\n const restConfig: PersonaProtocolBaseConfig | boolean | 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 } else if (typeof restConfig === 'object' && restConfig !== null) {\n return new PersonaRESTProtocol(restConfig as PersonaRESTProtocolConfig);\n } else {\n return null;\n }\n case 'webrtc':\n const webrtcConfig: PersonaProtocolBaseConfig | boolean | 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 } else if (typeof webrtcConfig === 'object' && webrtcConfig !== null) {\n return new PersonaWebRTCProtocol(webrtcConfig as PersonaWebRTCProtocolConfig);\n } else {\n return null;\n }\n case 'websocket':\n const websocketConfig: PersonaProtocolBaseConfig | boolean | 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 } else if (typeof websocketConfig === 'object' && websocketConfig !== null) {\n return new PersonaWebSocketProtocol(websocketConfig as PersonaWebSocketProtocolConfig);\n } else {\n return null;\n }\n default:\n throw new Error(`Unknown protocol: ${key}`);\n }\n })\n .filter((protocol) => protocol !== null) as PersonaProtocol[];\n\n if (config.tools) {\n availableProtocols.push(\n new PersonaTransactionProtocol({\n apiUrl: `${baseEndpointProtocol}://${baseEndpoint}`,\n apiKey: config.apiKey,\n agentId: config.agentId,\n onTransaction: async (transaction: PersonaPersistableTransaction) => {\n await transaction.invoke(config.tools!);\n },\n logger,\n }),\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: PersonaPayload) => {\n if (message.type === 'message') {\n const personaMessage = message.payload as PersonaMessage;\n setMessages((currentConversation) =>\n parseMessages([...currentConversation, ...[{ ...personaMessage, protocol: protocol.getName() }]]),\n );\n } else if (message.type === 'reasoning') {\n const personaReasoning = message.payload as PersonaReasoning;\n\n let text = personaReasoning.thought;\n if (personaReasoning.imageUrl) {\n // add markdown image\n text += `\\n\\n![image](https://persona.applica.guru/api/files/${personaReasoning.imageUrl})`;\n }\n const personaMessage: PersonaMessage = {\"type\": \"reasoning\", \"text\": text, \"role\": \"assistant\", \"finishReason\": \"stop\"};\n \n setMessages((currentConversation) =>\n parseMessages([...currentConversation, ...[{ ...personaMessage, protocol: protocol.getName() }]]),\n );\n\n } else if (message.type === 'transaction') {\n protocols.filter((p) => p !== protocol).forEach((p) => p.onTransaction(message.payload as PersonaTransaction));\n }\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 const content: Array<PersonaMessage> = [];\n if (message.attachments) {\n for (const attachment of message.attachments) {\n if (attachment.contentType.startsWith('image/') && attachment.file) {\n content.push({\n role: 'user',\n image: {\n contentType: attachment.contentType,\n content: await fileToBase64(attachment.file),\n },\n text: '',\n type: 'text',\n });\n }\n }\n }\n\n if (message.content) {\n content.push({\n role: 'user',\n text: message.content[0].text,\n type: 'text',\n });\n }\n logger?.debug('Sending message:', content);\n await protocol?.send(content);\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 adapters: {\n attachments: new CompositeAttachmentAdapter([new SimpleImageAttachmentAdapter()]),\n },\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 usePersonaRuntimeEndpoint(): string {\n const context = useContext(PersonaRuntimeContext);\n if (!context) {\n throw new Error('usePersonaRuntimeEndpoint must be used within a PersonaRuntimeProvider');\n }\n for (const protocol of context.protocols) {\n if (protocol.getName() === 'rest') {\n return (protocol as PersonaRESTProtocol).config.apiUrl;\n }\n }\n throw new Error('REST protocol not found');\n}\n\nfunction usePersonaRuntimeWebRTCProtocol(): PersonaWebRTCProtocol | null {\n return usePersonaRuntimeProtocol('webrtc') as PersonaWebRTCProtocol;\n}\n\nexport { PersonaRuntimeProvider, usePersonaRuntimeEndpoint, 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","files","file","_b","call","PersonaProtocolBase","__publicField","callback","session","status","notify","_","PersonaRESTProtocol","apiUrl","apiKey","agentId","sessionId","input","personaResponse","payload","PersonaWebSocketProtocol","sid","webSocketUrl","event","data","error","PersonaWebRTCClient","err","track","remoteAudio","e","channel","msg","url","offer","metadata","offerMessage","label","localSource","remoteSource","loop","localArray","remoteArray","localAmp","a","b","remoteAmp","PersonaWebRTCProtocol","_c","PersonaTransactionsManager","transaction","request","PersonaPersistableTransaction","manager","tools","functionCall","functionName","functionArgs","tool","result","output","PersonaTransactionProtocol","persistable","PersonaRuntimeContext","createContext","fileToBase64","resolve","reject","reader","base64WithoutPrefix","PersonaRuntimeProviderInner","dev","_protocols","logger","children","defaultSession","isRunning","setIsRunning","useState","setMessages","setSession","protocolsStatus","setProtocolsStatus","didMount","useRef","protocols","useMemo","baseEndpoint","baseEndpointProtocol","baseWebSocketProtocol","availableProtocols","restConfig","webrtcConfig","websocketConfig","protocol","useEffect","personaMessage","currentConversation","personaReasoning","text","p","onNew","content","attachment","onCancel","useCallback","onReload","runtime","useExternalStoreRuntime","CompositeAttachmentAdapter","SimpleImageAttachmentAdapter","jsx","AssistantRuntimeProvider","PersonaRuntimeProvider","usePersonaRuntime","context","useContext","usePersonaRuntimeProtocol","protocolInstance","usePersonaRuntimeEndpoint","usePersonaRuntimeWebRTCProtocol","PersonaConsoleLogger","args"],"mappings":"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","x_google_ignoreList":[0,1]}