@serenity-star/sdk 2.2.1 → 2.3.0

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
@@ -291,12 +291,36 @@ type BaseErrorBody = {
291
291
  };
292
292
  type ValidationErrorBody = BaseErrorBody & {
293
293
  errors: {
294
- [key: string]: string;
294
+ [key: string]: string | string[];
295
295
  };
296
296
  };
297
297
  type RateLimitErrorBody = BaseErrorBody & {
298
298
  retryAfter: number;
299
299
  };
300
+ type FileError = {
301
+ file?: File;
302
+ error: Error;
303
+ };
304
+ type VolatileKnowledgeUploadRes = {
305
+ success: true;
306
+ id: string;
307
+ expirationDate: string;
308
+ status: string;
309
+ fileName: string;
310
+ fileSize: number;
311
+ } | {
312
+ success: false;
313
+ error: FileError;
314
+ };
315
+ type VolatileKnowledgeUploadOptions = {
316
+ processEmbeddings?: boolean;
317
+ noExpiration?: boolean;
318
+ expirationDays?: number;
319
+ useVision?: boolean;
320
+ locale?: {
321
+ uploadFileErrorMessage?: string;
322
+ };
323
+ };
300
324
 
301
325
  type MessageAdditionalInfo = {
302
326
  inputParameters?: {
@@ -458,13 +482,6 @@ type SpeechGenerationResult = {
458
482
  finish_reason?: string;
459
483
  usage?: object;
460
484
  };
461
- type VolatileKnowledgeUploadRes = {
462
- id: string;
463
- expirationDate: string;
464
- status: string;
465
- fileName: string;
466
- fileSize: number;
467
- };
468
485
  type AttachedVolatileKnowledge = {
469
486
  id: string;
470
487
  expirationDate: string;
@@ -582,6 +599,78 @@ type ConnectorStatusResult = {
582
599
  isConnected: boolean;
583
600
  };
584
601
 
602
+ /**
603
+ * Manages volatile knowledge files for agent instances.
604
+ * Provides methods to upload, remove, and clear files.
605
+ */
606
+ declare class VolatileKnowledgeManager {
607
+ private readonly baseUrl;
608
+ private readonly apiKey;
609
+ private ids;
610
+ constructor(baseUrl: string, apiKey: string);
611
+ /**
612
+ * Upload a file to be used as volatile knowledge in the next agent execution.
613
+ * The file will be automatically included in subsequent messages/executions until cleared.
614
+ *
615
+ * @param file - The file to upload
616
+ * @param options - Optional configuration for file processing
617
+ * @returns Upload result with file details or errors
618
+ *
619
+ * @example
620
+ * ```typescript
621
+ * const uploadResult = await conversation.volatileKnowledge.upload(file);
622
+ *
623
+ * if (uploadResult.success) {
624
+ * console.log('File uploaded:', uploadResult.id);
625
+ * } else {
626
+ * console.error('Upload failed:', uploadResult.error);
627
+ * }
628
+ * ```
629
+ */
630
+ upload(file: File, options?: VolatileKnowledgeUploadOptions): Promise<VolatileKnowledgeUploadRes>;
631
+ /**
632
+ * Remove a specific volatile knowledge file by its ID.
633
+ *
634
+ * @param fileId - The ID of the file to remove
635
+ * @returns True if the file was removed, false otherwise
636
+ *
637
+ * @example
638
+ * ```typescript
639
+ * const uploadResult = await conversation.volatileKnowledge.upload(file);
640
+ *
641
+ * if (uploadResult.success) {
642
+ * // Remove the file from the queue
643
+ * conversation.volatileKnowledge.removeById(uploadResult.id);
644
+ * }
645
+ * ```
646
+ */
647
+ removeById(fileId: string): boolean;
648
+ /**
649
+ * Clear all volatile knowledge files from the queue.
650
+ *
651
+ * @example
652
+ * ```typescript
653
+ * await conversation.volatileKnowledge.upload(file1);
654
+ * await conversation.volatileKnowledge.upload(file2);
655
+ *
656
+ * // Clear all files from the queue
657
+ * conversation.volatileKnowledge.clear();
658
+ * ```
659
+ */
660
+ clear(): void;
661
+ /**
662
+ * Get all volatile knowledge file IDs currently in the queue.
663
+ * @internal
664
+ */
665
+ getIds(): string[];
666
+ /**
667
+ * Fetch details of a volatile knowledge file by its ID.
668
+ * @param fileId - The ID of the file to fetch
669
+ * @returns The file details or an error
670
+ */
671
+ getById(fileId: string): Promise<VolatileKnowledgeUploadRes>;
672
+ }
673
+
585
674
  declare class Conversation extends EventEmitter<SSEStreamEvents> {
586
675
  #private;
587
676
  private agentCode;
@@ -593,6 +682,19 @@ declare class Conversation extends EventEmitter<SSEStreamEvents> {
593
682
  private inputParameters?;
594
683
  conversationId?: string;
595
684
  info: ConversationInfoResult | null;
685
+ /**
686
+ * Volatile knowledge manager for uploading and managing temporary files.
687
+ * Files uploaded through this manager will be included in the next message/execution.
688
+ *
689
+ * @example
690
+ * ```typescript
691
+ * const uploadResult = await conversation.volatileKnowledge.upload(file);
692
+ * if (uploadResult.success) {
693
+ * console.log('File uploaded:', uploadResult.id);
694
+ * }
695
+ * ```
696
+ */
697
+ readonly volatileKnowledge: VolatileKnowledgeManager;
596
698
  private constructor();
597
699
  private static create;
598
700
  private static createWithoutInfo;
@@ -769,6 +871,19 @@ declare abstract class SystemAgent<T extends keyof SystemAgentExecutionOptionsMa
769
871
  protected readonly apiKey: string;
770
872
  protected readonly baseUrl: string;
771
873
  protected readonly options?: SystemAgentExecutionOptionsMap[T] | undefined;
874
+ /**
875
+ * Volatile knowledge manager for uploading and managing temporary files.
876
+ * Files uploaded through this manager will be included in the next execution.
877
+ *
878
+ * @example
879
+ * ```typescript
880
+ * const uploadResult = await activity.volatileKnowledge.upload(file);
881
+ * if (uploadResult.success) {
882
+ * console.log('File uploaded:', uploadResult.id);
883
+ * }
884
+ * ```
885
+ */
886
+ readonly volatileKnowledge: VolatileKnowledgeManager;
772
887
  protected constructor(agentCode: string, apiKey: string, baseUrl: string, options?: SystemAgentExecutionOptionsMap[T] | undefined);
773
888
  stream(): Promise<AgentResult>;
774
889
  protected execute(): Promise<AgentResult>;
@@ -1105,4 +1220,4 @@ declare class ExternalErrorHelper {
1105
1220
  private static isBaseErrorBody;
1106
1221
  }
1107
1222
 
1108
- export { type AgentResult, type BaseErrorBody, type ChatWidgetRes, type ConnectorStatusResult, Conversation, type ConversationInfoResult, type ConversationRes, ExternalErrorHelper as ErrorHelper, type GetConnectorStatusOptions, type Message, type PendingAction, type RateLimitErrorBody, RealtimeSession, type RemoveFeedbackOptions, type RemoveFeedbackResult, SerenityClient, type SubmitFeedbackOptions, type SubmitFeedbackResult, type ValidationErrorBody };
1223
+ export { type AgentResult, type BaseErrorBody, type ChatWidgetRes, type ConnectorStatusResult, Conversation, type ConversationInfoResult, type ConversationRes, ExternalErrorHelper as ErrorHelper, type FileError, type GetConnectorStatusOptions, type Message, type PendingAction, type RateLimitErrorBody, RealtimeSession, type RemoveFeedbackOptions, type RemoveFeedbackResult, SerenityClient, type SubmitFeedbackOptions, type SubmitFeedbackResult, type ValidationErrorBody, VolatileKnowledgeManager, type VolatileKnowledgeUploadOptions, type VolatileKnowledgeUploadRes };
package/dist/index.d.ts CHANGED
@@ -291,12 +291,36 @@ type BaseErrorBody = {
291
291
  };
292
292
  type ValidationErrorBody = BaseErrorBody & {
293
293
  errors: {
294
- [key: string]: string;
294
+ [key: string]: string | string[];
295
295
  };
296
296
  };
297
297
  type RateLimitErrorBody = BaseErrorBody & {
298
298
  retryAfter: number;
299
299
  };
300
+ type FileError = {
301
+ file?: File;
302
+ error: Error;
303
+ };
304
+ type VolatileKnowledgeUploadRes = {
305
+ success: true;
306
+ id: string;
307
+ expirationDate: string;
308
+ status: string;
309
+ fileName: string;
310
+ fileSize: number;
311
+ } | {
312
+ success: false;
313
+ error: FileError;
314
+ };
315
+ type VolatileKnowledgeUploadOptions = {
316
+ processEmbeddings?: boolean;
317
+ noExpiration?: boolean;
318
+ expirationDays?: number;
319
+ useVision?: boolean;
320
+ locale?: {
321
+ uploadFileErrorMessage?: string;
322
+ };
323
+ };
300
324
 
301
325
  type MessageAdditionalInfo = {
302
326
  inputParameters?: {
@@ -458,13 +482,6 @@ type SpeechGenerationResult = {
458
482
  finish_reason?: string;
459
483
  usage?: object;
460
484
  };
461
- type VolatileKnowledgeUploadRes = {
462
- id: string;
463
- expirationDate: string;
464
- status: string;
465
- fileName: string;
466
- fileSize: number;
467
- };
468
485
  type AttachedVolatileKnowledge = {
469
486
  id: string;
470
487
  expirationDate: string;
@@ -582,6 +599,78 @@ type ConnectorStatusResult = {
582
599
  isConnected: boolean;
583
600
  };
584
601
 
602
+ /**
603
+ * Manages volatile knowledge files for agent instances.
604
+ * Provides methods to upload, remove, and clear files.
605
+ */
606
+ declare class VolatileKnowledgeManager {
607
+ private readonly baseUrl;
608
+ private readonly apiKey;
609
+ private ids;
610
+ constructor(baseUrl: string, apiKey: string);
611
+ /**
612
+ * Upload a file to be used as volatile knowledge in the next agent execution.
613
+ * The file will be automatically included in subsequent messages/executions until cleared.
614
+ *
615
+ * @param file - The file to upload
616
+ * @param options - Optional configuration for file processing
617
+ * @returns Upload result with file details or errors
618
+ *
619
+ * @example
620
+ * ```typescript
621
+ * const uploadResult = await conversation.volatileKnowledge.upload(file);
622
+ *
623
+ * if (uploadResult.success) {
624
+ * console.log('File uploaded:', uploadResult.id);
625
+ * } else {
626
+ * console.error('Upload failed:', uploadResult.error);
627
+ * }
628
+ * ```
629
+ */
630
+ upload(file: File, options?: VolatileKnowledgeUploadOptions): Promise<VolatileKnowledgeUploadRes>;
631
+ /**
632
+ * Remove a specific volatile knowledge file by its ID.
633
+ *
634
+ * @param fileId - The ID of the file to remove
635
+ * @returns True if the file was removed, false otherwise
636
+ *
637
+ * @example
638
+ * ```typescript
639
+ * const uploadResult = await conversation.volatileKnowledge.upload(file);
640
+ *
641
+ * if (uploadResult.success) {
642
+ * // Remove the file from the queue
643
+ * conversation.volatileKnowledge.removeById(uploadResult.id);
644
+ * }
645
+ * ```
646
+ */
647
+ removeById(fileId: string): boolean;
648
+ /**
649
+ * Clear all volatile knowledge files from the queue.
650
+ *
651
+ * @example
652
+ * ```typescript
653
+ * await conversation.volatileKnowledge.upload(file1);
654
+ * await conversation.volatileKnowledge.upload(file2);
655
+ *
656
+ * // Clear all files from the queue
657
+ * conversation.volatileKnowledge.clear();
658
+ * ```
659
+ */
660
+ clear(): void;
661
+ /**
662
+ * Get all volatile knowledge file IDs currently in the queue.
663
+ * @internal
664
+ */
665
+ getIds(): string[];
666
+ /**
667
+ * Fetch details of a volatile knowledge file by its ID.
668
+ * @param fileId - The ID of the file to fetch
669
+ * @returns The file details or an error
670
+ */
671
+ getById(fileId: string): Promise<VolatileKnowledgeUploadRes>;
672
+ }
673
+
585
674
  declare class Conversation extends EventEmitter<SSEStreamEvents> {
586
675
  #private;
587
676
  private agentCode;
@@ -593,6 +682,19 @@ declare class Conversation extends EventEmitter<SSEStreamEvents> {
593
682
  private inputParameters?;
594
683
  conversationId?: string;
595
684
  info: ConversationInfoResult | null;
685
+ /**
686
+ * Volatile knowledge manager for uploading and managing temporary files.
687
+ * Files uploaded through this manager will be included in the next message/execution.
688
+ *
689
+ * @example
690
+ * ```typescript
691
+ * const uploadResult = await conversation.volatileKnowledge.upload(file);
692
+ * if (uploadResult.success) {
693
+ * console.log('File uploaded:', uploadResult.id);
694
+ * }
695
+ * ```
696
+ */
697
+ readonly volatileKnowledge: VolatileKnowledgeManager;
596
698
  private constructor();
597
699
  private static create;
598
700
  private static createWithoutInfo;
@@ -769,6 +871,19 @@ declare abstract class SystemAgent<T extends keyof SystemAgentExecutionOptionsMa
769
871
  protected readonly apiKey: string;
770
872
  protected readonly baseUrl: string;
771
873
  protected readonly options?: SystemAgentExecutionOptionsMap[T] | undefined;
874
+ /**
875
+ * Volatile knowledge manager for uploading and managing temporary files.
876
+ * Files uploaded through this manager will be included in the next execution.
877
+ *
878
+ * @example
879
+ * ```typescript
880
+ * const uploadResult = await activity.volatileKnowledge.upload(file);
881
+ * if (uploadResult.success) {
882
+ * console.log('File uploaded:', uploadResult.id);
883
+ * }
884
+ * ```
885
+ */
886
+ readonly volatileKnowledge: VolatileKnowledgeManager;
772
887
  protected constructor(agentCode: string, apiKey: string, baseUrl: string, options?: SystemAgentExecutionOptionsMap[T] | undefined);
773
888
  stream(): Promise<AgentResult>;
774
889
  protected execute(): Promise<AgentResult>;
@@ -1105,4 +1220,4 @@ declare class ExternalErrorHelper {
1105
1220
  private static isBaseErrorBody;
1106
1221
  }
1107
1222
 
1108
- export { type AgentResult, type BaseErrorBody, type ChatWidgetRes, type ConnectorStatusResult, Conversation, type ConversationInfoResult, type ConversationRes, ExternalErrorHelper as ErrorHelper, type GetConnectorStatusOptions, type Message, type PendingAction, type RateLimitErrorBody, RealtimeSession, type RemoveFeedbackOptions, type RemoveFeedbackResult, SerenityClient, type SubmitFeedbackOptions, type SubmitFeedbackResult, type ValidationErrorBody };
1223
+ export { type AgentResult, type BaseErrorBody, type ChatWidgetRes, type ConnectorStatusResult, Conversation, type ConversationInfoResult, type ConversationRes, ExternalErrorHelper as ErrorHelper, type FileError, type GetConnectorStatusOptions, type Message, type PendingAction, type RateLimitErrorBody, RealtimeSession, type RemoveFeedbackOptions, type RemoveFeedbackResult, SerenityClient, type SubmitFeedbackOptions, type SubmitFeedbackResult, type ValidationErrorBody, VolatileKnowledgeManager, type VolatileKnowledgeUploadOptions, type VolatileKnowledgeUploadRes };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- "use strict";var V=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var ce=Object.getOwnPropertyNames,J=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,pe=Object.prototype.propertyIsEnumerable;var D=i=>{throw TypeError(i)};var W=(i,s,e)=>s in i?V(i,s,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[s]=e,L=(i,s)=>{for(var e in s||(s={}))q.call(s,e)&&W(i,e,s[e]);if(J)for(var e of J(s))pe.call(s,e)&&W(i,e,s[e]);return i};var ue=(i,s)=>{for(var e in s)V(i,e,{get:s[e],enumerable:!0})},de=(i,s,e,t)=>{if(s&&typeof s=="object"||typeof s=="function")for(let n of ce(s))!q.call(i,n)&&n!==e&&V(i,n,{get:()=>s[n],enumerable:!(t=ae(s,n))||t.enumerable});return i};var ge=i=>de(V({},"__esModule",{value:!0}),i);var he=(i,s,e)=>s.has(i)||D("Cannot "+e);var K=(i,s,e)=>s.has(i)?D("Cannot add the same private member more than once"):s instanceof WeakSet?s.add(i):s.set(i,e);var d=(i,s,e)=>(he(i,s,"access private method"),e);var c=(i,s,e)=>new Promise((t,n)=>{var r=u=>{try{a(e.next(u))}catch(h){n(h)}},o=u=>{try{a(e.throw(u))}catch(h){n(h)}},a=u=>u.done?t(u.value):Promise.resolve(u.value).then(r,o);a((e=e.apply(i,s)).next())});var le={};ue(le,{ErrorHelper:()=>N,RealtimeSession:()=>I,SerenityClient:()=>M});module.exports=ge(le);var U,X,Y,H,G;if(typeof process!="undefined"&&((G=process.versions)!=null&&G.node)){let i=require("undici");U=i.fetch,X=i.Headers,Y=i.Request,H=i.Response,globalThis.fetch||(globalThis.fetch=U,globalThis.Headers=X,globalThis.Request=Y,globalThis.Response=H)}var E=class{constructor(){this.listeners={}}on(s,e){return this.listeners[s]||(this.listeners[s]=[]),this.listeners[s].push(e),this}emit(s,...e){var t;(t=this.listeners[s])==null||t.forEach(n=>n(...e))}};var p,x,z,Q,Z,ee,te,se,F,ne,I=class extends E{constructor(e,t,n,r){super();K(this,p);this.timeout=12e4;this.apiKey=t,this.agentCode=e,this.baseUrl=n,this.agentVersion=r==null?void 0:r.agentVersion,this.inputParameters=r==null?void 0:r.inputParameters,this.userIdentifier=r==null?void 0:r.userIdentifier,this.channel=r==null?void 0:r.channel}start(){return c(this,null,function*(){try{d(this,p,z).call(this)}catch(e){throw new Error("Error starting the session")}})}stop(){d(this,p,x).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,x=function(e,t){if(this.socket&&this.socket.readyState===WebSocket.OPEN)try{this.socket.close(1e3,"Client closed the session")}catch(n){console.error("Error closing WebSocket connection:",n)}this.localStream&&(this.localStream.getTracks().forEach(n=>n.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)},z=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=()=>{d(this,p,x).call(this)},this.socket.onerror=t=>{this.emit("error","Error connecting to the server"),d(this,p,x).call(this)},this.socket.onmessage=t=>{d(this,p,Q).call(this,t.data)}},Q=function(e){return c(this,null,function*(){let t=JSON.parse(e);switch(t.type){case"serenity.session.created":{let n=t;this.sessionConfiguration={url:n.url,headers:n.headers},d(this,p,ee).call(this),d(this,p,Z).call(this),yield d(this,p,se).call(this);break}case"serenity.session.close":{let n=t,r=d(this,p,ne).call(this,n);this.emit("error",r),d(this,p,x).call(this,n.reason,r);break}case"serenity.response.processed":{let n=t;this.emit("response.processed",n.result);break}default:{let n=t.type.startsWith("serenity");this.dataChannel&&!n&&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",n=>{d(this,p,F).call(this);let r=JSON.parse(n.data);try{switch(r.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(o){this.emit("error","Error processing incoming messages from vendor")}finally{this.socket&&this.socket.send(JSON.stringify(r))}})},ee=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])}},te=function(){return c(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)})},se=function(){return c(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 d(this,p,te).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 n={type:"answer",sdp:yield t.text()};yield this.peerConnection.setRemoteDescription(n),this.emit("session.created"),d(this,p,F).call(this)}catch(e){this.emit("error","Error starting the session"),d(this,p,x).call(this)}})},F=function(){clearTimeout(this.inactivityTimeout),this.inactivityTimeout=setTimeout(()=>{d(this,p,x).call(this)},this.timeout)},ne=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 b=class{constructor(){this.buffer="";this.eventListeners={start:[s=>{}],stop:[s=>{this.stop()}],error:[s=>{this.stop()}]},this.active=!1}start(s,e){return c(this,null,function*(){this.active=!0;try{let t=yield fetch(s,e);if(!t.ok)throw t;if(t.headers.get("Content-Type")!=="text/event-stream")return t;let r=t.body.getReader(),o=new TextDecoder("utf-8");for(this.buffer="";this.active;){let{done:a,value:u}=yield r.read();if(a)break;this.buffer+=o.decode(u,{stream:!0}),this.processEvents()}return t}catch(t){throw this.active=!1,t}})}processEvents(){let s,e=this.buffer.includes(`\r
1
+ "use strict";var N=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var ge=Object.getOwnPropertyNames,q=Object.getOwnPropertySymbols;var X=Object.prototype.hasOwnProperty,he=Object.prototype.propertyIsEnumerable;var Y=i=>{throw TypeError(i)};var W=(i,t,e)=>t in i?N(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e,O=(i,t)=>{for(var e in t||(t={}))X.call(t,e)&&W(i,e,t[e]);if(q)for(var e of q(t))he.call(t,e)&&W(i,e,t[e]);return i};var me=(i,t)=>{for(var e in t)N(i,e,{get:t[e],enumerable:!0})},ye=(i,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ge(t))!X.call(i,n)&&n!==e&&N(i,n,{get:()=>t[n],enumerable:!(s=le(t,n))||s.enumerable});return i};var fe=i=>ye(N({},"__esModule",{value:!0}),i);var z=(i,t,e)=>t.has(i)||Y("Cannot "+e);var G=(i,t,e)=>(z(i,t,"read from private field"),e?e.call(i):t.get(i)),b=(i,t,e)=>t.has(i)?Y("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(i):t.set(i,e);var l=(i,t,e)=>(z(i,t,"access private method"),e);var c=(i,t,e)=>new Promise((s,n)=>{var r=p=>{try{a(e.next(p))}catch(u){n(u)}},o=p=>{try{a(e.throw(p))}catch(u){n(u)}},a=p=>p.done?s(p.value):Promise.resolve(p.value).then(r,o);a((e=e.apply(i,t)).next())});var ve={};me(ve,{ErrorHelper:()=>L,RealtimeSession:()=>R,SerenityClient:()=>F,VolatileKnowledgeManager:()=>C});module.exports=fe(ve);var H,Q,Z,ee,te;if(typeof process!="undefined"&&((te=process.versions)!=null&&te.node)){let i=require("undici");H=i.fetch,Q=i.Headers,Z=i.Request,ee=i.Response,globalThis.fetch||(globalThis.fetch=H,globalThis.Headers=Q,globalThis.Request=Z,globalThis.Response=ee)}var S=class{constructor(){this.listeners={}}on(t,e){return this.listeners[t]||(this.listeners[t]=[]),this.listeners[t].push(e),this}emit(t,...e){var s;(s=this.listeners[t])==null||s.forEach(n=>n(...e))}};var d,A,se,ne,re,ie,oe,ae,J,ce,R=class extends S{constructor(e,s,n,r){super();b(this,d);this.timeout=12e4;this.apiKey=s,this.agentCode=e,this.baseUrl=n,this.agentVersion=r==null?void 0:r.agentVersion,this.inputParameters=r==null?void 0:r.inputParameters,this.userIdentifier=r==null?void 0:r.userIdentifier,this.channel=r==null?void 0:r.channel}start(){return c(this,null,function*(){try{l(this,d,se).call(this)}catch(e){throw new Error("Error starting the session")}})}stop(){l(this,d,A).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)}}};d=new WeakSet,A=function(e,s){if(this.socket&&this.socket.readyState===WebSocket.OPEN)try{this.socket.close(1e3,"Client closed the session")}catch(n){console.error("Error closing WebSocket connection:",n)}this.localStream&&(this.localStream.getTracks().forEach(n=>n.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,s),clearTimeout(this.inactivityTimeout)},se=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 s={type:"serenity.session.create",input_parameters:this.inputParameters,user_identifier:this.userIdentifier,channel:this.channel};this.socket.send(JSON.stringify(s))},this.socket.onclose=()=>{l(this,d,A).call(this)},this.socket.onerror=s=>{this.emit("error","Error connecting to the server"),l(this,d,A).call(this)},this.socket.onmessage=s=>{l(this,d,ne).call(this,s.data)}},ne=function(e){return c(this,null,function*(){let s=JSON.parse(e);switch(s.type){case"serenity.session.created":{let n=s;this.sessionConfiguration={url:n.url,headers:n.headers},l(this,d,ie).call(this),l(this,d,re).call(this),yield l(this,d,ae).call(this);break}case"serenity.session.close":{let n=s,r=l(this,d,ce).call(this,n);this.emit("error",r),l(this,d,A).call(this,n.reason,r);break}case"serenity.response.processed":{let n=s;this.emit("response.processed",n.result);break}default:{let n=s.type.startsWith("serenity");this.dataChannel&&!n&&this.dataChannel.send(JSON.stringify(s))}}})},re=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(/\..+/,""),s=`data-channel-${this.agentCode}-${e}`;this.dataChannel=this.peerConnection.createDataChannel(s),this.dataChannel.addEventListener("message",n=>{l(this,d,J).call(this);let r=JSON.parse(n.data);try{switch(r.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(o){this.emit("error","Error processing incoming messages from vendor")}finally{this.socket&&this.socket.send(JSON.stringify(r))}})},ie=function(){this.peerConnection=new RTCPeerConnection;let e=document.createElement("audio");e.autoplay=!0,this.peerConnection.ontrack=s=>{s.streams&&s.streams[0]&&(e.srcObject=s.streams[0])}},oe=function(){return c(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)})},ae=function(){return c(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 l(this,d,oe).call(this);let e=yield this.peerConnection.createOffer();yield this.peerConnection.setLocalDescription(e);let s=yield fetch(`${this.sessionConfiguration.url}`,{method:"POST",body:e.sdp,headers:this.sessionConfiguration.headers});if(!s.ok)throw new Error("Error starting the session");let n={type:"answer",sdp:yield s.text()};yield this.peerConnection.setRemoteDescription(n),this.emit("session.created"),l(this,d,J).call(this)}catch(e){this.emit("error","Error starting the session"),l(this,d,A).call(this)}})},J=function(){clearTimeout(this.inactivityTimeout),this.inactivityTimeout=setTimeout(()=>{l(this,d,A).call(this)},this.timeout)},ce=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:[t=>{}],stop:[t=>{this.stop()}],error:[t=>{this.stop()}]},this.active=!1}start(t,e){return c(this,null,function*(){this.active=!0;try{let s=yield fetch(t,e);if(!s.ok)throw s;if(s.headers.get("Content-Type")!=="text/event-stream")return s;let r=s.body.getReader(),o=new TextDecoder("utf-8");for(this.buffer="";this.active;){let{done:a,value:p}=yield r.read();if(a)break;this.buffer+=o.decode(p,{stream:!0}),this.processEvents()}return s}catch(s){throw this.active=!1,s}})}processEvents(){let t,e=this.buffer.includes(`\r
2
2
  `)?`\r
3
3
  `:`
4
- `,t=e+e;for(;(s=this.buffer.indexOf(t))!==-1;){let n=this.buffer.slice(0,s).trim();this.buffer=this.buffer.slice(s+t.length);let r=n.split(e),o={};for(let a of r)a.startsWith("data:")?o.data=a.slice(5).trim():a.startsWith("event:")&&(o.event=a.slice(6).trim());this.trigger(o.event||"message",o.data)}}on(s,e){this.eventListeners[s]||(this.eventListeners[s]=[]),this.eventListeners[s].push(e)}off(s,e){let t=this.eventListeners[s];t&&(this.eventListeners[s]=t.filter(n=>n!==e))}trigger(s,e){let t=this.eventListeners[s];t&&t.forEach(n=>n(e))}stop(){this.active=!1}};var A=class{};A.mapAgentResultToSnakeCase=s=>({content:s.content,instance_id:s.instanceId,action_results:s.actionResults,completion_usage:s.completionUsage,executor_task_logs:s.executorTaskLogs,json_content:s.jsonContent,meta_analysis:s.metaAnalysis,time_to_first_token:s.timeToFirstToken});var y=class{static process(s,e){return c(this,null,function*(){try{if(s instanceof Response)switch(s.status){case 400:{let t=yield s.json();return{message:t.message||"Validation error",statusCode:400,errors:t.errors||{}}}case 429:return{message:"Rate limit exceeded",statusCode:429,retryAfter:parseInt(s.headers.get("Retry-After")||"60")};default:return{message:(yield s.json()).message||e||"An error occurred while processing your request.",statusCode:s.status}}return s instanceof Error?{message:s.message||e||"An error occurred while processing your request.",statusCode:500}:{message:e||"An unknown error occurred.",statusCode:500}}catch(t){return{message:e||"An error occurred while processing your request.",statusCode:500}}})}},N=class{static determineErrorType(s){return this.isRateLimitErrorBody(s)?{type:"RateLimitError",error:s}:this.isValidationErrorBody(s)?{type:"ValidationError",error:s}:this.isBaseErrorBody(s)?{type:"BaseError",error:s}:{type:"UnknownError",error:s}}static isRateLimitErrorBody(s){return typeof s=="object"&&s!==null&&"message"in s&&"statusCode"in s&&"retryAfter"in s&&typeof s.retryAfter=="number"}static isValidationErrorBody(s){return typeof s=="object"&&s!==null&&"message"in s&&"statusCode"in s&&"errors"in s&&typeof s.errors=="object"&&s.errors!==null}static isBaseErrorBody(s){return typeof s=="object"&&s!==null&&"message"in s&&"statusCode"in s&&typeof s.message=="string"&&typeof s.statusCode=="number"}};var l,j,re,ie,_,oe,$=class $ extends E{constructor(e,t,n,r){super();K(this,l);this.info=null;this.apiKey=t,this.agentCode=e,this.baseUrl=n,this.agentVersion=r==null?void 0:r.agentVersion,this.userIdentifier=r==null?void 0:r.userIdentifier,this.channel=r==null?void 0:r.channel,this.inputParameters=r==null?void 0:r.inputParameters}static create(e,t,n,r){return c(this,null,function*(){let o=new $(e,t,n,r);return yield o.getInfo(),o})}static createWithoutInfo(e,t,n){return new $(e,t,n)}streamMessage(e,t){return c(this,null,function*(){let n=this.agentVersion?`/${this.agentVersion}`:"",r=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${n}`,o=d(this,l,j).call(this,{message:e,stream:!0,additionalInfo:t,isNewConversation:!this.conversationId}),a=new b,u;return u=new Promise((h,w)=>c(this,null,function*(){a.on("start",()=>{this.emit("start")}),a.on("error",g=>{let f=JSON.parse(g);this.emit("error",f),w(f)}),a.on("content",g=>{let f=JSON.parse(g);this.emit("content",f.text)}),a.on("stop",g=>{let f=JSON.parse(g);this.conversationId||(this.conversationId=f.result.instance_id),this.emit("stop",f.result),h(f.result)});let m={method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(o)};try{yield a.start(r,m)}catch(g){let f=yield y.process(g,"Failed to send message");w(f)}})),u})}sendMessage(e,t){return c(this,null,function*(){let n=this.agentVersion?`/${this.agentVersion}`:"",r=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${n}`,o=d(this,l,j).call(this,{message:e,stream:!1,additionalInfo:t,isNewConversation:!this.conversationId}),a=yield fetch(r,{method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(o)});if(a.status!==200)throw yield y.process(a,"Failed to send message");let u=yield a.json(),h=A.mapAgentResultToSnakeCase(u);return this.conversationId||(this.conversationId=h.instance_id),h})}getConversationById(n){return c(this,arguments,function*(e,t={showExecutorTaskLogs:!1}){let r=`${this.baseUrl}/v2/agent/${this.agentCode}/conversation/${e}`,o=new URLSearchParams;t.showExecutorTaskLogs&&o.append("showExecutorTaskLogs","true"),o.toString()&&(r+=`?${o.toString()}`);let a=yield fetch(r,{method:"GET",headers:{"X-API-KEY":this.apiKey,"Content-Type":"application/json"}});if(a.status!==200)throw yield y.process(a,"Failed to get conversation by id");let u=yield a.json();if(u.messagesJson&&typeof u.messagesJson=="string")try{u.messages=JSON.parse(u.messagesJson),delete u.messagesJson}catch(h){throw new Error("Failed to parse messagesJson: "+h)}return u})}getInfo(){return c(this,null,function*(){let e=`${this.baseUrl}/v2/agent/${this.agentCode}`;this.agentVersion&&(e+=`/${this.agentVersion}`),e+="/conversation/info";let t={};this.channel&&(t.channel=this.channel),this.inputParameters&&(t.inputParameters=[],d(this,l,_).call(this,t.inputParameters,this.inputParameters)),this.userIdentifier&&(t.userIdentifier=this.userIdentifier);let n=yield fetch(e,{method:"POST",headers:{"X-API-KEY":this.apiKey,"Content-Type":"application/json"},body:JSON.stringify(t)});if(n.status!==200)throw yield y.process(n,"Failed to get conversation initial info");let r=yield n.json();return this.info=r,this.info})}submitFeedback(e){return c(this,null,function*(){if(!this.conversationId)throw new Error("Conversation ID is not set. Please send a message first to initialize the conversation.");let t=`${this.baseUrl}/agent/${this.agentCode}/conversation/${this.conversationId}/message/${e.agentMessageId}/feedback`;return(yield fetch(t,{method:"POST",headers:{"X-API-KEY":this.apiKey,"Content-Type":"application/json"},body:JSON.stringify({feedback:e.feedback})})).status!==200?{success:!1}:{success:!0}})}removeFeedback(e){return c(this,null,function*(){if(!this.conversationId)throw new Error("Conversation ID is not set. Please send a message first to initialize the conversation.");let t=`${this.baseUrl}/agent/${this.agentCode}/conversation/${this.conversationId}/message/${e.agentMessageId}/feedback`;return(yield fetch(t,{method:"DELETE",headers:{"X-API-KEY":this.apiKey}})).status!==200?{success:!1}:{success:!0}})}getConnectorStatus(e){return c(this,null,function*(){let t=`${this.baseUrl}/connection/agentInstance/${e.agentInstanceId}/connector/${e.connectorId}/status`,n=yield fetch(t,{method:"GET",headers:{"X-API-KEY":this.apiKey,"Content-Type":"application/json"}});if(n.status!==200)throw yield y.process(n,"Failed to get connector status");return yield n.json()})}};l=new WeakSet,j=function(e){var n,r,o,a;let t=[{Key:"message",Value:e.message},{Key:"stream",Value:e.stream.toString()}];return e.isNewConversation?d(this,l,re).call(this,t):t.push({Key:"chatId",Value:this.conversationId}),d(this,l,_).call(this,t,L(L({},(r=(n=e.additionalInfo)==null?void 0:n.inputParameters)!=null?r:{}),(o=this.inputParameters)!=null?o:{})),d(this,l,oe).call(this,t,(a=e.additionalInfo)==null?void 0:a.volatileKnowledgeIds),d(this,l,ie).call(this,t),t},re=function(e){this.userIdentifier&&e.push({Key:"userIdentifier",Value:this.userIdentifier})},ie=function(e){this.channel&&e.push({Key:"channel",Value:this.channel})},_=function(e,t={}){if(!(!t||Object.keys(t).length===0))for(let[n,r]of Object.entries(t))e.push({Key:n,Value:r})},oe=function(e,t){!t||t.length===0||e.push({Key:"volatileKnowledgeIds",Value:t})};var P=$;var R=class{constructor(s,e,t,n){this.agentCode=s;this.apiKey=e;this.baseUrl=t;this.options=n}createRealtimeSession(s,e,t,n){return new I(s,e,t,n)}createConversation(s,e,t,n){return c(this,null,function*(){return P.create(s,e,t,n)})}createConversationWithoutInfo(s,e,t){return P.createWithoutInfo(s,e,t)}};var v=class i extends R{constructor(s,e,t,n){super(s,e,t,n)}static create(s,e,t,n){return new i(s,e,t,n)}};var k=class i extends R{constructor(s,e,t,n){super(s,e,t,n)}static create(s,e,t,n){return new i(s,e,t,n)}};var S=class extends E{constructor(e,t,n,r){super();this.agentCode=e;this.apiKey=t;this.baseUrl=n;this.options=r}stream(){return c(this,null,function*(){var a;let e=(a=this.options)!=null&&a.agentVersion?`/${this.options.agentVersion}`:"",t=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${e}`,n=this.createExecuteBody(!0),r=new b,o;return o=new Promise((u,h)=>c(this,null,function*(){r.on("start",()=>{this.emit("start")}),r.on("error",m=>{let g=JSON.parse(m);this.emit("error",g),h(g)}),r.on("content",m=>{let g=JSON.parse(m);this.emit("content",g.text)}),r.on("stop",m=>{let g=JSON.parse(m);this.emit("stop",g.result),u(g.result)});let w={method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(n)};try{yield r.start(t,w)}catch(m){let g=yield y.process(m,"Failed to send message");h(g)}})),o})}execute(){return c(this,null,function*(){var a;let e=(a=this.options)!=null&&a.agentVersion?`/${this.options.agentVersion}`:"",t=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${e}`,n=this.createExecuteBody(!1),r=yield fetch(t,{method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(n)});if(r.status!==200)throw yield y.process(r,"Failed to send message");let o=yield r.json();return A.mapAgentResultToSnakeCase(o)})}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 O=class i extends S{constructor(s,e,t,n){super(s,e,t,n)}static create(s,e,t,n){return new i(s,e,t,n)}static createAndExecute(s,e,t,n){return new i(s,e,t,n).execute()}createExecuteBody(s){let e=super.createExecuteBody(s);return this.appendInputParametersIfNeeded(e),e}appendInputParametersIfNeeded(s){var e;if(!(!((e=this.options)!=null&&e.inputParameters)||Object.keys(this.options.inputParameters).length===0))for(let[t,n]of Object.entries(this.options.inputParameters))s.push({Key:t,Value:n})}};var T=class i extends S{constructor(s,e,t,n){super(s,e,t,n)}static create(s,e,t,n){return new i(s,e,t,n)}static createAndExecute(s,e,t,n){return new i(s,e,t,n).execute()}createExecuteBody(s){let e=super.createExecuteBody(s);return this.appendMessagesIfNeeded(e),this.appendMessageIfNeeded(e),this.appendInputParametersIfNeeded(e),e}appendMessagesIfNeeded(s){var e;!((e=this.options)!=null&&e.messages)||this.options.messages.length===0||s.push({Key:"messages",Value:JSON.stringify(this.options.messages)})}appendMessageIfNeeded(s){var e;(e=this.options)!=null&&e.message&&s.push({Key:"message",Value:this.options.message})}appendInputParametersIfNeeded(s){var e;if(!(!((e=this.options)!=null&&e.inputParameters)||Object.keys(this.options.inputParameters).length===0))for(let[t,n]of Object.entries(this.options.inputParameters))s.push({Key:t,Value:n})}};var B=class i extends S{constructor(s,e,t,n){super(s,e,t,n)}static create(s,e,t,n){return new i(s,e,t,n)}static createAndExecute(s,e,t,n){return new i(s,e,t,n).execute()}createExecuteBody(s){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:s}}};var C=class{static createAgent(s,e,t){switch(s){case"assistant":return{createConversation:(n,r)=>c(this,null,function*(){return yield v.create(n,e,t,r).createConversation(n,e,t,r)}),getConversationById:(a,u,...h)=>c(this,[a,u,...h],function*(n,r,o={showExecutorTaskLogs:!1}){return yield(yield v.create(n,e,t).createConversationWithoutInfo(n,e,t)).getConversationById(r,o)}),getInfoByCode:(n,r)=>c(this,null,function*(){return(yield v.create(n,e,t,r).createConversation(n,e,t,r)).info}),createRealtimeSession:(n,r)=>v.create(n,e,t,r).createRealtimeSession(n,e,t,r)};case"copilot":return{createConversation:(n,r)=>c(this,null,function*(){return yield k.create(n,e,t,r).createConversation(n,e,t,r)}),getConversationById:(a,u,...h)=>c(this,[a,u,...h],function*(n,r,o={showExecutorTaskLogs:!1}){return yield(yield v.create(n,e,t).createConversationWithoutInfo(n,e,t)).getConversationById(r,o)}),getInfoByCode:(n,r)=>c(this,null,function*(){return(yield v.create(n,e,t,r).createConversation(n,e,t,r)).info}),createRealtimeSession:(n,r)=>k.create(n,e,t,r).createRealtimeSession(n,e,t,r)};case"activity":return{execute:(n,r)=>O.createAndExecute(n,e,t,r),create:(n,r)=>O.create(n,e,t,r)};case"chat-completion":return{execute:(n,r)=>T.createAndExecute(n,e,t,r),create:(n,r)=>T.create(n,e,t,r)};case"proxy":return{execute:(n,r)=>B.createAndExecute(n,e,t,r),create:(n,r)=>B.create(n,e,t,r)};default:throw new Error(`Agent type ${s} not supported`)}}};var M=class{constructor(s){this.baseUrl="https://api.serenitystar.ai/api";if(!s.apiKey)throw new Error("The API key is required");this.apiKey=s.apiKey,this.baseUrl=s.baseUrl||this.baseUrl,this.agents={assistants:C.createAgent("assistant",this.apiKey,this.baseUrl),copilots:C.createAgent("copilot",this.apiKey,this.baseUrl),activities:C.createAgent("activity",this.apiKey,this.baseUrl),chatCompletions:C.createAgent("chat-completion",this.apiKey,this.baseUrl),proxies:C.createAgent("proxy",this.apiKey,this.baseUrl)}}};0&&(module.exports={ErrorHelper,RealtimeSession,SerenityClient});
4
+ `,s=e+e;for(;(t=this.buffer.indexOf(s))!==-1;){let n=this.buffer.slice(0,t).trim();this.buffer=this.buffer.slice(t+s.length);let r=n.split(e),o={};for(let a of r)a.startsWith("data:")?o.data=a.slice(5).trim():a.startsWith("event:")&&(o.event=a.slice(6).trim());this.trigger(o.event||"message",o.data)}}on(t,e){this.eventListeners[t]||(this.eventListeners[t]=[]),this.eventListeners[t].push(e)}off(t,e){let s=this.eventListeners[t];s&&(this.eventListeners[t]=s.filter(n=>n!==e))}trigger(t,e){let s=this.eventListeners[t];s&&s.forEach(n=>n(e))}stop(){this.active=!1}};var I=class{};I.mapAgentResultToSnakeCase=t=>({content:t.content,instance_id:t.instanceId,action_results:t.actionResults,completion_usage:t.completionUsage,executor_task_logs:t.executorTaskLogs,json_content:t.jsonContent,meta_analysis:t.metaAnalysis,time_to_first_token:t.timeToFirstToken});var j,T=class T{static process(t,e){return c(this,null,function*(){try{if(t instanceof Response)switch(t.status){case 400:{let s=yield t.json();return{message:s.message||"Validation error",statusCode:400,errors:s.errors||{}}}case 429:return{message:"Rate limit exceeded",statusCode:429,retryAfter:parseInt(t.headers.get("Retry-After")||"60")};default:return{message:(yield t.json()).message||e||"An error occurred while processing your request.",statusCode:t.status}}return t instanceof Error?{message:t.message||e||"An error occurred while processing your request.",statusCode:500}:{message:e||"An unknown error occurred.",statusCode:500}}catch(s){return{message:e||"An error occurred while processing your request.",statusCode:500}}})}};j=new WeakMap,T.processFile=(t,e,s,n)=>{var r;switch(t){case 401:{let o=s;return`${e.name}: ${o.message}`}case 400:{let o=s;return`${e.name}: ${G(r=T,j).call(r,o)}`}case 413:{let o=s;return`${e.name}: ${o.message}`}default:return`${e.name}: ${n||"An unknown error occurred while uploading the file."}`}},b(T,j,t=>t.errors&&t.errors.File?Array.isArray(t.errors.File)?t.errors.File.join(", "):t.errors.File:Object.values(t.errors).flat().join(", "));var m=T,L=class{static determineErrorType(t){return this.isRateLimitErrorBody(t)?{type:"RateLimitError",error:t}:this.isValidationErrorBody(t)?{type:"ValidationError",error:t}:this.isBaseErrorBody(t)?{type:"BaseError",error:t}:{type:"UnknownError",error:t}}static isRateLimitErrorBody(t){return typeof t=="object"&&t!==null&&"message"in t&&"statusCode"in t&&"retryAfter"in t&&typeof t.retryAfter=="number"}static isValidationErrorBody(t){return typeof t=="object"&&t!==null&&"message"in t&&"statusCode"in t&&"errors"in t&&typeof t.errors=="object"&&t.errors!==null}static isBaseErrorBody(t){return typeof t=="object"&&t!==null&&"message"in t&&"statusCode"in t&&typeof t.message=="string"&&typeof t.statusCode=="number"}};var C=class{constructor(t,e){this.baseUrl=t;this.apiKey=e;this.ids=[]}upload(s){return c(this,arguments,function*(t,e={useVision:!1,processEmbeddings:!1}){var a,p;let n=`${this.baseUrl}/v2/volatileKnowledge`,r=new FormData;r.append("file",t);let o=new URLSearchParams;e!=null&&e.processEmbeddings||t.type.startsWith("image/")&&o.append("processEmbeddings",(!e.useVision).toString());try{let u=yield fetch(`${n}?${o.toString()}`,{method:"POST",body:r,headers:{contentType:"multipart/form-data","X-API-KEY":this.apiKey}}),h=yield u.json();return u.ok?(this.ids.includes(h.id)||this.ids.push(h.id),{success:!0,id:h.id,expirationDate:h.expirationDate,status:h.status,fileName:t.name,fileSize:h.fileSize}):{success:!1,error:{file:t,error:new Error(m.processFile(u.status,t,h,(a=e.locale)==null?void 0:a.uploadFileErrorMessage))}}}catch(u){return{success:!1,error:{file:t,error:new Error(m.processFile(500,t,{},(p=e.locale)==null?void 0:p.uploadFileErrorMessage))}}}})}removeById(t){let e=this.ids.indexOf(t);return e>-1?(this.ids.splice(e,1),!0):!1}clear(){this.ids=[]}getIds(){return[...this.ids]}getById(t){return c(this,null,function*(){let e=`${this.baseUrl}/v2/volatileKnowledge/${t}`,s=yield fetch(e,{method:"GET",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey}}),n=yield s.json();return s.ok?O({success:!0},n):{success:!1,error:{error:new Error(n.message||"Failed to fetch volatile knowledge file.")}}})}};var y,_,pe,de,D,ue,U=class U extends S{constructor(e,s,n,r){super();b(this,y);this.info=null;this.apiKey=s,this.agentCode=e,this.baseUrl=n,this.volatileKnowledge=new C(n,s),this.agentVersion=r==null?void 0:r.agentVersion,this.userIdentifier=r==null?void 0:r.userIdentifier,this.channel=r==null?void 0:r.channel,this.inputParameters=r==null?void 0:r.inputParameters}static create(e,s,n,r){return c(this,null,function*(){let o=new U(e,s,n,r);return yield o.getInfo(),o})}static createWithoutInfo(e,s,n){return new U(e,s,n)}streamMessage(e,s){return c(this,null,function*(){let n=this.agentVersion?`/${this.agentVersion}`:"",r=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${n}`,o=l(this,y,_).call(this,{message:e,stream:!0,additionalInfo:s,isNewConversation:!this.conversationId}),a=new P,p;return p=new Promise((u,h)=>c(this,null,function*(){a.on("start",()=>{this.emit("start")}),a.on("error",g=>{let v=JSON.parse(g);this.emit("error",v),h(v)}),a.on("content",g=>{let v=JSON.parse(g);this.emit("content",v.text)}),a.on("stop",g=>{let v=JSON.parse(g);this.conversationId||(this.conversationId=v.result.instance_id),this.volatileKnowledge.clear(),this.emit("stop",v.result),u(v.result)});let f={method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(o)};try{yield a.start(r,f)}catch(g){let v=yield m.process(g,"Failed to send message");h(v)}})),p})}sendMessage(e,s){return c(this,null,function*(){let n=this.agentVersion?`/${this.agentVersion}`:"",r=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${n}`,o=l(this,y,_).call(this,{message:e,stream:!1,additionalInfo:s,isNewConversation:!this.conversationId}),a=yield fetch(r,{method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(o)});if(a.status!==200)throw yield m.process(a,"Failed to send message");let p=yield a.json(),u=I.mapAgentResultToSnakeCase(p);return this.conversationId||(this.conversationId=u.instance_id),this.volatileKnowledge.clear(),u})}getConversationById(n){return c(this,arguments,function*(e,s={showExecutorTaskLogs:!1}){let r=`${this.baseUrl}/v2/agent/${this.agentCode}/conversation/${e}`,o=new URLSearchParams;s.showExecutorTaskLogs&&o.append("showExecutorTaskLogs","true"),o.toString()&&(r+=`?${o.toString()}`);let a=yield fetch(r,{method:"GET",headers:{"X-API-KEY":this.apiKey,"Content-Type":"application/json"}});if(a.status!==200)throw yield m.process(a,"Failed to get conversation by id");let p=yield a.json();if(p.messagesJson&&typeof p.messagesJson=="string")try{p.messages=JSON.parse(p.messagesJson),delete p.messagesJson}catch(u){throw new Error("Failed to parse messagesJson: "+u)}return p})}getInfo(){return c(this,null,function*(){let e=`${this.baseUrl}/v2/agent/${this.agentCode}`;this.agentVersion&&(e+=`/${this.agentVersion}`),e+="/conversation/info";let s={};this.channel&&(s.channel=this.channel),this.inputParameters&&(s.inputParameters=[],l(this,y,D).call(this,s.inputParameters,this.inputParameters)),this.userIdentifier&&(s.userIdentifier=this.userIdentifier);let n=yield fetch(e,{method:"POST",headers:{"X-API-KEY":this.apiKey,"Content-Type":"application/json"},body:JSON.stringify(s)});if(n.status!==200)throw yield m.process(n,"Failed to get conversation initial info");let r=yield n.json();return this.info=r,this.info})}submitFeedback(e){return c(this,null,function*(){if(!this.conversationId)throw new Error("Conversation ID is not set. Please send a message first to initialize the conversation.");let s=`${this.baseUrl}/agent/${this.agentCode}/conversation/${this.conversationId}/message/${e.agentMessageId}/feedback`;return(yield fetch(s,{method:"POST",headers:{"X-API-KEY":this.apiKey,"Content-Type":"application/json"},body:JSON.stringify({feedback:e.feedback})})).status!==200?{success:!1}:{success:!0}})}removeFeedback(e){return c(this,null,function*(){if(!this.conversationId)throw new Error("Conversation ID is not set. Please send a message first to initialize the conversation.");let s=`${this.baseUrl}/agent/${this.agentCode}/conversation/${this.conversationId}/message/${e.agentMessageId}/feedback`;return(yield fetch(s,{method:"DELETE",headers:{"X-API-KEY":this.apiKey}})).status!==200?{success:!1}:{success:!0}})}getConnectorStatus(e){return c(this,null,function*(){let s=`${this.baseUrl}/connection/agentInstance/${e.agentInstanceId}/connector/${e.connectorId}/status`,n=yield fetch(s,{method:"GET",headers:{"X-API-KEY":this.apiKey,"Content-Type":"application/json"}});if(n.status!==200)throw yield m.process(n,"Failed to get connector status");return yield n.json()})}};y=new WeakSet,_=function(e){var r,o,a,p,u;let s=[{Key:"message",Value:e.message},{Key:"stream",Value:e.stream.toString()}];e.isNewConversation?l(this,y,pe).call(this,s):s.push({Key:"chatId",Value:this.conversationId}),l(this,y,D).call(this,s,O(O({},(o=(r=e.additionalInfo)==null?void 0:r.inputParameters)!=null?o:{}),(a=this.inputParameters)!=null?a:{}));let n=Array.from(new Set([...(u=(p=e.additionalInfo)==null?void 0:p.volatileKnowledgeIds)!=null?u:[],...this.volatileKnowledge.getIds()]));return l(this,y,ue).call(this,s,n.length>0?n:void 0),l(this,y,de).call(this,s),s},pe=function(e){this.userIdentifier&&e.push({Key:"userIdentifier",Value:this.userIdentifier})},de=function(e){this.channel&&e.push({Key:"channel",Value:this.channel})},D=function(e,s={}){if(!(!s||Object.keys(s).length===0))for(let[n,r]of Object.entries(s))e.push({Key:n,Value:r})},ue=function(e,s){!s||s.length===0||e.push({Key:"volatileKnowledgeIds",Value:s})};var B=U;var k=class{constructor(t,e,s,n){this.agentCode=t;this.apiKey=e;this.baseUrl=s;this.options=n}createRealtimeSession(t,e,s,n){return new R(t,e,s,n)}createConversation(t,e,s,n){return c(this,null,function*(){return B.create(t,e,s,n)})}createConversationWithoutInfo(t,e,s){return B.createWithoutInfo(t,e,s)}};var E=class i extends k{constructor(t,e,s,n){super(t,e,s,n)}static create(t,e,s,n){return new i(t,e,s,n)}};var K=class i extends k{constructor(t,e,s,n){super(t,e,s,n)}static create(t,e,s,n){return new i(t,e,s,n)}};var w=class extends S{constructor(e,s,n,r){super();this.agentCode=e;this.apiKey=s;this.baseUrl=n;this.options=r;this.volatileKnowledge=new C(n,s)}stream(){return c(this,null,function*(){var a;let e=(a=this.options)!=null&&a.agentVersion?`/${this.options.agentVersion}`:"",s=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${e}`,n=this.createExecuteBody(!0),r=new P,o;return o=new Promise((p,u)=>c(this,null,function*(){r.on("start",()=>{this.emit("start")}),r.on("error",f=>{let g=JSON.parse(f);this.emit("error",g),u(g)}),r.on("content",f=>{let g=JSON.parse(f);this.emit("content",g.text)}),r.on("stop",f=>{let g=JSON.parse(f);this.volatileKnowledge.clear(),this.emit("stop",g.result),p(g.result)});let h={method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(n)};try{yield r.start(s,h)}catch(f){let g=yield m.process(f,"Failed to send message");u(g)}})),o})}execute(){return c(this,null,function*(){var p;let e=(p=this.options)!=null&&p.agentVersion?`/${this.options.agentVersion}`:"",s=`${this.baseUrl}/v2/agent/${this.agentCode}/execute${e}`,n=this.createExecuteBody(!1),r=yield fetch(s,{method:"POST",headers:{"Content-Type":"application/json","X-API-KEY":this.apiKey},body:JSON.stringify(n)});if(r.status!==200)throw yield m.process(r,"Failed to send message");let o=yield r.json(),a=I.mapAgentResultToSnakeCase(o);return this.volatileKnowledge.clear(),a})}createExecuteBody(e){let s=[{Key:"stream",Value:e.toString()}];return this.appendVolatileKnowledgeIdsIfNeeded(s),this.appendUserIdentifierIfNeeded(s),this.appendChannelIfNeeded(s),s}appendUserIdentifierIfNeeded(e){var s;(s=this.options)!=null&&s.userIdentifier&&e.push({Key:"userIdentifier",Value:this.options.userIdentifier})}appendVolatileKnowledgeIdsIfNeeded(e){var n,r;let s=Array.from(new Set([...(r=(n=this.options)==null?void 0:n.volatileKnowledgeIds)!=null?r:[],...this.volatileKnowledge.getIds()]));s.length!==0&&e.push({Key:"volatileKnowledgeIds",Value:s})}appendChannelIfNeeded(e){var s;(s=this.options)!=null&&s.channel&&e.push({Key:"channel",Value:this.options.channel})}};var V=class i extends w{constructor(t,e,s,n){super(t,e,s,n)}static create(t,e,s,n){return new i(t,e,s,n)}static createAndExecute(t,e,s,n){return new i(t,e,s,n).execute()}createExecuteBody(t){let e=super.createExecuteBody(t);return this.appendInputParametersIfNeeded(e),e}appendInputParametersIfNeeded(t){var e;if(!(!((e=this.options)!=null&&e.inputParameters)||Object.keys(this.options.inputParameters).length===0))for(let[s,n]of Object.entries(this.options.inputParameters))t.push({Key:s,Value:n})}};var M=class i extends w{constructor(t,e,s,n){super(t,e,s,n)}static create(t,e,s,n){return new i(t,e,s,n)}static createAndExecute(t,e,s,n){return new i(t,e,s,n).execute()}createExecuteBody(t){let e=super.createExecuteBody(t);return this.appendMessagesIfNeeded(e),this.appendMessageIfNeeded(e),this.appendInputParametersIfNeeded(e),e}appendMessagesIfNeeded(t){var e;!((e=this.options)!=null&&e.messages)||this.options.messages.length===0||t.push({Key:"messages",Value:JSON.stringify(this.options.messages)})}appendMessageIfNeeded(t){var e;(e=this.options)!=null&&e.message&&t.push({Key:"message",Value:this.options.message})}appendInputParametersIfNeeded(t){var e;if(!(!((e=this.options)!=null&&e.inputParameters)||Object.keys(this.options.inputParameters).length===0))for(let[s,n]of Object.entries(this.options.inputParameters))t.push({Key:s,Value:n})}};var $=class i extends w{constructor(t,e,s,n){super(t,e,s,n)}static create(t,e,s,n){return new i(t,e,s,n)}static createAndExecute(t,e,s,n){return new i(t,e,s,n).execute()}createExecuteBody(t){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:t}}};var x=class{static createAgent(t,e,s){switch(t){case"assistant":return{createConversation:(n,r)=>c(this,null,function*(){return yield E.create(n,e,s,r).createConversation(n,e,s,r)}),getConversationById:(a,p,...u)=>c(this,[a,p,...u],function*(n,r,o={showExecutorTaskLogs:!1}){return yield(yield E.create(n,e,s).createConversationWithoutInfo(n,e,s)).getConversationById(r,o)}),getInfoByCode:(n,r)=>c(this,null,function*(){return(yield E.create(n,e,s,r).createConversation(n,e,s,r)).info}),createRealtimeSession:(n,r)=>E.create(n,e,s,r).createRealtimeSession(n,e,s,r)};case"copilot":return{createConversation:(n,r)=>c(this,null,function*(){return yield K.create(n,e,s,r).createConversation(n,e,s,r)}),getConversationById:(a,p,...u)=>c(this,[a,p,...u],function*(n,r,o={showExecutorTaskLogs:!1}){return yield(yield E.create(n,e,s).createConversationWithoutInfo(n,e,s)).getConversationById(r,o)}),getInfoByCode:(n,r)=>c(this,null,function*(){return(yield E.create(n,e,s,r).createConversation(n,e,s,r)).info}),createRealtimeSession:(n,r)=>K.create(n,e,s,r).createRealtimeSession(n,e,s,r)};case"activity":return{execute:(n,r)=>V.createAndExecute(n,e,s,r),create:(n,r)=>V.create(n,e,s,r)};case"chat-completion":return{execute:(n,r)=>M.createAndExecute(n,e,s,r),create:(n,r)=>M.create(n,e,s,r)};case"proxy":return{execute:(n,r)=>$.createAndExecute(n,e,s,r),create:(n,r)=>$.create(n,e,s,r)};default:throw new Error(`Agent type ${t} not supported`)}}};var F=class{constructor(t){this.baseUrl="https://api.serenitystar.ai/api";if(!t.apiKey)throw new Error("The API key is required");this.apiKey=t.apiKey,this.baseUrl=t.baseUrl||this.baseUrl,this.agents={assistants:x.createAgent("assistant",this.apiKey,this.baseUrl),copilots:x.createAgent("copilot",this.apiKey,this.baseUrl),activities:x.createAgent("activity",this.apiKey,this.baseUrl),chatCompletions:x.createAgent("chat-completion",this.apiKey,this.baseUrl),proxies:x.createAgent("proxy",this.apiKey,this.baseUrl)}}};0&&(module.exports={ErrorHelper,RealtimeSession,SerenityClient,VolatileKnowledgeManager});
5
5
  //# sourceMappingURL=index.js.map