@useago/sdk 1.4.4 → 1.5.2
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/CHANGELOG.md +63 -1
- package/dist/AgoClient-5VGybmvz.cjs +8 -0
- package/dist/AgoClient-DXrH2AMi.js +964 -0
- package/dist/angular.cjs +1 -1
- package/dist/angular.d.cts +124 -5
- package/dist/angular.d.ts +124 -5
- package/dist/angular.js +5 -1
- package/dist/autoContinue-CC8K9mBU.js +63 -0
- package/dist/autoContinue-CP9pJR-V.cjs +1 -0
- package/dist/{createConversationSession-CUkNp6mZ.cjs → createConversationSession-0WTqcCLK.cjs} +1 -1
- package/dist/{createConversationSession-QIBN0gLx.js → createConversationSession-DPrrr70o.js} +1 -1
- package/dist/createFormCollector-1GKKwQV_.cjs +1 -0
- package/dist/{createFormCollector-F3YJfsbg.js → createFormCollector-DYh90kiG.js} +97 -91
- package/dist/devtools.d.cts +82 -5
- package/dist/devtools.d.ts +82 -5
- package/dist/functions-CPs7omgM.cjs +1 -0
- package/dist/helpers.cjs +1 -1
- package/dist/helpers.d.cts +5 -0
- package/dist/helpers.d.ts +5 -0
- package/dist/helpers.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +147 -7
- package/dist/index.d.ts +147 -7
- package/dist/index.js +45 -43
- package/dist/react.cjs +3 -3
- package/dist/react.d.cts +191 -21
- package/dist/react.d.ts +191 -21
- package/dist/react.js +666 -529
- package/dist/testing.cjs +1 -1
- package/dist/testing.d.cts +82 -5
- package/dist/testing.d.ts +82 -5
- package/dist/testing.js +1 -1
- package/dist/vue.cjs +1 -1
- package/dist/vue.d.cts +82 -5
- package/dist/vue.d.ts +82 -5
- package/dist/vue.js +1 -1
- package/dist/widget.cjs +4 -4
- package/dist/widget.d.cts +82 -5
- package/dist/widget.d.ts +82 -5
- package/dist/widget.js +437 -423
- package/llms-full.txt +100 -6
- package/package.json +1 -1
- package/dist/AgoClient-CLmtYTJx.cjs +0 -8
- package/dist/AgoClient-Ozz2b1dQ.js +0 -912
- package/dist/createFormCollector-DHT1ObOb.cjs +0 -1
- package/dist/functions-Djnq-JAo.cjs +0 -1
- package/dist/rolldown-runtime-16Nf8qvH.cjs +0 -1
- /package/dist/{createMockClient-BSr-UV8R.cjs → createMockClient-C-wrjb2C.cjs} +0 -0
- /package/dist/{createMockClient-bAZ9KBHC.js → createMockClient-we-XoPom.js} +0 -0
- /package/dist/{functions-CApuQZ2b.js → functions-tzyOZNp6.js} +0 -0
package/dist/widget.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const se=require("./AgoClient-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const se=require("./AgoClient-5VGybmvz.cjs"),mt=require("./createFormCollector-1GKKwQV_.cjs"),Xt=require("./createConversationSession-0WTqcCLK.cjs");var Yt='"IBM Plex Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',Ie=`var(--ago-font, ${Yt})`,gt={font:"--ago-font",radius:"--ago-radius",messageRadius:"--ago-message-radius",brand:"--ago-brand-color",brandText:"--ago-brand-text-color",headerBg:"--ago-header-background",headerText:"--ago-header-text-color",panelBg:"--ago-panel-background",messagesBg:"--ago-messages-background",text:"--ago-text-color",mutedText:"--ago-muted-text-color",border:"--ago-border-color",accent:"--ago-accent-color",agentBubbleBg:"--ago-agent-bubble-background"},_e="var(--ago-brand-color, #03182f)",Le="var(--ago-brand-text-color, #fff)",Qt="var(--ago-header-background, var(--ago-brand-color, #03182f))",ht="var(--ago-header-text-color, #e8f0fe)",te="var(--ago-panel-background, #fff)",Ct="var(--ago-messages-background, #fbfbfb)",ee="var(--ago-text-color, #30373e)",Et="var(--ago-muted-text-color, #6b6d6f)",N="var(--ago-border-color, #dee3e8)",Fe="var(--ago-accent-color, #1b5fc4)",xt="var(--ago-agent-bubble-background, #f1f3f5)",Zt="var(--ago-radius, 16px)",Pe="var(--ago-message-radius, 16px)",Jt="var(--ago-message-radius, 20px)";function en(t,o){if(o)for(const i of Object.keys(gt)){const r=o[i];r!=null&&t.style.setProperty(gt[i],r)}}function v(t,o){Object.assign(t.style,o)}function h(t={}){const o=document.createElement("div");return v(o,t),o}var bt="ago-chat-widget-keyframes";function tn(){if(typeof document>"u"||document.getElementById(bt))return;const t=document.createElement("style");t.id=bt,t.textContent="@keyframes ago-pulse { 0%, 80%, 100% { opacity: 0.3; transform: scale(0.8); } 40% { opacity: 1; transform: scale(1); } }@keyframes ago-spin { to { transform: rotate(360deg); } }",document.head.appendChild(t)}function nn(t){let o=[];const i=document.createElement("form");v(i,{display:"flex",flexDirection:"column",gap:"8px",padding:"12px",borderTop:`1px solid ${N}`,backgroundColor:te}),i.className="ago-chat-input";const r=h({display:"flex",flexWrap:"wrap",gap:"6px"}),b=h({display:"flex",gap:"8px",alignItems:"flex-end"}),a=document.createElement("textarea");a.placeholder=t.placeholder,a.setAttribute("aria-label",t.placeholder),a.rows=1,v(a,{flex:"1",resize:"none",boxSizing:"border-box",padding:"10px 12px",border:`1px solid ${N}`,borderRadius:"12px",fontSize:"16px",fontFamily:Ie,lineHeight:"1.4",maxHeight:"110px",overflowY:"hidden"});const C=()=>{a.style.height="auto";const c=Math.min(a.scrollHeight+2,110);a.style.height=`${c}px`,a.style.overflowY=a.scrollHeight+2>110?"auto":"hidden"};a.addEventListener("input",()=>{C(),I()});const m='<svg width="18" height="18" viewBox="0 -960 960 960" fill="currentColor" aria-hidden="true"><path d="M440-160v-487L216-423l-56-57 320-320 320 320-56 57-224-224v487h-80Z"/></svg>',x='<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true" style="animation: ago-spin 0.8s linear infinite"><path d="M21 12a9 9 0 1 1-6.219-8.56"/></svg>',p=document.createElement("button");p.type="submit",p.setAttribute("aria-label","Send"),p.innerHTML=m,v(p,{flexShrink:"0",width:"40px",height:"40px",padding:"0",border:"none",borderRadius:"50%",backgroundColor:_e,color:Le,display:"flex",alignItems:"center",justifyContent:"center",cursor:"pointer"});let f=!1;const I=()=>{const l=a.value.trim()!==""||o.length>0,c=f||!l;p.disabled=c,p.innerHTML=f?x:m,p.style.opacity=c&&!f?"0.5":"1",p.style.cursor=c?"default":"pointer"};let R=null,A=null;t.allowFiles&&(R=document.createElement("input"),R.type="file",R.multiple=!0,v(R,{display:"none"}),A=document.createElement("button"),A.type="button",A.setAttribute("aria-label","Attach file"),A.textContent="📎",v(A,{padding:"10px 12px",border:`1px solid ${N}`,borderRadius:"12px",backgroundColor:te,cursor:"pointer",fontSize:"14px"}),A.addEventListener("click",()=>R?.click()),R.addEventListener("change",()=>{o=[...o,...Array.from(R?.files??[])],Q()}));function Q(){r.replaceChildren(),o.forEach((l,c)=>{const w=h({display:"flex",alignItems:"center",gap:"4px",padding:"4px 8px",backgroundColor:"#f0f4ff",border:`1px solid ${N}`,borderRadius:"8px",fontSize:"12px"}),B=document.createElement("span");B.textContent=l.name;const k=document.createElement("button");k.type="button",k.setAttribute("aria-label",`Remove ${l.name}`),k.textContent="×",v(k,{border:"none",background:"transparent",cursor:"pointer",fontSize:"14px",lineHeight:"1"}),k.addEventListener("click",()=>{o=o.filter((j,V)=>V!==c),Q()}),w.append(B,k),r.appendChild(w)}),I()}const D=()=>{const l=a.value,c=o;return a.value="",C(),o=[],Q(),{content:l,files:c}},g=()=>{const{content:l,files:c}=D();(l.trim()||c.length>0)&&t.onSend(l.trim(),c.length>0?c:void 0)};return i.addEventListener("submit",l=>{l.preventDefault(),g()}),a.addEventListener("keydown",l=>{l.key==="Enter"&&!l.shiftKey&&(l.preventDefault(),g())}),A&&b.appendChild(A),b.append(a,p),R&&i.appendChild(R),i.append(r,b),I(),{inputRow:i,getValueAndClear:D,setDisabled:l=>{a.disabled=l,f=l,I()},focus:()=>a.focus()}}var on={"&":"&","<":"<",">":">",'"':""","'":"'"};function ae(t){return t.replace(/[&<>"']/g,o=>on[o])}function vt(t){const o=t.trim();return/^(https?:|mailto:|tel:|#|\/|\.\/|\.\.\/)/i.test(o)||!/^[a-z][a-z0-9+.-]*:/i.test(o)?o:null}var St='"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace',Re="";function ne(t){const o=[],i=b=>(o.push(b),`${Re}${o.length-1}${Re}`);let r=t;return r=r.replace(/`([^`]+)`/g,(b,a)=>i(`<code style="background:#f0f2f5;padding:2px 5px;border-radius:4px;font-size:13px;font-family:${St}">${ae(a)}</code>`)),r=r.replace(/!\[([^\]]*)\]\(([^)\s]+)\)/g,(b,a,C)=>{const m=vt(C);return m?i(`<img alt="${ae(a)}" src="${ae(m)}" style="max-width:100%;border-radius:8px;margin:4px 0" />`):b}),r=r.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(b,a,C)=>{const m=vt(C);return m?i(`<a href="${ae(m)}" target="_blank" rel="noopener noreferrer" style="color:#1b5fc4;text-decoration:underline">${ne(a)}</a>`):b}),r=ae(r),r=r.replace(/\*\*([^*]+?)\*\*/g,"<strong>$1</strong>").replace(/__([^_]+?)__/g,"<strong>$1</strong>").replace(/~~([^~]+?)~~/g,"<del>$1</del>").replace(/(^|[^*])\*(?!\s)([^*]+?)\*/g,"$1<em>$2</em>").replace(/(^|[^\w_])_(?!\s)([^_]+?)_/g,"$1<em>$2</em>"),r=r.replace(new RegExp(`${Re}(\\d+)${Re}`,"g"),(b,a)=>o[Number(a)]),r}function O(t,o,i){const r=document.createElement(t);return Object.assign(r.style,o),i!==void 0&&(r.innerHTML=i),r}var Rt=/^ {0,3}([-*_])( *\1){2,} *$/,kt=/^ {0,3}(#{1,6})\s+(.*?)\s*#*\s*$/,It=/^ {0,3}(```+|~~~+)/,Ae=/^ {0,3}>\s?/,le=/^(\s*)([-*+]|\d+[.)])\s+(.*)$/,rn=["20px","18px","16px","15px","14px","13px"],He=t=>t.match(/^\s*/)?.[0].length??0;function an(t){return t.trim()===""||Rt.test(t)||kt.test(t)||It.test(t)||Ae.test(t)||le.test(t)}function At(t){const o=t[0].match(le),i=o[1].length,r=/\d/.test(o[2]),b=O(r?"ol":"ul",{margin:"0 0 8px 0",paddingLeft:"20px",listStyleType:r?"decimal":"disc",listStylePosition:"outside"});let a=0;for(;a<t.length;){const C=t[a].match(le),m=[];for(a++;a<t.length&&He(t[a])>i;)m.push(t[a]),a++;const x=O("li",{display:"list-item",margin:"2px 0",lineHeight:"1.6"}),p=C[3].match(/^\[([ xX])\]\s+(.*)$/);p?(x.style.listStyleType="none",x.style.marginLeft="-20px",x.innerHTML=`<span style="margin-right:6px">${p[1].toLowerCase()==="x"?"☑":"☐"}</span>${ne(p[2])}`):x.innerHTML=ne(C[3]),m.filter(f=>le.test(f)).length>0&&x.appendChild(At(m.filter(f=>f.trim()!==""))),b.appendChild(x)}return b}function sn(t){const o=m=>m.replace(/^\s*\|?/,"").replace(/\|?\s*$/,"").split("|").map(x=>x.trim()),i=O("div",{overflowX:"auto",margin:"0 0 8px 0"}),r=O("table",{borderCollapse:"collapse",width:"100%",fontSize:"13px"}),b=document.createElement("thead"),a=document.createElement("tr");for(const m of o(t[0]))a.appendChild(O("th",{border:"1px solid #dee3e8",padding:"6px 10px",textAlign:"left",backgroundColor:"#f5f7fa",fontWeight:"600"},ne(m)));b.appendChild(a),r.appendChild(b);const C=document.createElement("tbody");for(const m of t.slice(2)){const x=document.createElement("tr");for(const p of o(m))x.appendChild(O("td",{border:"1px solid #dee3e8",padding:"6px 10px"},ne(p)));C.appendChild(x)}return r.appendChild(C),i.appendChild(r),i}var ln=t=>!!t&&/^\s*\|?\s*:?-{1,}:?\s*(\|\s*:?-{1,}:?\s*)*\|?\s*$/.test(t);function Ne(t){const o=document.createDocumentFragment(),i=t.replace(/\r\n?/g,`
|
|
2
2
|
`).split(`
|
|
3
|
-
`);let r=0;for(;r<i.length;){const a=i[r];if(a.trim()===""){r++;continue}const C=a.match(
|
|
4
|
-
`)))),o.appendChild(
|
|
5
|
-
`))),o.appendChild(f);continue}if(a.includes("|")&&nn(i[r+1])){const p=[a,i[r+1]];for(r+=2;r<i.length&&i[r].includes("|")&&i[r].trim();)p.push(i[r]),r++;o.appendChild(tn(p));continue}if(le.test(a)){const p=[],f=Fe(a);for(;r<i.length&&i[r].trim()!=="";)if(le.test(i[r])||Fe(i[r])>f)p.push(i[r]),r++;else break;o.appendChild(Et(p));continue}const x=[a];for(r++;r<i.length&&!en(i[r]);)x.push(i[r]),r++;o.appendChild(B("p",{margin:"0 0 8px 0",lineHeight:"1.6"},x.map(p=>te(p)).join("<br>")))}const b=o.lastElementChild;return b&&(b.style.marginBottom="0"),o}function on(n,o){const{isLast:i,isLastOfBlock:r,bubbleStyle:b,showAgentName:a,agentBubble:C,followUpEnabled:m,followUpHandler:x,isMobile:p}=o,f=n.role==="user",A=b==="imessage",R=h({display:"flex",flexDirection:"column",alignItems:f?"flex-end":"flex-start",marginBottom:A&&!r?"2px":"16px"});if(R.className=`ago-message ago-message--${n.role}`,!f&&a&&n.agent){const g=h({fontSize:"13px",fontWeight:"500",color:J,marginBottom:"6px",padding:"0 4px"});g.className="ago-message__agent",g.textContent=n.agent.displayName||n.agent.name,R.appendChild(g)}if(!f&&n.sources&&n.sources.length>0){const g=h({display:"grid",gridTemplateColumns:"1fr 1fr",gap:"6px",marginBottom:"10px",width:"100%",maxWidth:"85%"});g.className="ago-message__sources",n.sources.forEach((s,c)=>{const w=s.url?document.createElement("a"):document.createElement("div");s.url&&w instanceof HTMLAnchorElement&&(w.href=s.url,w.target="_blank",w.rel="noopener noreferrer"),v(w,{display:"flex",alignItems:"center",gap:"8px",padding:"8px 10px",border:`1px solid ${L}`,borderRadius:"8px",backgroundColor:ee,textDecoration:"none",color:J,fontSize:"12px",overflow:"hidden"});const $=h({flexShrink:"0",width:"18px",height:"18px",borderRadius:"3px",border:`1px solid ${De}`,color:De,fontSize:"11px",fontWeight:"500",display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"#f0f4ff"});$.textContent=String(c+1);const I=h({overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"});I.textContent=s.title,I.title=s.title,w.append($,I),g.appendChild(w)}),R.appendChild(g)}if(n.attachments&&n.attachments.length>0){const g=h({display:"flex",flexWrap:"wrap",gap:"6px",marginBottom:"6px",justifyContent:f?"flex-end":"flex-start",maxWidth:"75%"});g.className="ago-message__attachments";for(const s of n.attachments){const c=se.safeAttachmentUrl(s.url);if(se.canInlineImage(s)&&c){const M=document.createElement("a");M.href=c,M.target="_blank",M.rel="noopener noreferrer",v(M,{display:"inline-block",textDecoration:"none"});const q=document.createElement("img");q.src=c,q.alt=s.name,q.loading="lazy",v(q,{maxWidth:"180px",maxHeight:"160px",objectFit:"cover",borderRadius:"10px",border:`1px solid ${L}`,display:"block"}),M.appendChild(q),g.appendChild(M);continue}const w=c?document.createElement("a"):document.createElement("div");c&&w instanceof HTMLAnchorElement&&(w.href=c,w.target="_blank",w.rel="noopener noreferrer"),v(w,{display:"inline-flex",alignItems:"center",gap:"8px",padding:"8px 12px",borderRadius:"10px",border:`1px solid ${L}`,backgroundColor:f?"rgba(255,255,255,0.12)":ee,color:f?_e:J,fontSize:"13px",textDecoration:"none",maxWidth:"220px"});const $=document.createElement("span");$.textContent="📄",$.setAttribute("aria-hidden","true"),v($,{fontSize:"16px",lineHeight:"1",flexShrink:"0"});const I=h({display:"flex",flexDirection:"column",minWidth:"0"}),j=h({overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",maxWidth:"160px"});j.textContent=s.name,j.title=s.name,I.appendChild(j);const V=se.formatFileSize(s.fileSize);if(V){const M=h({fontSize:"11px",color:bt});M.textContent=V,I.appendChild(M)}w.append($,I),g.appendChild(w)}R.appendChild(g)}const _=f||C||A,Y=!!n.content||n.status==="IN_PROGRESS"||n.status==="WAITING_CLIENT",D=h({maxWidth:_?A||f?p?"88%":"75%":p?"92%":"85%":"100%",padding:_?"10px 14px":"2px 8px",borderRadius:A?Kt:_?ze:"0",backgroundColor:f?Ae:_?ut:"transparent",color:f?_e:J,overflowWrap:"break-word",textWrap:"pretty",fontSize:"16px",lineHeight:"1.6"});if(D.className="ago-message__content",A&&r){D.style.position="relative";const g=h({position:"absolute",zIndex:"0",bottom:"-2px",width:"20px",height:"20px",background:f?Ae:ut});g.className="ago-message__tail";const s=h({position:"absolute",zIndex:"1",bottom:"-2px",width:"10px",height:"20px",background:xt});s.className="ago-message__tail-mask",f?(g.style.right="-8px",g.style.borderBottomLeftRadius="16px 14px",s.style.right="-10px",s.style.borderBottomLeftRadius="10px"):(g.style.left="-7px",g.style.borderBottomRightRadius="16px 14px",s.style.left="-10px",s.style.borderBottomRightRadius="10px"),D.append(g,s)}if(n.content?D.appendChild(ke(n.content)):(n.status==="IN_PROGRESS"||n.status==="WAITING_CLIENT")&&D.appendChild(an()),Y&&R.appendChild(D),i&&n.followUpReplies&&n.followUpReplies.length>0){const g=h({display:"flex",flexWrap:"wrap",gap:"8px",marginTop:"10px"});g.className="ago-message__followups";for(const s of n.followUpReplies){const c=document.createElement("button");c.type="button",c.className="ago-message__followup-btn",c.textContent=s,c.disabled=!m,v(c,{minHeight:"36px",padding:"6px 14px",fontSize:"14px",borderRadius:ze,border:`1px solid ${L}`,backgroundColor:ee,color:J,cursor:m?"pointer":"default",transition:"border-color 0.15s"}),x&&c.addEventListener("click",()=>x(s)),c.addEventListener("mouseenter",()=>{c.style.borderColor=De}),c.addEventListener("mouseleave",()=>{c.style.borderColor=L}),g.appendChild(c)}R.appendChild(g)}return R}function rn(n){const o=h({display:"flex",alignItems:"center",gap:"8px",padding:"10px 14px",backgroundColor:"#f0fdf4",color:"#15803d",borderRadius:ze,marginTop:"8px",fontSize:"13px",border:"1px solid #bbf7d0"});o.className="ago-form-notice",o.setAttribute("role","status");const i=document.createElement("span");i.textContent="✓",i.setAttribute("aria-hidden","true"),v(i,{fontWeight:"700"});const r=document.createElement("span");return r.textContent=n,o.append(i,r),o}function an(){const n=h({display:"flex",gap:"4px",padding:"4px 0"});for(let o=0;o<3;o++){const i=h({width:"6px",height:"6px",borderRadius:"50%",backgroundColor:"#b5bfc8",animation:"ago-pulse 1.2s ease-in-out infinite",animationDelay:`${o*.2}s`});n.appendChild(i)}return n}function sn(){const n="http://www.w3.org/2000/svg",o=document.createElementNS(n,"svg");o.setAttribute("width","26"),o.setAttribute("height","26"),o.setAttribute("viewBox","0 0 24 24"),o.setAttribute("fill","none");const i=document.createElementNS(n,"path");return i.setAttribute("d","M21 11.5a8.38 8.38 0 0 1-8.5 8.5 8.5 8.5 0 0 1-3.8-.9L3 21l1.9-5.7a8.5 8.5 0 0 1-.9-3.8 8.38 8.38 0 0 1 8.5-8.5 8.38 8.38 0 0 1 8.5 8.5z"),i.setAttribute("stroke","currentColor"),i.setAttribute("stroke-width","2"),i.setAttribute("stroke-linecap","round"),i.setAttribute("stroke-linejoin","round"),o.appendChild(i),o}var ht="Form submitted.";function ln(n){if(typeof n=="string")return n||null;if(!n||typeof n!="object")return null;const o=n;if(typeof o.message=="string"&&o.message)return o.message;const i=o.result;if(typeof i=="string"&&i)return i;if(i&&typeof i=="object"){const r=i.message;if(typeof r=="string"&&r)return r}return null}var dn=0;function cn(n){const o=typeof n=="string"?document.querySelector(n):n;if(!o)throw new Error(`mountChatWidget: target "${String(n)}" not found.`);return o}function pn(n,o){const{title:i="Chat",welcomeMessage:r="Hello! How can I help you today?",placeholder:b="Type a message...",allowFiles:a=!1,height:C=500,placement:m="inline",width:x=400,defaultOpen:p=!1,logoUrl:f,showAgentName:A=!1,agentBubble:R=!1,bubbleStyle:_="default",showHeader:Y=!0,theme:D,loadThreads:g=!1,forms:s,formSubmittedMessage:c=ht,onFollowUpClick:w,onMessageSent:$,onMessageReceived:I,onFormSubmitted:j,onFormError:V,onOpen:M,onClose:q}=o,ne=typeof r=="string"?{message:r,mode:"static"}:r,He=ne.message,Pe=ne.mode??"static",St="speed"in ne&&ne.speed||45,We="followUpReplies"in ne&&ne.followUpReplies||void 0;if(!o.client&&!o.config?.baseUrl)throw new se.AgoError("mountChatWidget requires either `client` or `config` (with a baseUrl).","config_missing_base_url");const E=o.client??new se.AgoClient(o.config),Ue=cn(n),z=m==="left"||m==="right",Rt=z&&(o.launcher??!0);let oe=z?p:!0;const It=o.mobile?.breakpoint??768,Ne=o.mobile?.trigger??"tap",Ge=typeof window<"u"&&!!window.matchMedia,O=Ge?window.matchMedia(`(max-width: ${It}px)`):void 0,At=Ge?window.matchMedia("(prefers-reduced-motion: reduce)"):void 0,re=!z&&!!O,Le=o.persistConversation,ge=Le?Gt.createConversationSession(Le===!0?{}:Le):void 0;let P=o.conversationId??ge?.getLastActiveThread()??void 0,u=[],Z=!1,de=null,K;const je=[];function _t(e){if(typeof c=="function"){const l=c(e);if(typeof l=="string"&&l)return l}const t=ln(e);return t||(typeof c=="string"?c:ht)}const he=[],d=h({display:"flex",flexDirection:"column",height:z?"100%":typeof C=="number"?`${C}px`:C,border:`1px solid ${L}`,borderRadius:qt,overflow:"hidden",backgroundColor:ee,fontFamily:Re,textAlign:"left",boxShadow:"rgba(15, 15, 15, 0.08) 0px 2px 16px 0px"});d.className="ago-chat-widget",Xt(d,D);let F;if(Y){if(F=h({padding:"14px 16px",borderBottom:`1px solid ${L}`,backgroundColor:Vt,color:ft,display:"flex",alignItems:"center",gap:"10px"}),F.className="ago-chat-widget__header",f){const t=document.createElement("img");t.src=f,t.alt="Logo",v(t,{height:"24px",width:"auto"}),F.appendChild(t)}const e=document.createElement("h3");if(e.textContent=i,v(e,{margin:"0",fontSize:"15px",fontWeight:"600"}),F.appendChild(e),z){const t=document.createElement("button");t.type="button",t.className="ago-chat-widget__close",t.setAttribute("aria-label","Close"),t.textContent="×",v(t,{marginLeft:"auto",background:"transparent",border:"none",color:ft,fontSize:"22px",lineHeight:"1",cursor:"pointer",padding:"0 2px"}),t.addEventListener("click",()=>Be()),F.appendChild(t)}}const k=h({flex:"1",overflow:"auto",padding:"16px",backgroundColor:xt});k.className="ago-chat-widget__messages",k.setAttribute("role","log"),k.setAttribute("aria-live","polite"),k.setAttribute("aria-relevant","additions text"),k.setAttribute("aria-atomic","false");const{inputRow:Te,setDisabled:kt,focus:xe}=Yt({placeholder:b,allowFiles:a,onSend:(e,t)=>{we(e,t)}});Qt(),d.append(...F?[F]:[],k,Te);let be=d,W,T;const ve=m==="left"?"left":"right";if(z&&(W=h({position:"fixed",top:"0",bottom:"0",[ve]:"0",width:typeof x=="number"?`${x}px`:x,maxWidth:"100vw",display:"flex",zIndex:"2147483000",transition:"transform 0.3s ease",boxShadow:"rgba(15, 15, 15, 0.18) 0px 0px 24px 0px"}),W.className="ago-chat-widget-panel",v(d,{height:"100%",width:"100%",borderRadius:"0",border:"none",boxShadow:"none",[ve==="left"?"borderRight":"borderLeft"]:`1px solid ${L}`}),W.appendChild(d),be=W),Rt){if(T=document.createElement("button"),T.type="button",T.className="ago-chat-widget-launcher",T.setAttribute("aria-label",`Open ${i}`),v(T,{position:"fixed",bottom:"20px",[ve]:"20px",width:"56px",height:"56px",borderRadius:"50%",border:"none",backgroundColor:Ae,color:_e,cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",zIndex:"2147483000",boxShadow:"rgba(15, 15, 15, 0.2) 0px 4px 14px 0px",fontFamily:Re}),f){const e=document.createElement("img");e.src=f,e.alt="",v(e,{width:"26px",height:"26px",objectFit:"contain"}),T.appendChild(e)}else T.appendChild(sn());T.addEventListener("click",()=>Oe())}const ce=re?`ago-vt-${++dn}`:"",Ve=52;let U=!1,pe=0,ie=0,H,fe,X;const ye={height:d.style.height,border:d.style.border,borderRadius:d.style.borderRadius,boxShadow:d.style.boxShadow};Ue.appendChild(be),T&&Ue.appendChild(T),Ce(),re&&(H=Pt(),d.insertBefore(H,d.firstChild),fe=document.createElement("style"),fe.id=ce,fe.textContent=`::view-transition-group(${ce}),::view-transition-group(${ce}-bar){animation-duration:0.3s;animation-timing-function:cubic-bezier(0.4,0,0.2,1)}`,document.head.appendChild(fe),(Ne==="focus"||Ne==="tap")&&(d.addEventListener("pointerdown",e=>{if(U||!O?.matches)return;const t=Te.contains(e.target);if(Ne==="tap"){if((e.target instanceof Element?e.target:null)?.closest("button,a[href],[role='button']"))return}else if(!t)return;t&&e.preventDefault(),ue()},!0),d.addEventListener("focusin",e=>{O?.matches&&Te.contains(e.target)&&ue()})),document.addEventListener("keydown",nt)),O&&O.addEventListener("change",ot);const Nt=w!==!1,Lt=w===!1?void 0:w??(e=>{re&&O?.matches&&!U?ue().then(()=>we(e)):we(e)});function N(){if(k.replaceChildren(),u.length===0){if(Pe==="static"){const t=h({textAlign:"center",color:bt,padding:"24px 16px",fontSize:"16px",lineHeight:"1.5"});t.appendChild(ke(He)),k.appendChild(t)}}else u.forEach((t,l)=>{const S=l===u.length-1||u[l+1].role!==t.role;k.appendChild(on(t,{isLast:l===u.length-1,isLastOfBlock:S,bubbleStyle:_,showAgentName:A,agentBubble:R,followUpEnabled:Nt,followUpHandler:Lt,isMobile:!!O?.matches}))});for(const t of je)k.appendChild(rn(t));if(de){const t=h({padding:"10px 14px",backgroundColor:"#fef2f2",color:"#dc2626",borderRadius:"12px",marginTop:"8px",fontSize:"13px",border:"1px solid #fecaca"});t.setAttribute("role","alert"),t.textContent=de,k.appendChild(t)}k.scrollTop=k.scrollHeight;const e=u[u.length-1];kt(Z&&e?.role==="assistant"&&(e.status==="IN_PROGRESS"||e.status==="WAITING_CLIENT"))}function Tt(){for(let e=u.length-1;e>=0;e--){const t=u[e];if(t.role==="assistant"&&(t.status==="IN_PROGRESS"||t.status==="WAITING_CLIENT"))return t}}const qe=e=>{P||(P=e.conversationId)},Ke=e=>{const t=Tt();t&&(t.content+=e.content,N())},Xe=e=>{const t=u.findIndex(l=>l.id===e.id||l.role==="assistant"&&l.status==="IN_PROGRESS");t>=0?u[t]=e:u.push(e),N(),xe()},Qe=e=>{const t=u.findIndex(l=>l.id===e.id||l.role==="assistant"&&l.status==="IN_PROGRESS");t>=0?u[t]=e:u.push(e),Z=!1,N(),e.status==="DONE"&&I?.({id:e.id,content:e.content})},Ye=e=>{de=e.error,Z=!1,u=u.filter(t=>!t.id.startsWith("temp-")),N()};function $t(e){const t={id:`ago-intro-${Date.now()}`,conversationId:"",content:"",role:"assistant",status:"IN_PROGRESS",createdAt:new Date};u.push(t),N();const l=e.match(/\S+\s*/g)??[e];let S=0;K=setInterval(()=>{if(S>=l.length){clearInterval(K),K=void 0,t.status="DONE",We&&(t.followUpReplies=We),N();return}t.content+=l[S],S++,N()},St)}E.on("message:start",qe),E.on("message:chunk",Ke),E.on("message:answer-complete",Xe),E.on("message:complete",Qe),E.on("message:error",Ye);const Ze=e=>j?.(e),Je=e=>V?.(e);j&&E.on("form:submitted",Ze),V&&E.on("form:error",Je);const $e=[];let et=!1;const tt=e=>{if(et)return;$e.push(e.install(E));let t=e.store.get().submitted;const l=e.store.subscribe(S=>{S.submitted&&!t&&(je.push(_t(S.submitResult)),N()),t=S.submitted});$e.push(l)};for(const e of s??[])e.schema!=null?tt(ct.createFormCollector(e)):ct.loadFormCollector(E,e).then(t=>tt(t)).catch(()=>{});async function we(e,t){const l=e.trim();if(!l&&!t?.length||Z)return;if($?.(l),Z=!0,de=null,K){clearInterval(K),K=void 0;const y=u.find(G=>G.id.startsWith("ago-intro-"));y&&!y.content?u=u.filter(G=>G!==y):y&&(y.status="DONE")}const S=Date.now();u.push({id:`temp-user-${S}`,conversationId:P||"",content:l,role:"user",status:"DONE",attachments:t&&t.length>0?se.attachmentsFromFiles(t):void 0,createdAt:new Date}),u.push({id:`temp-assistant-${S}`,conversationId:P||"",content:"",role:"assistant",status:"IN_PROGRESS",createdAt:new Date}),N();try{const y=await E.sendMessage(l,{conversationId:P,files:t});y.conversationId&&(P||(P=y.conversationId),ge?.setActiveThread(y.conversationId,y.createdAt));const G=u.find(Q=>Q.id===`temp-user-${S}`);if(G&&(G.id=`user-${S}`,G.conversationId=y.conversationId),!u.some(Q=>Q.id===y.id)){const Q=u.findIndex(Ut=>Ut.id===`temp-assistant-${S}`);Q>=0?u[Q]=y:u.push(y)}u=u.filter(Q=>!Q.id.startsWith("temp-")),y.status!=="WAITING_CLIENT"&&(Z=!1),N(),g&&Me()}catch(y){de=y instanceof Error?y.message:"Failed to send message",Z=!1,u=u.filter(G=>!G.id.startsWith("temp-")),N()}}async function Me(){try{const e=await E.getConversations();he.splice(0,he.length,...e)}catch{}return he}async function Mt(e){try{const t=(await E.getConversation(e))?.messages??[];t.length>0&&u.length===0&&(u=t,N())}catch{u.length===0&&(ge?.clear(),P=void 0)}}return N(),re&&O?.matches||xe(),P?Mt(P):Pe==="streaming"&&$t(He),g&&Me(),{client:E,element:be,sendMessage:we,...z||re?{open:Bt,close:Dt,toggle:zt}:{},session:ge,threads:he,refreshThreads:Me,destroy(){K&&clearInterval(K),E.off("message:start",qe),E.off("message:chunk",Ke),E.off("message:answer-complete",Xe),E.off("message:complete",Qe),E.off("message:error",Ye),j&&E.off("form:submitted",Ze),V&&E.off("form:error",Je),et=!0,$e.forEach(e=>e()),be.remove(),T?.remove(),H?.remove(),fe?.remove(),X?.remove(),O?.removeEventListener("change",ot),re&&(document.removeEventListener("keydown",nt),at(),document.documentElement.style.removeProperty("overflow")),o.client||E.destroy()}};function Ce(){if(!W)return;{const t=ve==="left"?"border-right":"border-left";O?.matches?(W.style.width="100%",d.style.borderRadius="0",d.style.removeProperty(t)):(W.style.width=typeof x=="number"?`${x}px`:x,d.style.setProperty(t,`1px solid ${L}`))}const e=m==="left"?"translateX(-100%)":"translateX(100%)";W.style.transform=oe?"translateX(0)":e,W.setAttribute("aria-hidden",oe?"false":"true"),T&&(T.style.display=oe?"none":"flex")}function Oe(){oe=!0,Ce(),xe(),M?.()}function Be(){oe=!1,Ce(),q?.()}function Ot(){oe?Be():Oe()}function Bt(){z?Oe():ue()}function Dt(){z?Be():me()}function zt(){z?Ot():U?me():ue()}function Ft(){return Array.from(d.querySelectorAll('a[href],button:not([disabled]),textarea:not([disabled]),input:not([disabled]),select:not([disabled]),[tabindex]:not([tabindex="-1"])')).filter(e=>e.getClientRects().length>0)}function nt(e){if(!U)return;if(e.key==="Escape"){me();return}if(e.key!=="Tab")return;const t=Ft();if(t.length===0){e.preventDefault();return}const l=t[0],S=t[t.length-1],y=document.activeElement;e.shiftKey&&(y===l||!d.contains(y))?(e.preventDefault(),S.focus()):!e.shiftKey&&(y===S||!d.contains(y))&&(e.preventDefault(),l.focus())}function ot(e){z?Ce():!e.matches&&U&&me(),N()}function rt(){return window.visualViewport?.height??window.innerHeight}function it(){const e=window.visualViewport,t=e?.offsetTop??0,l=e?.height??pe,S=Math.min(0,t+l-pe);d.style.top=`${S}px`,H&&(H.style.top=`${t}px`)}function Ee(){ie||(ie=requestAnimationFrame(()=>{ie=0,it()}))}function Ht(){window.visualViewport?.addEventListener("resize",Ee),window.visualViewport?.addEventListener("scroll",Ee)}function at(){window.visualViewport?.removeEventListener("resize",Ee),window.visualViewport?.removeEventListener("scroll",Ee),ie&&(cancelAnimationFrame(ie),ie=0)}function st(){k.scrollTop=k.scrollHeight}function Pt(){const e=h({position:"fixed",top:"0",left:"0",right:"0",height:`calc(${Ve}px + env(safe-area-inset-top))`,display:"none",alignItems:"center",justifyContent:"space-between",padding:"env(safe-area-inset-top) 14px 0",backgroundColor:ee,borderBottom:`1px solid ${L}`,zIndex:"2147483001",fontFamily:Re});if(e.className="ago-chat-widget-mobile-bar",f){const l=document.createElement("img");l.src=f,l.alt="",v(l,{height:"28px",width:"auto"}),e.appendChild(l)}else if(i){const l=document.createElement("span");l.textContent=i,v(l,{fontSize:"15px",fontWeight:"600",color:J,overflow:"hidden",whiteSpace:"nowrap",textOverflow:"ellipsis"}),e.appendChild(l)}else e.appendChild(h({}));const t=document.createElement("button");return t.type="button",t.setAttribute("aria-label","Close"),t.textContent="×",v(t,{border:"none",background:"transparent",fontSize:"26px",lineHeight:"1",color:J,cursor:"pointer",padding:"4px 8px"}),t.addEventListener("click",()=>{me()}),e.appendChild(t),e}function Wt(){return typeof document.startViewTransition=="function"&&!At?.matches&&!!O?.matches}function lt(e){const t=document;if(Wt()&&t.startViewTransition){d.style.setProperty("view-transition-name",ce),H?.style.setProperty("view-transition-name",`${ce}-bar`);const l=()=>{d.style.removeProperty("view-transition-name"),H?.style.removeProperty("view-transition-name")};return t.startViewTransition(e).finished.then(l,l)}return e(),Promise.resolve()}function dt(e){if(e)X&&d.parentElement?.insertBefore(X,d),v(d,{position:"fixed",top:"0",left:"0",right:"0",bottom:"0",height:"var(--ago-vh, 100dvh)",zIndex:"2147483000",border:"none",borderRadius:"0",boxShadow:"none",paddingTop:`calc(${Ve}px + env(safe-area-inset-top))`,paddingBottom:"env(safe-area-inset-bottom)"}),d.setAttribute("role","dialog"),d.setAttribute("aria-modal","true"),d.setAttribute("aria-label",i),document.documentElement.style.overflow="hidden",F&&(F.style.display="none"),H&&(H.style.display="flex");else{X?.remove(),X=void 0;for(const t of["position","top","left","right","bottom","z-index","padding-top","padding-bottom"])d.style.removeProperty(t);d.style.height=ye.height,d.style.border=ye.border,d.style.borderRadius=ye.borderRadius,d.style.boxShadow=ye.boxShadow,d.removeAttribute("role"),d.removeAttribute("aria-modal"),d.removeAttribute("aria-label"),document.documentElement.style.removeProperty("overflow"),F&&(F.style.display="flex"),H&&(H.style.display="none")}}function ue(){if(U||!O?.matches)return Promise.resolve();const e=d.getBoundingClientRect();if(e.height>=rt()*.8)return Promise.resolve();U=!0,X=h({width:`${e.width}px`,height:`${e.height}px`}),X.className="ago-chat-widget-spacer",X.setAttribute("aria-hidden","true"),pe=rt(),d.style.setProperty("--ago-vh",`${pe}px`),it(),Ht();const t=lt(()=>dt(!0));return t.then(()=>{st(),xe()}),st(),M?.(),t}function me(){if(!U)return Promise.resolve();U=!1,at(),d.querySelector("textarea")?.blur();const e=lt(()=>dt(!1));return e.then(()=>d.style.removeProperty("--ago-vh")),pe=0,q?.(),e}}exports.mountChatWidget=pn;exports.renderMarkdown=ke;
|
|
3
|
+
`);let r=0;for(;r<i.length;){const a=i[r];if(a.trim()===""){r++;continue}const C=a.match(It);if(C){const p=C[1][0],f=[];for(r++;r<i.length&&!new RegExp(`^ {0,3}${p==="`"?"`{3,}":"~{3,}"}\\s*$`).test(i[r]);)f.push(i[r]),r++;r++;const I=O("pre",{margin:"0 0 8px 0"});I.appendChild(O("code",{display:"block",background:"#f5f5f5",padding:"8px 12px",borderRadius:"6px",fontSize:"13px",overflowX:"auto",fontFamily:St,whiteSpace:"pre"},ae(f.join(`
|
|
4
|
+
`)))),o.appendChild(I);continue}if(Rt.test(a)){o.appendChild(O("hr",{border:"none",borderTop:"1px solid #dee3e8",margin:"12px 0"})),r++;continue}const m=a.match(kt);if(m){const p=m[1].length;o.appendChild(O(`h${p}`,{margin:"16px 0 8px 0",fontSize:rn[p-1],fontWeight:"600",lineHeight:"1.3"},ne(m[2]))),r++;continue}if(Ae.test(a)){const p=[];for(;r<i.length&&Ae.test(i[r]);)p.push(i[r].replace(Ae,"")),r++;const f=O("blockquote",{borderLeft:"4px solid #dee3e8",paddingLeft:"12px",margin:"0 0 8px 0",fontStyle:"italic",color:"#6b6d6f"});f.appendChild(Ne(p.join(`
|
|
5
|
+
`))),o.appendChild(f);continue}if(a.includes("|")&&ln(i[r+1])){const p=[a,i[r+1]];for(r+=2;r<i.length&&i[r].includes("|")&&i[r].trim();)p.push(i[r]),r++;o.appendChild(sn(p));continue}if(le.test(a)){const p=[],f=He(a);for(;r<i.length&&i[r].trim()!=="";)if(le.test(i[r])||He(i[r])>f)p.push(i[r]),r++;else break;o.appendChild(At(p));continue}const x=[a];for(r++;r<i.length&&!an(i[r]);)x.push(i[r]),r++;o.appendChild(O("p",{margin:"0 0 8px 0",lineHeight:"1.6"},x.map(p=>ne(p)).join("<br>")))}const b=o.lastElementChild;return b&&(b.style.marginBottom="0"),o}function dn(t,o){const{isLast:i,isLastOfBlock:r,bubbleStyle:b,showAgentName:a,agentBubble:C,followUpEnabled:m,followUpHandler:x,isMobile:p}=o,f=t.role==="user",I=b==="imessage",R=h({display:"flex",flexDirection:"column",alignItems:f?"flex-end":"flex-start",marginBottom:I&&!r?"2px":"16px"});if(R.className=`ago-message ago-message--${t.role}`,!f&&a&&t.agent){const g=h({fontSize:"13px",fontWeight:"500",color:ee,marginBottom:"6px",padding:"0 4px"});g.className="ago-message__agent",g.textContent=t.agent.displayName||t.agent.name,R.appendChild(g)}if(!f&&t.sources&&t.sources.length>0){const g=h({display:"grid",gridTemplateColumns:"1fr 1fr",gap:"6px",marginBottom:"10px",width:"100%",maxWidth:"85%"});g.className="ago-message__sources",t.sources.forEach((l,c)=>{const w=l.url?document.createElement("a"):document.createElement("div");l.url&&w instanceof HTMLAnchorElement&&(w.href=l.url,w.target="_blank",w.rel="noopener noreferrer"),v(w,{display:"flex",alignItems:"center",gap:"8px",padding:"8px 10px",border:`1px solid ${N}`,borderRadius:"8px",backgroundColor:te,textDecoration:"none",color:ee,fontSize:"12px",overflow:"hidden"});const B=h({flexShrink:"0",width:"18px",height:"18px",borderRadius:"3px",border:`1px solid ${Fe}`,color:Fe,fontSize:"11px",fontWeight:"500",display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"#f0f4ff"});B.textContent=String(c+1);const k=h({overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"});k.textContent=l.title,k.title=l.title,w.append(B,k),g.appendChild(w)}),R.appendChild(g)}if(t.attachments&&t.attachments.length>0){const g=h({display:"flex",flexWrap:"wrap",gap:"6px",marginBottom:"6px",justifyContent:f?"flex-end":"flex-start",maxWidth:"75%"});g.className="ago-message__attachments";for(const l of t.attachments){const c=se.safeAttachmentUrl(l.url);if(se.canInlineImage(l)&&c){const M=document.createElement("a");M.href=c,M.target="_blank",M.rel="noopener noreferrer",v(M,{display:"inline-block",textDecoration:"none"});const q=document.createElement("img");q.src=c,q.alt=l.name,q.loading="lazy",v(q,{maxWidth:"180px",maxHeight:"160px",objectFit:"cover",borderRadius:"10px",border:`1px solid ${N}`,display:"block"}),M.appendChild(q),g.appendChild(M);continue}const w=c?document.createElement("a"):document.createElement("div");c&&w instanceof HTMLAnchorElement&&(w.href=c,w.target="_blank",w.rel="noopener noreferrer"),v(w,{display:"inline-flex",alignItems:"center",gap:"8px",padding:"8px 12px",borderRadius:"10px",border:`1px solid ${N}`,backgroundColor:f?"rgba(255,255,255,0.12)":te,color:f?Le:ee,fontSize:"13px",textDecoration:"none",maxWidth:"220px"});const B=document.createElement("span");B.textContent="📄",B.setAttribute("aria-hidden","true"),v(B,{fontSize:"16px",lineHeight:"1",flexShrink:"0"});const k=h({display:"flex",flexDirection:"column",minWidth:"0"}),j=h({overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",maxWidth:"160px"});j.textContent=l.name,j.title=l.name,k.appendChild(j);const V=se.formatFileSize(l.fileSize);if(V){const M=h({fontSize:"11px",color:Et});M.textContent=V,k.appendChild(M)}w.append(B,k),g.appendChild(w)}R.appendChild(g)}const A=f||C||I,Q=!!t.content||t.status==="IN_PROGRESS"||t.status==="WAITING_CLIENT",D=h({maxWidth:A?I||f?p?"88%":"75%":p?"92%":"85%":"100%",padding:A?"10px 14px":"2px 8px",borderRadius:I?Jt:A?Pe:"0",backgroundColor:f?_e:A?xt:"transparent",color:f?Le:ee,overflowWrap:"break-word",textWrap:"pretty",fontSize:"16px",lineHeight:"1.6"});if(D.className="ago-message__content",I&&r){D.style.position="relative";const g=h({position:"absolute",zIndex:"0",bottom:"-2px",width:"20px",height:"20px",background:f?_e:xt});g.className="ago-message__tail";const l=h({position:"absolute",zIndex:"1",bottom:"-2px",width:"10px",height:"20px",background:Ct});l.className="ago-message__tail-mask",f?(g.style.right="-8px",g.style.borderBottomLeftRadius="16px 14px",l.style.right="-10px",l.style.borderBottomLeftRadius="10px"):(g.style.left="-7px",g.style.borderBottomRightRadius="16px 14px",l.style.left="-10px",l.style.borderBottomRightRadius="10px"),D.append(g,l)}if(t.content?D.appendChild(Ne(t.content)):(t.status==="IN_PROGRESS"||t.status==="WAITING_CLIENT")&&D.appendChild(pn()),Q&&R.appendChild(D),i&&t.followUpReplies&&t.followUpReplies.length>0){const g=h({display:"flex",flexWrap:"wrap",gap:"8px",marginTop:"10px"});g.className="ago-message__followups";for(const l of t.followUpReplies){const c=document.createElement("button");c.type="button",c.className="ago-message__followup-btn",c.textContent=l,c.disabled=!m,v(c,{minHeight:"36px",padding:"6px 14px",fontSize:"14px",borderRadius:Pe,border:`1px solid ${N}`,backgroundColor:te,color:ee,cursor:m?"pointer":"default",transition:"border-color 0.15s"}),x&&c.addEventListener("click",()=>x(l)),c.addEventListener("mouseenter",()=>{c.style.borderColor=Fe}),c.addEventListener("mouseleave",()=>{c.style.borderColor=N}),g.appendChild(c)}R.appendChild(g)}return R}function cn(t){const o=h({display:"flex",alignItems:"center",gap:"8px",padding:"10px 14px",backgroundColor:"#f0fdf4",color:"#15803d",borderRadius:Pe,marginTop:"8px",fontSize:"13px",border:"1px solid #bbf7d0"});o.className="ago-form-notice",o.setAttribute("role","status");const i=document.createElement("span");i.textContent="✓",i.setAttribute("aria-hidden","true"),v(i,{fontWeight:"700"});const r=document.createElement("span");return r.textContent=t,o.append(i,r),o}function pn(){const t=h({display:"flex",gap:"4px",padding:"4px 0"});for(let o=0;o<3;o++){const i=h({width:"6px",height:"6px",borderRadius:"50%",backgroundColor:"#b5bfc8",animation:"ago-pulse 1.2s ease-in-out infinite",animationDelay:`${o*.2}s`});t.appendChild(i)}return t}function fn(){const t="http://www.w3.org/2000/svg",o=document.createElementNS(t,"svg");o.setAttribute("width","26"),o.setAttribute("height","26"),o.setAttribute("viewBox","0 0 24 24"),o.setAttribute("fill","none");const i=document.createElementNS(t,"path");return i.setAttribute("d","M21 11.5a8.38 8.38 0 0 1-8.5 8.5 8.5 8.5 0 0 1-3.8-.9L3 21l1.9-5.7a8.5 8.5 0 0 1-.9-3.8 8.38 8.38 0 0 1 8.5-8.5 8.38 8.38 0 0 1 8.5 8.5z"),i.setAttribute("stroke","currentColor"),i.setAttribute("stroke-width","2"),i.setAttribute("stroke-linecap","round"),i.setAttribute("stroke-linejoin","round"),o.appendChild(i),o}var yt="Form submitted.";function un(t){if(typeof t=="string")return t||null;if(!t||typeof t!="object")return null;const o=t;if(typeof o.message=="string"&&o.message)return o.message;const i=o.result;if(typeof i=="string"&&i)return i;if(i&&typeof i=="object"){const r=i.message;if(typeof r=="string"&&r)return r}return null}var mn=0,We=0,Ue=0;function wt(){if(We++>0)return;Ue=window.scrollY;const{style:t}=document.body;t.position="fixed",t.top=`-${Ue}px`,t.left="0",t.right="0",t.width="100%",document.documentElement.style.overflow="hidden"}function ke(){if(We===0||--We>0)return;const{style:t}=document.body;t.removeProperty("position"),t.removeProperty("top"),t.removeProperty("left"),t.removeProperty("right"),t.removeProperty("width"),document.documentElement.style.removeProperty("overflow"),window.scrollTo(0,Ue)}function gn(t){const o=typeof t=="string"?document.querySelector(t):t;if(!o)throw new Error(`mountChatWidget: target "${String(t)}" not found.`);return o}function hn(t,o){const{title:i="Chat",welcomeMessage:r="Hello! How can I help you today?",placeholder:b="Type a message...",allowFiles:a=!1,height:C=500,placement:m="inline",width:x=400,defaultOpen:p=!1,logoUrl:f,showAgentName:I=!1,agentBubble:R=!1,bubbleStyle:A="default",showHeader:Q=!0,theme:D,loadThreads:g=!1,forms:l,formSubmittedMessage:c=yt,onFollowUpClick:w,onMessageSent:B,onMessageReceived:k,onFormSubmitted:j,onFormError:V,onOpen:M,onClose:q}=o,oe=typeof r=="string"?{message:r,mode:"static"}:r,Ge=oe.message,je=oe.mode??"static",_t="speed"in oe&&oe.speed||45,Ve="followUpReplies"in oe&&oe.followUpReplies||void 0;if(!o.client&&!o.config?.baseUrl)throw new se.AgoError("mountChatWidget requires either `client` or `config` (with a baseUrl).","config_missing_base_url");const E=o.client??new se.AgoClient(o.config),qe=gn(t),z=m==="left"||m==="right",Lt=z&&(o.launcher??!0);let Z=z?p:!0,ge=!1;const Nt=o.mobile?.breakpoint??768,Te=o.mobile?.trigger??"tap",Ke=typeof window<"u"&&!!window.matchMedia,T=Ke?window.matchMedia(`(max-width: ${Nt}px)`):void 0,Tt=Ke?window.matchMedia("(prefers-reduced-motion: reduce)"):void 0,re=!z&&!!T,$e=o.persistConversation,he=$e?Xt.createConversationSession($e===!0?{}:$e):void 0;let H=o.conversationId??he?.getLastActiveThread()??void 0,u=[],J=!1,de=null,K;const Xe=[];function $t(e){if(typeof c=="function"){const s=c(e);if(typeof s=="string"&&s)return s}const n=un(e);return n||(typeof c=="string"?c:yt)}const xe=[],d=h({display:"flex",flexDirection:"column",height:z?"100%":typeof C=="number"?`${C}px`:C,border:`1px solid ${N}`,borderRadius:Zt,overflow:"hidden",backgroundColor:te,fontFamily:Ie,textAlign:"left",boxShadow:"rgba(15, 15, 15, 0.08) 0px 2px 16px 0px"});d.className="ago-chat-widget",en(d,D);let F;if(Q){if(F=h({padding:"14px 16px",borderBottom:`1px solid ${N}`,backgroundColor:Qt,color:ht,display:"flex",alignItems:"center",gap:"10px"}),F.className="ago-chat-widget__header",f){const n=document.createElement("img");n.src=f,n.alt="Logo",v(n,{height:"24px",width:"auto"}),F.appendChild(n)}const e=document.createElement("h3");if(e.textContent=i,v(e,{margin:"0",fontSize:"15px",fontWeight:"600"}),F.appendChild(e),z){const n=document.createElement("button");n.type="button",n.className="ago-chat-widget__close",n.setAttribute("aria-label","Close"),n.textContent="×",v(n,{marginLeft:"auto",background:"transparent",border:"none",color:ht,fontSize:"22px",lineHeight:"1",cursor:"pointer",padding:"0 2px"}),n.addEventListener("click",()=>ze()),F.appendChild(n)}}const _=h({flex:"1",overflow:"auto",overscrollBehavior:"contain",padding:"16px",backgroundColor:Ct});_.className="ago-chat-widget__messages",_.setAttribute("role","log"),_.setAttribute("aria-live","polite"),_.setAttribute("aria-relevant","additions text"),_.setAttribute("aria-atomic","false");const{inputRow:Be,setDisabled:Bt,focus:be}=nn({placeholder:b,allowFiles:a,onSend:(e,n)=>{Ce(e,n)}});tn(),d.append(...F?[F]:[],_,Be);let ve=d,U,$;const ye=m==="left"?"left":"right";if(z&&(U=h({position:"fixed",top:"0",bottom:"0",[ye]:"0",width:typeof x=="number"?`${x}px`:x,maxWidth:"100vw",display:"flex",zIndex:"2147483000",transition:"transform 0.3s ease",boxShadow:"rgba(15, 15, 15, 0.18) 0px 0px 24px 0px"}),U.className="ago-chat-widget-panel",v(d,{height:"100%",width:"100%",borderRadius:"0",border:"none",boxShadow:"none",[ye==="left"?"borderRight":"borderLeft"]:`1px solid ${N}`}),U.appendChild(d),ve=U),Lt){if($=document.createElement("button"),$.type="button",$.className="ago-chat-widget-launcher",$.setAttribute("aria-label",`Open ${i}`),v($,{position:"fixed",bottom:"20px",[ye]:"20px",width:"56px",height:"56px",borderRadius:"50%",border:"none",backgroundColor:_e,color:Le,cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",zIndex:"2147483000",boxShadow:"rgba(15, 15, 15, 0.2) 0px 4px 14px 0px",fontFamily:Ie}),f){const e=document.createElement("img");e.src=f,e.alt="",v(e,{width:"26px",height:"26px",objectFit:"contain"}),$.appendChild(e)}else $.appendChild(fn());$.addEventListener("click",()=>De())}const ce=re?`ago-vt-${++mn}`:"",Ye=52;let W=!1,pe=0,ie=0,P,fe,X;const we={height:d.style.height,border:d.style.border,borderRadius:d.style.borderRadius,boxShadow:d.style.boxShadow};qe.appendChild(ve),$&&qe.appendChild($),Ee(),re&&(P=Vt(),d.insertBefore(P,d.firstChild),fe=document.createElement("style"),fe.id=ce,fe.textContent=`::view-transition-group(${ce}),::view-transition-group(${ce}-bar){animation-duration:0.3s;animation-timing-function:cubic-bezier(0.4,0,0.2,1)}`,document.head.appendChild(fe),(Te==="focus"||Te==="tap")&&(d.addEventListener("pointerdown",e=>{if(W||!T?.matches)return;const n=Be.contains(e.target);if(Te==="tap"){if((e.target instanceof Element?e.target:null)?.closest("button,a[href],[role='button']"))return}else if(!n)return;n&&e.preventDefault(),ue()},!0),d.addEventListener("focusin",e=>{T?.matches&&Be.contains(e.target)&&ue()})),document.addEventListener("keydown",at)),T&&T.addEventListener("change",st);const Mt=w!==!1,Ot=w===!1?void 0:w??(e=>{re&&T?.matches&&!W?ue().then(()=>Ce(e)):Ce(e)});function L(){if(_.replaceChildren(),u.length===0){if(je==="static"){const n=h({textAlign:"center",color:Et,padding:"24px 16px",fontSize:"16px",lineHeight:"1.5"});n.appendChild(Ne(Ge)),_.appendChild(n)}}else u.forEach((n,s)=>{const S=s===u.length-1||u[s+1].role!==n.role;_.appendChild(dn(n,{isLast:s===u.length-1,isLastOfBlock:S,bubbleStyle:A,showAgentName:I,agentBubble:R,followUpEnabled:Mt,followUpHandler:Ot,isMobile:!!T?.matches}))});for(const n of Xe)_.appendChild(cn(n));if(de){const n=h({padding:"10px 14px",backgroundColor:"#fef2f2",color:"#dc2626",borderRadius:"12px",marginTop:"8px",fontSize:"13px",border:"1px solid #fecaca"});n.setAttribute("role","alert"),n.textContent=de,_.appendChild(n)}_.scrollTop=_.scrollHeight;const e=u[u.length-1];Bt(J&&e?.role==="assistant"&&(e.status==="IN_PROGRESS"||e.status==="WAITING_CLIENT"))}function Dt(){for(let e=u.length-1;e>=0;e--){const n=u[e];if(n.role==="assistant"&&(n.status==="IN_PROGRESS"||n.status==="WAITING_CLIENT"))return n}}const Qe=e=>{H||(H=e.conversationId)},Ze=e=>{const n=Dt();n&&(n.content+=e.content,L())},Je=e=>{const n=u.findIndex(s=>s.id===e.id||s.role==="assistant"&&s.status==="IN_PROGRESS");n>=0?u[n]=e:u.push(e),L(),be()},et=e=>{const n=u.findIndex(s=>s.id===e.id||s.role==="assistant"&&s.status==="IN_PROGRESS");n>=0?u[n]=e:u.push(e),J=!1,L(),e.status==="DONE"&&k?.({id:e.id,content:e.content})},tt=e=>{de=e.error,J=!1,u=u.filter(n=>!n.id.startsWith("temp-")),L()};function zt(e){const n={id:`ago-intro-${Date.now()}`,conversationId:"",content:"",role:"assistant",status:"IN_PROGRESS",createdAt:new Date};u.push(n),L();const s=e.match(/\S+\s*/g)??[e];let S=0;K=setInterval(()=>{if(S>=s.length){clearInterval(K),K=void 0,n.status="DONE",Ve&&(n.followUpReplies=Ve),L();return}n.content+=s[S],S++,L()},_t)}E.on("message:start",Qe),E.on("message:chunk",Ze),E.on("message:answer-complete",Je),E.on("message:complete",et),E.on("message:error",tt);const nt=e=>j?.(e),ot=e=>V?.(e);j&&E.on("form:submitted",nt),V&&E.on("form:error",ot);const Me=[];let rt=!1;const it=e=>{if(rt)return;Me.push(e.install(E));let n=e.store.get().submitted;const s=e.store.subscribe(S=>{S.submitted&&!n&&(Xe.push($t(S.submitResult)),L()),n=S.submitted});Me.push(s)};for(const e of l??[])e.schema!=null?it(mt.createFormCollector(e)):mt.loadFormCollector(E,e).then(n=>it(n)).catch(()=>{});async function Ce(e,n){const s=e.trim();if(!s&&!n?.length||J)return;if(B?.(s),J=!0,de=null,K){clearInterval(K),K=void 0;const y=u.find(G=>G.id.startsWith("ago-intro-"));y&&!y.content?u=u.filter(G=>G!==y):y&&(y.status="DONE")}const S=Date.now();u.push({id:`temp-user-${S}`,conversationId:H||"",content:s,role:"user",status:"DONE",attachments:n&&n.length>0?se.attachmentsFromFiles(n):void 0,createdAt:new Date}),u.push({id:`temp-assistant-${S}`,conversationId:H||"",content:"",role:"assistant",status:"IN_PROGRESS",createdAt:new Date}),L();try{const y=await E.sendMessage(s,{conversationId:H,files:n});y.conversationId&&(H||(H=y.conversationId),he?.setActiveThread(y.conversationId,y.createdAt));const G=u.find(Y=>Y.id===`temp-user-${S}`);if(G&&(G.id=`user-${S}`,G.conversationId=y.conversationId),!u.some(Y=>Y.id===y.id)){const Y=u.findIndex(Kt=>Kt.id===`temp-assistant-${S}`);Y>=0?u[Y]=y:u.push(y)}u=u.filter(Y=>!Y.id.startsWith("temp-")),y.status!=="WAITING_CLIENT"&&(J=!1),L(),g&&Oe()}catch(y){de=y instanceof Error?y.message:"Failed to send message",J=!1,u=u.filter(G=>!G.id.startsWith("temp-")),L()}}async function Oe(){try{const e=await E.getConversations();xe.splice(0,xe.length,...e)}catch{}return xe}async function Ft(e){try{const n=(await E.getConversation(e))?.messages??[];n.length>0&&u.length===0&&(u=n,L())}catch{u.length===0&&(he?.clear(),H=void 0)}}return L(),re&&T?.matches||be(),H?Ft(H):je==="streaming"&&zt(Ge),g&&Oe(),{client:E,element:ve,sendMessage:Ce,...z||re?{open:Ht,close:Wt,toggle:Ut}:{},session:he,threads:xe,refreshThreads:Oe,destroy(){K&&clearInterval(K),E.off("message:start",Qe),E.off("message:chunk",Ze),E.off("message:answer-complete",Je),E.off("message:complete",et),E.off("message:error",tt),j&&E.off("form:submitted",nt),V&&E.off("form:error",ot),rt=!0,Me.forEach(e=>e()),ve.remove(),$?.remove(),P?.remove(),fe?.remove(),X?.remove(),T?.removeEventListener("change",st),re&&(document.removeEventListener("keydown",at),ct(),W&&ke()),ge&&(ge=!1,ke()),o.client||E.destroy()}};function Ee(){if(!U)return;{const s=ye==="left"?"border-right":"border-left";T?.matches?(U.style.width="100%",d.style.borderRadius="0",d.style.removeProperty(s)):(U.style.width=typeof x=="number"?`${x}px`:x,d.style.setProperty(s,`1px solid ${N}`))}const e=m==="left"?"translateX(-100%)":"translateX(100%)";U.style.transform=Z?"translateX(0)":e,U.setAttribute("aria-hidden",Z?"false":"true"),$&&($.style.display=Z?"none":"flex");const n=Z&&!!T?.matches;n!==ge&&(ge=n,n?wt():ke())}function De(){Z=!0,Ee(),be(),M?.()}function ze(){Z=!1,Ee(),q?.()}function Pt(){Z?ze():De()}function Ht(){z?De():ue()}function Wt(){z?ze():me()}function Ut(){z?Pt():W?me():ue()}function Gt(){return Array.from(d.querySelectorAll('a[href],button:not([disabled]),textarea:not([disabled]),input:not([disabled]),select:not([disabled]),[tabindex]:not([tabindex="-1"])')).filter(e=>e.getClientRects().length>0)}function at(e){if(!W)return;if(e.key==="Escape"){me();return}if(e.key!=="Tab")return;const n=Gt();if(n.length===0){e.preventDefault();return}const s=n[0],S=n[n.length-1],y=document.activeElement;e.shiftKey&&(y===s||!d.contains(y))?(e.preventDefault(),S.focus()):!e.shiftKey&&(y===S||!d.contains(y))&&(e.preventDefault(),s.focus())}function st(e){z?Ee():!e.matches&&W&&me(),L()}function lt(){return window.visualViewport?.height??window.innerHeight}function dt(){const e=window.visualViewport,n=e?.offsetTop??0,s=e?.height??pe,S=Math.min(0,n+s-pe);d.style.top=`${S}px`,P&&(P.style.top=`${n}px`)}function Se(){ie||(ie=requestAnimationFrame(()=>{ie=0,dt()}))}function jt(){window.visualViewport?.addEventListener("resize",Se),window.visualViewport?.addEventListener("scroll",Se)}function ct(){window.visualViewport?.removeEventListener("resize",Se),window.visualViewport?.removeEventListener("scroll",Se),ie&&(cancelAnimationFrame(ie),ie=0)}function pt(){_.scrollTop=_.scrollHeight}function Vt(){const e=h({position:"fixed",top:"0",left:"0",right:"0",height:`calc(${Ye}px + env(safe-area-inset-top))`,display:"none",alignItems:"center",justifyContent:"space-between",padding:"env(safe-area-inset-top) 14px 0",backgroundColor:te,borderBottom:`1px solid ${N}`,zIndex:"2147483001",fontFamily:Ie});if(e.className="ago-chat-widget-mobile-bar",f){const s=document.createElement("img");s.src=f,s.alt="",v(s,{height:"28px",width:"auto"}),e.appendChild(s)}else if(i){const s=document.createElement("span");s.textContent=i,v(s,{fontSize:"15px",fontWeight:"600",color:ee,overflow:"hidden",whiteSpace:"nowrap",textOverflow:"ellipsis"}),e.appendChild(s)}else e.appendChild(h({}));const n=document.createElement("button");return n.type="button",n.setAttribute("aria-label","Close"),n.textContent="×",v(n,{border:"none",background:"transparent",fontSize:"26px",lineHeight:"1",color:ee,cursor:"pointer",padding:"4px 8px"}),n.addEventListener("click",()=>{me()}),e.appendChild(n),e}function qt(){return typeof document.startViewTransition=="function"&&!Tt?.matches&&!!T?.matches}function ft(e){const n=document;if(qt()&&n.startViewTransition){d.style.setProperty("view-transition-name",ce),P?.style.setProperty("view-transition-name",`${ce}-bar`);const s=()=>{d.style.removeProperty("view-transition-name"),P?.style.removeProperty("view-transition-name")};return n.startViewTransition(e).finished.then(s,s)}return e(),Promise.resolve()}function ut(e){if(e)X&&d.parentElement?.insertBefore(X,d),v(d,{position:"fixed",top:"0",left:"0",right:"0",bottom:"0",height:"var(--ago-vh, 100dvh)",zIndex:"2147483000",border:"none",borderRadius:"0",boxShadow:"none",paddingTop:`calc(${Ye}px + env(safe-area-inset-top))`,paddingBottom:"env(safe-area-inset-bottom)"}),d.setAttribute("role","dialog"),d.setAttribute("aria-modal","true"),d.setAttribute("aria-label",i),wt(),F&&(F.style.display="none"),P&&(P.style.display="flex");else{X?.remove(),X=void 0;for(const n of["position","top","left","right","bottom","z-index","padding-top","padding-bottom"])d.style.removeProperty(n);d.style.height=we.height,d.style.border=we.border,d.style.borderRadius=we.borderRadius,d.style.boxShadow=we.boxShadow,d.removeAttribute("role"),d.removeAttribute("aria-modal"),d.removeAttribute("aria-label"),ke(),F&&(F.style.display="flex"),P&&(P.style.display="none")}}function ue(){if(W||!T?.matches)return Promise.resolve();const e=d.getBoundingClientRect();if(e.height>=lt()*.8)return Promise.resolve();W=!0,X=h({width:`${e.width}px`,height:`${e.height}px`}),X.className="ago-chat-widget-spacer",X.setAttribute("aria-hidden","true"),pe=lt(),d.style.setProperty("--ago-vh",`${pe}px`),dt(),jt();const n=ft(()=>ut(!0));return n.then(()=>{pt(),be()}),pt(),M?.(),n}function me(){if(!W)return Promise.resolve();W=!1,ct(),d.querySelector("textarea")?.blur();const e=ft(()=>ut(!1));return e.then(()=>d.style.removeProperty("--ago-vh")),pe=0,q?.(),e}}exports.mountChatWidget=hn;exports.renderMarkdown=Ne;
|
package/dist/widget.d.cts
CHANGED
|
@@ -41,6 +41,12 @@ declare class AgoClient {
|
|
|
41
41
|
private warnedEmptyConversations;
|
|
42
42
|
/** Paused turns awaiting auto-resume, keyed by assistant message id. */
|
|
43
43
|
private pendingResumes;
|
|
44
|
+
/**
|
|
45
|
+
* Client function invocations held pending user approval, keyed by
|
|
46
|
+
* invocationId (the tool-call id). Populated when {@link requiresApproval}
|
|
47
|
+
* matches; drained by {@link approveFunction} / {@link rejectFunction}.
|
|
48
|
+
*/
|
|
49
|
+
private pendingApprovals;
|
|
44
50
|
/** App-provided gate deciding WHEN a paused turn resumes (see {@link registerResumeGate}). */
|
|
45
51
|
private resumeGate;
|
|
46
52
|
constructor(config: AgoConfig);
|
|
@@ -91,6 +97,24 @@ declare class AgoClient {
|
|
|
91
97
|
*/
|
|
92
98
|
private maybeFlagEmptyReply;
|
|
93
99
|
private handleClientFunctionInvocation;
|
|
100
|
+
/**
|
|
101
|
+
* Whether a client function invocation must wait for explicit user approval.
|
|
102
|
+
* True when the {@link AgoConfig.approvalPolicy} returns true OR the function
|
|
103
|
+
* was registered with `requiresApproval: true` — the two OR together.
|
|
104
|
+
*/
|
|
105
|
+
private requiresApproval;
|
|
106
|
+
/**
|
|
107
|
+
* Approve a client function call held by the approval gate: run it, submit its
|
|
108
|
+
* result, and let the paused turn resume. No-op if the invocation is unknown
|
|
109
|
+
* (already handled, or never gated).
|
|
110
|
+
*/
|
|
111
|
+
approveFunction(invocationId: string): Promise<void>;
|
|
112
|
+
/**
|
|
113
|
+
* Reject a client function call held by the approval gate: submit a rejection
|
|
114
|
+
* result so the agent sees the user declined, and let the paused turn resume
|
|
115
|
+
* (the agent decides what to do next). No-op if the invocation is unknown.
|
|
116
|
+
*/
|
|
117
|
+
rejectFunction(invocationId: string): Promise<void>;
|
|
94
118
|
/**
|
|
95
119
|
* Get list of conversations
|
|
96
120
|
*/
|
|
@@ -120,8 +144,10 @@ declare class AgoClient {
|
|
|
120
144
|
*
|
|
121
145
|
* Opt-in on purpose — re-running functions on reload can be surprising (e.g. a
|
|
122
146
|
* navigation function would navigate again), so the app decides. Returns the
|
|
123
|
-
* resumed turn's final message, or `null` when there was nothing to resume
|
|
124
|
-
* some waiting function is not registered on this page
|
|
147
|
+
* resumed turn's final message, or `null` when there was nothing to resume,
|
|
148
|
+
* some waiting function is not registered on this page, or a waiting call is
|
|
149
|
+
* gated by the approval policy (it is held for `approveFunction` /
|
|
150
|
+
* `rejectFunction` and the turn stays paused, exactly as on the live stream).
|
|
125
151
|
*/
|
|
126
152
|
resumePendingClientFunctions(conversation: Conversation): Promise<AgoMessage | null>;
|
|
127
153
|
/**
|
|
@@ -416,6 +442,15 @@ declare interface AgoClientEvents {
|
|
|
416
442
|
"toolCall:received": ToolCallData;
|
|
417
443
|
"toolCall:form": ToolCallData;
|
|
418
444
|
"function:invoke": ClientFunctionInvocation;
|
|
445
|
+
/**
|
|
446
|
+
* A client function call is held pending the user's approval (pause mode +
|
|
447
|
+
* an {@link AgoConfig.approvalPolicy}/`requiresApproval` match). The turn stays
|
|
448
|
+
* at `WAITING_CLIENT`; call `approveFunction(invocationId)` to run it and
|
|
449
|
+
* resume, or `rejectFunction(invocationId)` to decline. Fires after
|
|
450
|
+
* `function:invoke` (which still fires for every call) and instead of the
|
|
451
|
+
* call running immediately.
|
|
452
|
+
*/
|
|
453
|
+
"function:awaiting-approval": ClientFunctionInvocation;
|
|
419
454
|
"function:result": {
|
|
420
455
|
invocationId: string;
|
|
421
456
|
result: unknown;
|
|
@@ -476,14 +511,28 @@ declare interface AgoConfig {
|
|
|
476
511
|
warnOnEmptyReply?: boolean;
|
|
477
512
|
/**
|
|
478
513
|
* How the agent loop treats client function calls (requires backend support):
|
|
479
|
-
* - `"
|
|
480
|
-
* result; the real result is only visible to the agent on later turns.
|
|
481
|
-
* - `"pause"`: the turn stops on client function call(s) with status
|
|
514
|
+
* - `"pause"` (default): the turn stops on client function call(s) with status
|
|
482
515
|
* `WAITING_CLIENT`; once every result is submitted, the SDK resumes the SAME
|
|
483
516
|
* turn via `POST /messages/{id}/continue`, so the agent sees the real results.
|
|
517
|
+
* - `"placeholder"` (legacy): the turn continues immediately on a placeholder
|
|
518
|
+
* result; the real result is only visible to the agent on later turns.
|
|
484
519
|
* Older backends ignore the flag, so `"pause"` degrades to legacy behavior.
|
|
485
520
|
*/
|
|
486
521
|
clientFunctionsMode?: ClientFunctionsMode;
|
|
522
|
+
/**
|
|
523
|
+
* Gate client function calls behind explicit user approval. Return `true` for
|
|
524
|
+
* an invocation the user must approve/reject before it runs; return `false`
|
|
525
|
+
* (or omit the policy) to let it run immediately as before.
|
|
526
|
+
*
|
|
527
|
+
* Only effective in pause mode (`clientFunctionsMode: "pause"`) — a gated call
|
|
528
|
+
* holds at `WAITING_CLIENT`, the SDK emits `function:awaiting-approval`, and it
|
|
529
|
+
* runs (and the turn resumes) only after `approveFunction(invocationId)`; a
|
|
530
|
+
* `rejectFunction(invocationId)` submits a rejection so the agent sees the
|
|
531
|
+
* decline. In placeholder mode there is no pause to hold, so the policy is a
|
|
532
|
+
* no-op and the call runs normally. A per-function `requiresApproval: true`
|
|
533
|
+
* also gates a call; the policy and the flag OR together.
|
|
534
|
+
*/
|
|
535
|
+
approvalPolicy?: (invocation: ClientFunctionInvocation) => boolean;
|
|
487
536
|
/**
|
|
488
537
|
* Max serialized size (bytes) of a client function result before the SDK
|
|
489
538
|
* replaces it with a flagged, truncated preview. Everything a handler
|
|
@@ -528,6 +577,11 @@ declare interface AgoMessage {
|
|
|
528
577
|
declare interface AgoPageStateOptions {
|
|
529
578
|
/** Name of the synthesized client function. Defaults to "setPageState". */
|
|
530
579
|
functionName?: string;
|
|
580
|
+
/**
|
|
581
|
+
* Require explicit user approval before this state change runs. See
|
|
582
|
+
* {@link AgoConfig.approvalPolicy} — pause mode only. Defaults to `false`.
|
|
583
|
+
*/
|
|
584
|
+
requiresApproval?: boolean;
|
|
531
585
|
}
|
|
532
586
|
|
|
533
587
|
/**
|
|
@@ -652,6 +706,11 @@ declare interface ClientFunctionDefinition {
|
|
|
652
706
|
* `Infinity` disables the guard for this function.
|
|
653
707
|
*/
|
|
654
708
|
maxResultBytes?: number;
|
|
709
|
+
/**
|
|
710
|
+
* Require explicit user approval before this function runs. See
|
|
711
|
+
* {@link AgoConfig.approvalPolicy} — pause mode only. ORs with the policy.
|
|
712
|
+
*/
|
|
713
|
+
requiresApproval?: boolean;
|
|
655
714
|
}
|
|
656
715
|
|
|
657
716
|
/**
|
|
@@ -678,6 +737,11 @@ declare type ClientFunctionRegisterOptions = Omit<ClientFunctionSchema, "name">
|
|
|
678
737
|
* disables the guard for this function.
|
|
679
738
|
*/
|
|
680
739
|
maxResultBytes?: number;
|
|
740
|
+
/**
|
|
741
|
+
* Require explicit user approval before this function runs. See
|
|
742
|
+
* {@link AgoConfig.approvalPolicy} — pause mode only. ORs with the policy.
|
|
743
|
+
*/
|
|
744
|
+
requiresApproval?: boolean;
|
|
681
745
|
};
|
|
682
746
|
|
|
683
747
|
/**
|
|
@@ -718,6 +782,19 @@ declare interface ContextEntry {
|
|
|
718
782
|
description?: string;
|
|
719
783
|
/** Arbitrary structured data the AI should know about */
|
|
720
784
|
data?: Record<string, unknown>;
|
|
785
|
+
/**
|
|
786
|
+
* Marks the entry as constant for the whole conversation. The backend then
|
|
787
|
+
* pins it right after the system prompt, where LLM providers cache it across
|
|
788
|
+
* turns, instead of re-processing it next to every new user message.
|
|
789
|
+
*
|
|
790
|
+
* Only set this when the entry's content is byte-identical on every message
|
|
791
|
+
* of a conversation (a schema, a capability list, static instructions). A
|
|
792
|
+
* stable entry that changes between messages invalidates the provider's
|
|
793
|
+
* cache for the entire conversation history, which costs more than leaving
|
|
794
|
+
* the flag off. Default: `false` (re-sent near the newest user message).
|
|
795
|
+
* Backends that don't know the flag ignore it.
|
|
796
|
+
*/
|
|
797
|
+
stable?: boolean;
|
|
721
798
|
}
|
|
722
799
|
|
|
723
800
|
/**
|
package/dist/widget.d.ts
CHANGED
|
@@ -41,6 +41,12 @@ declare class AgoClient {
|
|
|
41
41
|
private warnedEmptyConversations;
|
|
42
42
|
/** Paused turns awaiting auto-resume, keyed by assistant message id. */
|
|
43
43
|
private pendingResumes;
|
|
44
|
+
/**
|
|
45
|
+
* Client function invocations held pending user approval, keyed by
|
|
46
|
+
* invocationId (the tool-call id). Populated when {@link requiresApproval}
|
|
47
|
+
* matches; drained by {@link approveFunction} / {@link rejectFunction}.
|
|
48
|
+
*/
|
|
49
|
+
private pendingApprovals;
|
|
44
50
|
/** App-provided gate deciding WHEN a paused turn resumes (see {@link registerResumeGate}). */
|
|
45
51
|
private resumeGate;
|
|
46
52
|
constructor(config: AgoConfig);
|
|
@@ -91,6 +97,24 @@ declare class AgoClient {
|
|
|
91
97
|
*/
|
|
92
98
|
private maybeFlagEmptyReply;
|
|
93
99
|
private handleClientFunctionInvocation;
|
|
100
|
+
/**
|
|
101
|
+
* Whether a client function invocation must wait for explicit user approval.
|
|
102
|
+
* True when the {@link AgoConfig.approvalPolicy} returns true OR the function
|
|
103
|
+
* was registered with `requiresApproval: true` — the two OR together.
|
|
104
|
+
*/
|
|
105
|
+
private requiresApproval;
|
|
106
|
+
/**
|
|
107
|
+
* Approve a client function call held by the approval gate: run it, submit its
|
|
108
|
+
* result, and let the paused turn resume. No-op if the invocation is unknown
|
|
109
|
+
* (already handled, or never gated).
|
|
110
|
+
*/
|
|
111
|
+
approveFunction(invocationId: string): Promise<void>;
|
|
112
|
+
/**
|
|
113
|
+
* Reject a client function call held by the approval gate: submit a rejection
|
|
114
|
+
* result so the agent sees the user declined, and let the paused turn resume
|
|
115
|
+
* (the agent decides what to do next). No-op if the invocation is unknown.
|
|
116
|
+
*/
|
|
117
|
+
rejectFunction(invocationId: string): Promise<void>;
|
|
94
118
|
/**
|
|
95
119
|
* Get list of conversations
|
|
96
120
|
*/
|
|
@@ -120,8 +144,10 @@ declare class AgoClient {
|
|
|
120
144
|
*
|
|
121
145
|
* Opt-in on purpose — re-running functions on reload can be surprising (e.g. a
|
|
122
146
|
* navigation function would navigate again), so the app decides. Returns the
|
|
123
|
-
* resumed turn's final message, or `null` when there was nothing to resume
|
|
124
|
-
* some waiting function is not registered on this page
|
|
147
|
+
* resumed turn's final message, or `null` when there was nothing to resume,
|
|
148
|
+
* some waiting function is not registered on this page, or a waiting call is
|
|
149
|
+
* gated by the approval policy (it is held for `approveFunction` /
|
|
150
|
+
* `rejectFunction` and the turn stays paused, exactly as on the live stream).
|
|
125
151
|
*/
|
|
126
152
|
resumePendingClientFunctions(conversation: Conversation): Promise<AgoMessage | null>;
|
|
127
153
|
/**
|
|
@@ -416,6 +442,15 @@ declare interface AgoClientEvents {
|
|
|
416
442
|
"toolCall:received": ToolCallData;
|
|
417
443
|
"toolCall:form": ToolCallData;
|
|
418
444
|
"function:invoke": ClientFunctionInvocation;
|
|
445
|
+
/**
|
|
446
|
+
* A client function call is held pending the user's approval (pause mode +
|
|
447
|
+
* an {@link AgoConfig.approvalPolicy}/`requiresApproval` match). The turn stays
|
|
448
|
+
* at `WAITING_CLIENT`; call `approveFunction(invocationId)` to run it and
|
|
449
|
+
* resume, or `rejectFunction(invocationId)` to decline. Fires after
|
|
450
|
+
* `function:invoke` (which still fires for every call) and instead of the
|
|
451
|
+
* call running immediately.
|
|
452
|
+
*/
|
|
453
|
+
"function:awaiting-approval": ClientFunctionInvocation;
|
|
419
454
|
"function:result": {
|
|
420
455
|
invocationId: string;
|
|
421
456
|
result: unknown;
|
|
@@ -476,14 +511,28 @@ declare interface AgoConfig {
|
|
|
476
511
|
warnOnEmptyReply?: boolean;
|
|
477
512
|
/**
|
|
478
513
|
* How the agent loop treats client function calls (requires backend support):
|
|
479
|
-
* - `"
|
|
480
|
-
* result; the real result is only visible to the agent on later turns.
|
|
481
|
-
* - `"pause"`: the turn stops on client function call(s) with status
|
|
514
|
+
* - `"pause"` (default): the turn stops on client function call(s) with status
|
|
482
515
|
* `WAITING_CLIENT`; once every result is submitted, the SDK resumes the SAME
|
|
483
516
|
* turn via `POST /messages/{id}/continue`, so the agent sees the real results.
|
|
517
|
+
* - `"placeholder"` (legacy): the turn continues immediately on a placeholder
|
|
518
|
+
* result; the real result is only visible to the agent on later turns.
|
|
484
519
|
* Older backends ignore the flag, so `"pause"` degrades to legacy behavior.
|
|
485
520
|
*/
|
|
486
521
|
clientFunctionsMode?: ClientFunctionsMode;
|
|
522
|
+
/**
|
|
523
|
+
* Gate client function calls behind explicit user approval. Return `true` for
|
|
524
|
+
* an invocation the user must approve/reject before it runs; return `false`
|
|
525
|
+
* (or omit the policy) to let it run immediately as before.
|
|
526
|
+
*
|
|
527
|
+
* Only effective in pause mode (`clientFunctionsMode: "pause"`) — a gated call
|
|
528
|
+
* holds at `WAITING_CLIENT`, the SDK emits `function:awaiting-approval`, and it
|
|
529
|
+
* runs (and the turn resumes) only after `approveFunction(invocationId)`; a
|
|
530
|
+
* `rejectFunction(invocationId)` submits a rejection so the agent sees the
|
|
531
|
+
* decline. In placeholder mode there is no pause to hold, so the policy is a
|
|
532
|
+
* no-op and the call runs normally. A per-function `requiresApproval: true`
|
|
533
|
+
* also gates a call; the policy and the flag OR together.
|
|
534
|
+
*/
|
|
535
|
+
approvalPolicy?: (invocation: ClientFunctionInvocation) => boolean;
|
|
487
536
|
/**
|
|
488
537
|
* Max serialized size (bytes) of a client function result before the SDK
|
|
489
538
|
* replaces it with a flagged, truncated preview. Everything a handler
|
|
@@ -528,6 +577,11 @@ declare interface AgoMessage {
|
|
|
528
577
|
declare interface AgoPageStateOptions {
|
|
529
578
|
/** Name of the synthesized client function. Defaults to "setPageState". */
|
|
530
579
|
functionName?: string;
|
|
580
|
+
/**
|
|
581
|
+
* Require explicit user approval before this state change runs. See
|
|
582
|
+
* {@link AgoConfig.approvalPolicy} — pause mode only. Defaults to `false`.
|
|
583
|
+
*/
|
|
584
|
+
requiresApproval?: boolean;
|
|
531
585
|
}
|
|
532
586
|
|
|
533
587
|
/**
|
|
@@ -652,6 +706,11 @@ declare interface ClientFunctionDefinition {
|
|
|
652
706
|
* `Infinity` disables the guard for this function.
|
|
653
707
|
*/
|
|
654
708
|
maxResultBytes?: number;
|
|
709
|
+
/**
|
|
710
|
+
* Require explicit user approval before this function runs. See
|
|
711
|
+
* {@link AgoConfig.approvalPolicy} — pause mode only. ORs with the policy.
|
|
712
|
+
*/
|
|
713
|
+
requiresApproval?: boolean;
|
|
655
714
|
}
|
|
656
715
|
|
|
657
716
|
/**
|
|
@@ -678,6 +737,11 @@ declare type ClientFunctionRegisterOptions = Omit<ClientFunctionSchema, "name">
|
|
|
678
737
|
* disables the guard for this function.
|
|
679
738
|
*/
|
|
680
739
|
maxResultBytes?: number;
|
|
740
|
+
/**
|
|
741
|
+
* Require explicit user approval before this function runs. See
|
|
742
|
+
* {@link AgoConfig.approvalPolicy} — pause mode only. ORs with the policy.
|
|
743
|
+
*/
|
|
744
|
+
requiresApproval?: boolean;
|
|
681
745
|
};
|
|
682
746
|
|
|
683
747
|
/**
|
|
@@ -718,6 +782,19 @@ declare interface ContextEntry {
|
|
|
718
782
|
description?: string;
|
|
719
783
|
/** Arbitrary structured data the AI should know about */
|
|
720
784
|
data?: Record<string, unknown>;
|
|
785
|
+
/**
|
|
786
|
+
* Marks the entry as constant for the whole conversation. The backend then
|
|
787
|
+
* pins it right after the system prompt, where LLM providers cache it across
|
|
788
|
+
* turns, instead of re-processing it next to every new user message.
|
|
789
|
+
*
|
|
790
|
+
* Only set this when the entry's content is byte-identical on every message
|
|
791
|
+
* of a conversation (a schema, a capability list, static instructions). A
|
|
792
|
+
* stable entry that changes between messages invalidates the provider's
|
|
793
|
+
* cache for the entire conversation history, which costs more than leaving
|
|
794
|
+
* the flag off. Default: `false` (re-sent near the newest user message).
|
|
795
|
+
* Backends that don't know the flag ignore it.
|
|
796
|
+
*/
|
|
797
|
+
stable?: boolean;
|
|
721
798
|
}
|
|
722
799
|
|
|
723
800
|
/**
|