@d-id/client-sdk 1.1.0-beta.4 → 1.1.0-beta.50

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.
@@ -1 +1 @@
1
- (function(f,_){typeof exports=="object"&&typeof module<"u"?_(exports):typeof define=="function"&&define.amd?define(["exports"],_):(f=typeof globalThis<"u"?globalThis:f||self,_(f.index={}))})(this,function(f){"use strict";var yt=Object.defineProperty;var pt=(f,_,N)=>_ in f?yt(f,_,{enumerable:!0,configurable:!0,writable:!0,value:N}):f[_]=N;var G=(f,_,N)=>(pt(f,typeof _!="symbol"?_+"":_,N),N);class _ extends Error{constructor({kind:a,description:n,error:o}){super(JSON.stringify({kind:a,description:n}));G(this,"kind");G(this,"description");G(this,"error");this.kind=a,this.description=n,this.error=o}}class N extends _{constructor(t,a){super({kind:"ChatCreationFailed",description:`Failed to create ${a?"persistent":""} chat, mode: ${t}`})}}class ie extends _{constructor(t){super({kind:"ChatModeDowngraded",description:`Chat mode downgraded to ${t}`})}}class H extends _{constructor(a,n){super({kind:"ValidationError",description:a});G(this,"key");this.key=n}}class se extends _{constructor(t){super({kind:"WSError",description:t})}}var oe=(e=>(e.TRIAL="trial",e.BASIC="basic",e.ENTERPRISE="enterprise",e.LITE="lite",e.ADVANCED="advanced",e))(oe||{}),ce=(e=>(e.TRIAL="deid-trial",e.PRO="deid-pro",e.ENTERPRISE="deid-enterprise",e.LITE="deid-lite",e.ADVANCED="deid-advanced",e.BUILD="deid-api-build",e.LAUNCH="deid-api-launch",e.SCALE="deid-api-scale",e))(ce||{}),de=(e=>(e.Created="created",e.Started="started",e.Done="done",e.Error="error",e.Rejected="rejected",e.Ready="ready",e))(de||{}),le=(e=>(e.Unrated="Unrated",e.Positive="Positive",e.Negative="Negative",e))(le||{}),j=(e=>(e.Functional="Functional",e.TextOnly="TextOnly",e.Maintenance="Maintenance",e.Playground="Playground",e.DirectPlayback="DirectPlayback",e))(j||{}),U=(e=>(e.Embed="embed",e.Query="query",e.Partial="partial",e.Answer="answer",e.Complete="done",e))(U||{}),ue=(e=>(e.KnowledgeProcessing="knowledge/processing",e.KnowledgeIndexing="knowledge/indexing",e.KnowledgeFailed="knowledge/error",e.KnowledgeDone="knowledge/done",e))(ue||{}),fe=(e=>(e.Knowledge="knowledge",e.Document="document",e.Record="record",e))(fe||{}),me=(e=>(e.Pdf="pdf",e.Text="text",e.Html="html",e.Word="word",e.Json="json",e.Markdown="markdown",e.Csv="csv",e.Excel="excel",e.Powerpoint="powerpoint",e.Archive="archive",e.Image="image",e.Audio="audio",e.Video="video",e))(me||{}),Z=(e=>(e.Clip="clip",e.Talk="talk",e))(Z||{});const ge=e=>{switch(e){case"clip":return"clip";case"talk":return"talk";default:throw new Error(`Unknown video type: ${e}`)}};var C=(e=>(e.Start="START",e.Stop="STOP",e))(C||{}),K=(e=>(e.Strong="STRONG",e.Weak="WEAK",e.Unknown="UNKNOWN",e))(K||{}),x=(e=>(e.Idle="IDLE",e.Talking="TALKING",e))(x||{});const O={"stream/started":"START","stream/done":"STOP"};var V=(e=>(e.ChatAnswer="chat/answer",e.ChatPartial="chat/partial",e.StreamDone="stream/done",e.StreamStarted="stream/started",e.StreamFailed="stream/error",e.StreamReady="stream/ready",e.StreamCreated="stream/created",e.StreamVideoCreated="stream-video/started",e.StreamVideoDone="stream-video/done",e.StreamVideoError="stream-video/error",e.StreamVideoRejected="stream-video/rejected",e))(V||{}),E=(e=>(e.New="new",e.Fail="fail",e.Connected="connected",e.Connecting="connecting",e.Closed="closed",e.Completed="completed",e.Disconnected="disconnected",e))(E||{}),J=(e=>(e.Legacy="legacy",e.Fluent="fluent",e))(J||{}),he=(e=>(e.Amazon="amazon",e.Microsoft="microsoft",e.Afflorithmics="afflorithmics",e.Elevenlabs="elevenlabs",e))(he||{}),we=(e=>(e.Public="public",e.Premium="premium",e.Private="private",e))(we||{});const Te=45*1e3,je="X-Playground-Chat",X="https://api.d-id.com",Pe="wss://notifications.d-id.com",be="79f81a83a67430be2bc0fd61042b8faa",ye=e=>new Promise(t=>setTimeout(t,e)),Q=()=>Math.random().toString(16).slice(2);function Be(e,t){let a;return{promise:new Promise((o,s)=>{a=setTimeout(()=>s(new Error(t)),e)}),clear:()=>clearTimeout(a)}}async function ee(e,t){const a={limit:(t==null?void 0:t.limit)??3,delayMs:(t==null?void 0:t.delayMs)??0,timeout:(t==null?void 0:t.timeout)??3e4,timeoutErrorMessage:(t==null?void 0:t.timeoutErrorMessage)||"Timeout error",shouldRetryFn:(t==null?void 0:t.shouldRetryFn)??(()=>!0),onRetry:(t==null?void 0:t.onRetry)??(()=>{})};let n;for(let o=1;o<=a.limit;o++)try{if(!a.timeout)return await e();const{promise:s,clear:r}=Be(a.timeout,a.timeoutErrorMessage),i=e().finally(r);return await Promise.race([i,s])}catch(s){if(n=s,!a.shouldRetryFn(s)||o>=a.limit)throw s;await ye(a.delayMs),a.onRetry(s)}throw n}function pe(){let e=window.localStorage.getItem("did_external_key_id");return e||(e=Math.random().toString(16).slice(2),window.localStorage.setItem("did_external_key_id",e)),e}let $e=Q();function ve(e){if(e.type==="bearer")return`Bearer ${e.token}`;if(e.type==="basic")return`Basic ${btoa(`${e.username}:${e.password}`)}`;if(e.type==="key")return`Client-Key ${e.clientKey}.${pe()}_${$e}`;throw new Error(`Unknown auth type: ${e}`)}const Le=e=>ee(e,{limit:3,delayMs:1e3,timeout:0,shouldRetryFn:t=>t.status===429});function te(e,t=X,a){const n=async(o,s)=>{const{skipErrorHandler:r,...i}=s||{},c=await Le(()=>fetch(t+(o!=null&&o.startsWith("/")?o:`/${o}`),{...i,headers:{...i.headers,Authorization:ve(e),"Content-Type":"application/json"}}));if(!c.ok){let g=await c.text().catch(()=>`Failed to fetch with status ${c.status}`);const l=new Error(g);throw a&&!r&&a(l,{url:o,options:i,headers:c.headers}),l}return c.json()};return{get(o,s){return n(o,{...s,method:"GET"})},post(o,s,r){return n(o,{...r,body:JSON.stringify(s),method:"POST"})},delete(o,s,r){return n(o,{...r,body:JSON.stringify(s),method:"DELETE"})},patch(o,s,r){return n(o,{...r,body:JSON.stringify(s),method:"PATCH"})}}}function Ce(e,t=X,a){const n=te(e,`${t}/agents`,a);return{create(o,s){return n.post("/",o,s)},getAgents(o,s){return n.get(`/${o?`?tag=${o}`:""}`,s).then(r=>r??[])},getById(o,s){return n.get(`/${o}`,s)},delete(o,s){return n.delete(`/${o}`,void 0,s)},update(o,s,r){return n.patch(`/${o}`,s,r)},newChat(o,s,r){return n.post(`/${o}/chat`,s,r)},chat(o,s,r,i){return n.post(`/${o}/chat/${s}`,r,i)},createRating(o,s,r,i){return n.post(`/${o}/chat/${s}/ratings`,r,i)},updateRating(o,s,r,i,c){return n.patch(`/${o}/chat/${s}/ratings/${r}`,i,c)},deleteRating(o,s,r,i){return n.delete(`/${o}/chat/${s}/ratings/${r}`,i)},getSTTToken(o,s){return n.get(`/${o}/stt-token`,s)}}}const re=e=>e.type==="clip"&&e.presenter_id.startsWith("v2_")?"clip_v2":e.type;function Ae(e){var o,s,r,i;const t=()=>/Mobi|Android/i.test(navigator.userAgent)?"Mobile":"Desktop",a=()=>{const c=navigator.platform;return c.toLowerCase().includes("win")?"Windows":c.toLowerCase().includes("mac")?"Mac OS X":c.toLowerCase().includes("linux")?"Linux":"Unknown"},n=e.presenter;return{$os:`${a()}`,isMobile:`${t()=="Mobile"}`,browser:navigator.userAgent,origin:window.location.origin,agentType:re(n),agentVoice:{voiceId:(s=(o=e.presenter)==null?void 0:o.voice)==null?void 0:s.voice_id,provider:(i=(r=e.presenter)==null?void 0:r.voice)==null?void 0:i.type}}}const ze=e=>e.reduce((t,a)=>t+a,0),Fe=e=>ze(e)/e.length;function Ne(e,t,a){var c,g,l;const{event:n,...o}=e,{template:s}=(t==null?void 0:t.llm)||{},{language:r}=((c=t==null?void 0:t.presenter)==null?void 0:c.voice)||{};return{...o,llm:{...o.llm,template:s},script:{...o.script,provider:{...(g=o==null?void 0:o.script)==null?void 0:g.provider,language:r}},stitch:(t==null?void 0:t.presenter.type)==="talk"?(l=t==null?void 0:t.presenter)==null?void 0:l.stitch:void 0,...a}}let ne={};const Je="https://api-js.mixpanel.com/track/?verbose=1&ip=1";function We(e){var s,r,i,c,g,l;const t=window!=null&&window.hasOwnProperty("DID_AGENTS_API")?"agents-ui":"agents-sdk",a=e.agent.presenter,n=(s=e.agent.llm)==null?void 0:s.prompt_customization,o={token:e.token||"testKey",distinct_id:e.distinctId||pe(),agentId:e.agent.id,agentType:re(a),owner_id:e.agent.owner_id??"",promptVersion:(r=e.agent.llm)==null?void 0:r.prompt_version,behavior:{role:n==null?void 0:n.role,personality:n==null?void 0:n.personality,instructions:(i=e.agent.llm)==null?void 0:i.instructions},temperature:(c=e.agent.llm)==null?void 0:c.temperature,knowledgeSource:n==null?void 0:n.knowledge_source,starterQuestionsCount:(l=(g=e.agent.knowledge)==null?void 0:g.starter_message)==null?void 0:l.length,topicsToAvoid:n==null?void 0:n.topics_to_avoid,maxResponseLength:n==null?void 0:n.max_response_length};return{...o,additionalProperties:{},isEnabled:e.isEnabled??!0,getRandom:()=>Math.random().toString(16).slice(2),enrich(h){const k={};if(h&&typeof h!="object")throw new Error("properties must be a flat json object");for(let p in h)(typeof h[p]=="string"||typeof h[p]=="number")&&(k[p]=h[p]);this.additionalProperties={...this.additionalProperties,...k}},async track(h,k){if(!this.isEnabled)return Promise.resolve();const{audioPath:p,...v}=k||{},D={method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({data:JSON.stringify([{event:h,properties:{...this.additionalProperties,...v,...o,source:t,time:Date.now(),$insert_id:this.getRandom(),origin:window.location.href,"Screen Height":window.screen.height||window.innerWidth,"Screen Width":window.screen.width||window.innerHeight,"User Agent":navigator.userAgent}}])})};try{return await fetch(Je,D).then(R=>R.json())}catch(R){return console.error(R)}},linkTrack(h,k,p,v){ne[h]||(ne[h]={events:{},resolvedDependencies:[]}),v.includes(p)||v.push(p);const D=ne[h];if(D.events[p]={props:k},D.resolvedDependencies.push(p),v.every(A=>D.resolvedDependencies.includes(A))){const A=v.reduce((P,d)=>D.events[d]?{...P,...D.events[d].props}:P,{});this.track(h,A),D.resolvedDependencies=D.resolvedDependencies.filter(P=>!v.includes(P)),v.forEach(P=>{delete D.events[P]})}}}}function He(){let e=0;return{reset:()=>e=0,update:()=>e=Date.now(),get:(t=!1)=>t?Date.now()-e:e}}const q=He();function De(e){return e===j.Playground?{headers:{[je]:"true"}}:{}}async function ke(e,t,a,n,o=!1,s){try{return!s&&n!==j.DirectPlayback&&(s=await t.newChat(e.id,{persist:o},De(n)),a.track("agent-chat",{event:"created",chat_id:s.id,agent_id:e.id,mode:n})),{chat:s,chatMode:(s==null?void 0:s.chat_mode)??n}}catch(r){try{const i=JSON.parse(r.message);if((i==null?void 0:i.kind)==="InsufficientCreditsError")throw new Error("InsufficientCreditsError")}catch(i){console.error("Error parsing the error message:",i)}throw new Error("Cannot create new chat")}}function Ue(e){var a;const t=((a=e.greetings)==null?void 0:a.filter(n=>n.length>0))??[];return t.length>0?t[Math.floor(Math.random()*t.length)]:`Hi! I'm ${e.preview_name||"My Agent"}. How can I help you?`}function Re(e,t){return t&&t.length>0?t:[{content:e,id:Q(),role:"assistant",created_at:new Date().toISOString()}]}function Ke(e){return new Promise((t,a)=>{const{callbacks:n,host:o,auth:s}=e,{onMessage:r=null,onOpen:i=null,onClose:c=null,onError:g=null}=n||{},l=new WebSocket(`${o}?authorization=${ve(s)}`);l.onmessage=r,l.onclose=c,l.onerror=h=>{console.error(h),g==null||g("Websocket failed to connect",h),a(h)},l.onopen=h=>{i==null||i(h),t(l)}})}async function qe(e){const{retries:t=1}=e;let a=null;for(let n=0;(a==null?void 0:a.readyState)!==WebSocket.OPEN;n++)try{a=await Ke(e)}catch(o){if(n===t)throw o;await ye(n*500)}return a}async function xe(e,t,a){const n=a!=null&&a.onMessage?[a.onMessage]:[],o=await qe({auth:e,host:t,callbacks:{onError:s=>{var r;return(r=a.onError)==null?void 0:r.call(a,new se(s))},onMessage(s){const r=JSON.parse(s.data);n.forEach(i=>i(r.event,r))}}});return{socket:o,disconnect:()=>o.close(),subscribeToEvents:s=>n.push(s)}}function Ve(e){if(e.answer!==void 0)return e.answer;let t=0,a="";for(;t in e;)a+=e[t++];return a}function Xe(e,t,a,n,o){const s=n.messages[n.messages.length-1];if(!(e===U.Partial||e===U.Answer)||(s==null?void 0:s.role)!=="assistant")return;const{content:r,sequence:i}=t;e===U.Partial?a[i]=r:a.answer=r;const c=Ve(a);(s.content!==c||e===U.Answer)&&(s.content=c,o==null||o([...n.messages],e))}function Ye(e,t,a,n,o){let s={};return{clearQueue:()=>s={},onMessage:(r,i)=>{var c,g;if("content"in i)Xe(r,i,s,t,a.callbacks.onNewMessage),r===U.Answer&&e.track("agent-message-received",{messages:t.messages.length,mode:t.chatMode});else{const l=V,h=[l.StreamVideoDone,l.StreamVideoError,l.StreamVideoRejected],k=[l.StreamFailed,l.StreamVideoError,l.StreamVideoRejected],p=Ne(i,n,{mode:t.chatMode});if(r=r,r===l.StreamVideoCreated)e.linkTrack("agent-video",p,l.StreamVideoCreated,["start"]);else if(h.includes(r)){const v=r.split("/")[1];k.includes(r)?e.track("agent-video",{...p,event:v}):e.linkTrack("agent-video",{...p,event:v},r,["done"])}k.includes(r)&&((g=(c=a.callbacks).onError)==null||g.call(c,new Error(`Stream failed with event ${r}`),{data:i})),i.event===l.StreamDone&&o()}}}}function Ge(e,t,a,n){const o=te(e,`${t}/agents/${a}`,n);return{createStream(s){return o.post("/streams",{output_resolution:s.output_resolution,compatibility_mode:s.compatibility_mode,stream_warmup:s.stream_warmup,session_timeout:s.session_timeout,stream_greeting:s.stream_greeting})},startConnection(s,r,i){return o.post(`/streams/${s}/sdp`,{session_id:i,answer:r})},addIceCandidate(s,r,i){return o.post(`/streams/${s}/ice`,{session_id:i,...r})},sendStreamRequest(s,r,i){return o.post(`/streams/${s}`,{session_id:r,...i})},close(s,r){return o.delete(`/streams/${s}`,{session_id:r})}}}function Qe(e,t,a,n){const o=te(e,`${t}/agents/${a}`,n);return{createStream(s,r){return o.post("/streams",{driver_url:s.driver_url,face:s.face,config:s.config,output_resolution:s.output_resolution,compatibility_mode:s.compatibility_mode,stream_warmup:s.stream_warmup,session_timeout:s.session_timeout,stream_greeting:s.stream_greeting},r)},startConnection(s,r,i,c){return o.post(`/streams/${s}/sdp`,{session_id:i,answer:r},c)},addIceCandidate(s,r,i,c){return o.post(`/streams/${s}/ice`,{session_id:i,...r},c)},sendStreamRequest(s,r,i,c){return o.post(`/streams/${s}`,{session_id:r,...i},c)},close(s,r,i){return o.delete(`/streams/${s}`,{session_id:r},i)}}}function Ze(e,t,a){const n=(t.timestamp-e.timestamp)/1e3;return{duration:n,bytesReceived:t.bytesReceived-e.bytesReceived,bitrate:Math.round((t.bytesReceived-e.bytesReceived)*8/n),packetsReceived:t.packetsReceived-e.packetsReceived,packetsLost:t.packetsLost-e.packetsLost,framesDropped:t.framesDropped-e.framesDropped,framesDecoded:t.framesDecoded-e.framesDecoded,jitter:t.jitter,avgJitterDelayInInterval:(t.jitterBufferDelay-e.jitterBufferDelay)/(t.jitterBufferEmittedCount-e.jitterBufferEmittedCount),jitterBufferEmittedCount:t.jitterBufferEmittedCount-e.jitterBufferEmittedCount,jitterBufferDelay:(t.jitterBufferDelay-e.jitterBufferDelay)/n,framesPerSecond:t.framesPerSecond,freezeCount:t.freezeCount-e.freezeCount,freezeDuration:t.freezeDuration-e.freezeDuration,lowFpsCount:a}}function Oe(e){return e.filter(t=>t.freezeCount>0||t.framesPerSecond<21||t.framesDropped>0||t.packetsLost>0).map(t=>{const{timestamp:a,...n}=t,o=[];return t.freezeCount>0&&o.push("freeze"),t.framesPerSecond<21&&o.push("low fps"),t.framesDropped>0&&o.push("frames dropped"),t.packetsLost>0&&o.push("packet loss"),{...n,causes:o}})}function et(e){let t="";for(const a of e.values())if(a&&a.type==="codec"&&a.mimeType.startsWith("video")&&(t=a.mimeType.split("/")[1]),a&&a.type==="inbound-rtp"&&a.kind==="video")return{codec:t,timestamp:a.timestamp,bytesReceived:a.bytesReceived,packetsReceived:a.packetsReceived,packetsLost:a.packetsLost,framesDropped:a.framesDropped,framesDecoded:a.framesDecoded,jitter:a.jitter,jitterBufferDelay:a.jitterBufferDelay,jitterBufferEmittedCount:a.jitterBufferEmittedCount,avgJitterDelayInInterval:a.jitterBufferDelay/a.jitterBufferEmittedCount,frameWidth:a.frameWidth,frameHeight:a.frameHeight,framesPerSecond:a.framesPerSecond,freezeCount:a.freezeCount,freezeDuration:a.totalFreezesDuration};return{}}function tt(e,t,a){const n=e.map((i,c)=>c===0?a?{timestamp:i.timestamp,duration:0,bytesReceived:i.bytesReceived-a.bytesReceived,bitrate:(i.bytesReceived-a.bytesReceived)*8/(t/1e3),packetsReceived:i.packetsReceived-a.packetsReceived,packetsLost:i.packetsLost-a.packetsLost,framesDropped:i.framesDropped-a.framesDropped,framesDecoded:i.framesDecoded-a.framesDecoded,jitter:i.jitter,jitterBufferDelay:i.jitterBufferDelay-a.jitterBufferDelay,jitterBufferEmittedCount:i.jitterBufferEmittedCount-a.jitterBufferEmittedCount,avgJitterDelayInInterval:(i.jitterBufferDelay-a.jitterBufferDelay)/(i.jitterBufferEmittedCount-a.jitterBufferEmittedCount),framesPerSecond:i.framesPerSecond,freezeCount:i.freezeCount-a.freezeCount,freezeDuration:i.freezeDuration-a.freezeDuration}:{timestamp:i.timestamp,duration:0,bytesReceived:i.bytesReceived,bitrate:i.bytesReceived*8/(t/1e3),packetsReceived:i.packetsReceived,packetsLost:i.packetsLost,framesDropped:i.framesDropped,framesDecoded:i.framesDecoded,jitter:i.jitter,jitterBufferDelay:i.jitterBufferDelay,jitterBufferEmittedCount:i.jitterBufferEmittedCount,avgJitterDelayInInterval:i.jitterBufferDelay/i.jitterBufferEmittedCount,framesPerSecond:i.framesPerSecond,freezeCount:i.freezeCount,freezeDuration:i.freezeDuration}:{timestamp:i.timestamp,duration:t*c/1e3,bytesReceived:i.bytesReceived-e[c-1].bytesReceived,bitrate:(i.bytesReceived-e[c-1].bytesReceived)*8/(t/1e3),packetsReceived:i.packetsReceived-e[c-1].packetsReceived,packetsLost:i.packetsLost-e[c-1].packetsLost,framesDropped:i.framesDropped-e[c-1].framesDropped,framesDecoded:i.framesDecoded-e[c-1].framesDecoded,jitter:i.jitter,jitterBufferDelay:i.jitterBufferDelay-e[c-1].jitterBufferDelay,jitterBufferEmittedCount:i.jitterBufferEmittedCount-e[c-1].jitterBufferEmittedCount,avgJitterDelayInInterval:(i.jitterBufferDelay-e[c-1].jitterBufferDelay)/(i.jitterBufferEmittedCount-e[c-1].jitterBufferEmittedCount),framesPerSecond:i.framesPerSecond,freezeCount:i.freezeCount-e[c-1].freezeCount,freezeDuration:i.freezeDuration-e[c-1].freezeDuration}),o=Oe(n),s=o.reduce((i,c)=>i+(c.causes.includes("low fps")?1:0),0),r=n.map(i=>i.avgJitterDelayInInterval);return{webRTCStats:{anomalies:o,aggregateReport:Ze(e[0],e[e.length-1],s),minJitterDelayInInterval:Math.min(...r),maxJitterDelayInInterval:Math.max(...r),avgJitterDelayInInterval:Fe(r)},codec:e[0].codec,resolution:`${e[0].frameWidth}x${e[0].frameHeight}`}}const ae=100,rt=Math.max(Math.ceil(400/ae),1),nt=.25,at=.28;function it(){let e=0,t,a,n=0;return o=>{for(const s of o.values())if(s&&s.type==="inbound-rtp"&&s.kind==="video"){const r=s.jitterBufferDelay,i=s.jitterBufferEmittedCount;if(a&&i>a){const l=r-t,h=i-a;n=l/h}t=r,a=i;const c=s.framesDecoded,g=c-e>0;return e=c,{isReceiving:g,avgJitterDelayInInterval:n,freezeCount:s.freezeCount}}return{isReceiving:!1,avgJitterDelayInInterval:n}}}function st(e,t,a,n,o,s=!1,r=!1){const i=s?1:0;let c=[],g,l=0,h=!1,k=0,p=K.Unknown,v=K.Unknown,D=0,R=0;const A=it();return setInterval(async()=>{const P=await e.getStats(),{isReceiving:d,avgJitterDelayInInterval:y,freezeCount:m}=A(P),M=et(P);if(d)l=0,D=m-R,v=y<nt?K.Strong:y>at&&D>1?K.Weak:p,v!==p&&(o==null||o(v),p=v,R+=D,D=0),h||(n==null||n(C.Start),r&&k>=i&&!t()&&a(),g=c[c.length-1],c=[],k++,h=!0),c.push(M);else if(h&&(l++,l>=rt)){const I=tt(c,ae,g);n==null||n(C.Stop,I),!r&&!t()&&a(),h=!1}},ae)}let Se=!1;const W=(e,t)=>Se&&console.log(e,t),ot=(window.RTCPeerConnection||window.webkitRTCPeerConnection||window.mozRTCPeerConnection).bind(window);function Ee(e){switch(e){case"connected":return E.Connected;case"checking":return E.Connecting;case"failed":return E.Fail;case"new":return E.New;case"closed":return E.Closed;case"disconnected":return E.Disconnected;case"completed":return E.Completed;default:return E.New}}function ct({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,report:n}){e===C.Start&&t===C.Start?a==null||a(C.Start):e===C.Stop&&t===C.Stop&&(a==null||a(C.Stop,n))}function dt({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:n,report:o}){e===C.Start?a==null||a(C.Start):e===C.Stop&&(a==null||a(C.Stop,o)),t===C.Start?n==null||n(x.Talking):t===C.Stop&&(n==null||n(x.Idle))}function Me({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:n,streamType:o,report:s}){o===J.Legacy?ct({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,report:s}):o===J.Fluent&&dt({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:n,report:s})}async function lt(e,t,{debug:a=!1,callbacks:n,auth:o,baseURL:s=X}){Se=a;let r=!1,i=!1,c=C.Stop,g=C.Stop,l=K.Unknown;const{startConnection:h,sendStreamRequest:k,close:p,createStream:v,addIceCandidate:D}=t.videoType===Z.Clip?Ge(o,s,e,n.onError):Qe(o,s,e,n.onError),{id:R,offer:A,ice_servers:P,session_id:d,fluent:y}=await v(t),m=new ot({iceServers:P}),M=m.createDataChannel("JanusDataChannel");if(!d)throw new Error("Could not create session_id");const I=y?J.Fluent:J.Legacy,T=t.stream_warmup&&!y,z=()=>r,B=()=>{var u;r=!0,i&&((u=n.onConnectionStateChange)==null||u.call(n,E.Connected))},$=st(m,z,B,(u,w)=>Me({statsSignal:g=u,dataChannelSignal:I===J.Legacy?c:void 0,onVideoStateChange:n.onVideoStateChange,onAgentActivityStateChange:n.onAgentActivityStateChange,report:w,streamType:I}),u=>{var w;return(w=n.onConnectivityStateChange)==null?void 0:w.call(n,l)},T,!!t.stream_greeting);m.onicecandidate=u=>{var w;W("peerConnection.onicecandidate",u);try{u.candidate&&u.candidate.sdpMid&&u.candidate.sdpMLineIndex!==null?D(R,{candidate:u.candidate.candidate,sdpMid:u.candidate.sdpMid,sdpMLineIndex:u.candidate.sdpMLineIndex},d):D(R,{candidate:null},d)}catch(b){(w=n.onError)==null||w.call(n,b,{streamId:R})}},M.onopen=()=>{i=!0,(!T&&!t.stream_greeting||r)&&B()},M.onmessage=u=>{u.data in O&&(c=O[u.data],Me({statsSignal:I===J.Legacy?g:void 0,dataChannelSignal:c,onVideoStateChange:n.onVideoStateChange,onAgentActivityStateChange:n.onAgentActivityStateChange,streamType:I}))},m.oniceconnectionstatechange=()=>{var w;W("peerConnection.oniceconnectionstatechange => "+m.iceConnectionState);const u=Ee(m.iceConnectionState);u!==E.Connected&&((w=n.onConnectionStateChange)==null||w.call(n,u))},m.ontrack=u=>{var w;W("peerConnection.ontrack",u),(w=n.onSrcObjectReady)==null||w.call(n,u.streams[0])},await m.setRemoteDescription(A),W("set remote description OK");const S=await m.createAnswer();return W("create answer OK"),await m.setLocalDescription(S),W("set local description OK"),await h(R,S,d),W("start connection OK"),{speak(u){return k(R,d,u)},async disconnect(){var u,w,b;if(R){const L=Ee(m.iceConnectionState);if(m){if(L===E.New){(u=n.onVideoStateChange)==null||u.call(n,C.Stop),clearInterval($);return}m.close(),m.oniceconnectionstatechange=null,m.onnegotiationneeded=null,m.onicecandidate=null,m.ontrack=null}try{L===E.Connected&&await p(R,d).catch(F=>{})}catch(F){W("Error on close stream connection",F)}(w=n.onVideoStateChange)==null||w.call(n,C.Stop),(b=n.onAgentActivityStateChange)==null||b.call(n,x.Idle),clearInterval($)}},sessionId:d,streamId:R,streamType:I}}function ut(e,t,a){var o;const{streamOptions:n}=t??{};return{videoType:ge(e.presenter.type),output_resolution:n==null?void 0:n.outputResolution,session_timeout:n==null?void 0:n.sessionTimeout,stream_warmup:n==null?void 0:n.streamWarmup,compatibility_mode:n==null?void 0:n.compatibilityMode,stream_greeting:re(e.presenter)!=="clip"&&((o=t==null?void 0:t.streamOptions)!=null&&o.streamGreeting)?a:void 0}}function ft(e,t,a,n){q.get()>0&&(e===C.Start?n.linkTrack("agent-video",{event:"start",latency:q.get(!0)},"start",[V.StreamVideoCreated]):e===C.Stop&&n.linkTrack("agent-video",{event:"stop",is_greenscreen:t.presenter.type==="clip"&&t.presenter.is_greenscreen,background:t.presenter.type==="clip"&&t.presenter.background,...a},"done",[V.StreamVideoDone]))}function mt(e,t,a,n){return q.reset(),new Promise(async(o,s)=>{try{const r=await lt(e.id,ut(e,t,n),{...t,analytics:a,callbacks:{...t.callbacks,onConnectionStateChange:i=>{var c,g;(g=(c=t.callbacks).onConnectionStateChange)==null||g.call(c,i),i===E.Connected&&o(r)},onVideoStateChange:(i,c)=>{var g,l;(l=(g=t.callbacks).onVideoStateChange)==null||l.call(g,i),ft(i,e,c,a)}}})}catch(r){s(r)}})}async function gt(e,t,a,n,o,s){var g,l,h,k;const{chat:r,chatMode:i}=await ke(e,a,n,t.mode,t.persistentChat,o);if(i&&i!==t.mode&&(t.mode=i,(l=(g=t.callbacks).onModeChange)==null||l.call(g,i),i===j.TextOnly))return(k=(h=t.callbacks).onError)==null||k.call(h,new ie(i)),{chat:r};const c=await mt(e,t,n,s);return{chat:r,streamingManager:c}}async function ht(e,t){var R,A,P;let a=!0;const n=t.mixpanelKey||be,o=t.wsURL||Pe,s=t.baseURL||X,r={messages:[],chatMode:t.mode||j.Functional},i=Ce(t.auth,s,t.callbacks.onError),c=await i.getById(e),g=Ue(c),l=We({token:n,agent:c,isEnabled:t.enableAnalitics,distinctId:t.distinctId}),{onMessage:h,clearQueue:k}=Ye(l,r,t,c,()=>{var d;return(d=r.socketManager)==null?void 0:d.disconnect()});r.messages=Re(g,t.initialMessages),(A=(R=t.callbacks).onNewMessage)==null||A.call(R,[...r.messages],"answer"),l.track("agent-sdk",{event:"loaded",...Ae(c)});async function p(d){var z,B,$,S,u,w,b;(B=(z=t.callbacks).onConnectionStateChange)==null||B.call(z,E.Connecting),q.reset(),d&&!a&&(delete r.chat,r.messages=Re(g),(S=($=t.callbacks).onNewMessage)==null||S.call($,[...r.messages],"answer"));const y=t.mode===j.DirectPlayback?Promise.resolve(void 0):xe(t.auth,o,{onMessage:h,onError:t.callbacks.onError}),m=ee(()=>gt(c,t,i,l,r.chat,d?g:void 0),{limit:3,timeout:Te,timeoutErrorMessage:"Timeout initializing the stream",shouldRetryFn:L=>(L==null?void 0:L.message)!=="Could not connect"&&L.status!==429,delayMs:1e3}).catch(L=>{var F,Y;throw D(j.Maintenance),(Y=(F=t.callbacks).onConnectionStateChange)==null||Y.call(F,E.Fail),L}),[M,{streamingManager:I,chat:T}]=await Promise.all([y,m]);T&&T.id!==((u=r.chat)==null?void 0:u.id)&&((b=(w=t.callbacks).onNewChat)==null||b.call(w,T.id)),r.streamingManager=I,r.socketManager=M,r.chat=T,a=!1,D((T==null?void 0:T.chat_mode)??t.mode??j.Functional)}async function v(){var d,y,m,M;(d=r.socketManager)==null||d.disconnect(),await((y=r.streamingManager)==null?void 0:y.disconnect()),delete r.streamingManager,delete r.socketManager,(M=(m=t.callbacks).onConnectionStateChange)==null||M.call(m,E.Disconnected)}async function D(d){var y,m;d!==r.chatMode&&(l.track("agent-mode-change",{mode:d}),r.chatMode=d,r.chatMode!==j.Functional&&await v(),(m=(y=t.callbacks).onModeChange)==null||m.call(y,d))}return{agent:c,getStreamType:()=>{var d;return(d=r.streamingManager)==null?void 0:d.streamType},starterMessages:((P=c.knowledge)==null?void 0:P.starter_message)||[],getSTTToken:()=>i.getSTTToken(c.id),changeMode:D,enrichAnalytics:l.enrich,async connect(){var d;await p(!0),l.track("agent-chat",{event:"connect",chatId:(d=r.chat)==null?void 0:d.id,agentId:c.id,mode:r.chatMode})},async reconnect(){var d;await v(),await p(!1),l.track("agent-chat",{event:"reconnect",chatId:(d=r.chat)==null?void 0:d.id,agentId:c.id,mode:r.chatMode})},async disconnect(){var d;await v(),l.track("agent-chat",{event:"disconnect",chatId:(d=r.chat)==null?void 0:d.id,agentId:c.id,mode:r.chatMode})},async chat(d){var I,T,z,B,$;const y=()=>{if(t.mode===j.DirectPlayback)throw new H("Direct playback is enabled, chat is disabled");if(d.length>=800)throw new H("Message cannot be more than 800 characters");if(d.length===0)throw new H("Message cannot be empty");if(r.chatMode===j.Maintenance)throw new H("Chat is in maintenance mode");if(![j.TextOnly,j.Playground].includes(r.chatMode)){if(!r.streamingManager)throw new H("Streaming manager is not initialized");if(!r.chat)throw new H("Chat is not initialized")}},m=async()=>{var S,u;if(!r.chat){const w=await ke(c,i,l,r.chatMode,t.persistentChat);if(!w.chat)throw new N(r.chatMode,!!t.persistentChat);r.chat=w.chat,(u=(S=t.callbacks).onNewChat)==null||u.call(S,r.chat.id)}return r.chat.id},M=async(S,u)=>ee(()=>{var w,b;return i.chat(c.id,u,{chatMode:r.chatMode,streamId:(w=r.streamingManager)==null?void 0:w.streamId,sessionId:(b=r.streamingManager)==null?void 0:b.sessionId,messages:S.map(({matches:L,...F})=>F)},{...De(r.chatMode),skipErrorHandler:!0})},{limit:2,shouldRetryFn:w=>{var F,Y,_e,Ie;const b=(F=w==null?void 0:w.message)==null?void 0:F.includes("missing or invalid session_id");return!((Y=w==null?void 0:w.message)==null?void 0:Y.includes("Stream Error"))&&!b?((Ie=(_e=t.callbacks).onError)==null||Ie.call(_e,w),!1):!0},onRetry:async()=>{await v(),await p(!1)}});try{k(),y(),r.messages.push({id:Q(),role:"user",content:d,created_at:new Date(q.update()).toISOString()}),(T=(I=t.callbacks).onNewMessage)==null||T.call(I,[...r.messages],"user");const S=await m(),u=await M([...r.messages],S);return r.messages.push({id:Q(),role:"assistant",content:u.result||"",created_at:new Date().toISOString(),context:u.context,matches:u.matches}),l.track("agent-message-send",{event:"success",mode:r.chatMode,messages:r.messages.length+1}),u.result&&((B=(z=t.callbacks).onNewMessage)==null||B.call(z,[...r.messages],"answer"),l.track("agent-message-received",{latency:q.get(!0),mode:r.chatMode,messages:r.messages.length})),u}catch(S){throw(($=r.messages[r.messages.length-1])==null?void 0:$.role)==="assistant"&&r.messages.pop(),l.track("agent-message-send",{event:"error",mode:r.chatMode,messages:r.messages.length}),S}},rate(d,y,m){var T,z,B,$;const M=r.messages.find(S=>S.id===d);if(r.chat){if(!M)throw new Error("Message not found")}else throw new Error("Chat is not initialized");const I=((T=M.matches)==null?void 0:T.map(S=>[S.document_id,S.id]))??[];return l.track("agent-rate",{event:m?"update":"create",thumb:y===1?"up":"down",knowledge_id:((z=c.knowledge)==null?void 0:z.id)??"",mode:r.chatMode,matches:I,score:y}),m?i.updateRating(c.id,r.chat.id,m,{knowledge_id:((B=c.knowledge)==null?void 0:B.id)??"",message_id:d,matches:I,score:y}):i.createRating(c.id,r.chat.id,{knowledge_id:(($=c.knowledge)==null?void 0:$.id)??"",message_id:d,matches:I,score:y})},deleteRate(d){var y;if(!r.chat)throw new Error("Chat is not initialized");return l.track("agent-rate-delete",{type:"text",chat_id:(y=r.chat)==null?void 0:y.id,id:d,mode:r.chatMode}),i.deleteRating(c.id,r.chat.id,d)},speak(d){var M;if(!r.streamingManager)throw new Error("Please connect to the agent first");function y(){if(typeof d=="string"){if(!c.presenter.voice)throw new Error("Presenter voice is not initialized");return{type:"text",provider:c.presenter.voice,input:d,ssml:!1}}if(d.type==="text"&&!d.provider){if(!c.presenter.voice)throw new Error("Presenter voice is not initialized");return{type:"text",provider:c.presenter.voice,input:d.input,ssml:d.ssml}}return d}const m=y();return l.track("agent-speak",m),q.update(),r.streamingManager.speak({script:m,metadata:{chat_id:(M=r.chat)==null?void 0:M.id,agent_id:c.id}})}}}function wt(e,t,a){const{getById:n}=Ce(t,a||X);return n(e)}f.AgentActivityState=x,f.AgentStatus=de,f.ChatCreationFailed=N,f.ChatMode=j,f.ChatModeDowngraded=ie,f.ChatProgress=U,f.ConnectionState=E,f.ConnectivityState=K,f.DataChannelSignalMap=O,f.DocumentType=me,f.KnowledgeType=fe,f.PlanGroup=ce,f.Providers=he,f.RateState=le,f.StreamEvents=V,f.StreamType=J,f.StreamingState=C,f.Subject=ue,f.UserPlan=oe,f.ValidationError=H,f.VideoType=Z,f.VoiceAccess=we,f.WsError=se,f.createAgentManager=ht,f.getAgent=wt,f.mapVideoType=ge,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});
1
+ (function(m,b){typeof exports=="object"&&typeof module<"u"?b(exports):typeof define=="function"&&define.amd?define(["exports"],b):(m=typeof globalThis<"u"?globalThis:m||self,b(m.index={}))})(this,function(m){"use strict";var Et=Object.defineProperty;var _t=(m,b,q)=>b in m?Et(m,b,{enumerable:!0,configurable:!0,writable:!0,value:q}):m[b]=q;var ee=(m,b,q)=>(_t(m,typeof b!="symbol"?b+"":b,q),q);class b extends Error{constructor({kind:a,description:r,error:s}){super(JSON.stringify({kind:a,description:r}));ee(this,"kind");ee(this,"description");ee(this,"error");this.kind=a,this.description=r,this.error=s}}class q extends b{constructor(t,a){super({kind:"ChatCreationFailed",description:`Failed to create ${a?"persistent":""} chat, mode: ${t}`})}}class ce extends b{constructor(t){super({kind:"ChatModeDowngraded",description:`Chat mode downgraded to ${t}`})}}class V extends b{constructor(a,r){super({kind:"ValidationError",description:a});ee(this,"key");this.key=r}}class de extends b{constructor(t){super({kind:"WSError",description:t})}}var ue=(e=>(e.TRIAL="trial",e.BASIC="basic",e.ENTERPRISE="enterprise",e.LITE="lite",e.ADVANCED="advanced",e))(ue||{}),le=(e=>(e.TRIAL="deid-trial",e.PRO="deid-pro",e.ENTERPRISE="deid-enterprise",e.LITE="deid-lite",e.ADVANCED="deid-advanced",e.BUILD="deid-api-build",e.LAUNCH="deid-api-launch",e.SCALE="deid-api-scale",e))(le||{}),fe=(e=>(e.Created="created",e.Started="started",e.Done="done",e.Error="error",e.Rejected="rejected",e.Ready="ready",e))(fe||{}),me=(e=>(e.Unrated="Unrated",e.Positive="Positive",e.Negative="Negative",e))(me||{}),A=(e=>(e.Functional="Functional",e.TextOnly="TextOnly",e.Maintenance="Maintenance",e.Playground="Playground",e.DirectPlayback="DirectPlayback",e.Off="Off",e))(A||{}),X=(e=>(e.Embed="embed",e.Query="query",e.Partial="partial",e.Answer="answer",e.Complete="done",e))(X||{}),ge=(e=>(e.KnowledgeProcessing="knowledge/processing",e.KnowledgeIndexing="knowledge/indexing",e.KnowledgeFailed="knowledge/error",e.KnowledgeDone="knowledge/done",e))(ge||{}),he=(e=>(e.Knowledge="knowledge",e.Document="document",e.Record="record",e))(he||{}),we=(e=>(e.Pdf="pdf",e.Text="text",e.Html="html",e.Word="word",e.Json="json",e.Markdown="markdown",e.Csv="csv",e.Excel="excel",e.Powerpoint="powerpoint",e.Archive="archive",e.Image="image",e.Audio="audio",e.Video="video",e))(we||{}),te=(e=>(e.Clip="clip",e.Talk="talk",e))(te||{});const pe=e=>{switch(e){case"clip":return"clip";case"talk":return"talk";default:throw new Error(`Unknown video type: ${e}`)}};var y=(e=>(e.Start="START",e.Stop="STOP",e))(y||{}),O=(e=>(e.Strong="STRONG",e.Weak="WEAK",e.Unknown="UNKNOWN",e))(O||{}),Y=(e=>(e.Idle="IDLE",e.Talking="TALKING",e))(Y||{}),z=(e=>(e.ChatAnswer="chat/answer",e.ChatPartial="chat/partial",e.StreamDone="stream/done",e.StreamStarted="stream/started",e.StreamFailed="stream/error",e.StreamReady="stream/ready",e.StreamCreated="stream/created",e.StreamInterrupt="stream/interrupt",e.StreamVideoCreated="stream-video/started",e.StreamVideoDone="stream-video/done",e.StreamVideoError="stream-video/error",e.StreamVideoRejected="stream-video/rejected",e))(z||{}),M=(e=>(e.New="new",e.Fail="fail",e.Connected="connected",e.Connecting="connecting",e.Closed="closed",e.Completed="completed",e.Disconnected="disconnected",e))(M||{}),H=(e=>(e.Legacy="legacy",e.Fluent="fluent",e))(H||{}),ye=(e=>(e.Amazon="amazon",e.Microsoft="microsoft",e.Afflorithmics="afflorithmics",e.Elevenlabs="elevenlabs",e))(ye||{}),ve=(e=>(e.Public="public",e.Premium="premium",e.Private="private",e))(ve||{});const Pe=45*1e3,$e="X-Playground-Chat",G="https://api.d-id.com",Be="wss://notifications.d-id.com",Le="79f81a83a67430be2bc0fd61042b8faa",ke=e=>new Promise(t=>setTimeout(t,e)),Q=(e=16)=>{const t=new Uint8Array(e);return window.crypto.getRandomValues(t),Array.from(t,a=>a.toString(16).padStart(2,"0")).join("").slice(0,13)},ze=e=>[A.TextOnly,A.Playground,A.Maintenance].includes(e),re=e=>e&&[A.DirectPlayback,A.Off].includes(e);function Fe(e,t){let a;return{promise:new Promise((s,i)=>{a=setTimeout(()=>i(new Error(t)),e)}),clear:()=>clearTimeout(a)}}async function ne(e,t){const a={limit:(t==null?void 0:t.limit)??3,delayMs:(t==null?void 0:t.delayMs)??0,timeout:(t==null?void 0:t.timeout)??3e4,timeoutErrorMessage:(t==null?void 0:t.timeoutErrorMessage)||"Timeout error",shouldRetryFn:(t==null?void 0:t.shouldRetryFn)??(()=>!0),onRetry:(t==null?void 0:t.onRetry)??(()=>{})};let r;for(let s=1;s<=a.limit;s++)try{if(!a.timeout)return await e();const{promise:i,clear:c}=Fe(a.timeout,a.timeoutErrorMessage),n=e().finally(c);return await Promise.race([n,i])}catch(i){if(r=i,!a.shouldRetryFn(i)||s>=a.limit)throw i;await ke(a.delayMs),a.onRetry(i)}throw r}function Ce(){let e=window.localStorage.getItem("did_external_key_id");if(!e){let t=Q();window.localStorage.setItem("did_external_key_id",t),e=t}return e}let Ne=Q();function De(e){if(e.type==="bearer")return`Bearer ${e.token}`;if(e.type==="basic")return`Basic ${btoa(`${e.username}:${e.password}`)}`;if(e.type==="key")return`Client-Key ${e.clientKey}.${Ce()}_${Ne}`;throw new Error(`Unknown auth type: ${e}`)}const Je=e=>ne(e,{limit:3,delayMs:1e3,timeout:0,shouldRetryFn:t=>t.status===429});function ae(e,t=G,a){const r=async(s,i)=>{const{skipErrorHandler:c,...n}=i||{},o=await Je(()=>fetch(t+(s!=null&&s.startsWith("/")?s:`/${s}`),{...n,headers:{...n.headers,Authorization:De(e),"Content-Type":"application/json"}}));if(!o.ok){let d=await o.text().catch(()=>`Failed to fetch with status ${o.status}`);const l=new Error(d);throw a&&!c&&a(l,{url:s,options:n,headers:o.headers}),l}return o.json()};return{get(s,i){return r(s,{...i,method:"GET"})},post(s,i,c){return r(s,{...c,body:JSON.stringify(i),method:"POST"})},delete(s,i,c){return r(s,{...c,body:JSON.stringify(i),method:"DELETE"})},patch(s,i,c){return r(s,{...c,body:JSON.stringify(i),method:"PATCH"})}}}function Re(e,t=G,a){const r=ae(e,`${t}/agents`,a);return{create(s,i){return r.post("/",s,i)},getAgents(s,i){return r.get(`/${s?`?tag=${s}`:""}`,i).then(c=>c??[])},getById(s,i){return r.get(`/${s}`,i)},delete(s,i){return r.delete(`/${s}`,void 0,i)},update(s,i,c){return r.patch(`/${s}`,i,c)},newChat(s,i,c){return r.post(`/${s}/chat`,i,c)},chat(s,i,c,n){return r.post(`/${s}/chat/${i}`,c,n)},createRating(s,i,c,n){return r.post(`/${s}/chat/${i}/ratings`,c,n)},updateRating(s,i,c,n,o){return r.patch(`/${s}/chat/${i}/ratings/${c}`,n,o)},deleteRating(s,i,c,n){return r.delete(`/${s}/chat/${i}/ratings/${c}`,n)},getSTTToken(s,i){return r.get(`/${s}/stt-token`,i)}}}const Se=e=>e.type==="clip"&&e.presenter_id.startsWith("v2_")?"clip_v2":e.type;function We(e){var s,i,c,n;const t=()=>/Mobi|Android/i.test(navigator.userAgent)?"Mobile":"Desktop",a=()=>{const o=navigator.platform;return o.toLowerCase().includes("win")?"Windows":o.toLowerCase().includes("mac")?"Mac OS X":o.toLowerCase().includes("linux")?"Linux":"Unknown"},r=e.presenter;return{$os:`${a()}`,isMobile:`${t()=="Mobile"}`,browser:navigator.userAgent,origin:window.location.origin,agentType:Se(r),agentVoice:{voiceId:(i=(s=e.presenter)==null?void 0:s.voice)==null?void 0:i.voice_id,provider:(n=(c=e.presenter)==null?void 0:c.voice)==null?void 0:n.type}}}const Ue=e=>e.reduce((t,a)=>t+a,0),Ee=e=>Ue(e)/e.length;function Ke(e,t,a){var o,d,l;const{event:r,...s}=e,{template:i}=(t==null?void 0:t.llm)||{},{language:c}=((o=t==null?void 0:t.presenter)==null?void 0:o.voice)||{};return{...s,llm:{...s.llm,template:i},script:{...s.script,provider:{...(d=s==null?void 0:s.script)==null?void 0:d.provider,language:c}},stitch:(t==null?void 0:t.presenter.type)==="talk"?(l=t==null?void 0:t.presenter)==null?void 0:l.stitch:void 0,...a}}let ie={};const He="https://api-js.mixpanel.com/track/?verbose=1&ip=1";function xe(e){var i,c,n,o,d,l;const t=window!=null&&window.hasOwnProperty("DID_AGENTS_API")?"agents-ui":"agents-sdk",a=e.agent.presenter,r=(i=e.agent.llm)==null?void 0:i.prompt_customization,s={token:e.token||"testKey",distinct_id:e.distinctId||Ce(),agentId:e.agent.id,agentType:Se(a),owner_id:e.agent.owner_id??"",promptVersion:(c=e.agent.llm)==null?void 0:c.prompt_version,behavior:{role:r==null?void 0:r.role,personality:r==null?void 0:r.personality,instructions:(n=e.agent.llm)==null?void 0:n.instructions},temperature:(o=e.agent.llm)==null?void 0:o.temperature,knowledgeSource:r==null?void 0:r.knowledge_source,starterQuestionsCount:(l=(d=e.agent.knowledge)==null?void 0:d.starter_message)==null?void 0:l.length,topicsToAvoid:r==null?void 0:r.topics_to_avoid,maxResponseLength:r==null?void 0:r.max_response_length};return{...s,additionalProperties:{},isEnabled:e.isEnabled??!0,getRandom:Q,enrich(p){this.additionalProperties={...this.additionalProperties,...p}},async track(p,P){if(!this.isEnabled)return Promise.resolve();const{audioPath:S,...D}=P||{},R={method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({data:JSON.stringify([{event:p,properties:{...this.additionalProperties,...D,...s,source:t,time:Date.now(),$insert_id:this.getRandom(),origin:window.location.href,"Screen Height":window.screen.height||window.innerWidth,"Screen Width":window.screen.width||window.innerHeight,"User Agent":navigator.userAgent}}])})};try{return await fetch(He,R).then(C=>C.json())}catch(C){return console.error(C)}},linkTrack(p,P,S,D){ie[p]||(ie[p]={events:{},resolvedDependencies:[]}),D.includes(S)||D.push(S);const R=ie[p];if(R.events[S]={props:P},R.resolvedDependencies.push(S),D.every(J=>R.resolvedDependencies.includes(J))){const J=D.reduce((B,u)=>R.events[u]?{...B,...R.events[u].props}:B,{});this.track(p,J),R.resolvedDependencies=R.resolvedDependencies.filter(B=>!D.includes(B)),D.forEach(B=>{delete R.events[B]})}}}}function _e(){let e=0;return{reset:()=>e=0,update:()=>e=Date.now(),get:(t=!1)=>t?Date.now()-e:e}}const N=_e(),se=_e();function Ie(e){return e===A.Playground?{headers:{[$e]:"true"}}:{}}async function Me(e,t,a,r,s=!1,i){try{return!i&&!re(r)&&(i=await t.newChat(e.id,{persist:s},Ie(r)),a.track("agent-chat",{event:"created",chat_id:i.id,agent_id:e.id,mode:r})),{chat:i,chatMode:(i==null?void 0:i.chat_mode)??r}}catch(c){try{const n=JSON.parse(c.message);if((n==null?void 0:n.kind)==="InsufficientCreditsError")throw new Error("InsufficientCreditsError")}catch(n){console.error("Error parsing the error message:",n)}throw new Error("Cannot create new chat")}}function qe(e){return e&&e.length>0?e:[]}function Ve(e,t,a,r,s){if(!e||!t)throw new Error("Please connect to the agent first");if(!e.interruptAvailable)throw new Error("Interrupt is not enabled for this stream");if(a!==H.Fluent)throw new Error("Interrupt only available for Fluent streams");if(!r&&!s)throw new Error("No active video to interrupt")}async function Te(e,t){const a={type:z.StreamInterrupt,videoId:t,timestamp:Date.now()};e.sendDataChannelMessage(JSON.stringify(a))}function Xe(e){return new Promise((t,a)=>{const{callbacks:r,host:s,auth:i}=e,{onMessage:c=null,onOpen:n=null,onClose:o=null,onError:d=null}=r||{},l=new WebSocket(`${s}?authorization=${De(i)}`);l.onmessage=c,l.onclose=o,l.onerror=p=>{console.error(p),d==null||d("Websocket failed to connect",p),a(p)},l.onopen=p=>{n==null||n(p),t(l)}})}async function Ye(e){const{retries:t=1}=e;let a=null;for(let r=0;(a==null?void 0:a.readyState)!==WebSocket.OPEN;r++)try{a=await Xe(e)}catch(s){if(r===t)throw s;await ke(r*500)}return a}async function Oe(e,t,a){const r=a!=null&&a.onMessage?[a.onMessage]:[],s=await Ye({auth:e,host:t,callbacks:{onError:i=>{var c;return(c=a.onError)==null?void 0:c.call(a,new de(i))},onMessage(i){const c=JSON.parse(i.data);r.forEach(n=>n(c.event,c))}}});return{socket:s,disconnect:()=>s.close(),subscribeToEvents:i=>r.push(i)}}function Qe(e){if(e.answer!==void 0)return e.answer;let t=0,a="";for(;t in e;)a+=e[t++];return a}function Ge(e,t,a,r,s){const i=r.messages[r.messages.length-1];if(!(e===X.Partial||e===X.Answer)||(i==null?void 0:i.role)!=="assistant")return;const{content:c,sequence:n}=t;e===X.Partial?a[n]=c:a.answer=c;const o=Qe(a);(i.content!==o||e===X.Answer)&&(i.content=o,s==null||s([...r.messages],e))}function Ze(e,t,a,r,s){let i={};return{clearQueue:()=>i={},onMessage:(c,n)=>{var o,d;if("content"in n)Ge(c,n,i,t,a.callbacks.onNewMessage),c===X.Answer&&e.track("agent-message-received",{messages:t.messages.length,mode:t.chatMode});else{const l=z,p=[l.StreamVideoDone,l.StreamVideoError,l.StreamVideoRejected],P=[l.StreamFailed,l.StreamVideoError,l.StreamVideoRejected],S=Ke(n,r,{mode:t.chatMode});if(c=c,c===l.StreamVideoCreated)e.linkTrack("agent-video",S,l.StreamVideoCreated,["start"]);else if(p.includes(c)){const D=c.split("/")[1];P.includes(c)?e.track("agent-video",{...S,event:D}):e.linkTrack("agent-video",{...S,event:D},c,["done"])}P.includes(c)&&((d=(o=a.callbacks).onError)==null||d.call(o,new Error(`Stream failed with event ${c}`),{data:n})),n.event===l.StreamDone&&s()}}}}function et(e,t,a,r){const s=ae(e,`${t}/agents/${a}`,r);return{createStream(i){return s.post("/streams",{output_resolution:i.output_resolution,compatibility_mode:i.compatibility_mode,stream_warmup:i.stream_warmup,session_timeout:i.session_timeout,fluent:i.fluent})},startConnection(i,c,n){return s.post(`/streams/${i}/sdp`,{session_id:n,answer:c})},addIceCandidate(i,c,n){return s.post(`/streams/${i}/ice`,{session_id:n,...c})},sendStreamRequest(i,c,n){return s.post(`/streams/${i}`,{session_id:c,...n})},close(i,c){return s.delete(`/streams/${i}`,{session_id:c})}}}function tt(e,t,a,r){const s=ae(e,`${t}/agents/${a}`,r);return{createStream(i,c){return s.post("/streams",{driver_url:i.driver_url,face:i.face,config:i.config,output_resolution:i.output_resolution,compatibility_mode:i.compatibility_mode,stream_warmup:i.stream_warmup,session_timeout:i.session_timeout,fluent:i.fluent},c)},startConnection(i,c,n,o){return s.post(`/streams/${i}/sdp`,{session_id:n,answer:c},o)},addIceCandidate(i,c,n,o){return s.post(`/streams/${i}/ice`,{session_id:n,...c},o)},sendStreamRequest(i,c,n,o){return s.post(`/streams/${i}`,{session_id:c,...n},o)},close(i,c,n){return s.delete(`/streams/${i}`,{session_id:c},n)}}}function rt(e,t,a){const r=(t.timestamp-e.timestamp)/1e3;return{duration:r,bytesReceived:t.bytesReceived-e.bytesReceived,bitrate:Math.round((t.bytesReceived-e.bytesReceived)*8/r),packetsReceived:t.packetsReceived-e.packetsReceived,packetsLost:t.packetsLost-e.packetsLost,framesDropped:t.framesDropped-e.framesDropped,framesDecoded:t.framesDecoded-e.framesDecoded,jitter:t.jitter,avgJitterDelayInInterval:(t.jitterBufferDelay-e.jitterBufferDelay)/(t.jitterBufferEmittedCount-e.jitterBufferEmittedCount),jitterBufferEmittedCount:t.jitterBufferEmittedCount-e.jitterBufferEmittedCount,jitterBufferDelay:(t.jitterBufferDelay-e.jitterBufferDelay)/r,framesPerSecond:t.framesPerSecond,freezeCount:t.freezeCount-e.freezeCount,freezeDuration:t.freezeDuration-e.freezeDuration,lowFpsCount:a}}function nt(e){return e.filter(t=>t.freezeCount>0||t.framesPerSecond<21||t.framesDropped>0||t.packetsLost>0).map(t=>{const{timestamp:a,...r}=t,s=[];return t.freezeCount>0&&s.push("freeze"),t.framesPerSecond<21&&s.push("low fps"),t.framesDropped>0&&s.push("frames dropped"),t.packetsLost>0&&s.push("packet loss"),{...r,causes:s}})}function at(e){let t="",a=0;for(const r of e.values())if(r&&r.type==="codec"&&r.mimeType.startsWith("video")&&(t=r.mimeType.split("/")[1]),r&&r.type==="candidate-pair"&&(a=r.currentRoundTripTime),r&&r.type==="inbound-rtp"&&r.kind==="video")return{codec:t,rtt:a,timestamp:r.timestamp,bytesReceived:r.bytesReceived,packetsReceived:r.packetsReceived,packetsLost:r.packetsLost,framesDropped:r.framesDropped,framesDecoded:r.framesDecoded,jitter:r.jitter,jitterBufferDelay:r.jitterBufferDelay,jitterBufferEmittedCount:r.jitterBufferEmittedCount,avgJitterDelayInInterval:r.jitterBufferDelay/r.jitterBufferEmittedCount,frameWidth:r.frameWidth,frameHeight:r.frameHeight,framesPerSecond:r.framesPerSecond,freezeCount:r.freezeCount,freezeDuration:r.totalFreezesDuration};return{}}function it(e,t,a){const r=e.map((o,d)=>d===0?a?{timestamp:o.timestamp,duration:0,rtt:o.rtt,bytesReceived:o.bytesReceived-a.bytesReceived,bitrate:(o.bytesReceived-a.bytesReceived)*8/(t/1e3),packetsReceived:o.packetsReceived-a.packetsReceived,packetsLost:o.packetsLost-a.packetsLost,framesDropped:o.framesDropped-a.framesDropped,framesDecoded:o.framesDecoded-a.framesDecoded,jitter:o.jitter,jitterBufferDelay:o.jitterBufferDelay-a.jitterBufferDelay,jitterBufferEmittedCount:o.jitterBufferEmittedCount-a.jitterBufferEmittedCount,avgJitterDelayInInterval:(o.jitterBufferDelay-a.jitterBufferDelay)/(o.jitterBufferEmittedCount-a.jitterBufferEmittedCount),framesPerSecond:o.framesPerSecond,freezeCount:o.freezeCount-a.freezeCount,freezeDuration:o.freezeDuration-a.freezeDuration}:{timestamp:o.timestamp,rtt:o.rtt,duration:0,bytesReceived:o.bytesReceived,bitrate:o.bytesReceived*8/(t/1e3),packetsReceived:o.packetsReceived,packetsLost:o.packetsLost,framesDropped:o.framesDropped,framesDecoded:o.framesDecoded,jitter:o.jitter,jitterBufferDelay:o.jitterBufferDelay,jitterBufferEmittedCount:o.jitterBufferEmittedCount,avgJitterDelayInInterval:o.jitterBufferDelay/o.jitterBufferEmittedCount,framesPerSecond:o.framesPerSecond,freezeCount:o.freezeCount,freezeDuration:o.freezeDuration}:{timestamp:o.timestamp,duration:t*d/1e3,rtt:o.rtt,bytesReceived:o.bytesReceived-e[d-1].bytesReceived,bitrate:(o.bytesReceived-e[d-1].bytesReceived)*8/(t/1e3),packetsReceived:o.packetsReceived-e[d-1].packetsReceived,packetsLost:o.packetsLost-e[d-1].packetsLost,framesDropped:o.framesDropped-e[d-1].framesDropped,framesDecoded:o.framesDecoded-e[d-1].framesDecoded,jitter:o.jitter,jitterBufferDelay:o.jitterBufferDelay-e[d-1].jitterBufferDelay,jitterBufferEmittedCount:o.jitterBufferEmittedCount-e[d-1].jitterBufferEmittedCount,avgJitterDelayInInterval:(o.jitterBufferDelay-e[d-1].jitterBufferDelay)/(o.jitterBufferEmittedCount-e[d-1].jitterBufferEmittedCount),framesPerSecond:o.framesPerSecond,freezeCount:o.freezeCount-e[d-1].freezeCount,freezeDuration:o.freezeDuration-e[d-1].freezeDuration}),s=nt(r),i=s.reduce((o,d)=>o+(d.causes.includes("low fps")?1:0),0),c=r.filter(o=>!!o.avgJitterDelayInInterval).map(o=>o.avgJitterDelayInInterval),n=r.filter(o=>!!o.rtt).map(o=>o.rtt);return{webRTCStats:{anomalies:s,minRtt:Math.min(...n),avgRtt:Ee(n),maxRtt:Math.max(...n),aggregateReport:rt(e[0],e[e.length-1],i),minJitterDelayInInterval:Math.min(...c),maxJitterDelayInInterval:Math.max(...c),avgJitterDelayInInterval:Ee(c)},codec:e[0].codec,resolution:`${e[0].frameWidth}x${e[0].frameHeight}`}}const oe=100,st=Math.max(Math.ceil(400/oe),1),ot=.25,ct=.28;function dt(){let e=0,t,a,r=0;return s=>{for(const i of s.values())if(i&&i.type==="inbound-rtp"&&i.kind==="video"){const c=i.jitterBufferDelay,n=i.jitterBufferEmittedCount;if(a&&n>a){const l=c-t,p=n-a;r=l/p}t=c,a=n;const o=i.framesDecoded,d=o-e>0;return e=o,{isReceiving:d,avgJitterDelayInInterval:r,freezeCount:i.freezeCount}}return{isReceiving:!1,avgJitterDelayInInterval:r}}}function ut(e,t,a,r,s,i=!1){let c=[],n,o=0,d=!1,l=O.Unknown,p=O.Unknown,P=0,S=0;const D=dt();return setInterval(async()=>{const R=await e.getStats(),{isReceiving:C,avgJitterDelayInInterval:J,freezeCount:B}=D(R),u=at(R);if(C)o=0,P=B-S,p=J<ot?O.Strong:J>ct&&P>1?O.Weak:l,p!==l&&(s==null||s(p),l=p,S+=P,P=0),d||(r==null||r(y.Start),n=c[c.length-1],c=[],d=!0),c.push(u);else if(d&&(o++,o>=st)){const g=it(c,oe,n);r==null||r(y.Stop,g),t()||a(),S=B,d=!1}},oe)}let je=!1;const F=(e,t)=>je&&console.log(e,t),lt=(window.RTCPeerConnection||window.webkitRTCPeerConnection||window.mozRTCPeerConnection).bind(window);function be(e){switch(e){case"connected":return M.Connected;case"checking":return M.Connecting;case"failed":return M.Fail;case"new":return M.New;case"closed":return M.Closed;case"disconnected":return M.Disconnected;case"completed":return M.Completed;default:return M.New}}function ft(e){const[t,a=""]=e.split(/:(.+)/);try{const r=JSON.parse(a);return F("parsed data channel message",{subject:t,data:r}),{subject:t,data:r}}catch(r){return F("Failed to parse data channel message, returning data as string",{subject:t,rawData:a,error:r}),{subject:t,data:a}}}function mt({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,report:r}){e===y.Start&&t===y.Start?a==null||a(y.Start):e===y.Stop&&t===y.Stop&&(a==null||a(y.Stop,r))}function gt({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:r,report:s}){e===y.Start?a==null||a(y.Start):e===y.Stop&&(a==null||a(y.Stop,s)),t===y.Start?r==null||r(Y.Talking):t===y.Stop&&(r==null||r(Y.Idle))}function Ae({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:r,streamType:s,report:i}){s===H.Legacy?mt({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,report:i}):s===H.Fluent&&gt({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:r,report:i})}async function ht(e,t,{debug:a=!1,callbacks:r,auth:s,baseURL:i=G,analytics:c}){var x;je=a;let n=!1,o=!1,d=y.Stop,l=y.Stop;const{startConnection:p,sendStreamRequest:P,close:S,createStream:D,addIceCandidate:R}=t.videoType===te.Clip?et(s,i,e,r.onError):tt(s,i,e,r.onError),{id:C,offer:J,ice_servers:B,session_id:u,fluent:g,interrupt_enabled:k}=await D(t);(x=r.onStreamCreated)==null||x.call(r,{stream_id:C,session_id:u,agent_id:e});const h=new lt({iceServers:B}),E=h.createDataChannel("JanusDataChannel");if(!u)throw new Error("Could not create session_id");const v=g?H.Fluent:H.Legacy;c.enrich({"stream-type":v});const j=t.stream_warmup&&!g,L=()=>n,W=()=>{var f;n=!0,o&&((f=r.onConnectionStateChange)==null||f.call(r,M.Connected))},_=ut(h,L,W,(f,w)=>Ae({statsSignal:l=f,dataChannelSignal:v===H.Legacy?d:void 0,onVideoStateChange:r.onVideoStateChange,onAgentActivityStateChange:r.onAgentActivityStateChange,report:w,streamType:v}),f=>{var w;return(w=r.onConnectivityStateChange)==null?void 0:w.call(r,f)},j);h.onicecandidate=f=>{var w;F("peerConnection.onicecandidate",f);try{f.candidate&&f.candidate.sdpMid&&f.candidate.sdpMLineIndex!==null?R(C,{candidate:f.candidate.candidate,sdpMid:f.candidate.sdpMid,sdpMLineIndex:f.candidate.sdpMLineIndex},u):R(C,{candidate:null},u)}catch($){(w=r.onError)==null||w.call(r,$,{streamId:C})}},E.onopen=()=>{o=!0,(!j||n)&&W()};function I(f){d=f===z.StreamStarted?y.Start:y.Stop,Ae({statsSignal:v===H.Legacy?l:void 0,dataChannelSignal:d,onVideoStateChange:r.onVideoStateChange,onAgentActivityStateChange:r.onAgentActivityStateChange,streamType:v})}function T(f,w){const $=typeof w=="string"?w:w==null?void 0:w.metadata;$&&c.enrich({streamMetadata:$}),c.track("agent-chat",{event:"ready"})}const U={[z.StreamStarted]:I,[z.StreamDone]:I,[z.StreamReady]:T};E.onmessage=f=>{var Z;const{subject:w,data:$}=ft(f.data);(Z=U[w])==null||Z.call(U,w,$)},h.oniceconnectionstatechange=()=>{var w;F("peerConnection.oniceconnectionstatechange => "+h.iceConnectionState);const f=be(h.iceConnectionState);f!==M.Connected&&((w=r.onConnectionStateChange)==null||w.call(r,f))},h.ontrack=f=>{var w;F("peerConnection.ontrack",f),(w=r.onSrcObjectReady)==null||w.call(r,f.streams[0])},await h.setRemoteDescription(J),F("set remote description OK");const K=await h.createAnswer();return F("create answer OK"),await h.setLocalDescription(K),F("set local description OK"),await p(C,K,u),F("start connection OK"),{speak(f){return P(C,u,f)},async disconnect(){var f;if(C){const w=be(h.iceConnectionState);if(h){if(w===M.New){clearInterval(_);return}h.close(),h.oniceconnectionstatechange=null,h.onnegotiationneeded=null,h.onicecandidate=null,h.ontrack=null}try{w===M.Connected&&await S(C,u).catch($=>{})}catch($){F("Error on close stream connection",$)}(f=r.onAgentActivityStateChange)==null||f.call(r,Y.Idle),clearInterval(_)}},sendDataChannelMessage(f){var w,$;if(!n||E.readyState!=="open"){F("Data channel is not ready for sending messages"),(w=r.onError)==null||w.call(r,new Error("Data channel is not ready for sending messages"),{streamId:C});return}try{E.send(f)}catch(Z){F("Error sending data channel message",Z),($=r.onError)==null||$.call(r,Z,{streamId:C})}},sessionId:u,streamId:C,streamType:v,interruptAvailable:k}}function wt(e,t){const{streamOptions:a}=t??{};return{videoType:pe(e.presenter.type),output_resolution:a==null?void 0:a.outputResolution,session_timeout:a==null?void 0:a.sessionTimeout,stream_warmup:a==null?void 0:a.streamWarmup,compatibility_mode:a==null?void 0:a.compatibilityMode,fluent:a==null?void 0:a.fluent}}function pt(e,t,a,r,s){s===H.Fluent?yt(e,t,a,r,s):kt(e,t,a,r,s)}function yt(e,t,a,r,s){e===y.Start?r.track("stream-session",{event:"start","stream-type":s}):e===y.Stop&&r.track("stream-session",{event:"stop",is_greenscreen:t.presenter.type==="clip"&&t.presenter.is_greenscreen,background:t.presenter.type==="clip"&&t.presenter.background,"stream-type":s,...a})}function vt(e,t,a,r){N.get()<=0||(e===y.Start?a.linkTrack("agent-video",{event:"start",latency:N.get(!0),"stream-type":r},"start",[z.StreamVideoCreated]):e===y.Stop&&a.linkTrack("agent-video",{event:"stop",is_greenscreen:t.presenter.type==="clip"&&t.presenter.is_greenscreen,background:t.presenter.type==="clip"&&t.presenter.background,"stream-type":r},"done",[z.StreamVideoDone]))}function kt(e,t,a,r,s){N.get()<=0||(e===y.Start?r.linkTrack("agent-video",{event:"start",latency:N.get(!0),"stream-type":s},"start",[z.StreamVideoCreated]):e===y.Stop&&r.linkTrack("agent-video",{event:"stop",is_greenscreen:t.presenter.type==="clip"&&t.presenter.is_greenscreen,background:t.presenter.type==="clip"&&t.presenter.background,"stream-type":s,...a},"done",[z.StreamVideoDone]))}function Ct(e,t,a){return N.reset(),new Promise(async(r,s)=>{try{const i=await ht(e.id,wt(e,t),{...t,analytics:a,callbacks:{...t.callbacks,onConnectionStateChange:c=>{var n,o;(o=(n=t.callbacks).onConnectionStateChange)==null||o.call(n,c),c===M.Connected&&r(i)},onVideoStateChange:(c,n)=>{var o,d;(d=(o=t.callbacks).onVideoStateChange)==null||d.call(o,c),pt(c,e,n,a,i.streamType)},onAgentActivityStateChange:c=>{var n,o;(o=(n=t.callbacks).onAgentActivityStateChange)==null||o.call(n,c),c===Y.Talking?se.update():se.reset(),vt(c===Y.Talking?y.Start:y.Stop,e,a,i.streamType)}}})}catch(i){s(i)}})}async function Dt(e,t,a,r,s){var o,d,l,p;const{chat:i,chatMode:c}=await Me(e,a,r,t.mode,t.persistentChat,s);if(c&&c!==t.mode&&(t.mode=c,(d=(o=t.callbacks).onModeChange)==null||d.call(o,c),c===A.TextOnly))return(p=(l=t.callbacks).onError)==null||p.call(l,new ce(c)),{chat:i};const n=await Ct(e,t,r);return{chat:i,streamingManager:n}}async function Rt(e,t){var C,J,B;let a=!0,r=!1;const s=t.mixpanelKey||Le,i=t.wsURL||Be,c=t.baseURL||G,n={messages:[],chatMode:t.mode||A.Functional},o=Re(t.auth,c,t.callbacks.onError),d=await o.getById(e),l=xe({token:s,agent:d,isEnabled:t.enableAnalitics,distinctId:t.distinctId}),{onMessage:p,clearQueue:P}=Ze(l,n,t,d,()=>{var u;return(u=n.socketManager)==null?void 0:u.disconnect()});n.messages=qe(t.initialMessages),(J=(C=t.callbacks).onNewMessage)==null||J.call(C,[...n.messages],"answer"),l.track("agent-sdk",{event:"loaded",...We(d)});async function S(u){var j,L,W,_,I,T,U;(L=(j=t.callbacks).onConnectionStateChange)==null||L.call(j,M.Connecting),N.reset(),r=!1,u&&!a&&(delete n.chat,(_=(W=t.callbacks).onNewMessage)==null||_.call(W,[...n.messages],"answer"));const g=re(t.mode)?Promise.resolve(void 0):Oe(t.auth,i,{onMessage:p,onError:t.callbacks.onError}),k=ne(()=>Dt(d,t,o,l,n.chat),{limit:3,timeout:Pe,timeoutErrorMessage:"Timeout initializing the stream",shouldRetryFn:K=>(K==null?void 0:K.message)!=="Could not connect"&&K.status!==429,delayMs:1e3}).catch(K=>{var x,f;throw R(A.Maintenance),(f=(x=t.callbacks).onConnectionStateChange)==null||f.call(x,M.Fail),K}),[h,{streamingManager:E,chat:v}]=await Promise.all([g,k]);v&&v.id!==((I=n.chat)==null?void 0:I.id)&&((U=(T=t.callbacks).onNewChat)==null||U.call(T,v.id)),n.streamingManager=E,n.socketManager=h,n.chat=v,a=!1,R((v==null?void 0:v.chat_mode)??t.mode??A.Functional)}async function D(){var u,g,k,h;(u=n.socketManager)==null||u.disconnect(),await((g=n.streamingManager)==null?void 0:g.disconnect()),r=!1,delete n.streamingManager,delete n.socketManager,(h=(k=t.callbacks).onConnectionStateChange)==null||h.call(k,M.Disconnected)}async function R(u){var g,k;u!==n.chatMode&&(l.track("agent-mode-change",{mode:u}),n.chatMode=u,n.chatMode!==A.Functional&&await D(),(k=(g=t.callbacks).onModeChange)==null||k.call(g,u))}return{agent:d,getStreamType:()=>{var u;return(u=n.streamingManager)==null?void 0:u.streamType},getIsInterruptAvailable:()=>{var u;return((u=n.streamingManager)==null?void 0:u.interruptAvailable)??!1},starterMessages:((B=d.knowledge)==null?void 0:B.starter_message)||[],getSTTToken:()=>o.getSTTToken(d.id),changeMode:R,enrichAnalytics:l.enrich,async connect(){var u;await S(!0),l.track("agent-chat",{event:"connect",chatId:(u=n.chat)==null?void 0:u.id,agentId:d.id,mode:n.chatMode})},async reconnect(){var u;await D(),await S(!1),l.track("agent-chat",{event:"reconnect",chatId:(u=n.chat)==null?void 0:u.id,agentId:d.id,mode:n.chatMode})},async disconnect(){var u;await D(),l.track("agent-chat",{event:"disconnect",chatId:(u=n.chat)==null?void 0:u.id,agentId:d.id,mode:n.chatMode})},async chat(u){var E,v,j,L,W;const g=()=>{if(re(t.mode))throw new V(`${t.mode} is enabled, chat is disabled`);if(u.length>=800)throw new V("Message cannot be more than 800 characters");if(u.length===0)throw new V("Message cannot be empty");if(n.chatMode===A.Maintenance)throw new V("Chat is in maintenance mode");if(![A.TextOnly,A.Playground].includes(n.chatMode)){if(!n.streamingManager)throw new V("Streaming manager is not initialized");if(!n.chat)throw new V("Chat is not initialized")}},k=async()=>{var _,I;if(!n.chat){const T=await Me(d,o,l,n.chatMode,t.persistentChat);if(!T.chat)throw new q(n.chatMode,!!t.persistentChat);n.chat=T.chat,(I=(_=t.callbacks).onNewChat)==null||I.call(_,n.chat.id)}return n.chat.id},h=async(_,I)=>ne(()=>{var T,U;return o.chat(d.id,I,{chatMode:n.chatMode,streamId:(T=n.streamingManager)==null?void 0:T.streamId,sessionId:(U=n.streamingManager)==null?void 0:U.sessionId,messages:_.map(({matches:K,...x})=>x)},{...Ie(n.chatMode),skipErrorHandler:!0})},{limit:2,shouldRetryFn:T=>{var x,f,w,$;const U=(x=T==null?void 0:T.message)==null?void 0:x.includes("missing or invalid session_id");return!((f=T==null?void 0:T.message)==null?void 0:f.includes("Stream Error"))&&!U?(($=(w=t.callbacks).onError)==null||$.call(w,T),!1):!0},onRetry:async()=>{await D(),await S(!1)}});try{P(),g(),n.messages.push({id:Q(),role:"user",content:u,created_at:new Date(N.update()).toISOString()}),(v=(E=t.callbacks).onNewMessage)==null||v.call(E,[...n.messages],"user");const _=await k(),I=await h([...n.messages],_);return n.messages.push({id:Q(),role:"assistant",content:I.result||"",created_at:new Date().toISOString(),context:I.context,matches:I.matches,videoId:I.videoId}),r&&I.videoId&&n.streamingManager&&(r=!1,n.messages[n.messages.length-1].interrupted=!0,await Te(n.streamingManager,I.videoId)),l.track("agent-message-send",{event:"success",mode:n.chatMode,messages:n.messages.length+1}),I.result&&((L=(j=t.callbacks).onNewMessage)==null||L.call(j,[...n.messages],"answer"),l.track("agent-message-received",{latency:N.get(!0),mode:n.chatMode,messages:n.messages.length})),I}catch(_){throw r=!1,((W=n.messages[n.messages.length-1])==null?void 0:W.role)==="assistant"&&n.messages.pop(),l.track("agent-message-send",{event:"error",mode:n.chatMode,messages:n.messages.length}),_}},rate(u,g,k){var v,j,L,W;const h=n.messages.find(_=>_.id===u);if(n.chat){if(!h)throw new Error("Message not found")}else throw new Error("Chat is not initialized");const E=((v=h.matches)==null?void 0:v.map(_=>[_.document_id,_.id]))??[];return l.track("agent-rate",{event:k?"update":"create",thumb:g===1?"up":"down",knowledge_id:((j=d.knowledge)==null?void 0:j.id)??"",mode:n.chatMode,matches:E,score:g}),k?o.updateRating(d.id,n.chat.id,k,{knowledge_id:((L=d.knowledge)==null?void 0:L.id)??"",message_id:u,matches:E,score:g}):o.createRating(d.id,n.chat.id,{knowledge_id:((W=d.knowledge)==null?void 0:W.id)??"",message_id:u,matches:E,score:g})},deleteRate(u){var g;if(!n.chat)throw new Error("Chat is not initialized");return l.track("agent-rate-delete",{type:"text",chat_id:(g=n.chat)==null?void 0:g.id,id:u,mode:n.chatMode}),o.deleteRating(d.id,n.chat.id,u)},async speak(u){var E,v,j;function g(){if(typeof u=="string"){if(!d.presenter.voice)throw new Error("Presenter voice is not initialized");return{type:"text",provider:d.presenter.voice,input:u,ssml:!1}}if(u.type==="text"&&!u.provider){if(!d.presenter.voice)throw new Error("Presenter voice is not initialized");return{type:"text",provider:d.presenter.voice,input:u.input,ssml:u.ssml}}return u}const k=g();if(l.track("agent-speak",k),N.update(),n.messages&&k.type==="text"&&(n.messages.push({id:Q(),role:"assistant",content:k.input,created_at:new Date(N.get(!0)).toISOString()}),(v=(E=t.callbacks).onNewMessage)==null||v.call(E,[...n.messages],"answer")),ze(n.chatMode))return{duration:0,status:"success"};if(!n.streamingManager)throw new Error("Please connect to the agent first");return n.streamingManager.speak({script:k,metadata:{chat_id:(j=n.chat)==null?void 0:j.id,agent_id:d.id}})},async interrupt({type:u}){var h,E,v,j,L;const g=n.messages[n.messages.length-1],k=(g==null?void 0:g.role)==="user";if(Ve(n.streamingManager,n.chat,(h=n.streamingManager)==null?void 0:h.streamType,k,!!(g!=null&&g.videoId)),l.track("agent-video-interrupt",{type:u||"click",stream_id:(E=n.streamingManager)==null?void 0:E.streamId,agent_id:d.id,owner_id:d.owner_id,video_duration_to_interrupt:se.get(!0),message_duration_to_interrupt:N.get(!0),chat_id:(v=n.chat)==null?void 0:v.id,mode:n.chatMode,queued_interrupt:k}),k){r=!0;return}g.interrupted=!0,(L=(j=t.callbacks).onNewMessage)==null||L.call(j,[...n.messages],"answer"),Te(n.streamingManager,g.videoId)}}}function St(e,t,a){const{getById:r}=Re(t,a||G);return r(e)}m.AgentActivityState=Y,m.AgentStatus=fe,m.ChatCreationFailed=q,m.ChatMode=A,m.ChatModeDowngraded=ce,m.ChatProgress=X,m.ConnectionState=M,m.ConnectivityState=O,m.DocumentType=we,m.KnowledgeType=he,m.PlanGroup=le,m.Providers=ye,m.RateState=me,m.StreamEvents=z,m.StreamType=H,m.StreamingState=y,m.Subject=ge,m.UserPlan=ue,m.ValidationError=V,m.VideoType=te,m.VoiceAccess=ve,m.WsError=de,m.createAgentManager=Rt,m.getAgent=St,m.mapVideoType=pe,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"})});
@@ -1,7 +1,7 @@
1
1
  import { StreamingManager } from '../streaming-manager';
2
2
  import { Agent, AgentManagerOptions, AgentsAPI, Chat, CreateStreamOptions } from '../../types';
3
3
  import { Analytics } from '../analytics/mixpanel';
4
- export declare function initializeStreamAndChat(agent: Agent, options: AgentManagerOptions, agentsApi: AgentsAPI, analytics: Analytics, chat?: Chat, greeting?: string): Promise<{
4
+ export declare function initializeStreamAndChat(agent: Agent, options: AgentManagerOptions, agentsApi: AgentsAPI, analytics: Analytics, chat?: Chat): Promise<{
5
5
  chat?: Chat;
6
6
  streamingManager?: StreamingManager<CreateStreamOptions>;
7
7
  }>;
@@ -1,4 +1,9 @@
1
- export declare const timestampTracker: {
1
+ export declare const latencyTimestampTracker: {
2
+ reset: () => number;
3
+ update: () => number;
4
+ get: (delta?: boolean) => number;
5
+ };
6
+ export declare const interruptTimestampTracker: {
2
7
  reset: () => number;
3
8
  update: () => number;
4
9
  get: (delta?: boolean) => number;
@@ -1,4 +1,5 @@
1
- import { Agent, AgentsAPI, Chat, ChatMode } from '../../types';
1
+ import type { Agent, AgentsAPI, Chat } from '../../types';
2
+ import { ChatMode } from '../../types';
2
3
  import { Analytics } from '../analytics/mixpanel';
3
4
  export declare function getRequestHeaders(chatMode?: ChatMode): Record<string, Record<string, string>>;
4
5
  export declare function createChat(agent: Agent, agentsApi: AgentsAPI, analytics: Analytics, chatMode?: ChatMode, persist?: boolean, chat?: Chat): Promise<{
@@ -1,3 +1,2 @@
1
- import { Agent, Message } from '../../types';
2
- export declare function getGreetings(agent: Agent): string;
3
- export declare function getInitialMessages(content: string, initialMessages?: Message[]): Message[];
1
+ import { Message } from '../../types';
2
+ export declare function getInitialMessages(initialMessages?: Message[]): Message[];
@@ -0,0 +1,4 @@
1
+ import { Chat, CreateStreamOptions, StreamType } from '../../types';
2
+ import { StreamingManager } from '../streaming-manager';
3
+ export declare function validateInterrupt(streamingManager: StreamingManager<CreateStreamOptions> | undefined, chat: Chat | undefined, streamType: StreamType | undefined, hasChatPending: boolean, hasVideoId: boolean): void;
4
+ export declare function sendInterrupt(streamingManager: StreamingManager<CreateStreamOptions>, videoId: string): Promise<void>;
@@ -1,5 +1,5 @@
1
1
  import { CreateStreamOptions, PayloadType, StreamType, StreamingManagerOptions } from '../../types/index';
2
- export declare function createStreamingManager<T extends CreateStreamOptions>(agentId: string, agent: T, { debug, callbacks, auth, baseURL }: StreamingManagerOptions): Promise<{
2
+ export declare function createStreamingManager<T extends CreateStreamOptions>(agentId: string, agent: T, { debug, callbacks, auth, baseURL, analytics }: StreamingManagerOptions): Promise<{
3
3
  /**
4
4
  * Method to send request to server to get clip or talk depend on you payload
5
5
  * @param payload
@@ -9,6 +9,10 @@ export declare function createStreamingManager<T extends CreateStreamOptions>(ag
9
9
  * Method to close RTC connection
10
10
  */
11
11
  disconnect(): Promise<void>;
12
+ /**
13
+ * Method to send data channel messages to the server
14
+ */
15
+ sendDataChannelMessage(payload: string): void;
12
16
  /**
13
17
  * Session identifier information, should be returned in the body of all streaming requests
14
18
  */
@@ -18,5 +22,6 @@ export declare function createStreamingManager<T extends CreateStreamOptions>(ag
18
22
  */
19
23
  streamId: string;
20
24
  streamType: StreamType;
25
+ interruptAvailable: boolean | undefined;
21
26
  }>;
22
27
  export type StreamingManager<T extends CreateStreamOptions> = Awaited<ReturnType<typeof createStreamingManager<T>>>;
@@ -1,4 +1,4 @@
1
1
  /// <reference types="node" />
2
- import { StreamingState, ConnectivityState } from '../../../types';
2
+ import { ConnectivityState, StreamingState } from '../../../types';
3
3
  import { VideoRTCStatsReport } from './report';
4
- export declare function pollStats(peerConnection: RTCPeerConnection, getIsConnected: () => boolean, onConnected: () => void, onVideoStateChange?: (state: StreamingState, statsReport?: VideoRTCStatsReport) => void, onConnectivityStateChange?: (state: ConnectivityState) => void, warmup?: boolean, shouldWaitForGreeting?: boolean): NodeJS.Timeout;
4
+ export declare function pollStats(peerConnection: RTCPeerConnection, getIsConnected: () => boolean, onConnected: () => void, onVideoStateChange?: (state: StreamingState, statsReport?: VideoRTCStatsReport) => void, onConnectivityStateChange?: (state: ConnectivityState) => void, warmup?: boolean): NodeJS.Timeout;
@@ -3,6 +3,9 @@ export interface VideoRTCStatsReport {
3
3
  webRTCStats: {
4
4
  anomalies: AnalyticsRTCStatsReport[];
5
5
  aggregateReport: AnalyticsRTCStatsReport;
6
+ minRtt: number;
7
+ maxRtt: number;
8
+ avgRtt: number;
6
9
  minJitterDelayInInterval: number;
7
10
  maxJitterDelayInInterval: number;
8
11
  avgJitterDelayInInterval: number;
@@ -25,6 +25,8 @@ export interface Message {
25
25
  created_at?: string;
26
26
  matches?: ChatResponse['matches'];
27
27
  context?: string;
28
+ videoId?: string;
29
+ interrupted?: boolean;
28
30
  }
29
31
  export interface ChatPayload {
30
32
  messages: Message[];
@@ -45,7 +47,8 @@ export declare enum ChatMode {
45
47
  TextOnly = "TextOnly",
46
48
  Maintenance = "Maintenance",
47
49
  Playground = "Playground",
48
- DirectPlayback = "DirectPlayback"
50
+ DirectPlayback = "DirectPlayback",
51
+ Off = "Off"
49
52
  }
50
53
  export interface ChatResponse {
51
54
  result?: string;
@@ -53,6 +56,7 @@ export interface ChatResponse {
53
56
  matches?: IRetrivalMetadata[];
54
57
  chatMode?: ChatMode;
55
58
  context?: string;
59
+ videoId?: string;
56
60
  }
57
61
  export interface Chat {
58
62
  id: string;
@@ -65,3 +69,6 @@ export interface Chat {
65
69
  agent_id__modified_at: string;
66
70
  chat_mode?: ChatMode;
67
71
  }
72
+ export interface Interrupt {
73
+ type: 'text' | 'audio' | 'click';
74
+ }
@@ -2,8 +2,9 @@ import { STTTokenResponse } from '../..';
2
2
  import { Auth } from '../../auth';
3
3
  import { AgentActivityState, CompatibilityMode, ConnectionState, ConnectivityState, SendStreamPayloadResponse, StreamEvents, StreamType, StreamingState } from '../../stream';
4
4
  import { SupportedStreamScript } from '../../stream-script';
5
+ import type { ManagerCallbacks as StreamManagerCallbacks } from '../../stream/stream';
5
6
  import { Agent } from './agent';
6
- import { ChatMode, ChatResponse, Message, RatingEntity } from './chat';
7
+ import { ChatMode, ChatResponse, Interrupt, Message, RatingEntity } from './chat';
7
8
  /**
8
9
  * Types of events provided in Chat Progress Callback
9
10
  */
@@ -81,6 +82,11 @@ interface ManagerCallbacks {
81
82
  * @param state - AgentActivityState
82
83
  */
83
84
  onAgentActivityStateChange?(state: AgentActivityState): void;
85
+ /**
86
+ * Optional callback function that will be triggered each time a new stream is created
87
+ * @param stream - object containing stream_id, session_id and agent_id
88
+ */
89
+ onStreamCreated?: StreamManagerCallbacks['onStreamCreated'];
84
90
  }
85
91
  interface StreamOptions {
86
92
  /**
@@ -112,10 +118,10 @@ interface StreamOptions {
112
118
  */
113
119
  outputResolution?: number;
114
120
  /**
115
- * Whether to stream greeting video on the connection.
116
- * Not supported for premium presenters.
121
+ * Whether to request fluent stream.
122
+ * @default false
117
123
  */
118
- streamGreeting?: boolean;
124
+ fluent?: boolean;
119
125
  }
120
126
  export interface AgentManagerOptions {
121
127
  auth: Auth;
@@ -144,6 +150,10 @@ export interface AgentManager {
144
150
  * Get the current stream type of the agent
145
151
  */
146
152
  getStreamType: () => StreamType | undefined;
153
+ /**
154
+ * Get if the stream supports interrupt
155
+ */
156
+ getIsInterruptAvailable: () => boolean;
147
157
  /**
148
158
  * Array of starter messages that will be sent to the agent when the chat starts
149
159
  */
@@ -197,5 +207,10 @@ export interface AgentManager {
197
207
  * @param properties flat json object with properties that will be added to analytics events fired from the sdk
198
208
  */
199
209
  enrichAnalytics: (properties: Record<string, any>) => void;
210
+ /**
211
+ * Method to interrupt the current video stream
212
+ * Only available for Fluent streams and when there's an active video to interrupt
213
+ */
214
+ interrupt: (interrupt: Interrupt) => void;
200
215
  }
201
216
  export {};
@@ -1,6 +1,6 @@
1
- export * from './stream-script';
2
1
  export * from './auth';
3
2
  export * from './entities';
4
3
  export * from './stream';
4
+ export * from './stream-script';
5
5
  export * from './voice/stt';
6
6
  export * from './voice/tts';
@@ -34,6 +34,7 @@ export interface ICreateStreamRequestResponse extends StickyRequest {
34
34
  offer: any;
35
35
  ice_servers: IceServer[];
36
36
  fluent?: boolean;
37
+ interrupt_enabled?: boolean;
37
38
  }
38
39
  export interface IceCandidate {
39
40
  /**
@@ -18,7 +18,6 @@ export declare enum AgentActivityState {
18
18
  Idle = "IDLE",
19
19
  Talking = "TALKING"
20
20
  }
21
- export declare const DataChannelSignalMap: Record<string, StreamingState>;
22
21
  export declare enum StreamEvents {
23
22
  ChatAnswer = "chat/answer",
24
23
  ChatPartial = "chat/partial",
@@ -27,6 +26,7 @@ export declare enum StreamEvents {
27
26
  StreamFailed = "stream/error",
28
27
  StreamReady = "stream/ready",
29
28
  StreamCreated = "stream/created",
29
+ StreamInterrupt = "stream/interrupt",
30
30
  StreamVideoCreated = "stream-video/started",
31
31
  StreamVideoDone = "stream-video/done",
32
32
  StreamVideoError = "stream-video/error",
@@ -53,15 +53,20 @@ export interface ManagerCallbacks {
53
53
  onError?: (error: Error, errorData: object) => void;
54
54
  onConnectivityStateChange?: (state: ConnectivityState) => void;
55
55
  onAgentActivityStateChange?: (state: AgentActivityState) => void;
56
+ onStreamCreated?: (stream: {
57
+ stream_id: string;
58
+ session_id: string;
59
+ agent_id: string;
60
+ }) => void;
56
61
  }
57
62
  export type ManagerCallbackKeys = keyof ManagerCallbacks;
58
63
  export interface TalkStreamOptions extends CreateTalkStreamRequest {
59
64
  videoType: VideoType.Talk;
60
- stream_greeting?: string;
65
+ fluent?: boolean;
61
66
  }
62
67
  export interface ClipStreamOptions extends CreateClipStreamRequest {
63
68
  videoType: VideoType.Clip;
64
- stream_greeting?: string;
69
+ fluent?: boolean;
65
70
  }
66
71
  export type CreateStreamOptions = TalkStreamOptions | ClipStreamOptions;
67
72
  export type PayloadType<T> = T extends TalkStreamOptions ? SendTalkStreamPayload : T extends ClipStreamOptions ? SendClipStreamPayload : never;
@@ -82,6 +87,7 @@ export interface StreamingManagerOptions {
82
87
  export interface SlimRTCStatsReport {
83
88
  index: number;
84
89
  codec: string;
90
+ rtt: number;
85
91
  duration?: number;
86
92
  bitrate?: number;
87
93
  timestamp: any;
@@ -119,3 +125,8 @@ export interface AnalyticsRTCStatsReport {
119
125
  lowFpsCount?: number;
120
126
  causes?: string[];
121
127
  }
128
+ export interface StreamInterruptPayload {
129
+ type: StreamEvents.StreamInterrupt;
130
+ videoId: string;
131
+ timestamp: number;
132
+ }
@@ -0,0 +1,3 @@
1
+ import { ChatMode } from '../types';
2
+ export declare const isTextualChat: (chatMode: ChatMode) => boolean;
3
+ export declare const isChatModeWithoutChat: (chatMode: ChatMode | undefined) => boolean | undefined;
@@ -1,2 +1,2 @@
1
1
  export declare const sleep: (ms: number) => Promise<unknown>;
2
- export declare const getRandom: () => string;
2
+ export declare const getRandom: (length?: number) => string;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@d-id/client-sdk",
3
3
  "private": false,
4
- "version": "1.1.0-beta.4",
4
+ "version": "1.1.0-beta.50",
5
5
  "type": "module",
6
6
  "description": "d-id client sdk",
7
7
  "repository": {
@@ -34,7 +34,7 @@
34
34
  "devDependencies": {
35
35
  "@preact/preset-vite": "^2.8.1",
36
36
  "@trivago/prettier-plugin-sort-imports": "^4.3.0",
37
- "@types/node": "^20.11.24",
37
+ "@types/node": "^22.15.0",
38
38
  "commander": "^11.1.0",
39
39
  "glob": "^10.3.10",
40
40
  "preact": "^10.19.6",
@@ -45,4 +45,4 @@
45
45
  "vite": "^5.1.4",
46
46
  "vite-plugin-dts": "^3.7.3"
47
47
  }
48
- }
48
+ }