@serenity-star/sdk 1.0.2 → 1.0.3

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/index.d.mts CHANGED
@@ -754,4 +754,4 @@ declare class SerenityClient {
754
754
  constructor(options: SerenityClientOptions);
755
755
  }
756
756
 
757
- export { RealtimeSession, SerenityClient };
757
+ export { type AgentResult, RealtimeSession, SerenityClient };
package/dist/index.d.ts CHANGED
@@ -754,4 +754,4 @@ declare class SerenityClient {
754
754
  constructor(options: SerenityClientOptions);
755
755
  }
756
756
 
757
- export { RealtimeSession, SerenityClient };
757
+ export { type AgentResult, RealtimeSession, SerenityClient };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- "use strict";var N=Object.defineProperty;var ie=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var oe=Object.prototype.hasOwnProperty;var J=r=>{throw TypeError(r)};var ae=(r,n)=>{for(var e in n)N(r,e,{get:n[e],enumerable:!0})},ce=(r,n,e,t)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of re(n))!oe.call(r,s)&&s!==e&&N(r,s,{get:()=>n[s],enumerable:!(t=ie(n,s))||t.enumerable});return r};var pe=r=>ce(N({},"__esModule",{value:!0}),r);var ue=(r,n,e)=>n.has(r)||J("Cannot "+e);var K=(r,n,e)=>n.has(r)?J("Cannot add the same private member more than once"):n instanceof WeakSet?n.add(r):n.set(r,e);var c=(r,n,e)=>(ue(r,n,"access private method"),e);var g=(r,n,e)=>new Promise((t,s)=>{var i=u=>{try{o(e.next(u))}catch(m){s(m)}},a=u=>{try{o(e.throw(u))}catch(m){s(m)}},o=u=>u.done?t(u.value):Promise.resolve(u.value).then(i,a);o((e=e.apply(r,n)).next())});var ge={};ae(ge,{RealtimeSession:()=>C,SerenityClient:()=>M});module.exports=pe(ge);var W,L,U,q,D;if(typeof process!="undefined"&&((D=process.versions)!=null&&D.node)){let r=require("undici");W=r.fetch,L=r.Headers,U=r.Request,q=r.Response,globalThis.fetch||(globalThis.fetch=W,globalThis.Headers=L,globalThis.Request=U,globalThis.Response=q)}var v=class{constructor(){this.listeners={}}on(n,e){return this.listeners[n]||(this.listeners[n]=[]),this.listeners[n].push(e),this}emit(n,...e){var t;(t=this.listeners[n])==null||t.forEach(s=>s(...e))}};var p,S,F,z,X,Y,H,G,B,Q,C=class extends v{constructor(e,t,s,i){super();K(this,p);this.timeout=12e4;this.apiKey=t,this.agentCode=e,this.baseUrl=s,this.agentVersion=i==null?void 0:i.agentVersion,this.inputParameters=i==null?void 0:i.inputParameters,this.userIdentifier=i==null?void 0:i.userIdentifier,this.channel=i==null?void 0:i.channel}start(){return g(this,null,function*(){try{c(this,p,F).call(this)}catch(e){throw new Error("Error starting the session")}})}stop(){c(this,p,S).call(this)}muteMicrophone(){if(this.localStream){let e=this.localStream.getAudioTracks()[0];e&&(e.enabled=!1)}}unmuteMicrophone(){if(this.localStream){let e=this.localStream.getAudioTracks()[0];e&&(e.enabled=!0)}}};p=new WeakSet,S=function(e,t){if(this.socket&&this.socket.readyState===WebSocket.OPEN)try{this.socket.close(1e3,"Client closed the session")}catch(s){console.error("Error closing WebSocket connection:",s)}this.localStream&&(this.localStream.getTracks().forEach(s=>s.stop()),this.localStream=void 0),this.peerConnection&&this.peerConnection.close(),this.socket=void 0,this.dataChannel=void 0,this.peerConnection=void 0,this.emit("session.stopped",e,t),clearTimeout(this.inactivityTimeout)},F=function(){let e=`${this.baseUrl}/v2/agent/${this.agentCode}/realtime`;this.agentVersion&&(e+=`/${this.agentVersion}`),this.socket=new WebSocket(e,["X-API-KEY",this.apiKey]),this.socket.onopen=()=>{let t={type:"serenity.session.create",input_parameters:this.inputParameters,user_identifier:this.userIdentifier,channel:this.channel};this.socket.send(JSON.stringify(t))},this.socket.onclose=()=>{c(this,p,S).call(this)},this.socket.onerror=t=>{this.emit("error","Error connecting to the server"),c(this,p,S).call(this)},this.socket.onmessage=t=>{c(this,p,z).call(this,t.data)}},z=function(e){return g(this,null,function*(){let t=JSON.parse(e);switch(t.type){case"serenity.session.created":{let s=t;this.sessionConfiguration={url:s.url,headers:s.headers},c(this,p,Y).call(this),c(this,p,X).call(this),yield c(this,p,G).call(this);break}case"serenity.session.close":{let s=t,i=c(this,p,Q).call(this,s);this.emit("error",i),c(this,p,S).call(this,s.reason,i);break}case"serenity.response.processed":{let s=t;this.emit("response.processed",s.result);break}default:{let s=t.type.startsWith("serenity");this.dataChannel&&!s&&this.dataChannel.send(JSON.stringify(t))}}})},X=function(){if(!this.peerConnection)throw new Error("Could not add listeners: WebRTC connection not initialized");let e=new Date().toISOString().replace(/T/,"-").replace(/:/g,"-").replace(/\..+/,""),t=`data-channel-${this.agentCode}-${e}`;this.dataChannel=this.peerConnection.createDataChannel(t),this.dataChannel.addEventListener("message",s=>{c(this,p,B).call(this);let i=JSON.parse(s.data);try{switch(i.type){case"input_audio_buffer.speech_started":{this.emit("speech.started");break}case"input_audio_buffer.speech_stopped":{this.emit("speech.stopped");break}case"response.done":{this.emit("response.done");break}case"error":{this.emit("error","There was an error processing your request");break}}}catch(a){this.emit("error","Error processing incoming messages from vendor")}finally{this.socket&&this.socket.send(JSON.stringify(i))}})},Y=function(){this.peerConnection=new RTCPeerConnection;let e=document.createElement("audio");e.autoplay=!0,this.peerConnection.ontrack=t=>{t.streams&&t.streams[0]&&(e.srcObject=t.streams[0])}},H=function(){return g(this,null,function*(){if(!this.peerConnection)throw new Error("Could not start the session: WebRTC connection not initialized");this.localStream=yield navigator.mediaDevices.getUserMedia({audio:!0});let e=this.localStream.getTracks()[0];this.peerConnection.addTrack(e,this.localStream)})},G=function(){return g(this,null,function*(){if(!this.peerConnection)throw new Error("Could not start the session: WebRTC connection not initialized");if(!this.sessionConfiguration)throw new Error("Could not start the session: Session configuration not available");try{yield c(this,p,H).call(this);let e=yield this.peerConnection.createOffer();yield this.peerConnection.setLocalDescription(e);let t=yield fetch(`${this.sessionConfiguration.url}`,{method:"POST",body:e.sdp,headers:this.sessionConfiguration.headers});if(!t.ok)throw new Error("Error starting the session");let s={type:"answer",sdp:yield t.text()};yield this.peerConnection.setRemoteDescription(s),this.emit("session.created"),c(this,p,B).call(this)}catch(e){this.emit("error","Error starting the session"),c(this,p,S).call(this)}})},B=function(){clearTimeout(this.inactivityTimeout),this.inactivityTimeout=setTimeout(()=>{c(this,p,S).call(this)},this.timeout)},Q=function(e){switch(e.reason){case"Exception":return e.message;case"ValidationException":return e.errors?Object.values(e.errors).join(". "):e.message;default:return e.message}};var P=class{constructor(){this.buffer="";this.eventListeners={start:[n=>{}],stop:[n=>{this.stop()}],error:[n=>{this.stop()}]},this.active=!1}start(n,e){return g(this,null,function*(){this.active=!0;try{let t=yield fetch(n,e);if(t.headers.get("Content-Type")!=="text/event-stream")return t;let i=t.body.getReader(),a=new TextDecoder("utf-8");for(this.buffer="";this.active;){let{done:o,value:u}=yield i.read();if(o)break;this.buffer+=a.decode(u,{stream:!0}),this.processEvents()}return t}catch(t){throw console.error("Error in SSE connection:",t),this.active=!1,t}})}processEvents(){let n,e=this.buffer.includes(`\r
1
+ "use strict";var N=Object.defineProperty;var ie=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var oe=Object.prototype.hasOwnProperty;var J=r=>{throw TypeError(r)};var ae=(r,n)=>{for(var e in n)N(r,e,{get:n[e],enumerable:!0})},ce=(r,n,e,t)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of re(n))!oe.call(r,s)&&s!==e&&N(r,s,{get:()=>n[s],enumerable:!(t=ie(n,s))||t.enumerable});return r};var pe=r=>ce(N({},"__esModule",{value:!0}),r);var ue=(r,n,e)=>n.has(r)||J("Cannot "+e);var K=(r,n,e)=>n.has(r)?J("Cannot add the same private member more than once"):n instanceof WeakSet?n.add(r):n.set(r,e);var c=(r,n,e)=>(ue(r,n,"access private method"),e);var u=(r,n,e)=>new Promise((t,s)=>{var i=g=>{try{o(e.next(g))}catch(m){s(m)}},a=g=>{try{o(e.throw(g))}catch(m){s(m)}},o=g=>g.done?t(g.value):Promise.resolve(g.value).then(i,a);o((e=e.apply(r,n)).next())});var ge={};ae(ge,{RealtimeSession:()=>C,SerenityClient:()=>M});module.exports=pe(ge);var W,L,U,q,D;if(typeof process!="undefined"&&((D=process.versions)!=null&&D.node)){let r=require("undici");W=r.fetch,L=r.Headers,U=r.Request,q=r.Response,globalThis.fetch||(globalThis.fetch=W,globalThis.Headers=L,globalThis.Request=U,globalThis.Response=q)}var v=class{constructor(){this.listeners={}}on(n,e){return this.listeners[n]||(this.listeners[n]=[]),this.listeners[n].push(e),this}emit(n,...e){var t;(t=this.listeners[n])==null||t.forEach(s=>s(...e))}};var p,E,F,z,X,Y,H,G,B,Q,C=class extends v{constructor(e,t,s,i){super();K(this,p);this.timeout=12e4;this.apiKey=t,this.agentCode=e,this.baseUrl=s,this.agentVersion=i==null?void 0:i.agentVersion,this.inputParameters=i==null?void 0:i.inputParameters,this.userIdentifier=i==null?void 0:i.userIdentifier,this.channel=i==null?void 0:i.channel}start(){return u(this,null,function*(){try{c(this,p,F).call(this)}catch(e){throw new Error("Error starting the session")}})}stop(){c(this,p,E).call(this)}muteMicrophone(){if(this.localStream){let e=this.localStream.getAudioTracks()[0];e&&(e.enabled=!1)}}unmuteMicrophone(){if(this.localStream){let e=this.localStream.getAudioTracks()[0];e&&(e.enabled=!0)}}};p=new WeakSet,E=function(e,t){if(this.socket&&this.socket.readyState===WebSocket.OPEN)try{this.socket.close(1e3,"Client closed the session")}catch(s){console.error("Error closing WebSocket connection:",s)}this.localStream&&(this.localStream.getTracks().forEach(s=>s.stop()),this.localStream=void 0),this.peerConnection&&this.peerConnection.close(),this.socket=void 0,this.dataChannel=void 0,this.peerConnection=void 0,this.emit("session.stopped",e,t),clearTimeout(this.inactivityTimeout)},F=function(){let e=`${this.baseUrl}/v2/agent/${this.agentCode}/realtime`;this.agentVersion&&(e+=`/${this.agentVersion}`),this.socket=new WebSocket(e,["X-API-KEY",this.apiKey]),this.socket.onopen=()=>{let t={type:"serenity.session.create",input_parameters:this.inputParameters,user_identifier:this.userIdentifier,channel:this.channel};this.socket.send(JSON.stringify(t))},this.socket.onclose=()=>{c(this,p,E).call(this)},this.socket.onerror=t=>{this.emit("error","Error connecting to the server"),c(this,p,E).call(this)},this.socket.onmessage=t=>{c(this,p,z).call(this,t.data)}},z=function(e){return u(this,null,function*(){let t=JSON.parse(e);switch(t.type){case"serenity.session.created":{let s=t;this.sessionConfiguration={url:s.url,headers:s.headers},c(this,p,Y).call(this),c(this,p,X).call(this),yield c(this,p,G).call(this);break}case"serenity.session.close":{let s=t,i=c(this,p,Q).call(this,s);this.emit("error",i),c(this,p,E).call(this,s.reason,i);break}case"serenity.response.processed":{let s=t;this.emit("response.processed",s.result);break}default:{let s=t.type.startsWith("serenity");this.dataChannel&&!s&&this.dataChannel.send(JSON.stringify(t))}}})},X=function(){if(!this.peerConnection)throw new Error("Could not add listeners: WebRTC connection not initialized");let e=new Date().toISOString().replace(/T/,"-").replace(/:/g,"-").replace(/\..+/,""),t=`data-channel-${this.agentCode}-${e}`;this.dataChannel=this.peerConnection.createDataChannel(t),this.dataChannel.addEventListener("message",s=>{c(this,p,B).call(this);let i=JSON.parse(s.data);try{switch(i.type){case"input_audio_buffer.speech_started":{this.emit("speech.started");break}case"input_audio_buffer.speech_stopped":{this.emit("speech.stopped");break}case"response.done":{this.emit("response.done");break}case"error":{this.emit("error","There was an error processing your request");break}}}catch(a){this.emit("error","Error processing incoming messages from vendor")}finally{this.socket&&this.socket.send(JSON.stringify(i))}})},Y=function(){this.peerConnection=new RTCPeerConnection;let e=document.createElement("audio");e.autoplay=!0,this.peerConnection.ontrack=t=>{t.streams&&t.streams[0]&&(e.srcObject=t.streams[0])}},H=function(){return u(this,null,function*(){if(!this.peerConnection)throw new Error("Could not start the session: WebRTC connection not initialized");this.localStream=yield navigator.mediaDevices.getUserMedia({audio:!0});let e=this.localStream.getTracks()[0];this.peerConnection.addTrack(e,this.localStream)})},G=function(){return u(this,null,function*(){if(!this.peerConnection)throw new Error("Could not start the session: WebRTC connection not initialized");if(!this.sessionConfiguration)throw new Error("Could not start the session: Session configuration not available");try{yield c(this,p,H).call(this);let e=yield this.peerConnection.createOffer();yield this.peerConnection.setLocalDescription(e);let t=yield fetch(`${this.sessionConfiguration.url}`,{method:"POST",body:e.sdp,headers:this.sessionConfiguration.headers});if(!t.ok)throw new Error("Error starting the session");let s={type:"answer",sdp:yield t.text()};yield this.peerConnection.setRemoteDescription(s),this.emit("session.created"),c(this,p,B).call(this)}catch(e){this.emit("error","Error starting the session"),c(this,p,E).call(this)}})},B=function(){clearTimeout(this.inactivityTimeout),this.inactivityTimeout=setTimeout(()=>{c(this,p,E).call(this)},this.timeout)},Q=function(e){switch(e.reason){case"Exception":return e.message;case"ValidationException":return e.errors?Object.values(e.errors).join(". "):e.message;default:return e.message}};var P=class{constructor(){this.buffer="";this.eventListeners={start:[n=>{}],stop:[n=>{this.stop()}],error:[n=>{this.stop()}]},this.active=!1}start(n,e){return u(this,null,function*(){this.active=!0;try{let t=yield fetch(n,e);if(!t.ok)throw t;if(t.headers.get("Content-Type")!=="text/event-stream")return t;let i=t.body.getReader(),a=new TextDecoder("utf-8");for(this.buffer="";this.active;){let{done:o,value:g}=yield i.read();if(o)break;this.buffer+=a.decode(g,{stream:!0}),this.processEvents()}return t}catch(t){throw this.active=!1,t}})}processEvents(){let n,e=this.buffer.includes(`\r
2
2
  `)?`\r
3
3
  `:`
4
- `,t=e+e;for(;(n=this.buffer.indexOf(t))!==-1;){let s=this.buffer.slice(0,n).trim();this.buffer=this.buffer.slice(n+t.length);let i=s.split(e),a={};for(let o of i)o.startsWith("data:")?a.data=o.slice(5).trim():o.startsWith("event:")&&(a.event=o.slice(6).trim());this.trigger(a.event||"message",a.data)}}on(n,e){this.eventListeners[n]||(this.eventListeners[n]=[]),this.eventListeners[n].push(e)}off(n,e){let t=this.eventListeners[n];t&&(this.eventListeners[n]=t.filter(s=>s!==e))}trigger(n,e){let t=this.eventListeners[n];t&&t.forEach(s=>s(e))}stop(){this.active=!1}};var A=class{};A.mapAgentResultToSnakeCase=n=>({content:n.content,instance_id:n.instanceId,action_results:n.actionResults,completion_usage:n.completionUsage,executor_task_logs:n.executorTaskLogs,json_content:n.jsonContent,meta_analysis:n.metaAnalysis,time_to_first_token:n.timeToFirstToken});var h,Z,$,ee,te,_,se,ne,j=class j extends v{constructor(e,t,s,i){super();K(this,h);this.apiKey=t,this.agentCode=e,this.baseUrl=s,this.agentVersion=i==null?void 0:i.agentVersion,this.inputParameters=i==null?void 0:i.inputParameters,this.userIdentifier=i==null?void 0:i.userIdentifier,this.channel=i==null?void 0:i.channel}static create(e,t,s,i){return g(this,null,function*(){var o;let a=new j(e,t,s,i);return yield c(o=a,h,Z).call(o),a})}streamMessage(e,t){return g(this,null,function*(){if(!this.conversationId)throw new Error("Conversation not initialized");let s=this.agentVersion?`/${this.agentVersion}`:"",i=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${s}`,a=c(this,h,$).call(this,e,!0,t),o=new P,u;u=new Promise((f,x)=>{o.on("start",()=>{this.emit("start")}),o.on("error",l=>{let E=JSON.parse(l);this.emit("error",E),x(E)}),o.on("content",l=>{let E=JSON.parse(l);this.emit("content",E.text)}),o.on("stop",l=>{let E=JSON.parse(l);this.emit("stop",E.result),f(E.result)})});let m={method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(a)};return o.start(i,m).catch(f=>{throw this.emit("error",{message:f.message}),f}),u})}sendMessage(e,t){return g(this,null,function*(){if(!this.conversationId)throw new Error("Conversation not initialized");let s=this.agentVersion?`/${this.agentVersion}`:"",i=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${s}`,a=c(this,h,$).call(this,e,!1,t),o=yield fetch(i,{method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(a)});if(o.status===429){let f=parseInt(o.headers.get("Retry-After")||"60");throw new Error(`Rate limit exceeded. Retry after ${f} seconds`)}let u=yield o.json();if(o.status!==200)throw new Error(u.message||"Failed to execute message");return A.mapAgentResultToSnakeCase(u)})}};h=new WeakSet,Z=function(){return g(this,null,function*(){if(this.conversationId)return;let e=this.agentVersion?`/${this.agentVersion}`:"",t=`${this.baseUrl}/v2/agent/${this.agentCode}/conversation${e}`,s={};c(this,h,se).call(this,s);let i=yield fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(s)});if(i.status===429){let u=parseInt(i.headers.get("Retry-After")||"60");throw new Error(`Rate limit exceeded. Retry after ${u} seconds`)}let a=yield i.json();if(i.status!==200)throw new Error(a.message||"Failed to initialize conversation");let o=a;this.conversationId=o.chatId})},$=function(e,t,s){let i=[{Key:"chatId",Value:this.conversationId},{Key:"message",Value:e},{Key:"stream",Value:t.toString()}];return c(this,h,_).call(this,i,s==null?void 0:s.inputParameters),c(this,h,ne).call(this,i,s==null?void 0:s.volatileKnowledgeIds),c(this,h,ee).call(this,i),c(this,h,te).call(this,i),i},ee=function(e){this.userIdentifier&&e.push({Key:"userIdentifier",Value:this.userIdentifier})},te=function(e){this.channel&&e.push({Key:"channel",Value:this.channel})},_=function(e,t={}){if(!(!t||Object.keys(t).length===0))for(let[s,i]of Object.entries(t))e.push({Key:s,Value:i})},se=function(e){this.userIdentifier&&(e.userIdentifier=this.userIdentifier),this.inputParameters&&(e.inputParameters=[],c(this,h,_).call(this,e.inputParameters,this.inputParameters))},ne=function(e,t){!t||t.length===0||e.push({Key:"volatileKnowledgeIds",Value:t})};var V=j;var O=class{constructor(n,e,t,s){this.agentCode=n;this.apiKey=e;this.baseUrl=t;this.options=s}createRealtimeSession(n,e,t,s){return new C(n,e,t,s)}createConversation(n,e,t,s){return g(this,null,function*(){return yield V.create(n,e,t,s)})}};var w=class r extends O{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}};var T=class r extends O{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}};var d=class extends v{constructor(e,t,s,i){super();this.agentCode=e;this.apiKey=t;this.baseUrl=s;this.options=i}stream(){return g(this,null,function*(){var u;let e=(u=this.options)!=null&&u.agentVersion?`/${this.options.agentVersion}`:"",t=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${e}`,s=this.createExecuteBody(!0),i=new P,a;a=new Promise((m,f)=>{i.on("start",()=>{this.emit("start")}),i.on("error",x=>{let l=JSON.parse(x);this.emit("error",l),f(l)}),i.on("content",x=>{let l=JSON.parse(x);this.emit("content",l.text)}),i.on("stop",x=>{let l=JSON.parse(x);this.emit("stop",l.result),m(l.result)})});let o={method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(s)};return i.start(t,o).catch(m=>{throw this.emit("error",{message:m.message}),m}),a})}execute(){return g(this,null,function*(){var o;let e=(o=this.options)!=null&&o.agentVersion?`/${this.options.agentVersion}`:"",t=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${e}`,s=this.createExecuteBody(!1),i=yield fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(s)});if(i.status===429){let u=parseInt(i.headers.get("Retry-After")||"60");throw new Error(`Rate limit exceeded. Retry after ${u} seconds`)}let a=yield i.json();if(i.status!==200)throw new Error(a.message||"Failed to execute message");return A.mapAgentResultToSnakeCase(a)})}createExecuteBody(e){let t=[{Key:"stream",Value:e.toString()}];return this.appendVolatileKnowledgeIdsIfNeeded(t),this.appendUserIdentifierIfNeeded(t),this.appendChannelIfNeeded(t),t}appendUserIdentifierIfNeeded(e){var t;(t=this.options)!=null&&t.userIdentifier&&e.push({Key:"userIdentifier",Value:this.options.userIdentifier})}appendVolatileKnowledgeIdsIfNeeded(e){var t;!((t=this.options)!=null&&t.volatileKnowledgeIds)||this.options.volatileKnowledgeIds.length===0||e.push({Key:"volatileKnowledgeIds",Value:this.options.volatileKnowledgeIds})}appendChannelIfNeeded(e){var t;(t=this.options)!=null&&t.channel&&e.push({Key:"channel",Value:this.options.channel})}};var I=class r extends d{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}static createAndExecute(n,e,t,s){return new r(n,e,t,s).execute()}createExecuteBody(n){let e=super.createExecuteBody(n);return this.appendInputParametersIfNeeded(e),e}appendInputParametersIfNeeded(n){var e;if(!(!((e=this.options)!=null&&e.inputParameters)||Object.keys(this.options.inputParameters).length===0))for(let[t,s]of Object.entries(this.options.inputParameters))n.push({Key:t,Value:s})}};var b=class r extends d{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}static createAndExecute(n,e,t,s){return new r(n,e,t,s).execute()}createExecuteBody(n){let e=super.createExecuteBody(n);return this.appendMessagesIfNeeded(e),this.appendMessageIfNeeded(e),this.appendInputParametersIfNeeded(e),e}appendMessagesIfNeeded(n){var e;!((e=this.options)!=null&&e.messages)||this.options.messages.length===0||n.push({Key:"messages",Value:JSON.stringify(this.options.messages)})}appendMessageIfNeeded(n){var e;(e=this.options)!=null&&e.message&&n.push({Key:"message",Value:this.options.message})}appendInputParametersIfNeeded(n){var e;if(!(!((e=this.options)!=null&&e.inputParameters)||Object.keys(this.options.inputParameters).length===0))for(let[t,s]of Object.entries(this.options.inputParameters))n.push({Key:t,Value:s})}};var k=class r extends d{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}static createAndExecute(n,e,t,s){return new r(n,e,t,s).execute()}createExecuteBody(n){let e=super.createExecuteBody(n);return this.appendInputParametersIfNeeded(e),e}appendInputParametersIfNeeded(n){var e;if(!(!((e=this.options)!=null&&e.inputParameters)||Object.keys(this.options.inputParameters).length===0))for(let[t,s]of Object.entries(this.options.inputParameters))n.push({Key:t,Value:s})}};var R=class r extends d{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}static createAndExecute(n,e,t,s){return new r(n,e,t,s).execute()}createExecuteBody(n){let e=this.options;return{model:e.model,messages:e.messages,frequency_penalty:e.frequency_penalty,max_tokens:e.max_tokens,presence_penalty:e.presence_penalty,temperature:e.temperature,top_p:e.top_p,top_k:e.top_k,vendor:e.vendor,userIdentifier:e.userIdentifier,groupIdentifier:e.groupIdentifier,useVision:e.useVision,stream:n}}};var y=class{static createAgent(n,e,t){switch(n){case"assistant":return{createConversation:(s,i)=>g(this,null,function*(){return yield w.create(s,e,t,i).createConversation(s,e,t,i)}),createRealtimeSession:(s,i)=>w.create(s,e,t,i).createRealtimeSession(s,e,t,i)};case"copilot":return{createConversation:(s,i)=>g(this,null,function*(){return yield T.create(s,e,t,i).createConversation(s,e,t,i)}),createRealtimeSession:(s,i)=>T.create(s,e,t,i).createRealtimeSession(s,e,t,i)};case"activity":return{execute:(s,i)=>I.createAndExecute(s,e,t,i),create:(s,i)=>I.create(s,e,t,i)};case"chat-completion":return{execute:(s,i)=>b.createAndExecute(s,e,t,i),create:(s,i)=>b.create(s,e,t,i)};case"proxy":return{execute:(s,i)=>R.createAndExecute(s,e,t,i),create:(s,i)=>R.create(s,e,t,i)};case"plan":return{execute:(s,i)=>k.createAndExecute(s,e,t,i),create:(s,i)=>k.create(s,e,t,i)};default:throw new Error(`Agent type ${n} not supported`)}}};var M=class{constructor(n){this.baseUrl="https://api.serenitystar.ai/api";if(!n.apiKey)throw new Error("The API key is required");this.apiKey=n.apiKey,this.baseUrl=n.baseUrl||this.baseUrl,this.agents={assistants:y.createAgent("assistant",this.apiKey,this.baseUrl),copilots:y.createAgent("copilot",this.apiKey,this.baseUrl),activities:y.createAgent("activity",this.apiKey,this.baseUrl),chatCompletions:y.createAgent("chat-completion",this.apiKey,this.baseUrl),proxies:y.createAgent("proxy",this.apiKey,this.baseUrl),plans:y.createAgent("plan",this.apiKey,this.baseUrl)}}};0&&(module.exports={RealtimeSession,SerenityClient});
4
+ `,t=e+e;for(;(n=this.buffer.indexOf(t))!==-1;){let s=this.buffer.slice(0,n).trim();this.buffer=this.buffer.slice(n+t.length);let i=s.split(e),a={};for(let o of i)o.startsWith("data:")?a.data=o.slice(5).trim():o.startsWith("event:")&&(a.event=o.slice(6).trim());this.trigger(a.event||"message",a.data)}}on(n,e){this.eventListeners[n]||(this.eventListeners[n]=[]),this.eventListeners[n].push(e)}off(n,e){let t=this.eventListeners[n];t&&(this.eventListeners[n]=t.filter(s=>s!==e))}trigger(n,e){let t=this.eventListeners[n];t&&t.forEach(s=>s(e))}stop(){this.active=!1}};var S=class{};S.mapAgentResultToSnakeCase=n=>({content:n.content,instance_id:n.instanceId,action_results:n.actionResults,completion_usage:n.completionUsage,executor_task_logs:n.executorTaskLogs,json_content:n.jsonContent,meta_analysis:n.metaAnalysis,time_to_first_token:n.timeToFirstToken});var h,Z,$,ee,te,_,se,ne,j=class j extends v{constructor(e,t,s,i){super();K(this,h);this.apiKey=t,this.agentCode=e,this.baseUrl=s,this.agentVersion=i==null?void 0:i.agentVersion,this.inputParameters=i==null?void 0:i.inputParameters,this.userIdentifier=i==null?void 0:i.userIdentifier,this.channel=i==null?void 0:i.channel}static create(e,t,s,i){return u(this,null,function*(){var o;let a=new j(e,t,s,i);return yield c(o=a,h,Z).call(o),a})}streamMessage(e,t){return u(this,null,function*(){if(!this.conversationId)throw new Error("Conversation not initialized");let s=this.agentVersion?`/${this.agentVersion}`:"",i=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${s}`,a=c(this,h,$).call(this,e,!0,t),o=new P,g;return g=new Promise((m,A)=>u(this,null,function*(){o.on("start",()=>{this.emit("start")}),o.on("error",l=>{let x=JSON.parse(l);this.emit("error",x),A(x)}),o.on("content",l=>{let x=JSON.parse(l);this.emit("content",x.text)}),o.on("stop",l=>{let x=JSON.parse(l);this.emit("stop",x.result),m(x.result)});let y={method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(a)};try{yield o.start(i,y)}catch(l){A(l)}})),g})}sendMessage(e,t){return u(this,null,function*(){if(!this.conversationId)throw new Error("Conversation not initialized");let s=this.agentVersion?`/${this.agentVersion}`:"",i=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${s}`,a=c(this,h,$).call(this,e,!1,t),o=yield fetch(i,{method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(a)});if(o.status===429){let A=parseInt(o.headers.get("Retry-After")||"60");throw new Error(`Rate limit exceeded. Retry after ${A} seconds`)}let g=yield o.json();if(o.status!==200)throw new Error(g.message||"Failed to execute message");return S.mapAgentResultToSnakeCase(g)})}};h=new WeakSet,Z=function(){return u(this,null,function*(){if(this.conversationId)return;let e=this.agentVersion?`/${this.agentVersion}`:"",t=`${this.baseUrl}/v2/agent/${this.agentCode}/conversation${e}`,s={};c(this,h,se).call(this,s);let i=yield fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(s)});if(i.status===429){let g=parseInt(i.headers.get("Retry-After")||"60");throw new Error(`Rate limit exceeded. Retry after ${g} seconds`)}let a=yield i.json();if(i.status!==200)throw new Error(a.message||"Failed to initialize conversation");let o=a;this.conversationId=o.chatId})},$=function(e,t,s){let i=[{Key:"chatId",Value:this.conversationId},{Key:"message",Value:e},{Key:"stream",Value:t.toString()}];return c(this,h,_).call(this,i,s==null?void 0:s.inputParameters),c(this,h,ne).call(this,i,s==null?void 0:s.volatileKnowledgeIds),c(this,h,ee).call(this,i),c(this,h,te).call(this,i),i},ee=function(e){this.userIdentifier&&e.push({Key:"userIdentifier",Value:this.userIdentifier})},te=function(e){this.channel&&e.push({Key:"channel",Value:this.channel})},_=function(e,t={}){if(!(!t||Object.keys(t).length===0))for(let[s,i]of Object.entries(t))e.push({Key:s,Value:i})},se=function(e){this.userIdentifier&&(e.userIdentifier=this.userIdentifier),this.inputParameters&&(e.inputParameters=[],c(this,h,_).call(this,e.inputParameters,this.inputParameters))},ne=function(e,t){!t||t.length===0||e.push({Key:"volatileKnowledgeIds",Value:t})};var V=j;var O=class{constructor(n,e,t,s){this.agentCode=n;this.apiKey=e;this.baseUrl=t;this.options=s}createRealtimeSession(n,e,t,s){return new C(n,e,t,s)}createConversation(n,e,t,s){return u(this,null,function*(){return yield V.create(n,e,t,s)})}};var w=class r extends O{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}};var T=class r extends O{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}};var d=class extends v{constructor(e,t,s,i){super();this.agentCode=e;this.apiKey=t;this.baseUrl=s;this.options=i}stream(){return u(this,null,function*(){var o;let e=(o=this.options)!=null&&o.agentVersion?`/${this.options.agentVersion}`:"",t=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${e}`,s=this.createExecuteBody(!0),i=new P,a;return a=new Promise((g,m)=>u(this,null,function*(){i.on("start",()=>{this.emit("start")}),i.on("error",y=>{let l=JSON.parse(y);this.emit("error",l),m(l)}),i.on("content",y=>{let l=JSON.parse(y);this.emit("content",l.text)}),i.on("stop",y=>{let l=JSON.parse(y);this.emit("stop",l.result),g(l.result)});let A={method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(s)};try{yield i.start(t,A)}catch(y){m(y)}})),a})}execute(){return u(this,null,function*(){var o;let e=(o=this.options)!=null&&o.agentVersion?`/${this.options.agentVersion}`:"",t=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${e}`,s=this.createExecuteBody(!1),i=yield fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(s)});if(i.status===429){let g=parseInt(i.headers.get("Retry-After")||"60");throw new Error(`Rate limit exceeded. Retry after ${g} seconds`)}let a=yield i.json();if(i.status!==200)throw new Error(a.message||"Failed to execute message");return S.mapAgentResultToSnakeCase(a)})}createExecuteBody(e){let t=[{Key:"stream",Value:e.toString()}];return this.appendVolatileKnowledgeIdsIfNeeded(t),this.appendUserIdentifierIfNeeded(t),this.appendChannelIfNeeded(t),t}appendUserIdentifierIfNeeded(e){var t;(t=this.options)!=null&&t.userIdentifier&&e.push({Key:"userIdentifier",Value:this.options.userIdentifier})}appendVolatileKnowledgeIdsIfNeeded(e){var t;!((t=this.options)!=null&&t.volatileKnowledgeIds)||this.options.volatileKnowledgeIds.length===0||e.push({Key:"volatileKnowledgeIds",Value:this.options.volatileKnowledgeIds})}appendChannelIfNeeded(e){var t;(t=this.options)!=null&&t.channel&&e.push({Key:"channel",Value:this.options.channel})}};var I=class r extends d{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}static createAndExecute(n,e,t,s){return new r(n,e,t,s).execute()}createExecuteBody(n){let e=super.createExecuteBody(n);return this.appendInputParametersIfNeeded(e),e}appendInputParametersIfNeeded(n){var e;if(!(!((e=this.options)!=null&&e.inputParameters)||Object.keys(this.options.inputParameters).length===0))for(let[t,s]of Object.entries(this.options.inputParameters))n.push({Key:t,Value:s})}};var b=class r extends d{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}static createAndExecute(n,e,t,s){return new r(n,e,t,s).execute()}createExecuteBody(n){let e=super.createExecuteBody(n);return this.appendMessagesIfNeeded(e),this.appendMessageIfNeeded(e),this.appendInputParametersIfNeeded(e),e}appendMessagesIfNeeded(n){var e;!((e=this.options)!=null&&e.messages)||this.options.messages.length===0||n.push({Key:"messages",Value:JSON.stringify(this.options.messages)})}appendMessageIfNeeded(n){var e;(e=this.options)!=null&&e.message&&n.push({Key:"message",Value:this.options.message})}appendInputParametersIfNeeded(n){var e;if(!(!((e=this.options)!=null&&e.inputParameters)||Object.keys(this.options.inputParameters).length===0))for(let[t,s]of Object.entries(this.options.inputParameters))n.push({Key:t,Value:s})}};var k=class r extends d{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}static createAndExecute(n,e,t,s){return new r(n,e,t,s).execute()}createExecuteBody(n){let e=super.createExecuteBody(n);return this.appendInputParametersIfNeeded(e),e}appendInputParametersIfNeeded(n){var e;if(!(!((e=this.options)!=null&&e.inputParameters)||Object.keys(this.options.inputParameters).length===0))for(let[t,s]of Object.entries(this.options.inputParameters))n.push({Key:t,Value:s})}};var R=class r extends d{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}static createAndExecute(n,e,t,s){return new r(n,e,t,s).execute()}createExecuteBody(n){let e=this.options;return{model:e.model,messages:e.messages,frequency_penalty:e.frequency_penalty,max_tokens:e.max_tokens,presence_penalty:e.presence_penalty,temperature:e.temperature,top_p:e.top_p,top_k:e.top_k,vendor:e.vendor,userIdentifier:e.userIdentifier,groupIdentifier:e.groupIdentifier,useVision:e.useVision,stream:n}}};var f=class{static createAgent(n,e,t){switch(n){case"assistant":return{createConversation:(s,i)=>u(this,null,function*(){return yield w.create(s,e,t,i).createConversation(s,e,t,i)}),createRealtimeSession:(s,i)=>w.create(s,e,t,i).createRealtimeSession(s,e,t,i)};case"copilot":return{createConversation:(s,i)=>u(this,null,function*(){return yield T.create(s,e,t,i).createConversation(s,e,t,i)}),createRealtimeSession:(s,i)=>T.create(s,e,t,i).createRealtimeSession(s,e,t,i)};case"activity":return{execute:(s,i)=>I.createAndExecute(s,e,t,i),create:(s,i)=>I.create(s,e,t,i)};case"chat-completion":return{execute:(s,i)=>b.createAndExecute(s,e,t,i),create:(s,i)=>b.create(s,e,t,i)};case"proxy":return{execute:(s,i)=>R.createAndExecute(s,e,t,i),create:(s,i)=>R.create(s,e,t,i)};case"plan":return{execute:(s,i)=>k.createAndExecute(s,e,t,i),create:(s,i)=>k.create(s,e,t,i)};default:throw new Error(`Agent type ${n} not supported`)}}};var M=class{constructor(n){this.baseUrl="https://api.serenitystar.ai/api";if(!n.apiKey)throw new Error("The API key is required");this.apiKey=n.apiKey,this.baseUrl=n.baseUrl||this.baseUrl,this.agents={assistants:f.createAgent("assistant",this.apiKey,this.baseUrl),copilots:f.createAgent("copilot",this.apiKey,this.baseUrl),activities:f.createAgent("activity",this.apiKey,this.baseUrl),chatCompletions:f.createAgent("chat-completion",this.apiKey,this.baseUrl),proxies:f.createAgent("proxy",this.apiKey,this.baseUrl),plans:f.createAgent("plan",this.apiKey,this.baseUrl)}}};0&&(module.exports={RealtimeSession,SerenityClient});
5
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/polyfill.ts","../src/EventEmitter.ts","../src/scopes/conversational/RealtimeSession/index.ts","../src/scopes/conversational/Conversation/SseConnection.ts","../src/utils/AgentMapper.ts","../src/scopes/conversational/Conversation/index.ts","../src/scopes/conversational/ConversationalAgent.ts","../src/scopes/conversational/Assistant.ts","../src/scopes/conversational/Copilot.ts","../src/scopes/system/SystemAgent.ts","../src/scopes/system/Activity.ts","../src/scopes/system/ChatCompletion.ts","../src/scopes/system/Plan.ts","../src/scopes/system/Proxy.ts","../src/factories/AgentFactory.ts","../src/SerenityClient.ts"],"sourcesContent":["import \"./polyfill\"\nimport { RealtimeSession } from './scopes/conversational/RealtimeSession';\nimport SerenityClient from './SerenityClient';\n\nexport { SerenityClient, RealtimeSession };","let undiciFetch, UndiciHeaders, UndiciRequest, UndiciResponse;\n\nif (typeof process !== 'undefined' && process.versions?.node) {\n // Only import undici in Node.js environment\n const undici = require('undici');\n undiciFetch = undici.fetch;\n UndiciHeaders = undici.Headers;\n UndiciRequest = undici.Request;\n UndiciResponse = undici.Response;\n\n if (!globalThis.fetch) {\n globalThis.fetch = undiciFetch as unknown as typeof globalThis.fetch;\n globalThis.Headers = UndiciHeaders as unknown as typeof globalThis.Headers;\n globalThis.Request = UndiciRequest as unknown as typeof globalThis.Request;\n globalThis.Response = UndiciResponse as unknown as typeof globalThis.Response;\n }\n}\n\nexport {\n undiciFetch as fetch,\n UndiciHeaders as Headers,\n UndiciRequest as Request,\n UndiciResponse as Response\n};\n","export class EventEmitter<T extends Record<string, (...args: any[]) => void>> {\n private listeners: { [K in keyof T]?: Array<T[K]> } = {};\n\n on<K extends keyof T>(eventName: K, listener: T[K]): this {\n if (!this.listeners[eventName]) {\n this.listeners[eventName] = [];\n }\n this.listeners[eventName]!.push(listener);\n return this;\n }\n\n emit<K extends keyof T>(eventName: K, ...args: Parameters<T[K]>): void {\n this.listeners[eventName]?.forEach((listener) => listener(...args));\n }\n}","import { EventEmitter } from \"../../../EventEmitter\";\nimport {\n AgentExecutionOptions,\n AgentExecutionOptionsWithParameters,\n} from \"../../../types\";\nimport {\n RealtimeSessionEvents,\n SerenitySessionCreateEvent,\n SerenityEvent,\n SerenitySessionCreatedEvent,\n SerenitySessionCloseEvent,\n SerenitySessionErrorEvent,\n SDPConfiguration,\n SerenityResponseProcessedEvent,\n} from \"./types\";\n\nexport class RealtimeSession extends EventEmitter<RealtimeSessionEvents> {\n private agentCode: string;\n private apiKey: string;\n private baseUrl: string;\n\n // Optional parameters.\n private inputParameters?: { [key: string]: any };\n private userIdentifier?: string;\n private agentVersion?: number;\n private channel?: string;\n\n private inactivityTimeout?: NodeJS.Timeout;\n private timeout = 120000; // 2 minutes\n\n // WebRTC configuration.\n private sessionConfiguration?: SDPConfiguration;\n private peerConnection?: RTCPeerConnection;\n private localStream?: MediaStream;\n private dataChannel?: RTCDataChannel;\n\n // WebSockets configuration.\n private socket?: WebSocket;\n\n constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptionsWithParameters\n ) {\n super();\n this.apiKey = apiKey;\n this.agentCode = agentCode;\n this.baseUrl = baseUrl;\n\n this.agentVersion = options?.agentVersion;\n this.inputParameters = options?.inputParameters;\n this.userIdentifier = options?.userIdentifier;\n this.channel = options?.channel;\n }\n\n // #region Public methods\n\n /**\n * Starts the real-time session.\n */\n async start(): Promise<void> {\n try {\n this.#setupWebSocketConnection();\n } catch (error) {\n throw new Error(`Error starting the session`);\n }\n }\n\n /**\n * Stops the real-time session.\n */\n stop(): void {\n this.#stop();\n }\n\n /**\n * Allows the user to mute the microphone during a real-time voice session.\n */\n muteMicrophone(): void {\n if (this.localStream) {\n const audioTrack = this.localStream.getAudioTracks()[0];\n if (audioTrack) {\n audioTrack.enabled = false;\n }\n }\n }\n\n /**\n * Allows the user to unmute the microphone during a real-time voice session.\n */\n unmuteMicrophone(): void {\n if (this.localStream) {\n const audioTrack = this.localStream.getAudioTracks()[0];\n if (audioTrack) {\n audioTrack.enabled = true;\n }\n }\n }\n // #endregion\n\n // #region Private methods\n\n /**\n * Internal method to stop the session. Allows for a reason and details to be provided.\n * @param reason The reason for stopping the session.\n * @param details Additional details about the stop event.\n */\n #stop(reason?: string, details?: any): void {\n // Send a closure message to the server if socket is connected\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n try {\n // Close the WebSocket connection properly\n this.socket.close(1000, \"Client closed the session\");\n } catch (error) {\n console.error(\"Error closing WebSocket connection:\", error);\n }\n }\n \n // Stop the local audio tracks.\n if (this.localStream) {\n this.localStream.getTracks().forEach((track) => track.stop());\n this.localStream = undefined;\n }\n \n // Close the WebRTC connection if it is open.\n this.peerConnection && this.peerConnection.close();\n \n // Reset variables\n this.socket = undefined;\n this.dataChannel = undefined;\n this.peerConnection = undefined;\n\n this.emit(\"session.stopped\", reason, details);\n clearTimeout(this.inactivityTimeout);\n }\n\n #setupWebSocketConnection() {\n let url = `${this.baseUrl}/v2/agent/${this.agentCode}/realtime`;\n\n if (this.agentVersion) {\n url += `/${this.agentVersion}`;\n }\n\n this.socket = new WebSocket(url, [\"X-API-KEY\", this.apiKey]);\n\n this.socket.onopen = () => {\n const sessionCreateEvent: SerenitySessionCreateEvent = {\n type: \"serenity.session.create\",\n input_parameters: this.inputParameters,\n user_identifier: this.userIdentifier,\n channel: this.channel,\n };\n\n this.socket!.send(JSON.stringify(sessionCreateEvent));\n };\n\n this.socket.onclose = () => {\n this.#stop();\n };\n\n this.socket.onerror = (event) => {\n this.emit(\"error\", \"Error connecting to the server\");\n this.#stop();\n };\n\n this.socket.onmessage = (event) => {\n this.#handleIncomingMessagesFromSerenity(event.data);\n };\n }\n\n async #handleIncomingMessagesFromSerenity(data: string) {\n const obj = JSON.parse(data) as SerenityEvent;\n switch (obj.type) {\n case \"serenity.session.created\": {\n const eventData = obj as SerenitySessionCreatedEvent;\n this.sessionConfiguration = {\n url: eventData.url,\n headers: eventData.headers,\n };\n\n // Setup the WebRTC connection.\n this.#setupWebRTCConnection();\n\n // Add listeners for the WebRTC connection.\n this.#handleIncomingMessagesFromVendor();\n\n // Start the session.\n await this.#startSession();\n\n break;\n }\n case \"serenity.session.close\": {\n const eventData = obj as SerenitySessionCloseEvent;\n const errorDetails = this.#extractErrorMessageFromEvent(eventData);\n this.emit(\"error\", errorDetails);\n this.#stop(eventData.reason, errorDetails);\n break;\n }\n case \"serenity.response.processed\": {\n const eventData = obj as SerenityResponseProcessedEvent;\n this.emit(\"response.processed\", eventData.result);\n break;\n }\n default: {\n const isSerenityEvent = obj.type.startsWith(\"serenity\");\n if (this.dataChannel && !isSerenityEvent) {\n this.dataChannel.send(JSON.stringify(obj));\n }\n }\n }\n }\n\n #handleIncomingMessagesFromVendor() {\n if (!this.peerConnection) {\n throw new Error(\n `Could not add listeners: WebRTC connection not initialized`\n );\n }\n // Set up data channel for sending and receiving events\n const currentDate = new Date()\n .toISOString()\n .replace(/T/, \"-\")\n .replace(/:/g, \"-\")\n .replace(/\\..+/, \"\");\n const channelName = `data-channel-${this.agentCode}-${currentDate}`;\n this.dataChannel = this.peerConnection.createDataChannel(channelName);\n\n this.dataChannel.addEventListener(\"message\", (e: MessageEvent) => {\n this.#resetInactivityTimeout();\n const data = JSON.parse(e.data);\n\n try {\n switch (data.type) {\n case \"input_audio_buffer.speech_started\": {\n this.emit(\"speech.started\");\n break;\n }\n case \"input_audio_buffer.speech_stopped\": {\n this.emit(\"speech.stopped\");\n break;\n }\n\n case \"response.done\": {\n this.emit(\"response.done\");\n break;\n }\n case \"error\": {\n this.emit(\"error\", \"There was an error processing your request\");\n break;\n }\n }\n } catch (error) {\n this.emit(\"error\", \"Error processing incoming messages from vendor\");\n } finally {\n // Forward the message to the server\n if (this.socket) {\n this.socket.send(JSON.stringify(data));\n }\n }\n });\n }\n\n #setupWebRTCConnection() {\n // Create the peer connection.\n this.peerConnection = new RTCPeerConnection();\n\n // Configure remote audio playback.\n const audioElement = document.createElement(\"audio\");\n audioElement.autoplay = true;\n\n this.peerConnection.ontrack = (event) => {\n if (event.streams && event.streams[0]) {\n audioElement.srcObject = event.streams[0];\n }\n };\n }\n\n async #getAudioFromMicrophone(): Promise<void> {\n if (!this.peerConnection) {\n throw new Error(\n `Could not start the session: WebRTC connection not initialized`\n );\n }\n\n this.localStream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n\n const audioTrack = this.localStream.getTracks()[0];\n this.peerConnection.addTrack(audioTrack, this.localStream);\n }\n\n async #startSession() {\n if (!this.peerConnection) {\n throw new Error(\n `Could not start the session: WebRTC connection not initialized`\n );\n }\n\n if (!this.sessionConfiguration) {\n throw new Error(\n `Could not start the session: Session configuration not available`\n );\n }\n\n try {\n // Get the audio from the microphone.\n await this.#getAudioFromMicrophone();\n\n // Start the session using the Session Description Protocol (SDP)\n const offer = await this.peerConnection.createOffer();\n await this.peerConnection.setLocalDescription(offer);\n\n const sdpResponse = await fetch(`${this.sessionConfiguration.url}`, {\n method: \"POST\",\n body: offer.sdp,\n headers: this.sessionConfiguration.headers,\n });\n\n if (!sdpResponse.ok) {\n throw new Error(\"Error starting the session\");\n }\n\n const answer: RTCSessionDescriptionInit = {\n type: \"answer\",\n sdp: await sdpResponse.text(),\n };\n\n await this.peerConnection.setRemoteDescription(answer);\n\n this.emit(\"session.created\");\n this.#resetInactivityTimeout();\n } catch (error) {\n this.emit(\"error\", \"Error starting the session\");\n this.#stop();\n }\n }\n\n #resetInactivityTimeout() {\n clearTimeout(this.inactivityTimeout);\n this.inactivityTimeout = setTimeout(() => {\n this.#stop();\n }, this.timeout);\n }\n\n #extractErrorMessageFromEvent(eventData: SerenitySessionErrorEvent) {\n switch (eventData.reason) {\n case \"Exception\":\n return eventData.message;\n case \"ValidationException\": {\n if (!eventData.errors) return eventData.message;\n\n return Object.values(eventData.errors).join(\". \");\n }\n default:\n return eventData.message;\n }\n }\n // #endregion\n}\n","/**\n * Interface representing the structure of event data.\n */\ninterface SseEventData {\n start_time_utc?: string;\n stop_time_utc?: string;\n message?: string;\n}\n\n/**\n * Interface representing the event object with optional event and data properties.\n */\ninterface Event {\n event?: string;\n data?: string;\n}\n\n/**\n * Type for the event listeners.\n */\ntype ConnectionEventListener = (data: string) => void;\n\n/**\n * Class representing a server-sent events (SSE) connection.\n */\nexport class SseConnection {\n private eventListeners: Record<string, ConnectionEventListener[]>;\n private active: boolean;\n private buffer: string = \"\";\n\n /**\n * Creates an instance of SseConnection.\n * @param options - Options for the SSE connection.\n */\n constructor() {\n this.eventListeners = {\n start: [\n (_: string) => {\n },\n ],\n stop: [\n (_: string) => {\n this.stop();\n },\n ],\n error: [\n (_: string) => {\n this.stop();\n },\n ],\n };\n this.active = false;\n }\n\n /**\n * Connects to the SSE server and listens for events.\n * @param url - The URL to connect to for SSE.\n * @param fetchOptions - Additional fetch options.\n * @returns A promise that resolves with the response when the connection is active.\n * @throws Will throw an error if the response is not an event stream.\n */\n async start(\n url: string,\n fetchOptions: RequestInit\n ): Promise<Response> {\n this.active = true;\n try {\n const response = await fetch(url, fetchOptions);\n const contentType = response.headers.get(\"Content-Type\");\n\n if (contentType !== \"text/event-stream\") {\n return response;\n }\n\n const reader = response.body!.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n this.buffer = \"\";\n\n while (this.active) {\n const { done, value } = await reader.read();\n if (done) break;\n\n this.buffer += decoder.decode(value, { stream: true });\n this.processEvents();\n }\n\n return response;\n } catch (error) {\n console.error(\"Error in SSE connection:\", error);\n this.active = false;\n throw error;\n }\n }\n\n /**\n * Processes the event data from the buffer.\n */\n private processEvents(): void {\n let eventEnd: number;\n const lineEnding = this.buffer.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const eventDelimiter = lineEnding + lineEnding;\n while ((eventEnd = this.buffer.indexOf(eventDelimiter)) !== -1) {\n const eventText = this.buffer.slice(0, eventEnd).trim();\n this.buffer = this.buffer.slice(eventEnd + eventDelimiter.length);\n\n const lines = eventText.split(lineEnding);\n const event: Event = {};\n for (let line of lines) {\n if (line.startsWith(\"data:\")) {\n event.data = line.slice(\"data:\".length).trim();\n } else if (line.startsWith(\"event:\")) {\n event.event = line.slice(\"event:\".length).trim();\n }\n }\n\n this.trigger(event.event || \"message\", event.data!);\n }\n }\n\n /**\n * Registers an event listener for a specific event type.\n * @param eventType - The type of event to listen for.\n * @param callback - The callback function to execute when the event occurs.\n */\n on(eventType: string, callback: ConnectionEventListener): void {\n if (!this.eventListeners[eventType]) {\n this.eventListeners[eventType] = [];\n }\n this.eventListeners[eventType].push(callback);\n }\n\n /**\n * Unregisters an event listener for a specific event type.\n * @param eventType - The type of event to stop listening for.\n * @param callback - The callback function to remove.\n */\n off(eventType: string, callback: ConnectionEventListener): void {\n const listeners = this.eventListeners[eventType];\n if (listeners) {\n this.eventListeners[eventType] = listeners.filter(\n (cb) => cb !== callback\n );\n }\n }\n\n /**\n * Triggers an event and calls all registered listeners for that event type.\n * @param eventType - The type of event to trigger.\n * @param data - The data to pass to the event listeners.\n */\n private trigger(eventType: string, data: string): void {\n const listeners = this.eventListeners[eventType];\n if (listeners) {\n listeners.forEach((callback) => callback(data));\n }\n }\n\n /**\n * Stops the SSE connection.\n */\n stop(): void {\n this.active = false;\n }\n}\n","import { AgentResult } from \"../types\";\n\nexport class AgentMapper {\n public static mapAgentResultToSnakeCase = (data: {\n [key: string]: any;\n }): AgentResult => {\n const result: AgentResult = {\n content: data.content,\n instance_id: data.instanceId,\n action_results: data.actionResults,\n completion_usage: data.completionUsage,\n executor_task_logs: data.executorTaskLogs,\n json_content: data.jsonContent,\n meta_analysis: data.metaAnalysis,\n time_to_first_token: data.timeToFirstToken,\n };\n\n return result;\n };\n}\n","import { EventEmitter } from \"../../../EventEmitter\";\nimport { AgentExecutionOptions, AgentExecutionOptionsWithParameters, AgentResult, ExecuteBodyParams, SSEStreamEvents } from \"../../../types\";\nimport { InitConversationParams, InitConversationResponse, MessageOptions } from \"./types\";\nimport { SseConnection } from \"./SseConnection\";\nimport { AgentMapper } from \"../../../utils/AgentMapper\";\n\nexport class Conversation extends EventEmitter<SSEStreamEvents> {\n private agentCode: string;\n private apiKey: string;\n private baseUrl: string;\n\n // Optional parameters.\n private inputParameters?: { [key: string]: any };\n private userIdentifier?: string;\n private agentVersion?: number;\n private channel?: string;\n\n public conversationId?: string;\n\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptionsWithParameters\n ) {\n super();\n this.apiKey = apiKey;\n this.agentCode = agentCode;\n this.baseUrl = baseUrl;\n\n this.agentVersion = options?.agentVersion;\n this.inputParameters = options?.inputParameters;\n this.userIdentifier = options?.userIdentifier;\n this.channel = options?.channel;\n }\n\n private static async create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ): Promise<Conversation> {\n const instance = new Conversation(agentCode, apiKey, baseUrl, options);\n await instance.#getConversationId();\n return instance;\n }\n\n async #getConversationId(): Promise<void> {\n if (this.conversationId) return;\n\n const version = this.agentVersion ? `/${this.agentVersion}` : '';\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/conversation${version}`;\n let reqBody: InitConversationParams = {};\n\n this.#appendInitConversationParamsIfNeeded(reqBody);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(reqBody),\n });\n\n if (response.status === 429) {\n const retryAfter = parseInt(response.headers.get(\"Retry-After\") || \"60\");\n throw new Error(`Rate limit exceeded. Retry after ${retryAfter} seconds`);\n }\n\n const body = await response.json();\n\n if (response.status !== 200) {\n throw new Error(body.message || \"Failed to initialize conversation\");\n }\n\n const data = body as InitConversationResponse;\n this.conversationId = data.chatId;\n }\n\n async streamMessage(message: string, options?: MessageOptions): Promise<AgentResult> {\n if (!this.conversationId) {\n throw new Error(\"Conversation not initialized\");\n }\n const version = this.agentVersion ? `/${this.agentVersion}` : '';\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n \n let body = this.#createExecuteBody(message, true, options);\n\n const connection = new SseConnection();\n let responsePromise: Promise<AgentResult>;\n\n responsePromise = new Promise((resolve, reject) => {\n connection.on(\"start\", () => {\n this.emit(\"start\");\n });\n\n connection.on(\"error\", (data) => {\n const error = JSON.parse(data);\n this.emit(\"error\", error);\n reject(error);\n });\n\n connection.on(\"content\", (data) => {\n const chunk = JSON.parse(data);\n this.emit(\"content\", chunk.text);\n });\n\n connection.on(\"stop\", (data) => {\n const finalMessage = JSON.parse(data) as { result: AgentResult};\n this.emit(\"stop\", finalMessage.result);\n resolve(finalMessage.result);\n });\n });\n\n const fetchOptions: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n };\n\n connection.start(url, fetchOptions).catch((error) => {\n this.emit(\"error\", { message: error.message });\n throw error;\n });\n\n return responsePromise;\n }\n\n async sendMessage(message: string, options?: MessageOptions): Promise<AgentResult> {\n if (!this.conversationId) {\n throw new Error(\"Conversation not initialized\");\n }\n const version = this.agentVersion ? `/${this.agentVersion}` : '';\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n \n let body = this.#createExecuteBody(message, false, options);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (response.status === 429) {\n const retryAfter = parseInt(response.headers.get(\"Retry-After\") || \"60\");\n throw new Error(`Rate limit exceeded. Retry after ${retryAfter} seconds`);\n }\n\n const data = await response.json();\n if (response.status !== 200) {\n throw new Error(data.message || \"Failed to execute message\");\n }\n\n const mappedData = AgentMapper.mapAgentResultToSnakeCase(data);\n\n return mappedData;\n }\n\n #createExecuteBody(message: string, stream: boolean, options?: MessageOptions): ExecuteBodyParams {\n let body: ExecuteBodyParams = [\n {\n Key: \"chatId\",\n Value: this.conversationId,\n },\n {\n Key: \"message\",\n Value: message,\n },\n {\n Key: \"stream\",\n Value: stream.toString(),\n },\n ];\n\n this.#appendInputParametersIfNeeded(body, options?.inputParameters);\n this.#appendVolatileKnowledgeIdsIfNeeded(body, options?.volatileKnowledgeIds);\n this.#appendUserIdentifierIfNeeded(body);\n this.#appendChannelIfNeeded(body);\n\n return body;\n }\n\n #appendUserIdentifierIfNeeded(body: ExecuteBodyParams) {\n if (this.userIdentifier) {\n body.push({\n Key: \"userIdentifier\",\n Value: this.userIdentifier,\n });\n }\n }\n\n #appendChannelIfNeeded(body: ExecuteBodyParams) {\n if (this.channel) {\n body.push({\n Key: \"channel\",\n Value: this.channel,\n });\n }\n }\n\n #appendInputParametersIfNeeded(body: ExecuteBodyParams, parameters: { [key: string]: any } = {}) {\n if (!parameters || Object.keys(parameters).length === 0) return;\n\n for (const [key, value] of Object.entries(parameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n\n #appendInitConversationParamsIfNeeded(body: InitConversationParams) {\n if (this.userIdentifier) {\n body.userIdentifier = this.userIdentifier;\n }\n\n if (this.inputParameters) {\n body.inputParameters = [];\n this.#appendInputParametersIfNeeded(body.inputParameters, this.inputParameters);\n }\n }\n\n #appendVolatileKnowledgeIdsIfNeeded(body: ExecuteBodyParams, volatileKnowledgeIds?: string[]) {\n if (!volatileKnowledgeIds || volatileKnowledgeIds.length === 0) return;\n\n body.push({\n Key: \"volatileKnowledgeIds\",\n Value: volatileKnowledgeIds,\n });\n }\n}\n","import { AgentExecutionOptions } from \"../../types\";\nimport { ConversationalAgentExecutionOptionsMap } from \"../../types\";\nimport { Conversation } from \"./Conversation\";\nimport { RealtimeSession } from \"./RealtimeSession\";\n\nexport abstract class ConversationalAgent<\n T extends keyof ConversationalAgentExecutionOptionsMap,\n> {\n protected constructor(\n protected readonly agentCode: string,\n protected readonly apiKey: string,\n protected readonly baseUrl: string,\n protected readonly options?: ConversationalAgentExecutionOptionsMap[T]\n ) {}\n\n createRealtimeSession(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ): RealtimeSession {\n return new RealtimeSession(agentCode, apiKey, baseUrl, options);\n }\n\n async createConversation(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ): Promise<Conversation> {\n return await Conversation[\"create\"](agentCode, apiKey, baseUrl, options);\n }\n}\n","import { ConversationalAgentExecutionOptionsMap } from \"../../types\";\nimport { ConversationalAgent } from \"./ConversationalAgent\";\n\nexport class Assistant extends ConversationalAgent<\"assistant\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n \n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ): Assistant {\n return new Assistant(agentCode, apiKey, baseUrl, options);\n }\n}\n","import { AgentExecutionOptions } from \"../../types\";\nimport { ConversationalAgentExecutionOptionsMap } from \"../../types\";\nimport { ConversationalAgent } from \"./ConversationalAgent\";\n\nexport class Copilot extends ConversationalAgent<\"copilot\"> {\n constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: ConversationalAgentExecutionOptionsMap[\"copilot\"]\n ): Copilot {\n return new Copilot(agentCode, apiKey, baseUrl, options);\n }\n}\n","import { EventEmitter } from \"../../EventEmitter\";\nimport { AgentResult, ExecuteBodyParams, SSEStreamEvents } from \"../../types\";\nimport { AgentMapper } from \"../../utils/AgentMapper\";\nimport { SseConnection } from \"../conversational/Conversation/SseConnection\";\nimport { SystemAgentExecutionOptionsMap } from \"./../../types\";\n\nexport abstract class SystemAgent<T extends keyof SystemAgentExecutionOptionsMap> extends EventEmitter<SSEStreamEvents> {\n protected constructor(\n protected readonly agentCode: string,\n protected readonly apiKey: string,\n protected readonly baseUrl: string,\n protected readonly options?: SystemAgentExecutionOptionsMap[T]\n ) {\n super();\n }\n\n async stream(): Promise<AgentResult> {\n const version = this.options?.agentVersion ? `/${this.options.agentVersion}` : \"\";\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n\n let body = this.createExecuteBody(true);\n\n const connection = new SseConnection();\n let responsePromise: Promise<AgentResult>;\n\n responsePromise = new Promise((resolve, reject) => {\n connection.on(\"start\", () => {\n this.emit(\"start\");\n });\n\n connection.on(\"error\", (data) => {\n const error = JSON.parse(data);\n this.emit(\"error\", error);\n reject(error);\n });\n\n connection.on(\"content\", (data) => {\n const chunk = JSON.parse(data);\n this.emit(\"content\", chunk.text);\n });\n\n connection.on(\"stop\", (data) => {\n const finalMessage = JSON.parse(data) as { result: AgentResult };\n this.emit(\"stop\", finalMessage.result);\n resolve(finalMessage.result);\n });\n });\n\n const fetchOptions: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n };\n\n connection.start(url, fetchOptions).catch((error) => {\n this.emit(\"error\", { message: error.message });\n throw error;\n });\n\n return responsePromise;\n }\n\n protected async execute(): Promise<AgentResult> {\n const version = this.options?.agentVersion ? `/${this.options.agentVersion}` : \"\";\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n\n let body = this.createExecuteBody(false);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (response.status === 429) {\n const retryAfter = parseInt(response.headers.get(\"Retry-After\") || \"60\");\n throw new Error(`Rate limit exceeded. Retry after ${retryAfter} seconds`);\n }\n\n const data = await response.json();\n if (response.status !== 200) {\n throw new Error(data.message || \"Failed to execute message\");\n }\n\n return AgentMapper.mapAgentResultToSnakeCase(data);\n }\n\n protected createExecuteBody(stream: boolean): ExecuteBodyParams | {[key: string]: any} {\n let body: ExecuteBodyParams = [\n {\n Key: \"stream\",\n Value: stream.toString(),\n },\n ];\n \n this.appendVolatileKnowledgeIdsIfNeeded(body);\n this.appendUserIdentifierIfNeeded(body);\n this.appendChannelIfNeeded(body);\n \n return body;\n }\n\n protected appendUserIdentifierIfNeeded(body: ExecuteBodyParams) {\n if (this.options?.userIdentifier) {\n body.push({\n Key: \"userIdentifier\",\n Value: this.options.userIdentifier,\n });\n }\n }\n\n protected appendVolatileKnowledgeIdsIfNeeded(body: ExecuteBodyParams) {\n if (!this.options?.volatileKnowledgeIds || this.options.volatileKnowledgeIds.length === 0) return;\n\n body.push({\n Key: \"volatileKnowledgeIds\",\n Value: this.options.volatileKnowledgeIds,\n });\n }\n\n protected appendChannelIfNeeded(body: ExecuteBodyParams) {\n if (this.options?.channel) {\n body.push({\n Key: \"channel\",\n Value: this.options.channel,\n });\n }\n }\n}\n","import { SystemAgent } from \"./SystemAgent\";\nimport {\n ExecuteBodyParams,\n SystemAgentExecutionOptionsMap,\n} from \"./../../types\";\n\nexport class Activity extends SystemAgent<\"activity\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Activity {\n return new Activity(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ) {\n const instance = new Activity(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(\n stream: boolean\n ): ExecuteBodyParams | { [key: string]: any } {\n const baseOptions = super.createExecuteBody(stream);\n\n this.appendInputParametersIfNeeded(baseOptions);\n\n return baseOptions;\n }\n\n private appendInputParametersIfNeeded(\n body: ExecuteBodyParams | { [key: string]: any }\n ) {\n if (\n !this.options?.inputParameters ||\n Object.keys(this.options.inputParameters).length === 0\n )\n return;\n\n for (const [key, value] of Object.entries(this.options.inputParameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n}\n","import { ExecuteBodyParams } from \"../../types\";\nimport { SystemAgentExecutionOptionsMap } from \"./../../types\";\nimport { SystemAgent } from \"./SystemAgent\";\n\nexport class ChatCompletion extends SystemAgent<\"chat-completion\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): ChatCompletion {\n return new ChatCompletion(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ) {\n const instance = new ChatCompletion(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(stream: boolean): ExecuteBodyParams | { [key: string]: any } {\n const body = super.createExecuteBody(stream);\n\n this.appendMessagesIfNeeded(body);\n this.appendMessageIfNeeded(body);\n this.appendInputParametersIfNeeded(body);\n\n return body;\n }\n\n private appendMessagesIfNeeded(body: ExecuteBodyParams | { [key: string]: any }) {\n if (!this.options?.messages || this.options.messages.length === 0) return;\n\n body.push({\n Key: \"messages\",\n Value: JSON.stringify(this.options.messages),\n });\n }\n\n private appendMessageIfNeeded(body: ExecuteBodyParams | { [key: string]: any }) {\n if (!this.options?.message) return;\n\n body.push({\n Key: \"message\",\n Value: this.options.message,\n });\n }\n\n private appendInputParametersIfNeeded(\n body: ExecuteBodyParams | { [key: string]: any }\n ) {\n if (\n !this.options?.inputParameters ||\n Object.keys(this.options.inputParameters).length === 0\n )\n return;\n\n for (const [key, value] of Object.entries(this.options.inputParameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n}\n","import { SystemAgent } from \"./SystemAgent\";\nimport { ExecuteBodyParams, SystemAgentExecutionOptionsMap } from \"../../types\";\n\nexport class Plan extends SystemAgent<\"plan\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ): Plan {\n return new Plan(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ) {\n const instance = new Plan(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(\n stream: boolean\n ): ExecuteBodyParams | { [key: string]: any } {\n const baseOptions = super.createExecuteBody(stream);\n this.appendInputParametersIfNeeded(baseOptions);\n return baseOptions;\n }\n\n private appendInputParametersIfNeeded(\n body: ExecuteBodyParams | { [key: string]: any }\n ) {\n if (\n !this.options?.inputParameters ||\n Object.keys(this.options.inputParameters).length === 0\n )\n return;\n\n for (const [key, value] of Object.entries(this.options.inputParameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n}\n","import { SystemAgent } from \"./SystemAgent\";\nimport { ExecuteBodyParams, SystemAgentExecutionOptionsMap } from \"../../types\";\nimport { ProxyExecutionOptions } from \"./types\";\n\nexport class Proxy extends SystemAgent<\"proxy\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Proxy {\n return new Proxy(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ) {\n const instance = new Proxy(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(stream: boolean): ExecuteBodyParams | { [key: string]: any } {\n const options = this.options as ProxyExecutionOptions;\n \n return {\n model: options.model,\n messages: options.messages,\n frequency_penalty: options.frequency_penalty,\n max_tokens: options.max_tokens,\n presence_penalty: options.presence_penalty,\n temperature: options.temperature,\n top_p: options.top_p,\n top_k: options.top_k,\n vendor: options.vendor,\n userIdentifier: options.userIdentifier,\n groupIdentifier: options.groupIdentifier,\n useVision: options.useVision,\n stream: stream,\n }\n }\n}\n","import { Assistant } from \"../scopes/conversational/Assistant\";\nimport { Conversation } from \"../scopes/conversational/Conversation\";\nimport { Copilot } from \"../scopes/conversational/Copilot\";\nimport { RealtimeSession } from \"../scopes/conversational/RealtimeSession\";\nimport { Activity } from \"../scopes/system/Activity\";\nimport { ChatCompletion } from \"../scopes/system/ChatCompletion\";\nimport { Plan } from \"../scopes/system/Plan\";\nimport { Proxy } from \"../scopes/system/Proxy\";\nimport {\n AgentResult,\n AgentType,\n ConversationalAgentExecutionOptionsMap,\n SystemAgentExecutionOptionsMap,\n} from \"../types\";\n\nexport class AgentFactory {\n static createAgent<T extends AgentType>(\n type: T,\n apiKey: string,\n baseUrl: string\n ): AgentTypeMap[T] {\n switch (type) {\n case \"assistant\": {\n return {\n createConversation: async (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ) => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n const conversation = await assistant.createConversation(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n\n return conversation;\n },\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ) => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n return assistant.createRealtimeSession(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n }\n case \"copilot\":\n return {\n createConversation: async (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"copilot\"]\n ): Promise<Conversation> => {\n const copilot = Copilot.create(agentCode, apiKey, baseUrl, options);\n const conversation = await copilot.createConversation(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n return conversation;\n },\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"copilot\"]\n ) => {\n const copilot = Copilot.create(agentCode, apiKey, baseUrl, options);\n return copilot.createRealtimeSession(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n\n case \"activity\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Promise<AgentResult> => {\n return Activity[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Activity => {\n return Activity[\"create\"](agentCode, apiKey, baseUrl, options);\n },\n } as AgentTypeMap[T];\n }\n case \"chat-completion\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): Promise<AgentResult> => {\n return ChatCompletion[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): ChatCompletion => {\n return ChatCompletion[\"create\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n }\n case \"proxy\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Promise<AgentResult> => {\n return Proxy[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Proxy => {\n return Proxy[\"create\"](agentCode, apiKey, baseUrl, options);\n },\n } as AgentTypeMap[T];\n }\n case \"plan\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ): Promise<AgentResult> => {\n return Plan[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ): Plan => {\n return Plan[\"create\"](agentCode, apiKey, baseUrl, options);\n }\n } as AgentTypeMap[T];\n }\n default:\n throw new Error(`Agent type ${type} not supported`);\n }\n }\n}\n\nexport type ConversationalAgentScope<\n T extends keyof ConversationalAgentExecutionOptionsMap,\n> = {\n /**\n * Create a new conversation with an agent.\n * This allows you to send messages and receive responses.\n * \n * ## Regular conversation example:\n * ```typescript\n * const conversation = await client.agents.assistants.createConversation(\"agent-code\");\n * const response = await conversation.sendMessage(\"Hello!\");\n * console.log(response.content);\n * ```\n * \n * ## Streaming conversation example:\n * ```typescript\n * const conversation = await client.agents.assistants\n * .createConversation(\"agent-code\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"Hello!\");\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the conversation\n * @returns A Promise that resolves to a Conversation instance\n */\n createConversation: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[T]\n ) => Promise<Conversation>;\n\n /**\n * Create a real-time session with an agent.\n * This allows for voice interactions and real-time responses.\n * \n * ## Real-time session example:\n * ```typescript\n * const session = client.agents.assistants\n * .createRealtimeSession(\"agent-code\")\n * .on(\"session.created\", () => console.log(\"Session started\"))\n * .on(\"speech.started\", () => console.log(\"User started talking\"))\n * .on(\"speech.stopped\", () => console.log(\"User stopped talking\"))\n * .on(\"response.done\", (response) => console.log(\"Response:\", response))\n * .on(\"session.stopped\", () => console.log(\"Session stopped\"));\n * \n * await session.start();\n * // Later: session.stop();\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the real-time session\n * @returns A RealtimeSession instance\n */\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[T]\n ) => RealtimeSession;\n};\n\nexport type SystemAgentScope<\n T extends keyof SystemAgentExecutionOptionsMap,\n TCreateReturn,\n> = {\n /**\n * Execute an agent synchronously and get the result.\n * \n * ## Example:\n * ```typescript\n * const response = await client.agents.activities.execute(\"agent-code\", {\n * // Optional parameters specific to the agent type\n * inputParameters: {\n * param1: \"value1\",\n * param2: \"value2\"\n * }\n * });\n * console.log(response.content);\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the execution\n * @returns A Promise that resolves to an AgentResult\n */\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[T]\n ) => Promise<AgentResult>;\n\n /**\n * Create an agent instance for streaming execution.\n * \n * ## Streaming example:\n * ```typescript\n * const agent = client.agents.activities\n * .create(\"agent-code\", {\n * // Optional parameters specific to the agent\n * inputParameters: {\n * param1: \"value1\",\n * param2: \"value2\"\n * }\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await agent.stream();\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the agent creation\n * @returns An agent instance ready for streaming\n */\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[T]\n ) => TCreateReturn;\n};\n\ntype AgentTypeMap = {\n assistant: ConversationalAgentScope<\"assistant\">;\n copilot: ConversationalAgentScope<\"copilot\">;\n activity: SystemAgentScope<\"activity\", Activity>;\n \"chat-completion\": SystemAgentScope<\"chat-completion\", ChatCompletion>;\n proxy: SystemAgentScope<\"proxy\", Proxy>;\n plan: SystemAgentScope<\"plan\", Plan>;\n};\n","import {\n AgentFactory,\n ConversationalAgentScope,\n SystemAgentScope,\n} from \"./factories/AgentFactory\";\nimport { Activity } from \"./scopes/system/Activity\";\nimport { ChatCompletion } from \"./scopes/system/ChatCompletion\";\nimport { Plan } from \"./scopes/system/Plan\";\nimport { Proxy } from \"./scopes/system/Proxy\";\nimport { SerenityClientOptions } from \"./types\";\n\nexport default class SerenityClient {\n private apiKey: string;\n private baseUrl = \"https://api.serenitystar.ai/api\";\n\n /**\n * Interact with the different agents available in Serenity Star.\n * You can choose between assistants, copilots, activities, chat completions, proxies, and plans.\n */\n public readonly agents: {\n /**\n * Interact with Assistant agents available in Serenity Star.\n * This allows you to create conversations and real-time sessions.\n * \n * ## Start a new conversation and send a message:\n * ```typescript\n * // Regular text conversation\n * const conversation = await client.agents.assistants.createConversation(\"translator-assistant\");\n * const response = await conversation.sendMessage(\"The sun was beginning to set...\");\n * console.log(response.content);\n * \n * ```\n * \n * ## Stream message with SSE\n * ```typescript\n * const conversation = await client.agents.assistants\n * .createConversation(\"translator-assistant\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"The sun was beginning to set...\");\n * \n * ```\n * \n * ## Real-time voice conversation example:\n * ```typescript\n * const session = client.agents.assistants.createRealtimeSession(\"marketing-assistant\")\n * .on(\"session.created\", () => console.log(\"Session started\"))\n * .on(\"speech.started\", () => console.log(\"User started talking\"))\n * .on(\"speech.stopped\", () => console.log(\"User stopped talking\"))\n * .on(\"response.done\", (response) => console.log(\"Response:\", response))\n * .on(\"session.stopped\", () => console.log(\"Session stopped\"));\n * \n * await session.start();\n * // Later: session.stop();\n * ```\n */\n assistants: ConversationalAgentScope<\"assistant\">;\n\n /**\n * Interact with Copilot agents available in Serenity Star.\n * Similar to assistants but allows you to interact with the UI through callbacks.\n * \n * Text conversation example:\n * ```typescript\n * // Regular conversation\n * const conversation = await client.agents.copilots.createConversation(\"app-copilot\");\n * const response = await conversation.sendMessage(\"How do I create a new support ticket?\");\n * console.log(response.content);\n * \n * // Streaming conversation\n * const conversation = await client.agents.copilots\n * .createConversation(\"app-copilot\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"How do I create a new support ticket?\");\n * ```\n */\n copilots: ConversationalAgentScope<\"copilot\">;\n\n /**\n * Interact with Activity agents available in Serenity Star.\n * This allows you to execute activities.\n * It supports streaming.\n * Execute simple tasks based on the user input.\n * \n * ## Regular activity execution:\n * ```typescript\n * const response = await client.agents.activities.execute(\"marketing-campaign\")\n * console.log(response.content);\n * \n * // With parameters\n * const response = await client.agents.activities.execute(\"cooking-activity\", {\n * inputParameters: {\n * ingredientOne: \"chicken\",\n * ingredientTwo: \"onion\",\n * ingredientThree: \"cream\",\n * }\n * });\n * ```\n * \n * ## Stream activity with SSE:\n * ```typescript\n * const activity = client.agents.activities\n * .create(\"marketing-campaign\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await activity.stream();\n * ```\n */\n activities: SystemAgentScope<\"activity\", Activity>;\n\n /**\n * Interact with Chat Completion agents available in Serenity Star.\n * This allows you to execute chat completions.\n * It supports streaming.\n * Chat completions allows you to fully control the conversation and generate completions.\n * \n * ## Regular chat completion:\n * ```typescript\n * const response = await client.agents.chatCompletions.execute(\"Health-Coach\", {\n * message: \"Hello!\"\n * });\n * console.log(response.content);\n * ```\n * \n * ## Stream chat completion with SSE:\n * ```typescript\n * const chatCompletion = client.agents.chatCompletions\n * .create(\"Health-Coach\", {\n * message: \"Hello!\"\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await chatCompletion.stream();\n * ```\n */\n chatCompletions: SystemAgentScope<\"chat-completion\", ChatCompletion>;\n\n /**\n * Interact with Proxy agents available in Serenity Star.\n * This allows you to execute proxies.\n * It supports streaming.\n * Proxy agents allows you to define a set of parameters dynamically for each request\n * \n * ## Regular proxy execution:\n * ```typescript\n * const response = await client.agents.proxies.execute(\"proxy-agent\", {\n * model: \"gpt-4o-mini-2024-07-18\",\n * messages: [\n * {\n * role: \"system\",\n * content: \"You are a helpful assistant. Always use short and concise responses\"\n * },\n * { role: \"user\", content: \"What is artificial intelligence?\" }\n * ],\n * temperature: 1,\n * max_tokens: 250\n * });\n * console.log(response.content);\n * ```\n * \n * ## Stream proxy with SSE:\n * ```typescript\n * const proxy = client.agents.proxies\n * .create(\"proxy-agent\", {\n * model: \"gpt-4o-mini-2024-07-18\",\n * messages: [\n * {\n * role: \"system\",\n * content: \"You are a helpful assistant. Always use short and concise responses\"\n * },\n * { role: \"user\", content: \"What is artificial intelligence?\" }\n * ],\n * temperature: 1,\n * max_tokens: 250\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await proxy.stream();\n * ```\n */\n proxies: SystemAgentScope<\"proxy\", Proxy>;\n\n /**\n * Interact with Plan agents available in Serenity Star.\n * This allows you to execute plans.\n * It supports streaming.\n * Plan agents are capable of building an execution plan based on the user input and execute it.\n * \n * ## Regular plan execution:\n * ```typescript\n * const response = await client.agents.plans.execute(\"event-planner\");\n * console.log(response.content);\n * ```\n * \n * ## Stream plan with SSE:\n * ```typescript\n * const plan = client.agents.plans\n * .create(\"event-planner\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await plan.stream();\n * ```\n */\n plans: SystemAgentScope<\"plan\", Plan>;\n };\n\n constructor(options: SerenityClientOptions) {\n if (!options.apiKey) {\n throw new Error(\"The API key is required\");\n }\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl || this.baseUrl;\n\n this.agents = {\n assistants: AgentFactory.createAgent(\n \"assistant\",\n this.apiKey,\n this.baseUrl\n ),\n copilots: AgentFactory.createAgent(\"copilot\", this.apiKey, this.baseUrl),\n activities: AgentFactory.createAgent(\n \"activity\",\n this.apiKey,\n this.baseUrl\n ),\n chatCompletions: AgentFactory.createAgent(\n \"chat-completion\",\n this.apiKey,\n this.baseUrl\n ),\n proxies: AgentFactory.createAgent(\"proxy\", this.apiKey, this.baseUrl),\n plans: AgentFactory.createAgent(\"plan\", this.apiKey, this.baseUrl),\n };\n }\n}\n"],"mappings":"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","names":["index_exports","__export","RealtimeSession","SerenityClient","__toCommonJS","undiciFetch","UndiciHeaders","UndiciRequest","UndiciResponse","_a","undici","EventEmitter","eventName","listener","args","_a","_RealtimeSession_instances","stop_fn","setupWebSocketConnection_fn","handleIncomingMessagesFromSerenity_fn","handleIncomingMessagesFromVendor_fn","setupWebRTCConnection_fn","getAudioFromMicrophone_fn","startSession_fn","resetInactivityTimeout_fn","extractErrorMessageFromEvent_fn","RealtimeSession","EventEmitter","agentCode","apiKey","baseUrl","options","__privateAdd","__async","__privateMethod","error","audioTrack","reason","details","track","url","sessionCreateEvent","event","data","obj","eventData","errorDetails","isSerenityEvent","currentDate","channelName","e","audioElement","offer","sdpResponse","answer","SseConnection","_","url","fetchOptions","__async","response","reader","decoder","done","value","error","eventEnd","lineEnding","eventDelimiter","eventText","lines","event","line","eventType","callback","listeners","cb","data","AgentMapper","data","_Conversation_instances","getConversationId_fn","createExecuteBody_fn","appendUserIdentifierIfNeeded_fn","appendChannelIfNeeded_fn","appendInputParametersIfNeeded_fn","appendInitConversationParamsIfNeeded_fn","appendVolatileKnowledgeIdsIfNeeded_fn","_Conversation","EventEmitter","agentCode","apiKey","baseUrl","options","__privateAdd","__async","_a","instance","__privateMethod","message","version","url","body","connection","SseConnection","responsePromise","resolve","reject","data","error","chunk","finalMessage","fetchOptions","response","retryAfter","AgentMapper","reqBody","stream","parameters","key","value","volatileKnowledgeIds","Conversation","ConversationalAgent","agentCode","apiKey","baseUrl","options","RealtimeSession","__async","Conversation","Assistant","_Assistant","ConversationalAgent","agentCode","apiKey","baseUrl","options","Copilot","_Copilot","ConversationalAgent","agentCode","apiKey","baseUrl","options","SystemAgent","EventEmitter","agentCode","apiKey","baseUrl","options","__async","_a","version","url","body","connection","SseConnection","responsePromise","resolve","reject","data","error","chunk","finalMessage","fetchOptions","response","retryAfter","AgentMapper","stream","Activity","_Activity","SystemAgent","agentCode","apiKey","baseUrl","options","stream","baseOptions","body","_a","key","value","ChatCompletion","_ChatCompletion","SystemAgent","agentCode","apiKey","baseUrl","options","stream","body","_a","key","value","Plan","_Plan","SystemAgent","agentCode","apiKey","baseUrl","options","stream","baseOptions","body","_a","key","value","Proxy","_Proxy","SystemAgent","agentCode","apiKey","baseUrl","options","stream","AgentFactory","type","apiKey","baseUrl","agentCode","options","__async","Assistant","Copilot","Activity","ChatCompletion","Proxy","Plan","SerenityClient","options","AgentFactory"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/polyfill.ts","../src/EventEmitter.ts","../src/scopes/conversational/RealtimeSession/index.ts","../src/scopes/conversational/Conversation/SseConnection.ts","../src/utils/AgentMapper.ts","../src/scopes/conversational/Conversation/index.ts","../src/scopes/conversational/ConversationalAgent.ts","../src/scopes/conversational/Assistant.ts","../src/scopes/conversational/Copilot.ts","../src/scopes/system/SystemAgent.ts","../src/scopes/system/Activity.ts","../src/scopes/system/ChatCompletion.ts","../src/scopes/system/Plan.ts","../src/scopes/system/Proxy.ts","../src/factories/AgentFactory.ts","../src/SerenityClient.ts"],"sourcesContent":["import \"./polyfill\";\nimport { RealtimeSession } from \"./scopes/conversational/RealtimeSession\";\nimport SerenityClient from \"./SerenityClient\";\nimport { AgentResult } from \"./types\";\n\nexport { SerenityClient, RealtimeSession };\n\nexport type { AgentResult };\n","let undiciFetch, UndiciHeaders, UndiciRequest, UndiciResponse;\n\nif (typeof process !== 'undefined' && process.versions?.node) {\n // Only import undici in Node.js environment\n const undici = require('undici');\n undiciFetch = undici.fetch;\n UndiciHeaders = undici.Headers;\n UndiciRequest = undici.Request;\n UndiciResponse = undici.Response;\n\n if (!globalThis.fetch) {\n globalThis.fetch = undiciFetch as unknown as typeof globalThis.fetch;\n globalThis.Headers = UndiciHeaders as unknown as typeof globalThis.Headers;\n globalThis.Request = UndiciRequest as unknown as typeof globalThis.Request;\n globalThis.Response = UndiciResponse as unknown as typeof globalThis.Response;\n }\n}\n\nexport {\n undiciFetch as fetch,\n UndiciHeaders as Headers,\n UndiciRequest as Request,\n UndiciResponse as Response\n};\n","export class EventEmitter<T extends Record<string, (...args: any[]) => void>> {\n private listeners: { [K in keyof T]?: Array<T[K]> } = {};\n\n on<K extends keyof T>(eventName: K, listener: T[K]): this {\n if (!this.listeners[eventName]) {\n this.listeners[eventName] = [];\n }\n this.listeners[eventName]!.push(listener);\n return this;\n }\n\n emit<K extends keyof T>(eventName: K, ...args: Parameters<T[K]>): void {\n this.listeners[eventName]?.forEach((listener) => listener(...args));\n }\n}","import { EventEmitter } from \"../../../EventEmitter\";\nimport {\n AgentExecutionOptions,\n AgentExecutionOptionsWithParameters,\n} from \"../../../types\";\nimport {\n RealtimeSessionEvents,\n SerenitySessionCreateEvent,\n SerenityEvent,\n SerenitySessionCreatedEvent,\n SerenitySessionCloseEvent,\n SerenitySessionErrorEvent,\n SDPConfiguration,\n SerenityResponseProcessedEvent,\n} from \"./types\";\n\nexport class RealtimeSession extends EventEmitter<RealtimeSessionEvents> {\n private agentCode: string;\n private apiKey: string;\n private baseUrl: string;\n\n // Optional parameters.\n private inputParameters?: { [key: string]: any };\n private userIdentifier?: string;\n private agentVersion?: number;\n private channel?: string;\n\n private inactivityTimeout?: NodeJS.Timeout;\n private timeout = 120000; // 2 minutes\n\n // WebRTC configuration.\n private sessionConfiguration?: SDPConfiguration;\n private peerConnection?: RTCPeerConnection;\n private localStream?: MediaStream;\n private dataChannel?: RTCDataChannel;\n\n // WebSockets configuration.\n private socket?: WebSocket;\n\n constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptionsWithParameters\n ) {\n super();\n this.apiKey = apiKey;\n this.agentCode = agentCode;\n this.baseUrl = baseUrl;\n\n this.agentVersion = options?.agentVersion;\n this.inputParameters = options?.inputParameters;\n this.userIdentifier = options?.userIdentifier;\n this.channel = options?.channel;\n }\n\n // #region Public methods\n\n /**\n * Starts the real-time session.\n */\n async start(): Promise<void> {\n try {\n this.#setupWebSocketConnection();\n } catch (error) {\n throw new Error(`Error starting the session`);\n }\n }\n\n /**\n * Stops the real-time session.\n */\n stop(): void {\n this.#stop();\n }\n\n /**\n * Allows the user to mute the microphone during a real-time voice session.\n */\n muteMicrophone(): void {\n if (this.localStream) {\n const audioTrack = this.localStream.getAudioTracks()[0];\n if (audioTrack) {\n audioTrack.enabled = false;\n }\n }\n }\n\n /**\n * Allows the user to unmute the microphone during a real-time voice session.\n */\n unmuteMicrophone(): void {\n if (this.localStream) {\n const audioTrack = this.localStream.getAudioTracks()[0];\n if (audioTrack) {\n audioTrack.enabled = true;\n }\n }\n }\n // #endregion\n\n // #region Private methods\n\n /**\n * Internal method to stop the session. Allows for a reason and details to be provided.\n * @param reason The reason for stopping the session.\n * @param details Additional details about the stop event.\n */\n #stop(reason?: string, details?: any): void {\n // Send a closure message to the server if socket is connected\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n try {\n // Close the WebSocket connection properly\n this.socket.close(1000, \"Client closed the session\");\n } catch (error) {\n console.error(\"Error closing WebSocket connection:\", error);\n }\n }\n \n // Stop the local audio tracks.\n if (this.localStream) {\n this.localStream.getTracks().forEach((track) => track.stop());\n this.localStream = undefined;\n }\n \n // Close the WebRTC connection if it is open.\n this.peerConnection && this.peerConnection.close();\n \n // Reset variables\n this.socket = undefined;\n this.dataChannel = undefined;\n this.peerConnection = undefined;\n\n this.emit(\"session.stopped\", reason, details);\n clearTimeout(this.inactivityTimeout);\n }\n\n #setupWebSocketConnection() {\n let url = `${this.baseUrl}/v2/agent/${this.agentCode}/realtime`;\n\n if (this.agentVersion) {\n url += `/${this.agentVersion}`;\n }\n\n this.socket = new WebSocket(url, [\"X-API-KEY\", this.apiKey]);\n\n this.socket.onopen = () => {\n const sessionCreateEvent: SerenitySessionCreateEvent = {\n type: \"serenity.session.create\",\n input_parameters: this.inputParameters,\n user_identifier: this.userIdentifier,\n channel: this.channel,\n };\n\n this.socket!.send(JSON.stringify(sessionCreateEvent));\n };\n\n this.socket.onclose = () => {\n this.#stop();\n };\n\n this.socket.onerror = (event) => {\n this.emit(\"error\", \"Error connecting to the server\");\n this.#stop();\n };\n\n this.socket.onmessage = (event) => {\n this.#handleIncomingMessagesFromSerenity(event.data);\n };\n }\n\n async #handleIncomingMessagesFromSerenity(data: string) {\n const obj = JSON.parse(data) as SerenityEvent;\n switch (obj.type) {\n case \"serenity.session.created\": {\n const eventData = obj as SerenitySessionCreatedEvent;\n this.sessionConfiguration = {\n url: eventData.url,\n headers: eventData.headers,\n };\n\n // Setup the WebRTC connection.\n this.#setupWebRTCConnection();\n\n // Add listeners for the WebRTC connection.\n this.#handleIncomingMessagesFromVendor();\n\n // Start the session.\n await this.#startSession();\n\n break;\n }\n case \"serenity.session.close\": {\n const eventData = obj as SerenitySessionCloseEvent;\n const errorDetails = this.#extractErrorMessageFromEvent(eventData);\n this.emit(\"error\", errorDetails);\n this.#stop(eventData.reason, errorDetails);\n break;\n }\n case \"serenity.response.processed\": {\n const eventData = obj as SerenityResponseProcessedEvent;\n this.emit(\"response.processed\", eventData.result);\n break;\n }\n default: {\n const isSerenityEvent = obj.type.startsWith(\"serenity\");\n if (this.dataChannel && !isSerenityEvent) {\n this.dataChannel.send(JSON.stringify(obj));\n }\n }\n }\n }\n\n #handleIncomingMessagesFromVendor() {\n if (!this.peerConnection) {\n throw new Error(\n `Could not add listeners: WebRTC connection not initialized`\n );\n }\n // Set up data channel for sending and receiving events\n const currentDate = new Date()\n .toISOString()\n .replace(/T/, \"-\")\n .replace(/:/g, \"-\")\n .replace(/\\..+/, \"\");\n const channelName = `data-channel-${this.agentCode}-${currentDate}`;\n this.dataChannel = this.peerConnection.createDataChannel(channelName);\n\n this.dataChannel.addEventListener(\"message\", (e: MessageEvent) => {\n this.#resetInactivityTimeout();\n const data = JSON.parse(e.data);\n\n try {\n switch (data.type) {\n case \"input_audio_buffer.speech_started\": {\n this.emit(\"speech.started\");\n break;\n }\n case \"input_audio_buffer.speech_stopped\": {\n this.emit(\"speech.stopped\");\n break;\n }\n\n case \"response.done\": {\n this.emit(\"response.done\");\n break;\n }\n case \"error\": {\n this.emit(\"error\", \"There was an error processing your request\");\n break;\n }\n }\n } catch (error) {\n this.emit(\"error\", \"Error processing incoming messages from vendor\");\n } finally {\n // Forward the message to the server\n if (this.socket) {\n this.socket.send(JSON.stringify(data));\n }\n }\n });\n }\n\n #setupWebRTCConnection() {\n // Create the peer connection.\n this.peerConnection = new RTCPeerConnection();\n\n // Configure remote audio playback.\n const audioElement = document.createElement(\"audio\");\n audioElement.autoplay = true;\n\n this.peerConnection.ontrack = (event) => {\n if (event.streams && event.streams[0]) {\n audioElement.srcObject = event.streams[0];\n }\n };\n }\n\n async #getAudioFromMicrophone(): Promise<void> {\n if (!this.peerConnection) {\n throw new Error(\n `Could not start the session: WebRTC connection not initialized`\n );\n }\n\n this.localStream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n\n const audioTrack = this.localStream.getTracks()[0];\n this.peerConnection.addTrack(audioTrack, this.localStream);\n }\n\n async #startSession() {\n if (!this.peerConnection) {\n throw new Error(\n `Could not start the session: WebRTC connection not initialized`\n );\n }\n\n if (!this.sessionConfiguration) {\n throw new Error(\n `Could not start the session: Session configuration not available`\n );\n }\n\n try {\n // Get the audio from the microphone.\n await this.#getAudioFromMicrophone();\n\n // Start the session using the Session Description Protocol (SDP)\n const offer = await this.peerConnection.createOffer();\n await this.peerConnection.setLocalDescription(offer);\n\n const sdpResponse = await fetch(`${this.sessionConfiguration.url}`, {\n method: \"POST\",\n body: offer.sdp,\n headers: this.sessionConfiguration.headers,\n });\n\n if (!sdpResponse.ok) {\n throw new Error(\"Error starting the session\");\n }\n\n const answer: RTCSessionDescriptionInit = {\n type: \"answer\",\n sdp: await sdpResponse.text(),\n };\n\n await this.peerConnection.setRemoteDescription(answer);\n\n this.emit(\"session.created\");\n this.#resetInactivityTimeout();\n } catch (error) {\n this.emit(\"error\", \"Error starting the session\");\n this.#stop();\n }\n }\n\n #resetInactivityTimeout() {\n clearTimeout(this.inactivityTimeout);\n this.inactivityTimeout = setTimeout(() => {\n this.#stop();\n }, this.timeout);\n }\n\n #extractErrorMessageFromEvent(eventData: SerenitySessionErrorEvent) {\n switch (eventData.reason) {\n case \"Exception\":\n return eventData.message;\n case \"ValidationException\": {\n if (!eventData.errors) return eventData.message;\n\n return Object.values(eventData.errors).join(\". \");\n }\n default:\n return eventData.message;\n }\n }\n // #endregion\n}\n","/**\n * Interface representing the structure of event data.\n */\ninterface SseEventData {\n start_time_utc?: string;\n stop_time_utc?: string;\n message?: string;\n}\n\n/**\n * Interface representing the event object with optional event and data properties.\n */\ninterface Event {\n event?: string;\n data?: string;\n}\n\n/**\n * Type for the event listeners.\n */\ntype ConnectionEventListener = (data: string) => void;\n\n/**\n * Class representing a server-sent events (SSE) connection.\n */\nexport class SseConnection {\n private eventListeners: Record<string, ConnectionEventListener[]>;\n private active: boolean;\n private buffer: string = \"\";\n\n /**\n * Creates an instance of SseConnection.\n * @param options - Options for the SSE connection.\n */\n constructor() {\n this.eventListeners = {\n start: [\n (_: string) => {\n },\n ],\n stop: [\n (_: string) => {\n this.stop();\n },\n ],\n error: [\n (_: string) => {\n this.stop();\n },\n ],\n };\n this.active = false;\n }\n\n /**\n * Connects to the SSE server and listens for events.\n * @param url - The URL to connect to for SSE.\n * @param fetchOptions - Additional fetch options.\n * @returns A promise that resolves with the response when the connection is active.\n * @throws Will throw an error if the response is not an event stream.\n */\n async start(\n url: string,\n fetchOptions: RequestInit\n ): Promise<Response> {\n this.active = true;\n try {\n const response = await fetch(url, fetchOptions);\n\n if(!response.ok) {\n throw response;\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n\n if (contentType !== \"text/event-stream\") {\n return response;\n }\n\n const reader = response.body!.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n this.buffer = \"\";\n\n while (this.active) {\n const { done, value } = await reader.read();\n if (done) break;\n\n this.buffer += decoder.decode(value, { stream: true });\n this.processEvents();\n }\n\n return response;\n } catch (error) {\n this.active = false;\n throw error;\n }\n }\n\n /**\n * Processes the event data from the buffer.\n */\n private processEvents(): void {\n let eventEnd: number;\n const lineEnding = this.buffer.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const eventDelimiter = lineEnding + lineEnding;\n while ((eventEnd = this.buffer.indexOf(eventDelimiter)) !== -1) {\n const eventText = this.buffer.slice(0, eventEnd).trim();\n this.buffer = this.buffer.slice(eventEnd + eventDelimiter.length);\n\n const lines = eventText.split(lineEnding);\n const event: Event = {};\n for (let line of lines) {\n if (line.startsWith(\"data:\")) {\n event.data = line.slice(\"data:\".length).trim();\n } else if (line.startsWith(\"event:\")) {\n event.event = line.slice(\"event:\".length).trim();\n }\n }\n\n this.trigger(event.event || \"message\", event.data!);\n }\n }\n\n /**\n * Registers an event listener for a specific event type.\n * @param eventType - The type of event to listen for.\n * @param callback - The callback function to execute when the event occurs.\n */\n on(eventType: string, callback: ConnectionEventListener): void {\n if (!this.eventListeners[eventType]) {\n this.eventListeners[eventType] = [];\n }\n this.eventListeners[eventType].push(callback);\n }\n\n /**\n * Unregisters an event listener for a specific event type.\n * @param eventType - The type of event to stop listening for.\n * @param callback - The callback function to remove.\n */\n off(eventType: string, callback: ConnectionEventListener): void {\n const listeners = this.eventListeners[eventType];\n if (listeners) {\n this.eventListeners[eventType] = listeners.filter(\n (cb) => cb !== callback\n );\n }\n }\n\n /**\n * Triggers an event and calls all registered listeners for that event type.\n * @param eventType - The type of event to trigger.\n * @param data - The data to pass to the event listeners.\n */\n private trigger(eventType: string, data: string): void {\n const listeners = this.eventListeners[eventType];\n if (listeners) {\n listeners.forEach((callback) => callback(data));\n }\n }\n\n /**\n * Stops the SSE connection.\n */\n stop(): void {\n this.active = false;\n }\n}\n","import { AgentResult } from \"../types\";\n\nexport class AgentMapper {\n public static mapAgentResultToSnakeCase = (data: {\n [key: string]: any;\n }): AgentResult => {\n const result: AgentResult = {\n content: data.content,\n instance_id: data.instanceId,\n action_results: data.actionResults,\n completion_usage: data.completionUsage,\n executor_task_logs: data.executorTaskLogs,\n json_content: data.jsonContent,\n meta_analysis: data.metaAnalysis,\n time_to_first_token: data.timeToFirstToken,\n };\n\n return result;\n };\n}\n","import { EventEmitter } from \"../../../EventEmitter\";\nimport { AgentExecutionOptions, AgentExecutionOptionsWithParameters, AgentResult, ExecuteBodyParams, SSEStreamEvents } from \"../../../types\";\nimport { InitConversationParams, InitConversationResponse, MessageOptions } from \"./types\";\nimport { SseConnection } from \"./SseConnection\";\nimport { AgentMapper } from \"../../../utils/AgentMapper\";\n\nexport class Conversation extends EventEmitter<SSEStreamEvents> {\n private agentCode: string;\n private apiKey: string;\n private baseUrl: string;\n\n // Optional parameters.\n private inputParameters?: { [key: string]: any };\n private userIdentifier?: string;\n private agentVersion?: number;\n private channel?: string;\n\n public conversationId?: string;\n\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptionsWithParameters\n ) {\n super();\n this.apiKey = apiKey;\n this.agentCode = agentCode;\n this.baseUrl = baseUrl;\n\n this.agentVersion = options?.agentVersion;\n this.inputParameters = options?.inputParameters;\n this.userIdentifier = options?.userIdentifier;\n this.channel = options?.channel;\n }\n\n private static async create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ): Promise<Conversation> {\n const instance = new Conversation(agentCode, apiKey, baseUrl, options);\n await instance.#getConversationId();\n return instance;\n }\n\n async #getConversationId(): Promise<void> {\n if (this.conversationId) return;\n\n const version = this.agentVersion ? `/${this.agentVersion}` : '';\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/conversation${version}`;\n let reqBody: InitConversationParams = {};\n\n this.#appendInitConversationParamsIfNeeded(reqBody);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(reqBody),\n });\n\n if (response.status === 429) {\n const retryAfter = parseInt(response.headers.get(\"Retry-After\") || \"60\");\n throw new Error(`Rate limit exceeded. Retry after ${retryAfter} seconds`);\n }\n\n const body = await response.json();\n\n if (response.status !== 200) {\n throw new Error(body.message || \"Failed to initialize conversation\");\n }\n\n const data = body as InitConversationResponse;\n this.conversationId = data.chatId;\n }\n\n async streamMessage(message: string, options?: MessageOptions): Promise<AgentResult> {\n if (!this.conversationId) {\n throw new Error(\"Conversation not initialized\");\n }\n\n const version = this.agentVersion ? `/${this.agentVersion}` : '';\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n \n let body = this.#createExecuteBody(message, true, options);\n\n const connection = new SseConnection();\n let responsePromise: Promise<AgentResult>;\n\n responsePromise = new Promise(async (resolve, reject) => {\n connection.on(\"start\", () => {\n this.emit(\"start\");\n });\n\n connection.on(\"error\", (data) => {\n const error = JSON.parse(data);\n this.emit(\"error\", error);\n reject(error);\n });\n\n connection.on(\"content\", (data) => {\n const chunk = JSON.parse(data);\n this.emit(\"content\", chunk.text);\n });\n\n connection.on(\"stop\", (data) => {\n const finalMessage = JSON.parse(data) as { result: AgentResult};\n this.emit(\"stop\", finalMessage.result);\n resolve(finalMessage.result);\n });\n\n const fetchOptions: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n };\n \n try {\n await connection.start(url, fetchOptions);\n } catch (error) {\n reject(error);\n }\n });\n\n return responsePromise;\n }\n\n async sendMessage(message: string, options?: MessageOptions): Promise<AgentResult> {\n if (!this.conversationId) {\n throw new Error(\"Conversation not initialized\");\n }\n const version = this.agentVersion ? `/${this.agentVersion}` : '';\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n \n let body = this.#createExecuteBody(message, false, options);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (response.status === 429) {\n const retryAfter = parseInt(response.headers.get(\"Retry-After\") || \"60\");\n throw new Error(`Rate limit exceeded. Retry after ${retryAfter} seconds`);\n }\n\n const data = await response.json();\n if (response.status !== 200) {\n throw new Error(data.message || \"Failed to execute message\");\n }\n\n const mappedData = AgentMapper.mapAgentResultToSnakeCase(data);\n\n return mappedData;\n }\n\n #createExecuteBody(message: string, stream: boolean, options?: MessageOptions): ExecuteBodyParams {\n let body: ExecuteBodyParams = [\n {\n Key: \"chatId\",\n Value: this.conversationId,\n },\n {\n Key: \"message\",\n Value: message,\n },\n {\n Key: \"stream\",\n Value: stream.toString(),\n },\n ];\n\n this.#appendInputParametersIfNeeded(body, options?.inputParameters);\n this.#appendVolatileKnowledgeIdsIfNeeded(body, options?.volatileKnowledgeIds);\n this.#appendUserIdentifierIfNeeded(body);\n this.#appendChannelIfNeeded(body);\n\n return body;\n }\n\n #appendUserIdentifierIfNeeded(body: ExecuteBodyParams) {\n if (this.userIdentifier) {\n body.push({\n Key: \"userIdentifier\",\n Value: this.userIdentifier,\n });\n }\n }\n\n #appendChannelIfNeeded(body: ExecuteBodyParams) {\n if (this.channel) {\n body.push({\n Key: \"channel\",\n Value: this.channel,\n });\n }\n }\n\n #appendInputParametersIfNeeded(body: ExecuteBodyParams, parameters: { [key: string]: any } = {}) {\n if (!parameters || Object.keys(parameters).length === 0) return;\n\n for (const [key, value] of Object.entries(parameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n\n #appendInitConversationParamsIfNeeded(body: InitConversationParams) {\n if (this.userIdentifier) {\n body.userIdentifier = this.userIdentifier;\n }\n\n if (this.inputParameters) {\n body.inputParameters = [];\n this.#appendInputParametersIfNeeded(body.inputParameters, this.inputParameters);\n }\n }\n\n #appendVolatileKnowledgeIdsIfNeeded(body: ExecuteBodyParams, volatileKnowledgeIds?: string[]) {\n if (!volatileKnowledgeIds || volatileKnowledgeIds.length === 0) return;\n\n body.push({\n Key: \"volatileKnowledgeIds\",\n Value: volatileKnowledgeIds,\n });\n }\n}\n","import { AgentExecutionOptions } from \"../../types\";\nimport { ConversationalAgentExecutionOptionsMap } from \"../../types\";\nimport { Conversation } from \"./Conversation\";\nimport { RealtimeSession } from \"./RealtimeSession\";\n\nexport abstract class ConversationalAgent<\n T extends keyof ConversationalAgentExecutionOptionsMap,\n> {\n protected constructor(\n protected readonly agentCode: string,\n protected readonly apiKey: string,\n protected readonly baseUrl: string,\n protected readonly options?: ConversationalAgentExecutionOptionsMap[T]\n ) {}\n\n createRealtimeSession(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ): RealtimeSession {\n return new RealtimeSession(agentCode, apiKey, baseUrl, options);\n }\n\n async createConversation(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ): Promise<Conversation> {\n return await Conversation[\"create\"](agentCode, apiKey, baseUrl, options);\n }\n}\n","import { ConversationalAgentExecutionOptionsMap } from \"../../types\";\nimport { ConversationalAgent } from \"./ConversationalAgent\";\n\nexport class Assistant extends ConversationalAgent<\"assistant\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n \n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ): Assistant {\n return new Assistant(agentCode, apiKey, baseUrl, options);\n }\n}\n","import { AgentExecutionOptions } from \"../../types\";\nimport { ConversationalAgentExecutionOptionsMap } from \"../../types\";\nimport { ConversationalAgent } from \"./ConversationalAgent\";\n\nexport class Copilot extends ConversationalAgent<\"copilot\"> {\n constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: ConversationalAgentExecutionOptionsMap[\"copilot\"]\n ): Copilot {\n return new Copilot(agentCode, apiKey, baseUrl, options);\n }\n}\n","import { EventEmitter } from \"../../EventEmitter\";\nimport { AgentResult, ExecuteBodyParams, SSEStreamEvents } from \"../../types\";\nimport { AgentMapper } from \"../../utils/AgentMapper\";\nimport { SseConnection } from \"../conversational/Conversation/SseConnection\";\nimport { SystemAgentExecutionOptionsMap } from \"./../../types\";\n\nexport abstract class SystemAgent<\n T extends keyof SystemAgentExecutionOptionsMap,\n> extends EventEmitter<SSEStreamEvents> {\n protected constructor(\n protected readonly agentCode: string,\n protected readonly apiKey: string,\n protected readonly baseUrl: string,\n protected readonly options?: SystemAgentExecutionOptionsMap[T]\n ) {\n super();\n }\n\n async stream(): Promise<AgentResult> {\n const version = this.options?.agentVersion\n ? `/${this.options.agentVersion}`\n : \"\";\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n\n let body = this.createExecuteBody(true);\n\n const connection = new SseConnection();\n let responsePromise: Promise<AgentResult>;\n\n responsePromise = new Promise(async (resolve, reject) => {\n connection.on(\"start\", () => {\n this.emit(\"start\");\n });\n\n connection.on(\"error\", (data) => {\n const error = JSON.parse(data);\n this.emit(\"error\", error);\n reject(error);\n });\n\n connection.on(\"content\", (data) => {\n const chunk = JSON.parse(data);\n this.emit(\"content\", chunk.text);\n });\n\n connection.on(\"stop\", (data) => {\n const finalMessage = JSON.parse(data) as { result: AgentResult };\n this.emit(\"stop\", finalMessage.result);\n resolve(finalMessage.result);\n });\n\n const fetchOptions: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n };\n\n try {\n await connection.start(url, fetchOptions);\n } catch (error) {\n reject(error);\n }\n });\n\n return responsePromise;\n }\n\n protected async execute(): Promise<AgentResult> {\n const version = this.options?.agentVersion\n ? `/${this.options.agentVersion}`\n : \"\";\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n\n let body = this.createExecuteBody(false);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (response.status === 429) {\n const retryAfter = parseInt(response.headers.get(\"Retry-After\") || \"60\");\n throw new Error(`Rate limit exceeded. Retry after ${retryAfter} seconds`);\n }\n\n const data = await response.json();\n if (response.status !== 200) {\n throw new Error(data.message || \"Failed to execute message\");\n }\n\n return AgentMapper.mapAgentResultToSnakeCase(data);\n }\n\n protected createExecuteBody(\n stream: boolean\n ): ExecuteBodyParams | { [key: string]: any } {\n let body: ExecuteBodyParams = [\n {\n Key: \"stream\",\n Value: stream.toString(),\n },\n ];\n\n this.appendVolatileKnowledgeIdsIfNeeded(body);\n this.appendUserIdentifierIfNeeded(body);\n this.appendChannelIfNeeded(body);\n\n return body;\n }\n\n protected appendUserIdentifierIfNeeded(body: ExecuteBodyParams) {\n if (this.options?.userIdentifier) {\n body.push({\n Key: \"userIdentifier\",\n Value: this.options.userIdentifier,\n });\n }\n }\n\n protected appendVolatileKnowledgeIdsIfNeeded(body: ExecuteBodyParams) {\n if (\n !this.options?.volatileKnowledgeIds ||\n this.options.volatileKnowledgeIds.length === 0\n )\n return;\n\n body.push({\n Key: \"volatileKnowledgeIds\",\n Value: this.options.volatileKnowledgeIds,\n });\n }\n\n protected appendChannelIfNeeded(body: ExecuteBodyParams) {\n if (this.options?.channel) {\n body.push({\n Key: \"channel\",\n Value: this.options.channel,\n });\n }\n }\n}\n","import { SystemAgent } from \"./SystemAgent\";\nimport {\n ExecuteBodyParams,\n SystemAgentExecutionOptionsMap,\n} from \"./../../types\";\n\nexport class Activity extends SystemAgent<\"activity\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Activity {\n return new Activity(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ) {\n const instance = new Activity(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(\n stream: boolean\n ): ExecuteBodyParams | { [key: string]: any } {\n const baseOptions = super.createExecuteBody(stream);\n\n this.appendInputParametersIfNeeded(baseOptions);\n\n return baseOptions;\n }\n\n private appendInputParametersIfNeeded(\n body: ExecuteBodyParams | { [key: string]: any }\n ) {\n if (\n !this.options?.inputParameters ||\n Object.keys(this.options.inputParameters).length === 0\n )\n return;\n\n for (const [key, value] of Object.entries(this.options.inputParameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n}\n","import { ExecuteBodyParams } from \"../../types\";\nimport { SystemAgentExecutionOptionsMap } from \"./../../types\";\nimport { SystemAgent } from \"./SystemAgent\";\n\nexport class ChatCompletion extends SystemAgent<\"chat-completion\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): ChatCompletion {\n return new ChatCompletion(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ) {\n const instance = new ChatCompletion(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(stream: boolean): ExecuteBodyParams | { [key: string]: any } {\n const body = super.createExecuteBody(stream);\n\n this.appendMessagesIfNeeded(body);\n this.appendMessageIfNeeded(body);\n this.appendInputParametersIfNeeded(body);\n\n return body;\n }\n\n private appendMessagesIfNeeded(body: ExecuteBodyParams | { [key: string]: any }) {\n if (!this.options?.messages || this.options.messages.length === 0) return;\n\n body.push({\n Key: \"messages\",\n Value: JSON.stringify(this.options.messages),\n });\n }\n\n private appendMessageIfNeeded(body: ExecuteBodyParams | { [key: string]: any }) {\n if (!this.options?.message) return;\n\n body.push({\n Key: \"message\",\n Value: this.options.message,\n });\n }\n\n private appendInputParametersIfNeeded(\n body: ExecuteBodyParams | { [key: string]: any }\n ) {\n if (\n !this.options?.inputParameters ||\n Object.keys(this.options.inputParameters).length === 0\n )\n return;\n\n for (const [key, value] of Object.entries(this.options.inputParameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n}\n","import { SystemAgent } from \"./SystemAgent\";\nimport { ExecuteBodyParams, SystemAgentExecutionOptionsMap } from \"../../types\";\n\nexport class Plan extends SystemAgent<\"plan\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ): Plan {\n return new Plan(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ) {\n const instance = new Plan(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(\n stream: boolean\n ): ExecuteBodyParams | { [key: string]: any } {\n const baseOptions = super.createExecuteBody(stream);\n this.appendInputParametersIfNeeded(baseOptions);\n return baseOptions;\n }\n\n private appendInputParametersIfNeeded(\n body: ExecuteBodyParams | { [key: string]: any }\n ) {\n if (\n !this.options?.inputParameters ||\n Object.keys(this.options.inputParameters).length === 0\n )\n return;\n\n for (const [key, value] of Object.entries(this.options.inputParameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n}\n","import { SystemAgent } from \"./SystemAgent\";\nimport { ExecuteBodyParams, SystemAgentExecutionOptionsMap } from \"../../types\";\nimport { ProxyExecutionOptions } from \"./types\";\n\nexport class Proxy extends SystemAgent<\"proxy\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Proxy {\n return new Proxy(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ) {\n const instance = new Proxy(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(stream: boolean): ExecuteBodyParams | { [key: string]: any } {\n const options = this.options as ProxyExecutionOptions;\n \n return {\n model: options.model,\n messages: options.messages,\n frequency_penalty: options.frequency_penalty,\n max_tokens: options.max_tokens,\n presence_penalty: options.presence_penalty,\n temperature: options.temperature,\n top_p: options.top_p,\n top_k: options.top_k,\n vendor: options.vendor,\n userIdentifier: options.userIdentifier,\n groupIdentifier: options.groupIdentifier,\n useVision: options.useVision,\n stream: stream,\n }\n }\n}\n","import { Assistant } from \"../scopes/conversational/Assistant\";\nimport { Conversation } from \"../scopes/conversational/Conversation\";\nimport { Copilot } from \"../scopes/conversational/Copilot\";\nimport { RealtimeSession } from \"../scopes/conversational/RealtimeSession\";\nimport { Activity } from \"../scopes/system/Activity\";\nimport { ChatCompletion } from \"../scopes/system/ChatCompletion\";\nimport { Plan } from \"../scopes/system/Plan\";\nimport { Proxy } from \"../scopes/system/Proxy\";\nimport {\n AgentResult,\n AgentType,\n ConversationalAgentExecutionOptionsMap,\n SystemAgentExecutionOptionsMap,\n} from \"../types\";\n\nexport class AgentFactory {\n static createAgent<T extends AgentType>(\n type: T,\n apiKey: string,\n baseUrl: string\n ): AgentTypeMap[T] {\n switch (type) {\n case \"assistant\": {\n return {\n createConversation: async (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ) => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n const conversation = await assistant.createConversation(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n\n return conversation;\n },\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ) => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n return assistant.createRealtimeSession(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n }\n case \"copilot\":\n return {\n createConversation: async (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"copilot\"]\n ): Promise<Conversation> => {\n const copilot = Copilot.create(agentCode, apiKey, baseUrl, options);\n const conversation = await copilot.createConversation(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n return conversation;\n },\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"copilot\"]\n ) => {\n const copilot = Copilot.create(agentCode, apiKey, baseUrl, options);\n return copilot.createRealtimeSession(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n\n case \"activity\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Promise<AgentResult> => {\n return Activity[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Activity => {\n return Activity[\"create\"](agentCode, apiKey, baseUrl, options);\n },\n } as AgentTypeMap[T];\n }\n case \"chat-completion\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): Promise<AgentResult> => {\n return ChatCompletion[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): ChatCompletion => {\n return ChatCompletion[\"create\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n }\n case \"proxy\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Promise<AgentResult> => {\n return Proxy[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Proxy => {\n return Proxy[\"create\"](agentCode, apiKey, baseUrl, options);\n },\n } as AgentTypeMap[T];\n }\n case \"plan\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ): Promise<AgentResult> => {\n return Plan[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ): Plan => {\n return Plan[\"create\"](agentCode, apiKey, baseUrl, options);\n }\n } as AgentTypeMap[T];\n }\n default:\n throw new Error(`Agent type ${type} not supported`);\n }\n }\n}\n\nexport type ConversationalAgentScope<\n T extends keyof ConversationalAgentExecutionOptionsMap,\n> = {\n /**\n * Create a new conversation with an agent.\n * This allows you to send messages and receive responses.\n * \n * ## Regular conversation example:\n * ```typescript\n * const conversation = await client.agents.assistants.createConversation(\"agent-code\");\n * const response = await conversation.sendMessage(\"Hello!\");\n * console.log(response.content);\n * ```\n * \n * ## Streaming conversation example:\n * ```typescript\n * const conversation = await client.agents.assistants\n * .createConversation(\"agent-code\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"Hello!\");\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the conversation\n * @returns A Promise that resolves to a Conversation instance\n */\n createConversation: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[T]\n ) => Promise<Conversation>;\n\n /**\n * Create a real-time session with an agent.\n * This allows for voice interactions and real-time responses.\n * \n * ## Real-time session example:\n * ```typescript\n * const session = client.agents.assistants\n * .createRealtimeSession(\"agent-code\")\n * .on(\"session.created\", () => console.log(\"Session started\"))\n * .on(\"speech.started\", () => console.log(\"User started talking\"))\n * .on(\"speech.stopped\", () => console.log(\"User stopped talking\"))\n * .on(\"response.done\", (response) => console.log(\"Response:\", response))\n * .on(\"session.stopped\", () => console.log(\"Session stopped\"));\n * \n * await session.start();\n * // Later: session.stop();\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the real-time session\n * @returns A RealtimeSession instance\n */\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[T]\n ) => RealtimeSession;\n};\n\nexport type SystemAgentScope<\n T extends keyof SystemAgentExecutionOptionsMap,\n TCreateReturn,\n> = {\n /**\n * Execute an agent synchronously and get the result.\n * \n * ## Example:\n * ```typescript\n * const response = await client.agents.activities.execute(\"agent-code\", {\n * // Optional parameters specific to the agent type\n * inputParameters: {\n * param1: \"value1\",\n * param2: \"value2\"\n * }\n * });\n * console.log(response.content);\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the execution\n * @returns A Promise that resolves to an AgentResult\n */\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[T]\n ) => Promise<AgentResult>;\n\n /**\n * Create an agent instance for streaming execution.\n * \n * ## Streaming example:\n * ```typescript\n * const agent = client.agents.activities\n * .create(\"agent-code\", {\n * // Optional parameters specific to the agent\n * inputParameters: {\n * param1: \"value1\",\n * param2: \"value2\"\n * }\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await agent.stream();\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the agent creation\n * @returns An agent instance ready for streaming\n */\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[T]\n ) => TCreateReturn;\n};\n\ntype AgentTypeMap = {\n assistant: ConversationalAgentScope<\"assistant\">;\n copilot: ConversationalAgentScope<\"copilot\">;\n activity: SystemAgentScope<\"activity\", Activity>;\n \"chat-completion\": SystemAgentScope<\"chat-completion\", ChatCompletion>;\n proxy: SystemAgentScope<\"proxy\", Proxy>;\n plan: SystemAgentScope<\"plan\", Plan>;\n};\n","import {\n AgentFactory,\n ConversationalAgentScope,\n SystemAgentScope,\n} from \"./factories/AgentFactory\";\nimport { Activity } from \"./scopes/system/Activity\";\nimport { ChatCompletion } from \"./scopes/system/ChatCompletion\";\nimport { Plan } from \"./scopes/system/Plan\";\nimport { Proxy } from \"./scopes/system/Proxy\";\nimport { SerenityClientOptions } from \"./types\";\n\nexport default class SerenityClient {\n private apiKey: string;\n private baseUrl = \"https://api.serenitystar.ai/api\";\n\n /**\n * Interact with the different agents available in Serenity Star.\n * You can choose between assistants, copilots, activities, chat completions, proxies, and plans.\n */\n public readonly agents: {\n /**\n * Interact with Assistant agents available in Serenity Star.\n * This allows you to create conversations and real-time sessions.\n * \n * ## Start a new conversation and send a message:\n * ```typescript\n * // Regular text conversation\n * const conversation = await client.agents.assistants.createConversation(\"translator-assistant\");\n * const response = await conversation.sendMessage(\"The sun was beginning to set...\");\n * console.log(response.content);\n * \n * ```\n * \n * ## Stream message with SSE\n * ```typescript\n * const conversation = await client.agents.assistants\n * .createConversation(\"translator-assistant\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"The sun was beginning to set...\");\n * \n * ```\n * \n * ## Real-time voice conversation example:\n * ```typescript\n * const session = client.agents.assistants.createRealtimeSession(\"marketing-assistant\")\n * .on(\"session.created\", () => console.log(\"Session started\"))\n * .on(\"speech.started\", () => console.log(\"User started talking\"))\n * .on(\"speech.stopped\", () => console.log(\"User stopped talking\"))\n * .on(\"response.done\", (response) => console.log(\"Response:\", response))\n * .on(\"session.stopped\", () => console.log(\"Session stopped\"));\n * \n * await session.start();\n * // Later: session.stop();\n * ```\n */\n assistants: ConversationalAgentScope<\"assistant\">;\n\n /**\n * Interact with Copilot agents available in Serenity Star.\n * Similar to assistants but allows you to interact with the UI through callbacks.\n * \n * Text conversation example:\n * ```typescript\n * // Regular conversation\n * const conversation = await client.agents.copilots.createConversation(\"app-copilot\");\n * const response = await conversation.sendMessage(\"How do I create a new support ticket?\");\n * console.log(response.content);\n * \n * // Streaming conversation\n * const conversation = await client.agents.copilots\n * .createConversation(\"app-copilot\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"How do I create a new support ticket?\");\n * ```\n */\n copilots: ConversationalAgentScope<\"copilot\">;\n\n /**\n * Interact with Activity agents available in Serenity Star.\n * This allows you to execute activities.\n * It supports streaming.\n * Execute simple tasks based on the user input.\n * \n * ## Regular activity execution:\n * ```typescript\n * const response = await client.agents.activities.execute(\"marketing-campaign\")\n * console.log(response.content);\n * \n * // With parameters\n * const response = await client.agents.activities.execute(\"cooking-activity\", {\n * inputParameters: {\n * ingredientOne: \"chicken\",\n * ingredientTwo: \"onion\",\n * ingredientThree: \"cream\",\n * }\n * });\n * ```\n * \n * ## Stream activity with SSE:\n * ```typescript\n * const activity = client.agents.activities\n * .create(\"marketing-campaign\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await activity.stream();\n * ```\n */\n activities: SystemAgentScope<\"activity\", Activity>;\n\n /**\n * Interact with Chat Completion agents available in Serenity Star.\n * This allows you to execute chat completions.\n * It supports streaming.\n * Chat completions allows you to fully control the conversation and generate completions.\n * \n * ## Regular chat completion:\n * ```typescript\n * const response = await client.agents.chatCompletions.execute(\"Health-Coach\", {\n * message: \"Hello!\"\n * });\n * console.log(response.content);\n * ```\n * \n * ## Stream chat completion with SSE:\n * ```typescript\n * const chatCompletion = client.agents.chatCompletions\n * .create(\"Health-Coach\", {\n * message: \"Hello!\"\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await chatCompletion.stream();\n * ```\n */\n chatCompletions: SystemAgentScope<\"chat-completion\", ChatCompletion>;\n\n /**\n * Interact with Proxy agents available in Serenity Star.\n * This allows you to execute proxies.\n * It supports streaming.\n * Proxy agents allows you to define a set of parameters dynamically for each request\n * \n * ## Regular proxy execution:\n * ```typescript\n * const response = await client.agents.proxies.execute(\"proxy-agent\", {\n * model: \"gpt-4o-mini-2024-07-18\",\n * messages: [\n * {\n * role: \"system\",\n * content: \"You are a helpful assistant. Always use short and concise responses\"\n * },\n * { role: \"user\", content: \"What is artificial intelligence?\" }\n * ],\n * temperature: 1,\n * max_tokens: 250\n * });\n * console.log(response.content);\n * ```\n * \n * ## Stream proxy with SSE:\n * ```typescript\n * const proxy = client.agents.proxies\n * .create(\"proxy-agent\", {\n * model: \"gpt-4o-mini-2024-07-18\",\n * messages: [\n * {\n * role: \"system\",\n * content: \"You are a helpful assistant. Always use short and concise responses\"\n * },\n * { role: \"user\", content: \"What is artificial intelligence?\" }\n * ],\n * temperature: 1,\n * max_tokens: 250\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await proxy.stream();\n * ```\n */\n proxies: SystemAgentScope<\"proxy\", Proxy>;\n\n /**\n * Interact with Plan agents available in Serenity Star.\n * This allows you to execute plans.\n * It supports streaming.\n * Plan agents are capable of building an execution plan based on the user input and execute it.\n * \n * ## Regular plan execution:\n * ```typescript\n * const response = await client.agents.plans.execute(\"event-planner\");\n * console.log(response.content);\n * ```\n * \n * ## Stream plan with SSE:\n * ```typescript\n * const plan = client.agents.plans\n * .create(\"event-planner\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await plan.stream();\n * ```\n */\n plans: SystemAgentScope<\"plan\", Plan>;\n };\n\n constructor(options: SerenityClientOptions) {\n if (!options.apiKey) {\n throw new Error(\"The API key is required\");\n }\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl || this.baseUrl;\n\n this.agents = {\n assistants: AgentFactory.createAgent(\n \"assistant\",\n this.apiKey,\n this.baseUrl\n ),\n copilots: AgentFactory.createAgent(\"copilot\", this.apiKey, this.baseUrl),\n activities: AgentFactory.createAgent(\n \"activity\",\n this.apiKey,\n this.baseUrl\n ),\n chatCompletions: AgentFactory.createAgent(\n \"chat-completion\",\n this.apiKey,\n this.baseUrl\n ),\n proxies: AgentFactory.createAgent(\"proxy\", this.apiKey, this.baseUrl),\n plans: AgentFactory.createAgent(\"plan\", this.apiKey, this.baseUrl),\n };\n }\n}\n"],"mappings":"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","names":["index_exports","__export","RealtimeSession","SerenityClient","__toCommonJS","undiciFetch","UndiciHeaders","UndiciRequest","UndiciResponse","_a","undici","EventEmitter","eventName","listener","args","_a","_RealtimeSession_instances","stop_fn","setupWebSocketConnection_fn","handleIncomingMessagesFromSerenity_fn","handleIncomingMessagesFromVendor_fn","setupWebRTCConnection_fn","getAudioFromMicrophone_fn","startSession_fn","resetInactivityTimeout_fn","extractErrorMessageFromEvent_fn","RealtimeSession","EventEmitter","agentCode","apiKey","baseUrl","options","__privateAdd","__async","__privateMethod","error","audioTrack","reason","details","track","url","sessionCreateEvent","event","data","obj","eventData","errorDetails","isSerenityEvent","currentDate","channelName","e","audioElement","offer","sdpResponse","answer","SseConnection","_","url","fetchOptions","__async","response","reader","decoder","done","value","error","eventEnd","lineEnding","eventDelimiter","eventText","lines","event","line","eventType","callback","listeners","cb","data","AgentMapper","data","_Conversation_instances","getConversationId_fn","createExecuteBody_fn","appendUserIdentifierIfNeeded_fn","appendChannelIfNeeded_fn","appendInputParametersIfNeeded_fn","appendInitConversationParamsIfNeeded_fn","appendVolatileKnowledgeIdsIfNeeded_fn","_Conversation","EventEmitter","agentCode","apiKey","baseUrl","options","__privateAdd","__async","_a","instance","__privateMethod","message","version","url","body","connection","SseConnection","responsePromise","resolve","reject","data","error","chunk","finalMessage","fetchOptions","response","retryAfter","AgentMapper","reqBody","stream","parameters","key","value","volatileKnowledgeIds","Conversation","ConversationalAgent","agentCode","apiKey","baseUrl","options","RealtimeSession","__async","Conversation","Assistant","_Assistant","ConversationalAgent","agentCode","apiKey","baseUrl","options","Copilot","_Copilot","ConversationalAgent","agentCode","apiKey","baseUrl","options","SystemAgent","EventEmitter","agentCode","apiKey","baseUrl","options","__async","_a","version","url","body","connection","SseConnection","responsePromise","resolve","reject","data","error","chunk","finalMessage","fetchOptions","response","retryAfter","AgentMapper","stream","Activity","_Activity","SystemAgent","agentCode","apiKey","baseUrl","options","stream","baseOptions","body","_a","key","value","ChatCompletion","_ChatCompletion","SystemAgent","agentCode","apiKey","baseUrl","options","stream","body","_a","key","value","Plan","_Plan","SystemAgent","agentCode","apiKey","baseUrl","options","stream","baseOptions","body","_a","key","value","Proxy","_Proxy","SystemAgent","agentCode","apiKey","baseUrl","options","stream","AgentFactory","type","apiKey","baseUrl","agentCode","options","__async","Assistant","Copilot","Activity","ChatCompletion","Proxy","Plan","SerenityClient","options","AgentFactory"]}
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- var j=r=>{throw TypeError(r)};var ne=(r=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(r,{get:(n,e)=>(typeof require!="undefined"?require:n)[e]}):r)(function(r){if(typeof require!="undefined")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var ie=(r,n,e)=>n.has(r)||j("Cannot "+e);var M=(r,n,e)=>n.has(r)?j("Cannot add the same private member more than once"):n instanceof WeakSet?n.add(r):n.set(r,e);var c=(r,n,e)=>(ie(r,n,"access private method"),e);var g=(r,n,e)=>new Promise((t,s)=>{var i=u=>{try{o(e.next(u))}catch(m){s(m)}},a=u=>{try{o(e.throw(u))}catch(m){s(m)}},o=u=>u.done?t(u.value):Promise.resolve(u.value).then(i,a);o((e=e.apply(r,n)).next())});var J,W,L,U,q;if(typeof process!="undefined"&&((q=process.versions)!=null&&q.node)){let r=ne("undici");J=r.fetch,W=r.Headers,L=r.Request,U=r.Response,globalThis.fetch||(globalThis.fetch=J,globalThis.Headers=W,globalThis.Request=L,globalThis.Response=U)}var v=class{constructor(){this.listeners={}}on(n,e){return this.listeners[n]||(this.listeners[n]=[]),this.listeners[n].push(e),this}emit(n,...e){var t;(t=this.listeners[n])==null||t.forEach(s=>s(...e))}};var p,S,D,F,z,X,Y,H,N,G,O=class extends v{constructor(e,t,s,i){super();M(this,p);this.timeout=12e4;this.apiKey=t,this.agentCode=e,this.baseUrl=s,this.agentVersion=i==null?void 0:i.agentVersion,this.inputParameters=i==null?void 0:i.inputParameters,this.userIdentifier=i==null?void 0:i.userIdentifier,this.channel=i==null?void 0:i.channel}start(){return g(this,null,function*(){try{c(this,p,D).call(this)}catch(e){throw new Error("Error starting the session")}})}stop(){c(this,p,S).call(this)}muteMicrophone(){if(this.localStream){let e=this.localStream.getAudioTracks()[0];e&&(e.enabled=!1)}}unmuteMicrophone(){if(this.localStream){let e=this.localStream.getAudioTracks()[0];e&&(e.enabled=!0)}}};p=new WeakSet,S=function(e,t){if(this.socket&&this.socket.readyState===WebSocket.OPEN)try{this.socket.close(1e3,"Client closed the session")}catch(s){console.error("Error closing WebSocket connection:",s)}this.localStream&&(this.localStream.getTracks().forEach(s=>s.stop()),this.localStream=void 0),this.peerConnection&&this.peerConnection.close(),this.socket=void 0,this.dataChannel=void 0,this.peerConnection=void 0,this.emit("session.stopped",e,t),clearTimeout(this.inactivityTimeout)},D=function(){let e=`${this.baseUrl}/v2/agent/${this.agentCode}/realtime`;this.agentVersion&&(e+=`/${this.agentVersion}`),this.socket=new WebSocket(e,["X-API-KEY",this.apiKey]),this.socket.onopen=()=>{let t={type:"serenity.session.create",input_parameters:this.inputParameters,user_identifier:this.userIdentifier,channel:this.channel};this.socket.send(JSON.stringify(t))},this.socket.onclose=()=>{c(this,p,S).call(this)},this.socket.onerror=t=>{this.emit("error","Error connecting to the server"),c(this,p,S).call(this)},this.socket.onmessage=t=>{c(this,p,F).call(this,t.data)}},F=function(e){return g(this,null,function*(){let t=JSON.parse(e);switch(t.type){case"serenity.session.created":{let s=t;this.sessionConfiguration={url:s.url,headers:s.headers},c(this,p,X).call(this),c(this,p,z).call(this),yield c(this,p,H).call(this);break}case"serenity.session.close":{let s=t,i=c(this,p,G).call(this,s);this.emit("error",i),c(this,p,S).call(this,s.reason,i);break}case"serenity.response.processed":{let s=t;this.emit("response.processed",s.result);break}default:{let s=t.type.startsWith("serenity");this.dataChannel&&!s&&this.dataChannel.send(JSON.stringify(t))}}})},z=function(){if(!this.peerConnection)throw new Error("Could not add listeners: WebRTC connection not initialized");let e=new Date().toISOString().replace(/T/,"-").replace(/:/g,"-").replace(/\..+/,""),t=`data-channel-${this.agentCode}-${e}`;this.dataChannel=this.peerConnection.createDataChannel(t),this.dataChannel.addEventListener("message",s=>{c(this,p,N).call(this);let i=JSON.parse(s.data);try{switch(i.type){case"input_audio_buffer.speech_started":{this.emit("speech.started");break}case"input_audio_buffer.speech_stopped":{this.emit("speech.stopped");break}case"response.done":{this.emit("response.done");break}case"error":{this.emit("error","There was an error processing your request");break}}}catch(a){this.emit("error","Error processing incoming messages from vendor")}finally{this.socket&&this.socket.send(JSON.stringify(i))}})},X=function(){this.peerConnection=new RTCPeerConnection;let e=document.createElement("audio");e.autoplay=!0,this.peerConnection.ontrack=t=>{t.streams&&t.streams[0]&&(e.srcObject=t.streams[0])}},Y=function(){return g(this,null,function*(){if(!this.peerConnection)throw new Error("Could not start the session: WebRTC connection not initialized");this.localStream=yield navigator.mediaDevices.getUserMedia({audio:!0});let e=this.localStream.getTracks()[0];this.peerConnection.addTrack(e,this.localStream)})},H=function(){return g(this,null,function*(){if(!this.peerConnection)throw new Error("Could not start the session: WebRTC connection not initialized");if(!this.sessionConfiguration)throw new Error("Could not start the session: Session configuration not available");try{yield c(this,p,Y).call(this);let e=yield this.peerConnection.createOffer();yield this.peerConnection.setLocalDescription(e);let t=yield fetch(`${this.sessionConfiguration.url}`,{method:"POST",body:e.sdp,headers:this.sessionConfiguration.headers});if(!t.ok)throw new Error("Error starting the session");let s={type:"answer",sdp:yield t.text()};yield this.peerConnection.setRemoteDescription(s),this.emit("session.created"),c(this,p,N).call(this)}catch(e){this.emit("error","Error starting the session"),c(this,p,S).call(this)}})},N=function(){clearTimeout(this.inactivityTimeout),this.inactivityTimeout=setTimeout(()=>{c(this,p,S).call(this)},this.timeout)},G=function(e){switch(e.reason){case"Exception":return e.message;case"ValidationException":return e.errors?Object.values(e.errors).join(". "):e.message;default:return e.message}};var C=class{constructor(){this.buffer="";this.eventListeners={start:[n=>{}],stop:[n=>{this.stop()}],error:[n=>{this.stop()}]},this.active=!1}start(n,e){return g(this,null,function*(){this.active=!0;try{let t=yield fetch(n,e);if(t.headers.get("Content-Type")!=="text/event-stream")return t;let i=t.body.getReader(),a=new TextDecoder("utf-8");for(this.buffer="";this.active;){let{done:o,value:u}=yield i.read();if(o)break;this.buffer+=a.decode(u,{stream:!0}),this.processEvents()}return t}catch(t){throw console.error("Error in SSE connection:",t),this.active=!1,t}})}processEvents(){let n,e=this.buffer.includes(`\r
1
+ var j=r=>{throw TypeError(r)};var ne=(r=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(r,{get:(n,e)=>(typeof require!="undefined"?require:n)[e]}):r)(function(r){if(typeof require!="undefined")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var ie=(r,n,e)=>n.has(r)||j("Cannot "+e);var M=(r,n,e)=>n.has(r)?j("Cannot add the same private member more than once"):n instanceof WeakSet?n.add(r):n.set(r,e);var c=(r,n,e)=>(ie(r,n,"access private method"),e);var u=(r,n,e)=>new Promise((t,s)=>{var i=g=>{try{o(e.next(g))}catch(m){s(m)}},a=g=>{try{o(e.throw(g))}catch(m){s(m)}},o=g=>g.done?t(g.value):Promise.resolve(g.value).then(i,a);o((e=e.apply(r,n)).next())});var J,W,L,U,q;if(typeof process!="undefined"&&((q=process.versions)!=null&&q.node)){let r=ne("undici");J=r.fetch,W=r.Headers,L=r.Request,U=r.Response,globalThis.fetch||(globalThis.fetch=J,globalThis.Headers=W,globalThis.Request=L,globalThis.Response=U)}var v=class{constructor(){this.listeners={}}on(n,e){return this.listeners[n]||(this.listeners[n]=[]),this.listeners[n].push(e),this}emit(n,...e){var t;(t=this.listeners[n])==null||t.forEach(s=>s(...e))}};var p,E,D,F,z,X,Y,H,N,G,O=class extends v{constructor(e,t,s,i){super();M(this,p);this.timeout=12e4;this.apiKey=t,this.agentCode=e,this.baseUrl=s,this.agentVersion=i==null?void 0:i.agentVersion,this.inputParameters=i==null?void 0:i.inputParameters,this.userIdentifier=i==null?void 0:i.userIdentifier,this.channel=i==null?void 0:i.channel}start(){return u(this,null,function*(){try{c(this,p,D).call(this)}catch(e){throw new Error("Error starting the session")}})}stop(){c(this,p,E).call(this)}muteMicrophone(){if(this.localStream){let e=this.localStream.getAudioTracks()[0];e&&(e.enabled=!1)}}unmuteMicrophone(){if(this.localStream){let e=this.localStream.getAudioTracks()[0];e&&(e.enabled=!0)}}};p=new WeakSet,E=function(e,t){if(this.socket&&this.socket.readyState===WebSocket.OPEN)try{this.socket.close(1e3,"Client closed the session")}catch(s){console.error("Error closing WebSocket connection:",s)}this.localStream&&(this.localStream.getTracks().forEach(s=>s.stop()),this.localStream=void 0),this.peerConnection&&this.peerConnection.close(),this.socket=void 0,this.dataChannel=void 0,this.peerConnection=void 0,this.emit("session.stopped",e,t),clearTimeout(this.inactivityTimeout)},D=function(){let e=`${this.baseUrl}/v2/agent/${this.agentCode}/realtime`;this.agentVersion&&(e+=`/${this.agentVersion}`),this.socket=new WebSocket(e,["X-API-KEY",this.apiKey]),this.socket.onopen=()=>{let t={type:"serenity.session.create",input_parameters:this.inputParameters,user_identifier:this.userIdentifier,channel:this.channel};this.socket.send(JSON.stringify(t))},this.socket.onclose=()=>{c(this,p,E).call(this)},this.socket.onerror=t=>{this.emit("error","Error connecting to the server"),c(this,p,E).call(this)},this.socket.onmessage=t=>{c(this,p,F).call(this,t.data)}},F=function(e){return u(this,null,function*(){let t=JSON.parse(e);switch(t.type){case"serenity.session.created":{let s=t;this.sessionConfiguration={url:s.url,headers:s.headers},c(this,p,X).call(this),c(this,p,z).call(this),yield c(this,p,H).call(this);break}case"serenity.session.close":{let s=t,i=c(this,p,G).call(this,s);this.emit("error",i),c(this,p,E).call(this,s.reason,i);break}case"serenity.response.processed":{let s=t;this.emit("response.processed",s.result);break}default:{let s=t.type.startsWith("serenity");this.dataChannel&&!s&&this.dataChannel.send(JSON.stringify(t))}}})},z=function(){if(!this.peerConnection)throw new Error("Could not add listeners: WebRTC connection not initialized");let e=new Date().toISOString().replace(/T/,"-").replace(/:/g,"-").replace(/\..+/,""),t=`data-channel-${this.agentCode}-${e}`;this.dataChannel=this.peerConnection.createDataChannel(t),this.dataChannel.addEventListener("message",s=>{c(this,p,N).call(this);let i=JSON.parse(s.data);try{switch(i.type){case"input_audio_buffer.speech_started":{this.emit("speech.started");break}case"input_audio_buffer.speech_stopped":{this.emit("speech.stopped");break}case"response.done":{this.emit("response.done");break}case"error":{this.emit("error","There was an error processing your request");break}}}catch(a){this.emit("error","Error processing incoming messages from vendor")}finally{this.socket&&this.socket.send(JSON.stringify(i))}})},X=function(){this.peerConnection=new RTCPeerConnection;let e=document.createElement("audio");e.autoplay=!0,this.peerConnection.ontrack=t=>{t.streams&&t.streams[0]&&(e.srcObject=t.streams[0])}},Y=function(){return u(this,null,function*(){if(!this.peerConnection)throw new Error("Could not start the session: WebRTC connection not initialized");this.localStream=yield navigator.mediaDevices.getUserMedia({audio:!0});let e=this.localStream.getTracks()[0];this.peerConnection.addTrack(e,this.localStream)})},H=function(){return u(this,null,function*(){if(!this.peerConnection)throw new Error("Could not start the session: WebRTC connection not initialized");if(!this.sessionConfiguration)throw new Error("Could not start the session: Session configuration not available");try{yield c(this,p,Y).call(this);let e=yield this.peerConnection.createOffer();yield this.peerConnection.setLocalDescription(e);let t=yield fetch(`${this.sessionConfiguration.url}`,{method:"POST",body:e.sdp,headers:this.sessionConfiguration.headers});if(!t.ok)throw new Error("Error starting the session");let s={type:"answer",sdp:yield t.text()};yield this.peerConnection.setRemoteDescription(s),this.emit("session.created"),c(this,p,N).call(this)}catch(e){this.emit("error","Error starting the session"),c(this,p,E).call(this)}})},N=function(){clearTimeout(this.inactivityTimeout),this.inactivityTimeout=setTimeout(()=>{c(this,p,E).call(this)},this.timeout)},G=function(e){switch(e.reason){case"Exception":return e.message;case"ValidationException":return e.errors?Object.values(e.errors).join(". "):e.message;default:return e.message}};var C=class{constructor(){this.buffer="";this.eventListeners={start:[n=>{}],stop:[n=>{this.stop()}],error:[n=>{this.stop()}]},this.active=!1}start(n,e){return u(this,null,function*(){this.active=!0;try{let t=yield fetch(n,e);if(!t.ok)throw t;if(t.headers.get("Content-Type")!=="text/event-stream")return t;let i=t.body.getReader(),a=new TextDecoder("utf-8");for(this.buffer="";this.active;){let{done:o,value:g}=yield i.read();if(o)break;this.buffer+=a.decode(g,{stream:!0}),this.processEvents()}return t}catch(t){throw this.active=!1,t}})}processEvents(){let n,e=this.buffer.includes(`\r
2
2
  `)?`\r
3
3
  `:`
4
- `,t=e+e;for(;(n=this.buffer.indexOf(t))!==-1;){let s=this.buffer.slice(0,n).trim();this.buffer=this.buffer.slice(n+t.length);let i=s.split(e),a={};for(let o of i)o.startsWith("data:")?a.data=o.slice(5).trim():o.startsWith("event:")&&(a.event=o.slice(6).trim());this.trigger(a.event||"message",a.data)}}on(n,e){this.eventListeners[n]||(this.eventListeners[n]=[]),this.eventListeners[n].push(e)}off(n,e){let t=this.eventListeners[n];t&&(this.eventListeners[n]=t.filter(s=>s!==e))}trigger(n,e){let t=this.eventListeners[n];t&&t.forEach(s=>s(e))}stop(){this.active=!1}};var A=class{};A.mapAgentResultToSnakeCase=n=>({content:n.content,instance_id:n.instanceId,action_results:n.actionResults,completion_usage:n.completionUsage,executor_task_logs:n.executorTaskLogs,json_content:n.jsonContent,meta_analysis:n.metaAnalysis,time_to_first_token:n.timeToFirstToken});var h,Q,B,Z,ee,$,te,se,_=class _ extends v{constructor(e,t,s,i){super();M(this,h);this.apiKey=t,this.agentCode=e,this.baseUrl=s,this.agentVersion=i==null?void 0:i.agentVersion,this.inputParameters=i==null?void 0:i.inputParameters,this.userIdentifier=i==null?void 0:i.userIdentifier,this.channel=i==null?void 0:i.channel}static create(e,t,s,i){return g(this,null,function*(){var o;let a=new _(e,t,s,i);return yield c(o=a,h,Q).call(o),a})}streamMessage(e,t){return g(this,null,function*(){if(!this.conversationId)throw new Error("Conversation not initialized");let s=this.agentVersion?`/${this.agentVersion}`:"",i=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${s}`,a=c(this,h,B).call(this,e,!0,t),o=new C,u;u=new Promise((f,x)=>{o.on("start",()=>{this.emit("start")}),o.on("error",l=>{let E=JSON.parse(l);this.emit("error",E),x(E)}),o.on("content",l=>{let E=JSON.parse(l);this.emit("content",E.text)}),o.on("stop",l=>{let E=JSON.parse(l);this.emit("stop",E.result),f(E.result)})});let m={method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(a)};return o.start(i,m).catch(f=>{throw this.emit("error",{message:f.message}),f}),u})}sendMessage(e,t){return g(this,null,function*(){if(!this.conversationId)throw new Error("Conversation not initialized");let s=this.agentVersion?`/${this.agentVersion}`:"",i=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${s}`,a=c(this,h,B).call(this,e,!1,t),o=yield fetch(i,{method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(a)});if(o.status===429){let f=parseInt(o.headers.get("Retry-After")||"60");throw new Error(`Rate limit exceeded. Retry after ${f} seconds`)}let u=yield o.json();if(o.status!==200)throw new Error(u.message||"Failed to execute message");return A.mapAgentResultToSnakeCase(u)})}};h=new WeakSet,Q=function(){return g(this,null,function*(){if(this.conversationId)return;let e=this.agentVersion?`/${this.agentVersion}`:"",t=`${this.baseUrl}/v2/agent/${this.agentCode}/conversation${e}`,s={};c(this,h,te).call(this,s);let i=yield fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(s)});if(i.status===429){let u=parseInt(i.headers.get("Retry-After")||"60");throw new Error(`Rate limit exceeded. Retry after ${u} seconds`)}let a=yield i.json();if(i.status!==200)throw new Error(a.message||"Failed to initialize conversation");let o=a;this.conversationId=o.chatId})},B=function(e,t,s){let i=[{Key:"chatId",Value:this.conversationId},{Key:"message",Value:e},{Key:"stream",Value:t.toString()}];return c(this,h,$).call(this,i,s==null?void 0:s.inputParameters),c(this,h,se).call(this,i,s==null?void 0:s.volatileKnowledgeIds),c(this,h,Z).call(this,i),c(this,h,ee).call(this,i),i},Z=function(e){this.userIdentifier&&e.push({Key:"userIdentifier",Value:this.userIdentifier})},ee=function(e){this.channel&&e.push({Key:"channel",Value:this.channel})},$=function(e,t={}){if(!(!t||Object.keys(t).length===0))for(let[s,i]of Object.entries(t))e.push({Key:s,Value:i})},te=function(e){this.userIdentifier&&(e.userIdentifier=this.userIdentifier),this.inputParameters&&(e.inputParameters=[],c(this,h,$).call(this,e.inputParameters,this.inputParameters))},se=function(e,t){!t||t.length===0||e.push({Key:"volatileKnowledgeIds",Value:t})};var K=_;var P=class{constructor(n,e,t,s){this.agentCode=n;this.apiKey=e;this.baseUrl=t;this.options=s}createRealtimeSession(n,e,t,s){return new O(n,e,t,s)}createConversation(n,e,t,s){return g(this,null,function*(){return yield K.create(n,e,t,s)})}};var w=class r extends P{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}};var T=class r extends P{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}};var d=class extends v{constructor(e,t,s,i){super();this.agentCode=e;this.apiKey=t;this.baseUrl=s;this.options=i}stream(){return g(this,null,function*(){var u;let e=(u=this.options)!=null&&u.agentVersion?`/${this.options.agentVersion}`:"",t=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${e}`,s=this.createExecuteBody(!0),i=new C,a;a=new Promise((m,f)=>{i.on("start",()=>{this.emit("start")}),i.on("error",x=>{let l=JSON.parse(x);this.emit("error",l),f(l)}),i.on("content",x=>{let l=JSON.parse(x);this.emit("content",l.text)}),i.on("stop",x=>{let l=JSON.parse(x);this.emit("stop",l.result),m(l.result)})});let o={method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(s)};return i.start(t,o).catch(m=>{throw this.emit("error",{message:m.message}),m}),a})}execute(){return g(this,null,function*(){var o;let e=(o=this.options)!=null&&o.agentVersion?`/${this.options.agentVersion}`:"",t=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${e}`,s=this.createExecuteBody(!1),i=yield fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(s)});if(i.status===429){let u=parseInt(i.headers.get("Retry-After")||"60");throw new Error(`Rate limit exceeded. Retry after ${u} seconds`)}let a=yield i.json();if(i.status!==200)throw new Error(a.message||"Failed to execute message");return A.mapAgentResultToSnakeCase(a)})}createExecuteBody(e){let t=[{Key:"stream",Value:e.toString()}];return this.appendVolatileKnowledgeIdsIfNeeded(t),this.appendUserIdentifierIfNeeded(t),this.appendChannelIfNeeded(t),t}appendUserIdentifierIfNeeded(e){var t;(t=this.options)!=null&&t.userIdentifier&&e.push({Key:"userIdentifier",Value:this.options.userIdentifier})}appendVolatileKnowledgeIdsIfNeeded(e){var t;!((t=this.options)!=null&&t.volatileKnowledgeIds)||this.options.volatileKnowledgeIds.length===0||e.push({Key:"volatileKnowledgeIds",Value:this.options.volatileKnowledgeIds})}appendChannelIfNeeded(e){var t;(t=this.options)!=null&&t.channel&&e.push({Key:"channel",Value:this.options.channel})}};var I=class r extends d{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}static createAndExecute(n,e,t,s){return new r(n,e,t,s).execute()}createExecuteBody(n){let e=super.createExecuteBody(n);return this.appendInputParametersIfNeeded(e),e}appendInputParametersIfNeeded(n){var e;if(!(!((e=this.options)!=null&&e.inputParameters)||Object.keys(this.options.inputParameters).length===0))for(let[t,s]of Object.entries(this.options.inputParameters))n.push({Key:t,Value:s})}};var b=class r extends d{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}static createAndExecute(n,e,t,s){return new r(n,e,t,s).execute()}createExecuteBody(n){let e=super.createExecuteBody(n);return this.appendMessagesIfNeeded(e),this.appendMessageIfNeeded(e),this.appendInputParametersIfNeeded(e),e}appendMessagesIfNeeded(n){var e;!((e=this.options)!=null&&e.messages)||this.options.messages.length===0||n.push({Key:"messages",Value:JSON.stringify(this.options.messages)})}appendMessageIfNeeded(n){var e;(e=this.options)!=null&&e.message&&n.push({Key:"message",Value:this.options.message})}appendInputParametersIfNeeded(n){var e;if(!(!((e=this.options)!=null&&e.inputParameters)||Object.keys(this.options.inputParameters).length===0))for(let[t,s]of Object.entries(this.options.inputParameters))n.push({Key:t,Value:s})}};var k=class r extends d{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}static createAndExecute(n,e,t,s){return new r(n,e,t,s).execute()}createExecuteBody(n){let e=super.createExecuteBody(n);return this.appendInputParametersIfNeeded(e),e}appendInputParametersIfNeeded(n){var e;if(!(!((e=this.options)!=null&&e.inputParameters)||Object.keys(this.options.inputParameters).length===0))for(let[t,s]of Object.entries(this.options.inputParameters))n.push({Key:t,Value:s})}};var R=class r extends d{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}static createAndExecute(n,e,t,s){return new r(n,e,t,s).execute()}createExecuteBody(n){let e=this.options;return{model:e.model,messages:e.messages,frequency_penalty:e.frequency_penalty,max_tokens:e.max_tokens,presence_penalty:e.presence_penalty,temperature:e.temperature,top_p:e.top_p,top_k:e.top_k,vendor:e.vendor,userIdentifier:e.userIdentifier,groupIdentifier:e.groupIdentifier,useVision:e.useVision,stream:n}}};var y=class{static createAgent(n,e,t){switch(n){case"assistant":return{createConversation:(s,i)=>g(this,null,function*(){return yield w.create(s,e,t,i).createConversation(s,e,t,i)}),createRealtimeSession:(s,i)=>w.create(s,e,t,i).createRealtimeSession(s,e,t,i)};case"copilot":return{createConversation:(s,i)=>g(this,null,function*(){return yield T.create(s,e,t,i).createConversation(s,e,t,i)}),createRealtimeSession:(s,i)=>T.create(s,e,t,i).createRealtimeSession(s,e,t,i)};case"activity":return{execute:(s,i)=>I.createAndExecute(s,e,t,i),create:(s,i)=>I.create(s,e,t,i)};case"chat-completion":return{execute:(s,i)=>b.createAndExecute(s,e,t,i),create:(s,i)=>b.create(s,e,t,i)};case"proxy":return{execute:(s,i)=>R.createAndExecute(s,e,t,i),create:(s,i)=>R.create(s,e,t,i)};case"plan":return{execute:(s,i)=>k.createAndExecute(s,e,t,i),create:(s,i)=>k.create(s,e,t,i)};default:throw new Error(`Agent type ${n} not supported`)}}};var V=class{constructor(n){this.baseUrl="https://api.serenitystar.ai/api";if(!n.apiKey)throw new Error("The API key is required");this.apiKey=n.apiKey,this.baseUrl=n.baseUrl||this.baseUrl,this.agents={assistants:y.createAgent("assistant",this.apiKey,this.baseUrl),copilots:y.createAgent("copilot",this.apiKey,this.baseUrl),activities:y.createAgent("activity",this.apiKey,this.baseUrl),chatCompletions:y.createAgent("chat-completion",this.apiKey,this.baseUrl),proxies:y.createAgent("proxy",this.apiKey,this.baseUrl),plans:y.createAgent("plan",this.apiKey,this.baseUrl)}}};export{O as RealtimeSession,V as SerenityClient};
4
+ `,t=e+e;for(;(n=this.buffer.indexOf(t))!==-1;){let s=this.buffer.slice(0,n).trim();this.buffer=this.buffer.slice(n+t.length);let i=s.split(e),a={};for(let o of i)o.startsWith("data:")?a.data=o.slice(5).trim():o.startsWith("event:")&&(a.event=o.slice(6).trim());this.trigger(a.event||"message",a.data)}}on(n,e){this.eventListeners[n]||(this.eventListeners[n]=[]),this.eventListeners[n].push(e)}off(n,e){let t=this.eventListeners[n];t&&(this.eventListeners[n]=t.filter(s=>s!==e))}trigger(n,e){let t=this.eventListeners[n];t&&t.forEach(s=>s(e))}stop(){this.active=!1}};var S=class{};S.mapAgentResultToSnakeCase=n=>({content:n.content,instance_id:n.instanceId,action_results:n.actionResults,completion_usage:n.completionUsage,executor_task_logs:n.executorTaskLogs,json_content:n.jsonContent,meta_analysis:n.metaAnalysis,time_to_first_token:n.timeToFirstToken});var h,Q,B,Z,ee,$,te,se,_=class _ extends v{constructor(e,t,s,i){super();M(this,h);this.apiKey=t,this.agentCode=e,this.baseUrl=s,this.agentVersion=i==null?void 0:i.agentVersion,this.inputParameters=i==null?void 0:i.inputParameters,this.userIdentifier=i==null?void 0:i.userIdentifier,this.channel=i==null?void 0:i.channel}static create(e,t,s,i){return u(this,null,function*(){var o;let a=new _(e,t,s,i);return yield c(o=a,h,Q).call(o),a})}streamMessage(e,t){return u(this,null,function*(){if(!this.conversationId)throw new Error("Conversation not initialized");let s=this.agentVersion?`/${this.agentVersion}`:"",i=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${s}`,a=c(this,h,B).call(this,e,!0,t),o=new C,g;return g=new Promise((m,A)=>u(this,null,function*(){o.on("start",()=>{this.emit("start")}),o.on("error",l=>{let x=JSON.parse(l);this.emit("error",x),A(x)}),o.on("content",l=>{let x=JSON.parse(l);this.emit("content",x.text)}),o.on("stop",l=>{let x=JSON.parse(l);this.emit("stop",x.result),m(x.result)});let y={method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(a)};try{yield o.start(i,y)}catch(l){A(l)}})),g})}sendMessage(e,t){return u(this,null,function*(){if(!this.conversationId)throw new Error("Conversation not initialized");let s=this.agentVersion?`/${this.agentVersion}`:"",i=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${s}`,a=c(this,h,B).call(this,e,!1,t),o=yield fetch(i,{method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(a)});if(o.status===429){let A=parseInt(o.headers.get("Retry-After")||"60");throw new Error(`Rate limit exceeded. Retry after ${A} seconds`)}let g=yield o.json();if(o.status!==200)throw new Error(g.message||"Failed to execute message");return S.mapAgentResultToSnakeCase(g)})}};h=new WeakSet,Q=function(){return u(this,null,function*(){if(this.conversationId)return;let e=this.agentVersion?`/${this.agentVersion}`:"",t=`${this.baseUrl}/v2/agent/${this.agentCode}/conversation${e}`,s={};c(this,h,te).call(this,s);let i=yield fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(s)});if(i.status===429){let g=parseInt(i.headers.get("Retry-After")||"60");throw new Error(`Rate limit exceeded. Retry after ${g} seconds`)}let a=yield i.json();if(i.status!==200)throw new Error(a.message||"Failed to initialize conversation");let o=a;this.conversationId=o.chatId})},B=function(e,t,s){let i=[{Key:"chatId",Value:this.conversationId},{Key:"message",Value:e},{Key:"stream",Value:t.toString()}];return c(this,h,$).call(this,i,s==null?void 0:s.inputParameters),c(this,h,se).call(this,i,s==null?void 0:s.volatileKnowledgeIds),c(this,h,Z).call(this,i),c(this,h,ee).call(this,i),i},Z=function(e){this.userIdentifier&&e.push({Key:"userIdentifier",Value:this.userIdentifier})},ee=function(e){this.channel&&e.push({Key:"channel",Value:this.channel})},$=function(e,t={}){if(!(!t||Object.keys(t).length===0))for(let[s,i]of Object.entries(t))e.push({Key:s,Value:i})},te=function(e){this.userIdentifier&&(e.userIdentifier=this.userIdentifier),this.inputParameters&&(e.inputParameters=[],c(this,h,$).call(this,e.inputParameters,this.inputParameters))},se=function(e,t){!t||t.length===0||e.push({Key:"volatileKnowledgeIds",Value:t})};var K=_;var P=class{constructor(n,e,t,s){this.agentCode=n;this.apiKey=e;this.baseUrl=t;this.options=s}createRealtimeSession(n,e,t,s){return new O(n,e,t,s)}createConversation(n,e,t,s){return u(this,null,function*(){return yield K.create(n,e,t,s)})}};var w=class r extends P{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}};var T=class r extends P{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}};var d=class extends v{constructor(e,t,s,i){super();this.agentCode=e;this.apiKey=t;this.baseUrl=s;this.options=i}stream(){return u(this,null,function*(){var o;let e=(o=this.options)!=null&&o.agentVersion?`/${this.options.agentVersion}`:"",t=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${e}`,s=this.createExecuteBody(!0),i=new C,a;return a=new Promise((g,m)=>u(this,null,function*(){i.on("start",()=>{this.emit("start")}),i.on("error",y=>{let l=JSON.parse(y);this.emit("error",l),m(l)}),i.on("content",y=>{let l=JSON.parse(y);this.emit("content",l.text)}),i.on("stop",y=>{let l=JSON.parse(y);this.emit("stop",l.result),g(l.result)});let A={method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(s)};try{yield i.start(t,A)}catch(y){m(y)}})),a})}execute(){return u(this,null,function*(){var o;let e=(o=this.options)!=null&&o.agentVersion?`/${this.options.agentVersion}`:"",t=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${e}`,s=this.createExecuteBody(!1),i=yield fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(s)});if(i.status===429){let g=parseInt(i.headers.get("Retry-After")||"60");throw new Error(`Rate limit exceeded. Retry after ${g} seconds`)}let a=yield i.json();if(i.status!==200)throw new Error(a.message||"Failed to execute message");return S.mapAgentResultToSnakeCase(a)})}createExecuteBody(e){let t=[{Key:"stream",Value:e.toString()}];return this.appendVolatileKnowledgeIdsIfNeeded(t),this.appendUserIdentifierIfNeeded(t),this.appendChannelIfNeeded(t),t}appendUserIdentifierIfNeeded(e){var t;(t=this.options)!=null&&t.userIdentifier&&e.push({Key:"userIdentifier",Value:this.options.userIdentifier})}appendVolatileKnowledgeIdsIfNeeded(e){var t;!((t=this.options)!=null&&t.volatileKnowledgeIds)||this.options.volatileKnowledgeIds.length===0||e.push({Key:"volatileKnowledgeIds",Value:this.options.volatileKnowledgeIds})}appendChannelIfNeeded(e){var t;(t=this.options)!=null&&t.channel&&e.push({Key:"channel",Value:this.options.channel})}};var I=class r extends d{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}static createAndExecute(n,e,t,s){return new r(n,e,t,s).execute()}createExecuteBody(n){let e=super.createExecuteBody(n);return this.appendInputParametersIfNeeded(e),e}appendInputParametersIfNeeded(n){var e;if(!(!((e=this.options)!=null&&e.inputParameters)||Object.keys(this.options.inputParameters).length===0))for(let[t,s]of Object.entries(this.options.inputParameters))n.push({Key:t,Value:s})}};var b=class r extends d{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}static createAndExecute(n,e,t,s){return new r(n,e,t,s).execute()}createExecuteBody(n){let e=super.createExecuteBody(n);return this.appendMessagesIfNeeded(e),this.appendMessageIfNeeded(e),this.appendInputParametersIfNeeded(e),e}appendMessagesIfNeeded(n){var e;!((e=this.options)!=null&&e.messages)||this.options.messages.length===0||n.push({Key:"messages",Value:JSON.stringify(this.options.messages)})}appendMessageIfNeeded(n){var e;(e=this.options)!=null&&e.message&&n.push({Key:"message",Value:this.options.message})}appendInputParametersIfNeeded(n){var e;if(!(!((e=this.options)!=null&&e.inputParameters)||Object.keys(this.options.inputParameters).length===0))for(let[t,s]of Object.entries(this.options.inputParameters))n.push({Key:t,Value:s})}};var k=class r extends d{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}static createAndExecute(n,e,t,s){return new r(n,e,t,s).execute()}createExecuteBody(n){let e=super.createExecuteBody(n);return this.appendInputParametersIfNeeded(e),e}appendInputParametersIfNeeded(n){var e;if(!(!((e=this.options)!=null&&e.inputParameters)||Object.keys(this.options.inputParameters).length===0))for(let[t,s]of Object.entries(this.options.inputParameters))n.push({Key:t,Value:s})}};var R=class r extends d{constructor(n,e,t,s){super(n,e,t,s)}static create(n,e,t,s){return new r(n,e,t,s)}static createAndExecute(n,e,t,s){return new r(n,e,t,s).execute()}createExecuteBody(n){let e=this.options;return{model:e.model,messages:e.messages,frequency_penalty:e.frequency_penalty,max_tokens:e.max_tokens,presence_penalty:e.presence_penalty,temperature:e.temperature,top_p:e.top_p,top_k:e.top_k,vendor:e.vendor,userIdentifier:e.userIdentifier,groupIdentifier:e.groupIdentifier,useVision:e.useVision,stream:n}}};var f=class{static createAgent(n,e,t){switch(n){case"assistant":return{createConversation:(s,i)=>u(this,null,function*(){return yield w.create(s,e,t,i).createConversation(s,e,t,i)}),createRealtimeSession:(s,i)=>w.create(s,e,t,i).createRealtimeSession(s,e,t,i)};case"copilot":return{createConversation:(s,i)=>u(this,null,function*(){return yield T.create(s,e,t,i).createConversation(s,e,t,i)}),createRealtimeSession:(s,i)=>T.create(s,e,t,i).createRealtimeSession(s,e,t,i)};case"activity":return{execute:(s,i)=>I.createAndExecute(s,e,t,i),create:(s,i)=>I.create(s,e,t,i)};case"chat-completion":return{execute:(s,i)=>b.createAndExecute(s,e,t,i),create:(s,i)=>b.create(s,e,t,i)};case"proxy":return{execute:(s,i)=>R.createAndExecute(s,e,t,i),create:(s,i)=>R.create(s,e,t,i)};case"plan":return{execute:(s,i)=>k.createAndExecute(s,e,t,i),create:(s,i)=>k.create(s,e,t,i)};default:throw new Error(`Agent type ${n} not supported`)}}};var V=class{constructor(n){this.baseUrl="https://api.serenitystar.ai/api";if(!n.apiKey)throw new Error("The API key is required");this.apiKey=n.apiKey,this.baseUrl=n.baseUrl||this.baseUrl,this.agents={assistants:f.createAgent("assistant",this.apiKey,this.baseUrl),copilots:f.createAgent("copilot",this.apiKey,this.baseUrl),activities:f.createAgent("activity",this.apiKey,this.baseUrl),chatCompletions:f.createAgent("chat-completion",this.apiKey,this.baseUrl),proxies:f.createAgent("proxy",this.apiKey,this.baseUrl),plans:f.createAgent("plan",this.apiKey,this.baseUrl)}}};export{O as RealtimeSession,V as SerenityClient};
5
5
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/polyfill.ts","../src/EventEmitter.ts","../src/scopes/conversational/RealtimeSession/index.ts","../src/scopes/conversational/Conversation/SseConnection.ts","../src/utils/AgentMapper.ts","../src/scopes/conversational/Conversation/index.ts","../src/scopes/conversational/ConversationalAgent.ts","../src/scopes/conversational/Assistant.ts","../src/scopes/conversational/Copilot.ts","../src/scopes/system/SystemAgent.ts","../src/scopes/system/Activity.ts","../src/scopes/system/ChatCompletion.ts","../src/scopes/system/Plan.ts","../src/scopes/system/Proxy.ts","../src/factories/AgentFactory.ts","../src/SerenityClient.ts"],"sourcesContent":["let undiciFetch, UndiciHeaders, UndiciRequest, UndiciResponse;\n\nif (typeof process !== 'undefined' && process.versions?.node) {\n // Only import undici in Node.js environment\n const undici = require('undici');\n undiciFetch = undici.fetch;\n UndiciHeaders = undici.Headers;\n UndiciRequest = undici.Request;\n UndiciResponse = undici.Response;\n\n if (!globalThis.fetch) {\n globalThis.fetch = undiciFetch as unknown as typeof globalThis.fetch;\n globalThis.Headers = UndiciHeaders as unknown as typeof globalThis.Headers;\n globalThis.Request = UndiciRequest as unknown as typeof globalThis.Request;\n globalThis.Response = UndiciResponse as unknown as typeof globalThis.Response;\n }\n}\n\nexport {\n undiciFetch as fetch,\n UndiciHeaders as Headers,\n UndiciRequest as Request,\n UndiciResponse as Response\n};\n","export class EventEmitter<T extends Record<string, (...args: any[]) => void>> {\n private listeners: { [K in keyof T]?: Array<T[K]> } = {};\n\n on<K extends keyof T>(eventName: K, listener: T[K]): this {\n if (!this.listeners[eventName]) {\n this.listeners[eventName] = [];\n }\n this.listeners[eventName]!.push(listener);\n return this;\n }\n\n emit<K extends keyof T>(eventName: K, ...args: Parameters<T[K]>): void {\n this.listeners[eventName]?.forEach((listener) => listener(...args));\n }\n}","import { EventEmitter } from \"../../../EventEmitter\";\nimport {\n AgentExecutionOptions,\n AgentExecutionOptionsWithParameters,\n} from \"../../../types\";\nimport {\n RealtimeSessionEvents,\n SerenitySessionCreateEvent,\n SerenityEvent,\n SerenitySessionCreatedEvent,\n SerenitySessionCloseEvent,\n SerenitySessionErrorEvent,\n SDPConfiguration,\n SerenityResponseProcessedEvent,\n} from \"./types\";\n\nexport class RealtimeSession extends EventEmitter<RealtimeSessionEvents> {\n private agentCode: string;\n private apiKey: string;\n private baseUrl: string;\n\n // Optional parameters.\n private inputParameters?: { [key: string]: any };\n private userIdentifier?: string;\n private agentVersion?: number;\n private channel?: string;\n\n private inactivityTimeout?: NodeJS.Timeout;\n private timeout = 120000; // 2 minutes\n\n // WebRTC configuration.\n private sessionConfiguration?: SDPConfiguration;\n private peerConnection?: RTCPeerConnection;\n private localStream?: MediaStream;\n private dataChannel?: RTCDataChannel;\n\n // WebSockets configuration.\n private socket?: WebSocket;\n\n constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptionsWithParameters\n ) {\n super();\n this.apiKey = apiKey;\n this.agentCode = agentCode;\n this.baseUrl = baseUrl;\n\n this.agentVersion = options?.agentVersion;\n this.inputParameters = options?.inputParameters;\n this.userIdentifier = options?.userIdentifier;\n this.channel = options?.channel;\n }\n\n // #region Public methods\n\n /**\n * Starts the real-time session.\n */\n async start(): Promise<void> {\n try {\n this.#setupWebSocketConnection();\n } catch (error) {\n throw new Error(`Error starting the session`);\n }\n }\n\n /**\n * Stops the real-time session.\n */\n stop(): void {\n this.#stop();\n }\n\n /**\n * Allows the user to mute the microphone during a real-time voice session.\n */\n muteMicrophone(): void {\n if (this.localStream) {\n const audioTrack = this.localStream.getAudioTracks()[0];\n if (audioTrack) {\n audioTrack.enabled = false;\n }\n }\n }\n\n /**\n * Allows the user to unmute the microphone during a real-time voice session.\n */\n unmuteMicrophone(): void {\n if (this.localStream) {\n const audioTrack = this.localStream.getAudioTracks()[0];\n if (audioTrack) {\n audioTrack.enabled = true;\n }\n }\n }\n // #endregion\n\n // #region Private methods\n\n /**\n * Internal method to stop the session. Allows for a reason and details to be provided.\n * @param reason The reason for stopping the session.\n * @param details Additional details about the stop event.\n */\n #stop(reason?: string, details?: any): void {\n // Send a closure message to the server if socket is connected\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n try {\n // Close the WebSocket connection properly\n this.socket.close(1000, \"Client closed the session\");\n } catch (error) {\n console.error(\"Error closing WebSocket connection:\", error);\n }\n }\n \n // Stop the local audio tracks.\n if (this.localStream) {\n this.localStream.getTracks().forEach((track) => track.stop());\n this.localStream = undefined;\n }\n \n // Close the WebRTC connection if it is open.\n this.peerConnection && this.peerConnection.close();\n \n // Reset variables\n this.socket = undefined;\n this.dataChannel = undefined;\n this.peerConnection = undefined;\n\n this.emit(\"session.stopped\", reason, details);\n clearTimeout(this.inactivityTimeout);\n }\n\n #setupWebSocketConnection() {\n let url = `${this.baseUrl}/v2/agent/${this.agentCode}/realtime`;\n\n if (this.agentVersion) {\n url += `/${this.agentVersion}`;\n }\n\n this.socket = new WebSocket(url, [\"X-API-KEY\", this.apiKey]);\n\n this.socket.onopen = () => {\n const sessionCreateEvent: SerenitySessionCreateEvent = {\n type: \"serenity.session.create\",\n input_parameters: this.inputParameters,\n user_identifier: this.userIdentifier,\n channel: this.channel,\n };\n\n this.socket!.send(JSON.stringify(sessionCreateEvent));\n };\n\n this.socket.onclose = () => {\n this.#stop();\n };\n\n this.socket.onerror = (event) => {\n this.emit(\"error\", \"Error connecting to the server\");\n this.#stop();\n };\n\n this.socket.onmessage = (event) => {\n this.#handleIncomingMessagesFromSerenity(event.data);\n };\n }\n\n async #handleIncomingMessagesFromSerenity(data: string) {\n const obj = JSON.parse(data) as SerenityEvent;\n switch (obj.type) {\n case \"serenity.session.created\": {\n const eventData = obj as SerenitySessionCreatedEvent;\n this.sessionConfiguration = {\n url: eventData.url,\n headers: eventData.headers,\n };\n\n // Setup the WebRTC connection.\n this.#setupWebRTCConnection();\n\n // Add listeners for the WebRTC connection.\n this.#handleIncomingMessagesFromVendor();\n\n // Start the session.\n await this.#startSession();\n\n break;\n }\n case \"serenity.session.close\": {\n const eventData = obj as SerenitySessionCloseEvent;\n const errorDetails = this.#extractErrorMessageFromEvent(eventData);\n this.emit(\"error\", errorDetails);\n this.#stop(eventData.reason, errorDetails);\n break;\n }\n case \"serenity.response.processed\": {\n const eventData = obj as SerenityResponseProcessedEvent;\n this.emit(\"response.processed\", eventData.result);\n break;\n }\n default: {\n const isSerenityEvent = obj.type.startsWith(\"serenity\");\n if (this.dataChannel && !isSerenityEvent) {\n this.dataChannel.send(JSON.stringify(obj));\n }\n }\n }\n }\n\n #handleIncomingMessagesFromVendor() {\n if (!this.peerConnection) {\n throw new Error(\n `Could not add listeners: WebRTC connection not initialized`\n );\n }\n // Set up data channel for sending and receiving events\n const currentDate = new Date()\n .toISOString()\n .replace(/T/, \"-\")\n .replace(/:/g, \"-\")\n .replace(/\\..+/, \"\");\n const channelName = `data-channel-${this.agentCode}-${currentDate}`;\n this.dataChannel = this.peerConnection.createDataChannel(channelName);\n\n this.dataChannel.addEventListener(\"message\", (e: MessageEvent) => {\n this.#resetInactivityTimeout();\n const data = JSON.parse(e.data);\n\n try {\n switch (data.type) {\n case \"input_audio_buffer.speech_started\": {\n this.emit(\"speech.started\");\n break;\n }\n case \"input_audio_buffer.speech_stopped\": {\n this.emit(\"speech.stopped\");\n break;\n }\n\n case \"response.done\": {\n this.emit(\"response.done\");\n break;\n }\n case \"error\": {\n this.emit(\"error\", \"There was an error processing your request\");\n break;\n }\n }\n } catch (error) {\n this.emit(\"error\", \"Error processing incoming messages from vendor\");\n } finally {\n // Forward the message to the server\n if (this.socket) {\n this.socket.send(JSON.stringify(data));\n }\n }\n });\n }\n\n #setupWebRTCConnection() {\n // Create the peer connection.\n this.peerConnection = new RTCPeerConnection();\n\n // Configure remote audio playback.\n const audioElement = document.createElement(\"audio\");\n audioElement.autoplay = true;\n\n this.peerConnection.ontrack = (event) => {\n if (event.streams && event.streams[0]) {\n audioElement.srcObject = event.streams[0];\n }\n };\n }\n\n async #getAudioFromMicrophone(): Promise<void> {\n if (!this.peerConnection) {\n throw new Error(\n `Could not start the session: WebRTC connection not initialized`\n );\n }\n\n this.localStream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n\n const audioTrack = this.localStream.getTracks()[0];\n this.peerConnection.addTrack(audioTrack, this.localStream);\n }\n\n async #startSession() {\n if (!this.peerConnection) {\n throw new Error(\n `Could not start the session: WebRTC connection not initialized`\n );\n }\n\n if (!this.sessionConfiguration) {\n throw new Error(\n `Could not start the session: Session configuration not available`\n );\n }\n\n try {\n // Get the audio from the microphone.\n await this.#getAudioFromMicrophone();\n\n // Start the session using the Session Description Protocol (SDP)\n const offer = await this.peerConnection.createOffer();\n await this.peerConnection.setLocalDescription(offer);\n\n const sdpResponse = await fetch(`${this.sessionConfiguration.url}`, {\n method: \"POST\",\n body: offer.sdp,\n headers: this.sessionConfiguration.headers,\n });\n\n if (!sdpResponse.ok) {\n throw new Error(\"Error starting the session\");\n }\n\n const answer: RTCSessionDescriptionInit = {\n type: \"answer\",\n sdp: await sdpResponse.text(),\n };\n\n await this.peerConnection.setRemoteDescription(answer);\n\n this.emit(\"session.created\");\n this.#resetInactivityTimeout();\n } catch (error) {\n this.emit(\"error\", \"Error starting the session\");\n this.#stop();\n }\n }\n\n #resetInactivityTimeout() {\n clearTimeout(this.inactivityTimeout);\n this.inactivityTimeout = setTimeout(() => {\n this.#stop();\n }, this.timeout);\n }\n\n #extractErrorMessageFromEvent(eventData: SerenitySessionErrorEvent) {\n switch (eventData.reason) {\n case \"Exception\":\n return eventData.message;\n case \"ValidationException\": {\n if (!eventData.errors) return eventData.message;\n\n return Object.values(eventData.errors).join(\". \");\n }\n default:\n return eventData.message;\n }\n }\n // #endregion\n}\n","/**\n * Interface representing the structure of event data.\n */\ninterface SseEventData {\n start_time_utc?: string;\n stop_time_utc?: string;\n message?: string;\n}\n\n/**\n * Interface representing the event object with optional event and data properties.\n */\ninterface Event {\n event?: string;\n data?: string;\n}\n\n/**\n * Type for the event listeners.\n */\ntype ConnectionEventListener = (data: string) => void;\n\n/**\n * Class representing a server-sent events (SSE) connection.\n */\nexport class SseConnection {\n private eventListeners: Record<string, ConnectionEventListener[]>;\n private active: boolean;\n private buffer: string = \"\";\n\n /**\n * Creates an instance of SseConnection.\n * @param options - Options for the SSE connection.\n */\n constructor() {\n this.eventListeners = {\n start: [\n (_: string) => {\n },\n ],\n stop: [\n (_: string) => {\n this.stop();\n },\n ],\n error: [\n (_: string) => {\n this.stop();\n },\n ],\n };\n this.active = false;\n }\n\n /**\n * Connects to the SSE server and listens for events.\n * @param url - The URL to connect to for SSE.\n * @param fetchOptions - Additional fetch options.\n * @returns A promise that resolves with the response when the connection is active.\n * @throws Will throw an error if the response is not an event stream.\n */\n async start(\n url: string,\n fetchOptions: RequestInit\n ): Promise<Response> {\n this.active = true;\n try {\n const response = await fetch(url, fetchOptions);\n const contentType = response.headers.get(\"Content-Type\");\n\n if (contentType !== \"text/event-stream\") {\n return response;\n }\n\n const reader = response.body!.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n this.buffer = \"\";\n\n while (this.active) {\n const { done, value } = await reader.read();\n if (done) break;\n\n this.buffer += decoder.decode(value, { stream: true });\n this.processEvents();\n }\n\n return response;\n } catch (error) {\n console.error(\"Error in SSE connection:\", error);\n this.active = false;\n throw error;\n }\n }\n\n /**\n * Processes the event data from the buffer.\n */\n private processEvents(): void {\n let eventEnd: number;\n const lineEnding = this.buffer.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const eventDelimiter = lineEnding + lineEnding;\n while ((eventEnd = this.buffer.indexOf(eventDelimiter)) !== -1) {\n const eventText = this.buffer.slice(0, eventEnd).trim();\n this.buffer = this.buffer.slice(eventEnd + eventDelimiter.length);\n\n const lines = eventText.split(lineEnding);\n const event: Event = {};\n for (let line of lines) {\n if (line.startsWith(\"data:\")) {\n event.data = line.slice(\"data:\".length).trim();\n } else if (line.startsWith(\"event:\")) {\n event.event = line.slice(\"event:\".length).trim();\n }\n }\n\n this.trigger(event.event || \"message\", event.data!);\n }\n }\n\n /**\n * Registers an event listener for a specific event type.\n * @param eventType - The type of event to listen for.\n * @param callback - The callback function to execute when the event occurs.\n */\n on(eventType: string, callback: ConnectionEventListener): void {\n if (!this.eventListeners[eventType]) {\n this.eventListeners[eventType] = [];\n }\n this.eventListeners[eventType].push(callback);\n }\n\n /**\n * Unregisters an event listener for a specific event type.\n * @param eventType - The type of event to stop listening for.\n * @param callback - The callback function to remove.\n */\n off(eventType: string, callback: ConnectionEventListener): void {\n const listeners = this.eventListeners[eventType];\n if (listeners) {\n this.eventListeners[eventType] = listeners.filter(\n (cb) => cb !== callback\n );\n }\n }\n\n /**\n * Triggers an event and calls all registered listeners for that event type.\n * @param eventType - The type of event to trigger.\n * @param data - The data to pass to the event listeners.\n */\n private trigger(eventType: string, data: string): void {\n const listeners = this.eventListeners[eventType];\n if (listeners) {\n listeners.forEach((callback) => callback(data));\n }\n }\n\n /**\n * Stops the SSE connection.\n */\n stop(): void {\n this.active = false;\n }\n}\n","import { AgentResult } from \"../types\";\n\nexport class AgentMapper {\n public static mapAgentResultToSnakeCase = (data: {\n [key: string]: any;\n }): AgentResult => {\n const result: AgentResult = {\n content: data.content,\n instance_id: data.instanceId,\n action_results: data.actionResults,\n completion_usage: data.completionUsage,\n executor_task_logs: data.executorTaskLogs,\n json_content: data.jsonContent,\n meta_analysis: data.metaAnalysis,\n time_to_first_token: data.timeToFirstToken,\n };\n\n return result;\n };\n}\n","import { EventEmitter } from \"../../../EventEmitter\";\nimport { AgentExecutionOptions, AgentExecutionOptionsWithParameters, AgentResult, ExecuteBodyParams, SSEStreamEvents } from \"../../../types\";\nimport { InitConversationParams, InitConversationResponse, MessageOptions } from \"./types\";\nimport { SseConnection } from \"./SseConnection\";\nimport { AgentMapper } from \"../../../utils/AgentMapper\";\n\nexport class Conversation extends EventEmitter<SSEStreamEvents> {\n private agentCode: string;\n private apiKey: string;\n private baseUrl: string;\n\n // Optional parameters.\n private inputParameters?: { [key: string]: any };\n private userIdentifier?: string;\n private agentVersion?: number;\n private channel?: string;\n\n public conversationId?: string;\n\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptionsWithParameters\n ) {\n super();\n this.apiKey = apiKey;\n this.agentCode = agentCode;\n this.baseUrl = baseUrl;\n\n this.agentVersion = options?.agentVersion;\n this.inputParameters = options?.inputParameters;\n this.userIdentifier = options?.userIdentifier;\n this.channel = options?.channel;\n }\n\n private static async create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ): Promise<Conversation> {\n const instance = new Conversation(agentCode, apiKey, baseUrl, options);\n await instance.#getConversationId();\n return instance;\n }\n\n async #getConversationId(): Promise<void> {\n if (this.conversationId) return;\n\n const version = this.agentVersion ? `/${this.agentVersion}` : '';\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/conversation${version}`;\n let reqBody: InitConversationParams = {};\n\n this.#appendInitConversationParamsIfNeeded(reqBody);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(reqBody),\n });\n\n if (response.status === 429) {\n const retryAfter = parseInt(response.headers.get(\"Retry-After\") || \"60\");\n throw new Error(`Rate limit exceeded. Retry after ${retryAfter} seconds`);\n }\n\n const body = await response.json();\n\n if (response.status !== 200) {\n throw new Error(body.message || \"Failed to initialize conversation\");\n }\n\n const data = body as InitConversationResponse;\n this.conversationId = data.chatId;\n }\n\n async streamMessage(message: string, options?: MessageOptions): Promise<AgentResult> {\n if (!this.conversationId) {\n throw new Error(\"Conversation not initialized\");\n }\n const version = this.agentVersion ? `/${this.agentVersion}` : '';\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n \n let body = this.#createExecuteBody(message, true, options);\n\n const connection = new SseConnection();\n let responsePromise: Promise<AgentResult>;\n\n responsePromise = new Promise((resolve, reject) => {\n connection.on(\"start\", () => {\n this.emit(\"start\");\n });\n\n connection.on(\"error\", (data) => {\n const error = JSON.parse(data);\n this.emit(\"error\", error);\n reject(error);\n });\n\n connection.on(\"content\", (data) => {\n const chunk = JSON.parse(data);\n this.emit(\"content\", chunk.text);\n });\n\n connection.on(\"stop\", (data) => {\n const finalMessage = JSON.parse(data) as { result: AgentResult};\n this.emit(\"stop\", finalMessage.result);\n resolve(finalMessage.result);\n });\n });\n\n const fetchOptions: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n };\n\n connection.start(url, fetchOptions).catch((error) => {\n this.emit(\"error\", { message: error.message });\n throw error;\n });\n\n return responsePromise;\n }\n\n async sendMessage(message: string, options?: MessageOptions): Promise<AgentResult> {\n if (!this.conversationId) {\n throw new Error(\"Conversation not initialized\");\n }\n const version = this.agentVersion ? `/${this.agentVersion}` : '';\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n \n let body = this.#createExecuteBody(message, false, options);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (response.status === 429) {\n const retryAfter = parseInt(response.headers.get(\"Retry-After\") || \"60\");\n throw new Error(`Rate limit exceeded. Retry after ${retryAfter} seconds`);\n }\n\n const data = await response.json();\n if (response.status !== 200) {\n throw new Error(data.message || \"Failed to execute message\");\n }\n\n const mappedData = AgentMapper.mapAgentResultToSnakeCase(data);\n\n return mappedData;\n }\n\n #createExecuteBody(message: string, stream: boolean, options?: MessageOptions): ExecuteBodyParams {\n let body: ExecuteBodyParams = [\n {\n Key: \"chatId\",\n Value: this.conversationId,\n },\n {\n Key: \"message\",\n Value: message,\n },\n {\n Key: \"stream\",\n Value: stream.toString(),\n },\n ];\n\n this.#appendInputParametersIfNeeded(body, options?.inputParameters);\n this.#appendVolatileKnowledgeIdsIfNeeded(body, options?.volatileKnowledgeIds);\n this.#appendUserIdentifierIfNeeded(body);\n this.#appendChannelIfNeeded(body);\n\n return body;\n }\n\n #appendUserIdentifierIfNeeded(body: ExecuteBodyParams) {\n if (this.userIdentifier) {\n body.push({\n Key: \"userIdentifier\",\n Value: this.userIdentifier,\n });\n }\n }\n\n #appendChannelIfNeeded(body: ExecuteBodyParams) {\n if (this.channel) {\n body.push({\n Key: \"channel\",\n Value: this.channel,\n });\n }\n }\n\n #appendInputParametersIfNeeded(body: ExecuteBodyParams, parameters: { [key: string]: any } = {}) {\n if (!parameters || Object.keys(parameters).length === 0) return;\n\n for (const [key, value] of Object.entries(parameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n\n #appendInitConversationParamsIfNeeded(body: InitConversationParams) {\n if (this.userIdentifier) {\n body.userIdentifier = this.userIdentifier;\n }\n\n if (this.inputParameters) {\n body.inputParameters = [];\n this.#appendInputParametersIfNeeded(body.inputParameters, this.inputParameters);\n }\n }\n\n #appendVolatileKnowledgeIdsIfNeeded(body: ExecuteBodyParams, volatileKnowledgeIds?: string[]) {\n if (!volatileKnowledgeIds || volatileKnowledgeIds.length === 0) return;\n\n body.push({\n Key: \"volatileKnowledgeIds\",\n Value: volatileKnowledgeIds,\n });\n }\n}\n","import { AgentExecutionOptions } from \"../../types\";\nimport { ConversationalAgentExecutionOptionsMap } from \"../../types\";\nimport { Conversation } from \"./Conversation\";\nimport { RealtimeSession } from \"./RealtimeSession\";\n\nexport abstract class ConversationalAgent<\n T extends keyof ConversationalAgentExecutionOptionsMap,\n> {\n protected constructor(\n protected readonly agentCode: string,\n protected readonly apiKey: string,\n protected readonly baseUrl: string,\n protected readonly options?: ConversationalAgentExecutionOptionsMap[T]\n ) {}\n\n createRealtimeSession(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ): RealtimeSession {\n return new RealtimeSession(agentCode, apiKey, baseUrl, options);\n }\n\n async createConversation(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ): Promise<Conversation> {\n return await Conversation[\"create\"](agentCode, apiKey, baseUrl, options);\n }\n}\n","import { ConversationalAgentExecutionOptionsMap } from \"../../types\";\nimport { ConversationalAgent } from \"./ConversationalAgent\";\n\nexport class Assistant extends ConversationalAgent<\"assistant\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n \n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ): Assistant {\n return new Assistant(agentCode, apiKey, baseUrl, options);\n }\n}\n","import { AgentExecutionOptions } from \"../../types\";\nimport { ConversationalAgentExecutionOptionsMap } from \"../../types\";\nimport { ConversationalAgent } from \"./ConversationalAgent\";\n\nexport class Copilot extends ConversationalAgent<\"copilot\"> {\n constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: ConversationalAgentExecutionOptionsMap[\"copilot\"]\n ): Copilot {\n return new Copilot(agentCode, apiKey, baseUrl, options);\n }\n}\n","import { EventEmitter } from \"../../EventEmitter\";\nimport { AgentResult, ExecuteBodyParams, SSEStreamEvents } from \"../../types\";\nimport { AgentMapper } from \"../../utils/AgentMapper\";\nimport { SseConnection } from \"../conversational/Conversation/SseConnection\";\nimport { SystemAgentExecutionOptionsMap } from \"./../../types\";\n\nexport abstract class SystemAgent<T extends keyof SystemAgentExecutionOptionsMap> extends EventEmitter<SSEStreamEvents> {\n protected constructor(\n protected readonly agentCode: string,\n protected readonly apiKey: string,\n protected readonly baseUrl: string,\n protected readonly options?: SystemAgentExecutionOptionsMap[T]\n ) {\n super();\n }\n\n async stream(): Promise<AgentResult> {\n const version = this.options?.agentVersion ? `/${this.options.agentVersion}` : \"\";\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n\n let body = this.createExecuteBody(true);\n\n const connection = new SseConnection();\n let responsePromise: Promise<AgentResult>;\n\n responsePromise = new Promise((resolve, reject) => {\n connection.on(\"start\", () => {\n this.emit(\"start\");\n });\n\n connection.on(\"error\", (data) => {\n const error = JSON.parse(data);\n this.emit(\"error\", error);\n reject(error);\n });\n\n connection.on(\"content\", (data) => {\n const chunk = JSON.parse(data);\n this.emit(\"content\", chunk.text);\n });\n\n connection.on(\"stop\", (data) => {\n const finalMessage = JSON.parse(data) as { result: AgentResult };\n this.emit(\"stop\", finalMessage.result);\n resolve(finalMessage.result);\n });\n });\n\n const fetchOptions: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n };\n\n connection.start(url, fetchOptions).catch((error) => {\n this.emit(\"error\", { message: error.message });\n throw error;\n });\n\n return responsePromise;\n }\n\n protected async execute(): Promise<AgentResult> {\n const version = this.options?.agentVersion ? `/${this.options.agentVersion}` : \"\";\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n\n let body = this.createExecuteBody(false);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (response.status === 429) {\n const retryAfter = parseInt(response.headers.get(\"Retry-After\") || \"60\");\n throw new Error(`Rate limit exceeded. Retry after ${retryAfter} seconds`);\n }\n\n const data = await response.json();\n if (response.status !== 200) {\n throw new Error(data.message || \"Failed to execute message\");\n }\n\n return AgentMapper.mapAgentResultToSnakeCase(data);\n }\n\n protected createExecuteBody(stream: boolean): ExecuteBodyParams | {[key: string]: any} {\n let body: ExecuteBodyParams = [\n {\n Key: \"stream\",\n Value: stream.toString(),\n },\n ];\n \n this.appendVolatileKnowledgeIdsIfNeeded(body);\n this.appendUserIdentifierIfNeeded(body);\n this.appendChannelIfNeeded(body);\n \n return body;\n }\n\n protected appendUserIdentifierIfNeeded(body: ExecuteBodyParams) {\n if (this.options?.userIdentifier) {\n body.push({\n Key: \"userIdentifier\",\n Value: this.options.userIdentifier,\n });\n }\n }\n\n protected appendVolatileKnowledgeIdsIfNeeded(body: ExecuteBodyParams) {\n if (!this.options?.volatileKnowledgeIds || this.options.volatileKnowledgeIds.length === 0) return;\n\n body.push({\n Key: \"volatileKnowledgeIds\",\n Value: this.options.volatileKnowledgeIds,\n });\n }\n\n protected appendChannelIfNeeded(body: ExecuteBodyParams) {\n if (this.options?.channel) {\n body.push({\n Key: \"channel\",\n Value: this.options.channel,\n });\n }\n }\n}\n","import { SystemAgent } from \"./SystemAgent\";\nimport {\n ExecuteBodyParams,\n SystemAgentExecutionOptionsMap,\n} from \"./../../types\";\n\nexport class Activity extends SystemAgent<\"activity\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Activity {\n return new Activity(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ) {\n const instance = new Activity(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(\n stream: boolean\n ): ExecuteBodyParams | { [key: string]: any } {\n const baseOptions = super.createExecuteBody(stream);\n\n this.appendInputParametersIfNeeded(baseOptions);\n\n return baseOptions;\n }\n\n private appendInputParametersIfNeeded(\n body: ExecuteBodyParams | { [key: string]: any }\n ) {\n if (\n !this.options?.inputParameters ||\n Object.keys(this.options.inputParameters).length === 0\n )\n return;\n\n for (const [key, value] of Object.entries(this.options.inputParameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n}\n","import { ExecuteBodyParams } from \"../../types\";\nimport { SystemAgentExecutionOptionsMap } from \"./../../types\";\nimport { SystemAgent } from \"./SystemAgent\";\n\nexport class ChatCompletion extends SystemAgent<\"chat-completion\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): ChatCompletion {\n return new ChatCompletion(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ) {\n const instance = new ChatCompletion(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(stream: boolean): ExecuteBodyParams | { [key: string]: any } {\n const body = super.createExecuteBody(stream);\n\n this.appendMessagesIfNeeded(body);\n this.appendMessageIfNeeded(body);\n this.appendInputParametersIfNeeded(body);\n\n return body;\n }\n\n private appendMessagesIfNeeded(body: ExecuteBodyParams | { [key: string]: any }) {\n if (!this.options?.messages || this.options.messages.length === 0) return;\n\n body.push({\n Key: \"messages\",\n Value: JSON.stringify(this.options.messages),\n });\n }\n\n private appendMessageIfNeeded(body: ExecuteBodyParams | { [key: string]: any }) {\n if (!this.options?.message) return;\n\n body.push({\n Key: \"message\",\n Value: this.options.message,\n });\n }\n\n private appendInputParametersIfNeeded(\n body: ExecuteBodyParams | { [key: string]: any }\n ) {\n if (\n !this.options?.inputParameters ||\n Object.keys(this.options.inputParameters).length === 0\n )\n return;\n\n for (const [key, value] of Object.entries(this.options.inputParameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n}\n","import { SystemAgent } from \"./SystemAgent\";\nimport { ExecuteBodyParams, SystemAgentExecutionOptionsMap } from \"../../types\";\n\nexport class Plan extends SystemAgent<\"plan\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ): Plan {\n return new Plan(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ) {\n const instance = new Plan(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(\n stream: boolean\n ): ExecuteBodyParams | { [key: string]: any } {\n const baseOptions = super.createExecuteBody(stream);\n this.appendInputParametersIfNeeded(baseOptions);\n return baseOptions;\n }\n\n private appendInputParametersIfNeeded(\n body: ExecuteBodyParams | { [key: string]: any }\n ) {\n if (\n !this.options?.inputParameters ||\n Object.keys(this.options.inputParameters).length === 0\n )\n return;\n\n for (const [key, value] of Object.entries(this.options.inputParameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n}\n","import { SystemAgent } from \"./SystemAgent\";\nimport { ExecuteBodyParams, SystemAgentExecutionOptionsMap } from \"../../types\";\nimport { ProxyExecutionOptions } from \"./types\";\n\nexport class Proxy extends SystemAgent<\"proxy\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Proxy {\n return new Proxy(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ) {\n const instance = new Proxy(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(stream: boolean): ExecuteBodyParams | { [key: string]: any } {\n const options = this.options as ProxyExecutionOptions;\n \n return {\n model: options.model,\n messages: options.messages,\n frequency_penalty: options.frequency_penalty,\n max_tokens: options.max_tokens,\n presence_penalty: options.presence_penalty,\n temperature: options.temperature,\n top_p: options.top_p,\n top_k: options.top_k,\n vendor: options.vendor,\n userIdentifier: options.userIdentifier,\n groupIdentifier: options.groupIdentifier,\n useVision: options.useVision,\n stream: stream,\n }\n }\n}\n","import { Assistant } from \"../scopes/conversational/Assistant\";\nimport { Conversation } from \"../scopes/conversational/Conversation\";\nimport { Copilot } from \"../scopes/conversational/Copilot\";\nimport { RealtimeSession } from \"../scopes/conversational/RealtimeSession\";\nimport { Activity } from \"../scopes/system/Activity\";\nimport { ChatCompletion } from \"../scopes/system/ChatCompletion\";\nimport { Plan } from \"../scopes/system/Plan\";\nimport { Proxy } from \"../scopes/system/Proxy\";\nimport {\n AgentResult,\n AgentType,\n ConversationalAgentExecutionOptionsMap,\n SystemAgentExecutionOptionsMap,\n} from \"../types\";\n\nexport class AgentFactory {\n static createAgent<T extends AgentType>(\n type: T,\n apiKey: string,\n baseUrl: string\n ): AgentTypeMap[T] {\n switch (type) {\n case \"assistant\": {\n return {\n createConversation: async (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ) => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n const conversation = await assistant.createConversation(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n\n return conversation;\n },\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ) => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n return assistant.createRealtimeSession(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n }\n case \"copilot\":\n return {\n createConversation: async (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"copilot\"]\n ): Promise<Conversation> => {\n const copilot = Copilot.create(agentCode, apiKey, baseUrl, options);\n const conversation = await copilot.createConversation(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n return conversation;\n },\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"copilot\"]\n ) => {\n const copilot = Copilot.create(agentCode, apiKey, baseUrl, options);\n return copilot.createRealtimeSession(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n\n case \"activity\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Promise<AgentResult> => {\n return Activity[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Activity => {\n return Activity[\"create\"](agentCode, apiKey, baseUrl, options);\n },\n } as AgentTypeMap[T];\n }\n case \"chat-completion\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): Promise<AgentResult> => {\n return ChatCompletion[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): ChatCompletion => {\n return ChatCompletion[\"create\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n }\n case \"proxy\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Promise<AgentResult> => {\n return Proxy[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Proxy => {\n return Proxy[\"create\"](agentCode, apiKey, baseUrl, options);\n },\n } as AgentTypeMap[T];\n }\n case \"plan\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ): Promise<AgentResult> => {\n return Plan[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ): Plan => {\n return Plan[\"create\"](agentCode, apiKey, baseUrl, options);\n }\n } as AgentTypeMap[T];\n }\n default:\n throw new Error(`Agent type ${type} not supported`);\n }\n }\n}\n\nexport type ConversationalAgentScope<\n T extends keyof ConversationalAgentExecutionOptionsMap,\n> = {\n /**\n * Create a new conversation with an agent.\n * This allows you to send messages and receive responses.\n * \n * ## Regular conversation example:\n * ```typescript\n * const conversation = await client.agents.assistants.createConversation(\"agent-code\");\n * const response = await conversation.sendMessage(\"Hello!\");\n * console.log(response.content);\n * ```\n * \n * ## Streaming conversation example:\n * ```typescript\n * const conversation = await client.agents.assistants\n * .createConversation(\"agent-code\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"Hello!\");\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the conversation\n * @returns A Promise that resolves to a Conversation instance\n */\n createConversation: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[T]\n ) => Promise<Conversation>;\n\n /**\n * Create a real-time session with an agent.\n * This allows for voice interactions and real-time responses.\n * \n * ## Real-time session example:\n * ```typescript\n * const session = client.agents.assistants\n * .createRealtimeSession(\"agent-code\")\n * .on(\"session.created\", () => console.log(\"Session started\"))\n * .on(\"speech.started\", () => console.log(\"User started talking\"))\n * .on(\"speech.stopped\", () => console.log(\"User stopped talking\"))\n * .on(\"response.done\", (response) => console.log(\"Response:\", response))\n * .on(\"session.stopped\", () => console.log(\"Session stopped\"));\n * \n * await session.start();\n * // Later: session.stop();\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the real-time session\n * @returns A RealtimeSession instance\n */\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[T]\n ) => RealtimeSession;\n};\n\nexport type SystemAgentScope<\n T extends keyof SystemAgentExecutionOptionsMap,\n TCreateReturn,\n> = {\n /**\n * Execute an agent synchronously and get the result.\n * \n * ## Example:\n * ```typescript\n * const response = await client.agents.activities.execute(\"agent-code\", {\n * // Optional parameters specific to the agent type\n * inputParameters: {\n * param1: \"value1\",\n * param2: \"value2\"\n * }\n * });\n * console.log(response.content);\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the execution\n * @returns A Promise that resolves to an AgentResult\n */\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[T]\n ) => Promise<AgentResult>;\n\n /**\n * Create an agent instance for streaming execution.\n * \n * ## Streaming example:\n * ```typescript\n * const agent = client.agents.activities\n * .create(\"agent-code\", {\n * // Optional parameters specific to the agent\n * inputParameters: {\n * param1: \"value1\",\n * param2: \"value2\"\n * }\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await agent.stream();\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the agent creation\n * @returns An agent instance ready for streaming\n */\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[T]\n ) => TCreateReturn;\n};\n\ntype AgentTypeMap = {\n assistant: ConversationalAgentScope<\"assistant\">;\n copilot: ConversationalAgentScope<\"copilot\">;\n activity: SystemAgentScope<\"activity\", Activity>;\n \"chat-completion\": SystemAgentScope<\"chat-completion\", ChatCompletion>;\n proxy: SystemAgentScope<\"proxy\", Proxy>;\n plan: SystemAgentScope<\"plan\", Plan>;\n};\n","import {\n AgentFactory,\n ConversationalAgentScope,\n SystemAgentScope,\n} from \"./factories/AgentFactory\";\nimport { Activity } from \"./scopes/system/Activity\";\nimport { ChatCompletion } from \"./scopes/system/ChatCompletion\";\nimport { Plan } from \"./scopes/system/Plan\";\nimport { Proxy } from \"./scopes/system/Proxy\";\nimport { SerenityClientOptions } from \"./types\";\n\nexport default class SerenityClient {\n private apiKey: string;\n private baseUrl = \"https://api.serenitystar.ai/api\";\n\n /**\n * Interact with the different agents available in Serenity Star.\n * You can choose between assistants, copilots, activities, chat completions, proxies, and plans.\n */\n public readonly agents: {\n /**\n * Interact with Assistant agents available in Serenity Star.\n * This allows you to create conversations and real-time sessions.\n * \n * ## Start a new conversation and send a message:\n * ```typescript\n * // Regular text conversation\n * const conversation = await client.agents.assistants.createConversation(\"translator-assistant\");\n * const response = await conversation.sendMessage(\"The sun was beginning to set...\");\n * console.log(response.content);\n * \n * ```\n * \n * ## Stream message with SSE\n * ```typescript\n * const conversation = await client.agents.assistants\n * .createConversation(\"translator-assistant\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"The sun was beginning to set...\");\n * \n * ```\n * \n * ## Real-time voice conversation example:\n * ```typescript\n * const session = client.agents.assistants.createRealtimeSession(\"marketing-assistant\")\n * .on(\"session.created\", () => console.log(\"Session started\"))\n * .on(\"speech.started\", () => console.log(\"User started talking\"))\n * .on(\"speech.stopped\", () => console.log(\"User stopped talking\"))\n * .on(\"response.done\", (response) => console.log(\"Response:\", response))\n * .on(\"session.stopped\", () => console.log(\"Session stopped\"));\n * \n * await session.start();\n * // Later: session.stop();\n * ```\n */\n assistants: ConversationalAgentScope<\"assistant\">;\n\n /**\n * Interact with Copilot agents available in Serenity Star.\n * Similar to assistants but allows you to interact with the UI through callbacks.\n * \n * Text conversation example:\n * ```typescript\n * // Regular conversation\n * const conversation = await client.agents.copilots.createConversation(\"app-copilot\");\n * const response = await conversation.sendMessage(\"How do I create a new support ticket?\");\n * console.log(response.content);\n * \n * // Streaming conversation\n * const conversation = await client.agents.copilots\n * .createConversation(\"app-copilot\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"How do I create a new support ticket?\");\n * ```\n */\n copilots: ConversationalAgentScope<\"copilot\">;\n\n /**\n * Interact with Activity agents available in Serenity Star.\n * This allows you to execute activities.\n * It supports streaming.\n * Execute simple tasks based on the user input.\n * \n * ## Regular activity execution:\n * ```typescript\n * const response = await client.agents.activities.execute(\"marketing-campaign\")\n * console.log(response.content);\n * \n * // With parameters\n * const response = await client.agents.activities.execute(\"cooking-activity\", {\n * inputParameters: {\n * ingredientOne: \"chicken\",\n * ingredientTwo: \"onion\",\n * ingredientThree: \"cream\",\n * }\n * });\n * ```\n * \n * ## Stream activity with SSE:\n * ```typescript\n * const activity = client.agents.activities\n * .create(\"marketing-campaign\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await activity.stream();\n * ```\n */\n activities: SystemAgentScope<\"activity\", Activity>;\n\n /**\n * Interact with Chat Completion agents available in Serenity Star.\n * This allows you to execute chat completions.\n * It supports streaming.\n * Chat completions allows you to fully control the conversation and generate completions.\n * \n * ## Regular chat completion:\n * ```typescript\n * const response = await client.agents.chatCompletions.execute(\"Health-Coach\", {\n * message: \"Hello!\"\n * });\n * console.log(response.content);\n * ```\n * \n * ## Stream chat completion with SSE:\n * ```typescript\n * const chatCompletion = client.agents.chatCompletions\n * .create(\"Health-Coach\", {\n * message: \"Hello!\"\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await chatCompletion.stream();\n * ```\n */\n chatCompletions: SystemAgentScope<\"chat-completion\", ChatCompletion>;\n\n /**\n * Interact with Proxy agents available in Serenity Star.\n * This allows you to execute proxies.\n * It supports streaming.\n * Proxy agents allows you to define a set of parameters dynamically for each request\n * \n * ## Regular proxy execution:\n * ```typescript\n * const response = await client.agents.proxies.execute(\"proxy-agent\", {\n * model: \"gpt-4o-mini-2024-07-18\",\n * messages: [\n * {\n * role: \"system\",\n * content: \"You are a helpful assistant. Always use short and concise responses\"\n * },\n * { role: \"user\", content: \"What is artificial intelligence?\" }\n * ],\n * temperature: 1,\n * max_tokens: 250\n * });\n * console.log(response.content);\n * ```\n * \n * ## Stream proxy with SSE:\n * ```typescript\n * const proxy = client.agents.proxies\n * .create(\"proxy-agent\", {\n * model: \"gpt-4o-mini-2024-07-18\",\n * messages: [\n * {\n * role: \"system\",\n * content: \"You are a helpful assistant. Always use short and concise responses\"\n * },\n * { role: \"user\", content: \"What is artificial intelligence?\" }\n * ],\n * temperature: 1,\n * max_tokens: 250\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await proxy.stream();\n * ```\n */\n proxies: SystemAgentScope<\"proxy\", Proxy>;\n\n /**\n * Interact with Plan agents available in Serenity Star.\n * This allows you to execute plans.\n * It supports streaming.\n * Plan agents are capable of building an execution plan based on the user input and execute it.\n * \n * ## Regular plan execution:\n * ```typescript\n * const response = await client.agents.plans.execute(\"event-planner\");\n * console.log(response.content);\n * ```\n * \n * ## Stream plan with SSE:\n * ```typescript\n * const plan = client.agents.plans\n * .create(\"event-planner\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await plan.stream();\n * ```\n */\n plans: SystemAgentScope<\"plan\", Plan>;\n };\n\n constructor(options: SerenityClientOptions) {\n if (!options.apiKey) {\n throw new Error(\"The API key is required\");\n }\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl || this.baseUrl;\n\n this.agents = {\n assistants: AgentFactory.createAgent(\n \"assistant\",\n this.apiKey,\n this.baseUrl\n ),\n copilots: AgentFactory.createAgent(\"copilot\", this.apiKey, this.baseUrl),\n activities: AgentFactory.createAgent(\n \"activity\",\n this.apiKey,\n this.baseUrl\n ),\n chatCompletions: AgentFactory.createAgent(\n \"chat-completion\",\n this.apiKey,\n this.baseUrl\n ),\n proxies: AgentFactory.createAgent(\"proxy\", this.apiKey, this.baseUrl),\n plans: AgentFactory.createAgent(\"plan\", this.apiKey, this.baseUrl),\n };\n }\n}\n"],"mappings":"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","names":["undiciFetch","UndiciHeaders","UndiciRequest","UndiciResponse","_a","undici","EventEmitter","eventName","listener","args","_a","_RealtimeSession_instances","stop_fn","setupWebSocketConnection_fn","handleIncomingMessagesFromSerenity_fn","handleIncomingMessagesFromVendor_fn","setupWebRTCConnection_fn","getAudioFromMicrophone_fn","startSession_fn","resetInactivityTimeout_fn","extractErrorMessageFromEvent_fn","RealtimeSession","EventEmitter","agentCode","apiKey","baseUrl","options","__privateAdd","__async","__privateMethod","error","audioTrack","reason","details","track","url","sessionCreateEvent","event","data","obj","eventData","errorDetails","isSerenityEvent","currentDate","channelName","e","audioElement","offer","sdpResponse","answer","SseConnection","_","url","fetchOptions","__async","response","reader","decoder","done","value","error","eventEnd","lineEnding","eventDelimiter","eventText","lines","event","line","eventType","callback","listeners","cb","data","AgentMapper","data","_Conversation_instances","getConversationId_fn","createExecuteBody_fn","appendUserIdentifierIfNeeded_fn","appendChannelIfNeeded_fn","appendInputParametersIfNeeded_fn","appendInitConversationParamsIfNeeded_fn","appendVolatileKnowledgeIdsIfNeeded_fn","_Conversation","EventEmitter","agentCode","apiKey","baseUrl","options","__privateAdd","__async","_a","instance","__privateMethod","message","version","url","body","connection","SseConnection","responsePromise","resolve","reject","data","error","chunk","finalMessage","fetchOptions","response","retryAfter","AgentMapper","reqBody","stream","parameters","key","value","volatileKnowledgeIds","Conversation","ConversationalAgent","agentCode","apiKey","baseUrl","options","RealtimeSession","__async","Conversation","Assistant","_Assistant","ConversationalAgent","agentCode","apiKey","baseUrl","options","Copilot","_Copilot","ConversationalAgent","agentCode","apiKey","baseUrl","options","SystemAgent","EventEmitter","agentCode","apiKey","baseUrl","options","__async","_a","version","url","body","connection","SseConnection","responsePromise","resolve","reject","data","error","chunk","finalMessage","fetchOptions","response","retryAfter","AgentMapper","stream","Activity","_Activity","SystemAgent","agentCode","apiKey","baseUrl","options","stream","baseOptions","body","_a","key","value","ChatCompletion","_ChatCompletion","SystemAgent","agentCode","apiKey","baseUrl","options","stream","body","_a","key","value","Plan","_Plan","SystemAgent","agentCode","apiKey","baseUrl","options","stream","baseOptions","body","_a","key","value","Proxy","_Proxy","SystemAgent","agentCode","apiKey","baseUrl","options","stream","AgentFactory","type","apiKey","baseUrl","agentCode","options","__async","Assistant","Copilot","Activity","ChatCompletion","Proxy","Plan","SerenityClient","options","AgentFactory"]}
1
+ {"version":3,"sources":["../src/polyfill.ts","../src/EventEmitter.ts","../src/scopes/conversational/RealtimeSession/index.ts","../src/scopes/conversational/Conversation/SseConnection.ts","../src/utils/AgentMapper.ts","../src/scopes/conversational/Conversation/index.ts","../src/scopes/conversational/ConversationalAgent.ts","../src/scopes/conversational/Assistant.ts","../src/scopes/conversational/Copilot.ts","../src/scopes/system/SystemAgent.ts","../src/scopes/system/Activity.ts","../src/scopes/system/ChatCompletion.ts","../src/scopes/system/Plan.ts","../src/scopes/system/Proxy.ts","../src/factories/AgentFactory.ts","../src/SerenityClient.ts"],"sourcesContent":["let undiciFetch, UndiciHeaders, UndiciRequest, UndiciResponse;\n\nif (typeof process !== 'undefined' && process.versions?.node) {\n // Only import undici in Node.js environment\n const undici = require('undici');\n undiciFetch = undici.fetch;\n UndiciHeaders = undici.Headers;\n UndiciRequest = undici.Request;\n UndiciResponse = undici.Response;\n\n if (!globalThis.fetch) {\n globalThis.fetch = undiciFetch as unknown as typeof globalThis.fetch;\n globalThis.Headers = UndiciHeaders as unknown as typeof globalThis.Headers;\n globalThis.Request = UndiciRequest as unknown as typeof globalThis.Request;\n globalThis.Response = UndiciResponse as unknown as typeof globalThis.Response;\n }\n}\n\nexport {\n undiciFetch as fetch,\n UndiciHeaders as Headers,\n UndiciRequest as Request,\n UndiciResponse as Response\n};\n","export class EventEmitter<T extends Record<string, (...args: any[]) => void>> {\n private listeners: { [K in keyof T]?: Array<T[K]> } = {};\n\n on<K extends keyof T>(eventName: K, listener: T[K]): this {\n if (!this.listeners[eventName]) {\n this.listeners[eventName] = [];\n }\n this.listeners[eventName]!.push(listener);\n return this;\n }\n\n emit<K extends keyof T>(eventName: K, ...args: Parameters<T[K]>): void {\n this.listeners[eventName]?.forEach((listener) => listener(...args));\n }\n}","import { EventEmitter } from \"../../../EventEmitter\";\nimport {\n AgentExecutionOptions,\n AgentExecutionOptionsWithParameters,\n} from \"../../../types\";\nimport {\n RealtimeSessionEvents,\n SerenitySessionCreateEvent,\n SerenityEvent,\n SerenitySessionCreatedEvent,\n SerenitySessionCloseEvent,\n SerenitySessionErrorEvent,\n SDPConfiguration,\n SerenityResponseProcessedEvent,\n} from \"./types\";\n\nexport class RealtimeSession extends EventEmitter<RealtimeSessionEvents> {\n private agentCode: string;\n private apiKey: string;\n private baseUrl: string;\n\n // Optional parameters.\n private inputParameters?: { [key: string]: any };\n private userIdentifier?: string;\n private agentVersion?: number;\n private channel?: string;\n\n private inactivityTimeout?: NodeJS.Timeout;\n private timeout = 120000; // 2 minutes\n\n // WebRTC configuration.\n private sessionConfiguration?: SDPConfiguration;\n private peerConnection?: RTCPeerConnection;\n private localStream?: MediaStream;\n private dataChannel?: RTCDataChannel;\n\n // WebSockets configuration.\n private socket?: WebSocket;\n\n constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptionsWithParameters\n ) {\n super();\n this.apiKey = apiKey;\n this.agentCode = agentCode;\n this.baseUrl = baseUrl;\n\n this.agentVersion = options?.agentVersion;\n this.inputParameters = options?.inputParameters;\n this.userIdentifier = options?.userIdentifier;\n this.channel = options?.channel;\n }\n\n // #region Public methods\n\n /**\n * Starts the real-time session.\n */\n async start(): Promise<void> {\n try {\n this.#setupWebSocketConnection();\n } catch (error) {\n throw new Error(`Error starting the session`);\n }\n }\n\n /**\n * Stops the real-time session.\n */\n stop(): void {\n this.#stop();\n }\n\n /**\n * Allows the user to mute the microphone during a real-time voice session.\n */\n muteMicrophone(): void {\n if (this.localStream) {\n const audioTrack = this.localStream.getAudioTracks()[0];\n if (audioTrack) {\n audioTrack.enabled = false;\n }\n }\n }\n\n /**\n * Allows the user to unmute the microphone during a real-time voice session.\n */\n unmuteMicrophone(): void {\n if (this.localStream) {\n const audioTrack = this.localStream.getAudioTracks()[0];\n if (audioTrack) {\n audioTrack.enabled = true;\n }\n }\n }\n // #endregion\n\n // #region Private methods\n\n /**\n * Internal method to stop the session. Allows for a reason and details to be provided.\n * @param reason The reason for stopping the session.\n * @param details Additional details about the stop event.\n */\n #stop(reason?: string, details?: any): void {\n // Send a closure message to the server if socket is connected\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n try {\n // Close the WebSocket connection properly\n this.socket.close(1000, \"Client closed the session\");\n } catch (error) {\n console.error(\"Error closing WebSocket connection:\", error);\n }\n }\n \n // Stop the local audio tracks.\n if (this.localStream) {\n this.localStream.getTracks().forEach((track) => track.stop());\n this.localStream = undefined;\n }\n \n // Close the WebRTC connection if it is open.\n this.peerConnection && this.peerConnection.close();\n \n // Reset variables\n this.socket = undefined;\n this.dataChannel = undefined;\n this.peerConnection = undefined;\n\n this.emit(\"session.stopped\", reason, details);\n clearTimeout(this.inactivityTimeout);\n }\n\n #setupWebSocketConnection() {\n let url = `${this.baseUrl}/v2/agent/${this.agentCode}/realtime`;\n\n if (this.agentVersion) {\n url += `/${this.agentVersion}`;\n }\n\n this.socket = new WebSocket(url, [\"X-API-KEY\", this.apiKey]);\n\n this.socket.onopen = () => {\n const sessionCreateEvent: SerenitySessionCreateEvent = {\n type: \"serenity.session.create\",\n input_parameters: this.inputParameters,\n user_identifier: this.userIdentifier,\n channel: this.channel,\n };\n\n this.socket!.send(JSON.stringify(sessionCreateEvent));\n };\n\n this.socket.onclose = () => {\n this.#stop();\n };\n\n this.socket.onerror = (event) => {\n this.emit(\"error\", \"Error connecting to the server\");\n this.#stop();\n };\n\n this.socket.onmessage = (event) => {\n this.#handleIncomingMessagesFromSerenity(event.data);\n };\n }\n\n async #handleIncomingMessagesFromSerenity(data: string) {\n const obj = JSON.parse(data) as SerenityEvent;\n switch (obj.type) {\n case \"serenity.session.created\": {\n const eventData = obj as SerenitySessionCreatedEvent;\n this.sessionConfiguration = {\n url: eventData.url,\n headers: eventData.headers,\n };\n\n // Setup the WebRTC connection.\n this.#setupWebRTCConnection();\n\n // Add listeners for the WebRTC connection.\n this.#handleIncomingMessagesFromVendor();\n\n // Start the session.\n await this.#startSession();\n\n break;\n }\n case \"serenity.session.close\": {\n const eventData = obj as SerenitySessionCloseEvent;\n const errorDetails = this.#extractErrorMessageFromEvent(eventData);\n this.emit(\"error\", errorDetails);\n this.#stop(eventData.reason, errorDetails);\n break;\n }\n case \"serenity.response.processed\": {\n const eventData = obj as SerenityResponseProcessedEvent;\n this.emit(\"response.processed\", eventData.result);\n break;\n }\n default: {\n const isSerenityEvent = obj.type.startsWith(\"serenity\");\n if (this.dataChannel && !isSerenityEvent) {\n this.dataChannel.send(JSON.stringify(obj));\n }\n }\n }\n }\n\n #handleIncomingMessagesFromVendor() {\n if (!this.peerConnection) {\n throw new Error(\n `Could not add listeners: WebRTC connection not initialized`\n );\n }\n // Set up data channel for sending and receiving events\n const currentDate = new Date()\n .toISOString()\n .replace(/T/, \"-\")\n .replace(/:/g, \"-\")\n .replace(/\\..+/, \"\");\n const channelName = `data-channel-${this.agentCode}-${currentDate}`;\n this.dataChannel = this.peerConnection.createDataChannel(channelName);\n\n this.dataChannel.addEventListener(\"message\", (e: MessageEvent) => {\n this.#resetInactivityTimeout();\n const data = JSON.parse(e.data);\n\n try {\n switch (data.type) {\n case \"input_audio_buffer.speech_started\": {\n this.emit(\"speech.started\");\n break;\n }\n case \"input_audio_buffer.speech_stopped\": {\n this.emit(\"speech.stopped\");\n break;\n }\n\n case \"response.done\": {\n this.emit(\"response.done\");\n break;\n }\n case \"error\": {\n this.emit(\"error\", \"There was an error processing your request\");\n break;\n }\n }\n } catch (error) {\n this.emit(\"error\", \"Error processing incoming messages from vendor\");\n } finally {\n // Forward the message to the server\n if (this.socket) {\n this.socket.send(JSON.stringify(data));\n }\n }\n });\n }\n\n #setupWebRTCConnection() {\n // Create the peer connection.\n this.peerConnection = new RTCPeerConnection();\n\n // Configure remote audio playback.\n const audioElement = document.createElement(\"audio\");\n audioElement.autoplay = true;\n\n this.peerConnection.ontrack = (event) => {\n if (event.streams && event.streams[0]) {\n audioElement.srcObject = event.streams[0];\n }\n };\n }\n\n async #getAudioFromMicrophone(): Promise<void> {\n if (!this.peerConnection) {\n throw new Error(\n `Could not start the session: WebRTC connection not initialized`\n );\n }\n\n this.localStream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n\n const audioTrack = this.localStream.getTracks()[0];\n this.peerConnection.addTrack(audioTrack, this.localStream);\n }\n\n async #startSession() {\n if (!this.peerConnection) {\n throw new Error(\n `Could not start the session: WebRTC connection not initialized`\n );\n }\n\n if (!this.sessionConfiguration) {\n throw new Error(\n `Could not start the session: Session configuration not available`\n );\n }\n\n try {\n // Get the audio from the microphone.\n await this.#getAudioFromMicrophone();\n\n // Start the session using the Session Description Protocol (SDP)\n const offer = await this.peerConnection.createOffer();\n await this.peerConnection.setLocalDescription(offer);\n\n const sdpResponse = await fetch(`${this.sessionConfiguration.url}`, {\n method: \"POST\",\n body: offer.sdp,\n headers: this.sessionConfiguration.headers,\n });\n\n if (!sdpResponse.ok) {\n throw new Error(\"Error starting the session\");\n }\n\n const answer: RTCSessionDescriptionInit = {\n type: \"answer\",\n sdp: await sdpResponse.text(),\n };\n\n await this.peerConnection.setRemoteDescription(answer);\n\n this.emit(\"session.created\");\n this.#resetInactivityTimeout();\n } catch (error) {\n this.emit(\"error\", \"Error starting the session\");\n this.#stop();\n }\n }\n\n #resetInactivityTimeout() {\n clearTimeout(this.inactivityTimeout);\n this.inactivityTimeout = setTimeout(() => {\n this.#stop();\n }, this.timeout);\n }\n\n #extractErrorMessageFromEvent(eventData: SerenitySessionErrorEvent) {\n switch (eventData.reason) {\n case \"Exception\":\n return eventData.message;\n case \"ValidationException\": {\n if (!eventData.errors) return eventData.message;\n\n return Object.values(eventData.errors).join(\". \");\n }\n default:\n return eventData.message;\n }\n }\n // #endregion\n}\n","/**\n * Interface representing the structure of event data.\n */\ninterface SseEventData {\n start_time_utc?: string;\n stop_time_utc?: string;\n message?: string;\n}\n\n/**\n * Interface representing the event object with optional event and data properties.\n */\ninterface Event {\n event?: string;\n data?: string;\n}\n\n/**\n * Type for the event listeners.\n */\ntype ConnectionEventListener = (data: string) => void;\n\n/**\n * Class representing a server-sent events (SSE) connection.\n */\nexport class SseConnection {\n private eventListeners: Record<string, ConnectionEventListener[]>;\n private active: boolean;\n private buffer: string = \"\";\n\n /**\n * Creates an instance of SseConnection.\n * @param options - Options for the SSE connection.\n */\n constructor() {\n this.eventListeners = {\n start: [\n (_: string) => {\n },\n ],\n stop: [\n (_: string) => {\n this.stop();\n },\n ],\n error: [\n (_: string) => {\n this.stop();\n },\n ],\n };\n this.active = false;\n }\n\n /**\n * Connects to the SSE server and listens for events.\n * @param url - The URL to connect to for SSE.\n * @param fetchOptions - Additional fetch options.\n * @returns A promise that resolves with the response when the connection is active.\n * @throws Will throw an error if the response is not an event stream.\n */\n async start(\n url: string,\n fetchOptions: RequestInit\n ): Promise<Response> {\n this.active = true;\n try {\n const response = await fetch(url, fetchOptions);\n\n if(!response.ok) {\n throw response;\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n\n if (contentType !== \"text/event-stream\") {\n return response;\n }\n\n const reader = response.body!.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n this.buffer = \"\";\n\n while (this.active) {\n const { done, value } = await reader.read();\n if (done) break;\n\n this.buffer += decoder.decode(value, { stream: true });\n this.processEvents();\n }\n\n return response;\n } catch (error) {\n this.active = false;\n throw error;\n }\n }\n\n /**\n * Processes the event data from the buffer.\n */\n private processEvents(): void {\n let eventEnd: number;\n const lineEnding = this.buffer.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const eventDelimiter = lineEnding + lineEnding;\n while ((eventEnd = this.buffer.indexOf(eventDelimiter)) !== -1) {\n const eventText = this.buffer.slice(0, eventEnd).trim();\n this.buffer = this.buffer.slice(eventEnd + eventDelimiter.length);\n\n const lines = eventText.split(lineEnding);\n const event: Event = {};\n for (let line of lines) {\n if (line.startsWith(\"data:\")) {\n event.data = line.slice(\"data:\".length).trim();\n } else if (line.startsWith(\"event:\")) {\n event.event = line.slice(\"event:\".length).trim();\n }\n }\n\n this.trigger(event.event || \"message\", event.data!);\n }\n }\n\n /**\n * Registers an event listener for a specific event type.\n * @param eventType - The type of event to listen for.\n * @param callback - The callback function to execute when the event occurs.\n */\n on(eventType: string, callback: ConnectionEventListener): void {\n if (!this.eventListeners[eventType]) {\n this.eventListeners[eventType] = [];\n }\n this.eventListeners[eventType].push(callback);\n }\n\n /**\n * Unregisters an event listener for a specific event type.\n * @param eventType - The type of event to stop listening for.\n * @param callback - The callback function to remove.\n */\n off(eventType: string, callback: ConnectionEventListener): void {\n const listeners = this.eventListeners[eventType];\n if (listeners) {\n this.eventListeners[eventType] = listeners.filter(\n (cb) => cb !== callback\n );\n }\n }\n\n /**\n * Triggers an event and calls all registered listeners for that event type.\n * @param eventType - The type of event to trigger.\n * @param data - The data to pass to the event listeners.\n */\n private trigger(eventType: string, data: string): void {\n const listeners = this.eventListeners[eventType];\n if (listeners) {\n listeners.forEach((callback) => callback(data));\n }\n }\n\n /**\n * Stops the SSE connection.\n */\n stop(): void {\n this.active = false;\n }\n}\n","import { AgentResult } from \"../types\";\n\nexport class AgentMapper {\n public static mapAgentResultToSnakeCase = (data: {\n [key: string]: any;\n }): AgentResult => {\n const result: AgentResult = {\n content: data.content,\n instance_id: data.instanceId,\n action_results: data.actionResults,\n completion_usage: data.completionUsage,\n executor_task_logs: data.executorTaskLogs,\n json_content: data.jsonContent,\n meta_analysis: data.metaAnalysis,\n time_to_first_token: data.timeToFirstToken,\n };\n\n return result;\n };\n}\n","import { EventEmitter } from \"../../../EventEmitter\";\nimport { AgentExecutionOptions, AgentExecutionOptionsWithParameters, AgentResult, ExecuteBodyParams, SSEStreamEvents } from \"../../../types\";\nimport { InitConversationParams, InitConversationResponse, MessageOptions } from \"./types\";\nimport { SseConnection } from \"./SseConnection\";\nimport { AgentMapper } from \"../../../utils/AgentMapper\";\n\nexport class Conversation extends EventEmitter<SSEStreamEvents> {\n private agentCode: string;\n private apiKey: string;\n private baseUrl: string;\n\n // Optional parameters.\n private inputParameters?: { [key: string]: any };\n private userIdentifier?: string;\n private agentVersion?: number;\n private channel?: string;\n\n public conversationId?: string;\n\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptionsWithParameters\n ) {\n super();\n this.apiKey = apiKey;\n this.agentCode = agentCode;\n this.baseUrl = baseUrl;\n\n this.agentVersion = options?.agentVersion;\n this.inputParameters = options?.inputParameters;\n this.userIdentifier = options?.userIdentifier;\n this.channel = options?.channel;\n }\n\n private static async create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ): Promise<Conversation> {\n const instance = new Conversation(agentCode, apiKey, baseUrl, options);\n await instance.#getConversationId();\n return instance;\n }\n\n async #getConversationId(): Promise<void> {\n if (this.conversationId) return;\n\n const version = this.agentVersion ? `/${this.agentVersion}` : '';\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/conversation${version}`;\n let reqBody: InitConversationParams = {};\n\n this.#appendInitConversationParamsIfNeeded(reqBody);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(reqBody),\n });\n\n if (response.status === 429) {\n const retryAfter = parseInt(response.headers.get(\"Retry-After\") || \"60\");\n throw new Error(`Rate limit exceeded. Retry after ${retryAfter} seconds`);\n }\n\n const body = await response.json();\n\n if (response.status !== 200) {\n throw new Error(body.message || \"Failed to initialize conversation\");\n }\n\n const data = body as InitConversationResponse;\n this.conversationId = data.chatId;\n }\n\n async streamMessage(message: string, options?: MessageOptions): Promise<AgentResult> {\n if (!this.conversationId) {\n throw new Error(\"Conversation not initialized\");\n }\n\n const version = this.agentVersion ? `/${this.agentVersion}` : '';\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n \n let body = this.#createExecuteBody(message, true, options);\n\n const connection = new SseConnection();\n let responsePromise: Promise<AgentResult>;\n\n responsePromise = new Promise(async (resolve, reject) => {\n connection.on(\"start\", () => {\n this.emit(\"start\");\n });\n\n connection.on(\"error\", (data) => {\n const error = JSON.parse(data);\n this.emit(\"error\", error);\n reject(error);\n });\n\n connection.on(\"content\", (data) => {\n const chunk = JSON.parse(data);\n this.emit(\"content\", chunk.text);\n });\n\n connection.on(\"stop\", (data) => {\n const finalMessage = JSON.parse(data) as { result: AgentResult};\n this.emit(\"stop\", finalMessage.result);\n resolve(finalMessage.result);\n });\n\n const fetchOptions: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n };\n \n try {\n await connection.start(url, fetchOptions);\n } catch (error) {\n reject(error);\n }\n });\n\n return responsePromise;\n }\n\n async sendMessage(message: string, options?: MessageOptions): Promise<AgentResult> {\n if (!this.conversationId) {\n throw new Error(\"Conversation not initialized\");\n }\n const version = this.agentVersion ? `/${this.agentVersion}` : '';\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n \n let body = this.#createExecuteBody(message, false, options);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (response.status === 429) {\n const retryAfter = parseInt(response.headers.get(\"Retry-After\") || \"60\");\n throw new Error(`Rate limit exceeded. Retry after ${retryAfter} seconds`);\n }\n\n const data = await response.json();\n if (response.status !== 200) {\n throw new Error(data.message || \"Failed to execute message\");\n }\n\n const mappedData = AgentMapper.mapAgentResultToSnakeCase(data);\n\n return mappedData;\n }\n\n #createExecuteBody(message: string, stream: boolean, options?: MessageOptions): ExecuteBodyParams {\n let body: ExecuteBodyParams = [\n {\n Key: \"chatId\",\n Value: this.conversationId,\n },\n {\n Key: \"message\",\n Value: message,\n },\n {\n Key: \"stream\",\n Value: stream.toString(),\n },\n ];\n\n this.#appendInputParametersIfNeeded(body, options?.inputParameters);\n this.#appendVolatileKnowledgeIdsIfNeeded(body, options?.volatileKnowledgeIds);\n this.#appendUserIdentifierIfNeeded(body);\n this.#appendChannelIfNeeded(body);\n\n return body;\n }\n\n #appendUserIdentifierIfNeeded(body: ExecuteBodyParams) {\n if (this.userIdentifier) {\n body.push({\n Key: \"userIdentifier\",\n Value: this.userIdentifier,\n });\n }\n }\n\n #appendChannelIfNeeded(body: ExecuteBodyParams) {\n if (this.channel) {\n body.push({\n Key: \"channel\",\n Value: this.channel,\n });\n }\n }\n\n #appendInputParametersIfNeeded(body: ExecuteBodyParams, parameters: { [key: string]: any } = {}) {\n if (!parameters || Object.keys(parameters).length === 0) return;\n\n for (const [key, value] of Object.entries(parameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n\n #appendInitConversationParamsIfNeeded(body: InitConversationParams) {\n if (this.userIdentifier) {\n body.userIdentifier = this.userIdentifier;\n }\n\n if (this.inputParameters) {\n body.inputParameters = [];\n this.#appendInputParametersIfNeeded(body.inputParameters, this.inputParameters);\n }\n }\n\n #appendVolatileKnowledgeIdsIfNeeded(body: ExecuteBodyParams, volatileKnowledgeIds?: string[]) {\n if (!volatileKnowledgeIds || volatileKnowledgeIds.length === 0) return;\n\n body.push({\n Key: \"volatileKnowledgeIds\",\n Value: volatileKnowledgeIds,\n });\n }\n}\n","import { AgentExecutionOptions } from \"../../types\";\nimport { ConversationalAgentExecutionOptionsMap } from \"../../types\";\nimport { Conversation } from \"./Conversation\";\nimport { RealtimeSession } from \"./RealtimeSession\";\n\nexport abstract class ConversationalAgent<\n T extends keyof ConversationalAgentExecutionOptionsMap,\n> {\n protected constructor(\n protected readonly agentCode: string,\n protected readonly apiKey: string,\n protected readonly baseUrl: string,\n protected readonly options?: ConversationalAgentExecutionOptionsMap[T]\n ) {}\n\n createRealtimeSession(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ): RealtimeSession {\n return new RealtimeSession(agentCode, apiKey, baseUrl, options);\n }\n\n async createConversation(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ): Promise<Conversation> {\n return await Conversation[\"create\"](agentCode, apiKey, baseUrl, options);\n }\n}\n","import { ConversationalAgentExecutionOptionsMap } from \"../../types\";\nimport { ConversationalAgent } from \"./ConversationalAgent\";\n\nexport class Assistant extends ConversationalAgent<\"assistant\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n \n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ): Assistant {\n return new Assistant(agentCode, apiKey, baseUrl, options);\n }\n}\n","import { AgentExecutionOptions } from \"../../types\";\nimport { ConversationalAgentExecutionOptionsMap } from \"../../types\";\nimport { ConversationalAgent } from \"./ConversationalAgent\";\n\nexport class Copilot extends ConversationalAgent<\"copilot\"> {\n constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: AgentExecutionOptions\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: ConversationalAgentExecutionOptionsMap[\"copilot\"]\n ): Copilot {\n return new Copilot(agentCode, apiKey, baseUrl, options);\n }\n}\n","import { EventEmitter } from \"../../EventEmitter\";\nimport { AgentResult, ExecuteBodyParams, SSEStreamEvents } from \"../../types\";\nimport { AgentMapper } from \"../../utils/AgentMapper\";\nimport { SseConnection } from \"../conversational/Conversation/SseConnection\";\nimport { SystemAgentExecutionOptionsMap } from \"./../../types\";\n\nexport abstract class SystemAgent<\n T extends keyof SystemAgentExecutionOptionsMap,\n> extends EventEmitter<SSEStreamEvents> {\n protected constructor(\n protected readonly agentCode: string,\n protected readonly apiKey: string,\n protected readonly baseUrl: string,\n protected readonly options?: SystemAgentExecutionOptionsMap[T]\n ) {\n super();\n }\n\n async stream(): Promise<AgentResult> {\n const version = this.options?.agentVersion\n ? `/${this.options.agentVersion}`\n : \"\";\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n\n let body = this.createExecuteBody(true);\n\n const connection = new SseConnection();\n let responsePromise: Promise<AgentResult>;\n\n responsePromise = new Promise(async (resolve, reject) => {\n connection.on(\"start\", () => {\n this.emit(\"start\");\n });\n\n connection.on(\"error\", (data) => {\n const error = JSON.parse(data);\n this.emit(\"error\", error);\n reject(error);\n });\n\n connection.on(\"content\", (data) => {\n const chunk = JSON.parse(data);\n this.emit(\"content\", chunk.text);\n });\n\n connection.on(\"stop\", (data) => {\n const finalMessage = JSON.parse(data) as { result: AgentResult };\n this.emit(\"stop\", finalMessage.result);\n resolve(finalMessage.result);\n });\n\n const fetchOptions: RequestInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n };\n\n try {\n await connection.start(url, fetchOptions);\n } catch (error) {\n reject(error);\n }\n });\n\n return responsePromise;\n }\n\n protected async execute(): Promise<AgentResult> {\n const version = this.options?.agentVersion\n ? `/${this.options.agentVersion}`\n : \"\";\n const url = `${this.baseUrl}/v2/agent/${this.agentCode}/execute${version}`;\n\n let body = this.createExecuteBody(false);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": this.apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (response.status === 429) {\n const retryAfter = parseInt(response.headers.get(\"Retry-After\") || \"60\");\n throw new Error(`Rate limit exceeded. Retry after ${retryAfter} seconds`);\n }\n\n const data = await response.json();\n if (response.status !== 200) {\n throw new Error(data.message || \"Failed to execute message\");\n }\n\n return AgentMapper.mapAgentResultToSnakeCase(data);\n }\n\n protected createExecuteBody(\n stream: boolean\n ): ExecuteBodyParams | { [key: string]: any } {\n let body: ExecuteBodyParams = [\n {\n Key: \"stream\",\n Value: stream.toString(),\n },\n ];\n\n this.appendVolatileKnowledgeIdsIfNeeded(body);\n this.appendUserIdentifierIfNeeded(body);\n this.appendChannelIfNeeded(body);\n\n return body;\n }\n\n protected appendUserIdentifierIfNeeded(body: ExecuteBodyParams) {\n if (this.options?.userIdentifier) {\n body.push({\n Key: \"userIdentifier\",\n Value: this.options.userIdentifier,\n });\n }\n }\n\n protected appendVolatileKnowledgeIdsIfNeeded(body: ExecuteBodyParams) {\n if (\n !this.options?.volatileKnowledgeIds ||\n this.options.volatileKnowledgeIds.length === 0\n )\n return;\n\n body.push({\n Key: \"volatileKnowledgeIds\",\n Value: this.options.volatileKnowledgeIds,\n });\n }\n\n protected appendChannelIfNeeded(body: ExecuteBodyParams) {\n if (this.options?.channel) {\n body.push({\n Key: \"channel\",\n Value: this.options.channel,\n });\n }\n }\n}\n","import { SystemAgent } from \"./SystemAgent\";\nimport {\n ExecuteBodyParams,\n SystemAgentExecutionOptionsMap,\n} from \"./../../types\";\n\nexport class Activity extends SystemAgent<\"activity\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Activity {\n return new Activity(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ) {\n const instance = new Activity(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(\n stream: boolean\n ): ExecuteBodyParams | { [key: string]: any } {\n const baseOptions = super.createExecuteBody(stream);\n\n this.appendInputParametersIfNeeded(baseOptions);\n\n return baseOptions;\n }\n\n private appendInputParametersIfNeeded(\n body: ExecuteBodyParams | { [key: string]: any }\n ) {\n if (\n !this.options?.inputParameters ||\n Object.keys(this.options.inputParameters).length === 0\n )\n return;\n\n for (const [key, value] of Object.entries(this.options.inputParameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n}\n","import { ExecuteBodyParams } from \"../../types\";\nimport { SystemAgentExecutionOptionsMap } from \"./../../types\";\nimport { SystemAgent } from \"./SystemAgent\";\n\nexport class ChatCompletion extends SystemAgent<\"chat-completion\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): ChatCompletion {\n return new ChatCompletion(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ) {\n const instance = new ChatCompletion(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(stream: boolean): ExecuteBodyParams | { [key: string]: any } {\n const body = super.createExecuteBody(stream);\n\n this.appendMessagesIfNeeded(body);\n this.appendMessageIfNeeded(body);\n this.appendInputParametersIfNeeded(body);\n\n return body;\n }\n\n private appendMessagesIfNeeded(body: ExecuteBodyParams | { [key: string]: any }) {\n if (!this.options?.messages || this.options.messages.length === 0) return;\n\n body.push({\n Key: \"messages\",\n Value: JSON.stringify(this.options.messages),\n });\n }\n\n private appendMessageIfNeeded(body: ExecuteBodyParams | { [key: string]: any }) {\n if (!this.options?.message) return;\n\n body.push({\n Key: \"message\",\n Value: this.options.message,\n });\n }\n\n private appendInputParametersIfNeeded(\n body: ExecuteBodyParams | { [key: string]: any }\n ) {\n if (\n !this.options?.inputParameters ||\n Object.keys(this.options.inputParameters).length === 0\n )\n return;\n\n for (const [key, value] of Object.entries(this.options.inputParameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n}\n","import { SystemAgent } from \"./SystemAgent\";\nimport { ExecuteBodyParams, SystemAgentExecutionOptionsMap } from \"../../types\";\n\nexport class Plan extends SystemAgent<\"plan\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ): Plan {\n return new Plan(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ) {\n const instance = new Plan(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(\n stream: boolean\n ): ExecuteBodyParams | { [key: string]: any } {\n const baseOptions = super.createExecuteBody(stream);\n this.appendInputParametersIfNeeded(baseOptions);\n return baseOptions;\n }\n\n private appendInputParametersIfNeeded(\n body: ExecuteBodyParams | { [key: string]: any }\n ) {\n if (\n !this.options?.inputParameters ||\n Object.keys(this.options.inputParameters).length === 0\n )\n return;\n\n for (const [key, value] of Object.entries(this.options.inputParameters)) {\n body.push({\n Key: key,\n Value: value,\n });\n }\n }\n}\n","import { SystemAgent } from \"./SystemAgent\";\nimport { ExecuteBodyParams, SystemAgentExecutionOptionsMap } from \"../../types\";\nimport { ProxyExecutionOptions } from \"./types\";\n\nexport class Proxy extends SystemAgent<\"proxy\"> {\n private constructor(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ) {\n super(agentCode, apiKey, baseUrl, options);\n }\n\n static create(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Proxy {\n return new Proxy(agentCode, apiKey, baseUrl, options);\n }\n\n static createAndExecute(\n agentCode: string,\n apiKey: string,\n baseUrl: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ) {\n const instance = new Proxy(agentCode, apiKey, baseUrl, options);\n return instance.execute();\n }\n\n protected createExecuteBody(stream: boolean): ExecuteBodyParams | { [key: string]: any } {\n const options = this.options as ProxyExecutionOptions;\n \n return {\n model: options.model,\n messages: options.messages,\n frequency_penalty: options.frequency_penalty,\n max_tokens: options.max_tokens,\n presence_penalty: options.presence_penalty,\n temperature: options.temperature,\n top_p: options.top_p,\n top_k: options.top_k,\n vendor: options.vendor,\n userIdentifier: options.userIdentifier,\n groupIdentifier: options.groupIdentifier,\n useVision: options.useVision,\n stream: stream,\n }\n }\n}\n","import { Assistant } from \"../scopes/conversational/Assistant\";\nimport { Conversation } from \"../scopes/conversational/Conversation\";\nimport { Copilot } from \"../scopes/conversational/Copilot\";\nimport { RealtimeSession } from \"../scopes/conversational/RealtimeSession\";\nimport { Activity } from \"../scopes/system/Activity\";\nimport { ChatCompletion } from \"../scopes/system/ChatCompletion\";\nimport { Plan } from \"../scopes/system/Plan\";\nimport { Proxy } from \"../scopes/system/Proxy\";\nimport {\n AgentResult,\n AgentType,\n ConversationalAgentExecutionOptionsMap,\n SystemAgentExecutionOptionsMap,\n} from \"../types\";\n\nexport class AgentFactory {\n static createAgent<T extends AgentType>(\n type: T,\n apiKey: string,\n baseUrl: string\n ): AgentTypeMap[T] {\n switch (type) {\n case \"assistant\": {\n return {\n createConversation: async (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ) => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n const conversation = await assistant.createConversation(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n\n return conversation;\n },\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"assistant\"]\n ) => {\n const assistant = Assistant.create(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n return assistant.createRealtimeSession(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n }\n case \"copilot\":\n return {\n createConversation: async (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"copilot\"]\n ): Promise<Conversation> => {\n const copilot = Copilot.create(agentCode, apiKey, baseUrl, options);\n const conversation = await copilot.createConversation(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n return conversation;\n },\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[\"copilot\"]\n ) => {\n const copilot = Copilot.create(agentCode, apiKey, baseUrl, options);\n return copilot.createRealtimeSession(\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n\n case \"activity\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Promise<AgentResult> => {\n return Activity[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"activity\"]\n ): Activity => {\n return Activity[\"create\"](agentCode, apiKey, baseUrl, options);\n },\n } as AgentTypeMap[T];\n }\n case \"chat-completion\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): Promise<AgentResult> => {\n return ChatCompletion[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"chat-completion\"]\n ): ChatCompletion => {\n return ChatCompletion[\"create\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n } as AgentTypeMap[T];\n }\n case \"proxy\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Promise<AgentResult> => {\n return Proxy[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"proxy\"]\n ): Proxy => {\n return Proxy[\"create\"](agentCode, apiKey, baseUrl, options);\n },\n } as AgentTypeMap[T];\n }\n case \"plan\": {\n return {\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ): Promise<AgentResult> => {\n return Plan[\"createAndExecute\"](\n agentCode,\n apiKey,\n baseUrl,\n options\n );\n },\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[\"plan\"]\n ): Plan => {\n return Plan[\"create\"](agentCode, apiKey, baseUrl, options);\n }\n } as AgentTypeMap[T];\n }\n default:\n throw new Error(`Agent type ${type} not supported`);\n }\n }\n}\n\nexport type ConversationalAgentScope<\n T extends keyof ConversationalAgentExecutionOptionsMap,\n> = {\n /**\n * Create a new conversation with an agent.\n * This allows you to send messages and receive responses.\n * \n * ## Regular conversation example:\n * ```typescript\n * const conversation = await client.agents.assistants.createConversation(\"agent-code\");\n * const response = await conversation.sendMessage(\"Hello!\");\n * console.log(response.content);\n * ```\n * \n * ## Streaming conversation example:\n * ```typescript\n * const conversation = await client.agents.assistants\n * .createConversation(\"agent-code\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"Hello!\");\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the conversation\n * @returns A Promise that resolves to a Conversation instance\n */\n createConversation: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[T]\n ) => Promise<Conversation>;\n\n /**\n * Create a real-time session with an agent.\n * This allows for voice interactions and real-time responses.\n * \n * ## Real-time session example:\n * ```typescript\n * const session = client.agents.assistants\n * .createRealtimeSession(\"agent-code\")\n * .on(\"session.created\", () => console.log(\"Session started\"))\n * .on(\"speech.started\", () => console.log(\"User started talking\"))\n * .on(\"speech.stopped\", () => console.log(\"User stopped talking\"))\n * .on(\"response.done\", (response) => console.log(\"Response:\", response))\n * .on(\"session.stopped\", () => console.log(\"Session stopped\"));\n * \n * await session.start();\n * // Later: session.stop();\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the real-time session\n * @returns A RealtimeSession instance\n */\n createRealtimeSession: (\n agentCode: string,\n options?: ConversationalAgentExecutionOptionsMap[T]\n ) => RealtimeSession;\n};\n\nexport type SystemAgentScope<\n T extends keyof SystemAgentExecutionOptionsMap,\n TCreateReturn,\n> = {\n /**\n * Execute an agent synchronously and get the result.\n * \n * ## Example:\n * ```typescript\n * const response = await client.agents.activities.execute(\"agent-code\", {\n * // Optional parameters specific to the agent type\n * inputParameters: {\n * param1: \"value1\",\n * param2: \"value2\"\n * }\n * });\n * console.log(response.content);\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the execution\n * @returns A Promise that resolves to an AgentResult\n */\n execute: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[T]\n ) => Promise<AgentResult>;\n\n /**\n * Create an agent instance for streaming execution.\n * \n * ## Streaming example:\n * ```typescript\n * const agent = client.agents.activities\n * .create(\"agent-code\", {\n * // Optional parameters specific to the agent\n * inputParameters: {\n * param1: \"value1\",\n * param2: \"value2\"\n * }\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await agent.stream();\n * ```\n * \n * @param agentCode - The unique identifier of the agent\n * @param options - Additional options for the agent creation\n * @returns An agent instance ready for streaming\n */\n create: (\n agentCode: string,\n options?: SystemAgentExecutionOptionsMap[T]\n ) => TCreateReturn;\n};\n\ntype AgentTypeMap = {\n assistant: ConversationalAgentScope<\"assistant\">;\n copilot: ConversationalAgentScope<\"copilot\">;\n activity: SystemAgentScope<\"activity\", Activity>;\n \"chat-completion\": SystemAgentScope<\"chat-completion\", ChatCompletion>;\n proxy: SystemAgentScope<\"proxy\", Proxy>;\n plan: SystemAgentScope<\"plan\", Plan>;\n};\n","import {\n AgentFactory,\n ConversationalAgentScope,\n SystemAgentScope,\n} from \"./factories/AgentFactory\";\nimport { Activity } from \"./scopes/system/Activity\";\nimport { ChatCompletion } from \"./scopes/system/ChatCompletion\";\nimport { Plan } from \"./scopes/system/Plan\";\nimport { Proxy } from \"./scopes/system/Proxy\";\nimport { SerenityClientOptions } from \"./types\";\n\nexport default class SerenityClient {\n private apiKey: string;\n private baseUrl = \"https://api.serenitystar.ai/api\";\n\n /**\n * Interact with the different agents available in Serenity Star.\n * You can choose between assistants, copilots, activities, chat completions, proxies, and plans.\n */\n public readonly agents: {\n /**\n * Interact with Assistant agents available in Serenity Star.\n * This allows you to create conversations and real-time sessions.\n * \n * ## Start a new conversation and send a message:\n * ```typescript\n * // Regular text conversation\n * const conversation = await client.agents.assistants.createConversation(\"translator-assistant\");\n * const response = await conversation.sendMessage(\"The sun was beginning to set...\");\n * console.log(response.content);\n * \n * ```\n * \n * ## Stream message with SSE\n * ```typescript\n * const conversation = await client.agents.assistants\n * .createConversation(\"translator-assistant\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"The sun was beginning to set...\");\n * \n * ```\n * \n * ## Real-time voice conversation example:\n * ```typescript\n * const session = client.agents.assistants.createRealtimeSession(\"marketing-assistant\")\n * .on(\"session.created\", () => console.log(\"Session started\"))\n * .on(\"speech.started\", () => console.log(\"User started talking\"))\n * .on(\"speech.stopped\", () => console.log(\"User stopped talking\"))\n * .on(\"response.done\", (response) => console.log(\"Response:\", response))\n * .on(\"session.stopped\", () => console.log(\"Session stopped\"));\n * \n * await session.start();\n * // Later: session.stop();\n * ```\n */\n assistants: ConversationalAgentScope<\"assistant\">;\n\n /**\n * Interact with Copilot agents available in Serenity Star.\n * Similar to assistants but allows you to interact with the UI through callbacks.\n * \n * Text conversation example:\n * ```typescript\n * // Regular conversation\n * const conversation = await client.agents.copilots.createConversation(\"app-copilot\");\n * const response = await conversation.sendMessage(\"How do I create a new support ticket?\");\n * console.log(response.content);\n * \n * // Streaming conversation\n * const conversation = await client.agents.copilots\n * .createConversation(\"app-copilot\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await conversation.streamMessage(\"How do I create a new support ticket?\");\n * ```\n */\n copilots: ConversationalAgentScope<\"copilot\">;\n\n /**\n * Interact with Activity agents available in Serenity Star.\n * This allows you to execute activities.\n * It supports streaming.\n * Execute simple tasks based on the user input.\n * \n * ## Regular activity execution:\n * ```typescript\n * const response = await client.agents.activities.execute(\"marketing-campaign\")\n * console.log(response.content);\n * \n * // With parameters\n * const response = await client.agents.activities.execute(\"cooking-activity\", {\n * inputParameters: {\n * ingredientOne: \"chicken\",\n * ingredientTwo: \"onion\",\n * ingredientThree: \"cream\",\n * }\n * });\n * ```\n * \n * ## Stream activity with SSE:\n * ```typescript\n * const activity = client.agents.activities\n * .create(\"marketing-campaign\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await activity.stream();\n * ```\n */\n activities: SystemAgentScope<\"activity\", Activity>;\n\n /**\n * Interact with Chat Completion agents available in Serenity Star.\n * This allows you to execute chat completions.\n * It supports streaming.\n * Chat completions allows you to fully control the conversation and generate completions.\n * \n * ## Regular chat completion:\n * ```typescript\n * const response = await client.agents.chatCompletions.execute(\"Health-Coach\", {\n * message: \"Hello!\"\n * });\n * console.log(response.content);\n * ```\n * \n * ## Stream chat completion with SSE:\n * ```typescript\n * const chatCompletion = client.agents.chatCompletions\n * .create(\"Health-Coach\", {\n * message: \"Hello!\"\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await chatCompletion.stream();\n * ```\n */\n chatCompletions: SystemAgentScope<\"chat-completion\", ChatCompletion>;\n\n /**\n * Interact with Proxy agents available in Serenity Star.\n * This allows you to execute proxies.\n * It supports streaming.\n * Proxy agents allows you to define a set of parameters dynamically for each request\n * \n * ## Regular proxy execution:\n * ```typescript\n * const response = await client.agents.proxies.execute(\"proxy-agent\", {\n * model: \"gpt-4o-mini-2024-07-18\",\n * messages: [\n * {\n * role: \"system\",\n * content: \"You are a helpful assistant. Always use short and concise responses\"\n * },\n * { role: \"user\", content: \"What is artificial intelligence?\" }\n * ],\n * temperature: 1,\n * max_tokens: 250\n * });\n * console.log(response.content);\n * ```\n * \n * ## Stream proxy with SSE:\n * ```typescript\n * const proxy = client.agents.proxies\n * .create(\"proxy-agent\", {\n * model: \"gpt-4o-mini-2024-07-18\",\n * messages: [\n * {\n * role: \"system\",\n * content: \"You are a helpful assistant. Always use short and concise responses\"\n * },\n * { role: \"user\", content: \"What is artificial intelligence?\" }\n * ],\n * temperature: 1,\n * max_tokens: 250\n * })\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await proxy.stream();\n * ```\n */\n proxies: SystemAgentScope<\"proxy\", Proxy>;\n\n /**\n * Interact with Plan agents available in Serenity Star.\n * This allows you to execute plans.\n * It supports streaming.\n * Plan agents are capable of building an execution plan based on the user input and execute it.\n * \n * ## Regular plan execution:\n * ```typescript\n * const response = await client.agents.plans.execute(\"event-planner\");\n * console.log(response.content);\n * ```\n * \n * ## Stream plan with SSE:\n * ```typescript\n * const plan = client.agents.plans\n * .create(\"event-planner\")\n * .on(\"start\", () => console.log(\"Started\"))\n * .on(\"content\", (chunk) => console.log(chunk))\n * .on(\"error\", (error) => console.error(error));\n * \n * await plan.stream();\n * ```\n */\n plans: SystemAgentScope<\"plan\", Plan>;\n };\n\n constructor(options: SerenityClientOptions) {\n if (!options.apiKey) {\n throw new Error(\"The API key is required\");\n }\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl || this.baseUrl;\n\n this.agents = {\n assistants: AgentFactory.createAgent(\n \"assistant\",\n this.apiKey,\n this.baseUrl\n ),\n copilots: AgentFactory.createAgent(\"copilot\", this.apiKey, this.baseUrl),\n activities: AgentFactory.createAgent(\n \"activity\",\n this.apiKey,\n this.baseUrl\n ),\n chatCompletions: AgentFactory.createAgent(\n \"chat-completion\",\n this.apiKey,\n this.baseUrl\n ),\n proxies: AgentFactory.createAgent(\"proxy\", this.apiKey, this.baseUrl),\n plans: AgentFactory.createAgent(\"plan\", this.apiKey, this.baseUrl),\n };\n }\n}\n"],"mappings":"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","names":["undiciFetch","UndiciHeaders","UndiciRequest","UndiciResponse","_a","undici","EventEmitter","eventName","listener","args","_a","_RealtimeSession_instances","stop_fn","setupWebSocketConnection_fn","handleIncomingMessagesFromSerenity_fn","handleIncomingMessagesFromVendor_fn","setupWebRTCConnection_fn","getAudioFromMicrophone_fn","startSession_fn","resetInactivityTimeout_fn","extractErrorMessageFromEvent_fn","RealtimeSession","EventEmitter","agentCode","apiKey","baseUrl","options","__privateAdd","__async","__privateMethod","error","audioTrack","reason","details","track","url","sessionCreateEvent","event","data","obj","eventData","errorDetails","isSerenityEvent","currentDate","channelName","e","audioElement","offer","sdpResponse","answer","SseConnection","_","url","fetchOptions","__async","response","reader","decoder","done","value","error","eventEnd","lineEnding","eventDelimiter","eventText","lines","event","line","eventType","callback","listeners","cb","data","AgentMapper","data","_Conversation_instances","getConversationId_fn","createExecuteBody_fn","appendUserIdentifierIfNeeded_fn","appendChannelIfNeeded_fn","appendInputParametersIfNeeded_fn","appendInitConversationParamsIfNeeded_fn","appendVolatileKnowledgeIdsIfNeeded_fn","_Conversation","EventEmitter","agentCode","apiKey","baseUrl","options","__privateAdd","__async","_a","instance","__privateMethod","message","version","url","body","connection","SseConnection","responsePromise","resolve","reject","data","error","chunk","finalMessage","fetchOptions","response","retryAfter","AgentMapper","reqBody","stream","parameters","key","value","volatileKnowledgeIds","Conversation","ConversationalAgent","agentCode","apiKey","baseUrl","options","RealtimeSession","__async","Conversation","Assistant","_Assistant","ConversationalAgent","agentCode","apiKey","baseUrl","options","Copilot","_Copilot","ConversationalAgent","agentCode","apiKey","baseUrl","options","SystemAgent","EventEmitter","agentCode","apiKey","baseUrl","options","__async","_a","version","url","body","connection","SseConnection","responsePromise","resolve","reject","data","error","chunk","finalMessage","fetchOptions","response","retryAfter","AgentMapper","stream","Activity","_Activity","SystemAgent","agentCode","apiKey","baseUrl","options","stream","baseOptions","body","_a","key","value","ChatCompletion","_ChatCompletion","SystemAgent","agentCode","apiKey","baseUrl","options","stream","body","_a","key","value","Plan","_Plan","SystemAgent","agentCode","apiKey","baseUrl","options","stream","baseOptions","body","_a","key","value","Proxy","_Proxy","SystemAgent","agentCode","apiKey","baseUrl","options","stream","AgentFactory","type","apiKey","baseUrl","agentCode","options","__async","Assistant","Copilot","Activity","ChatCompletion","Proxy","Plan","SerenityClient","options","AgentFactory"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serenity-star/sdk",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "The Serenity Star JavaScript SDK provides a convenient way to interact with the Serenity Star API, enabling you to build custom applications.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",