@useago/sdk 1.0.8 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/vue.d.ts CHANGED
@@ -512,7 +512,7 @@ declare interface FormCollectorDefinition<V = Record<string, unknown>> {
512
512
 
513
513
  /**
514
514
  * Shape of a form's fields. Mirrors a client function's `parameters` (so the same
515
- * object feeds the store, the update function, and the dynamic context). Additionally allows the SDK-only per-field `requiredWhen`, which {@link toWireParameters} removes before the schema reaches the LLM.
515
+ * object feeds the store, the update function, and the dynamic context). Additionally allows the SDK-only per-field `requiredWhen`, which {@link toWireParameters} removes from the LLM tool's `parameters` (the full schema still reaches the agent via dynamic context).
516
516
  */
517
517
  declare interface FormCollectorSchema {
518
518
  type: "object";
@@ -537,17 +537,32 @@ declare interface FormField_2 {
537
537
  }
538
538
 
539
539
  /**
540
- * A field's conditional-requiredness rule. The field becomes required exactly
541
- * when the controlling `property` matches `value` against the answers collected
542
- * so far:
540
+ * A field's conditional-requiredness rule: either a single {@link FormFieldLeafCondition}
541
+ * or a boolean combination of rules. `anyOf` is OR (true when any nested rule
542
+ * holds); `allOf` is AND (true when every nested rule holds). Both nest
543
+ * arbitrarily, so you can mix them, e.g.
544
+ * `{ anyOf: [{ property: "a", op: ">=", value: 1 }, { property: "b", value: "1" }] }`.
545
+ * An empty `anyOf` is never required; an empty `allOf` is always required.
546
+ *
547
+ * Stripped from the LLM tool's `parameters` (see {@link toWireParameters}), but the
548
+ * full schema, `requiredWhen` included, still reaches the agent via the dynamic
549
+ * context so it knows when each field becomes required.
550
+ */
551
+ declare type FormFieldCondition = FormFieldLeafCondition | {
552
+ anyOf: FormFieldCondition[];
553
+ } | {
554
+ allOf: FormFieldCondition[];
555
+ };
556
+
557
+ /**
558
+ * A single leaf comparison. The field it guards becomes required exactly when the
559
+ * controlling `property` matches `value` against the answers collected so far:
543
560
  * - a single `value`, no `op` — equality (compared as strings);
544
561
  * - a single `value` with `op` — numeric comparison (both sides coerced to numbers);
545
562
  * - an array `value`, no `op` — "one of": matches when the property equals any
546
563
  * listed value.
547
- *
548
- * SDK-only — it is stripped from the schema before it reaches the LLM tool
549
564
  */
550
- declare interface FormFieldCondition {
565
+ declare interface FormFieldLeafCondition {
551
566
  /** The controlling field whose value the rule tests. */
552
567
  property: string;
553
568
  /** Comparison operator; omitted means equality. Ignored when `value` is an array. */
@@ -568,7 +583,8 @@ declare interface FormFieldSchema {
568
583
  default?: unknown;
569
584
  /**
570
585
  * Makes the field required only while this condition holds. Drives the dynamic
571
- * `missing` list; stripped before the LLM tool — see {@link toWireParameters}.
586
+ * `missing` list; stripped from the LLM tool's `parameters` (still sent to the
587
+ * agent via dynamic context). See {@link toWireParameters}.
572
588
  */
573
589
  requiredWhen?: FormFieldCondition;
574
590
  }
package/dist/widget.cjs CHANGED
@@ -1,5 +1,5 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const De=require("./AgoClient-B3-WGVne.cjs"),Me=require("./createFormCollector-BHHEW6uX.cjs"),rt=require("./createConversationSession-BwYNMZWq.cjs");var at={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function U(o){return o.replace(/[&<>"']/g,n=>at[n])}function Fe(o){const n=o.trim();return/^(https?:|mailto:|tel:|#|\/|\.\/|\.\.\/)/i.test(n)||!/^[a-z][a-z0-9+.-]*:/i.test(n)?n:null}var We='"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace',Q="";function F(o){const n=[],a=u=>(n.push(u),`${Q}${n.length-1}${Q}`);let t=o;return t=t.replace(/`([^`]+)`/g,(u,s)=>a(`<code style="background:#f0f2f5;padding:2px 5px;border-radius:4px;font-size:13px;font-family:${We}">${U(s)}</code>`)),t=t.replace(/!\[([^\]]*)\]\(([^)\s]+)\)/g,(u,s,f)=>{const l=Fe(f);return l?a(`<img alt="${U(s)}" src="${U(l)}" style="max-width:100%;border-radius:8px;margin:4px 0" />`):u}),t=t.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(u,s,f)=>{const l=Fe(f);return l?a(`<a href="${U(l)}" target="_blank" rel="noopener noreferrer" style="color:#1b5fc4;text-decoration:underline">${F(s)}</a>`):u}),t=U(t),t=t.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>"),t=t.replace(new RegExp(`${Q}(\\d+)${Q}`,"g"),(u,s)=>n[Number(s)]),t}function R(o,n,a){const t=document.createElement(o);return Object.assign(t.style,n),a!==void 0&&(t.innerHTML=a),t}var Pe=/^ {0,3}([-*_])( *\1){2,} *$/,Ge=/^ {0,3}(#{1,6})\s+(.*?)\s*#*\s*$/,je=/^ {0,3}(```+|~~~+)/,Z=/^ {0,3}>\s?/,W=/^(\s*)([-*+]|\d+[.)])\s+(.*)$/,it=["20px","18px","16px","15px","14px","13px"],he=o=>o.match(/^\s*/)?.[0].length??0;function st(o){return o.trim()===""||Pe.test(o)||Ge.test(o)||je.test(o)||Z.test(o)||W.test(o)}function qe(o){const n=o[0].match(W),a=n[1].length,t=/\d/.test(n[2]),u=R(t?"ol":"ul",{margin:"0 0 8px 0",paddingLeft:"20px",listStyleType:t?"decimal":"disc",listStylePosition:"outside"});let s=0;for(;s<o.length;){const f=o[s].match(W),l=[];for(s++;s<o.length&&he(o[s])>a;)l.push(o[s]),s++;const p=R("li",{display:"list-item",margin:"2px 0",lineHeight:"1.6"}),c=f[3].match(/^\[([ xX])\]\s+(.*)$/);c?(p.style.listStyleType="none",p.style.marginLeft="-20px",p.innerHTML=`<span style="margin-right:6px">${c[1].toLowerCase()==="x"?"☑":"☐"}</span>${F(c[2])}`):p.innerHTML=F(f[3]),l.filter(m=>W.test(m)).length>0&&p.appendChild(qe(l.filter(m=>m.trim()!==""))),u.appendChild(p)}return u}function lt(o){const n=l=>l.replace(/^\s*\|?/,"").replace(/\|?\s*$/,"").split("|").map(p=>p.trim()),a=R("div",{overflowX:"auto",margin:"0 0 8px 0"}),t=R("table",{borderCollapse:"collapse",width:"100%",fontSize:"13px"}),u=document.createElement("thead"),s=document.createElement("tr");for(const l of n(o[0]))s.appendChild(R("th",{border:"1px solid #dee3e8",padding:"6px 10px",textAlign:"left",backgroundColor:"#f5f7fa",fontWeight:"600"},F(l)));u.appendChild(s),t.appendChild(u);const f=document.createElement("tbody");for(const l of o.slice(2)){const p=document.createElement("tr");for(const c of n(l))p.appendChild(R("td",{border:"1px solid #dee3e8",padding:"6px 10px"},F(c)));f.appendChild(p)}return t.appendChild(f),a.appendChild(t),a}var dt=o=>!!o&&/^\s*\|?\s*:?-{1,}:?\s*(\|\s*:?-{1,}:?\s*)*\|?\s*$/.test(o);function J(o){const n=document.createDocumentFragment(),a=o.replace(/\r\n?/g,`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Oe=require("./AgoClient-B3-WGVne.cjs"),De=require("./createFormCollector-BI3DXaew.cjs"),at=require("./createConversationSession-C0diFTUk.cjs");var it={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function U(r){return r.replace(/[&<>"']/g,o=>it[o])}function Be(r){const o=r.trim();return/^(https?:|mailto:|tel:|#|\/|\.\/|\.\.\/)/i.test(o)||!/^[a-z][a-z0-9+.-]*:/i.test(o)?o:null}var Ue='"IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace',Z="";function M(r){const o=[],a=u=>(o.push(u),`${Z}${o.length-1}${Z}`);let t=r;return t=t.replace(/`([^`]+)`/g,(u,s)=>a(`<code style="background:#f0f2f5;padding:2px 5px;border-radius:4px;font-size:13px;font-family:${Ue}">${U(s)}</code>`)),t=t.replace(/!\[([^\]]*)\]\(([^)\s]+)\)/g,(u,s,f)=>{const l=Be(f);return l?a(`<img alt="${U(s)}" src="${U(l)}" style="max-width:100%;border-radius:8px;margin:4px 0" />`):u}),t=t.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(u,s,f)=>{const l=Be(f);return l?a(`<a href="${U(l)}" target="_blank" rel="noopener noreferrer" style="color:#1b5fc4;text-decoration:underline">${M(s)}</a>`):u}),t=U(t),t=t.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>"),t=t.replace(new RegExp(`${Z}(\\d+)${Z}`,"g"),(u,s)=>o[Number(s)]),t}function R(r,o,a){const t=document.createElement(r);return Object.assign(t.style,o),a!==void 0&&(t.innerHTML=a),t}var We=/^ {0,3}([-*_])( *\1){2,} *$/,Pe=/^ {0,3}(#{1,6})\s+(.*?)\s*#*\s*$/,Ge=/^ {0,3}(```+|~~~+)/,ee=/^ {0,3}>\s?/,W=/^(\s*)([-*+]|\d+[.)])\s+(.*)$/,st=["20px","18px","16px","15px","14px","13px"],he=r=>r.match(/^\s*/)?.[0].length??0;function lt(r){return r.trim()===""||We.test(r)||Pe.test(r)||Ge.test(r)||ee.test(r)||W.test(r)}function je(r){const o=r[0].match(W),a=o[1].length,t=/\d/.test(o[2]),u=R(t?"ol":"ul",{margin:"0 0 8px 0",paddingLeft:"20px",listStyleType:t?"decimal":"disc",listStylePosition:"outside"});let s=0;for(;s<r.length;){const f=r[s].match(W),l=[];for(s++;s<r.length&&he(r[s])>a;)l.push(r[s]),s++;const p=R("li",{display:"list-item",margin:"2px 0",lineHeight:"1.6"}),c=f[3].match(/^\[([ xX])\]\s+(.*)$/);c?(p.style.listStyleType="none",p.style.marginLeft="-20px",p.innerHTML=`<span style="margin-right:6px">${c[1].toLowerCase()==="x"?"☑":"☐"}</span>${M(c[2])}`):p.innerHTML=M(f[3]),l.filter(h=>W.test(h)).length>0&&p.appendChild(je(l.filter(h=>h.trim()!==""))),u.appendChild(p)}return u}function dt(r){const o=l=>l.replace(/^\s*\|?/,"").replace(/\|?\s*$/,"").split("|").map(p=>p.trim()),a=R("div",{overflowX:"auto",margin:"0 0 8px 0"}),t=R("table",{borderCollapse:"collapse",width:"100%",fontSize:"13px"}),u=document.createElement("thead"),s=document.createElement("tr");for(const l of o(r[0]))s.appendChild(R("th",{border:"1px solid #dee3e8",padding:"6px 10px",textAlign:"left",backgroundColor:"#f5f7fa",fontWeight:"600"},M(l)));u.appendChild(s),t.appendChild(u);const f=document.createElement("tbody");for(const l of r.slice(2)){const p=document.createElement("tr");for(const c of o(l))p.appendChild(R("td",{border:"1px solid #dee3e8",padding:"6px 10px"},M(c)));f.appendChild(p)}return t.appendChild(f),a.appendChild(t),a}var ct=r=>!!r&&/^\s*\|?\s*:?-{1,}:?\s*(\|\s*:?-{1,}:?\s*)*\|?\s*$/.test(r);function te(r){const o=document.createDocumentFragment(),a=r.replace(/\r\n?/g,`
2
2
  `).split(`
3
- `);let t=0;for(;t<a.length;){const s=a[t];if(s.trim()===""){t++;continue}const f=s.match(je);if(f){const c=f[1][0],m=[];for(t++;t<a.length&&!new RegExp(`^ {0,3}${c==="`"?"`{3,}":"~{3,}"}\\s*$`).test(a[t]);)m.push(a[t]),t++;t++;const N=R("pre",{margin:"0 0 8px 0"});N.appendChild(R("code",{display:"block",background:"#f5f5f5",padding:"8px 12px",borderRadius:"6px",fontSize:"13px",overflowX:"auto",fontFamily:We,whiteSpace:"pre"},U(m.join(`
4
- `)))),n.appendChild(N);continue}if(Pe.test(s)){n.appendChild(R("hr",{border:"none",borderTop:"1px solid #dee3e8",margin:"12px 0"})),t++;continue}const l=s.match(Ge);if(l){const c=l[1].length;n.appendChild(R(`h${c}`,{margin:"16px 0 8px 0",fontSize:it[c-1],fontWeight:"600",lineHeight:"1.3"},F(l[2]))),t++;continue}if(Z.test(s)){const c=[];for(;t<a.length&&Z.test(a[t]);)c.push(a[t].replace(Z,"")),t++;const m=R("blockquote",{borderLeft:"4px solid #dee3e8",paddingLeft:"12px",margin:"0 0 8px 0",fontStyle:"italic",color:"#6b6d6f"});m.appendChild(J(c.join(`
5
- `))),n.appendChild(m);continue}if(s.includes("|")&&dt(a[t+1])){const c=[s,a[t+1]];for(t+=2;t<a.length&&a[t].includes("|")&&a[t].trim();)c.push(a[t]),t++;n.appendChild(lt(c));continue}if(W.test(s)){const c=[],m=he(s);for(;t<a.length&&a[t].trim()!=="";)if(W.test(a[t])||he(a[t])>m)c.push(a[t]),t++;else break;n.appendChild(qe(c));continue}const p=[s];for(t++;t<a.length&&!st(a[t]);)p.push(a[t]),t++;n.appendChild(R("p",{margin:"0 0 8px 0",lineHeight:"1.6"},p.map(c=>F(c)).join("<br>")))}const u=n.lastElementChild;return u&&(u.style.marginBottom="0"),n}var xe='var(--ago-font, "IBM Plex Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif)',Be={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"},be="var(--ago-brand-color, #03182f)",Ce="var(--ago-brand-text-color, #fff)",ct="var(--ago-header-background, var(--ago-brand-color, #03182f))",ze="var(--ago-header-text-color, #e8f0fe)",j="var(--ago-panel-background, #fff)",pt="var(--ago-messages-background, #fbfbfb)",Y="var(--ago-text-color, #30373e)",ft="var(--ago-muted-text-color, #6b6d6f)",I="var(--ago-border-color, #dee3e8)",ge="var(--ago-accent-color, #1b5fc4)",ut="var(--ago-radius, 16px)",me="var(--ago-message-radius, 16px)";function gt(o,n){if(n)for(const a of Object.keys(Be)){const t=n[a];t!=null&&o.style.setProperty(Be[a],t)}}function E(o,n){Object.assign(o.style,n)}function b(o={}){const n=document.createElement("div");return E(n,o),n}var He="Form submitted.";function mt(o){if(typeof o=="string")return o||null;if(!o||typeof o!="object")return null;const n=o;if(typeof n.message=="string"&&n.message)return n.message;const a=n.result;if(typeof a=="string"&&a)return a;if(a&&typeof a=="object"){const t=a.message;if(typeof t=="string"&&t)return t}return null}var Ue="ago-chat-widget-keyframes";function ht(){if(typeof document>"u"||document.getElementById(Ue))return;const o=document.createElement("style");o.id=Ue,o.textContent="@keyframes ago-pulse { 0%, 80%, 100% { opacity: 0.3; transform: scale(0.8); } 40% { opacity: 1; transform: scale(1); } }",document.head.appendChild(o)}function xt(o){const n=typeof o=="string"?document.querySelector(o):o;if(!n)throw new Error(`mountChatWidget: target "${String(o)}" not found.`);return n}function bt(o,n){const{title:a="Chat",welcomeMessage:t="Hello! How can I help you today?",placeholder:u="Type a message...",allowFiles:s=!1,height:f=500,placement:l="inline",width:p=400,defaultOpen:c=!1,logoUrl:m,showAgentName:N=!1,theme:h,loadThreads:_=!1,forms:q,formSubmittedMessage:L=He,onFollowUpClick:$,onMessageSent:ye,onMessageReceived:ee,onFormSubmitted:te,onFormError:ne}=n;if(!n.client&&!n.config?.baseUrl)throw new De.AgoError("mountChatWidget requires either `client` or `config` (with a baseUrl).","config_missing_base_url");const g=n.client??new De.AgoClient(n.config),ve=xt(o),B=l==="left"||l==="right",Xe=B&&(n.launcher??!0);let z=B?c:!0;const oe=n.persistConversation,X=oe?rt.createConversationSession(oe===!0?{}:oe):void 0;let k=n.conversationId??X?.getLastActiveThread()??void 0,d=[],O=!1,P=null;const Ee=[];function Ke(e){if(typeof L=="function"){const i=L(e);if(typeof i=="string"&&i)return i}const r=mt(e);return r||(typeof L=="string"?L:He)}const K=[],H=b({display:"flex",flexDirection:"column",height:B?"100%":typeof f=="number"?`${f}px`:f,border:`1px solid ${I}`,borderRadius:ut,overflow:"hidden",backgroundColor:j,fontFamily:xe,textAlign:"left",boxShadow:"rgba(15, 15, 15, 0.08) 0px 2px 16px 0px"});H.className="ago-chat-widget",gt(H,h);const G=b({padding:"14px 16px",borderBottom:`1px solid ${I}`,backgroundColor:ct,color:ze,display:"flex",alignItems:"center",gap:"10px"});if(G.className="ago-chat-widget__header",m){const e=document.createElement("img");e.src=m,e.alt="Logo",E(e,{height:"24px",width:"auto"}),G.appendChild(e)}const re=document.createElement("h3");if(re.textContent=a,E(re,{margin:"0",fontSize:"15px",fontWeight:"600"}),G.appendChild(re),B){const e=document.createElement("button");e.type="button",e.className="ago-chat-widget__close",e.setAttribute("aria-label","Close"),e.textContent="×",E(e,{marginLeft:"auto",background:"transparent",border:"none",color:ze,fontSize:"22px",lineHeight:"1",cursor:"pointer",padding:"0 2px"}),e.addEventListener("click",()=>fe()),G.appendChild(e)}const T=b({flex:"1",overflow:"auto",padding:"16px",backgroundColor:pt});T.className="ago-chat-widget__messages";const{inputRow:Ve,setDisabled:Qe,focus:ae}=Ct({placeholder:u,allowFiles:s,onSend:(e,r)=>{le(e,r)}});ht(),H.append(G,T,Ve);let V=H,D,S;const ie=l==="left"?"left":"right";if(B&&(D=b({position:"fixed",top:"0",bottom:"0",[ie]:"0",width:typeof p=="number"?`${p}px`:p,maxWidth:"100vw",display:"flex",zIndex:"2147483000",transition:"transform 0.3s ease",boxShadow:"rgba(15, 15, 15, 0.18) 0px 0px 24px 0px"}),D.className="ago-chat-widget-panel",E(H,{height:"100%",width:"100%",borderRadius:"0",border:"none",boxShadow:"none",[ie==="left"?"borderRight":"borderLeft"]:`1px solid ${I}`}),D.appendChild(H),V=D),Xe){if(S=document.createElement("button"),S.type="button",S.className="ago-chat-widget-launcher",S.setAttribute("aria-label",`Open ${a}`),E(S,{position:"fixed",bottom:"20px",[ie]:"20px",width:"56px",height:"56px",borderRadius:"50%",border:"none",backgroundColor:be,color:Ce,cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",zIndex:"2147483000",boxShadow:"rgba(15, 15, 15, 0.2) 0px 4px 14px 0px",fontFamily:xe}),m){const e=document.createElement("img");e.src=m,e.alt="",E(e,{width:"26px",height:"26px",objectFit:"contain"}),S.appendChild(e)}else S.appendChild(nt());S.addEventListener("click",()=>pe())}ve.appendChild(V),S&&ve.appendChild(S),ce();const we=$!==!1,Se=$===!1?void 0:$??(e=>{le(e)});function Ye(e,r){const i=e.role==="user",x=b({display:"flex",flexDirection:"column",alignItems:i?"flex-end":"flex-start",marginBottom:"16px"});if(x.className=`ago-message ago-message--${e.role}`,!i&&N&&e.agent){const C=b({fontSize:"13px",fontWeight:"500",color:Y,marginBottom:"6px",padding:"0 4px"});C.className="ago-message__agent",C.textContent=e.agent.displayName||e.agent.name,x.appendChild(C)}if(!i&&e.sources&&e.sources.length>0){const C=b({display:"grid",gridTemplateColumns:"1fr 1fr",gap:"6px",marginBottom:"10px",width:"100%",maxWidth:"85%"});C.className="ago-message__sources",e.sources.forEach((y,w)=>{const M=y.url?document.createElement("a"):document.createElement("div");y.url&&M instanceof HTMLAnchorElement&&(M.href=y.url,M.target="_blank",M.rel="noopener noreferrer"),E(M,{display:"flex",alignItems:"center",gap:"8px",padding:"8px 10px",border:`1px solid ${I}`,borderRadius:"8px",backgroundColor:j,textDecoration:"none",color:Y,fontSize:"12px",overflow:"hidden"});const Oe=b({flexShrink:"0",width:"18px",height:"18px",borderRadius:"3px",border:`1px solid ${ge}`,color:ge,fontSize:"11px",fontWeight:"500",display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"#f0f4ff"});Oe.textContent=String(w+1);const ue=b({overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"});ue.textContent=y.title,ue.title=y.title,M.append(Oe,ue),C.appendChild(M)}),x.appendChild(C)}const v=b({maxWidth:i?"75%":"100%",padding:i?"10px 14px":"2px 8px",borderRadius:i?me:"0",backgroundColor:i?be:"transparent",color:i?Ce:Y,wordBreak:"break-word",fontSize:"16px",lineHeight:"1.6"});if(v.className="ago-message__content",e.content?v.appendChild(J(e.content)):e.status==="IN_PROGRESS"&&v.appendChild(ot()),x.appendChild(v),r&&e.followUpReplies&&e.followUpReplies.length>0){const C=b({display:"flex",flexWrap:"wrap",gap:"8px",marginTop:"10px"});C.className="ago-message__followups";for(const y of e.followUpReplies){const w=document.createElement("button");w.type="button",w.className="ago-message__followup-btn",w.textContent=y,w.disabled=!we,E(w,{padding:"6px 14px",fontSize:"14px",borderRadius:me,border:`1px solid ${I}`,backgroundColor:j,color:Y,cursor:we?"pointer":"default",transition:"border-color 0.15s"}),Se&&w.addEventListener("click",()=>Se(y)),w.addEventListener("mouseenter",()=>{w.style.borderColor=ge}),w.addEventListener("mouseleave",()=>{w.style.borderColor=I}),C.appendChild(w)}x.appendChild(C)}return x}function Ze(e){const r=b({display:"flex",alignItems:"center",gap:"8px",padding:"10px 14px",backgroundColor:"#f0fdf4",color:"#15803d",borderRadius:me,marginTop:"8px",fontSize:"13px",border:"1px solid #bbf7d0"});r.className="ago-form-notice",r.setAttribute("role","status");const i=document.createElement("span");i.textContent="✓",i.setAttribute("aria-hidden","true"),E(i,{fontWeight:"700"});const x=document.createElement("span");return x.textContent=e,r.append(i,x),r}function A(){if(T.replaceChildren(),d.length===0){const r=b({textAlign:"center",color:ft,padding:"24px 16px",fontSize:"16px",lineHeight:"1.5"});r.appendChild(J(t)),T.appendChild(r)}else d.forEach((r,i)=>{T.appendChild(Ye(r,i===d.length-1))});for(const r of Ee)T.appendChild(Ze(r));if(P){const r=b({padding:"10px 14px",backgroundColor:"#fef2f2",color:"#dc2626",borderRadius:"12px",marginTop:"8px",fontSize:"13px",border:"1px solid #fecaca"});r.textContent=P,T.appendChild(r)}T.scrollTop=T.scrollHeight;const e=d[d.length-1];Qe(O&&e?.role==="assistant"&&e.status==="IN_PROGRESS")}function Je(){for(let e=d.length-1;e>=0;e--){const r=d[e];if(r.role==="assistant"&&r.status==="IN_PROGRESS")return r}}const Re=e=>{k||(k=e.conversationId)},_e=e=>{const r=Je();r&&(r.content+=e.content,A())},ke=e=>{const r=d.findIndex(i=>i.id===e.id||i.role==="assistant"&&i.status==="IN_PROGRESS");r>=0?d[r]=e:d.push(e),A(),ae()},Ae=e=>{const r=d.findIndex(i=>i.id===e.id||i.role==="assistant"&&i.status==="IN_PROGRESS");r>=0?d[r]=e:d.push(e),O=!1,A(),e.status==="DONE"&&ee?.({id:e.id,content:e.content})},Ie=e=>{P=e.error,O=!1,d=d.filter(r=>!r.id.startsWith("temp-")),A()};g.on("message:start",Re),g.on("message:chunk",_e),g.on("message:answer-complete",ke),g.on("message:complete",Ae),g.on("message:error",Ie);const $e=e=>te?.(e),Te=e=>ne?.(e);te&&g.on("form:submitted",$e),ne&&g.on("form:error",Te);const se=[];let Ne=!1;const Le=e=>{if(Ne)return;se.push(e.install(g));let r=e.store.get().submitted;const i=e.store.subscribe(x=>{x.submitted&&!r&&(Ee.push(Ke(x.submitResult)),A()),r=x.submitted});se.push(i)};for(const e of q??[])e.schema!=null?Le(Me.createFormCollector(e)):Me.loadFormCollector(g,e).then(r=>Le(r)).catch(()=>{});async function le(e,r){const i=e.trim();if(!i&&!r?.length||O)return;ye?.(i),O=!0,P=null;const x=Date.now();d.push({id:`temp-user-${x}`,conversationId:k||"",content:i,role:"user",status:"DONE",createdAt:new Date}),d.push({id:`temp-assistant-${x}`,conversationId:k||"",content:"",role:"assistant",status:"IN_PROGRESS",createdAt:new Date}),A();try{const v=await g.sendMessage(i,{conversationId:k,files:r});v.conversationId&&(k||(k=v.conversationId),X?.setActiveThread(v.conversationId,v.createdAt));const C=d.find(y=>y.id===`temp-user-${x}`);if(C&&(C.id=`user-${x}`,C.conversationId=v.conversationId),!d.some(y=>y.id===v.id)){const y=d.findIndex(w=>w.id===`temp-assistant-${x}`);y>=0?d[y]=v:d.push(v)}d=d.filter(y=>!y.id.startsWith("temp-")),O=!1,A(),_&&de()}catch(v){P=v instanceof Error?v.message:"Failed to send message",O=!1,d=d.filter(C=>!C.id.startsWith("temp-")),A()}}async function de(){try{const e=await g.getConversations();K.splice(0,K.length,...e)}catch{}return K}async function et(e){try{const r=(await g.getConversation(e))?.messages??[];r.length>0&&d.length===0&&(d=r,A())}catch{d.length===0&&(X?.clear(),k=void 0)}}return A(),ae(),k&&et(k),_&&de(),{client:g,element:V,sendMessage:le,...B?{open:pe,close:fe,toggle:tt}:{},session:X,threads:K,refreshThreads:de,destroy(){g.off("message:start",Re),g.off("message:chunk",_e),g.off("message:answer-complete",ke),g.off("message:complete",Ae),g.off("message:error",Ie),te&&g.off("form:submitted",$e),ne&&g.off("form:error",Te),Ne=!0,se.forEach(e=>e()),V.remove(),S?.remove(),n.client||g.destroy()}};function ce(){if(!D)return;const e=l==="left"?"translateX(-100%)":"translateX(100%)";D.style.transform=z?"translateX(0)":e,D.setAttribute("aria-hidden",z?"false":"true"),S&&(S.style.display=z?"none":"flex")}function pe(){z=!0,ce(),ae()}function fe(){z=!1,ce()}function tt(){z?fe():pe()}function nt(){const e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"svg");r.setAttribute("width","26"),r.setAttribute("height","26"),r.setAttribute("viewBox","0 0 24 24"),r.setAttribute("fill","none");const i=document.createElementNS(e,"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"),r.appendChild(i),r}function ot(){const e=b({display:"flex",gap:"4px",padding:"4px 0"});for(let r=0;r<3;r++){const i=b({width:"6px",height:"6px",borderRadius:"50%",backgroundColor:"#b5bfc8",animation:"ago-pulse 1.2s ease-in-out infinite",animationDelay:`${r*.2}s`});e.appendChild(i)}return e}}function Ct(o){let n=[];const a=document.createElement("form");E(a,{display:"flex",flexDirection:"column",gap:"8px",padding:"12px",borderTop:`1px solid ${I}`,backgroundColor:j}),a.className="ago-chat-input";const t=b({display:"flex",flexWrap:"wrap",gap:"6px"}),u=b({display:"flex",gap:"8px",alignItems:"flex-end"}),s=document.createElement("textarea");s.placeholder=o.placeholder,s.rows=1,E(s,{flex:"1",resize:"none",padding:"10px 12px",border:`1px solid ${I}`,borderRadius:"12px",fontSize:"16px",fontFamily:xe,lineHeight:"1.4",maxHeight:"120px",outline:"none"});const f=document.createElement("button");f.type="submit",f.textContent="Send",E(f,{padding:"10px 16px",border:"none",borderRadius:"12px",backgroundColor:be,color:Ce,fontSize:"16px",fontWeight:"500",cursor:"pointer"});let l=null,p=null;o.allowFiles&&(l=document.createElement("input"),l.type="file",l.multiple=!0,E(l,{display:"none"}),p=document.createElement("button"),p.type="button",p.textContent="📎",E(p,{padding:"10px 12px",border:`1px solid ${I}`,borderRadius:"12px",backgroundColor:j,cursor:"pointer",fontSize:"14px"}),p.addEventListener("click",()=>l?.click()),l.addEventListener("change",()=>{n=[...n,...Array.from(l?.files??[])],c()}));function c(){t.replaceChildren(),n.forEach((h,_)=>{const q=b({display:"flex",alignItems:"center",gap:"4px",padding:"4px 8px",backgroundColor:"#f0f4ff",border:`1px solid ${I}`,borderRadius:"8px",fontSize:"12px"}),L=document.createElement("span");L.textContent=h.name;const $=document.createElement("button");$.type="button",$.textContent="×",E($,{border:"none",background:"transparent",cursor:"pointer",fontSize:"14px",lineHeight:"1"}),$.addEventListener("click",()=>{n=n.filter((ye,ee)=>ee!==_),c()}),q.append(L,$),t.appendChild(q)})}const m=()=>{const h=s.value,_=n;return s.value="",n=[],c(),{content:h,files:_}},N=()=>{const{content:h,files:_}=m();(h.trim()||_.length>0)&&o.onSend(h.trim(),_.length>0?_:void 0)};return a.addEventListener("submit",h=>{h.preventDefault(),N()}),s.addEventListener("keydown",h=>{h.key==="Enter"&&!h.shiftKey&&(h.preventDefault(),N())}),p&&u.appendChild(p),u.append(s,f),l&&a.appendChild(l),a.append(t,u),{inputRow:a,getValueAndClear:m,setDisabled:h=>{s.disabled=h,f.disabled=h,f.style.opacity=h?"0.6":"1",f.style.cursor=h?"not-allowed":"pointer"},focus:()=>s.focus()}}exports.mountChatWidget=bt;exports.renderMarkdown=J;
3
+ `);let t=0;for(;t<a.length;){const s=a[t];if(s.trim()===""){t++;continue}const f=s.match(Ge);if(f){const c=f[1][0],h=[];for(t++;t<a.length&&!new RegExp(`^ {0,3}${c==="`"?"`{3,}":"~{3,}"}\\s*$`).test(a[t]);)h.push(a[t]),t++;t++;const N=R("pre",{margin:"0 0 8px 0"});N.appendChild(R("code",{display:"block",background:"#f5f5f5",padding:"8px 12px",borderRadius:"6px",fontSize:"13px",overflowX:"auto",fontFamily:Ue,whiteSpace:"pre"},U(h.join(`
4
+ `)))),o.appendChild(N);continue}if(We.test(s)){o.appendChild(R("hr",{border:"none",borderTop:"1px solid #dee3e8",margin:"12px 0"})),t++;continue}const l=s.match(Pe);if(l){const c=l[1].length;o.appendChild(R(`h${c}`,{margin:"16px 0 8px 0",fontSize:st[c-1],fontWeight:"600",lineHeight:"1.3"},M(l[2]))),t++;continue}if(ee.test(s)){const c=[];for(;t<a.length&&ee.test(a[t]);)c.push(a[t].replace(ee,"")),t++;const h=R("blockquote",{borderLeft:"4px solid #dee3e8",paddingLeft:"12px",margin:"0 0 8px 0",fontStyle:"italic",color:"#6b6d6f"});h.appendChild(te(c.join(`
5
+ `))),o.appendChild(h);continue}if(s.includes("|")&&ct(a[t+1])){const c=[s,a[t+1]];for(t+=2;t<a.length&&a[t].includes("|")&&a[t].trim();)c.push(a[t]),t++;o.appendChild(dt(c));continue}if(W.test(s)){const c=[],h=he(s);for(;t<a.length&&a[t].trim()!=="";)if(W.test(a[t])||he(a[t])>h)c.push(a[t]),t++;else break;o.appendChild(je(c));continue}const p=[s];for(t++;t<a.length&&!lt(a[t]);)p.push(a[t]),t++;o.appendChild(R("p",{margin:"0 0 8px 0",lineHeight:"1.6"},p.map(c=>M(c)).join("<br>")))}const u=o.lastElementChild;return u&&(u.style.marginBottom="0"),o}var xe='var(--ago-font, "IBM Plex Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif)',Me={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"},be="var(--ago-brand-color, #03182f)",Ce="var(--ago-brand-text-color, #fff)",pt="var(--ago-header-background, var(--ago-brand-color, #03182f))",Fe="var(--ago-header-text-color, #e8f0fe)",X="var(--ago-panel-background, #fff)",ft="var(--ago-messages-background, #fbfbfb)",J="var(--ago-text-color, #30373e)",ut="var(--ago-muted-text-color, #6b6d6f)",A="var(--ago-border-color, #dee3e8)",ge="var(--ago-accent-color, #1b5fc4)",gt="var(--ago-agent-bubble-background, #f1f3f5)",mt="var(--ago-radius, 16px)",me="var(--ago-message-radius, 16px)";function ht(r,o){if(o)for(const a of Object.keys(Me)){const t=o[a];t!=null&&r.style.setProperty(Me[a],t)}}function E(r,o){Object.assign(r.style,o)}function b(r={}){const o=document.createElement("div");return E(o,r),o}var ze="Form submitted.";function xt(r){if(typeof r=="string")return r||null;if(!r||typeof r!="object")return null;const o=r;if(typeof o.message=="string"&&o.message)return o.message;const a=o.result;if(typeof a=="string"&&a)return a;if(a&&typeof a=="object"){const t=a.message;if(typeof t=="string"&&t)return t}return null}var He="ago-chat-widget-keyframes";function bt(){if(typeof document>"u"||document.getElementById(He))return;const r=document.createElement("style");r.id=He,r.textContent="@keyframes ago-pulse { 0%, 80%, 100% { opacity: 0.3; transform: scale(0.8); } 40% { opacity: 1; transform: scale(1); } }",document.head.appendChild(r)}function Ct(r){const o=typeof r=="string"?document.querySelector(r):r;if(!o)throw new Error(`mountChatWidget: target "${String(r)}" not found.`);return o}function yt(r,o){const{title:a="Chat",welcomeMessage:t="Hello! How can I help you today?",placeholder:u="Type a message...",allowFiles:s=!1,height:f=500,placement:l="inline",width:p=400,defaultOpen:c=!1,logoUrl:h,showAgentName:N=!1,agentBubble:g=!1,showHeader:I=!0,theme:K,loadThreads:P=!1,forms:T,formSubmittedMessage:G=ze,onFollowUpClick:j,onMessageSent:qe,onMessageReceived:Xe,onFormSubmitted:ne,onFormError:oe}=o;if(!o.client&&!o.config?.baseUrl)throw new Oe.AgoError("mountChatWidget requires either `client` or `config` (with a baseUrl).","config_missing_base_url");const m=o.client??new Oe.AgoClient(o.config),ye=Ct(r),F=l==="left"||l==="right",Ke=F&&(o.launcher??!0);let z=F?c:!0;const re=o.persistConversation,V=re?at.createConversationSession(re===!0?{}:re):void 0;let _=o.conversationId??V?.getLastActiveThread()??void 0,d=[],L=!1,q=null;const ve=[];function Ve(e){if(typeof G=="function"){const i=G(e);if(typeof i=="string"&&i)return i}const n=xt(e);return n||(typeof G=="string"?G:ze)}const Q=[],H=b({display:"flex",flexDirection:"column",height:F?"100%":typeof f=="number"?`${f}px`:f,border:`1px solid ${A}`,borderRadius:mt,overflow:"hidden",backgroundColor:X,fontFamily:xe,textAlign:"left",boxShadow:"rgba(15, 15, 15, 0.08) 0px 2px 16px 0px"});H.className="ago-chat-widget",ht(H,K);let O;if(I){if(O=b({padding:"14px 16px",borderBottom:`1px solid ${A}`,backgroundColor:pt,color:Fe,display:"flex",alignItems:"center",gap:"10px"}),O.className="ago-chat-widget__header",h){const n=document.createElement("img");n.src=h,n.alt="Logo",E(n,{height:"24px",width:"auto"}),O.appendChild(n)}const e=document.createElement("h3");if(e.textContent=a,E(e,{margin:"0",fontSize:"15px",fontWeight:"600"}),O.appendChild(e),F){const n=document.createElement("button");n.type="button",n.className="ago-chat-widget__close",n.setAttribute("aria-label","Close"),n.textContent="×",E(n,{marginLeft:"auto",background:"transparent",border:"none",color:Fe,fontSize:"22px",lineHeight:"1",cursor:"pointer",padding:"0 2px"}),n.addEventListener("click",()=>fe()),O.appendChild(n)}}const $=b({flex:"1",overflow:"auto",padding:"16px",backgroundColor:ft});$.className="ago-chat-widget__messages";const{inputRow:Qe,setDisabled:Ye,focus:ae}=vt({placeholder:u,allowFiles:s,onSend:(e,n)=>{le(e,n)}});bt(),H.append(...O?[O]:[],$,Qe);let Y=H,D,S;const ie=l==="left"?"left":"right";if(F&&(D=b({position:"fixed",top:"0",bottom:"0",[ie]:"0",width:typeof p=="number"?`${p}px`:p,maxWidth:"100vw",display:"flex",zIndex:"2147483000",transition:"transform 0.3s ease",boxShadow:"rgba(15, 15, 15, 0.18) 0px 0px 24px 0px"}),D.className="ago-chat-widget-panel",E(H,{height:"100%",width:"100%",borderRadius:"0",border:"none",boxShadow:"none",[ie==="left"?"borderRight":"borderLeft"]:`1px solid ${A}`}),D.appendChild(H),Y=D),Ke){if(S=document.createElement("button"),S.type="button",S.className="ago-chat-widget-launcher",S.setAttribute("aria-label",`Open ${a}`),E(S,{position:"fixed",bottom:"20px",[ie]:"20px",width:"56px",height:"56px",borderRadius:"50%",border:"none",backgroundColor:be,color:Ce,cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",zIndex:"2147483000",boxShadow:"rgba(15, 15, 15, 0.2) 0px 4px 14px 0px",fontFamily:xe}),h){const e=document.createElement("img");e.src=h,e.alt="",E(e,{width:"26px",height:"26px",objectFit:"contain"}),S.appendChild(e)}else S.appendChild(ot());S.addEventListener("click",()=>pe())}ye.appendChild(Y),S&&ye.appendChild(S),ce();const Ee=j!==!1,we=j===!1?void 0:j??(e=>{le(e)});function Ze(e,n){const i=e.role==="user",x=b({display:"flex",flexDirection:"column",alignItems:i?"flex-end":"flex-start",marginBottom:"16px"});if(x.className=`ago-message ago-message--${e.role}`,!i&&N&&e.agent){const C=b({fontSize:"13px",fontWeight:"500",color:J,marginBottom:"6px",padding:"0 4px"});C.className="ago-message__agent",C.textContent=e.agent.displayName||e.agent.name,x.appendChild(C)}if(!i&&e.sources&&e.sources.length>0){const C=b({display:"grid",gridTemplateColumns:"1fr 1fr",gap:"6px",marginBottom:"10px",width:"100%",maxWidth:"85%"});C.className="ago-message__sources",e.sources.forEach((y,w)=>{const B=y.url?document.createElement("a"):document.createElement("div");y.url&&B instanceof HTMLAnchorElement&&(B.href=y.url,B.target="_blank",B.rel="noopener noreferrer"),E(B,{display:"flex",alignItems:"center",gap:"8px",padding:"8px 10px",border:`1px solid ${A}`,borderRadius:"8px",backgroundColor:X,textDecoration:"none",color:J,fontSize:"12px",overflow:"hidden"});const Le=b({flexShrink:"0",width:"18px",height:"18px",borderRadius:"3px",border:`1px solid ${ge}`,color:ge,fontSize:"11px",fontWeight:"500",display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"#f0f4ff"});Le.textContent=String(w+1);const ue=b({overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"});ue.textContent=y.title,ue.title=y.title,B.append(Le,ue),C.appendChild(B)}),x.appendChild(C)}const v=b({maxWidth:i?"75%":g?"85%":"100%",padding:i||g?"10px 14px":"2px 8px",borderRadius:i||g?me:"0",backgroundColor:i?be:g?gt:"transparent",color:i?Ce:J,wordBreak:"break-word",fontSize:"16px",lineHeight:"1.6"});if(v.className="ago-message__content",e.content?v.appendChild(te(e.content)):e.status==="IN_PROGRESS"&&v.appendChild(rt()),x.appendChild(v),n&&e.followUpReplies&&e.followUpReplies.length>0){const C=b({display:"flex",flexWrap:"wrap",gap:"8px",marginTop:"10px"});C.className="ago-message__followups";for(const y of e.followUpReplies){const w=document.createElement("button");w.type="button",w.className="ago-message__followup-btn",w.textContent=y,w.disabled=!Ee,E(w,{padding:"6px 14px",fontSize:"14px",borderRadius:me,border:`1px solid ${A}`,backgroundColor:X,color:J,cursor:Ee?"pointer":"default",transition:"border-color 0.15s"}),we&&w.addEventListener("click",()=>we(y)),w.addEventListener("mouseenter",()=>{w.style.borderColor=ge}),w.addEventListener("mouseleave",()=>{w.style.borderColor=A}),C.appendChild(w)}x.appendChild(C)}return x}function Je(e){const n=b({display:"flex",alignItems:"center",gap:"8px",padding:"10px 14px",backgroundColor:"#f0fdf4",color:"#15803d",borderRadius:me,marginTop:"8px",fontSize:"13px",border:"1px solid #bbf7d0"});n.className="ago-form-notice",n.setAttribute("role","status");const i=document.createElement("span");i.textContent="✓",i.setAttribute("aria-hidden","true"),E(i,{fontWeight:"700"});const x=document.createElement("span");return x.textContent=e,n.append(i,x),n}function k(){if($.replaceChildren(),d.length===0){const n=b({textAlign:"center",color:ut,padding:"24px 16px",fontSize:"16px",lineHeight:"1.5"});n.appendChild(te(t)),$.appendChild(n)}else d.forEach((n,i)=>{$.appendChild(Ze(n,i===d.length-1))});for(const n of ve)$.appendChild(Je(n));if(q){const n=b({padding:"10px 14px",backgroundColor:"#fef2f2",color:"#dc2626",borderRadius:"12px",marginTop:"8px",fontSize:"13px",border:"1px solid #fecaca"});n.textContent=q,$.appendChild(n)}$.scrollTop=$.scrollHeight;const e=d[d.length-1];Ye(L&&e?.role==="assistant"&&e.status==="IN_PROGRESS")}function et(){for(let e=d.length-1;e>=0;e--){const n=d[e];if(n.role==="assistant"&&n.status==="IN_PROGRESS")return n}}const Se=e=>{_||(_=e.conversationId)},Re=e=>{const n=et();n&&(n.content+=e.content,k())},_e=e=>{const n=d.findIndex(i=>i.id===e.id||i.role==="assistant"&&i.status==="IN_PROGRESS");n>=0?d[n]=e:d.push(e),k(),ae()},ke=e=>{const n=d.findIndex(i=>i.id===e.id||i.role==="assistant"&&i.status==="IN_PROGRESS");n>=0?d[n]=e:d.push(e),L=!1,k(),e.status==="DONE"&&Xe?.({id:e.id,content:e.content})},Ae=e=>{q=e.error,L=!1,d=d.filter(n=>!n.id.startsWith("temp-")),k()};m.on("message:start",Se),m.on("message:chunk",Re),m.on("message:answer-complete",_e),m.on("message:complete",ke),m.on("message:error",Ae);const Ie=e=>ne?.(e),$e=e=>oe?.(e);ne&&m.on("form:submitted",Ie),oe&&m.on("form:error",$e);const se=[];let Ne=!1;const Te=e=>{if(Ne)return;se.push(e.install(m));let n=e.store.get().submitted;const i=e.store.subscribe(x=>{x.submitted&&!n&&(ve.push(Ve(x.submitResult)),k()),n=x.submitted});se.push(i)};for(const e of T??[])e.schema!=null?Te(De.createFormCollector(e)):De.loadFormCollector(m,e).then(n=>Te(n)).catch(()=>{});async function le(e,n){const i=e.trim();if(!i&&!n?.length||L)return;qe?.(i),L=!0,q=null;const x=Date.now();d.push({id:`temp-user-${x}`,conversationId:_||"",content:i,role:"user",status:"DONE",createdAt:new Date}),d.push({id:`temp-assistant-${x}`,conversationId:_||"",content:"",role:"assistant",status:"IN_PROGRESS",createdAt:new Date}),k();try{const v=await m.sendMessage(i,{conversationId:_,files:n});v.conversationId&&(_||(_=v.conversationId),V?.setActiveThread(v.conversationId,v.createdAt));const C=d.find(y=>y.id===`temp-user-${x}`);if(C&&(C.id=`user-${x}`,C.conversationId=v.conversationId),!d.some(y=>y.id===v.id)){const y=d.findIndex(w=>w.id===`temp-assistant-${x}`);y>=0?d[y]=v:d.push(v)}d=d.filter(y=>!y.id.startsWith("temp-")),L=!1,k(),P&&de()}catch(v){q=v instanceof Error?v.message:"Failed to send message",L=!1,d=d.filter(C=>!C.id.startsWith("temp-")),k()}}async function de(){try{const e=await m.getConversations();Q.splice(0,Q.length,...e)}catch{}return Q}async function tt(e){try{const n=(await m.getConversation(e))?.messages??[];n.length>0&&d.length===0&&(d=n,k())}catch{d.length===0&&(V?.clear(),_=void 0)}}return k(),ae(),_&&tt(_),P&&de(),{client:m,element:Y,sendMessage:le,...F?{open:pe,close:fe,toggle:nt}:{},session:V,threads:Q,refreshThreads:de,destroy(){m.off("message:start",Se),m.off("message:chunk",Re),m.off("message:answer-complete",_e),m.off("message:complete",ke),m.off("message:error",Ae),ne&&m.off("form:submitted",Ie),oe&&m.off("form:error",$e),Ne=!0,se.forEach(e=>e()),Y.remove(),S?.remove(),o.client||m.destroy()}};function ce(){if(!D)return;const e=l==="left"?"translateX(-100%)":"translateX(100%)";D.style.transform=z?"translateX(0)":e,D.setAttribute("aria-hidden",z?"false":"true"),S&&(S.style.display=z?"none":"flex")}function pe(){z=!0,ce(),ae()}function fe(){z=!1,ce()}function nt(){z?fe():pe()}function ot(){const e="http://www.w3.org/2000/svg",n=document.createElementNS(e,"svg");n.setAttribute("width","26"),n.setAttribute("height","26"),n.setAttribute("viewBox","0 0 24 24"),n.setAttribute("fill","none");const i=document.createElementNS(e,"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"),n.appendChild(i),n}function rt(){const e=b({display:"flex",gap:"4px",padding:"4px 0"});for(let n=0;n<3;n++){const i=b({width:"6px",height:"6px",borderRadius:"50%",backgroundColor:"#b5bfc8",animation:"ago-pulse 1.2s ease-in-out infinite",animationDelay:`${n*.2}s`});e.appendChild(i)}return e}}function vt(r){let o=[];const a=document.createElement("form");E(a,{display:"flex",flexDirection:"column",gap:"8px",padding:"12px",borderTop:`1px solid ${A}`,backgroundColor:X}),a.className="ago-chat-input";const t=b({display:"flex",flexWrap:"wrap",gap:"6px"}),u=b({display:"flex",gap:"8px",alignItems:"flex-end"}),s=document.createElement("textarea");s.placeholder=r.placeholder,s.rows=1,E(s,{flex:"1",resize:"none",padding:"10px 12px",border:`1px solid ${A}`,borderRadius:"12px",fontSize:"16px",fontFamily:xe,lineHeight:"1.4",maxHeight:"120px",outline:"none"});const f=document.createElement("button");f.type="submit",f.textContent="Send",E(f,{padding:"10px 16px",border:"none",borderRadius:"12px",backgroundColor:be,color:Ce,fontSize:"16px",fontWeight:"500",cursor:"pointer"});let l=null,p=null;r.allowFiles&&(l=document.createElement("input"),l.type="file",l.multiple=!0,E(l,{display:"none"}),p=document.createElement("button"),p.type="button",p.textContent="📎",E(p,{padding:"10px 12px",border:`1px solid ${A}`,borderRadius:"12px",backgroundColor:X,cursor:"pointer",fontSize:"14px"}),p.addEventListener("click",()=>l?.click()),l.addEventListener("change",()=>{o=[...o,...Array.from(l?.files??[])],c()}));function c(){t.replaceChildren(),o.forEach((g,I)=>{const K=b({display:"flex",alignItems:"center",gap:"4px",padding:"4px 8px",backgroundColor:"#f0f4ff",border:`1px solid ${A}`,borderRadius:"8px",fontSize:"12px"}),P=document.createElement("span");P.textContent=g.name;const T=document.createElement("button");T.type="button",T.textContent="×",E(T,{border:"none",background:"transparent",cursor:"pointer",fontSize:"14px",lineHeight:"1"}),T.addEventListener("click",()=>{o=o.filter((G,j)=>j!==I),c()}),K.append(P,T),t.appendChild(K)})}const h=()=>{const g=s.value,I=o;return s.value="",o=[],c(),{content:g,files:I}},N=()=>{const{content:g,files:I}=h();(g.trim()||I.length>0)&&r.onSend(g.trim(),I.length>0?I:void 0)};return a.addEventListener("submit",g=>{g.preventDefault(),N()}),s.addEventListener("keydown",g=>{g.key==="Enter"&&!g.shiftKey&&(g.preventDefault(),N())}),p&&u.appendChild(p),u.append(s,f),l&&a.appendChild(l),a.append(t,u),{inputRow:a,getValueAndClear:h,setDisabled:g=>{s.disabled=g,f.disabled=g,f.style.opacity=g?"0.6":"1",f.style.cursor=g?"not-allowed":"pointer"},focus:()=>s.focus()}}exports.mountChatWidget=yt;exports.renderMarkdown=te;
package/dist/widget.d.cts CHANGED
@@ -633,7 +633,7 @@ declare interface FormCollectorDefinition<V = Record<string, unknown>> {
633
633
 
634
634
  /**
635
635
  * Shape of a form's fields. Mirrors a client function's `parameters` (so the same
636
- * object feeds the store, the update function, and the dynamic context). Additionally allows the SDK-only per-field `requiredWhen`, which {@link toWireParameters} removes before the schema reaches the LLM.
636
+ * object feeds the store, the update function, and the dynamic context). Additionally allows the SDK-only per-field `requiredWhen`, which {@link toWireParameters} removes from the LLM tool's `parameters` (the full schema still reaches the agent via dynamic context).
637
637
  */
638
638
  declare interface FormCollectorSchema {
639
639
  type: "object";
@@ -650,17 +650,32 @@ declare interface FormField {
650
650
  }
651
651
 
652
652
  /**
653
- * A field's conditional-requiredness rule. The field becomes required exactly
654
- * when the controlling `property` matches `value` against the answers collected
655
- * so far:
653
+ * A field's conditional-requiredness rule: either a single {@link FormFieldLeafCondition}
654
+ * or a boolean combination of rules. `anyOf` is OR (true when any nested rule
655
+ * holds); `allOf` is AND (true when every nested rule holds). Both nest
656
+ * arbitrarily, so you can mix them, e.g.
657
+ * `{ anyOf: [{ property: "a", op: ">=", value: 1 }, { property: "b", value: "1" }] }`.
658
+ * An empty `anyOf` is never required; an empty `allOf` is always required.
659
+ *
660
+ * Stripped from the LLM tool's `parameters` (see {@link toWireParameters}), but the
661
+ * full schema, `requiredWhen` included, still reaches the agent via the dynamic
662
+ * context so it knows when each field becomes required.
663
+ */
664
+ declare type FormFieldCondition = FormFieldLeafCondition | {
665
+ anyOf: FormFieldCondition[];
666
+ } | {
667
+ allOf: FormFieldCondition[];
668
+ };
669
+
670
+ /**
671
+ * A single leaf comparison. The field it guards becomes required exactly when the
672
+ * controlling `property` matches `value` against the answers collected so far:
656
673
  * - a single `value`, no `op` — equality (compared as strings);
657
674
  * - a single `value` with `op` — numeric comparison (both sides coerced to numbers);
658
675
  * - an array `value`, no `op` — "one of": matches when the property equals any
659
676
  * listed value.
660
- *
661
- * SDK-only — it is stripped from the schema before it reaches the LLM tool
662
677
  */
663
- declare interface FormFieldCondition {
678
+ declare interface FormFieldLeafCondition {
664
679
  /** The controlling field whose value the rule tests. */
665
680
  property: string;
666
681
  /** Comparison operator; omitted means equality. Ignored when `value` is an array. */
@@ -681,7 +696,8 @@ declare interface FormFieldSchema {
681
696
  default?: unknown;
682
697
  /**
683
698
  * Makes the field required only while this condition holds. Drives the dynamic
684
- * `missing` list; stripped before the LLM tool — see {@link toWireParameters}.
699
+ * `missing` list; stripped from the LLM tool's `parameters` (still sent to the
700
+ * agent via dynamic context). See {@link toWireParameters}.
685
701
  */
686
702
  requiredWhen?: FormFieldCondition;
687
703
  }
@@ -801,6 +817,16 @@ export declare interface MountChatWidgetOptions {
801
817
  logoUrl?: string;
802
818
  /** Show the agent name above assistant messages. Defaults to `false`. */
803
819
  showAgentName?: boolean;
820
+ /** Render assistant messages inside a filled bubble (themed via `agentBubbleBg`). Defaults to `false`. */
821
+ agentBubble?: boolean;
822
+ /**
823
+ * Show the header bar (title, logo, and the side-panel close "×"). Set `false`
824
+ * to drop it, e.g. when the host page already frames the widget. Defaults to
825
+ * `true`. Note: with the built-in launcher in side placement, the close "×"
826
+ * lives in the header, so hiding it leaves the launcher (and `widget.close()`)
827
+ * as the way to dismiss the panel.
828
+ */
829
+ showHeader?: boolean;
804
830
  /**
805
831
  * Theme overrides so the panel blends into the host page.
806
832
  */
@@ -1020,6 +1046,8 @@ export declare interface WidgetTheme {
1020
1046
  border?: string;
1021
1047
  /** Secondary accent: source badges and suggested-reply hover outline. (`--ago-accent-color`) */
1022
1048
  accent?: string;
1049
+ /** Background of assistant message bubbles when `agentBubble` is on. Defaults to a light gray. (`--ago-agent-bubble-background`) */
1050
+ agentBubbleBg?: string;
1023
1051
  }
1024
1052
 
1025
1053
  export { }
package/dist/widget.d.ts CHANGED
@@ -633,7 +633,7 @@ declare interface FormCollectorDefinition<V = Record<string, unknown>> {
633
633
 
634
634
  /**
635
635
  * Shape of a form's fields. Mirrors a client function's `parameters` (so the same
636
- * object feeds the store, the update function, and the dynamic context). Additionally allows the SDK-only per-field `requiredWhen`, which {@link toWireParameters} removes before the schema reaches the LLM.
636
+ * object feeds the store, the update function, and the dynamic context). Additionally allows the SDK-only per-field `requiredWhen`, which {@link toWireParameters} removes from the LLM tool's `parameters` (the full schema still reaches the agent via dynamic context).
637
637
  */
638
638
  declare interface FormCollectorSchema {
639
639
  type: "object";
@@ -650,17 +650,32 @@ declare interface FormField {
650
650
  }
651
651
 
652
652
  /**
653
- * A field's conditional-requiredness rule. The field becomes required exactly
654
- * when the controlling `property` matches `value` against the answers collected
655
- * so far:
653
+ * A field's conditional-requiredness rule: either a single {@link FormFieldLeafCondition}
654
+ * or a boolean combination of rules. `anyOf` is OR (true when any nested rule
655
+ * holds); `allOf` is AND (true when every nested rule holds). Both nest
656
+ * arbitrarily, so you can mix them, e.g.
657
+ * `{ anyOf: [{ property: "a", op: ">=", value: 1 }, { property: "b", value: "1" }] }`.
658
+ * An empty `anyOf` is never required; an empty `allOf` is always required.
659
+ *
660
+ * Stripped from the LLM tool's `parameters` (see {@link toWireParameters}), but the
661
+ * full schema, `requiredWhen` included, still reaches the agent via the dynamic
662
+ * context so it knows when each field becomes required.
663
+ */
664
+ declare type FormFieldCondition = FormFieldLeafCondition | {
665
+ anyOf: FormFieldCondition[];
666
+ } | {
667
+ allOf: FormFieldCondition[];
668
+ };
669
+
670
+ /**
671
+ * A single leaf comparison. The field it guards becomes required exactly when the
672
+ * controlling `property` matches `value` against the answers collected so far:
656
673
  * - a single `value`, no `op` — equality (compared as strings);
657
674
  * - a single `value` with `op` — numeric comparison (both sides coerced to numbers);
658
675
  * - an array `value`, no `op` — "one of": matches when the property equals any
659
676
  * listed value.
660
- *
661
- * SDK-only — it is stripped from the schema before it reaches the LLM tool
662
677
  */
663
- declare interface FormFieldCondition {
678
+ declare interface FormFieldLeafCondition {
664
679
  /** The controlling field whose value the rule tests. */
665
680
  property: string;
666
681
  /** Comparison operator; omitted means equality. Ignored when `value` is an array. */
@@ -681,7 +696,8 @@ declare interface FormFieldSchema {
681
696
  default?: unknown;
682
697
  /**
683
698
  * Makes the field required only while this condition holds. Drives the dynamic
684
- * `missing` list; stripped before the LLM tool — see {@link toWireParameters}.
699
+ * `missing` list; stripped from the LLM tool's `parameters` (still sent to the
700
+ * agent via dynamic context). See {@link toWireParameters}.
685
701
  */
686
702
  requiredWhen?: FormFieldCondition;
687
703
  }
@@ -801,6 +817,16 @@ export declare interface MountChatWidgetOptions {
801
817
  logoUrl?: string;
802
818
  /** Show the agent name above assistant messages. Defaults to `false`. */
803
819
  showAgentName?: boolean;
820
+ /** Render assistant messages inside a filled bubble (themed via `agentBubbleBg`). Defaults to `false`. */
821
+ agentBubble?: boolean;
822
+ /**
823
+ * Show the header bar (title, logo, and the side-panel close "×"). Set `false`
824
+ * to drop it, e.g. when the host page already frames the widget. Defaults to
825
+ * `true`. Note: with the built-in launcher in side placement, the close "×"
826
+ * lives in the header, so hiding it leaves the launcher (and `widget.close()`)
827
+ * as the way to dismiss the panel.
828
+ */
829
+ showHeader?: boolean;
804
830
  /**
805
831
  * Theme overrides so the panel blends into the host page.
806
832
  */
@@ -1020,6 +1046,8 @@ export declare interface WidgetTheme {
1020
1046
  border?: string;
1021
1047
  /** Secondary accent: source badges and suggested-reply hover outline. (`--ago-accent-color`) */
1022
1048
  accent?: string;
1049
+ /** Background of assistant message bubbles when `agentBubble` is on. Defaults to a light gray. (`--ago-agent-bubble-background`) */
1050
+ agentBubbleBg?: string;
1023
1051
  }
1024
1052
 
1025
1053
  export { }