@opencx/widget-core 5.0.0-beta.7 → 5.0.0-beta.9
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.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/src/api/api-caller.d.ts +29 -1
- package/dist/src/api/api-caller.d.ts.map +1 -1
- package/dist/src/api/schema.d.ts +59 -0
- package/dist/src/api/schema.d.ts.map +1 -1
- package/dist/src/context/session.ctx.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("zod"),ue=require("openapi-fetch"),me=require("lodash.isequal"),K=require("uuid"),he=n=>n.type==="data-keepalive",ge=n=>n.type==="data-turn-steered",U=h.z.object({const:h.z.string(),title:h.z.string().optional()}),ke=h.z.object({type:h.z.enum(["string","number","integer","boolean","array"]),title:h.z.string().optional(),description:h.z.string().optional(),default:h.z.union([h.z.string(),h.z.number(),h.z.boolean(),h.z.array(h.z.string())]).optional(),enum:h.z.array(h.z.string()).optional(),oneOf:h.z.array(U).optional(),items:h.z.object({enum:h.z.array(h.z.string()).optional(),anyOf:h.z.array(U).optional()}).optional(),minItems:h.z.number().int().nonnegative().optional(),maxItems:h.z.number().int().nonnegative().optional(),minimum:h.z.number().optional(),maximum:h.z.number().optional(),minLength:h.z.number().optional(),maxLength:h.z.number().optional(),format:h.z.string().optional()}),be=h.z.array(h.z.object({id:h.z.string(),serverId:h.z.string(),serverName:h.z.string(),expiresAt:h.z.number(),approvalKey:h.z.string().optional(),form:h.z.object({message:h.z.string(),requestedSchema:h.z.object({properties:h.z.record(h.z.string(),ke),required:h.z.array(h.z.string()).optional()})})})),ve=h.z.array(h.z.object({key:h.z.string(),serverId:h.z.string(),serverName:h.z.string(),message:h.z.string(),toolName:h.z.string()})),B="[opencx]",k={warn:(n,...e)=>{console.warn(`${B} ${n}`,...e)},error:(n,...e)=>{console.error(`${B} ${n}`,...e)}},fe=n=>{k.error("request failed",n.error)},ye=n=>{const e=ue({baseUrl:n.baseUrl}),t={onRequest:n.onRequest,onResponse:n.onResponse,onError:n.onError||fe};return e.use(t),e};class G extends Error{constructor(){super("This connection request expired. Preparing a new request."),this.name="ConnectionRequestExpiredError"}}class $ extends Error{constructor(){super("This connection attempt is no longer available."),this.name="ConnectionAttemptUnavailableError"}}const we="/backend/widget/v5/chat/stream",je="/backend/widget/v5/chat/{sessionId}/stream",V=(n,e,t)=>`${n.replace(/\/$/,"")}${t?e.replace("{sessionId}",encodeURIComponent(t)):e}`;class H{constructor({config:e}){var r,l;this.userToken=null,this.constructClientOptions=s=>{const a=this.config.apiUrl||"https://api.open.cx",i={"X-Bot-Token":this.config.token,"Content-Type":"application/json",Accept:"application/json",Authorization:s?`Bearer ${s}`:void 0};return{baseUrl:a,headers:i}},this.createOpenAPIClient=({baseUrl:s,headers:a})=>ye({baseUrl:s,onRequest:({request:i})=>{Object.entries(a).forEach(([c,d])=>{d&&i.headers.set(c,d)})}}),this.listApprovalPreferences=async()=>{const{baseUrl:s,headers:a}=this.getStreamAuthContext(),i=await fetch(`${s}/backend/widget/v5/connections/approval-preferences`,{headers:a});if(!i.ok)throw new Error("Could not load permissions.");return ve.parse(await i.json())},this.revokeApprovalPreference=async(s,a)=>{const{baseUrl:i,headers:c}=this.getStreamAuthContext();if(!(await fetch(`${i}/backend/widget/v5/connections/${encodeURIComponent(s)}/approval-preferences/${encodeURIComponent(a)}`,{method:"DELETE",headers:c})).ok)throw new Error("Could not reset permission.")},this.listElicitations=async(s,a)=>{const{baseUrl:i,headers:c}=this.getStreamAuthContext(),d=await fetch(`${i}/backend/widget/v5/connections/elicitation/${encodeURIComponent(s)}`,{headers:c,signal:a});if(!d.ok)throw new Error("Could not load the request.");return be.parse(await d.json())},this.answerElicitation=async(s,a,i)=>{const{baseUrl:c,headers:d}=this.getStreamAuthContext(),_=await fetch(`${c}/backend/widget/v5/connections/elicitation/${encodeURIComponent(s)}/${encodeURIComponent(a)}`,{method:"POST",headers:{...d,"Content-Type":"application/json"},body:JSON.stringify(i)});if(!_.ok)throw new Error(_.status===400?"Check your answers and try again.":"This request has ended. Ask the agent to try again.")},this.listConnections=async s=>{const{data:a,error:i}=await this.client.GET("/backend/widget/v5/connections",{signal:s});if(i||!a)throw new Error("Could not load connections. Sign in and try again.");return a},this.startConnection=async(s,a,i)=>{const{data:c,error:d,response:_}=await this.client.POST("/backend/widget/v5/connections/{serverId}/start",{params:{path:{serverId:s}},body:{request_id:a},signal:i});if(_.status===410)throw new G;if(_.status===404)throw new Error("This connection request is no longer available.");if(d||!c)throw new Error("Could not start this connection. Please try again.");return c},this.getConnectionAttempt=async(s,a,i)=>{const{data:c,error:d,response:_}=await this.client.GET("/backend/widget/v5/connections/{serverId}/attempts/{attemptId}",{params:{path:{serverId:s,attemptId:a}},signal:i});if([401,403,404].includes(_.status))throw new $;if(d||!c)throw new Error(`Could not check the connection (${_.status}).`);return c.status},this.disconnectConnection=async s=>{const{error:a}=await this.client.DELETE("/backend/widget/v5/connections/{serverId}",{params:{path:{serverId:s}}});if(a)throw new Error("Could not disconnect. Please try again.")},this.setAuthToken=s=>{this.userToken=s;const{baseUrl:a,headers:i}=this.constructClientOptions(s);this.client=this.createOpenAPIClient({baseUrl:a,headers:i})},this.getStreamAuthContext=()=>{const{baseUrl:s,headers:a}=this.constructClientOptions(this.userToken),i={};for(const[c,d]of Object.entries(a))typeof d=="string"&&(["content-type","accept"].includes(c.toLowerCase())||(i[c]=d));return{baseUrl:s,headers:i}},this.getStreamTransportOptions=()=>{const{baseUrl:s,headers:a}=this.getStreamAuthContext();return{api:V(s,we),reconnectApi:i=>V(s,je,i),headers:a}},this.stopStream=async s=>{const{response:a}=await this.client.POST("/backend/widget/v5/chat/{sessionId}/stop",{params:{path:{sessionId:s}}});if(!a.ok)throw new Error(`Failed to stop stream: ${a.status}`)},this.getAgentTurnMessages=async(s,a)=>{const{data:i,response:c}=await this.client.GET("/backend/widget/v5/chat/{sessionId}/messages",{params:{path:{sessionId:s},query:{toolActivity:a==null?void 0:a.toolActivity,reasoning:(a==null?void 0:a.reasoning)===void 0?void 0:a.reasoning?"true":"false"}}});return i?{...i,handled_connection_request_ids:i.handled_connection_request_ids??[]}:(k.warn("agent turn messages fetch failed",c.status),null)},this.createDictationSession=async({language:s})=>{const{data:a,response:i}=await this.client.POST("/backend/widget/v5/dictation/sessions",{body:s?{language:s}:{}});if(!a)throw new Error(`Failed to start dictation: ${i.status}`);return a},this.getExternalWidgetConfig=async()=>await this.client.GET("/backend/widget/v2/config",{params:{header:{"x-bot-token":this.config.token}}}),this.sendMessage=async(s,a)=>await this.client.POST("/backend/widget/v2/chat/send",{body:s,signal:a}),this.createUnverifiedContact=async s=>await this.client.POST("/backend/widget/v2/contact/create-unverified",{params:{header:{"x-bot-token":this.config.token}},body:s}),this.createSession=async(s,a)=>await this.client.POST("/backend/widget/v2/create-session",{body:s,signal:a}),this.pollSessionAndHistory=async({sessionId:s,abortSignal:a})=>await this.client.GET("/backend/widget/v2/poll/{sessionId}",{params:{path:{sessionId:s}},signal:a}),this.getSessions=async({cursor:s,filters:a,abortSignal:i})=>await this.client.GET("/backend/widget/v2/sessions",{params:{query:{offset:s,filters:JSON.stringify(a)}},signal:i}),this.uploadFile=async({file:s,abortSignal:a,onProgress:i})=>new Promise((c,d)=>{var f;const _=new FormData;_.append("file",s);const p=new XMLHttpRequest;if(a&&(a.addEventListener("abort",()=>{p.abort(),d(new DOMException("Aborted","AbortError"))}),a.aborted)){d(new DOMException("Aborted","AbortError"));return}p.upload.addEventListener("progress",b=>{if(b.lengthComputable&&i){const w=Math.round(b.loaded/b.total*100);i(w)}}),p.addEventListener("load",()=>{if(p.status>=200&&p.status<300)try{const b=JSON.parse(p.responseText);c(b)}catch(b){d(new Error(`Failed to parse response: ${b}`))}else d(new Error(`Upload failed with status: ${p.status}`))}),p.addEventListener("error",()=>{d(new Error("Network error occurred"))}),p.addEventListener("timeout",()=>{d(new Error("Upload timed out"))});const{baseUrl:u}=this.constructClientOptions(this.userToken),g=`${u}/backend/widget/v2/upload`;p.open("POST",g),p.setRequestHeader("X-Bot-Token",this.config.token),this.userToken??((f=this.config.user)==null?void 0:f.token)?p.setRequestHeader("Authorization",`Bearer ${this.userToken}`):k.error("user token not set"),p.send(_)}),this.vote=async s=>await this.client.POST("/backend/widget/v2/chat/vote",{body:s}),this.resolveSession=async(s,a)=>await this.client.POST("/backend/widget/v2/session/resolve",{body:s,signal:a}),this.createStateCheckpoint=async s=>await this.client.POST("/backend/widget/v2/checkpoint",{body:s}),this.submitCsat=async s=>await this.client.POST("/backend/widget/v2/submit-csat",{body:s}),this.config=e,this.userToken=((r=e.user)==null?void 0:r.token)||null;const{baseUrl:t,headers:o}=this.constructClientOptions((l=e.user)==null?void 0:l.token);this.client=this.createOpenAPIClient({baseUrl:t,headers:o})}}function J(n,e){k.error(`missing case for ${n} in ${e}`)}class z{constructor(e){this.subscribers=new Set,this.get=()=>this.state,this.set=t=>{me(this.state,t)||(this.state=t,this.notifySubscribers(t))},this.setPartial=t=>{if(t==null)return;const o={...this.state,...t};this.set(o)},this.reset=()=>{this.set(this.initialState)},this.notifySubscribers=t=>{Array.from(this.subscribers).forEach(r=>{try{r(t)}catch(l){k.error("state subscriber threw",l)}})},this.subscribe=t=>(this.subscribers.add(t),()=>{this.subscribers.delete(t)}),this.state=e,this.initialState=e}}class Y{constructor(){this.state=new z({isPolling:!1,isError:!1}),this.abortController=new AbortController,this.reset=()=>{var e;this.abortController.abort("Resetting poller"),(e=this.stopPolling)==null||e.call(this),this.stopPolling=null},this.stopPolling=null,this.startPolling=(e,t)=>{if(this.stopPolling)return;const o=[],r=async()=>{this.abortController=new AbortController,this.state.setPartial({isPolling:!0});try{await e(this.abortController.signal)}catch(l){if(this.abortController.signal.aborted)return;k.error("failed to poll",l),this.state.setPartial({isError:!0})}finally{this.state.setPartial({isPolling:!1})}this.abortController.signal.aborted||o.push(setTimeout(r,t))};r(),this.stopPolling=()=>{o.forEach(clearTimeout),this.state.reset()}}}}function Q(n){try{const e=n();return e instanceof Promise?e.then(t=>({data:t})).catch(t=>({error:t})):{data:e}}catch(e){return{error:e}}}class ze{constructor({api:e,config:t,sessionCtx:o,messageCtx:r,sessionPollingIntervalSeconds:l}){this.poller=new Y,this.fetchSessionAndFullHistoryAbortController=new AbortController,this.reconcileAbortController=new AbortController,this.subscriptions=[],this.reconcilingSessionId=null,this.registerPolling=()=>{this.subscriptions.push(this.sessionCtx.sessionState.subscribe(({session:s})=>{s!=null&&s.id?this.poller.startPolling(async a=>{this.fetchSessionAndHistory({sessionId:s.id,abortSignal:a})},this.sessionPollingIntervalSeconds*1e3):this.poller.reset()})),this.subscriptions.push(this.sessionCtx.sessionState.subscribe(({session:s})=>{if(s!=null&&s.id&&!s.isOpened)try{this.fetchSessionAndFullHistoryAbortController=new AbortController,this.fetchSessionAndHistory({sessionId:s.id,abortSignal:this.fetchSessionAndFullHistoryAbortController.signal})}catch(a){this.fetchSessionAndFullHistoryAbortController.signal.aborted||k.error("failed to fetch session and full history",a)}else this.fetchSessionAndFullHistoryAbortController.abort()})),this.subscriptions.push(this.sessionCtx.sessionState.subscribe(({session:s})=>{this.reconcilingSessionId!==null&&(s==null?void 0:s.id)!==this.reconcilingSessionId&&this.reconcileAbortController.abort()}))},this.dispose=()=>{this.poller.reset(),this.fetchSessionAndFullHistoryAbortController.abort(),this.reconcileAbortController.abort(),this.reconcilingSessionId=null,this.subscriptions.forEach(s=>s()),this.subscriptions=[]},this.reconcileAfterStream=async s=>{this.reconcileAbortController.abort(),this.reconcileAbortController=new AbortController;const{signal:a}=this.reconcileAbortController;this.reconcilingSessionId=s;try{await this.fetchSessionAndHistory({sessionId:s,abortSignal:a})}catch(i){if(!a.aborted)throw i}finally{this.reconcilingSessionId===s&&(this.reconcilingSessionId=null)}},this.fetchSessionAndHistory=async({sessionId:s,abortSignal:a})=>{const i=this.messageCtx.state.get().messages.length===0;i&&this.messageCtx.state.setPartial({isInitialFetchLoading:!0});const{data:c}=await this.api.pollSessionAndHistory({sessionId:s,abortSignal:a});if(c!=null&&c.session&&(this.sessionCtx.sessionState.setPartial({session:c.session}),this.sessionCtx.setSessions([c.session])),c!=null&&c.history&&c.history.length>0){const d=this.messageCtx.state.get().messages,_=c.history.map(this.mapHistoryToMessage).filter(p=>p!==null).filter(p=>!d.some(u=>u.id===p.id));if(_.length>0)if(this.messageCtx.state.setPartial({messages:[...d,..._]}),i)this.messageCtx.markAsDispatchedToOnMessageReceivedHook(_.map(p=>p.id));else for(const p of _)this.messageCtx.dispatchToOnMessageReceivedHook(p)}this.messageCtx.state.get().isInitialFetchLoading&&this.messageCtx.state.setPartial({isInitialFetchLoading:!1})},this.mapHistoryToMessage=s=>{var i;const a={id:s.publicId,timestamp:s.sentAt||"",attachments:s.attachments||void 0};if(s.sender.kind==="user")return{...a,type:"USER",content:s.content.text||"",markedElements:s.pickedElements};if(s.sender.kind==="agent")return{...a,type:"AGENT",component:"agent_message",data:{message:s.content.text||""},agent:{name:s.sender.name||"",avatarUrl:s.sender.avatar||null,avatar:s.sender.avatar||null,id:null,isAi:!1}};if(s.sender.kind==="ai"){const c=s.actionCalls&&s.actionCalls.length>0?s.actionCalls[s.actionCalls.length-1]:void 0;return{...a,type:"AI",component:"bot_message",agent:{id:null,name:((i=this.config.bot)==null?void 0:i.name)||"",isAi:!0,avatarUrl:null,avatar:null},data:{message:s.content.text||"",action:c?{name:c.actionName,data:this.extractActionResult(c)}:void 0}}}if(s.sender.kind==="system"){const c=this.constructSystemMessage(s);return c===null?null:{...c}}return null},this.constructSystemMessage=s=>{if(!s||!s.systemMessagePayload)return null;switch(s.systemMessagePayload.type){case"state_checkpoint":return{id:s.publicId,type:"SYSTEM",subtype:"state_checkpoint",data:{payload:s.systemMessagePayload.payload},timestamp:s.sentAt||"",attachments:void 0};case"csat_requested":return{id:s.publicId,type:"SYSTEM",subtype:"csat_requested",data:{payload:void 0},timestamp:s.sentAt||"",attachments:void 0};case"csat_submitted":return{id:s.publicId,type:"SYSTEM",subtype:"csat_submitted",data:{payload:{score:s.systemMessagePayload.payload.score??void 0,feedback:s.systemMessagePayload.payload.feedback??void 0}},timestamp:s.sentAt||"",attachments:void 0};case"none":return null;default:return J(s.systemMessagePayload,this.constructSystemMessage.name),null}},this.extractActionResult=s=>{const a=s.result;if(a===null||typeof a!="object")return a;if("responseBodyText"in a&&typeof a.responseBodyText=="string"){const i=a.responseBodyText,c=Q(()=>JSON.parse(i)).data;if(c)return c}return s.result},this.api=e,this.config=t,this.sessionCtx=o,this.messageCtx=r,this.sessionPollingIntervalSeconds=l,this.registerPolling()}}class Se{constructor({config:e,api:t,storageCtx:o}){var r;this.shouldCollectData=()=>{var l;return!!(!((l=this.state.get().contact)!=null&&l.token)&&this.config.collectUserData)},this.autoCreateUnverifiedUserIfNotExists=async()=>{var l,s,a,i,c,d,_,p,u,m,g,v,f,b;if(!((l=this.config.user)!=null&&l.token)){if(this.config.collectUserData&&!((a=(s=this.config.user)==null?void 0:s.data)!=null&&a.email)){if((i=this.config.extraDataCollectionFields)!=null&&i.length)return;const w=await((c=this.storageCtx)==null?void 0:c.getContactToken());w&&await this.setUnverifiedContact(w);return}if(!((_=(d=this.config.user)==null?void 0:d.data)!=null&&_.email)){const w=await((p=this.storageCtx)==null?void 0:p.getContactToken());if(w){await this.setUnverifiedContact(w);return}}await this.createUnverifiedContact({email:(m=(u=this.config.user)==null?void 0:u.data)==null?void 0:m.email,non_verified_name:(v=(g=this.config.user)==null?void 0:g.data)==null?void 0:v.name,non_verified_custom_data:(b=(f=this.config.user)==null?void 0:f.data)==null?void 0:b.customData})}},this.createUnverifiedContact=async(l,s)=>{this.state.setPartial({extraCollectedData:s});try{this.state.setPartial({isCreatingUnverifiedContact:!0,isErrorCreatingUnverifiedContact:!1});const{data:a}=await this.api.createUnverifiedContact(l);a!=null&&a.token?await this.setUnverifiedContact(a.token):this.state.setPartial({isErrorCreatingUnverifiedContact:!0})}catch(a){this.state.setPartial({isErrorCreatingUnverifiedContact:!0}),k.error("failed to create an unverified contact",{_e:a instanceof Error?a.message:String(a)})}finally{this.state.setPartial({isCreatingUnverifiedContact:!1})}},this.recoverFromStaleToken=async()=>{var l,s,a,i,c,d,_,p,u,m;if((l=this.config.user)!=null&&l.token)return!1;this.api.setAuthToken(""),this.state.setPartial({contact:null});try{await((s=this.storageCtx)==null?void 0:s.clearContactToken()),await((a=this.storageCtx)==null?void 0:a.clearActiveSessionId())}catch(g){k.warn("failed to clear a stale contact token",{error:g instanceof Error?g.message:String(g)})}return await this.createUnverifiedContact({email:(c=(i=this.config.user)==null?void 0:i.data)==null?void 0:c.email,non_verified_name:(_=(d=this.config.user)==null?void 0:d.data)==null?void 0:_.name,non_verified_custom_data:(u=(p=this.config.user)==null?void 0:p.data)==null?void 0:u.customData}),!!((m=this.state.get().contact)!=null&&m.token)},this.setUnverifiedContact=async l=>{var i,c,d,_;const s=await((i=this.storageCtx)==null?void 0:i.getExternalContactId()),a=((c=this.config.user)==null?void 0:c.externalId)||s||K.v4();this.api.setAuthToken(l),await((d=this.storageCtx)==null?void 0:d.setContactToken(l)),await((_=this.storageCtx)==null?void 0:_.setExternalContactId(a)),this.state.setPartial({contact:{token:l,externalId:a}})},this.config=e,this.storageCtx=o,this.api=t,this.state=new z({contact:(r=e.user)!=null&&r.token?{token:e.user.token,externalId:e.user.externalId}:null,extraCollectedData:void 0,isCreatingUnverifiedContact:!1,isErrorCreatingUnverifiedContact:!1}),this.autoCreateUnverifiedUserIfNotExists()}}class Ce{constructor(e){this.api=e,this.state=new z([]),this.controllers=new Map,this.appendFiles=t=>{const o=t.map(r=>({file:r,id:K.v4(),status:"pending",progress:0}));this.state.set([...this.state.get(),...o]),o.forEach(r=>void this.upload(r))},this.cancel=t=>{var o;(o=this.controllers.get(t))==null||o.abort(),this.controllers.delete(t),this.state.set(this.state.get().filter(r=>r.id!==t))},this.reset=()=>{this.controllers.forEach(t=>t.abort()),this.controllers.clear(),this.state.reset()}}update(e,t){this.state.set(this.state.get().map(o=>o.id===e?{...o,...t}:o))}async upload(e){const t=new AbortController;this.controllers.set(e.id,t),this.update(e.id,{status:"uploading"});try{const o=await this.api.uploadFile({file:e.file,abortSignal:t.signal,onProgress:r=>this.update(e.id,{progress:r})});this.update(e.id,{status:"success",fileUrl:o.fileUrl,progress:100})}catch(o){t.signal.aborted||this.update(e.id,{status:"error",progress:0,error:o instanceof Error?o.message:"Upload failed"})}finally{this.controllers.delete(e.id)}}}function C(){return K.v4()}class xe{constructor({api:e,sessionCtx:t,messageCtx:o}){this.submitCsat=async r=>{var c;const l=(c=this.sessionCtx.sessionState.get().session)==null?void 0:c.id;if(!l)return{data:null,error:"No session id found"};const s=C();this.messageCtx.state.setPartial({messages:[...this.messageCtx.state.get().messages,{id:s,type:"SYSTEM",subtype:"csat_submitted",timestamp:new Date().toISOString(),data:{payload:{score:r.score,feedback:r.feedback}}}]});const{data:a,error:i}=await this.api.submitCsat({...r,system_message_uuid:s,session_id:l});return{data:a,error:i}},this.api=e,this.sessionCtx=t,this.messageCtx=o}}const qe=[{action:"newparagraph",phrases:{en:["new paragraph"],es:["nuevo párrafo","nuevo parrafo"],fr:["nouveau paragraphe"],de:["neuer absatz"],pt:["novo parágrafo","novo paragrafo"],it:["nuovo paragrafo"]}},{action:"newline",phrases:{en:["new line","newline"],es:["nueva línea","nueva linea"],fr:["nouvelle ligne","à la ligne","a la ligne"],de:["neue zeile"],pt:["nova linha"],it:["nuova riga"]}},{action:"bullet",phrases:{en:["bullet point","new bullet","next bullet","bullet list","list item","next item","new item"],es:["nuevo punto","nueva viñeta","nueva vineta"],fr:["nouvelle puce"],de:["neuer punkt","aufzählungspunkt"],pt:["novo item","novo marcador"],it:["nuovo punto","nuovo elenco"]}},{action:"scratch",phrases:{en:["scratch that","delete that"],es:["bórralo","borra eso"],fr:["efface ça","efface ca"],de:["lösch das","losch das"],pt:["apaga isso"],it:["cancella"]}},{action:"stop",phrases:{en:["stop dictation","stop dictating","stop listening"],es:["detener dictado"],fr:["arrête la dictée","arrete la dictee"],de:["diktat beenden"],pt:["parar ditado"],it:["stop dettatura"]}},{action:"send",phrases:{en:["send message","send it"],es:["enviar mensaje"],fr:["envoie le message"],de:["nachricht senden"],pt:["enviar mensagem"],it:["invia messaggio"]}}],Ee=["en","es","fr","de","pt","it"];function Ae(n){return Ee.includes(n)}function Pe(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Te(n){const e=qe.flatMap(r=>n.flatMap(l=>r.phrases[l].map(s=>({phrase:s,action:r.action})))),t=e.map(r=>Pe(r.phrase)).sort((r,l)=>l.length-r.length).join("|"),o=String.raw`(?<=^\s{0,3}|[.!?\n]\s{0,3})`;return{regex:new RegExp(`${o}(${t})`+String.raw`([.,!?;:])(?=\s|$)`,"giu"),finalRegex:new RegExp(`${o}(${t})`+String.raw`([.,!?;:]?)(?=\s|$)`,"giu"),phraseToAction:new Map(e.map(r=>[r.phrase.toLowerCase(),r.action])),longestPhrase:Math.max(...e.map(r=>r.phrase.length))}}const W=new Map;function I(n){const e=n&&Ae(n)&&n!=="en"?n:null,t=e??"en";let o=W.get(t);return o||(o=Te(e?["en",e]:["en"]),W.set(t,o)),o}function Ie(n){const e=n.replace(/\s+$/,"");if(!e)return"";const t=e.replace(/[.!?]+$/,"");let o=-1;for(let r=t.length-1;r>=0;r--){const l=t[r];if(l==="."||l==="!"||l==="?"||l===`
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("zod"),ue=require("openapi-fetch"),me=require("lodash.isequal"),K=require("uuid"),he=n=>n.type==="data-keepalive",ge=n=>n.type==="data-turn-steered",U=h.z.object({const:h.z.string(),title:h.z.string().optional()}),ke=h.z.object({type:h.z.enum(["string","number","integer","boolean","array"]),title:h.z.string().optional(),description:h.z.string().optional(),default:h.z.union([h.z.string(),h.z.number(),h.z.boolean(),h.z.array(h.z.string())]).optional(),enum:h.z.array(h.z.string()).optional(),oneOf:h.z.array(U).optional(),items:h.z.object({enum:h.z.array(h.z.string()).optional(),anyOf:h.z.array(U).optional()}).optional(),minItems:h.z.number().int().nonnegative().optional(),maxItems:h.z.number().int().nonnegative().optional(),minimum:h.z.number().optional(),maximum:h.z.number().optional(),minLength:h.z.number().optional(),maxLength:h.z.number().optional(),format:h.z.string().optional()}),be=h.z.array(h.z.object({id:h.z.string(),serverId:h.z.string(),serverName:h.z.string(),expiresAt:h.z.number(),approvalKey:h.z.string().optional(),form:h.z.object({message:h.z.string(),requestedSchema:h.z.object({properties:h.z.record(h.z.string(),ke),required:h.z.array(h.z.string()).optional()})})})),ve=h.z.array(h.z.object({key:h.z.string(),serverId:h.z.string(),serverName:h.z.string(),message:h.z.string(),toolName:h.z.string()})),B="[opencx]",k={warn:(n,...e)=>{console.warn(`${B} ${n}`,...e)},error:(n,...e)=>{console.error(`${B} ${n}`,...e)}},fe=n=>{k.error("request failed",n.error)},ye=n=>{const e=ue({baseUrl:n.baseUrl}),t={onRequest:n.onRequest,onResponse:n.onResponse,onError:n.onError||fe};return e.use(t),e};class G extends Error{constructor(){super("This connection request expired. Preparing a new request."),this.name="ConnectionRequestExpiredError"}}class $ extends Error{constructor(){super("This connection attempt is no longer available."),this.name="ConnectionAttemptUnavailableError"}}const we="/backend/widget/v5/chat/stream",je="/backend/widget/v5/chat/{sessionId}/stream",V=(n,e,t)=>`${n.replace(/\/$/,"")}${t?e.replace("{sessionId}",encodeURIComponent(t)):e}`;class H{constructor({config:e}){var r,l;this.userToken=null,this.constructClientOptions=s=>{const a=this.config.apiUrl||"https://api.open.cx",i={"X-Bot-Token":this.config.token,"Content-Type":"application/json",Accept:"application/json",Authorization:s?`Bearer ${s}`:void 0};return{baseUrl:a,headers:i}},this.createOpenAPIClient=({baseUrl:s,headers:a})=>ye({baseUrl:s,onRequest:({request:i})=>{Object.entries(a).forEach(([c,d])=>{d&&i.headers.set(c,d)})}}),this.listApprovalPreferences=async()=>{const{baseUrl:s,headers:a}=this.getStreamAuthContext(),i=await fetch(`${s}/backend/widget/v5/connections/approval-preferences`,{headers:a});if(!i.ok)throw new Error("Could not load permissions.");return ve.parse(await i.json())},this.revokeApprovalPreference=async(s,a)=>{const{baseUrl:i,headers:c}=this.getStreamAuthContext();if(!(await fetch(`${i}/backend/widget/v5/connections/${encodeURIComponent(s)}/approval-preferences/${encodeURIComponent(a)}`,{method:"DELETE",headers:c})).ok)throw new Error("Could not reset permission.")},this.listElicitations=async(s,a)=>{const{baseUrl:i,headers:c}=this.getStreamAuthContext(),d=await fetch(`${i}/backend/widget/v5/connections/elicitation/${encodeURIComponent(s)}`,{headers:c,signal:a});if(!d.ok)throw new Error("Could not load the request.");return be.parse(await d.json())},this.answerElicitation=async(s,a,i)=>{const{baseUrl:c,headers:d}=this.getStreamAuthContext(),_=await fetch(`${c}/backend/widget/v5/connections/elicitation/${encodeURIComponent(s)}/${encodeURIComponent(a)}`,{method:"POST",headers:{...d,"Content-Type":"application/json"},body:JSON.stringify(i)});if(!_.ok)throw new Error(_.status===400?"Check your answers and try again.":"This request has ended. Ask the agent to try again.")},this.listConnections=async s=>{const{data:a,error:i}=await this.client.GET("/backend/widget/v5/connections",{signal:s});if(i||!a)throw new Error("Could not load connections. Sign in and try again.");return a},this.startConnection=async(s,a,i)=>{const{data:c,error:d,response:_}=await this.client.POST("/backend/widget/v5/connections/{serverId}/start",{params:{path:{serverId:s}},body:{request_id:a},signal:i});if(_.status===410)throw new G;if(_.status===404)throw new Error("This connection request is no longer available.");if(d||!c)throw new Error("Could not start this connection. Please try again.");return c},this.getConnectionAttempt=async(s,a,i)=>{const{data:c,error:d,response:_}=await this.client.GET("/backend/widget/v5/connections/{serverId}/attempts/{attemptId}",{params:{path:{serverId:s,attemptId:a}},signal:i});if([401,403,404].includes(_.status))throw new $;if(d||!c)throw new Error(`Could not check the connection (${_.status}).`);return c.status},this.disconnectConnection=async s=>{const{error:a}=await this.client.DELETE("/backend/widget/v5/connections/{serverId}",{params:{path:{serverId:s}}});if(a)throw new Error("Could not disconnect. Please try again.")},this.setAuthToken=s=>{this.userToken=s;const{baseUrl:a,headers:i}=this.constructClientOptions(s);this.client=this.createOpenAPIClient({baseUrl:a,headers:i})},this.getStreamAuthContext=()=>{const{baseUrl:s,headers:a}=this.constructClientOptions(this.userToken),i={};for(const[c,d]of Object.entries(a))typeof d=="string"&&(["content-type","accept"].includes(c.toLowerCase())||(i[c]=d));return{baseUrl:s,headers:i}},this.getStreamTransportOptions=()=>{const{baseUrl:s,headers:a}=this.getStreamAuthContext();return{api:V(s,we),reconnectApi:i=>V(s,je,i),headers:a}},this.stopStream=async s=>{const{response:a}=await this.client.POST("/backend/widget/v5/chat/{sessionId}/stop",{params:{path:{sessionId:s}}});if(!a.ok)throw new Error(`Failed to stop stream: ${a.status}`)},this.sendPageReply=async(s,a)=>{try{await this.client.POST("/backend/widget/v5/chat/{sessionId}/page-reply",{params:{path:{sessionId:s}},body:a})}catch{}},this.getAgentTurnMessages=async(s,a)=>{const{data:i,response:c}=await this.client.GET("/backend/widget/v5/chat/{sessionId}/messages",{params:{path:{sessionId:s},query:{toolActivity:a==null?void 0:a.toolActivity,reasoning:(a==null?void 0:a.reasoning)===void 0?void 0:a.reasoning?"true":"false"}}});return i?{...i,handled_connection_request_ids:i.handled_connection_request_ids??[]}:(k.warn("agent turn messages fetch failed",c.status),null)},this.createDictationSession=async({language:s})=>{const{data:a,response:i}=await this.client.POST("/backend/widget/v5/dictation/sessions",{body:s?{language:s}:{}});if(!a)throw new Error(`Failed to start dictation: ${i.status}`);return a},this.getExternalWidgetConfig=async()=>await this.client.GET("/backend/widget/v2/config",{params:{header:{"x-bot-token":this.config.token}}}),this.sendMessage=async(s,a)=>await this.client.POST("/backend/widget/v2/chat/send",{body:s,signal:a}),this.createUnverifiedContact=async s=>await this.client.POST("/backend/widget/v2/contact/create-unverified",{params:{header:{"x-bot-token":this.config.token}},body:s}),this.createSession=async(s,a)=>await this.client.POST("/backend/widget/v2/create-session",{body:s,signal:a}),this.pollSessionAndHistory=async({sessionId:s,abortSignal:a})=>await this.client.GET("/backend/widget/v2/poll/{sessionId}",{params:{path:{sessionId:s}},signal:a}),this.getSessions=async({cursor:s,filters:a,abortSignal:i})=>await this.client.GET("/backend/widget/v2/sessions",{params:{query:{offset:s,filters:JSON.stringify(a)}},signal:i}),this.uploadFile=async({file:s,abortSignal:a,onProgress:i})=>new Promise((c,d)=>{var f;const _=new FormData;_.append("file",s);const p=new XMLHttpRequest;if(a&&(a.addEventListener("abort",()=>{p.abort(),d(new DOMException("Aborted","AbortError"))}),a.aborted)){d(new DOMException("Aborted","AbortError"));return}p.upload.addEventListener("progress",b=>{if(b.lengthComputable&&i){const w=Math.round(b.loaded/b.total*100);i(w)}}),p.addEventListener("load",()=>{if(p.status>=200&&p.status<300)try{const b=JSON.parse(p.responseText);c(b)}catch(b){d(new Error(`Failed to parse response: ${b}`))}else d(new Error(`Upload failed with status: ${p.status}`))}),p.addEventListener("error",()=>{d(new Error("Network error occurred"))}),p.addEventListener("timeout",()=>{d(new Error("Upload timed out"))});const{baseUrl:u}=this.constructClientOptions(this.userToken),g=`${u}/backend/widget/v2/upload`;p.open("POST",g),p.setRequestHeader("X-Bot-Token",this.config.token),this.userToken??((f=this.config.user)==null?void 0:f.token)?p.setRequestHeader("Authorization",`Bearer ${this.userToken}`):k.error("user token not set"),p.send(_)}),this.vote=async s=>await this.client.POST("/backend/widget/v2/chat/vote",{body:s}),this.resolveSession=async(s,a)=>await this.client.POST("/backend/widget/v2/session/resolve",{body:s,signal:a}),this.createStateCheckpoint=async s=>await this.client.POST("/backend/widget/v2/checkpoint",{body:s}),this.submitCsat=async s=>await this.client.POST("/backend/widget/v2/submit-csat",{body:s}),this.config=e,this.userToken=((r=e.user)==null?void 0:r.token)||null;const{baseUrl:t,headers:o}=this.constructClientOptions((l=e.user)==null?void 0:l.token);this.client=this.createOpenAPIClient({baseUrl:t,headers:o})}}function J(n,e){k.error(`missing case for ${n} in ${e}`)}class z{constructor(e){this.subscribers=new Set,this.get=()=>this.state,this.set=t=>{me(this.state,t)||(this.state=t,this.notifySubscribers(t))},this.setPartial=t=>{if(t==null)return;const o={...this.state,...t};this.set(o)},this.reset=()=>{this.set(this.initialState)},this.notifySubscribers=t=>{Array.from(this.subscribers).forEach(r=>{try{r(t)}catch(l){k.error("state subscriber threw",l)}})},this.subscribe=t=>(this.subscribers.add(t),()=>{this.subscribers.delete(t)}),this.state=e,this.initialState=e}}class Y{constructor(){this.state=new z({isPolling:!1,isError:!1}),this.abortController=new AbortController,this.reset=()=>{var e;this.abortController.abort("Resetting poller"),(e=this.stopPolling)==null||e.call(this),this.stopPolling=null},this.stopPolling=null,this.startPolling=(e,t)=>{if(this.stopPolling)return;const o=[],r=async()=>{this.abortController=new AbortController,this.state.setPartial({isPolling:!0});try{await e(this.abortController.signal)}catch(l){if(this.abortController.signal.aborted)return;k.error("failed to poll",l),this.state.setPartial({isError:!0})}finally{this.state.setPartial({isPolling:!1})}this.abortController.signal.aborted||o.push(setTimeout(r,t))};r(),this.stopPolling=()=>{o.forEach(clearTimeout),this.state.reset()}}}}function Q(n){try{const e=n();return e instanceof Promise?e.then(t=>({data:t})).catch(t=>({error:t})):{data:e}}catch(e){return{error:e}}}class ze{constructor({api:e,config:t,sessionCtx:o,messageCtx:r,sessionPollingIntervalSeconds:l}){this.poller=new Y,this.fetchSessionAndFullHistoryAbortController=new AbortController,this.reconcileAbortController=new AbortController,this.subscriptions=[],this.reconcilingSessionId=null,this.registerPolling=()=>{this.subscriptions.push(this.sessionCtx.sessionState.subscribe(({session:s})=>{s!=null&&s.id?this.poller.startPolling(async a=>{this.fetchSessionAndHistory({sessionId:s.id,abortSignal:a})},this.sessionPollingIntervalSeconds*1e3):this.poller.reset()})),this.subscriptions.push(this.sessionCtx.sessionState.subscribe(({session:s})=>{if(s!=null&&s.id&&!s.isOpened)try{this.fetchSessionAndFullHistoryAbortController=new AbortController,this.fetchSessionAndHistory({sessionId:s.id,abortSignal:this.fetchSessionAndFullHistoryAbortController.signal})}catch(a){this.fetchSessionAndFullHistoryAbortController.signal.aborted||k.error("failed to fetch session and full history",a)}else this.fetchSessionAndFullHistoryAbortController.abort()})),this.subscriptions.push(this.sessionCtx.sessionState.subscribe(({session:s})=>{this.reconcilingSessionId!==null&&(s==null?void 0:s.id)!==this.reconcilingSessionId&&this.reconcileAbortController.abort()}))},this.dispose=()=>{this.poller.reset(),this.fetchSessionAndFullHistoryAbortController.abort(),this.reconcileAbortController.abort(),this.reconcilingSessionId=null,this.subscriptions.forEach(s=>s()),this.subscriptions=[]},this.reconcileAfterStream=async s=>{this.reconcileAbortController.abort(),this.reconcileAbortController=new AbortController;const{signal:a}=this.reconcileAbortController;this.reconcilingSessionId=s;try{await this.fetchSessionAndHistory({sessionId:s,abortSignal:a})}catch(i){if(!a.aborted)throw i}finally{this.reconcilingSessionId===s&&(this.reconcilingSessionId=null)}},this.fetchSessionAndHistory=async({sessionId:s,abortSignal:a})=>{const i=this.messageCtx.state.get().messages.length===0;i&&this.messageCtx.state.setPartial({isInitialFetchLoading:!0});const{data:c}=await this.api.pollSessionAndHistory({sessionId:s,abortSignal:a});if(c!=null&&c.session&&(this.sessionCtx.sessionState.setPartial({session:c.session}),this.sessionCtx.setSessions([c.session])),c!=null&&c.history&&c.history.length>0){const d=this.messageCtx.state.get().messages,_=c.history.map(this.mapHistoryToMessage).filter(p=>p!==null).filter(p=>!d.some(u=>u.id===p.id));if(_.length>0)if(this.messageCtx.state.setPartial({messages:[...d,..._]}),i)this.messageCtx.markAsDispatchedToOnMessageReceivedHook(_.map(p=>p.id));else for(const p of _)this.messageCtx.dispatchToOnMessageReceivedHook(p)}this.messageCtx.state.get().isInitialFetchLoading&&this.messageCtx.state.setPartial({isInitialFetchLoading:!1})},this.mapHistoryToMessage=s=>{var i;const a={id:s.publicId,timestamp:s.sentAt||"",attachments:s.attachments||void 0};if(s.sender.kind==="user")return{...a,type:"USER",content:s.content.text||"",markedElements:s.pickedElements};if(s.sender.kind==="agent")return{...a,type:"AGENT",component:"agent_message",data:{message:s.content.text||""},agent:{name:s.sender.name||"",avatarUrl:s.sender.avatar||null,avatar:s.sender.avatar||null,id:null,isAi:!1}};if(s.sender.kind==="ai"){const c=s.actionCalls&&s.actionCalls.length>0?s.actionCalls[s.actionCalls.length-1]:void 0;return{...a,type:"AI",component:"bot_message",agent:{id:null,name:((i=this.config.bot)==null?void 0:i.name)||"",isAi:!0,avatarUrl:null,avatar:null},data:{message:s.content.text||"",action:c?{name:c.actionName,data:this.extractActionResult(c)}:void 0}}}if(s.sender.kind==="system"){const c=this.constructSystemMessage(s);return c===null?null:{...c}}return null},this.constructSystemMessage=s=>{if(!s||!s.systemMessagePayload)return null;switch(s.systemMessagePayload.type){case"state_checkpoint":return{id:s.publicId,type:"SYSTEM",subtype:"state_checkpoint",data:{payload:s.systemMessagePayload.payload},timestamp:s.sentAt||"",attachments:void 0};case"csat_requested":return{id:s.publicId,type:"SYSTEM",subtype:"csat_requested",data:{payload:void 0},timestamp:s.sentAt||"",attachments:void 0};case"csat_submitted":return{id:s.publicId,type:"SYSTEM",subtype:"csat_submitted",data:{payload:{score:s.systemMessagePayload.payload.score??void 0,feedback:s.systemMessagePayload.payload.feedback??void 0}},timestamp:s.sentAt||"",attachments:void 0};case"none":return null;default:return J(s.systemMessagePayload,this.constructSystemMessage.name),null}},this.extractActionResult=s=>{const a=s.result;if(a===null||typeof a!="object")return a;if("responseBodyText"in a&&typeof a.responseBodyText=="string"){const i=a.responseBodyText,c=Q(()=>JSON.parse(i)).data;if(c)return c}return s.result},this.api=e,this.config=t,this.sessionCtx=o,this.messageCtx=r,this.sessionPollingIntervalSeconds=l,this.registerPolling()}}class Se{constructor({config:e,api:t,storageCtx:o}){var r;this.shouldCollectData=()=>{var l;return!!(!((l=this.state.get().contact)!=null&&l.token)&&this.config.collectUserData)},this.autoCreateUnverifiedUserIfNotExists=async()=>{var l,s,a,i,c,d,_,p,u,m,g,v,f,b;if(!((l=this.config.user)!=null&&l.token)){if(this.config.collectUserData&&!((a=(s=this.config.user)==null?void 0:s.data)!=null&&a.email)){if((i=this.config.extraDataCollectionFields)!=null&&i.length)return;const w=await((c=this.storageCtx)==null?void 0:c.getContactToken());w&&await this.setUnverifiedContact(w);return}if(!((_=(d=this.config.user)==null?void 0:d.data)!=null&&_.email)){const w=await((p=this.storageCtx)==null?void 0:p.getContactToken());if(w){await this.setUnverifiedContact(w);return}}await this.createUnverifiedContact({email:(m=(u=this.config.user)==null?void 0:u.data)==null?void 0:m.email,non_verified_name:(v=(g=this.config.user)==null?void 0:g.data)==null?void 0:v.name,non_verified_custom_data:(b=(f=this.config.user)==null?void 0:f.data)==null?void 0:b.customData})}},this.createUnverifiedContact=async(l,s)=>{this.state.setPartial({extraCollectedData:s});try{this.state.setPartial({isCreatingUnverifiedContact:!0,isErrorCreatingUnverifiedContact:!1});const{data:a}=await this.api.createUnverifiedContact(l);a!=null&&a.token?await this.setUnverifiedContact(a.token):this.state.setPartial({isErrorCreatingUnverifiedContact:!0})}catch(a){this.state.setPartial({isErrorCreatingUnverifiedContact:!0}),k.error("failed to create an unverified contact",{_e:a instanceof Error?a.message:String(a)})}finally{this.state.setPartial({isCreatingUnverifiedContact:!1})}},this.recoverFromStaleToken=async()=>{var l,s,a,i,c,d,_,p,u,m;if((l=this.config.user)!=null&&l.token)return!1;this.api.setAuthToken(""),this.state.setPartial({contact:null});try{await((s=this.storageCtx)==null?void 0:s.clearContactToken()),await((a=this.storageCtx)==null?void 0:a.clearActiveSessionId())}catch(g){k.warn("failed to clear a stale contact token",{error:g instanceof Error?g.message:String(g)})}return await this.createUnverifiedContact({email:(c=(i=this.config.user)==null?void 0:i.data)==null?void 0:c.email,non_verified_name:(_=(d=this.config.user)==null?void 0:d.data)==null?void 0:_.name,non_verified_custom_data:(u=(p=this.config.user)==null?void 0:p.data)==null?void 0:u.customData}),!!((m=this.state.get().contact)!=null&&m.token)},this.setUnverifiedContact=async l=>{var i,c,d,_;const s=await((i=this.storageCtx)==null?void 0:i.getExternalContactId()),a=((c=this.config.user)==null?void 0:c.externalId)||s||K.v4();this.api.setAuthToken(l),await((d=this.storageCtx)==null?void 0:d.setContactToken(l)),await((_=this.storageCtx)==null?void 0:_.setExternalContactId(a)),this.state.setPartial({contact:{token:l,externalId:a}})},this.config=e,this.storageCtx=o,this.api=t,this.state=new z({contact:(r=e.user)!=null&&r.token?{token:e.user.token,externalId:e.user.externalId}:null,extraCollectedData:void 0,isCreatingUnverifiedContact:!1,isErrorCreatingUnverifiedContact:!1}),this.autoCreateUnverifiedUserIfNotExists()}}class Ce{constructor(e){this.api=e,this.state=new z([]),this.controllers=new Map,this.appendFiles=t=>{const o=t.map(r=>({file:r,id:K.v4(),status:"pending",progress:0}));this.state.set([...this.state.get(),...o]),o.forEach(r=>void this.upload(r))},this.cancel=t=>{var o;(o=this.controllers.get(t))==null||o.abort(),this.controllers.delete(t),this.state.set(this.state.get().filter(r=>r.id!==t))},this.reset=()=>{this.controllers.forEach(t=>t.abort()),this.controllers.clear(),this.state.reset()}}update(e,t){this.state.set(this.state.get().map(o=>o.id===e?{...o,...t}:o))}async upload(e){const t=new AbortController;this.controllers.set(e.id,t),this.update(e.id,{status:"uploading"});try{const o=await this.api.uploadFile({file:e.file,abortSignal:t.signal,onProgress:r=>this.update(e.id,{progress:r})});this.update(e.id,{status:"success",fileUrl:o.fileUrl,progress:100})}catch(o){t.signal.aborted||this.update(e.id,{status:"error",progress:0,error:o instanceof Error?o.message:"Upload failed"})}finally{this.controllers.delete(e.id)}}}function C(){return K.v4()}class xe{constructor({api:e,sessionCtx:t,messageCtx:o}){this.submitCsat=async r=>{var c;const l=(c=this.sessionCtx.sessionState.get().session)==null?void 0:c.id;if(!l)return{data:null,error:"No session id found"};const s=C();this.messageCtx.state.setPartial({messages:[...this.messageCtx.state.get().messages,{id:s,type:"SYSTEM",subtype:"csat_submitted",timestamp:new Date().toISOString(),data:{payload:{score:r.score,feedback:r.feedback}}}]});const{data:a,error:i}=await this.api.submitCsat({...r,system_message_uuid:s,session_id:l});return{data:a,error:i}},this.api=e,this.sessionCtx=t,this.messageCtx=o}}const qe=[{action:"newparagraph",phrases:{en:["new paragraph"],es:["nuevo párrafo","nuevo parrafo"],fr:["nouveau paragraphe"],de:["neuer absatz"],pt:["novo parágrafo","novo paragrafo"],it:["nuovo paragrafo"]}},{action:"newline",phrases:{en:["new line","newline"],es:["nueva línea","nueva linea"],fr:["nouvelle ligne","à la ligne","a la ligne"],de:["neue zeile"],pt:["nova linha"],it:["nuova riga"]}},{action:"bullet",phrases:{en:["bullet point","new bullet","next bullet","bullet list","list item","next item","new item"],es:["nuevo punto","nueva viñeta","nueva vineta"],fr:["nouvelle puce"],de:["neuer punkt","aufzählungspunkt"],pt:["novo item","novo marcador"],it:["nuovo punto","nuovo elenco"]}},{action:"scratch",phrases:{en:["scratch that","delete that"],es:["bórralo","borra eso"],fr:["efface ça","efface ca"],de:["lösch das","losch das"],pt:["apaga isso"],it:["cancella"]}},{action:"stop",phrases:{en:["stop dictation","stop dictating","stop listening"],es:["detener dictado"],fr:["arrête la dictée","arrete la dictee"],de:["diktat beenden"],pt:["parar ditado"],it:["stop dettatura"]}},{action:"send",phrases:{en:["send message","send it"],es:["enviar mensaje"],fr:["envoie le message"],de:["nachricht senden"],pt:["enviar mensagem"],it:["invia messaggio"]}}],Ee=["en","es","fr","de","pt","it"];function Ae(n){return Ee.includes(n)}function Pe(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Te(n){const e=qe.flatMap(r=>n.flatMap(l=>r.phrases[l].map(s=>({phrase:s,action:r.action})))),t=e.map(r=>Pe(r.phrase)).sort((r,l)=>l.length-r.length).join("|"),o=String.raw`(?<=^\s{0,3}|[.!?\n]\s{0,3})`;return{regex:new RegExp(`${o}(${t})`+String.raw`([.,!?;:])(?=\s|$)`,"giu"),finalRegex:new RegExp(`${o}(${t})`+String.raw`([.,!?;:]?)(?=\s|$)`,"giu"),phraseToAction:new Map(e.map(r=>[r.phrase.toLowerCase(),r.action])),longestPhrase:Math.max(...e.map(r=>r.phrase.length))}}const W=new Map;function I(n){const e=n&&Ae(n)&&n!=="en"?n:null,t=e??"en";let o=W.get(t);return o||(o=Te(e?["en",e]:["en"]),W.set(t,o)),o}function Ie(n){const e=n.replace(/\s+$/,"");if(!e)return"";const t=e.replace(/[.!?]+$/,"");let o=-1;for(let r=t.length-1;r>=0;r--){const l=t[r];if(l==="."||l==="!"||l==="?"||l===`
|
|
2
2
|
`){o=r+1;break}}return o===-1?"":`${t.slice(0,o)} `.replace(/\n $/,`
|
|
3
3
|
`)}const Me=new RegExp(String.raw`(^- |\n(?:- )?)(\p{Ll})`,"gu");function De(n){return n.replace(Me,(e,t,o)=>t+o.toUpperCase())}function Ne(n){return n.length<=3&&/^\s*$/.test(n)?!0:/[.!?\n]\s{0,3}$/.test(n.slice(-6))}class q{static process(e,t){const o=I(t==null?void 0:t.language),r=t!=null&&t.final?"":q.commandPrefixTail(e,t==null?void 0:t.language),l=e.slice(0,e.length-r.length),s=t!=null&&t.final?o.finalRegex:o.regex;let a="",i=null,c=0;for(const _ of Array.from(l.matchAll(s))){const[,p=""]=_,u=o.phraseToAction.get(p.toLowerCase());if(u)if(a+=l.slice(c,_.index),c=_.index+_[0].length,u==="newline")a=`${a.replace(/[ \t]+$/,"")}
|
|
4
4
|
`;else if(u==="newparagraph")a=`${a.replace(/[ \t]+$/,"")}
|