@webority/chat-core 0.137.3 → 0.137.5
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/session.js +1 -1
- package/dist/types/session.d.ts +1 -0
- package/package.json +1 -1
package/dist/session.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import{ChatApiError as e}from"./client.js";import"./contract.js";import{messagePlainText as t}from"./format.js";import{DEFAULT_CHAT_LABELS as n,mergeLabels as r}from"./labels.js";import{startLiveConnection as i}from"./live.js";import{pacingDelayMs as a}from"./pacing.js";import{emptyFeatures as o,resolveFeatures as s,resolveStart as c}from"./profile.js";import{selectStarters as l}from"./starters.js";var u=globalThis,ee=5e3,te=3e3,ne=300,re=1200,ie=e=>{if(u.requestAnimationFrame&&u.cancelAnimationFrame){let t=u.requestAnimationFrame(()=>e());return()=>u.cancelAnimationFrame?.(t)}let t=u.setTimeout(e,16);return()=>u.clearTimeout(t)},d=e=>typeof e==`object`&&e&&!Array.isArray(e)?e:{},f=e=>{let t=d(e);return{code:typeof t.code==`string`&&t.code?t.code:`unknown`,message:typeof t.message==`string`&&t.message?t.message:n.errorGeneric,resetsDateTimeUtc:typeof t.resetsDateTimeUtc==`string`?t.resetsDateTimeUtc:null}},ae=(e,t)=>({id:e.publicId,author:e.author,createdDateTimeUtc:e.createdDateTimeUtc,parts:e.parts,sequence:e.sequence,rating:e.rating,ratingNote:e.ratingNote,streaming:!1,stored:!0,restored:t}),oe=(e,t)=>{let n=e.findIndex(e=>e.id===t.id);return n<0?[...e,t]:e.map((e,r)=>r===n?t:e)},se=(e,t)=>{for(let n=e.length-1;n>=0;--n)if(t(e[n]))return n;return-1},ce=e=>e.flatMap(e=>e.kind===`Text`?[e.text]:[]).join(`
|
|
2
2
|
|
|
3
|
-
`),p=e=>e.flatMap(e=>e.kind===`File`?[{publicId:e.attachmentId,fileName:e.fileName,contentType:e.contentType,length:e.length}]:[]),le=e=>{let t=d(e);return{fileName:typeof t.name==`string`?t.name:``,contentType:typeof t.type==`string`?t.type:``,length:typeof t.size==`number`?t.size:null}},ue=(e,t)=>e.length===t.length&&e.every((e,n)=>e.id===t[n].id&&e.label===t[n].label&&e.message===t[n].message),de=e=>{for(let t of e){if(!t.startsWith(`Enquiry type:`))continue;let e=t.slice(13).trim();return e===``?null:e}return null},fe=e=>e.some(e=>e.kind===`Handoff`)?null:e.find(e=>e.kind===`InputRequest`)?.requestId??null,pe=(e,t)=>e.some(e=>e.parts.some(e=>e.kind===`InputRequest`&&e.requestId===t&&(e.state===`Skipped`||e.state===`Expired`))),me=(e,t)=>{if(t!==`WithAgent`)return null;for(let t=e.length-1;t>=0;--t){let n=e[t];for(let e=n.parts.length-1;e>=0;--e){let t=n.parts[e];if(t.kind===`Handoff`){if(t.state===`Left`||t.state===`Ended`)return null;if(t.state===`Joined`&&t.agent)return t.agent}}if(n.author.kind===`Agent`)return{displayName:n.author.displayName??``,avatarUrl:n.author.avatarUrl}}return null},he=(e,t)=>{(e.cursor===null||t>e.cursor)&&(e.cursor=t)},ge=(e,t)=>{let n=[];e!==``&&n.push({kind:`Text`,text:e});for(let e of t)n.push({kind:`File`,attachmentId:e.publicId,fileName:e.fileName,contentType:e.contentType,length:e.length});return n},_e=e=>{let t=ce(e.parts);return{wireText:t===``?null:t,displayText:t,quickReplyId:null,replacesMessageId:null,attachments:p(e.parts)}},ve=e=>({profile:null,profileError:null,features:o(),conversationId:null,conversationState:`Open`,title:null,continuesConversationId:null,messages:[],thinking:!1,steps:[],streaming:!1,loading:!1,loadError:null,turnError:null,stopped:!1,messagesLeftToday:null,editing:null,attachments:[],lastConversation:null,open:!1,muted:e?.get(`wchat:muted`)===`1`,greeting:null,starters:[],pending:null,agent:null,agentTyping:null,live:`Off`,handoffPending:!1,handoffContactRequestId:null,handoffPause:!1,openTickets:[],draft:null}),m=(o,p)=>{let m=r(p.labels),ye=p.schedule??ie,h=p.prefs,g=/* @__PURE__ */ new Set,_=ve(h),v=0,y=null,b=null,be=0,xe=0,Se=null,x=null,S=/* @__PURE__ */ new Map,Ce=/* @__PURE__ */ new Set,C=/* @__PURE__ */ new Map,w=/* @__PURE__ */ new Set,T=/* @__PURE__ */ new Map,E={name:null,email:null,phone:null},D=/* @__PURE__ */ new Set,O=null,k=null,A=null,j=null,M=null,we=!0,Te=!1,Ee=/* @__PURE__ */ new Set,N=/* @__PURE__ */ new Map,P=Promise.resolve(),F=0,De=()=>p.pathname?.()??u.location?.pathname??`/`,Oe=()=>p.reducedMotion?.()===!0||_.profile?.experience.motion===!1,I=()=>_.streaming||_.thinking,ke=e=>{if(!e.profile)return{...e,greeting:null,starters:[]};let t=De(),n=e.lastConversation!==null,r=c(e.profile,{pathname:t,returning:n}).greeting,i=l(e.profile.start,{pathname:t,returning:n,behaviour:p.behaviour?.()??null,behaviourStarters:e.features.BehaviourStarters});return{...e,greeting:r,starters:ue(e.starters,i)?e.starters:i}},L=()=>{O!==null&&(u.clearTimeout(O),O=null)},R=()=>{A!==null&&(u.clearTimeout(A),A=null)},Ae=e=>e.flatMap(e=>e.parts.flatMap(e=>e.kind===`Action`&&e.actionKind===`ChatLeadCapture`&&e.state===`Done`?[{actionId:e.actionId,leadType:de(e.lines)}]:[])),z=()=>{E.name=null,E.email=null,E.phone=null,D.clear()},je=e=>{for(let t of Ae(e))D.add(t.actionId)},Me=()=>{for(let e of Ae(_.messages))D.has(e.actionId)||(D.add(e.actionId),p.onEvent?.(`leadSubmitted`,{conversationId:_.conversationId,fields:{name:E.name,email:E.email,phone:E.phone},leadType:e.leadType}))},Ne=(e,t)=>{let n=_.messages.flatMap(e=>e.parts).find(t=>t.kind===`InputRequest`&&t.requestId===e);if(n)for(let e of n.fields){let n=t[e.key];typeof n==`string`&&n.trim()!==``&&(e.type===`Email`?E.email=n.trim():e.type===`Phone`?E.phone=n.trim():(e.type===`Name`||e.key.toLowerCase()===`name`)&&(E.name=n.trim()))}},B=e=>{let t=M;t!==null&&(M=null,t.handle?.stop(),e!==null&&H({live:e}))},Pe=()=>!Te&&we&&_.features.HumanHandoff&&_.conversationId!==null&&(_.conversationState===`WaitingForAgent`||_.conversationState===`WithAgent`),V=()=>{if(!Pe()){M!==null&&B(`Off`);return}let e=_.conversationId;if(e===null||M!==null&&M.conversationId===e)return;B(null);let t={conversationId:e,cursor:null,handle:null};M=t;let n=i({watch:(n,r,i)=>o.watchConversation(e,{afterSequence:n,signal:r,onCursor:e=>he(t,e),onEvent:e=>{i(),M===t&&(e.name===`messageCompleted`&&he(t,e.data.message.sequence),X(e,`live`,()=>M===t))}}),beforeReconnect:()=>Z(),getCursor:()=>{let e=t.cursor;for(let t of _.messages)t.sequence!==null&&(e===null||t.sequence>e)&&(e=t.sequence);return e},onStatus:e=>{M===t&&_.live!==e&&H({live:e})},onError:e=>K(e)});t.handle=n,M!==t&&n.stop()},H=e=>{let t={..._,...e};_.conversationState===`WithAgent`&&t.conversationState!==`WithAgent`&&t.agentTyping!==null&&(L(),t.agentTyping=null),(e.messages!==void 0||e.conversationState!==void 0)&&(t.agent=me(t.messages,t.conversationState)),e.messages!==void 0&&t.handoffContactRequestId!==null&&pe(t.messages,t.handoffContactRequestId)&&(t.handoffContactRequestId=null),_=ke(t);for(let e of g)e();e.messages!==void 0&&Me(),V()},U=(e,t)=>H({attachments:_.attachments.map(n=>n.key===e?{...n,...t}:n)}),W=()=>{if(S.size===0)return;let e=[...S.values()];S.clear(),H({messages:_.messages.map(t=>{let n=e.filter(e=>e.messageId===t.id);if(n.length===0)return t;let r=t.parts.map((e,t)=>{let r=n.filter(e=>e.index===t).map(e=>e.text).join(``);return e.kind===`Text`&&r!==``?{...e,text:e.text+r}:e});return{...t,parts:r}})})},G=()=>{S.clear(),b?.(),b=null},Fe=(e,t,n)=>{let r=`${e}#${t}`,i=S.get(r);S.set(r,{messageId:e,index:t,text:(i?.text??``)+n}),b||=ye(()=>{b=null,W()})},Ie=()=>{W(),v+=1,y?.abort(),y=null},K=e=>{if(p.onError)p.onError(e);else throw e},q=()=>{for(let e of T.values())e.abort();T.clear();for(let e of w){let t=C.get(e);t&&o.deleteAttachment(t.publicId).catch(K)}w.clear(),C.clear()},Le=e=>{let t=C.get(e);if(!t)throw Error(`No uploaded file for composer attachment ${e}.`);return t},Re=async(e,t)=>{let n=new u.AbortController;T.set(e,n);let r;try{r=await o.uploadAttachment(t,{signal:n.signal,onProgress:t=>{T.get(e)===n&&U(e,{progress:t})}})}catch{T.get(e)===n&&(T.delete(e),U(e,{status:`Failed`,progress:null,error:m.attachmentFailed}));return}T.get(e)===n?(T.delete(e),C.set(e,r),w.add(e),U(e,{status:`Ready`,progress:null})):o.deleteAttachment(r.publicId).catch(K)},ze=e=>{let t={...d(p.pageContext?.()),path:De(),behaviour:p.behaviour?.()??null};return e&&(t.attribution=p.attribution?.()??null),t},Be=async()=>{let t=_.profile?.captcha;if(!t||!p.getCaptchaToken||t.mode===`Off`&&!t.siteKey)return null;let n=null;try{n=await p.getCaptchaToken(t.action)}catch{}if(!n)throw new e(`captcha_unavailable`,m.captchaUnavailable);return n},Ve=(e,t,n)=>{let r=oe(_.messages,ae(e,!1));H(n?{messages:r,messagesLeftToday:t??_.messagesLeftToday,steps:[],thinking:!1}:{messages:r})},He=e=>{let n=_.profile?.experience.pacing;return!n||Ce.has(e.publicId)||e.author.kind!==`Assistant`&&e.author.kind!==`Script`?0:a(t(e.parts),n,Oe())},Ue=(e,t,n,r,i)=>{F+=1,H({pending:{typing:!0,authorKind:e.author.kind}}),P=P.then(()=>new Promise(e=>u.setTimeout(e,n))).then(()=>{--F,r()&&Ve(e,t,i),F===0&&H({pending:null})})},We=(e,t,n)=>{let r=[...e];return r[t]=n,r},J=(e,t)=>_.messages.map(n=>n.id===e?t(n):n),Y=e=>_.messages.some(t=>t.id===e),Ge=()=>{L(),_.agentTyping!==null&&H({agentTyping:null})},Ke=e=>{L(),O=u.setTimeout(()=>{O=null,H({agentTyping:null})},ee),H({agentTyping:{displayName:e}})},X=(e,t,n)=>{if(!n())return;let r=t===`turn`;if(e.name===`partDelta`)Ce.add(e.data.messageId),Fe(e.data.messageId,e.data.index,e.data.text);else switch(W(),e.name){case`messageStarted`:{let t=e.data.message;if(t.author.kind===`Agent`&&Ge(),Y(t.publicId))break;H({messages:[..._.messages,{id:t.publicId,author:t.author,createdDateTimeUtc:t.createdDateTimeUtc,parts:[...t.parts],sequence:t.sequence,rating:t.rating,ratingNote:t.ratingNote,streaming:!0,stored:!1,restored:!1}]});break}case`partStarted`:{let{messageId:t,index:n,part:i}=e.data;if(!Y(t))break;H({messages:J(t,e=>({...e,parts:We(e.parts,n,i)})),...r?{thinking:!1}:{}});break}case`partCompleted`:{let{messageId:t,index:n,part:r}=e.data;if(!Y(t))break;H({messages:J(t,e=>({...e,parts:We(e.parts,n,r)}))});break}case`messageReset`:{let{messageId:t}=e.data;if(!Y(t))break;for(let e of[...S.keys()])S.get(e)?.messageId===t&&S.delete(e);H({messages:J(t,e=>({...e,parts:[]})),...r?{thinking:!0,steps:[]}:{}});break}case`step`:{if(!r)break;let t=e.data.label;_.steps[_.steps.length-1]!==t&&H({steps:[..._.steps,t]});break}case`messageCompleted`:{let{message:t,messagesLeftToday:i}=e.data;t.author.kind===`Agent`&&Ge();let a=He(t);a>0||F>0?Ue(t,i,a,n,r):Ve(t,i,r);break}case`conversationUpdated`:{let t=e.data;H({conversationId:t.conversationId,conversationState:t.state,title:t.title,continuesConversationId:t.continuesConversationId});break}case`typing`:e.data.authorKind===`Agent`&&Ke(e.data.displayName)}},Z=async()=>{let e=_.conversationId;if(e===null)return;let t=v;try{let n=await o.getConversation(e);if(t!==v)return;let r=new Set(_.messages.filter(e=>e.restored).map(e=>e.id));H({messages:n.messages.map(e=>ae(e,r.has(e.publicId))),title:n.title,conversationState:n.state,continuesConversationId:n.continuesConversationId})}catch(e){K(e)}},Q=async(e,t,n)=>{let r=v,i=new u.AbortController,a=()=>r===v&&!i.signal.aborted;y=i;let s=_.conversationId===null;be+=1;let c={id:`local-${be}`,author:{kind:`Visitor`,displayName:null,avatarUrl:null},createdDateTimeUtc:(/* @__PURE__ */ new Date()).toISOString(),parts:ge(e.displayText,e.attachments),sequence:null,rating:null,ratingNote:null,streaming:!1,stored:!1,restored:!1};n&&(w.clear(),C.clear()),H({messages:[...t,c],thinking:!0,streaming:!0,steps:[],turnError:null,stopped:!1,...n?{editing:null,attachments:[]}:{}});try{let t=await Be();await o.send({conversationId:_.conversationId,text:e.wireText,quickReplyId:e.quickReplyId,attachmentIds:e.attachments.map(e=>e.publicId),replacesMessageId:e.replacesMessageId,pageContext:ze(s),captchaToken:t},{signal:i.signal,onEvent:e=>X(e,`turn`,a)})}catch(e){if(W(),!a())return;let t=f(e);H({messages:_.messages.filter(e=>!e.streaming),thinking:!1,streaming:!1,turnError:t,...t.code===`daily_limit`?{messagesLeftToday:0}:{},...t.code===`conversation_not_found`?{conversationId:null}:{}});return}finally{y===i&&(y=null)}if(await P,!a())return;W(),H({thinking:!1,streaming:!1}),await Z();let l=_.conversationId;s&&l!==null&&l!==Se&&(Se=l,p.onEvent?.(`chatStarted`,{conversationId:l}))},qe=e=>H({messages:_.messages.map(t=>({...t,parts:t.parts.map(t=>t.kind===`Action`&&t.actionId===e.actionId?{...t,state:e.state,decidedDateTimeUtc:e.decidedDateTimeUtc,note:e.note}:t)}))}),Je=async()=>{try{H({openTickets:await o.listOpenTickets()})}catch{}},Ye=async()=>{let e;try{e=await o.getProfile(p.screen)}catch(e){H({profileError:f(e)});return}let t=s(e,p.narrow);if(H({profile:e,profileError:null,features:t,messagesLeftToday:e.messagesLeftToday}),t.OpenTickets&&Je(),t.ResumeLast&&t.History)try{let e=await o.listConversations({page:1,pageSize:1});H({lastConversation:e.items[0]??null})}catch{}p.conversationId&&await lt(p.conversationId)},Xe=()=>(x||=Ye(),x),Ze=async e=>{let t=typeof e==`string`?e.trim():``,n=_.attachments.filter(e=>e.status===`Ready`);if(t===``&&n.length===0||_.streaming||_.attachments.some(e=>e.status===`Uploading`))return;let r=_.messages,i=null;if(_.editing){let e=_.messages.findIndex(e=>e.id===_.editing?.messageId),t=_.messages[e];if(!t?.stored)return;i=t.id,r=_.messages.slice(0,e)}let a=n.map(e=>Le(e.key));await Q({wireText:t===``?null:t,displayText:t,quickReplyId:null,replacesMessageId:i,attachments:a},r,!0)},Qe=async e=>{e.action!==`Send`||I()||(e.id===`handoff.request`&&_.features.HumanHandoff&&_.conversationId!==null&&!_.handoffPending?await $():await Q({wireText:null,displayText:e.label,quickReplyId:e.id,replacesMessageId:null,attachments:[]},_.messages,!1))},$e=async(t,n,r=null)=>{if(_.streaming)return{ok:!1,errors:{},message:m.errorGeneric};let i=v,a=new u.AbortController,s=()=>i===v&&!a.signal.aborted;y=a,Ne(t,n);let c=t===_.handoffContactRequestId;H({streaming:!0,thinking:!0});try{let e=await Be();await o.answerInput(t,{values:n,codes:r,captchaToken:e,attribution:p.attribution?.()??null},{signal:a.signal,onEvent:e=>X(e,`turn`,s)})}catch(t){return W(),H({thinking:!1,streaming:!1}),a.signal.aborted?{ok:!1,errors:{},message:m.errorGeneric}:t instanceof e&&t.code===`validation_failed`?{ok:!1,errors:t.errors??{},message:t.message}:t instanceof e&&t.code===`input_request_closed`?(await Z(),{ok:!1,errors:{},message:t.message}):{ok:!1,errors:{},message:f(t).message}}finally{y===a&&(y=null)}return await P,s()&&(W(),H({thinking:!1,streaming:!1}),p.onEvent?.(`inputSubmitted`,{requestId:t}),await Z(),c&&(H({handoffContactRequestId:null}),await $().catch(K))),{ok:!0}},et=async e=>{let t=await o.confirmAction(e);qe(t),p.onEvent?.(`chatActionConfirmed`,{actionId:t.actionId,kind:t.actionKind}),await Z()},tt=async(e,t)=>{qe(await o.rejectAction(e,t)),await Z()},nt=()=>{if(!_.streaming)return;G();let e=y;y=null,e?.abort(),H({messages:_.messages.filter(e=>!e.streaming),thinking:!1,streaming:!1,stopped:!0,steps:[],pending:null})},rt=async()=>{if(_.streaming||_.turnError===null&&!_.stopped)return;let e=se(_.messages,e=>e.author.kind===`Visitor`);e<0||await Q(_e(_.messages[e]),_.messages.slice(0,e),!1)},it=async()=>{if(I())return;let e=se(_.messages,e=>e.author.kind===`Visitor`&&e.stored);if(e<0)return;let t=_.messages[e];await Q({..._e(t),replacesMessageId:t.id},_.messages.slice(0,e),!1)},at=e=>{let t=_.messages.find(t=>t.id===e);t?.stored&&t.author.kind===`Visitor`&&(q(),H({editing:{messageId:e,text:ce(t.parts)},attachments:[]}))},ot=()=>{_.editing&&(q(),H({editing:null,attachments:[]}))},st=async e=>{let t=_.profile;if(!t||!_.features.Attachments)return;let n=t.limits,r=n.maxAttachments-_.attachments.filter(e=>e.status!==`Failed`).length,i=[],a=[];for(let t of e){let e=le(t);xe+=1;let o=`file-${xe}`,s={key:o,fileName:e.fileName,contentType:e.contentType,length:e.length??0};r<=0?i.push({...s,status:`Failed`,progress:null,error:m.attachmentLimit(n.maxAttachments)}):e.length!==null&&e.length>n.maxFileBytes||!n.contentTypes.includes(e.contentType)?i.push({...s,status:`Failed`,progress:null,error:m.attachmentFailed}):(--r,i.push({...s,status:`Uploading`,progress:0,error:null}),a.push({key:o,file:t}))}H({attachments:[..._.attachments,...i]}),await Promise.all(a.map(({key:e,file:t})=>Re(e,t)))},ct=async e=>{let t=T.get(e);t&&(T.delete(e),t.abort());let n=w.has(e)?C.get(e):void 0;n&&await o.deleteAttachment(n.publicId),w.delete(e),C.delete(e),H({attachments:_.attachments.filter(t=>t.key!==e)})};async function lt(e){Ie();let t=v;H({messages:[],conversationId:null,loadError:null,loading:!0,editing:null,thinking:!1,streaming:!1,steps:[],turnError:null,stopped:!1});try{let n=await o.getConversation(e);if(t!==v)return;let r=n.messages.map(e=>ae(e,!0));z(),je(r),H({messages:r,conversationId:n.publicId,title:n.title,conversationState:n.state,continuesConversationId:n.continuesConversationId})}catch(e){if(t!==v)return;H({loadError:f(e)})}finally{t===v&&H({loading:!1})}}let ut=async()=>{let e=_.lastConversation;e&&await lt(e.publicId)},dt=()=>{q(),Ie(),G(),z(),H({messages:[],conversationId:null,title:null,conversationState:`Open`,continuesConversationId:null,loadError:null,loading:!1,editing:null,attachments:[],thinking:!1,streaming:!1,steps:[],turnError:null,stopped:!1,pending:null}),_.features.OpenTickets&&Je()},ft=(e,t,n)=>{H({messages:J(e,e=>({...e,rating:t,ratingNote:n}))})},pt=async(e,t,n)=>{let r=_.messages.find(t=>t.id===e);if(!r?.stored)throw Error(`Only a stored reply can be rated.`);let i={rating:r.rating,ratingNote:r.ratingNote},a=typeof n==`string`&&n.trim()?n.trim():null;ft(e,t,a);try{await o.rateMessage(e,{rating:t,note:a})}catch(t){throw ft(e,i.rating,i.ratingNote),t}p.onEvent?.(`rated`,{messageId:e,rating:t})},mt=e=>{let t=_.open,n=e?.trigger??`manual`,r=e?.draft,i={open:!0};typeof r==`string`&&r.trim()!==``&&(i.draft=r),!t&&n===`auto`&&h?.set(`wchat:auto-opened`,`1`),H(i),t||p.onEvent?.(`chatOpened`,{layout:p.layout??null,trigger:n})},ht=e=>{_.open&&(h?.set(`wchat:dismissed`,`1`),H({open:!1}),p.onEvent?.(`chatClosed`,{layout:p.layout??null,reason:e}))},gt=e=>{h?.set(`wchat:muted`,e?`1`:`0`),H({muted:e}),p.onEvent?.(`chatSoundToggled`,{muted:e})},_t=async e=>{I()||(e===_.handoffContactRequestId&&H({handoffContactRequestId:null}),p.onEvent?.(`chatLeadSkipped`,{requestId:e}),await Q({wireText:null,displayText:m.skip,quickReplyId:`lead.skip`,replacesMessageId:null,attachments:[]},_.messages,!1))},vt=async()=>{I()||(p.onEvent?.(`chatLeadCancelled`,{}),await Q({wireText:null,displayText:m.cancel,quickReplyId:`lead.cancel`,replacesMessageId:null,attachments:[]},_.messages,!1))},yt=async(e,t)=>{I()||_.messages.some(t=>t.parts.some(t=>t.kind===`Action`&&t.actionId===e))&&await Q({wireText:null,displayText:m.editSomething,quickReplyId:`lead.edit:${t}`,replacesMessageId:null,attachments:[]},_.messages,!1)},$=async t=>{if(!_.features.HumanHandoff)throw new e(`chat_feature_off`,n.errorGeneric,403);let r=_.conversationId;if(r===null)throw new e(`conversation_required`,n.errorGeneric);if(_.streaming||_.handoffPending)throw new e(`busy`,n.errorGeneric);let i=new u.AbortController;j=i,H({handoffPending:!0}),p.onEvent?.(`chatHandoffRequested`,{conversationId:r});let a=null;try{a=fe((await o.requestHandoff({conversationId:r,reason:t??null},{signal:i.signal,onEvent:e=>X(e,`handoff`,()=>!i.signal.aborted)})).parts)}catch(e){throw H({messages:_.messages.filter(e=>!e.streaming),handoffPending:!1}),e}finally{j===i&&(j=null)}H({handoffPending:!1,handoffContactRequestId:a}),await Z(),p.onEvent?.(`chatHandoff`,{destination:`person`})},bt=()=>{let e=_.conversationId;if(!_.features.HumanHandoff||e===null||_.conversationState!==`WithAgent`)return;let t=Date.now();k!==null&&t-k<te||(k=t,o.sendTyping(e).catch(()=>void 0))},xt=e=>{we=e,V()},St=()=>{_.live===`Lost`&&Pe()&&(B(null),V())},Ct=e=>{if(p.reducedMotion?.()===!0)return ne;let t=e.navigateAfterMs;if(typeof t==`number`&&Number.isFinite(t)&&t>=0)return t;let n=_.profile?.experience.pacing.handoffPauseMs;return typeof n==`number`&&Number.isFinite(n)?n:re},wt=()=>{R(),_.handoffPause&&H({handoffPause:!1})};return{client:o,getState:()=>_,subscribe:e=>(g.add(e),x||Xe(),()=>{g.delete(e)}),load:Xe,submit:Ze,chooseQuickReply:Qe,answerInput:$e,confirmAction:et,rejectAction:tt,stop:nt,retry:rt,regenerate:it,startEdit:at,cancelEdit:ot,attach:st,removeAttachment:ct,openConversation:lt,resumeLast:ut,newConversation:dt,rate:pt,open:mt,close:ht,setMuted:gt,skipField:_t,cancelLead:vt,editLeadField:yt,requestHandoff:$,notifyTyping:bt,setLiveActive:xt,resumeLive:St,beginHandoff:(e,t)=>{_.handoffPause||(H({handoffPause:!0}),p.onEvent?.(`chatHandoff`,{destination:e.id}),A=u.setTimeout(()=>{A=null;try{t()}catch(e){wt(),K(e)}},Ct(e)))},endHandoffPause:wt,consumeDraft:()=>{_.draft!==null&&H({draft:null})},loadAttachmentUrl:t=>{let n=N.get(t);if(n)return n;let r=(async()=>{let n=u.Blob,r=u.URL;if(!n||typeof r?.createObjectURL!=`function`)throw new e(`unsupported`,m.errorGeneric);let i=await o.getAttachment(t);if(Te)throw new e(`aborted`,m.errorGeneric);let a=r.createObjectURL(new n([i]));return Ee.add(a),a})();return N.set(t,r),r.catch(()=>{N.get(t)===r&&N.delete(t)}),r},reset:()=>{q(),G(),Ie(),x=null,P=Promise.resolve(),F=0,Ce.clear(),Se=null,z(),L(),R(),H(ve(h))},dispose:()=>{g.clear(),Te=!0,v+=1;let e=y;y=null,e?.abort(),j?.abort(),j=null,R(),L(),B(null),q(),G();for(let e of Ee)u.URL?.revokeObjectURL?.(e);Ee.clear(),N.clear(),H({attachments:[],editing:null,agentTyping:null})}}},ye=e=>{let t=-1;for(let n=e.length-1;n>=0;--n)if(e[n].parts.some(e=>e.kind===`Handoff`)){t=n;break}let n=/* @__PURE__ */ new Set;for(let r=0;r<t;r+=1)n.add(e[r].id);return n},h=(e,t)=>({get features(){return e.getState().features},labels:t.labels,get isLast(){let n=e.getState().messages;return n[n.length-1]?.id===t.messageId},get busy(){let t=e.getState();return t.streaming||t.thinking},get handoffPause(){return e.getState().handoffPause},get handoffSettled(){return ye(e.getState().messages).has(t.messageId)},chooseQuickReply(t){e.chooseQuickReply(t)},skipInput(t){e.skipField(t)},cancelLead(){e.cancelLead()},answerInput:(t,n,r)=>e.answerInput(t,n,r),uploadInputFile:async(t,n)=>(await e.client.uploadAttachment(t,n?{onProgress:n}:{})).publicId,sendOtp:(t,n)=>e.client.sendOtp(t,n),confirmAction:t=>e.confirmAction(t),rejectAction:(t,n)=>e.rejectAction(t,n),requestHandoff:t=>e.requestHandoff(t),beginHandoff:(t,n)=>e.beginHandoff(t,n),readAttachment:t=>e.client.getAttachment(t),loadAttachmentUrl:t=>e.loadAttachmentUrl(t),...t.openAttachment?{openAttachment:t.openAttachment}:{},...t.openRecord?{openRecord:t.openRecord}:{},...t.openTicket?{openTicket:t.openTicket}:{},...t.attachmentUrl?{attachmentUrl:t.attachmentUrl}:{},...t.handoffHosts?{handoffHosts:t.handoffHosts}:{},...t.openCitation?{openCitation:t.openCitation}:{},...t.isCitation?{isCitation:t.isCitation}:{},...t.openTarget?{openTarget:t.openTarget}:{},...t.onNavigate?{onNavigate:t.onNavigate}:{}});export{m as createChatSession,h as createTurnApi,ye as handoffSettledIds};
|
|
3
|
+
`),p=e=>e.flatMap(e=>e.kind===`File`?[{publicId:e.attachmentId,fileName:e.fileName,contentType:e.contentType,length:e.length}]:[]),le=e=>{let t=d(e);return{fileName:typeof t.name==`string`?t.name:``,contentType:typeof t.type==`string`?t.type:``,length:typeof t.size==`number`?t.size:null}},ue=(e,t)=>e.length===t.length&&e.every((e,n)=>e.id===t[n].id&&e.label===t[n].label&&e.message===t[n].message),de=e=>{for(let t of e){if(!t.startsWith(`Enquiry type:`))continue;let e=t.slice(13).trim();return e===``?null:e}return null},fe=e=>e.some(e=>e.kind===`Handoff`)?null:e.find(e=>e.kind===`InputRequest`)?.requestId??null,pe=(e,t)=>e.some(e=>e.parts.some(e=>e.kind===`InputRequest`&&e.requestId===t&&(e.state===`Skipped`||e.state===`Expired`))),me=(e,t)=>{if(t!==`WithAgent`)return null;for(let t=e.length-1;t>=0;--t){let n=e[t];for(let e=n.parts.length-1;e>=0;--e){let t=n.parts[e];if(t.kind===`Handoff`){if(t.state===`Left`||t.state===`Ended`)return null;if(t.state===`Joined`&&t.agent)return t.agent}}if(n.author.kind===`Agent`)return{displayName:n.author.displayName??``,avatarUrl:n.author.avatarUrl}}return null},he=(e,t)=>{(e.cursor===null||t>e.cursor)&&(e.cursor=t)},ge=(e,t)=>{let n=[];e!==``&&n.push({kind:`Text`,text:e});for(let e of t)n.push({kind:`File`,attachmentId:e.publicId,fileName:e.fileName,contentType:e.contentType,length:e.length});return n},_e=e=>{let t=ce(e.parts);return{wireText:t===``?null:t,displayText:t,quickReplyId:null,replacesMessageId:null,attachments:p(e.parts)}},ve=e=>({profile:null,profileError:null,features:o(),conversationId:null,conversationState:`Open`,title:null,continuesConversationId:null,messages:[],thinking:!1,steps:[],streaming:!1,loading:!1,loadError:null,turnError:null,stopped:!1,messagesLeftToday:null,editing:null,attachments:[],lastConversation:null,open:!1,muted:e?.get(`wchat:muted`)===`1`,greeting:null,starters:[],pending:null,agent:null,agentTyping:null,live:`Off`,handoffPending:!1,handoffContactRequestId:null,handoffPause:!1,openTickets:[],draft:null}),m=(o,p)=>{let m=r(p.labels),ye=p.schedule??ie,h=p.prefs,g=/* @__PURE__ */ new Set,_=ve(h),v=0,y=null,b=null,be=0,xe=0,Se=null,x=null,S=/* @__PURE__ */ new Map,Ce=/* @__PURE__ */ new Set,C=/* @__PURE__ */ new Map,w=/* @__PURE__ */ new Set,T=/* @__PURE__ */ new Map,E={name:null,email:null,phone:null},D=/* @__PURE__ */ new Set,O=null,k=null,A=null,j=null,M=null,we=!0,Te=!1,Ee=/* @__PURE__ */ new Set,N=/* @__PURE__ */ new Map,P=Promise.resolve(),F=0,De=()=>p.pathname?.()??u.location?.pathname??`/`,Oe=()=>p.reducedMotion?.()===!0||_.profile?.experience.motion===!1,I=()=>_.streaming||_.thinking,ke=e=>{if(!e.profile)return{...e,greeting:null,starters:[]};let t=De(),n=e.lastConversation!==null,r=c(e.profile,{pathname:t,returning:n}).greeting,i=l(e.profile.start,{pathname:t,returning:n,behaviour:p.behaviour?.()??null,behaviourStarters:e.features.BehaviourStarters});return{...e,greeting:r,starters:ue(e.starters,i)?e.starters:i}},L=()=>{O!==null&&(u.clearTimeout(O),O=null)},R=()=>{A!==null&&(u.clearTimeout(A),A=null)},Ae=e=>e.flatMap(e=>e.parts.flatMap(e=>e.kind===`Action`&&e.actionKind===`ChatLeadCapture`&&e.state===`Done`?[{actionId:e.actionId,leadType:de(e.lines)}]:[])),z=()=>{E.name=null,E.email=null,E.phone=null,D.clear()},je=e=>{for(let t of Ae(e))D.add(t.actionId)},Me=()=>{for(let e of Ae(_.messages))D.has(e.actionId)||(D.add(e.actionId),p.onEvent?.(`leadSubmitted`,{conversationId:_.conversationId,fields:{name:E.name,email:E.email,phone:E.phone},leadType:e.leadType}))},Ne=(e,t)=>{let n=_.messages.flatMap(e=>e.parts).find(t=>t.kind===`InputRequest`&&t.requestId===e);if(n)for(let e of n.fields){let n=t[e.key];typeof n==`string`&&n.trim()!==``&&(e.type===`Email`?E.email=n.trim():e.type===`Phone`?E.phone=n.trim():(e.type===`Name`||e.key.toLowerCase()===`name`)&&(E.name=n.trim()))}},B=e=>{let t=M;t!==null&&(M=null,t.handle?.stop(),e!==null&&H({live:e}))},Pe=()=>!Te&&we&&_.features.HumanHandoff&&_.conversationId!==null&&(_.conversationState===`WaitingForAgent`||_.conversationState===`WithAgent`),V=()=>{if(!Pe()){M!==null&&B(`Off`);return}let e=_.conversationId;if(e===null||M!==null&&M.conversationId===e)return;B(null);let t={conversationId:e,cursor:null,handle:null};M=t;let n=i({watch:(n,r,i)=>o.watchConversation(e,{afterSequence:n,signal:r,onCursor:e=>he(t,e),onEvent:e=>{i(),M===t&&(e.name===`messageCompleted`&&he(t,e.data.message.sequence),X(e,`live`,()=>M===t))}}),beforeReconnect:()=>Z(),getCursor:()=>{let e=t.cursor;for(let t of _.messages)t.sequence!==null&&(e===null||t.sequence>e)&&(e=t.sequence);return e},onStatus:e=>{M===t&&_.live!==e&&H({live:e})},onError:e=>K(e)});t.handle=n,M!==t&&n.stop()},H=e=>{let t={..._,...e};_.conversationState===`WithAgent`&&t.conversationState!==`WithAgent`&&t.agentTyping!==null&&(L(),t.agentTyping=null),(e.messages!==void 0||e.conversationState!==void 0)&&(t.agent=me(t.messages,t.conversationState)),e.messages!==void 0&&t.handoffContactRequestId!==null&&pe(t.messages,t.handoffContactRequestId)&&(t.handoffContactRequestId=null),_=ke(t);for(let e of g)e();e.messages!==void 0&&Me(),V()},U=(e,t)=>H({attachments:_.attachments.map(n=>n.key===e?{...n,...t}:n)}),W=()=>{if(S.size===0)return;let e=[...S.values()];S.clear(),H({messages:_.messages.map(t=>{let n=e.filter(e=>e.messageId===t.id);if(n.length===0)return t;let r=t.parts.map((e,t)=>{let r=n.filter(e=>e.index===t).map(e=>e.text).join(``);return e.kind===`Text`&&r!==``?{...e,text:e.text+r}:e});return{...t,parts:r}})})},G=()=>{S.clear(),b?.(),b=null},Fe=(e,t,n)=>{let r=`${e}#${t}`,i=S.get(r);S.set(r,{messageId:e,index:t,text:(i?.text??``)+n}),b||=ye(()=>{b=null,W()})},Ie=()=>{W(),v+=1,y?.abort(),y=null},K=e=>{if(p.onError)p.onError(e);else throw e},q=()=>{for(let e of T.values())e.abort();T.clear();for(let e of w){let t=C.get(e);t&&o.deleteAttachment(t.publicId).catch(K)}w.clear(),C.clear()},Le=e=>{let t=C.get(e);if(!t)throw Error(`No uploaded file for composer attachment ${e}.`);return t},Re=async(e,t)=>{let n=new u.AbortController;T.set(e,n);let r;try{r=await o.uploadAttachment(t,{signal:n.signal,onProgress:t=>{T.get(e)===n&&U(e,{progress:t})}})}catch{T.get(e)===n&&(T.delete(e),U(e,{status:`Failed`,progress:null,error:m.attachmentFailed}));return}T.get(e)===n?(T.delete(e),C.set(e,r),w.add(e),U(e,{status:`Ready`,progress:null})):o.deleteAttachment(r.publicId).catch(K)},ze=e=>{let t={...d(p.pageContext?.()),path:De(),behaviour:p.behaviour?.()??null};return e&&(t.attribution=p.attribution?.()??null),t},Be=async()=>{let t=_.profile?.captcha;if(!t||!p.getCaptchaToken||t.mode===`Off`&&!t.siteKey)return null;let n=null;try{n=await p.getCaptchaToken(t.action)}catch{}if(!n)throw new e(`captcha_unavailable`,m.captchaUnavailable);return n},Ve=(e,t,n)=>{let r=oe(_.messages,ae(e,!1));H(n?{messages:r,messagesLeftToday:t??_.messagesLeftToday,steps:[],thinking:!1}:{messages:r})},He=e=>{let n=_.profile?.experience.pacing;return!n||Ce.has(e.publicId)||e.author.kind!==`Assistant`&&e.author.kind!==`Script`?0:a(t(e.parts),n,Oe())},Ue=(e,t,n,r,i)=>{F+=1,H({pending:{typing:!0,authorKind:e.author.kind}}),P=P.then(()=>new Promise(e=>u.setTimeout(e,n))).then(()=>{--F,r()&&Ve(e,t,i),F===0&&H({pending:null})})},We=(e,t,n)=>{let r=[...e];return r[t]=n,r},J=(e,t)=>_.messages.map(n=>n.id===e?t(n):n),Y=e=>_.messages.some(t=>t.id===e),Ge=()=>{L(),_.agentTyping!==null&&H({agentTyping:null})},Ke=e=>{L(),O=u.setTimeout(()=>{O=null,H({agentTyping:null})},ee),H({agentTyping:{displayName:e}})},X=(e,t,n)=>{if(!n())return;let r=t===`turn`;if(e.name===`partDelta`)Ce.add(e.data.messageId),Fe(e.data.messageId,e.data.index,e.data.text);else switch(W(),e.name){case`messageStarted`:{let t=e.data.message;if(t.author.kind===`Agent`&&Ge(),Y(t.publicId))break;H({messages:[..._.messages,{id:t.publicId,author:t.author,createdDateTimeUtc:t.createdDateTimeUtc,parts:[...t.parts],sequence:t.sequence,rating:t.rating,ratingNote:t.ratingNote,streaming:!0,stored:!1,restored:!1}]});break}case`partStarted`:{let{messageId:t,index:n,part:i}=e.data;if(!Y(t))break;H({messages:J(t,e=>({...e,parts:We(e.parts,n,i)})),...r?{thinking:!1}:{}});break}case`partCompleted`:{let{messageId:t,index:n,part:r}=e.data;if(!Y(t))break;H({messages:J(t,e=>({...e,parts:We(e.parts,n,r)}))});break}case`messageReset`:{let{messageId:t}=e.data;if(!Y(t))break;for(let e of[...S.keys()])S.get(e)?.messageId===t&&S.delete(e);H({messages:J(t,e=>({...e,parts:[]})),...r?{thinking:!0,steps:[]}:{}});break}case`step`:{if(!r)break;let t=e.data.label;_.steps[_.steps.length-1]!==t&&H({steps:[..._.steps,t]});break}case`messageCompleted`:{let{message:t,messagesLeftToday:i}=e.data;t.author.kind===`Agent`&&Ge();let a=He(t);a>0||F>0?Ue(t,i,a,n,r):Ve(t,i,r);break}case`conversationUpdated`:{let t=e.data;H({conversationId:t.conversationId,conversationState:t.state,title:t.title,continuesConversationId:t.continuesConversationId});break}case`typing`:e.data.authorKind===`Agent`&&Ke(e.data.displayName)}},Z=async()=>{let e=_.conversationId;if(e===null)return;let t=v;try{let n=await o.getConversation(e);if(t!==v)return;let r=new Set(_.messages.filter(e=>e.restored).map(e=>e.id));H({messages:n.messages.map(e=>ae(e,r.has(e.publicId))),title:n.title,conversationState:n.state,continuesConversationId:n.continuesConversationId})}catch(e){K(e)}},Q=async(e,t,n)=>{let r=v,i=new u.AbortController,a=()=>r===v&&!i.signal.aborted;y=i;let s=_.conversationId===null;be+=1;let c={id:`local-${be}`,author:{kind:`Visitor`,displayName:null,avatarUrl:null},createdDateTimeUtc:(/* @__PURE__ */ new Date()).toISOString(),parts:ge(e.displayText,e.attachments),sequence:null,rating:null,ratingNote:null,streaming:!1,stored:!1,restored:!1};n&&(w.clear(),C.clear()),H({messages:[...t,c],thinking:!0,streaming:!0,steps:[],turnError:null,stopped:!1,...n?{editing:null,attachments:[]}:{}});try{let t=await Be();await o.send({conversationId:_.conversationId,text:e.wireText,quickReplyId:e.quickReplyId,attachmentIds:e.attachments.map(e=>e.publicId),replacesMessageId:e.replacesMessageId,pageContext:ze(s),captchaToken:t},{signal:i.signal,onEvent:e=>X(e,`turn`,a)})}catch(e){if(W(),!a())return;let t=f(e);H({messages:_.messages.filter(e=>!e.streaming),thinking:!1,streaming:!1,turnError:t,...t.code===`daily_limit`?{messagesLeftToday:0}:{},...t.code===`conversation_not_found`?{conversationId:null}:{}});return}finally{y===i&&(y=null)}if(await P,!a())return;W(),H({thinking:!1,streaming:!1}),await Z();let l=_.conversationId;s&&l!==null&&l!==Se&&(Se=l,p.onEvent?.(`chatStarted`,{conversationId:l}))},qe=e=>H({messages:_.messages.map(t=>({...t,parts:t.parts.map(t=>t.kind===`Action`&&t.actionId===e.actionId?{...t,state:e.state,decidedDateTimeUtc:e.decidedDateTimeUtc,note:e.note}:t)}))}),Je=async()=>{try{H({openTickets:await o.listOpenTickets()})}catch{}},Ye=async()=>{let e;try{e=await o.getProfile(p.screen)}catch(e){H({profileError:f(e)});return}let t=s(e,p.narrow);if(H({profile:e,profileError:null,features:t,messagesLeftToday:e.messagesLeftToday}),t.OpenTickets&&Je(),t.ResumeLast&&t.History)try{let e=await o.listConversations({page:1,pageSize:1});H({lastConversation:e.items[0]??null})}catch{}p.conversationId&&await ut(p.conversationId)},Xe=()=>(x||=Ye(),x),Ze=async e=>{let t=typeof e==`string`?e.trim():``,n=_.attachments.filter(e=>e.status===`Ready`);if(t===``&&n.length===0||_.streaming||_.attachments.some(e=>e.status===`Uploading`))return;let r=_.messages,i=null;if(_.editing){let e=_.messages.findIndex(e=>e.id===_.editing?.messageId),t=_.messages[e];if(!t?.stored)return;i=t.id,r=_.messages.slice(0,e)}let a=n.map(e=>Le(e.key));await Q({wireText:t===``?null:t,displayText:t,quickReplyId:null,replacesMessageId:i,attachments:a},r,!0)},Qe=async e=>{e.action!==`Send`||I()||(e.id===`handoff.request`&&_.features.HumanHandoff&&_.conversationId!==null&&!_.handoffPending?await $():await Q({wireText:null,displayText:e.label,quickReplyId:e.id,replacesMessageId:null,attachments:[]},_.messages,!1))},$e=async(e,t)=>{let n=await Be();await o.sendOtp(e,{...t,captchaToken:n})},et=async(t,n,r=null)=>{if(_.streaming)return{ok:!1,errors:{},message:m.errorGeneric};let i=v,a=new u.AbortController,s=()=>i===v&&!a.signal.aborted;y=a,Ne(t,n);let c=t===_.handoffContactRequestId;H({streaming:!0,thinking:!0});try{let e=await Be();await o.answerInput(t,{values:n,codes:r,captchaToken:e,attribution:p.attribution?.()??null},{signal:a.signal,onEvent:e=>X(e,`turn`,s)})}catch(t){return W(),H({thinking:!1,streaming:!1}),a.signal.aborted?{ok:!1,errors:{},message:m.errorGeneric}:t instanceof e&&t.code===`validation_failed`?{ok:!1,errors:t.errors??{},message:t.message}:t instanceof e&&t.code===`input_request_closed`?(await Z(),{ok:!1,errors:{},message:t.message}):{ok:!1,errors:{},message:f(t).message}}finally{y===a&&(y=null)}return await P,s()&&(W(),H({thinking:!1,streaming:!1}),p.onEvent?.(`inputSubmitted`,{requestId:t}),await Z(),c&&(H({handoffContactRequestId:null}),await $().catch(K))),{ok:!0}},tt=async e=>{let t=await o.confirmAction(e);qe(t),p.onEvent?.(`chatActionConfirmed`,{actionId:t.actionId,kind:t.actionKind}),await Z()},nt=async(e,t)=>{qe(await o.rejectAction(e,t)),await Z()},rt=()=>{if(!_.streaming)return;G();let e=y;y=null,e?.abort(),H({messages:_.messages.filter(e=>!e.streaming),thinking:!1,streaming:!1,stopped:!0,steps:[],pending:null})},it=async()=>{if(_.streaming||_.turnError===null&&!_.stopped)return;let e=se(_.messages,e=>e.author.kind===`Visitor`);e<0||await Q(_e(_.messages[e]),_.messages.slice(0,e),!1)},at=async()=>{if(I())return;let e=se(_.messages,e=>e.author.kind===`Visitor`&&e.stored);if(e<0)return;let t=_.messages[e];await Q({..._e(t),replacesMessageId:t.id},_.messages.slice(0,e),!1)},ot=e=>{let t=_.messages.find(t=>t.id===e);t?.stored&&t.author.kind===`Visitor`&&(q(),H({editing:{messageId:e,text:ce(t.parts)},attachments:[]}))},st=()=>{_.editing&&(q(),H({editing:null,attachments:[]}))},ct=async e=>{let t=_.profile;if(!t||!_.features.Attachments)return;let n=t.limits,r=n.maxAttachments-_.attachments.filter(e=>e.status!==`Failed`).length,i=[],a=[];for(let t of e){let e=le(t);xe+=1;let o=`file-${xe}`,s={key:o,fileName:e.fileName,contentType:e.contentType,length:e.length??0};r<=0?i.push({...s,status:`Failed`,progress:null,error:m.attachmentLimit(n.maxAttachments)}):e.length!==null&&e.length>n.maxFileBytes||!n.contentTypes.includes(e.contentType)?i.push({...s,status:`Failed`,progress:null,error:m.attachmentFailed}):(--r,i.push({...s,status:`Uploading`,progress:0,error:null}),a.push({key:o,file:t}))}H({attachments:[..._.attachments,...i]}),await Promise.all(a.map(({key:e,file:t})=>Re(e,t)))},lt=async e=>{let t=T.get(e);t&&(T.delete(e),t.abort());let n=w.has(e)?C.get(e):void 0;n&&await o.deleteAttachment(n.publicId),w.delete(e),C.delete(e),H({attachments:_.attachments.filter(t=>t.key!==e)})};async function ut(e){Ie();let t=v;H({messages:[],conversationId:null,loadError:null,loading:!0,editing:null,thinking:!1,streaming:!1,steps:[],turnError:null,stopped:!1});try{let n=await o.getConversation(e);if(t!==v)return;let r=n.messages.map(e=>ae(e,!0));z(),je(r),H({messages:r,conversationId:n.publicId,title:n.title,conversationState:n.state,continuesConversationId:n.continuesConversationId})}catch(e){if(t!==v)return;H({loadError:f(e)})}finally{t===v&&H({loading:!1})}}let dt=async()=>{let e=_.lastConversation;e&&await ut(e.publicId)},ft=()=>{q(),Ie(),G(),z(),H({messages:[],conversationId:null,title:null,conversationState:`Open`,continuesConversationId:null,loadError:null,loading:!1,editing:null,attachments:[],thinking:!1,streaming:!1,steps:[],turnError:null,stopped:!1,pending:null}),_.features.OpenTickets&&Je()},pt=(e,t,n)=>{H({messages:J(e,e=>({...e,rating:t,ratingNote:n}))})},mt=async(e,t,n)=>{let r=_.messages.find(t=>t.id===e);if(!r?.stored)throw Error(`Only a stored reply can be rated.`);let i={rating:r.rating,ratingNote:r.ratingNote},a=typeof n==`string`&&n.trim()?n.trim():null;pt(e,t,a);try{await o.rateMessage(e,{rating:t,note:a})}catch(t){throw pt(e,i.rating,i.ratingNote),t}p.onEvent?.(`rated`,{messageId:e,rating:t})},ht=e=>{let t=_.open,n=e?.trigger??`manual`,r=e?.draft,i={open:!0};typeof r==`string`&&r.trim()!==``&&(i.draft=r),!t&&n===`auto`&&h?.set(`wchat:auto-opened`,`1`),H(i),t||p.onEvent?.(`chatOpened`,{layout:p.layout??null,trigger:n})},gt=e=>{_.open&&(h?.set(`wchat:dismissed`,`1`),H({open:!1}),p.onEvent?.(`chatClosed`,{layout:p.layout??null,reason:e}))},_t=e=>{h?.set(`wchat:muted`,e?`1`:`0`),H({muted:e}),p.onEvent?.(`chatSoundToggled`,{muted:e})},vt=async e=>{I()||(e===_.handoffContactRequestId&&H({handoffContactRequestId:null}),p.onEvent?.(`chatLeadSkipped`,{requestId:e}),await Q({wireText:null,displayText:m.skip,quickReplyId:`lead.skip`,replacesMessageId:null,attachments:[]},_.messages,!1))},yt=async()=>{I()||(p.onEvent?.(`chatLeadCancelled`,{}),await Q({wireText:null,displayText:m.cancel,quickReplyId:`lead.cancel`,replacesMessageId:null,attachments:[]},_.messages,!1))},bt=async(e,t)=>{I()||_.messages.some(t=>t.parts.some(t=>t.kind===`Action`&&t.actionId===e))&&await Q({wireText:null,displayText:m.editSomething,quickReplyId:`lead.edit:${t}`,replacesMessageId:null,attachments:[]},_.messages,!1)},$=async t=>{if(!_.features.HumanHandoff)throw new e(`chat_feature_off`,n.errorGeneric,403);let r=_.conversationId;if(r===null)throw new e(`conversation_required`,n.errorGeneric);if(_.streaming||_.handoffPending)throw new e(`busy`,n.errorGeneric);let i=new u.AbortController;j=i,H({handoffPending:!0}),p.onEvent?.(`chatHandoffRequested`,{conversationId:r});let a=null;try{a=fe((await o.requestHandoff({conversationId:r,reason:t??null},{signal:i.signal,onEvent:e=>X(e,`handoff`,()=>!i.signal.aborted)})).parts)}catch(e){throw H({messages:_.messages.filter(e=>!e.streaming),handoffPending:!1}),e}finally{j===i&&(j=null)}H({handoffPending:!1,handoffContactRequestId:a}),await Z(),p.onEvent?.(`chatHandoff`,{destination:`person`})},xt=()=>{let e=_.conversationId;if(!_.features.HumanHandoff||e===null||_.conversationState!==`WithAgent`)return;let t=Date.now();k!==null&&t-k<te||(k=t,o.sendTyping(e).catch(()=>void 0))},St=e=>{we=e,V()},Ct=()=>{_.live===`Lost`&&Pe()&&(B(null),V())},wt=e=>{if(p.reducedMotion?.()===!0)return ne;let t=e.navigateAfterMs;if(typeof t==`number`&&Number.isFinite(t)&&t>=0)return t;let n=_.profile?.experience.pacing.handoffPauseMs;return typeof n==`number`&&Number.isFinite(n)?n:re},Tt=()=>{R(),_.handoffPause&&H({handoffPause:!1})};return{client:o,getState:()=>_,subscribe:e=>(g.add(e),x||Xe(),()=>{g.delete(e)}),load:Xe,submit:Ze,chooseQuickReply:Qe,answerInput:et,sendOtp:$e,confirmAction:tt,rejectAction:nt,stop:rt,retry:it,regenerate:at,startEdit:ot,cancelEdit:st,attach:ct,removeAttachment:lt,openConversation:ut,resumeLast:dt,newConversation:ft,rate:mt,open:ht,close:gt,setMuted:_t,skipField:vt,cancelLead:yt,editLeadField:bt,requestHandoff:$,notifyTyping:xt,setLiveActive:St,resumeLive:Ct,beginHandoff:(e,t)=>{_.handoffPause||(H({handoffPause:!0}),p.onEvent?.(`chatHandoff`,{destination:e.id}),A=u.setTimeout(()=>{A=null;try{t()}catch(e){Tt(),K(e)}},wt(e)))},endHandoffPause:Tt,consumeDraft:()=>{_.draft!==null&&H({draft:null})},loadAttachmentUrl:t=>{let n=N.get(t);if(n)return n;let r=(async()=>{let n=u.Blob,r=u.URL;if(!n||typeof r?.createObjectURL!=`function`)throw new e(`unsupported`,m.errorGeneric);let i=await o.getAttachment(t);if(Te)throw new e(`aborted`,m.errorGeneric);let a=r.createObjectURL(new n([i]));return Ee.add(a),a})();return N.set(t,r),r.catch(()=>{N.get(t)===r&&N.delete(t)}),r},reset:()=>{q(),G(),Ie(),x=null,P=Promise.resolve(),F=0,Ce.clear(),Se=null,z(),L(),R(),H(ve(h))},dispose:()=>{g.clear(),Te=!0,v+=1;let e=y;y=null,e?.abort(),j?.abort(),j=null,R(),L(),B(null),q(),G();for(let e of Ee)u.URL?.revokeObjectURL?.(e);Ee.clear(),N.clear(),H({attachments:[],editing:null,agentTyping:null})}}},ye=e=>{let t=-1;for(let n=e.length-1;n>=0;--n)if(e[n].parts.some(e=>e.kind===`Handoff`)){t=n;break}let n=/* @__PURE__ */ new Set;for(let r=0;r<t;r+=1)n.add(e[r].id);return n},h=(e,t)=>({get features(){return e.getState().features},labels:t.labels,get isLast(){let n=e.getState().messages;return n[n.length-1]?.id===t.messageId},get busy(){let t=e.getState();return t.streaming||t.thinking},get handoffPause(){return e.getState().handoffPause},get handoffSettled(){return ye(e.getState().messages).has(t.messageId)},chooseQuickReply(t){e.chooseQuickReply(t)},skipInput(t){e.skipField(t)},cancelLead(){e.cancelLead()},answerInput:(t,n,r)=>e.answerInput(t,n,r),uploadInputFile:async(t,n)=>(await e.client.uploadAttachment(t,n?{onProgress:n}:{})).publicId,sendOtp:(t,n)=>e.sendOtp(t,n),confirmAction:t=>e.confirmAction(t),rejectAction:(t,n)=>e.rejectAction(t,n),requestHandoff:t=>e.requestHandoff(t),beginHandoff:(t,n)=>e.beginHandoff(t,n),readAttachment:t=>e.client.getAttachment(t),loadAttachmentUrl:t=>e.loadAttachmentUrl(t),...t.openAttachment?{openAttachment:t.openAttachment}:{},...t.openRecord?{openRecord:t.openRecord}:{},...t.openTicket?{openTicket:t.openTicket}:{},...t.attachmentUrl?{attachmentUrl:t.attachmentUrl}:{},...t.handoffHosts?{handoffHosts:t.handoffHosts}:{},...t.openCitation?{openCitation:t.openCitation}:{},...t.isCitation?{isCitation:t.isCitation}:{},...t.openTarget?{openTarget:t.openTarget}:{},...t.onNavigate?{onNavigate:t.onNavigate}:{}});export{m as createChatSession,h as createTurnApi,ye as handoffSettledIds};
|
package/dist/types/session.d.ts
CHANGED
|
@@ -106,6 +106,7 @@ export interface ChatSession {
|
|
|
106
106
|
submit(text: string): Promise<void>;
|
|
107
107
|
chooseQuickReply(reply: ChatQuickReply): Promise<void>;
|
|
108
108
|
answerInput(requestId: string, values: Record<string, string>, codes?: Record<string, string> | null): Promise<ChatInputOutcome>;
|
|
109
|
+
sendOtp(requestId: string, request: ChatOtpRequest): Promise<void>;
|
|
109
110
|
confirmAction(actionId: string): Promise<void>;
|
|
110
111
|
rejectAction(actionId: string, reason?: string): Promise<void>;
|
|
111
112
|
stop(): void;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webority/chat-core",
|
|
3
|
-
"version": "0.137.
|
|
3
|
+
"version": "0.137.5",
|
|
4
4
|
"description": "The headless Webority Chat engine: the client over the chat routes, the session state machine over message parts, the stream reader, profile resolution with screen narrowing, the default English labels and a fixture client for sandboxes and tests. No DOM and no UI.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
6
6
|
"type": "module",
|