@makemore/agent-frontend 2.9.0 → 2.10.0

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/react.cjs.js CHANGED
@@ -1,4 +1,4 @@
1
- var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Object.getOwnPropertyNames;var lt=Object.prototype.hasOwnProperty;var it=(e,t,s)=>t in e?ve(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var ct=(e,t)=>{for(var s in t)ve(e,s,{get:t[s],enumerable:!0})},dt=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of rt(t))!lt.call(e,a)&&a!==s&&ve(e,a,{get:()=>t[a],enumerable:!(n=ot(t,a))||n.enumerable});return e};var ut=e=>dt(ve({},"__esModule",{value:!0}),e);var Ge=(e,t,s)=>(it(e,typeof t!="symbol"?t+"":t,s),s);var At={};ct(At,{ChatWidget:()=>fe,ChatWidgetAPI:()=>Ne,DEFAULT_CONFIG:()=>Le,Header:()=>Te,InputForm:()=>xe,Message:()=>_e,MessageList:()=>Me,ModelSelector:()=>Ie,Sidebar:()=>Ee,TaskList:()=>Ae,camelToSnake:()=>$e,createApiClient:()=>Pe,createStorage:()=>Ce,default:()=>It,formatDate:()=>ke,formatFileSize:()=>he,generateId:()=>pe,getCSRFToken:()=>Se,getFileTypeIcon:()=>me,keysToCamel:()=>de,keysToSnake:()=>ue,mergeConfig:()=>Ke,parseMarkdown:()=>be,snakeToCamel:()=>He,useChat:()=>Re,useModels:()=>De,useTasks:()=>Fe});module.exports=ut(At);var Z=require("htm/preact"),R=require("preact/compat");var ae=require("htm/preact");function He(e){return e.replace(/_([a-z])/g,(t,s)=>s.toUpperCase())}function $e(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}function de(e){return Array.isArray(e)?e.map(de):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[He(t),de(s)])):e}function ue(e){return Array.isArray(e)?e.map(ue):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[$e(t),ue(s)])):e}function pe(){return"msg-"+Date.now()+"-"+Math.random().toString(36).substr(2,9)}function U(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function ke(e){if(!e)return"";try{let t=new Date(e),n=new Date-t,a=Math.floor(n/6e4),l=Math.floor(n/36e5),$=Math.floor(n/864e5);return a<1?"Just now":a<60?`${a}m ago`:l<24?`${l}h ago`:$<7?`${$}d ago`:t.toLocaleDateString()}catch{return""}}function be(e,t=null){if(t)return t(e);let s=U(e);return s=s.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),s=s.replace(/__(.+?)__/g,"<strong>$1</strong>"),s=s.replace(/\*(.+?)\*/g,"<em>$1</em>"),s=s.replace(/_(.+?)_/g,"<em>$1</em>"),s=s.replace(/`(.+?)`/g,"<code>$1</code>"),s=s.replace(/\[(.+?)\]\((.+?)\)/g,'<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>'),s=s.replace(/\n/g,"<br>"),s}function Ce(e=""){let t=s=>e?`${s}_${e}`:s;return{get(s){try{return localStorage.getItem(t(s))}catch{return null}},set(s,n){try{let a=t(s);n===null?localStorage.removeItem(a):localStorage.setItem(a,n)}catch{}}}}function Se(e="csrftoken"){let t=document.cookie.split(";");for(let n of t){let[a,l]=n.trim().split("=");if(a===e)return decodeURIComponent(l)}let s=document.querySelector('meta[name="csrf-token"]');return s?s.getAttribute("content"):null}function he(e){if(e===0)return"0 B";let t=1024,s=["B","KB","MB","GB"],n=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/Math.pow(t,n)).toFixed(1))+" "+s[n]}function me(e){return e?e.startsWith("image/")?"\u{1F5BC}\uFE0F":e.startsWith("video/")?"\u{1F3AC}":e.startsWith("audio/")?"\u{1F3B5}":e.includes("pdf")?"\u{1F4D5}":e.includes("spreadsheet")||e.includes("excel")?"\u{1F4CA}":e.includes("document")||e.includes("word")?"\u{1F4DD}":e.includes("presentation")||e.includes("powerpoint")?"\u{1F4FD}\uFE0F":e.includes("zip")||e.includes("compressed")?"\u{1F5DC}\uFE0F":(e.includes("text/"),"\u{1F4C4}"):"\u{1F4C4}"}function pt(e){if(!e||typeof e!="string")return 0;let t=e.replace("#","");if(t.length!==6&&t.length!==3)return 0;let s=t.length===3?t.split("").map(i=>i+i).join(""):t,n=parseInt(s.substr(0,2),16)/255,a=parseInt(s.substr(2,2),16)/255,l=parseInt(s.substr(4,2),16)/255,$=i=>i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4);return .2126*$(n)+.7152*$(a)+.0722*$(l)}function qe(e){return pt(e)>.179?"#000000":"#ffffff"}function Te({config:e,debugMode:t,isExpanded:s,isSpeaking:n,messagesCount:a,isLoading:l,currentAgent:$,onClose:i,onToggleExpand:f,onToggleDebug:y,onToggleTTS:u,onClear:k,onToggleSidebar:c}){let{title:C,primaryColor:o,embedded:g,showConversationSidebar:w,showClearButton:v,showDebugButton:T,enableDebugMode:m,showTTSButton:H,showExpandButton:J,enableTTS:I,elevenLabsApiKey:D,ttsProxyUrl:F}=e,L=D||F;return ae.html`
1
+ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Object.getOwnPropertyNames;var lt=Object.prototype.hasOwnProperty;var it=(e,t,s)=>t in e?ve(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var ct=(e,t)=>{for(var s in t)ve(e,s,{get:t[s],enumerable:!0})},dt=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of rt(t))!lt.call(e,a)&&a!==s&&ve(e,a,{get:()=>t[a],enumerable:!(n=ot(t,a))||n.enumerable});return e};var ut=e=>dt(ve({},"__esModule",{value:!0}),e);var Ge=(e,t,s)=>(it(e,typeof t!="symbol"?t+"":t,s),s);var At={};ct(At,{ChatWidget:()=>fe,ChatWidgetAPI:()=>Ne,DEFAULT_CONFIG:()=>Le,Header:()=>Te,InputForm:()=>xe,Message:()=>_e,MessageList:()=>Me,ModelSelector:()=>Ie,Sidebar:()=>Ee,TaskList:()=>Ae,camelToSnake:()=>$e,createApiClient:()=>Pe,createStorage:()=>Ce,default:()=>It,formatDate:()=>ke,formatFileSize:()=>he,generateId:()=>pe,getCSRFToken:()=>Se,getFileTypeIcon:()=>me,keysToCamel:()=>de,keysToSnake:()=>ue,mergeConfig:()=>Ke,parseMarkdown:()=>be,snakeToCamel:()=>He,useChat:()=>Re,useModels:()=>Fe,useTasks:()=>De});module.exports=ut(At);var Z=require("htm/preact"),R=require("preact/compat");var ae=require("htm/preact");function He(e){return e.replace(/_([a-z])/g,(t,s)=>s.toUpperCase())}function $e(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}function de(e){return Array.isArray(e)?e.map(de):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[He(t),de(s)])):e}function ue(e){return Array.isArray(e)?e.map(ue):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[$e(t),ue(s)])):e}function pe(){return"msg-"+Date.now()+"-"+Math.random().toString(36).substr(2,9)}function U(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function ke(e){if(!e)return"";try{let t=new Date(e),n=new Date-t,a=Math.floor(n/6e4),l=Math.floor(n/36e5),$=Math.floor(n/864e5);return a<1?"Just now":a<60?`${a}m ago`:l<24?`${l}h ago`:$<7?`${$}d ago`:t.toLocaleDateString()}catch{return""}}function be(e,t=null){if(t)return t(e);let s=U(e);return s=s.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),s=s.replace(/__(.+?)__/g,"<strong>$1</strong>"),s=s.replace(/\*(.+?)\*/g,"<em>$1</em>"),s=s.replace(/_(.+?)_/g,"<em>$1</em>"),s=s.replace(/`(.+?)`/g,"<code>$1</code>"),s=s.replace(/\[(.+?)\]\((.+?)\)/g,'<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>'),s=s.replace(/\n/g,"<br>"),s}function Ce(e=""){let t=s=>e?`${s}_${e}`:s;return{get(s){try{return localStorage.getItem(t(s))}catch{return null}},set(s,n){try{let a=t(s);n===null?localStorage.removeItem(a):localStorage.setItem(a,n)}catch{}}}}function Se(e="csrftoken"){let t=document.cookie.split(";");for(let n of t){let[a,l]=n.trim().split("=");if(a===e)return decodeURIComponent(l)}let s=document.querySelector('meta[name="csrf-token"]');return s?s.getAttribute("content"):null}function he(e){if(e===0)return"0 B";let t=1024,s=["B","KB","MB","GB"],n=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/Math.pow(t,n)).toFixed(1))+" "+s[n]}function me(e){return e?e.startsWith("image/")?"\u{1F5BC}\uFE0F":e.startsWith("video/")?"\u{1F3AC}":e.startsWith("audio/")?"\u{1F3B5}":e.includes("pdf")?"\u{1F4D5}":e.includes("spreadsheet")||e.includes("excel")?"\u{1F4CA}":e.includes("document")||e.includes("word")?"\u{1F4DD}":e.includes("presentation")||e.includes("powerpoint")?"\u{1F4FD}\uFE0F":e.includes("zip")||e.includes("compressed")?"\u{1F5DC}\uFE0F":(e.includes("text/"),"\u{1F4C4}"):"\u{1F4C4}"}function pt(e){if(!e||typeof e!="string")return 0;let t=e.replace("#","");if(t.length!==6&&t.length!==3)return 0;let s=t.length===3?t.split("").map(i=>i+i).join(""):t,n=parseInt(s.substr(0,2),16)/255,a=parseInt(s.substr(2,2),16)/255,l=parseInt(s.substr(4,2),16)/255,$=i=>i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4);return .2126*$(n)+.7152*$(a)+.0722*$(l)}function qe(e){return pt(e)>.179?"#000000":"#ffffff"}function Te({config:e,debugMode:t,isExpanded:s,isSpeaking:n,messagesCount:a,isLoading:l,currentAgent:$,onClose:i,onToggleExpand:f,onToggleDebug:y,onToggleTTS:u,onClear:k,onToggleSidebar:c}){let{title:C,primaryColor:o,embedded:g,showConversationSidebar:w,showClearButton:v,showDebugButton:T,enableDebugMode:m,showTTSButton:H,showExpandButton:J,enableTTS:I,elevenLabsApiKey:F,ttsProxyUrl:D}=e,L=F||D;return ae.html`
2
2
  <div class="cw-header" style=${{backgroundColor:o}}>
3
3
  ${w&&ae.html`
4
4
  <button
@@ -148,7 +148,7 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
148
148
  `}
149
149
  ${t&&N.html`<${Ve} msg=${e} show=${y} onToggle=${()=>u(!y)} />`}
150
150
  </div>
151
- `}let J=["cw-message",C&&"cw-message-user",v&&"cw-message-error"].filter(Boolean).join(" "),I=`cw-message-row ${C?"cw-message-row-user":""}`,D=e.role==="assistant"?be(e.content,s):U(e.content),F=e.files&&e.files.length>0,L=()=>F?N.html`
151
+ `}let J=["cw-message",C&&"cw-message-user",v&&"cw-message-error"].filter(Boolean).join(" "),I=`cw-message-row ${C?"cw-message-row-user":""}`,F=e.role==="assistant"?be(e.content,s):U(e.content),D=e.files&&e.files.length>0,L=()=>D?N.html`
152
152
  <div class="cw-message-attachments">
153
153
  ${e.files.map(b=>b.type&&b.type.startsWith("image/")?N.html`
154
154
  <a class="cw-attachment-thumbnail" href=${b.url} target="_blank" title=${b.name}>
@@ -185,11 +185,11 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
185
185
  position="left"
186
186
  showEdit=${!0}
187
187
  />
188
- <div class=${J} dangerouslySetInnerHTML=${{__html:D}} />
188
+ <div class=${J} dangerouslySetInnerHTML=${{__html:F}} />
189
189
  </div>
190
190
  `}
191
191
  ${!h&&N.html`
192
- <div class=${J} dangerouslySetInnerHTML=${{__html:D}} />
192
+ <div class=${J} dangerouslySetInnerHTML=${{__html:F}} />
193
193
  `}
194
194
  ${p&&N.html`
195
195
  <${Ye}
@@ -241,7 +241,7 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
241
241
  </div>
242
242
  `}
243
243
  </div>
244
- `}var te=require("htm/preact"),G=require("preact/compat");var Ue=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function xe({onSend:e,onCancel:t,isLoading:s,placeholder:n,primaryColor:a,enableVoice:l=!0,enableFiles:$=!0}){let[i,f]=(0,G.useState)(""),[y,u]=(0,G.useState)([]),[k,c]=(0,G.useState)(!1),[C,o]=(0,G.useState)(!1),[g]=(0,G.useState)(()=>!!Ue),w=(0,G.useRef)(null),v=(0,G.useRef)(null),T=(0,G.useRef)(null),m=(0,G.useRef)(!1);(0,G.useEffect)(()=>{!s&&w.current&&w.current.focus()},[s]),(0,G.useEffect)(()=>{w.current&&(w.current.style.height="auto",w.current.style.height=Math.min(w.current.scrollHeight,150)+"px")},[i]),(0,G.useEffect)(()=>()=>{m.current=!1,T.current&&T.current.abort()},[]);let H=d=>{d.preventDefault(),(i.trim()||y.length>0)&&!s&&(e(i,y),f(""),u([]),w.current&&(w.current.style.height="auto"),v.current&&(v.current.value=""))},J=d=>{let A=Array.from(d.target.files||[]);A.length>0&&u(P=>[...P,...A])},I=d=>{u(A=>A.filter((P,r)=>r!==d))},D=d=>{d.preventDefault(),v.current&&!s&&v.current.click()},F=d=>{d.key==="Enter"&&!d.shiftKey&&(d.preventDefault(),H(d))},L=d=>{s&&t&&(d.preventDefault(),t())},z=()=>{if(!Ue||s)return;m.current=!0;let d=new Ue;d.continuous=!0,d.interimResults=!0,d.lang=navigator.language||"en-US";let A=i,P="";d.onstart=()=>{o(!0)},d.onresult=r=>{P="";for(let E=r.resultIndex;E<r.results.length;E++){let W=r.results[E][0].transcript;r.results[E].isFinal?A+=(A?" ":"")+W:P+=W}f(A+(P?" "+P:""))},d.onerror=r=>{if(r.error==="no-speech"||r.error==="aborted"){console.log("[ChatWidget] Speech recognition:",r.error,"- continuing...");return}console.warn("[ChatWidget] Speech recognition error:",r.error),m.current=!1,o(!1),f(A||i)},d.onend=()=>{if(m.current){console.log("[ChatWidget] Recognition paused, restarting...");try{d.start();return}catch(r){console.warn("[ChatWidget] Could not restart recognition:",r)}}o(!1),A&&f(A),T.current=null},T.current=d,d.start()},V=()=>{m.current=!1,T.current&&T.current.stop()},h=d=>{d.preventDefault(),C?V():z()},M=te.html`
244
+ `}var te=require("htm/preact"),G=require("preact/compat");var Ue=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function xe({onSend:e,onCancel:t,isLoading:s,placeholder:n,primaryColor:a,enableVoice:l=!0,enableFiles:$=!0}){let[i,f]=(0,G.useState)(""),[y,u]=(0,G.useState)([]),[k,c]=(0,G.useState)(!1),[C,o]=(0,G.useState)(!1),[g]=(0,G.useState)(()=>!!Ue),w=(0,G.useRef)(null),v=(0,G.useRef)(null),T=(0,G.useRef)(null),m=(0,G.useRef)(!1);(0,G.useEffect)(()=>{!s&&w.current&&w.current.focus()},[s]),(0,G.useEffect)(()=>{w.current&&(w.current.style.height="auto",w.current.style.height=Math.min(w.current.scrollHeight,150)+"px")},[i]),(0,G.useEffect)(()=>()=>{m.current=!1,T.current&&T.current.abort()},[]);let H=d=>{d.preventDefault(),(i.trim()||y.length>0)&&!s&&(e(i,y),f(""),u([]),w.current&&(w.current.style.height="auto"),v.current&&(v.current.value=""))},J=d=>{let A=Array.from(d.target.files||[]);A.length>0&&u(P=>[...P,...A])},I=d=>{u(A=>A.filter((P,r)=>r!==d))},F=d=>{d.preventDefault(),v.current&&!s&&v.current.click()},D=d=>{d.key==="Enter"&&!d.shiftKey&&(d.preventDefault(),H(d))},L=d=>{s&&t&&(d.preventDefault(),t())},z=()=>{if(!Ue||s)return;m.current=!0;let d=new Ue;d.continuous=!0,d.interimResults=!0,d.lang=navigator.language||"en-US";let A=i,P="";d.onstart=()=>{o(!0)},d.onresult=r=>{P="";for(let E=r.resultIndex;E<r.results.length;E++){let W=r.results[E][0].transcript;r.results[E].isFinal?A+=(A?" ":"")+W:P+=W}f(A+(P?" "+P:""))},d.onerror=r=>{if(r.error==="no-speech"||r.error==="aborted"){console.log("[ChatWidget] Speech recognition:",r.error,"- continuing...");return}console.warn("[ChatWidget] Speech recognition error:",r.error),m.current=!1,o(!1),f(A||i)},d.onend=()=>{if(m.current){console.log("[ChatWidget] Recognition paused, restarting...");try{d.start();return}catch(r){console.warn("[ChatWidget] Could not restart recognition:",r)}}o(!1),A&&f(A),T.current=null},T.current=d,d.start()},V=()=>{m.current=!1,T.current&&T.current.stop()},h=d=>{d.preventDefault(),C?V():z()},M=te.html`
245
245
  <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor">
246
246
  <rect x="2" y="2" width="10" height="10" rx="1" />
247
247
  </svg>
@@ -288,7 +288,7 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
288
288
  placeholder=${U(n)}
289
289
  value=${i}
290
290
  onInput=${d=>f(d.target.value)}
291
- onKeyDown=${F}
291
+ onKeyDown=${D}
292
292
  disabled=${s}
293
293
  rows="1"
294
294
  />
@@ -296,7 +296,7 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
296
296
  <button
297
297
  type="button"
298
298
  class="cw-attach-btn"
299
- onClick=${D}
299
+ onClick=${F}
300
300
  disabled=${s}
301
301
  title="Attach files"
302
302
  >
@@ -583,7 +583,7 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
583
583
  </div>
584
584
  </div>
585
585
  </div>
586
- `}var K=require("preact/compat");function Re(e,t,s){let[n,a]=(0,K.useState)([]),[l,$]=(0,K.useState)(!1),[i,f]=(0,K.useState)(null),[y,u]=(0,K.useState)(()=>s?.get(e.conversationIdKey)||null),[k,c]=(0,K.useState)(!1),[C,o]=(0,K.useState)(!1),[g,w]=(0,K.useState)(0),v=(0,K.useRef)(null),T=(0,K.useRef)(null);(0,K.useEffect)(()=>{y&&s?.set(e.conversationIdKey,y)},[y,e.conversationIdKey,s]);let m=(0,K.useCallback)(async(h,M,p)=>{v.current&&v.current.close();let S=e.apiPaths.runEvents.replace("{runId}",h),b=`${e.backendUrl}${S}`;M&&(b+=`?anonymous_token=${encodeURIComponent(M)}`);let x=new EventSource(b);v.current=x;let d="";x.addEventListener("assistant.message",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("assistant.message",r.payload);let E=r.payload.content;E&&(d+=E,a(W=>{let q=W[W.length-1];return q?.role==="assistant"&&q.id.startsWith("assistant-stream-")?[...W.slice(0,-1),{...q,content:d}]:[...W,{id:"assistant-stream-"+Date.now(),role:"assistant",content:d,timestamp:new Date,type:"message"}]}))}catch(r){console.error("[ChatWidget] Parse error:",r)}}),x.addEventListener("tool.call",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("tool.call",r.payload),a(E=>[...E,{id:"tool-call-"+Date.now(),role:"assistant",content:`\u{1F527} ${r.payload.name}`,timestamp:new Date,type:"tool_call",metadata:{toolName:r.payload.name,arguments:r.payload.arguments,toolCallId:r.payload.id}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),x.addEventListener("tool.result",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("tool.result",r.payload);let E=r.payload.result,W=E?.error;a(q=>[...q,{id:"tool-result-"+Date.now(),role:"system",content:W?`\u274C ${E.error}`:"\u2713 Done",timestamp:new Date,type:"tool_result",metadata:{toolName:r.payload.name,result:E,toolCallId:r.payload.tool_call_id}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),x.addEventListener("custom",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("custom",r.payload),r.payload?.type==="ui_control"&&e.onUIControl&&e.onUIControl(r.payload),r.payload?.type==="agent_context"&&a(E=>[...E,{id:"agent-context-"+Date.now(),role:"system",content:`\u{1F517} ${r.payload.agent_name||"Sub-agent"} is now handling this request`,timestamp:new Date,type:"agent_context",metadata:{agentKey:r.payload.agent_key,agentName:r.payload.agent_name,action:r.payload.action}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),x.addEventListener("sub_agent.start",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("sub_agent.start",r.payload),a(E=>[...E,{id:"sub-agent-start-"+Date.now(),role:"system",content:`\u{1F517} Delegating to ${r.payload.agent_name||r.payload.sub_agent_key||"sub-agent"}...`,timestamp:new Date,type:"sub_agent_start",metadata:{subAgentKey:r.payload.sub_agent_key,agentName:r.payload.agent_name,invocationMode:r.payload.invocation_mode}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),x.addEventListener("sub_agent.end",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("sub_agent.end",r.payload),a(E=>[...E,{id:"sub-agent-end-"+Date.now(),role:"system",content:`\u2713 ${r.payload.agent_name||"Sub-agent"} completed`,timestamp:new Date,type:"sub_agent_end",metadata:{subAgentKey:r.payload.sub_agent_key,agentName:r.payload.agent_name}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}});let A=P=>{try{let r=JSON.parse(P.data);if(e.onEvent&&e.onEvent(r.type,r.payload),r.type==="run.failed"){let E=r.payload.error||"Agent run failed";f(E),a(W=>[...W,{id:"error-"+Date.now(),role:"system",content:`\u274C Error: ${E}`,timestamp:new Date,type:"error"}])}}catch(r){console.error("[ChatWidget] Parse error:",r)}$(!1),x.close(),v.current=null,d&&p&&p(d)};x.addEventListener("run.succeeded",A),x.addEventListener("run.failed",A),x.addEventListener("run.cancelled",A),x.addEventListener("run.timed_out",A),x.onerror=()=>{$(!1),x.close(),v.current=null}},[e]),H=(0,K.useCallback)(async(h,M={},p={})=>{if(!h.trim()||l)return;let S=[],b={};typeof M=="function"?b={onAssistantMessage:M}:Array.isArray(M)?(S=M,b=p):b=M||{};let{model:x,thinking:d,onAssistantMessage:A,supersedeFromMessageIndex:P}=b;$(!0),f(null);let r={id:pe(),role:"user",content:h.trim(),timestamp:new Date,type:"message",files:S.length>0?S.map(E=>({name:E.name,size:E.size,type:E.type})):void 0};a(E=>[...E,r]);try{let E=await t.getOrCreateSession(),W;if(S.length>0){let B=e.apiCaseStyle!=="camel",ze=we=>B?$e(we):we,le=new FormData;le.append(ze("agentKey"),e.agentKey),y&&le.append(ze("conversationId"),y),le.append("messages",JSON.stringify([{role:"user",content:h.trim()}])),le.append("metadata",JSON.stringify(B?{...e.metadata,journey_type:e.defaultJourneyType}:{...e.metadata,journeyType:e.defaultJourneyType})),x&&le.append("model",x),d&&le.append("thinking","true"),S.forEach(we=>{le.append("files",we)}),W=t.getFetchOptions({method:"POST",body:le},E)}else{let B=t.transformRequest({agentKey:e.agentKey,conversationId:y,messages:[{role:"user",content:h.trim()}],metadata:{...e.metadata,journeyType:e.defaultJourneyType},...x&&{model:x},...d&&{thinking:!0},...P!==void 0&&{supersedeFromMessageIndex:P}});W=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(B)},E)}let q=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,W),_=E;if(q.status===401){t.clearSession();let B=await t.getOrCreateSession(!0);B&&(_=B,S.length>0?W=t.getFetchOptions({method:"POST",body:W.body},B):W=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:W.body},B),q=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,W))}if(!q.ok){let B=await q.json().catch(()=>({}));throw new Error(B.error||B.detail||`HTTP ${q.status}`)}let Q=await q.json(),ne=t.transformResponse(Q);T.current=ne.id,!y&&ne.conversationId&&u(ne.conversationId),await m(ne.id,_,A)}catch(E){f(E.message||"Failed to send message"),$(!1)}finally{T.current=null}},[e,t,y,l,m]),J=(0,K.useCallback)(async()=>{let h=T.current;if(!(!h||!l))try{let M=e.apiPaths.cancelRun?e.apiPaths.cancelRun.replace("{runId}",h):`${e.apiPaths.runs}${h}/cancel/`;(await fetch(`${e.backendUrl}${M}`,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"}}))).ok&&(v.current&&(v.current.close(),v.current=null),$(!1),T.current=null,a(S=>[...S,{id:"cancelled-"+Date.now(),role:"system",content:"\u23F9 Run cancelled",timestamp:new Date,type:"cancelled"}]))}catch(M){console.error("[ChatWidget] Failed to cancel run:",M)}},[e,t,l]),I=(0,K.useCallback)(()=>{a([]),u(null),f(null),c(!1),w(0),s?.set(e.conversationIdKey,null)},[e.conversationIdKey,s]),D=h=>{let M={id:pe(),role:h.role,timestamp:h.timestamp?new Date(h.timestamp):new Date};if(h.role==="tool")return{...M,role:"system",content:"\u2713 Done",type:"tool_result",metadata:{result:h.content,toolCallId:h.toolCallId}};if(h.role==="assistant"&&h.toolCalls&&h.toolCalls.length>0)return h.toolCalls.map(S=>({id:pe(),role:"assistant",content:`\u{1F527} ${S.function?.name||S.name||"tool"}`,timestamp:M.timestamp,type:"tool_call",metadata:{toolName:S.function?.name||S.name,arguments:S.function?.arguments||S.arguments,toolCallId:S.id}}));let p=typeof h.content=="string"?h.content:JSON.stringify(h.content);return h.role==="assistant"&&!p?.trim()?null:{...M,content:p,type:"message"}},F=(0,K.useCallback)(async h=>{console.log("[ChatWidget] loadConversation called with:",h),$(!0),a([]),u(h);try{let M=await t.getOrCreateSession(),S=`${e.backendUrl}${e.apiPaths.conversations}${h}/?limit=10&offset=0`;console.log("[ChatWidget] Fetching conversation from:",S);let b=await fetch(S,t.getFetchOptions({method:"GET"},M));if(console.log("[ChatWidget] Response status:",b.status),b.ok){let x=await b.json();console.log("[ChatWidget] Raw conversation:",x);let d=t.transformResponse(x);if(console.log("[ChatWidget] Transformed conversation:",d),d.messages){let A=d.messages.flatMap(D).filter(Boolean);console.log("[ChatWidget] Mapped messages:",A),a(A)}c(d.hasMore||!1),w(d.messages?.length||0)}else b.status===404?(console.log("[ChatWidget] Conversation not found, clearing"),u(null),s?.set(e.conversationIdKey,null)):console.error("[ChatWidget] Unexpected response status:",b.status)}catch(M){console.error("[ChatWidget] Failed to load conversation:",M)}finally{$(!1)}},[e,t,s]),L=(0,K.useCallback)(async()=>{if(!(!y||C||!k)){o(!0);try{let h=await t.getOrCreateSession(),p=`${e.backendUrl}${e.apiPaths.conversations}${y}/?limit=10&offset=${g}`,S=await fetch(p,t.getFetchOptions({method:"GET"},h));if(S.ok){let b=await S.json(),x=t.transformResponse(b);if(x.messages?.length>0){let d=x.messages.flatMap(D).filter(Boolean);a(A=>[...d,...A]),w(A=>A+x.messages.length),c(x.hasMore||!1)}else c(!1)}}catch(h){console.error("[ChatWidget] Failed to load more messages:",h)}finally{o(!1)}}},[e,t,y,g,C,k]),z=(0,K.useCallback)(async(h,M,p={})=>{if(l)return;let S=n[h];if(!S||S.role!=="user")return;let b=n.slice(0,h);a(b),await H(M,{...p,supersedeFromMessageIndex:h})},[n,l,H]),V=(0,K.useCallback)(async(h,M={})=>{if(l)return;let p=n[h];if(!p)return;let S=h,b=p;if(p.role==="assistant"){for(let d=h-1;d>=0;d--)if(n[d].role==="user"){S=d,b=n[d];break}if(b.role!=="user")return}else if(p.role!=="user")return;let x=n.slice(0,S);a(x),await H(b.content,{...M,supersedeFromMessageIndex:S})},[n,l,H]);return(0,K.useEffect)(()=>()=>{v.current&&v.current.close()},[]),{messages:n,isLoading:l,error:i,conversationId:y,hasMoreMessages:k,loadingMoreMessages:C,sendMessage:H,cancelRun:J,clearMessages:I,loadConversation:F,loadMoreMessages:L,setConversationId:u,editMessage:z,retryMessage:V}}var X=require("preact/compat"),Qe="cw_thinking_enabled";function De(e,t,s){let[n,a]=(0,X.useState)([]),[l,$]=(0,X.useState)(null),[i,f]=(0,X.useState)(null),[y,u]=(0,X.useState)(!1),[k,c]=(0,X.useState)(!1);(0,X.useEffect)(()=>{(async()=>{if(e.showModelSelector){u(!0);try{let T=await fetch(`${e.backendUrl}${e.apiPaths.models}`,t.getFetchOptions({method:"GET"}));if(T.ok){let m=await T.json(),H=m.models||[];a(H),f(m.default);let J=s?.get(e.modelKey);J&&H.some(D=>D.id===J)?$(J):$(m.default),s?.get(Qe)==="true"&&c(!0)}}catch(T){console.warn("[ChatWidget] Failed to load models:",T)}finally{u(!1)}}})()},[e.backendUrl,e.apiPaths.models,e.showModelSelector,e.modelKey,t,s]);let C=(0,X.useCallback)(v=>{$(v),s?.set(e.modelKey,v)},[e.modelKey,s]),o=(0,X.useCallback)(v=>{c(v),s?.set(Qe,v?"true":"false")},[s]),g=(0,X.useCallback)(()=>n.find(v=>v.id===l)||null,[n,l]),w=(0,X.useCallback)(()=>g()?.supports_thinking||!1,[g]);return{availableModels:n,selectedModel:l,defaultModel:i,isLoading:y,selectModel:C,getSelectedModelInfo:g,thinkingEnabled:k,toggleThinking:o,supportsThinking:w}}var ee=require("preact/compat");function Fe(e,t){let[s,n]=(0,ee.useState)(null),[a,l]=(0,ee.useState)(!1),[$,i]=(0,ee.useState)(null),f=e.apiPaths?.tasks||"/api/agent/tasks/",y=(0,ee.useCallback)(async()=>{l(!0),i(null);try{let g=`${e.backendUrl}${f}`,w=await fetch(g,t.getFetchOptions({method:"GET"}));if(w.ok){let v=await w.json();n(v)}else{let v=await w.json().catch(()=>({}));i(v.error||"Failed to load tasks")}}catch(g){console.error("[useTasks] Failed to load task list:",g),i("Failed to load tasks")}finally{l(!1)}},[e.backendUrl,f,t]),u=(0,ee.useCallback)(async g=>{if(!s)return null;try{let w=`${e.backendUrl}${f}${s.id}/add_task/`,v=await fetch(w,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)}));if(v.ok){let T=await v.json();return await y(),T}else{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to add task"),null}}catch(w){return console.error("[useTasks] Failed to add task:",w),i("Failed to add task"),null}},[e.backendUrl,f,s,t,y]),k=(0,ee.useCallback)(async(g,w)=>{if(!s)return null;try{let v=`${e.backendUrl}${f}${s.id}/update_task/${g}/`,T=await fetch(v,t.getFetchOptions({method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(w)}));if(T.ok){let m=await T.json();return await y(),m}else{let m=await T.json().catch(()=>({}));return i(m.error||"Failed to update task"),null}}catch(v){return console.error("[useTasks] Failed to update task:",v),i("Failed to update task"),null}},[e.backendUrl,f,s,t,y]),c=(0,ee.useCallback)(async g=>{if(!s)return!1;try{let w=`${e.backendUrl}${f}${s.id}/remove_task/${g}/`,v=await fetch(w,t.getFetchOptions({method:"DELETE"}));if(v.ok)return await y(),!0;{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to remove task"),!1}}catch(w){return console.error("[useTasks] Failed to remove task:",w),i("Failed to remove task"),!1}},[e.backendUrl,f,s,t,y]),C=(0,ee.useCallback)(async()=>{if(!s)return!1;try{let g=`${e.backendUrl}${f}${s.id}/clear/`,w=await fetch(g,t.getFetchOptions({method:"POST"}));if(w.ok)return await y(),!0;{let v=await w.json().catch(()=>({}));return i(v.error||"Failed to clear tasks"),!1}}catch(g){return console.error("[useTasks] Failed to clear tasks:",g),i("Failed to clear tasks"),!1}},[e.backendUrl,f,s,t,y]),o=(0,ee.useCallback)(()=>i(null),[]);return{taskList:s,tasks:s?.tasks||[],progress:s?.progress||{total:0,completed:0,percent_complete:0},isLoading:a,error:$,loadTaskList:y,addTask:u,updateTask:k,removeTask:c,clearTasks:C,clearError:o}}var j=require("preact/compat"),et="cw_selected_system",Be="cw_selected_agent",tt="cw_selected_system_version",Oe="cw_selected_agent_version";function st(e,t,s){let[n,a]=(0,j.useState)([]),[l,$]=(0,j.useState)([]),[i,f]=(0,j.useState)(null),[y,u]=(0,j.useState)(null),[k,c]=(0,j.useState)(null),[C,o]=(0,j.useState)(null),[g,w]=(0,j.useState)(!1),v=(0,j.useCallback)(()=>{if(y)return y;if(i){let I=n.find(D=>D.slug===i);if(I?.entry_agent)return I.entry_agent.slug}return e.agentKey},[y,i,n,e.agentKey]);(0,j.useEffect)(()=>{if(!e.showDevTools)return;(async()=>{w(!0);try{let D=await fetch(`${e.backendUrl}${e.apiPaths.systems}`,t.getFetchOptions({method:"GET"}));if(D.ok){let F=await D.json(),L=F.results||F;a(L);let z=s?.get(et);z&&L.some(V=>V.slug===z)?f(z):L.length===1&&f(L[0].slug)}}catch(D){console.warn("[ChatWidget] Failed to load systems:",D)}finally{w(!1)}})()},[e.backendUrl,e.apiPaths.systems,e.showDevTools,t,s]),(0,j.useEffect)(()=>{if(!e.showDevTools)return;(async()=>{try{let D=i?`?system=${encodeURIComponent(i)}`:"",F=await fetch(`${e.backendUrl}${e.apiPaths.agents}${D}`,t.getFetchOptions({method:"GET"}));if(F.ok){let L=await F.json(),z=L.results||L;$(z);let V=s?.get(Be);if(V&&z.some(M=>M.slug===V))u(V);else if(i){let M=n.find(p=>p.slug===i);M?.entry_agent&&u(M.entry_agent.slug)}let h=s?.get(Oe);h&&o(h)}}catch(D){console.warn("[ChatWidget] Failed to load agents:",D)}})()},[e.backendUrl,e.apiPaths.agents,e.showDevTools,i,t,s,n]);let T=(0,j.useCallback)(I=>{f(I),s?.set(et,I),u(null),o(null),s?.set(Be,null),s?.set(Oe,null);let F=n.find(L=>L.slug===I)?.active_version||null;c(F),s?.set(tt,F)},[s,n]),m=(0,j.useCallback)(I=>{u(I),s?.set(Be,I);let F=l.find(L=>L.slug===I)?.active_version||null;o(F),s?.set(Oe,F)},[s,l]),H=(0,j.useCallback)(I=>{c(I),s?.set(tt,I)},[s]),J=(0,j.useCallback)(I=>{o(I),s?.set(Oe,I)},[s]);return{systems:n,agents:l,selectedSystem:i,selectedAgent:y,selectedSystemVersion:k,selectedAgentVersion:C,isLoading:g,selectSystem:T,selectAgent:m,selectSystemVersion:H,selectAgentVersion:J,getEffectiveAgentKey:v}}function Pe(e,t,s){let n=u=>!u||typeof u!="object"||e.apiCaseStyle==="camel"?u:ue(u),a=u=>!u||typeof u!="object"||e.apiCaseStyle==="snake"?u:de(u),l=()=>e.authStrategy?e.authStrategy:e.authToken?"token":e.apiPaths.anonymousSession||e.anonymousSessionEndpoint?"anonymous":"none",$=(u=null)=>{let k=l(),c={},C=u||e.authToken||t().authToken;if(k==="token"&&C){let o=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Token";c[o]=g?`${g} ${C}`:C}else if(k==="jwt"&&C){let o=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Bearer";c[o]=g?`${g} ${C}`:C}else if(k==="anonymous"&&C){let o=e.authHeader||e.anonymousTokenHeader||"X-Anonymous-Token";c[o]=C}if(k==="session"){let o=Se(e.csrfCookieName);o&&(c["X-CSRFToken"]=o)}return c};return{getAuthStrategy:l,getAuthHeaders:$,getFetchOptions:(u={},k=null)=>{let c=l(),C={...u},o=$(k);return console.log("[ChatWidget] getFetchOptions - strategy:",c,"overrideToken:",k,"authHeaders:",o),C.headers={...C.headers,...o},c==="session"&&(C.credentials="include"),C},getOrCreateSession:async(u=!1)=>{let k=l(),c=t(),C=e.anonymousTokenKey||e.sessionTokenKey;if(k!=="anonymous")return e.authToken||c.authToken;if(!u){if(c.authToken)return c.authToken;let o=c.storage?.get(C);if(o)return s(g=>({...g,authToken:o})),o}try{let o=e.anonymousSessionEndpoint||e.apiPaths.anonymousSession,g=await fetch(`${e.backendUrl}${o}`,{method:"POST",headers:{"Content-Type":"application/json"}});if(g.ok){let w=await g.json();return s(v=>({...v,authToken:w.token})),c.storage?.set(C,w.token),w.token}}catch(o){console.warn("[ChatWidget] Failed to create session:",o)}return null},clearSession:()=>{let u=e.anonymousTokenKey||e.sessionTokenKey,k=t();s(c=>({...c,authToken:null})),k.storage?.set(u,null)},transformRequest:n,transformResponse:a}}function fe({config:e,onStateChange:t,markdownParser:s,apiRef:n}){console.log("[ChatWidget] Config:",{showConversationSidebar:e.showConversationSidebar,apiPaths:e.apiPaths});let[a,l]=(0,R.useState)(e.embedded||e.forceOpen===!0),[$,i]=(0,R.useState)(!1),[f,y]=(0,R.useState)(!1),[u,k]=(0,R.useState)(!1),[c,C]=(0,R.useState)([]),[o,g]=(0,R.useState)("chat"),[w,v]=(0,R.useState)(!1),[T,m]=(0,R.useState)(e.enableTTS),[H,J]=(0,R.useState)(!1),[I,D]=(0,R.useState)(null);(0,R.useEffect)(()=>{e.forceOpen!==void 0&&l(e.forceOpen)},[e.forceOpen]);let F=(0,R.useMemo)(()=>Ce(e.containerId),[e.containerId]),[L,z]=(0,R.useState)(e.authToken||null),V=(0,R.useMemo)(()=>Pe(e,()=>({authToken:L,storage:F}),ne=>{let B=ne({authToken:L,storage:F});B.authToken!==L&&z(B.authToken)}),[e,L,F]),h=st(e,V,F),M=(0,R.useMemo)(()=>{if(!e.showDevTools)return e;let _=h.getEffectiveAgentKey();return _&&_!==e.agentKey?{...e,agentKey:_}:e},[e,h.getEffectiveAgentKey]),p=Re(M,V,F),S=De(e,V,F),b=Fe(e,V);(0,R.useEffect)(()=>{for(let _=p.messages.length-1;_>=0;_--){let Q=p.messages[_];if(Q.type==="sub_agent_start"){D({key:Q.metadata?.subAgentKey,name:Q.metadata?.agentName});return}if(Q.type==="sub_agent_end"){D(null);return}}},[p.messages]),(0,R.useEffect)(()=>{let _=F.get(e.conversationIdKey);console.log("[ChatWidget] Initial load - storedConvId:",_,"key:",e.conversationIdKey),console.log("[ChatWidget] apiPaths.conversations:",e.apiPaths.conversations),_&&(console.log("[ChatWidget] Loading conversation:",_),p.loadConversation(_))},[]),(0,R.useEffect)(()=>{t&&t({isOpen:a,isExpanded:$,debugMode:f,messages:p.messages,conversationId:p.conversationId,isLoading:p.isLoading,error:p.error})},[a,$,f,p.messages,p.conversationId,p.isLoading,p.error]);let x=(0,R.useCallback)(async()=>{if(e.showConversationSidebar){v(!0);try{let _=M.agentKey,Q=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(_)}`,ne=await fetch(Q,V.getFetchOptions({method:"GET"}));if(ne.ok){let B=await ne.json();C(B.results||B)}}catch(_){console.error("[ChatWidget] Failed to load conversations:",_),C([])}finally{v(!1)}}},[e,M,V]),d=(0,R.useCallback)(()=>{let _=!u;k(_),_&&x()},[u,x]),A=(0,R.useCallback)(_=>{_!==p.conversationId&&p.loadConversation(_),k(!1)},[p]),P=(0,R.useCallback)(()=>{p.clearMessages(),k(!1)},[p]),r=(0,R.useCallback)(_=>{p.sendMessage(_,{model:S.selectedModel,thinking:S.thinkingEnabled&&S.supportsThinking(),onAssistantMessage:Q=>{}})},[p,T,S.selectedModel,S.thinkingEnabled,S.supportsThinking]),E=(0,R.useCallback)(_=>{g(_),_==="tasks"&&b.loadTaskList()},[b]);if((0,R.useEffect)(()=>{n&&(n.current={open:()=>l(!0),close:()=>l(!1),send:_=>r(_),clearMessages:()=>p.clearMessages(),toggleTTS:()=>m(_=>!_),stopSpeech:()=>J(!1),setAuth:_=>{_.token!==void 0&&z(_.token)},clearAuth:()=>z(null)})},[p,n,r]),!e.embedded&&!a)return Z.html`
586
+ `}var K=require("preact/compat");function Re(e,t,s){let[n,a]=(0,K.useState)([]),[l,$]=(0,K.useState)(!1),[i,f]=(0,K.useState)(null),[y,u]=(0,K.useState)(()=>s?.get(e.conversationIdKey)||null),[k,c]=(0,K.useState)(!1),[C,o]=(0,K.useState)(!1),[g,w]=(0,K.useState)(0),v=(0,K.useRef)(null),T=(0,K.useRef)(null);(0,K.useEffect)(()=>{y&&s?.set(e.conversationIdKey,y)},[y,e.conversationIdKey,s]);let m=(0,K.useCallback)(async(h,M,p)=>{v.current&&v.current.close();let S=e.apiPaths.runEvents.replace("{runId}",h),b=`${e.backendUrl}${S}`;M&&(b+=`?anonymous_token=${encodeURIComponent(M)}`);let x=new EventSource(b);v.current=x;let d="";x.addEventListener("assistant.message",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("assistant.message",r.payload);let E=r.payload.content;E&&(d+=E,a(W=>{let q=W[W.length-1];return q?.role==="assistant"&&q.id.startsWith("assistant-stream-")?[...W.slice(0,-1),{...q,content:d}]:[...W,{id:"assistant-stream-"+Date.now(),role:"assistant",content:d,timestamp:new Date,type:"message"}]}))}catch(r){console.error("[ChatWidget] Parse error:",r)}}),x.addEventListener("tool.call",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("tool.call",r.payload),a(E=>[...E,{id:"tool-call-"+Date.now(),role:"assistant",content:`\u{1F527} ${r.payload.name}`,timestamp:new Date,type:"tool_call",metadata:{toolName:r.payload.name,arguments:r.payload.arguments,toolCallId:r.payload.id}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),x.addEventListener("tool.result",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("tool.result",r.payload);let E=r.payload.result,W=E?.error;a(q=>[...q,{id:"tool-result-"+Date.now(),role:"system",content:W?`\u274C ${E.error}`:"\u2713 Done",timestamp:new Date,type:"tool_result",metadata:{toolName:r.payload.name,result:E,toolCallId:r.payload.tool_call_id}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),x.addEventListener("custom",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("custom",r.payload),r.payload?.type==="ui_control"&&e.onUIControl&&e.onUIControl(r.payload),r.payload?.type==="agent_context"&&a(E=>[...E,{id:"agent-context-"+Date.now(),role:"system",content:`\u{1F517} ${r.payload.agent_name||"Sub-agent"} is now handling this request`,timestamp:new Date,type:"agent_context",metadata:{agentKey:r.payload.agent_key,agentName:r.payload.agent_name,action:r.payload.action}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),x.addEventListener("sub_agent.start",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("sub_agent.start",r.payload),a(E=>[...E,{id:"sub-agent-start-"+Date.now(),role:"system",content:`\u{1F517} Delegating to ${r.payload.agent_name||r.payload.sub_agent_key||"sub-agent"}...`,timestamp:new Date,type:"sub_agent_start",metadata:{subAgentKey:r.payload.sub_agent_key,agentName:r.payload.agent_name,invocationMode:r.payload.invocation_mode}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),x.addEventListener("sub_agent.end",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("sub_agent.end",r.payload),a(E=>[...E,{id:"sub-agent-end-"+Date.now(),role:"system",content:`\u2713 ${r.payload.agent_name||"Sub-agent"} completed`,timestamp:new Date,type:"sub_agent_end",metadata:{subAgentKey:r.payload.sub_agent_key,agentName:r.payload.agent_name}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}});let A=P=>{try{let r=JSON.parse(P.data);if(e.onEvent&&e.onEvent(r.type,r.payload),r.type==="run.failed"){let E=r.payload.error||"Agent run failed";f(E),a(W=>[...W,{id:"error-"+Date.now(),role:"system",content:`\u274C Error: ${E}`,timestamp:new Date,type:"error"}])}}catch(r){console.error("[ChatWidget] Parse error:",r)}$(!1),x.close(),v.current=null,d&&p&&p(d)};x.addEventListener("run.succeeded",A),x.addEventListener("run.failed",A),x.addEventListener("run.cancelled",A),x.addEventListener("run.timed_out",A),x.onerror=()=>{$(!1),x.close(),v.current=null}},[e]),H=(0,K.useCallback)(async(h,M={},p={})=>{if(!h.trim()||l)return;let S=[],b={};typeof M=="function"?b={onAssistantMessage:M}:Array.isArray(M)?(S=M,b=p):b=M||{};let{model:x,thinking:d,onAssistantMessage:A,supersedeFromMessageIndex:P}=b;$(!0),f(null);let r={id:pe(),role:"user",content:h.trim(),timestamp:new Date,type:"message",files:S.length>0?S.map(E=>({name:E.name,size:E.size,type:E.type})):void 0};a(E=>[...E,r]);try{let E=await t.getOrCreateSession(),W;if(S.length>0){let B=e.apiCaseStyle!=="camel",ze=we=>B?$e(we):we,le=new FormData;le.append(ze("agentKey"),e.agentKey),y&&le.append(ze("conversationId"),y),le.append("messages",JSON.stringify([{role:"user",content:h.trim()}])),le.append("metadata",JSON.stringify(B?{...e.metadata,journey_type:e.defaultJourneyType}:{...e.metadata,journeyType:e.defaultJourneyType})),x&&le.append("model",x),d&&le.append("thinking","true"),S.forEach(we=>{le.append("files",we)}),W=t.getFetchOptions({method:"POST",body:le},E)}else{let B=t.transformRequest({agentKey:e.agentKey,conversationId:y,messages:[{role:"user",content:h.trim()}],metadata:{...e.metadata,journeyType:e.defaultJourneyType},...x&&{model:x},...d&&{thinking:!0},...P!==void 0&&{supersedeFromMessageIndex:P}});W=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(B)},E)}let q=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,W),_=E;if(q.status===401){t.clearSession();let B=await t.getOrCreateSession(!0);B&&(_=B,S.length>0?W=t.getFetchOptions({method:"POST",body:W.body},B):W=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:W.body},B),q=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,W))}if(!q.ok){let B=await q.json().catch(()=>({}));throw new Error(B.error||B.detail||`HTTP ${q.status}`)}let Q=await q.json(),ne=t.transformResponse(Q);T.current=ne.id,!y&&ne.conversationId&&u(ne.conversationId),await m(ne.id,_,A)}catch(E){f(E.message||"Failed to send message"),$(!1)}finally{T.current=null}},[e,t,y,l,m]),J=(0,K.useCallback)(async()=>{let h=T.current;if(!(!h||!l))try{let M=e.apiPaths.cancelRun?e.apiPaths.cancelRun.replace("{runId}",h):`${e.apiPaths.runs}${h}/cancel/`;(await fetch(`${e.backendUrl}${M}`,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"}}))).ok&&(v.current&&(v.current.close(),v.current=null),$(!1),T.current=null,a(S=>[...S,{id:"cancelled-"+Date.now(),role:"system",content:"\u23F9 Run cancelled",timestamp:new Date,type:"cancelled"}]))}catch(M){console.error("[ChatWidget] Failed to cancel run:",M)}},[e,t,l]),I=(0,K.useCallback)(()=>{a([]),u(null),f(null),c(!1),w(0),s?.set(e.conversationIdKey,null)},[e.conversationIdKey,s]),F=h=>{let M={id:pe(),role:h.role,timestamp:h.timestamp?new Date(h.timestamp):new Date};if(h.role==="tool")return{...M,role:"system",content:"\u2713 Done",type:"tool_result",metadata:{result:h.content,toolCallId:h.toolCallId}};if(h.role==="assistant"&&h.toolCalls&&h.toolCalls.length>0)return h.toolCalls.map(S=>({id:pe(),role:"assistant",content:`\u{1F527} ${S.function?.name||S.name||"tool"}`,timestamp:M.timestamp,type:"tool_call",metadata:{toolName:S.function?.name||S.name,arguments:S.function?.arguments||S.arguments,toolCallId:S.id}}));let p=typeof h.content=="string"?h.content:JSON.stringify(h.content);return h.role==="assistant"&&!p?.trim()?null:{...M,content:p,type:"message"}},D=(0,K.useCallback)(async h=>{console.log("[ChatWidget] loadConversation called with:",h),$(!0),a([]),u(h);try{let M=await t.getOrCreateSession(),S=`${e.backendUrl}${e.apiPaths.conversations}${h}/?limit=10&offset=0`;console.log("[ChatWidget] Fetching conversation from:",S);let b=await fetch(S,t.getFetchOptions({method:"GET"},M));if(console.log("[ChatWidget] Response status:",b.status),b.ok){let x=await b.json();console.log("[ChatWidget] Raw conversation:",x);let d=t.transformResponse(x);if(console.log("[ChatWidget] Transformed conversation:",d),d.messages){let A=d.messages.flatMap(F).filter(Boolean);console.log("[ChatWidget] Mapped messages:",A),a(A)}c(d.hasMore||!1),w(d.messages?.length||0)}else b.status===404?(console.log("[ChatWidget] Conversation not found, clearing"),u(null),s?.set(e.conversationIdKey,null)):console.error("[ChatWidget] Unexpected response status:",b.status)}catch(M){console.error("[ChatWidget] Failed to load conversation:",M)}finally{$(!1)}},[e,t,s]),L=(0,K.useCallback)(async()=>{if(!(!y||C||!k)){o(!0);try{let h=await t.getOrCreateSession(),p=`${e.backendUrl}${e.apiPaths.conversations}${y}/?limit=10&offset=${g}`,S=await fetch(p,t.getFetchOptions({method:"GET"},h));if(S.ok){let b=await S.json(),x=t.transformResponse(b);if(x.messages?.length>0){let d=x.messages.flatMap(F).filter(Boolean);a(A=>[...d,...A]),w(A=>A+x.messages.length),c(x.hasMore||!1)}else c(!1)}}catch(h){console.error("[ChatWidget] Failed to load more messages:",h)}finally{o(!1)}}},[e,t,y,g,C,k]),z=(0,K.useCallback)(async(h,M,p={})=>{if(l)return;let S=n[h];if(!S||S.role!=="user")return;let b=n.slice(0,h);a(b),await H(M,{...p,supersedeFromMessageIndex:h})},[n,l,H]),V=(0,K.useCallback)(async(h,M={})=>{if(l)return;let p=n[h];if(!p)return;let S=h,b=p;if(p.role==="assistant"){for(let d=h-1;d>=0;d--)if(n[d].role==="user"){S=d,b=n[d];break}if(b.role!=="user")return}else if(p.role!=="user")return;let x=n.slice(0,S);a(x),await H(b.content,{...M,supersedeFromMessageIndex:S})},[n,l,H]);return(0,K.useEffect)(()=>()=>{v.current&&v.current.close()},[]),{messages:n,isLoading:l,error:i,conversationId:y,hasMoreMessages:k,loadingMoreMessages:C,sendMessage:H,cancelRun:J,clearMessages:I,loadConversation:D,loadMoreMessages:L,setConversationId:u,editMessage:z,retryMessage:V}}var X=require("preact/compat"),Qe="cw_thinking_enabled";function Fe(e,t,s){let[n,a]=(0,X.useState)([]),[l,$]=(0,X.useState)(null),[i,f]=(0,X.useState)(null),[y,u]=(0,X.useState)(!1),[k,c]=(0,X.useState)(!1);(0,X.useEffect)(()=>{(async()=>{if(e.showModelSelector){u(!0);try{let T=await fetch(`${e.backendUrl}${e.apiPaths.models}`,t.getFetchOptions({method:"GET"}));if(T.ok){let m=await T.json(),H=m.models||[];a(H),f(m.default);let J=s?.get(e.modelKey);J&&H.some(F=>F.id===J)?$(J):$(m.default),s?.get(Qe)==="true"&&c(!0)}}catch(T){console.warn("[ChatWidget] Failed to load models:",T)}finally{u(!1)}}})()},[e.backendUrl,e.apiPaths.models,e.showModelSelector,e.modelKey,t,s]);let C=(0,X.useCallback)(v=>{$(v),s?.set(e.modelKey,v)},[e.modelKey,s]),o=(0,X.useCallback)(v=>{c(v),s?.set(Qe,v?"true":"false")},[s]),g=(0,X.useCallback)(()=>n.find(v=>v.id===l)||null,[n,l]),w=(0,X.useCallback)(()=>g()?.supports_thinking||!1,[g]);return{availableModels:n,selectedModel:l,defaultModel:i,isLoading:y,selectModel:C,getSelectedModelInfo:g,thinkingEnabled:k,toggleThinking:o,supportsThinking:w}}var ee=require("preact/compat");function De(e,t){let[s,n]=(0,ee.useState)(null),[a,l]=(0,ee.useState)(!1),[$,i]=(0,ee.useState)(null),f=e.apiPaths?.tasks||"/api/agent/tasks/",y=(0,ee.useCallback)(async()=>{l(!0),i(null);try{let g=`${e.backendUrl}${f}`,w=await fetch(g,t.getFetchOptions({method:"GET"}));if(w.ok){let v=await w.json();n(v)}else{let v=await w.json().catch(()=>({}));i(v.error||"Failed to load tasks")}}catch(g){console.error("[useTasks] Failed to load task list:",g),i("Failed to load tasks")}finally{l(!1)}},[e.backendUrl,f,t]),u=(0,ee.useCallback)(async g=>{if(!s)return null;try{let w=`${e.backendUrl}${f}${s.id}/add_task/`,v=await fetch(w,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)}));if(v.ok){let T=await v.json();return await y(),T}else{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to add task"),null}}catch(w){return console.error("[useTasks] Failed to add task:",w),i("Failed to add task"),null}},[e.backendUrl,f,s,t,y]),k=(0,ee.useCallback)(async(g,w)=>{if(!s)return null;try{let v=`${e.backendUrl}${f}${s.id}/update_task/${g}/`,T=await fetch(v,t.getFetchOptions({method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(w)}));if(T.ok){let m=await T.json();return await y(),m}else{let m=await T.json().catch(()=>({}));return i(m.error||"Failed to update task"),null}}catch(v){return console.error("[useTasks] Failed to update task:",v),i("Failed to update task"),null}},[e.backendUrl,f,s,t,y]),c=(0,ee.useCallback)(async g=>{if(!s)return!1;try{let w=`${e.backendUrl}${f}${s.id}/remove_task/${g}/`,v=await fetch(w,t.getFetchOptions({method:"DELETE"}));if(v.ok)return await y(),!0;{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to remove task"),!1}}catch(w){return console.error("[useTasks] Failed to remove task:",w),i("Failed to remove task"),!1}},[e.backendUrl,f,s,t,y]),C=(0,ee.useCallback)(async()=>{if(!s)return!1;try{let g=`${e.backendUrl}${f}${s.id}/clear/`,w=await fetch(g,t.getFetchOptions({method:"POST"}));if(w.ok)return await y(),!0;{let v=await w.json().catch(()=>({}));return i(v.error||"Failed to clear tasks"),!1}}catch(g){return console.error("[useTasks] Failed to clear tasks:",g),i("Failed to clear tasks"),!1}},[e.backendUrl,f,s,t,y]),o=(0,ee.useCallback)(()=>i(null),[]);return{taskList:s,tasks:s?.tasks||[],progress:s?.progress||{total:0,completed:0,percent_complete:0},isLoading:a,error:$,loadTaskList:y,addTask:u,updateTask:k,removeTask:c,clearTasks:C,clearError:o}}var j=require("preact/compat"),et="cw_selected_system",Be="cw_selected_agent",tt="cw_selected_system_version",Oe="cw_selected_agent_version";function st(e,t,s){let[n,a]=(0,j.useState)([]),[l,$]=(0,j.useState)([]),[i,f]=(0,j.useState)(null),[y,u]=(0,j.useState)(null),[k,c]=(0,j.useState)(null),[C,o]=(0,j.useState)(null),[g,w]=(0,j.useState)(!1),v=(0,j.useCallback)(()=>{if(y)return y;if(i){let I=n.find(F=>F.slug===i);if(I?.entry_agent)return I.entry_agent.slug}return e.agentKey},[y,i,n,e.agentKey]);(0,j.useEffect)(()=>{if(!e.showDevTools)return;(async()=>{w(!0);try{let F=await fetch(`${e.backendUrl}${e.apiPaths.systems}`,t.getFetchOptions({method:"GET"}));if(F.ok){let D=await F.json(),L=D.results||D;a(L);let z=s?.get(et);z&&L.some(V=>V.slug===z)?f(z):L.length===1&&f(L[0].slug)}}catch(F){console.warn("[ChatWidget] Failed to load systems:",F)}finally{w(!1)}})()},[e.backendUrl,e.apiPaths.systems,e.showDevTools,t,s]),(0,j.useEffect)(()=>{if(!e.showDevTools)return;(async()=>{try{let F=i?`?system=${encodeURIComponent(i)}`:"",D=await fetch(`${e.backendUrl}${e.apiPaths.agents}${F}`,t.getFetchOptions({method:"GET"}));if(D.ok){let L=await D.json(),z=L.results||L;$(z);let V=s?.get(Be);if(V&&z.some(M=>M.slug===V))u(V);else if(i){let M=n.find(p=>p.slug===i);M?.entry_agent&&u(M.entry_agent.slug)}let h=s?.get(Oe);h&&o(h)}}catch(F){console.warn("[ChatWidget] Failed to load agents:",F)}})()},[e.backendUrl,e.apiPaths.agents,e.showDevTools,i,t,s,n]);let T=(0,j.useCallback)(I=>{f(I),s?.set(et,I),u(null),o(null),s?.set(Be,null),s?.set(Oe,null);let D=n.find(L=>L.slug===I)?.active_version||null;c(D),s?.set(tt,D)},[s,n]),m=(0,j.useCallback)(I=>{u(I),s?.set(Be,I);let D=l.find(L=>L.slug===I)?.active_version||null;o(D),s?.set(Oe,D)},[s,l]),H=(0,j.useCallback)(I=>{c(I),s?.set(tt,I)},[s]),J=(0,j.useCallback)(I=>{o(I),s?.set(Oe,I)},[s]);return{systems:n,agents:l,selectedSystem:i,selectedAgent:y,selectedSystemVersion:k,selectedAgentVersion:C,isLoading:g,selectSystem:T,selectAgent:m,selectSystemVersion:H,selectAgentVersion:J,getEffectiveAgentKey:v}}function Pe(e,t,s){let n=u=>!u||typeof u!="object"||e.apiCaseStyle==="camel"?u:ue(u),a=u=>!u||typeof u!="object"||e.apiCaseStyle==="snake"?u:de(u),l=()=>e.authStrategy?e.authStrategy:e.authToken?"token":e.apiPaths.anonymousSession||e.anonymousSessionEndpoint?"anonymous":"none",$=(u=null)=>{let k=l(),c={},C=u||e.authToken||t().authToken;if(k==="token"&&C){let o=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Token";c[o]=g?`${g} ${C}`:C}else if(k==="jwt"&&C){let o=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Bearer";c[o]=g?`${g} ${C}`:C}else if(k==="anonymous"&&C){let o=e.authHeader||e.anonymousTokenHeader||"X-Anonymous-Token";c[o]=C}if(k==="session"){let o=Se(e.csrfCookieName);o&&(c["X-CSRFToken"]=o)}return c};return{getAuthStrategy:l,getAuthHeaders:$,getFetchOptions:(u={},k=null)=>{let c=l(),C={...u},o=$(k);return console.log("[ChatWidget] getFetchOptions - strategy:",c,"overrideToken:",k,"authHeaders:",o),C.headers={...C.headers,...o},c==="session"&&(C.credentials="include"),C},getOrCreateSession:async(u=!1)=>{let k=l(),c=t(),C=e.anonymousTokenKey||e.sessionTokenKey;if(k!=="anonymous")return e.authToken||c.authToken;if(!u){if(c.authToken)return c.authToken;let o=c.storage?.get(C);if(o)return s(g=>({...g,authToken:o})),o}try{let o=e.anonymousSessionEndpoint||e.apiPaths.anonymousSession,g=await fetch(`${e.backendUrl}${o}`,{method:"POST",headers:{"Content-Type":"application/json"}});if(g.ok){let w=await g.json();return s(v=>({...v,authToken:w.token})),c.storage?.set(C,w.token),w.token}}catch(o){console.warn("[ChatWidget] Failed to create session:",o)}return null},clearSession:()=>{let u=e.anonymousTokenKey||e.sessionTokenKey,k=t();s(c=>({...c,authToken:null})),k.storage?.set(u,null)},transformRequest:n,transformResponse:a}}function fe({config:e,onStateChange:t,markdownParser:s,apiRef:n}){console.log("[ChatWidget] Config:",{showConversationSidebar:e.showConversationSidebar,apiPaths:e.apiPaths});let[a,l]=(0,R.useState)(e.embedded||e.forceOpen===!0),[$,i]=(0,R.useState)(!1),[f,y]=(0,R.useState)(!1),[u,k]=(0,R.useState)(!1),[c,C]=(0,R.useState)([]),[o,g]=(0,R.useState)("chat"),[w,v]=(0,R.useState)(!1),[T,m]=(0,R.useState)(e.enableTTS),[H,J]=(0,R.useState)(!1),[I,F]=(0,R.useState)(null);(0,R.useEffect)(()=>{e.forceOpen!==void 0&&l(e.forceOpen)},[e.forceOpen]);let D=(0,R.useMemo)(()=>Ce(e.containerId),[e.containerId]),[L,z]=(0,R.useState)(e.authToken||null),V=(0,R.useMemo)(()=>Pe(e,()=>({authToken:L,storage:D}),ne=>{let B=ne({authToken:L,storage:D});B.authToken!==L&&z(B.authToken)}),[e,L,D]),h=st(e,V,D),M=(0,R.useMemo)(()=>{if(!e.showDevTools)return e;let _=h.getEffectiveAgentKey();return _&&_!==e.agentKey?{...e,agentKey:_}:e},[e,h.getEffectiveAgentKey]),p=Re(M,V,D),S=Fe(e,V,D),b=De(e,V);(0,R.useEffect)(()=>{for(let _=p.messages.length-1;_>=0;_--){let Q=p.messages[_];if(Q.type==="sub_agent_start"){F({key:Q.metadata?.subAgentKey,name:Q.metadata?.agentName});return}if(Q.type==="sub_agent_end"){F(null);return}}},[p.messages]),(0,R.useEffect)(()=>{let _=D.get(e.conversationIdKey);console.log("[ChatWidget] Initial load - storedConvId:",_,"key:",e.conversationIdKey),console.log("[ChatWidget] apiPaths.conversations:",e.apiPaths.conversations),_&&(console.log("[ChatWidget] Loading conversation:",_),p.loadConversation(_))},[]),(0,R.useEffect)(()=>{t&&t({isOpen:a,isExpanded:$,debugMode:f,messages:p.messages,conversationId:p.conversationId,isLoading:p.isLoading,error:p.error})},[a,$,f,p.messages,p.conversationId,p.isLoading,p.error]);let x=(0,R.useCallback)(async()=>{if(e.showConversationSidebar){v(!0);try{let _=M.agentKey,Q=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(_)}`,ne=await fetch(Q,V.getFetchOptions({method:"GET"}));if(ne.ok){let B=await ne.json();C(B.results||B)}}catch(_){console.error("[ChatWidget] Failed to load conversations:",_),C([])}finally{v(!1)}}},[e,M,V]),d=(0,R.useCallback)(()=>{let _=!u;k(_),_&&x()},[u,x]),A=(0,R.useCallback)(_=>{_!==p.conversationId&&p.loadConversation(_),k(!1)},[p]),P=(0,R.useCallback)(()=>{p.clearMessages(),k(!1)},[p]),r=(0,R.useCallback)(_=>{p.sendMessage(_,{model:S.selectedModel,thinking:S.thinkingEnabled&&S.supportsThinking(),onAssistantMessage:Q=>{}})},[p,T,S.selectedModel,S.thinkingEnabled,S.supportsThinking]),E=(0,R.useCallback)(_=>{g(_),_==="tasks"&&b.loadTaskList()},[b]);if((0,R.useEffect)(()=>{n&&(n.current={open:()=>l(!0),close:()=>l(!1),send:_=>r(_),clearMessages:()=>p.clearMessages(),toggleTTS:()=>m(_=>!_),stopSpeech:()=>J(!1),setAuth:_=>{_.token!==void 0&&z(_.token)},clearAuth:()=>z(null)})},[p,n,r]),!e.embedded&&!a)return Z.html`
587
587
  <button
588
588
  class="cw-fab"
589
589
  style=${{backgroundColor:e.primaryColor}}
@@ -607,21 +607,23 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
607
607
  />
608
608
  `}
609
609
 
610
- <${Te}
611
- config=${e}
612
- debugMode=${f}
613
- isExpanded=${$}
614
- isSpeaking=${H}
615
- messagesCount=${p.messages.length}
616
- isLoading=${p.isLoading}
617
- currentAgent=${I}
618
- onClose=${()=>l(!1)}
619
- onToggleExpand=${()=>i(!$)}
620
- onToggleDebug=${()=>y(!f)}
621
- onToggleTTS=${()=>m(!T)}
622
- onClear=${p.clearMessages}
623
- onToggleSidebar=${d}
624
- />
610
+ ${e.showHeader!==!1&&Z.html`
611
+ <${Te}
612
+ config=${e}
613
+ debugMode=${f}
614
+ isExpanded=${$}
615
+ isSpeaking=${H}
616
+ messagesCount=${p.messages.length}
617
+ isLoading=${p.isLoading}
618
+ currentAgent=${I}
619
+ onClose=${()=>l(!1)}
620
+ onToggleExpand=${()=>i(!$)}
621
+ onToggleDebug=${()=>y(!f)}
622
+ onToggleTTS=${()=>m(!T)}
623
+ onClear=${p.clearMessages}
624
+ onToggleSidebar=${d}
625
+ />
626
+ `}
625
627
 
626
628
  ${e.showDevTools&&Z.html`
627
629
  <${Ze}
@@ -693,6 +695,7 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
693
695
  placeholder=${e.placeholder}
694
696
  primaryColor=${e.primaryColor}
695
697
  enableVoice=${e.enableVoice}
698
+ enableFiles=${e.showFileAttachment!==!1}
696
699
  />
697
700
  `:Z.html`
698
701
  <${Ae}
@@ -707,7 +710,7 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
707
710
  />
708
711
  `}
709
712
  </div>
710
- `}var Le={backendUrl:"http://localhost:8000",agentKey:"default-agent",title:"Chat Assistant",subtitle:"How can we help you today?",primaryColor:"#0066cc",headerTextColor:null,position:"bottom-right",defaultJourneyType:"general",enableDebugMode:!0,enableAutoRun:!0,journeyTypes:{},customerPrompts:{},placeholder:"Type your message...",emptyStateTitle:"Start a Conversation",emptyStateMessage:"Send a message to get started.",authStrategy:null,authToken:null,authHeader:null,authTokenPrefix:null,anonymousSessionEndpoint:null,anonymousTokenKey:"chat_widget_anonymous_token",onAuthError:null,anonymousTokenHeader:"X-Anonymous-Token",conversationIdKey:"chat_widget_conversation_id",sessionTokenKey:"chat_widget_session_token",apiPaths:{anonymousSession:"/api/accounts/anonymous-session/",conversations:"/api/agent-runtime/conversations/",runs:"/api/agent-runtime/runs/",runEvents:"/api/agent-runtime/runs/{runId}/events/",simulateCustomer:"/api/agent-runtime/simulate-customer/",ttsVoices:"/api/tts/voices/",ttsSetVoice:"/api/tts/set-voice/",models:"/api/agent-runtime/models/",systems:"/api/agent-runtime/systems/",agents:"/api/agent-runtime/agents/"},apiCaseStyle:"auto",theme:"light",showConversationSidebar:!0,showClearButton:!0,showDebugButton:!0,showTTSButton:!0,showVoiceSettings:!0,showExpandButton:!0,showModelSelector:!1,showDevTools:!1,enableVoice:!0,modelKey:"chat_widget_selected_model",autoRunDelay:1e3,autoRunMode:"automatic",enableTTS:!1,ttsProxyUrl:null,elevenLabsApiKey:null,ttsVoices:{assistant:null,user:null},ttsModel:"eleven_turbo_v2_5",ttsSettings:{stability:.5,similarity_boost:.75,style:0,use_speaker_boost:!0},availableVoices:[],onEvent:null,containerId:null,embedded:!1,metadata:{}};function Ke(e){let t={...Le.apiPaths,...e.apiPaths||{}};return{...Le,...e,apiPaths:t}}var je=require("preact/compat"),nt=require("htm/preact");var We=new Map,$t=0,O=null,Je=class{constructor(t={}){Ge(this,"_handleStateChange",t=>{this._state=t});this.instanceId=`cw-${++$t}`,this.config=Ke(t),this.container=null,this._state={},this._apiRef={current:null},We.set(this.instanceId,this)}init(){if(this.config.containerId){if(this.container=document.getElementById(this.config.containerId),!this.container)return console.error(`[ChatWidget] Container not found: ${this.config.containerId}`),this;this.container.classList.add("cw-container-embedded")}else this.container=document.createElement("div"),this.container.id=this.instanceId,this.container.className=`cw-container cw-position-${this.config.position}`,document.body.appendChild(this.container);return this._applyTheme(),this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} initialized`),this}_applyTheme(){this.container&&(this.container.classList.remove("cw-dark","cw-auto"),this.config.theme==="dark"?this.container.classList.add("cw-dark"):this.config.theme==="auto"&&this.container.classList.add("cw-auto"))}_render(t={}){this.container&&(0,je.render)(nt.html`<${fe}
713
+ `}var Le={backendUrl:"http://localhost:8000",agentKey:"default-agent",title:"Chat Assistant",subtitle:"How can we help you today?",primaryColor:"#0066cc",headerTextColor:null,position:"bottom-right",defaultJourneyType:"general",enableDebugMode:!0,enableAutoRun:!0,journeyTypes:{},customerPrompts:{},placeholder:"Type your message...",emptyStateTitle:"Start a Conversation",emptyStateMessage:"Send a message to get started.",authStrategy:null,authToken:null,authHeader:null,authTokenPrefix:null,anonymousSessionEndpoint:null,anonymousTokenKey:"chat_widget_anonymous_token",onAuthError:null,anonymousTokenHeader:"X-Anonymous-Token",conversationIdKey:"chat_widget_conversation_id",sessionTokenKey:"chat_widget_session_token",apiPaths:{anonymousSession:"/api/accounts/anonymous-session/",conversations:"/api/agent-runtime/conversations/",runs:"/api/agent-runtime/runs/",runEvents:"/api/agent-runtime/runs/{runId}/events/",simulateCustomer:"/api/agent-runtime/simulate-customer/",ttsVoices:"/api/tts/voices/",ttsSetVoice:"/api/tts/set-voice/",models:"/api/agent-runtime/models/",systems:"/api/agent-runtime/systems/",agents:"/api/agent-runtime/agents/"},apiCaseStyle:"auto",theme:"light",showHeader:!0,showFileAttachment:!0,showTasksTab:!0,showConversationSidebar:!0,showClearButton:!0,showDebugButton:!0,showTTSButton:!0,showVoiceSettings:!0,showExpandButton:!0,showModelSelector:!1,showDevTools:!1,enableVoice:!0,modelKey:"chat_widget_selected_model",autoRunDelay:1e3,autoRunMode:"automatic",enableTTS:!1,ttsProxyUrl:null,elevenLabsApiKey:null,ttsVoices:{assistant:null,user:null},ttsModel:"eleven_turbo_v2_5",ttsSettings:{stability:.5,similarity_boost:.75,style:0,use_speaker_boost:!0},availableVoices:[],onEvent:null,containerId:null,embedded:!1,metadata:{}};function Ke(e){let t={...Le.apiPaths,...e.apiPaths||{}};return{...Le,...e,apiPaths:t}}var je=require("preact/compat"),nt=require("htm/preact");var We=new Map,$t=0,O=null,Je=class{constructor(t={}){Ge(this,"_handleStateChange",t=>{this._state=t});this.instanceId=`cw-${++$t}`,this.config=Ke(t),this.container=null,this._state={},this._apiRef={current:null},We.set(this.instanceId,this)}init(){if(this.config.containerId){if(this.container=document.getElementById(this.config.containerId),!this.container)return console.error(`[ChatWidget] Container not found: ${this.config.containerId}`),this;this.container.classList.add("cw-container-embedded")}else this.container=document.createElement("div"),this.container.id=this.instanceId,this.container.className=`cw-container cw-position-${this.config.position}`,document.body.appendChild(this.container);return this._applyTheme(),this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} initialized`),this}_applyTheme(){this.container&&(this.container.classList.remove("cw-dark","cw-auto"),this.config.theme==="dark"?this.container.classList.add("cw-dark"):this.config.theme==="auto"&&this.container.classList.add("cw-auto"))}_render(t={}){this.container&&(0,je.render)(nt.html`<${fe}
711
714
  config=${{...this.config,...t}}
712
715
  onStateChange=${this._handleStateChange}
713
716
  markdownParser=${Ne._enhancedMarkdownParser}
package/dist/react.esm.js CHANGED
@@ -1,4 +1,4 @@
1
- var ft=Object.defineProperty;var $t=(e,t,s)=>t in e?ft(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var Qe=(e,t,s)=>($t(e,typeof t!="symbol"?t+"":t,s),s);import{html as G}from"htm/preact";import{useState as q,useEffect as $e,useCallback as le,useMemo as ze}from"preact/compat";import{html as ee}from"htm/preact";function et(e){return e.replace(/_([a-z])/g,(t,s)=>s.toUpperCase())}function ve(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}function ie(e){return Array.isArray(e)?e.map(ie):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[et(t),ie(s)])):e}function ce(e){return Array.isArray(e)?e.map(ce):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[ve(t),ce(s)])):e}function de(){return"msg-"+Date.now()+"-"+Math.random().toString(36).substr(2,9)}function H(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function Me(e){if(!e)return"";try{let t=new Date(e),n=new Date-t,l=Math.floor(n/6e4),r=Math.floor(n/36e5),$=Math.floor(n/864e5);return l<1?"Just now":l<60?`${l}m ago`:r<24?`${r}h ago`:$<7?`${$}d ago`:t.toLocaleDateString()}catch{return""}}function xe(e,t=null){if(t)return t(e);let s=H(e);return s=s.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),s=s.replace(/__(.+?)__/g,"<strong>$1</strong>"),s=s.replace(/\*(.+?)\*/g,"<em>$1</em>"),s=s.replace(/_(.+?)_/g,"<em>$1</em>"),s=s.replace(/`(.+?)`/g,"<code>$1</code>"),s=s.replace(/\[(.+?)\]\((.+?)\)/g,'<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>'),s=s.replace(/\n/g,"<br>"),s}function Ee(e=""){let t=s=>e?`${s}_${e}`:s;return{get(s){try{return localStorage.getItem(t(s))}catch{return null}},set(s,n){try{let l=t(s);n===null?localStorage.removeItem(l):localStorage.setItem(l,n)}catch{}}}}function Ie(e="csrftoken"){let t=document.cookie.split(";");for(let n of t){let[l,r]=n.trim().split("=");if(l===e)return decodeURIComponent(r)}let s=document.querySelector('meta[name="csrf-token"]');return s?s.getAttribute("content"):null}function ue(e){if(e===0)return"0 B";let t=1024,s=["B","KB","MB","GB"],n=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/Math.pow(t,n)).toFixed(1))+" "+s[n]}function pe(e){return e?e.startsWith("image/")?"\u{1F5BC}\uFE0F":e.startsWith("video/")?"\u{1F3AC}":e.startsWith("audio/")?"\u{1F3B5}":e.includes("pdf")?"\u{1F4D5}":e.includes("spreadsheet")||e.includes("excel")?"\u{1F4CA}":e.includes("document")||e.includes("word")?"\u{1F4DD}":e.includes("presentation")||e.includes("powerpoint")?"\u{1F4FD}\uFE0F":e.includes("zip")||e.includes("compressed")?"\u{1F5DC}\uFE0F":(e.includes("text/"),"\u{1F4C4}"):"\u{1F4C4}"}function yt(e){if(!e||typeof e!="string")return 0;let t=e.replace("#","");if(t.length!==6&&t.length!==3)return 0;let s=t.length===3?t.split("").map(i=>i+i).join(""):t,n=parseInt(s.substr(0,2),16)/255,l=parseInt(s.substr(2,2),16)/255,r=parseInt(s.substr(4,2),16)/255,$=i=>i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4);return .2126*$(n)+.7152*$(l)+.0722*$(r)}function tt(e){return yt(e)>.179?"#000000":"#ffffff"}function Ae({config:e,debugMode:t,isExpanded:s,isSpeaking:n,messagesCount:l,isLoading:r,currentAgent:$,onClose:i,onToggleExpand:f,onToggleDebug:y,onToggleTTS:u,onClear:k,onToggleSidebar:c}){let{title:C,primaryColor:a,embedded:g,showConversationSidebar:w,showClearButton:v,showDebugButton:T,enableDebugMode:m,showTTSButton:W,showExpandButton:U,enableTTS:I,elevenLabsApiKey:R,ttsProxyUrl:D}=e,P=R||D;return ee`
1
+ var ft=Object.defineProperty;var $t=(e,t,s)=>t in e?ft(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var Qe=(e,t,s)=>($t(e,typeof t!="symbol"?t+"":t,s),s);import{html as z}from"htm/preact";import{useState as q,useEffect as $e,useCallback as le,useMemo as ze}from"preact/compat";import{html as ee}from"htm/preact";function et(e){return e.replace(/_([a-z])/g,(t,s)=>s.toUpperCase())}function ve(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}function ie(e){return Array.isArray(e)?e.map(ie):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[et(t),ie(s)])):e}function ce(e){return Array.isArray(e)?e.map(ce):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[ve(t),ce(s)])):e}function de(){return"msg-"+Date.now()+"-"+Math.random().toString(36).substr(2,9)}function H(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function Me(e){if(!e)return"";try{let t=new Date(e),n=new Date-t,l=Math.floor(n/6e4),r=Math.floor(n/36e5),$=Math.floor(n/864e5);return l<1?"Just now":l<60?`${l}m ago`:r<24?`${r}h ago`:$<7?`${$}d ago`:t.toLocaleDateString()}catch{return""}}function xe(e,t=null){if(t)return t(e);let s=H(e);return s=s.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),s=s.replace(/__(.+?)__/g,"<strong>$1</strong>"),s=s.replace(/\*(.+?)\*/g,"<em>$1</em>"),s=s.replace(/_(.+?)_/g,"<em>$1</em>"),s=s.replace(/`(.+?)`/g,"<code>$1</code>"),s=s.replace(/\[(.+?)\]\((.+?)\)/g,'<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>'),s=s.replace(/\n/g,"<br>"),s}function Ee(e=""){let t=s=>e?`${s}_${e}`:s;return{get(s){try{return localStorage.getItem(t(s))}catch{return null}},set(s,n){try{let l=t(s);n===null?localStorage.removeItem(l):localStorage.setItem(l,n)}catch{}}}}function Ie(e="csrftoken"){let t=document.cookie.split(";");for(let n of t){let[l,r]=n.trim().split("=");if(l===e)return decodeURIComponent(r)}let s=document.querySelector('meta[name="csrf-token"]');return s?s.getAttribute("content"):null}function ue(e){if(e===0)return"0 B";let t=1024,s=["B","KB","MB","GB"],n=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/Math.pow(t,n)).toFixed(1))+" "+s[n]}function pe(e){return e?e.startsWith("image/")?"\u{1F5BC}\uFE0F":e.startsWith("video/")?"\u{1F3AC}":e.startsWith("audio/")?"\u{1F3B5}":e.includes("pdf")?"\u{1F4D5}":e.includes("spreadsheet")||e.includes("excel")?"\u{1F4CA}":e.includes("document")||e.includes("word")?"\u{1F4DD}":e.includes("presentation")||e.includes("powerpoint")?"\u{1F4FD}\uFE0F":e.includes("zip")||e.includes("compressed")?"\u{1F5DC}\uFE0F":(e.includes("text/"),"\u{1F4C4}"):"\u{1F4C4}"}function yt(e){if(!e||typeof e!="string")return 0;let t=e.replace("#","");if(t.length!==6&&t.length!==3)return 0;let s=t.length===3?t.split("").map(i=>i+i).join(""):t,n=parseInt(s.substr(0,2),16)/255,l=parseInt(s.substr(2,2),16)/255,r=parseInt(s.substr(4,2),16)/255,$=i=>i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4);return .2126*$(n)+.7152*$(l)+.0722*$(r)}function tt(e){return yt(e)>.179?"#000000":"#ffffff"}function Ae({config:e,debugMode:t,isExpanded:s,isSpeaking:n,messagesCount:l,isLoading:r,currentAgent:$,onClose:i,onToggleExpand:f,onToggleDebug:y,onToggleTTS:u,onClear:k,onToggleSidebar:c}){let{title:C,primaryColor:a,embedded:g,showConversationSidebar:w,showClearButton:v,showDebugButton:T,enableDebugMode:m,showTTSButton:W,showExpandButton:U,enableTTS:I,elevenLabsApiKey:R,ttsProxyUrl:F}=e,P=R||F;return ee`
2
2
  <div class="cw-header" style=${{backgroundColor:a}}>
3
3
  ${w&&ee`
4
4
  <button
@@ -128,7 +128,7 @@ var ft=Object.defineProperty;var $t=(e,t,s)=>t in e?ft(e,t,{enumerable:!0,config
128
128
  >Save & Send</button>
129
129
  </div>
130
130
  </div>
131
- `}function De({msg:e,debugMode:t,markdownParser:s,onEdit:n,onRetry:l,isLoading:r,messageIndex:$}){let[i,f]=ke(!1),[y,u]=ke(!1),[k,c]=ke(!1),C=e.role==="user",a=e.role==="system",g=e.type==="tool_call",w=e.type==="tool_result",v=e.type==="error",T=e.type==="sub_agent_start",m=e.type==="sub_agent_end",W=e.type==="agent_context";if(a&&!t)return null;if(T||m||W)return K`
131
+ `}function Fe({msg:e,debugMode:t,markdownParser:s,onEdit:n,onRetry:l,isLoading:r,messageIndex:$}){let[i,f]=ke(!1),[y,u]=ke(!1),[k,c]=ke(!1),C=e.role==="user",a=e.role==="system",g=e.type==="tool_call",w=e.type==="tool_result",v=e.type==="error",T=e.type==="sub_agent_start",m=e.type==="sub_agent_end",W=e.type==="agent_context";if(a&&!t)return null;if(T||m||W)return K`
132
132
  <div class="cw-agent-context ${T?"cw-agent-delegating":""} ${m?"cw-agent-returned":""}" style="position: relative;">
133
133
  <span class="cw-agent-context-icon">${T?"\u{1F517}":m?"\u2713":"\u{1F916}"}</span>
134
134
  <span class="cw-agent-context-text">${e.content}</span>
@@ -148,7 +148,7 @@ var ft=Object.defineProperty;var $t=(e,t,s)=>t in e?ft(e,t,{enumerable:!0,config
148
148
  `}
149
149
  ${t&&K`<${Re} msg=${e} show=${y} onToggle=${()=>u(!y)} />`}
150
150
  </div>
151
- `}let U=["cw-message",C&&"cw-message-user",v&&"cw-message-error"].filter(Boolean).join(" "),I=`cw-message-row ${C?"cw-message-row-user":""}`,R=e.role==="assistant"?xe(e.content,s):H(e.content),D=e.files&&e.files.length>0,P=()=>D?K`
151
+ `}let U=["cw-message",C&&"cw-message-user",v&&"cw-message-error"].filter(Boolean).join(" "),I=`cw-message-row ${C?"cw-message-row-user":""}`,R=e.role==="assistant"?xe(e.content,s):H(e.content),F=e.files&&e.files.length>0,P=()=>F?K`
152
152
  <div class="cw-message-attachments">
153
153
  ${e.files.map(b=>b.type&&b.type.startsWith("image/")?K`
154
154
  <a class="cw-attachment-thumbnail" href=${b.url} target="_blank" title=${b.name}>
@@ -201,7 +201,7 @@ var ft=Object.defineProperty;var $t=(e,t,s)=>t in e?ft(e,t,{enumerable:!0,config
201
201
  `}
202
202
  ${t&&K`<${Re} msg=${e} show=${y} onToggle=${()=>u(!y)} />`}
203
203
  </div>
204
- `}function Fe({messages:e,isLoading:t,hasMoreMessages:s,loadingMoreMessages:n,onLoadMore:l,onEditMessage:r,onRetryMessage:$,debugMode:i,markdownParser:f,emptyStateTitle:y,emptyStateMessage:u}){let k=nt(null),c=nt(!0),C=g=>{let w=g.target,v=w.scrollHeight-w.scrollTop-w.clientHeight<100;if(c.current=v,w.scrollTop<50&&s&&!n){let T=w.scrollHeight;l().then(()=>{let m=w.scrollHeight;w.scrollTop=m-T+w.scrollTop})}};at(()=>{let g=k.current;g&&c.current&&requestAnimationFrame(()=>{g.scrollTop=g.scrollHeight})},[e,t]),at(()=>{let g=k.current;g&&e.length<=2&&(c.current=!0,requestAnimationFrame(()=>{g.scrollTop=g.scrollHeight}))},[e.length]);let a=e.length===0;return se`
204
+ `}function De({messages:e,isLoading:t,hasMoreMessages:s,loadingMoreMessages:n,onLoadMore:l,onEditMessage:r,onRetryMessage:$,debugMode:i,markdownParser:f,emptyStateTitle:y,emptyStateMessage:u}){let k=nt(null),c=nt(!0),C=g=>{let w=g.target,v=w.scrollHeight-w.scrollTop-w.clientHeight<100;if(c.current=v,w.scrollTop<50&&s&&!n){let T=w.scrollHeight;l().then(()=>{let m=w.scrollHeight;w.scrollTop=m-T+w.scrollTop})}};at(()=>{let g=k.current;g&&c.current&&requestAnimationFrame(()=>{g.scrollTop=g.scrollHeight})},[e,t]),at(()=>{let g=k.current;g&&e.length<=2&&(c.current=!0,requestAnimationFrame(()=>{g.scrollTop=g.scrollHeight}))},[e.length]);let a=e.length===0;return se`
205
205
  <div class="cw-messages" ref=${k} onScroll=${C}>
206
206
  ${a&&se`
207
207
  <div class="cw-empty-state">
@@ -220,7 +220,7 @@ var ft=Object.defineProperty;var $t=(e,t,s)=>t in e?ft(e,t,{enumerable:!0,config
220
220
  `}
221
221
 
222
222
  ${e.map((g,w)=>se`
223
- <${De}
223
+ <${Fe}
224
224
  key=${g.id}
225
225
  msg=${g}
226
226
  messageIndex=${w}
@@ -241,7 +241,7 @@ var ft=Object.defineProperty;var $t=(e,t,s)=>t in e?ft(e,t,{enumerable:!0,config
241
241
  </div>
242
242
  `}
243
243
  </div>
244
- `}import{html as X}from"htm/preact";import{useState as he,useRef as be,useEffect as Oe}from"preact/compat";var Pe=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function Le({onSend:e,onCancel:t,isLoading:s,placeholder:n,primaryColor:l,enableVoice:r=!0,enableFiles:$=!0}){let[i,f]=he(""),[y,u]=he([]),[k,c]=he(!1),[C,a]=he(!1),[g]=he(()=>!!Pe),w=be(null),v=be(null),T=be(null),m=be(!1);Oe(()=>{!s&&w.current&&w.current.focus()},[s]),Oe(()=>{w.current&&(w.current.style.height="auto",w.current.style.height=Math.min(w.current.scrollHeight,150)+"px")},[i]),Oe(()=>()=>{m.current=!1,T.current&&T.current.abort()},[]);let W=d=>{d.preventDefault(),(i.trim()||y.length>0)&&!s&&(e(i,y),f(""),u([]),w.current&&(w.current.style.height="auto"),v.current&&(v.current.value=""))},U=d=>{let A=Array.from(d.target.files||[]);A.length>0&&u(O=>[...O,...A])},I=d=>{u(A=>A.filter((O,o)=>o!==d))},R=d=>{d.preventDefault(),v.current&&!s&&v.current.click()},D=d=>{d.key==="Enter"&&!d.shiftKey&&(d.preventDefault(),W(d))},P=d=>{s&&t&&(d.preventDefault(),t())},B=()=>{if(!Pe||s)return;m.current=!0;let d=new Pe;d.continuous=!0,d.interimResults=!0,d.lang=navigator.language||"en-US";let A=i,O="";d.onstart=()=>{a(!0)},d.onresult=o=>{O="";for(let E=o.resultIndex;E<o.results.length;E++){let L=o.results[E][0].transcript;o.results[E].isFinal?A+=(A?" ":"")+L:O+=L}f(A+(O?" "+O:""))},d.onerror=o=>{if(o.error==="no-speech"||o.error==="aborted"){console.log("[ChatWidget] Speech recognition:",o.error,"- continuing...");return}console.warn("[ChatWidget] Speech recognition error:",o.error),m.current=!1,a(!1),f(A||i)},d.onend=()=>{if(m.current){console.log("[ChatWidget] Recognition paused, restarting...");try{d.start();return}catch(o){console.warn("[ChatWidget] Could not restart recognition:",o)}}a(!1),A&&f(A),T.current=null},T.current=d,d.start()},N=()=>{m.current=!1,T.current&&T.current.stop()},h=d=>{d.preventDefault(),C?N():B()},M=X`
244
+ `}import{html as X}from"htm/preact";import{useState as he,useRef as be,useEffect as Oe}from"preact/compat";var Pe=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function Le({onSend:e,onCancel:t,isLoading:s,placeholder:n,primaryColor:l,enableVoice:r=!0,enableFiles:$=!0}){let[i,f]=he(""),[y,u]=he([]),[k,c]=he(!1),[C,a]=he(!1),[g]=he(()=>!!Pe),w=be(null),v=be(null),T=be(null),m=be(!1);Oe(()=>{!s&&w.current&&w.current.focus()},[s]),Oe(()=>{w.current&&(w.current.style.height="auto",w.current.style.height=Math.min(w.current.scrollHeight,150)+"px")},[i]),Oe(()=>()=>{m.current=!1,T.current&&T.current.abort()},[]);let W=d=>{d.preventDefault(),(i.trim()||y.length>0)&&!s&&(e(i,y),f(""),u([]),w.current&&(w.current.style.height="auto"),v.current&&(v.current.value=""))},U=d=>{let A=Array.from(d.target.files||[]);A.length>0&&u(O=>[...O,...A])},I=d=>{u(A=>A.filter((O,o)=>o!==d))},R=d=>{d.preventDefault(),v.current&&!s&&v.current.click()},F=d=>{d.key==="Enter"&&!d.shiftKey&&(d.preventDefault(),W(d))},P=d=>{s&&t&&(d.preventDefault(),t())},B=()=>{if(!Pe||s)return;m.current=!0;let d=new Pe;d.continuous=!0,d.interimResults=!0,d.lang=navigator.language||"en-US";let A=i,O="";d.onstart=()=>{a(!0)},d.onresult=o=>{O="";for(let E=o.resultIndex;E<o.results.length;E++){let L=o.results[E][0].transcript;o.results[E].isFinal?A+=(A?" ":"")+L:O+=L}f(A+(O?" "+O:""))},d.onerror=o=>{if(o.error==="no-speech"||o.error==="aborted"){console.log("[ChatWidget] Speech recognition:",o.error,"- continuing...");return}console.warn("[ChatWidget] Speech recognition error:",o.error),m.current=!1,a(!1),f(A||i)},d.onend=()=>{if(m.current){console.log("[ChatWidget] Recognition paused, restarting...");try{d.start();return}catch(o){console.warn("[ChatWidget] Could not restart recognition:",o)}}a(!1),A&&f(A),T.current=null},T.current=d,d.start()},N=()=>{m.current=!1,T.current&&T.current.stop()},h=d=>{d.preventDefault(),C?N():B()},M=X`
245
245
  <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor">
246
246
  <rect x="2" y="2" width="10" height="10" rx="1" />
247
247
  </svg>
@@ -288,7 +288,7 @@ var ft=Object.defineProperty;var $t=(e,t,s)=>t in e?ft(e,t,{enumerable:!0,config
288
288
  placeholder=${H(n)}
289
289
  value=${i}
290
290
  onInput=${d=>f(d.target.value)}
291
- onKeyDown=${D}
291
+ onKeyDown=${F}
292
292
  disabled=${s}
293
293
  rows="1"
294
294
  />
@@ -583,7 +583,7 @@ var ft=Object.defineProperty;var $t=(e,t,s)=>t in e?ft(e,t,{enumerable:!0,config
583
583
  </div>
584
584
  </div>
585
585
  </div>
586
- `}import{useState as ne,useCallback as te,useRef as lt,useEffect as it}from"preact/compat";function He(e,t,s){let[n,l]=ne([]),[r,$]=ne(!1),[i,f]=ne(null),[y,u]=ne(()=>s?.get(e.conversationIdKey)||null),[k,c]=ne(!1),[C,a]=ne(!1),[g,w]=ne(0),v=lt(null),T=lt(null);it(()=>{y&&s?.set(e.conversationIdKey,y)},[y,e.conversationIdKey,s]);let m=te(async(h,M,p)=>{v.current&&v.current.close();let S=e.apiPaths.runEvents.replace("{runId}",h),b=`${e.backendUrl}${S}`;M&&(b+=`?anonymous_token=${encodeURIComponent(M)}`);let x=new EventSource(b);v.current=x;let d="";x.addEventListener("assistant.message",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("assistant.message",o.payload);let E=o.payload.content;E&&(d+=E,l(L=>{let j=L[L.length-1];return j?.role==="assistant"&&j.id.startsWith("assistant-stream-")?[...L.slice(0,-1),{...j,content:d}]:[...L,{id:"assistant-stream-"+Date.now(),role:"assistant",content:d,timestamp:new Date,type:"message"}]}))}catch(o){console.error("[ChatWidget] Parse error:",o)}}),x.addEventListener("tool.call",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("tool.call",o.payload),l(E=>[...E,{id:"tool-call-"+Date.now(),role:"assistant",content:`\u{1F527} ${o.payload.name}`,timestamp:new Date,type:"tool_call",metadata:{toolName:o.payload.name,arguments:o.payload.arguments,toolCallId:o.payload.id}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),x.addEventListener("tool.result",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("tool.result",o.payload);let E=o.payload.result,L=E?.error;l(j=>[...j,{id:"tool-result-"+Date.now(),role:"system",content:L?`\u274C ${E.error}`:"\u2713 Done",timestamp:new Date,type:"tool_result",metadata:{toolName:o.payload.name,result:E,toolCallId:o.payload.tool_call_id}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),x.addEventListener("custom",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("custom",o.payload),o.payload?.type==="ui_control"&&e.onUIControl&&e.onUIControl(o.payload),o.payload?.type==="agent_context"&&l(E=>[...E,{id:"agent-context-"+Date.now(),role:"system",content:`\u{1F517} ${o.payload.agent_name||"Sub-agent"} is now handling this request`,timestamp:new Date,type:"agent_context",metadata:{agentKey:o.payload.agent_key,agentName:o.payload.agent_name,action:o.payload.action}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),x.addEventListener("sub_agent.start",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("sub_agent.start",o.payload),l(E=>[...E,{id:"sub-agent-start-"+Date.now(),role:"system",content:`\u{1F517} Delegating to ${o.payload.agent_name||o.payload.sub_agent_key||"sub-agent"}...`,timestamp:new Date,type:"sub_agent_start",metadata:{subAgentKey:o.payload.sub_agent_key,agentName:o.payload.agent_name,invocationMode:o.payload.invocation_mode}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),x.addEventListener("sub_agent.end",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("sub_agent.end",o.payload),l(E=>[...E,{id:"sub-agent-end-"+Date.now(),role:"system",content:`\u2713 ${o.payload.agent_name||"Sub-agent"} completed`,timestamp:new Date,type:"sub_agent_end",metadata:{subAgentKey:o.payload.sub_agent_key,agentName:o.payload.agent_name}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}});let A=O=>{try{let o=JSON.parse(O.data);if(e.onEvent&&e.onEvent(o.type,o.payload),o.type==="run.failed"){let E=o.payload.error||"Agent run failed";f(E),l(L=>[...L,{id:"error-"+Date.now(),role:"system",content:`\u274C Error: ${E}`,timestamp:new Date,type:"error"}])}}catch(o){console.error("[ChatWidget] Parse error:",o)}$(!1),x.close(),v.current=null,d&&p&&p(d)};x.addEventListener("run.succeeded",A),x.addEventListener("run.failed",A),x.addEventListener("run.cancelled",A),x.addEventListener("run.timed_out",A),x.onerror=()=>{$(!1),x.close(),v.current=null}},[e]),W=te(async(h,M={},p={})=>{if(!h.trim()||r)return;let S=[],b={};typeof M=="function"?b={onAssistantMessage:M}:Array.isArray(M)?(S=M,b=p):b=M||{};let{model:x,thinking:d,onAssistantMessage:A,supersedeFromMessageIndex:O}=b;$(!0),f(null);let o={id:de(),role:"user",content:h.trim(),timestamp:new Date,type:"message",files:S.length>0?S.map(E=>({name:E.name,size:E.size,type:E.type})):void 0};l(E=>[...E,o]);try{let E=await t.getOrCreateSession(),L;if(S.length>0){let V=e.apiCaseStyle!=="camel",Ze=we=>V?ve(we):we,Q=new FormData;Q.append(Ze("agentKey"),e.agentKey),y&&Q.append(Ze("conversationId"),y),Q.append("messages",JSON.stringify([{role:"user",content:h.trim()}])),Q.append("metadata",JSON.stringify(V?{...e.metadata,journey_type:e.defaultJourneyType}:{...e.metadata,journeyType:e.defaultJourneyType})),x&&Q.append("model",x),d&&Q.append("thinking","true"),S.forEach(we=>{Q.append("files",we)}),L=t.getFetchOptions({method:"POST",body:Q},E)}else{let V=t.transformRequest({agentKey:e.agentKey,conversationId:y,messages:[{role:"user",content:h.trim()}],metadata:{...e.metadata,journeyType:e.defaultJourneyType},...x&&{model:x},...d&&{thinking:!0},...O!==void 0&&{supersedeFromMessageIndex:O}});L=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(V)},E)}let j=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,L),_=E;if(j.status===401){t.clearSession();let V=await t.getOrCreateSession(!0);V&&(_=V,S.length>0?L=t.getFetchOptions({method:"POST",body:L.body},V):L=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:L.body},V),j=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,L))}if(!j.ok){let V=await j.json().catch(()=>({}));throw new Error(V.error||V.detail||`HTTP ${j.status}`)}let z=await j.json(),Y=t.transformResponse(z);T.current=Y.id,!y&&Y.conversationId&&u(Y.conversationId),await m(Y.id,_,A)}catch(E){f(E.message||"Failed to send message"),$(!1)}finally{T.current=null}},[e,t,y,r,m]),U=te(async()=>{let h=T.current;if(!(!h||!r))try{let M=e.apiPaths.cancelRun?e.apiPaths.cancelRun.replace("{runId}",h):`${e.apiPaths.runs}${h}/cancel/`;(await fetch(`${e.backendUrl}${M}`,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"}}))).ok&&(v.current&&(v.current.close(),v.current=null),$(!1),T.current=null,l(S=>[...S,{id:"cancelled-"+Date.now(),role:"system",content:"\u23F9 Run cancelled",timestamp:new Date,type:"cancelled"}]))}catch(M){console.error("[ChatWidget] Failed to cancel run:",M)}},[e,t,r]),I=te(()=>{l([]),u(null),f(null),c(!1),w(0),s?.set(e.conversationIdKey,null)},[e.conversationIdKey,s]),R=h=>{let M={id:de(),role:h.role,timestamp:h.timestamp?new Date(h.timestamp):new Date};if(h.role==="tool")return{...M,role:"system",content:"\u2713 Done",type:"tool_result",metadata:{result:h.content,toolCallId:h.toolCallId}};if(h.role==="assistant"&&h.toolCalls&&h.toolCalls.length>0)return h.toolCalls.map(S=>({id:de(),role:"assistant",content:`\u{1F527} ${S.function?.name||S.name||"tool"}`,timestamp:M.timestamp,type:"tool_call",metadata:{toolName:S.function?.name||S.name,arguments:S.function?.arguments||S.arguments,toolCallId:S.id}}));let p=typeof h.content=="string"?h.content:JSON.stringify(h.content);return h.role==="assistant"&&!p?.trim()?null:{...M,content:p,type:"message"}},D=te(async h=>{console.log("[ChatWidget] loadConversation called with:",h),$(!0),l([]),u(h);try{let M=await t.getOrCreateSession(),S=`${e.backendUrl}${e.apiPaths.conversations}${h}/?limit=10&offset=0`;console.log("[ChatWidget] Fetching conversation from:",S);let b=await fetch(S,t.getFetchOptions({method:"GET"},M));if(console.log("[ChatWidget] Response status:",b.status),b.ok){let x=await b.json();console.log("[ChatWidget] Raw conversation:",x);let d=t.transformResponse(x);if(console.log("[ChatWidget] Transformed conversation:",d),d.messages){let A=d.messages.flatMap(R).filter(Boolean);console.log("[ChatWidget] Mapped messages:",A),l(A)}c(d.hasMore||!1),w(d.messages?.length||0)}else b.status===404?(console.log("[ChatWidget] Conversation not found, clearing"),u(null),s?.set(e.conversationIdKey,null)):console.error("[ChatWidget] Unexpected response status:",b.status)}catch(M){console.error("[ChatWidget] Failed to load conversation:",M)}finally{$(!1)}},[e,t,s]),P=te(async()=>{if(!(!y||C||!k)){a(!0);try{let h=await t.getOrCreateSession(),p=`${e.backendUrl}${e.apiPaths.conversations}${y}/?limit=10&offset=${g}`,S=await fetch(p,t.getFetchOptions({method:"GET"},h));if(S.ok){let b=await S.json(),x=t.transformResponse(b);if(x.messages?.length>0){let d=x.messages.flatMap(R).filter(Boolean);l(A=>[...d,...A]),w(A=>A+x.messages.length),c(x.hasMore||!1)}else c(!1)}}catch(h){console.error("[ChatWidget] Failed to load more messages:",h)}finally{a(!1)}}},[e,t,y,g,C,k]),B=te(async(h,M,p={})=>{if(r)return;let S=n[h];if(!S||S.role!=="user")return;let b=n.slice(0,h);l(b),await W(M,{...p,supersedeFromMessageIndex:h})},[n,r,W]),N=te(async(h,M={})=>{if(r)return;let p=n[h];if(!p)return;let S=h,b=p;if(p.role==="assistant"){for(let d=h-1;d>=0;d--)if(n[d].role==="user"){S=d,b=n[d];break}if(b.role!=="user")return}else if(p.role!=="user")return;let x=n.slice(0,S);l(x),await W(b.content,{...M,supersedeFromMessageIndex:S})},[n,r,W]);return it(()=>()=>{v.current&&v.current.close()},[]),{messages:n,isLoading:r,error:i,conversationId:y,hasMoreMessages:k,loadingMoreMessages:C,sendMessage:W,cancelRun:U,clearMessages:I,loadConversation:D,loadMoreMessages:P,setConversationId:u,editMessage:B,retryMessage:N}}import{useState as ge,useEffect as _t,useCallback as Se}from"preact/compat";var ct="cw_thinking_enabled";function Ve(e,t,s){let[n,l]=ge([]),[r,$]=ge(null),[i,f]=ge(null),[y,u]=ge(!1),[k,c]=ge(!1);_t(()=>{(async()=>{if(e.showModelSelector){u(!0);try{let T=await fetch(`${e.backendUrl}${e.apiPaths.models}`,t.getFetchOptions({method:"GET"}));if(T.ok){let m=await T.json(),W=m.models||[];l(W),f(m.default);let U=s?.get(e.modelKey);U&&W.some(R=>R.id===U)?$(U):$(m.default),s?.get(ct)==="true"&&c(!0)}}catch(T){console.warn("[ChatWidget] Failed to load models:",T)}finally{u(!1)}}})()},[e.backendUrl,e.apiPaths.models,e.showModelSelector,e.modelKey,t,s]);let C=Se(v=>{$(v),s?.set(e.modelKey,v)},[e.modelKey,s]),a=Se(v=>{c(v),s?.set(ct,v?"true":"false")},[s]),g=Se(()=>n.find(v=>v.id===r)||null,[n,r]),w=Se(()=>g()?.supports_thinking||!1,[g]);return{availableModels:n,selectedModel:r,defaultModel:i,isLoading:y,selectModel:C,getSelectedModelInfo:g,thinkingEnabled:k,toggleThinking:a,supportsThinking:w}}import{useState as Ue,useCallback as re}from"preact/compat";function Be(e,t){let[s,n]=Ue(null),[l,r]=Ue(!1),[$,i]=Ue(null),f=e.apiPaths?.tasks||"/api/agent/tasks/",y=re(async()=>{r(!0),i(null);try{let g=`${e.backendUrl}${f}`,w=await fetch(g,t.getFetchOptions({method:"GET"}));if(w.ok){let v=await w.json();n(v)}else{let v=await w.json().catch(()=>({}));i(v.error||"Failed to load tasks")}}catch(g){console.error("[useTasks] Failed to load task list:",g),i("Failed to load tasks")}finally{r(!1)}},[e.backendUrl,f,t]),u=re(async g=>{if(!s)return null;try{let w=`${e.backendUrl}${f}${s.id}/add_task/`,v=await fetch(w,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)}));if(v.ok){let T=await v.json();return await y(),T}else{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to add task"),null}}catch(w){return console.error("[useTasks] Failed to add task:",w),i("Failed to add task"),null}},[e.backendUrl,f,s,t,y]),k=re(async(g,w)=>{if(!s)return null;try{let v=`${e.backendUrl}${f}${s.id}/update_task/${g}/`,T=await fetch(v,t.getFetchOptions({method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(w)}));if(T.ok){let m=await T.json();return await y(),m}else{let m=await T.json().catch(()=>({}));return i(m.error||"Failed to update task"),null}}catch(v){return console.error("[useTasks] Failed to update task:",v),i("Failed to update task"),null}},[e.backendUrl,f,s,t,y]),c=re(async g=>{if(!s)return!1;try{let w=`${e.backendUrl}${f}${s.id}/remove_task/${g}/`,v=await fetch(w,t.getFetchOptions({method:"DELETE"}));if(v.ok)return await y(),!0;{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to remove task"),!1}}catch(w){return console.error("[useTasks] Failed to remove task:",w),i("Failed to remove task"),!1}},[e.backendUrl,f,s,t,y]),C=re(async()=>{if(!s)return!1;try{let g=`${e.backendUrl}${f}${s.id}/clear/`,w=await fetch(g,t.getFetchOptions({method:"POST"}));if(w.ok)return await y(),!0;{let v=await w.json().catch(()=>({}));return i(v.error||"Failed to clear tasks"),!1}}catch(g){return console.error("[useTasks] Failed to clear tasks:",g),i("Failed to clear tasks"),!1}},[e.backendUrl,f,s,t,y]),a=re(()=>i(null),[]);return{taskList:s,tasks:s?.tasks||[],progress:s?.progress||{total:0,completed:0,percent_complete:0},isLoading:l,error:$,loadTaskList:y,addTask:u,updateTask:k,removeTask:c,clearTasks:C,clearError:a}}import{useState as ae,useEffect as dt,useCallback as fe}from"preact/compat";var ut="cw_selected_system",je="cw_selected_agent",pt="cw_selected_system_version",Te="cw_selected_agent_version";function ht(e,t,s){let[n,l]=ae([]),[r,$]=ae([]),[i,f]=ae(null),[y,u]=ae(null),[k,c]=ae(null),[C,a]=ae(null),[g,w]=ae(!1),v=fe(()=>{if(y)return y;if(i){let I=n.find(R=>R.slug===i);if(I?.entry_agent)return I.entry_agent.slug}return e.agentKey},[y,i,n,e.agentKey]);dt(()=>{if(!e.showDevTools)return;(async()=>{w(!0);try{let R=await fetch(`${e.backendUrl}${e.apiPaths.systems}`,t.getFetchOptions({method:"GET"}));if(R.ok){let D=await R.json(),P=D.results||D;l(P);let B=s?.get(ut);B&&P.some(N=>N.slug===B)?f(B):P.length===1&&f(P[0].slug)}}catch(R){console.warn("[ChatWidget] Failed to load systems:",R)}finally{w(!1)}})()},[e.backendUrl,e.apiPaths.systems,e.showDevTools,t,s]),dt(()=>{if(!e.showDevTools)return;(async()=>{try{let R=i?`?system=${encodeURIComponent(i)}`:"",D=await fetch(`${e.backendUrl}${e.apiPaths.agents}${R}`,t.getFetchOptions({method:"GET"}));if(D.ok){let P=await D.json(),B=P.results||P;$(B);let N=s?.get(je);if(N&&B.some(M=>M.slug===N))u(N);else if(i){let M=n.find(p=>p.slug===i);M?.entry_agent&&u(M.entry_agent.slug)}let h=s?.get(Te);h&&a(h)}}catch(R){console.warn("[ChatWidget] Failed to load agents:",R)}})()},[e.backendUrl,e.apiPaths.agents,e.showDevTools,i,t,s,n]);let T=fe(I=>{f(I),s?.set(ut,I),u(null),a(null),s?.set(je,null),s?.set(Te,null);let D=n.find(P=>P.slug===I)?.active_version||null;c(D),s?.set(pt,D)},[s,n]),m=fe(I=>{u(I),s?.set(je,I);let D=r.find(P=>P.slug===I)?.active_version||null;a(D),s?.set(Te,D)},[s,r]),W=fe(I=>{c(I),s?.set(pt,I)},[s]),U=fe(I=>{a(I),s?.set(Te,I)},[s]);return{systems:n,agents:r,selectedSystem:i,selectedAgent:y,selectedSystemVersion:k,selectedAgentVersion:C,isLoading:g,selectSystem:T,selectAgent:m,selectSystemVersion:W,selectAgentVersion:U,getEffectiveAgentKey:v}}function Je(e,t,s){let n=u=>!u||typeof u!="object"||e.apiCaseStyle==="camel"?u:ce(u),l=u=>!u||typeof u!="object"||e.apiCaseStyle==="snake"?u:ie(u),r=()=>e.authStrategy?e.authStrategy:e.authToken?"token":e.apiPaths.anonymousSession||e.anonymousSessionEndpoint?"anonymous":"none",$=(u=null)=>{let k=r(),c={},C=u||e.authToken||t().authToken;if(k==="token"&&C){let a=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Token";c[a]=g?`${g} ${C}`:C}else if(k==="jwt"&&C){let a=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Bearer";c[a]=g?`${g} ${C}`:C}else if(k==="anonymous"&&C){let a=e.authHeader||e.anonymousTokenHeader||"X-Anonymous-Token";c[a]=C}if(k==="session"){let a=Ie(e.csrfCookieName);a&&(c["X-CSRFToken"]=a)}return c};return{getAuthStrategy:r,getAuthHeaders:$,getFetchOptions:(u={},k=null)=>{let c=r(),C={...u},a=$(k);return console.log("[ChatWidget] getFetchOptions - strategy:",c,"overrideToken:",k,"authHeaders:",a),C.headers={...C.headers,...a},c==="session"&&(C.credentials="include"),C},getOrCreateSession:async(u=!1)=>{let k=r(),c=t(),C=e.anonymousTokenKey||e.sessionTokenKey;if(k!=="anonymous")return e.authToken||c.authToken;if(!u){if(c.authToken)return c.authToken;let a=c.storage?.get(C);if(a)return s(g=>({...g,authToken:a})),a}try{let a=e.anonymousSessionEndpoint||e.apiPaths.anonymousSession,g=await fetch(`${e.backendUrl}${a}`,{method:"POST",headers:{"Content-Type":"application/json"}});if(g.ok){let w=await g.json();return s(v=>({...v,authToken:w.token})),c.storage?.set(C,w.token),w.token}}catch(a){console.warn("[ChatWidget] Failed to create session:",a)}return null},clearSession:()=>{let u=e.anonymousTokenKey||e.sessionTokenKey,k=t();s(c=>({...c,authToken:null})),k.storage?.set(u,null)},transformRequest:n,transformResponse:l}}function ye({config:e,onStateChange:t,markdownParser:s,apiRef:n}){console.log("[ChatWidget] Config:",{showConversationSidebar:e.showConversationSidebar,apiPaths:e.apiPaths});let[l,r]=q(e.embedded||e.forceOpen===!0),[$,i]=q(!1),[f,y]=q(!1),[u,k]=q(!1),[c,C]=q([]),[a,g]=q("chat"),[w,v]=q(!1),[T,m]=q(e.enableTTS),[W,U]=q(!1),[I,R]=q(null);$e(()=>{e.forceOpen!==void 0&&r(e.forceOpen)},[e.forceOpen]);let D=ze(()=>Ee(e.containerId),[e.containerId]),[P,B]=q(e.authToken||null),N=ze(()=>Je(e,()=>({authToken:P,storage:D}),Y=>{let V=Y({authToken:P,storage:D});V.authToken!==P&&B(V.authToken)}),[e,P,D]),h=ht(e,N,D),M=ze(()=>{if(!e.showDevTools)return e;let _=h.getEffectiveAgentKey();return _&&_!==e.agentKey?{...e,agentKey:_}:e},[e,h.getEffectiveAgentKey]),p=He(M,N,D),S=Ve(e,N,D),b=Be(e,N);$e(()=>{for(let _=p.messages.length-1;_>=0;_--){let z=p.messages[_];if(z.type==="sub_agent_start"){R({key:z.metadata?.subAgentKey,name:z.metadata?.agentName});return}if(z.type==="sub_agent_end"){R(null);return}}},[p.messages]),$e(()=>{let _=D.get(e.conversationIdKey);console.log("[ChatWidget] Initial load - storedConvId:",_,"key:",e.conversationIdKey),console.log("[ChatWidget] apiPaths.conversations:",e.apiPaths.conversations),_&&(console.log("[ChatWidget] Loading conversation:",_),p.loadConversation(_))},[]),$e(()=>{t&&t({isOpen:l,isExpanded:$,debugMode:f,messages:p.messages,conversationId:p.conversationId,isLoading:p.isLoading,error:p.error})},[l,$,f,p.messages,p.conversationId,p.isLoading,p.error]);let x=le(async()=>{if(e.showConversationSidebar){v(!0);try{let _=M.agentKey,z=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(_)}`,Y=await fetch(z,N.getFetchOptions({method:"GET"}));if(Y.ok){let V=await Y.json();C(V.results||V)}}catch(_){console.error("[ChatWidget] Failed to load conversations:",_),C([])}finally{v(!1)}}},[e,M,N]),d=le(()=>{let _=!u;k(_),_&&x()},[u,x]),A=le(_=>{_!==p.conversationId&&p.loadConversation(_),k(!1)},[p]),O=le(()=>{p.clearMessages(),k(!1)},[p]),o=le(_=>{p.sendMessage(_,{model:S.selectedModel,thinking:S.thinkingEnabled&&S.supportsThinking(),onAssistantMessage:z=>{}})},[p,T,S.selectedModel,S.thinkingEnabled,S.supportsThinking]),E=le(_=>{g(_),_==="tasks"&&b.loadTaskList()},[b]);if($e(()=>{n&&(n.current={open:()=>r(!0),close:()=>r(!1),send:_=>o(_),clearMessages:()=>p.clearMessages(),toggleTTS:()=>m(_=>!_),stopSpeech:()=>U(!1),setAuth:_=>{_.token!==void 0&&B(_.token)},clearAuth:()=>B(null)})},[p,n,o]),!e.embedded&&!l)return G`
586
+ `}import{useState as ne,useCallback as te,useRef as lt,useEffect as it}from"preact/compat";function He(e,t,s){let[n,l]=ne([]),[r,$]=ne(!1),[i,f]=ne(null),[y,u]=ne(()=>s?.get(e.conversationIdKey)||null),[k,c]=ne(!1),[C,a]=ne(!1),[g,w]=ne(0),v=lt(null),T=lt(null);it(()=>{y&&s?.set(e.conversationIdKey,y)},[y,e.conversationIdKey,s]);let m=te(async(h,M,p)=>{v.current&&v.current.close();let S=e.apiPaths.runEvents.replace("{runId}",h),b=`${e.backendUrl}${S}`;M&&(b+=`?anonymous_token=${encodeURIComponent(M)}`);let x=new EventSource(b);v.current=x;let d="";x.addEventListener("assistant.message",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("assistant.message",o.payload);let E=o.payload.content;E&&(d+=E,l(L=>{let j=L[L.length-1];return j?.role==="assistant"&&j.id.startsWith("assistant-stream-")?[...L.slice(0,-1),{...j,content:d}]:[...L,{id:"assistant-stream-"+Date.now(),role:"assistant",content:d,timestamp:new Date,type:"message"}]}))}catch(o){console.error("[ChatWidget] Parse error:",o)}}),x.addEventListener("tool.call",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("tool.call",o.payload),l(E=>[...E,{id:"tool-call-"+Date.now(),role:"assistant",content:`\u{1F527} ${o.payload.name}`,timestamp:new Date,type:"tool_call",metadata:{toolName:o.payload.name,arguments:o.payload.arguments,toolCallId:o.payload.id}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),x.addEventListener("tool.result",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("tool.result",o.payload);let E=o.payload.result,L=E?.error;l(j=>[...j,{id:"tool-result-"+Date.now(),role:"system",content:L?`\u274C ${E.error}`:"\u2713 Done",timestamp:new Date,type:"tool_result",metadata:{toolName:o.payload.name,result:E,toolCallId:o.payload.tool_call_id}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),x.addEventListener("custom",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("custom",o.payload),o.payload?.type==="ui_control"&&e.onUIControl&&e.onUIControl(o.payload),o.payload?.type==="agent_context"&&l(E=>[...E,{id:"agent-context-"+Date.now(),role:"system",content:`\u{1F517} ${o.payload.agent_name||"Sub-agent"} is now handling this request`,timestamp:new Date,type:"agent_context",metadata:{agentKey:o.payload.agent_key,agentName:o.payload.agent_name,action:o.payload.action}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),x.addEventListener("sub_agent.start",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("sub_agent.start",o.payload),l(E=>[...E,{id:"sub-agent-start-"+Date.now(),role:"system",content:`\u{1F517} Delegating to ${o.payload.agent_name||o.payload.sub_agent_key||"sub-agent"}...`,timestamp:new Date,type:"sub_agent_start",metadata:{subAgentKey:o.payload.sub_agent_key,agentName:o.payload.agent_name,invocationMode:o.payload.invocation_mode}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),x.addEventListener("sub_agent.end",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("sub_agent.end",o.payload),l(E=>[...E,{id:"sub-agent-end-"+Date.now(),role:"system",content:`\u2713 ${o.payload.agent_name||"Sub-agent"} completed`,timestamp:new Date,type:"sub_agent_end",metadata:{subAgentKey:o.payload.sub_agent_key,agentName:o.payload.agent_name}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}});let A=O=>{try{let o=JSON.parse(O.data);if(e.onEvent&&e.onEvent(o.type,o.payload),o.type==="run.failed"){let E=o.payload.error||"Agent run failed";f(E),l(L=>[...L,{id:"error-"+Date.now(),role:"system",content:`\u274C Error: ${E}`,timestamp:new Date,type:"error"}])}}catch(o){console.error("[ChatWidget] Parse error:",o)}$(!1),x.close(),v.current=null,d&&p&&p(d)};x.addEventListener("run.succeeded",A),x.addEventListener("run.failed",A),x.addEventListener("run.cancelled",A),x.addEventListener("run.timed_out",A),x.onerror=()=>{$(!1),x.close(),v.current=null}},[e]),W=te(async(h,M={},p={})=>{if(!h.trim()||r)return;let S=[],b={};typeof M=="function"?b={onAssistantMessage:M}:Array.isArray(M)?(S=M,b=p):b=M||{};let{model:x,thinking:d,onAssistantMessage:A,supersedeFromMessageIndex:O}=b;$(!0),f(null);let o={id:de(),role:"user",content:h.trim(),timestamp:new Date,type:"message",files:S.length>0?S.map(E=>({name:E.name,size:E.size,type:E.type})):void 0};l(E=>[...E,o]);try{let E=await t.getOrCreateSession(),L;if(S.length>0){let V=e.apiCaseStyle!=="camel",Ze=we=>V?ve(we):we,Q=new FormData;Q.append(Ze("agentKey"),e.agentKey),y&&Q.append(Ze("conversationId"),y),Q.append("messages",JSON.stringify([{role:"user",content:h.trim()}])),Q.append("metadata",JSON.stringify(V?{...e.metadata,journey_type:e.defaultJourneyType}:{...e.metadata,journeyType:e.defaultJourneyType})),x&&Q.append("model",x),d&&Q.append("thinking","true"),S.forEach(we=>{Q.append("files",we)}),L=t.getFetchOptions({method:"POST",body:Q},E)}else{let V=t.transformRequest({agentKey:e.agentKey,conversationId:y,messages:[{role:"user",content:h.trim()}],metadata:{...e.metadata,journeyType:e.defaultJourneyType},...x&&{model:x},...d&&{thinking:!0},...O!==void 0&&{supersedeFromMessageIndex:O}});L=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(V)},E)}let j=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,L),_=E;if(j.status===401){t.clearSession();let V=await t.getOrCreateSession(!0);V&&(_=V,S.length>0?L=t.getFetchOptions({method:"POST",body:L.body},V):L=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:L.body},V),j=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,L))}if(!j.ok){let V=await j.json().catch(()=>({}));throw new Error(V.error||V.detail||`HTTP ${j.status}`)}let G=await j.json(),Y=t.transformResponse(G);T.current=Y.id,!y&&Y.conversationId&&u(Y.conversationId),await m(Y.id,_,A)}catch(E){f(E.message||"Failed to send message"),$(!1)}finally{T.current=null}},[e,t,y,r,m]),U=te(async()=>{let h=T.current;if(!(!h||!r))try{let M=e.apiPaths.cancelRun?e.apiPaths.cancelRun.replace("{runId}",h):`${e.apiPaths.runs}${h}/cancel/`;(await fetch(`${e.backendUrl}${M}`,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"}}))).ok&&(v.current&&(v.current.close(),v.current=null),$(!1),T.current=null,l(S=>[...S,{id:"cancelled-"+Date.now(),role:"system",content:"\u23F9 Run cancelled",timestamp:new Date,type:"cancelled"}]))}catch(M){console.error("[ChatWidget] Failed to cancel run:",M)}},[e,t,r]),I=te(()=>{l([]),u(null),f(null),c(!1),w(0),s?.set(e.conversationIdKey,null)},[e.conversationIdKey,s]),R=h=>{let M={id:de(),role:h.role,timestamp:h.timestamp?new Date(h.timestamp):new Date};if(h.role==="tool")return{...M,role:"system",content:"\u2713 Done",type:"tool_result",metadata:{result:h.content,toolCallId:h.toolCallId}};if(h.role==="assistant"&&h.toolCalls&&h.toolCalls.length>0)return h.toolCalls.map(S=>({id:de(),role:"assistant",content:`\u{1F527} ${S.function?.name||S.name||"tool"}`,timestamp:M.timestamp,type:"tool_call",metadata:{toolName:S.function?.name||S.name,arguments:S.function?.arguments||S.arguments,toolCallId:S.id}}));let p=typeof h.content=="string"?h.content:JSON.stringify(h.content);return h.role==="assistant"&&!p?.trim()?null:{...M,content:p,type:"message"}},F=te(async h=>{console.log("[ChatWidget] loadConversation called with:",h),$(!0),l([]),u(h);try{let M=await t.getOrCreateSession(),S=`${e.backendUrl}${e.apiPaths.conversations}${h}/?limit=10&offset=0`;console.log("[ChatWidget] Fetching conversation from:",S);let b=await fetch(S,t.getFetchOptions({method:"GET"},M));if(console.log("[ChatWidget] Response status:",b.status),b.ok){let x=await b.json();console.log("[ChatWidget] Raw conversation:",x);let d=t.transformResponse(x);if(console.log("[ChatWidget] Transformed conversation:",d),d.messages){let A=d.messages.flatMap(R).filter(Boolean);console.log("[ChatWidget] Mapped messages:",A),l(A)}c(d.hasMore||!1),w(d.messages?.length||0)}else b.status===404?(console.log("[ChatWidget] Conversation not found, clearing"),u(null),s?.set(e.conversationIdKey,null)):console.error("[ChatWidget] Unexpected response status:",b.status)}catch(M){console.error("[ChatWidget] Failed to load conversation:",M)}finally{$(!1)}},[e,t,s]),P=te(async()=>{if(!(!y||C||!k)){a(!0);try{let h=await t.getOrCreateSession(),p=`${e.backendUrl}${e.apiPaths.conversations}${y}/?limit=10&offset=${g}`,S=await fetch(p,t.getFetchOptions({method:"GET"},h));if(S.ok){let b=await S.json(),x=t.transformResponse(b);if(x.messages?.length>0){let d=x.messages.flatMap(R).filter(Boolean);l(A=>[...d,...A]),w(A=>A+x.messages.length),c(x.hasMore||!1)}else c(!1)}}catch(h){console.error("[ChatWidget] Failed to load more messages:",h)}finally{a(!1)}}},[e,t,y,g,C,k]),B=te(async(h,M,p={})=>{if(r)return;let S=n[h];if(!S||S.role!=="user")return;let b=n.slice(0,h);l(b),await W(M,{...p,supersedeFromMessageIndex:h})},[n,r,W]),N=te(async(h,M={})=>{if(r)return;let p=n[h];if(!p)return;let S=h,b=p;if(p.role==="assistant"){for(let d=h-1;d>=0;d--)if(n[d].role==="user"){S=d,b=n[d];break}if(b.role!=="user")return}else if(p.role!=="user")return;let x=n.slice(0,S);l(x),await W(b.content,{...M,supersedeFromMessageIndex:S})},[n,r,W]);return it(()=>()=>{v.current&&v.current.close()},[]),{messages:n,isLoading:r,error:i,conversationId:y,hasMoreMessages:k,loadingMoreMessages:C,sendMessage:W,cancelRun:U,clearMessages:I,loadConversation:F,loadMoreMessages:P,setConversationId:u,editMessage:B,retryMessage:N}}import{useState as ge,useEffect as _t,useCallback as Se}from"preact/compat";var ct="cw_thinking_enabled";function Ve(e,t,s){let[n,l]=ge([]),[r,$]=ge(null),[i,f]=ge(null),[y,u]=ge(!1),[k,c]=ge(!1);_t(()=>{(async()=>{if(e.showModelSelector){u(!0);try{let T=await fetch(`${e.backendUrl}${e.apiPaths.models}`,t.getFetchOptions({method:"GET"}));if(T.ok){let m=await T.json(),W=m.models||[];l(W),f(m.default);let U=s?.get(e.modelKey);U&&W.some(R=>R.id===U)?$(U):$(m.default),s?.get(ct)==="true"&&c(!0)}}catch(T){console.warn("[ChatWidget] Failed to load models:",T)}finally{u(!1)}}})()},[e.backendUrl,e.apiPaths.models,e.showModelSelector,e.modelKey,t,s]);let C=Se(v=>{$(v),s?.set(e.modelKey,v)},[e.modelKey,s]),a=Se(v=>{c(v),s?.set(ct,v?"true":"false")},[s]),g=Se(()=>n.find(v=>v.id===r)||null,[n,r]),w=Se(()=>g()?.supports_thinking||!1,[g]);return{availableModels:n,selectedModel:r,defaultModel:i,isLoading:y,selectModel:C,getSelectedModelInfo:g,thinkingEnabled:k,toggleThinking:a,supportsThinking:w}}import{useState as Ue,useCallback as re}from"preact/compat";function Be(e,t){let[s,n]=Ue(null),[l,r]=Ue(!1),[$,i]=Ue(null),f=e.apiPaths?.tasks||"/api/agent/tasks/",y=re(async()=>{r(!0),i(null);try{let g=`${e.backendUrl}${f}`,w=await fetch(g,t.getFetchOptions({method:"GET"}));if(w.ok){let v=await w.json();n(v)}else{let v=await w.json().catch(()=>({}));i(v.error||"Failed to load tasks")}}catch(g){console.error("[useTasks] Failed to load task list:",g),i("Failed to load tasks")}finally{r(!1)}},[e.backendUrl,f,t]),u=re(async g=>{if(!s)return null;try{let w=`${e.backendUrl}${f}${s.id}/add_task/`,v=await fetch(w,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)}));if(v.ok){let T=await v.json();return await y(),T}else{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to add task"),null}}catch(w){return console.error("[useTasks] Failed to add task:",w),i("Failed to add task"),null}},[e.backendUrl,f,s,t,y]),k=re(async(g,w)=>{if(!s)return null;try{let v=`${e.backendUrl}${f}${s.id}/update_task/${g}/`,T=await fetch(v,t.getFetchOptions({method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(w)}));if(T.ok){let m=await T.json();return await y(),m}else{let m=await T.json().catch(()=>({}));return i(m.error||"Failed to update task"),null}}catch(v){return console.error("[useTasks] Failed to update task:",v),i("Failed to update task"),null}},[e.backendUrl,f,s,t,y]),c=re(async g=>{if(!s)return!1;try{let w=`${e.backendUrl}${f}${s.id}/remove_task/${g}/`,v=await fetch(w,t.getFetchOptions({method:"DELETE"}));if(v.ok)return await y(),!0;{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to remove task"),!1}}catch(w){return console.error("[useTasks] Failed to remove task:",w),i("Failed to remove task"),!1}},[e.backendUrl,f,s,t,y]),C=re(async()=>{if(!s)return!1;try{let g=`${e.backendUrl}${f}${s.id}/clear/`,w=await fetch(g,t.getFetchOptions({method:"POST"}));if(w.ok)return await y(),!0;{let v=await w.json().catch(()=>({}));return i(v.error||"Failed to clear tasks"),!1}}catch(g){return console.error("[useTasks] Failed to clear tasks:",g),i("Failed to clear tasks"),!1}},[e.backendUrl,f,s,t,y]),a=re(()=>i(null),[]);return{taskList:s,tasks:s?.tasks||[],progress:s?.progress||{total:0,completed:0,percent_complete:0},isLoading:l,error:$,loadTaskList:y,addTask:u,updateTask:k,removeTask:c,clearTasks:C,clearError:a}}import{useState as ae,useEffect as dt,useCallback as fe}from"preact/compat";var ut="cw_selected_system",je="cw_selected_agent",pt="cw_selected_system_version",Te="cw_selected_agent_version";function ht(e,t,s){let[n,l]=ae([]),[r,$]=ae([]),[i,f]=ae(null),[y,u]=ae(null),[k,c]=ae(null),[C,a]=ae(null),[g,w]=ae(!1),v=fe(()=>{if(y)return y;if(i){let I=n.find(R=>R.slug===i);if(I?.entry_agent)return I.entry_agent.slug}return e.agentKey},[y,i,n,e.agentKey]);dt(()=>{if(!e.showDevTools)return;(async()=>{w(!0);try{let R=await fetch(`${e.backendUrl}${e.apiPaths.systems}`,t.getFetchOptions({method:"GET"}));if(R.ok){let F=await R.json(),P=F.results||F;l(P);let B=s?.get(ut);B&&P.some(N=>N.slug===B)?f(B):P.length===1&&f(P[0].slug)}}catch(R){console.warn("[ChatWidget] Failed to load systems:",R)}finally{w(!1)}})()},[e.backendUrl,e.apiPaths.systems,e.showDevTools,t,s]),dt(()=>{if(!e.showDevTools)return;(async()=>{try{let R=i?`?system=${encodeURIComponent(i)}`:"",F=await fetch(`${e.backendUrl}${e.apiPaths.agents}${R}`,t.getFetchOptions({method:"GET"}));if(F.ok){let P=await F.json(),B=P.results||P;$(B);let N=s?.get(je);if(N&&B.some(M=>M.slug===N))u(N);else if(i){let M=n.find(p=>p.slug===i);M?.entry_agent&&u(M.entry_agent.slug)}let h=s?.get(Te);h&&a(h)}}catch(R){console.warn("[ChatWidget] Failed to load agents:",R)}})()},[e.backendUrl,e.apiPaths.agents,e.showDevTools,i,t,s,n]);let T=fe(I=>{f(I),s?.set(ut,I),u(null),a(null),s?.set(je,null),s?.set(Te,null);let F=n.find(P=>P.slug===I)?.active_version||null;c(F),s?.set(pt,F)},[s,n]),m=fe(I=>{u(I),s?.set(je,I);let F=r.find(P=>P.slug===I)?.active_version||null;a(F),s?.set(Te,F)},[s,r]),W=fe(I=>{c(I),s?.set(pt,I)},[s]),U=fe(I=>{a(I),s?.set(Te,I)},[s]);return{systems:n,agents:r,selectedSystem:i,selectedAgent:y,selectedSystemVersion:k,selectedAgentVersion:C,isLoading:g,selectSystem:T,selectAgent:m,selectSystemVersion:W,selectAgentVersion:U,getEffectiveAgentKey:v}}function Je(e,t,s){let n=u=>!u||typeof u!="object"||e.apiCaseStyle==="camel"?u:ce(u),l=u=>!u||typeof u!="object"||e.apiCaseStyle==="snake"?u:ie(u),r=()=>e.authStrategy?e.authStrategy:e.authToken?"token":e.apiPaths.anonymousSession||e.anonymousSessionEndpoint?"anonymous":"none",$=(u=null)=>{let k=r(),c={},C=u||e.authToken||t().authToken;if(k==="token"&&C){let a=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Token";c[a]=g?`${g} ${C}`:C}else if(k==="jwt"&&C){let a=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Bearer";c[a]=g?`${g} ${C}`:C}else if(k==="anonymous"&&C){let a=e.authHeader||e.anonymousTokenHeader||"X-Anonymous-Token";c[a]=C}if(k==="session"){let a=Ie(e.csrfCookieName);a&&(c["X-CSRFToken"]=a)}return c};return{getAuthStrategy:r,getAuthHeaders:$,getFetchOptions:(u={},k=null)=>{let c=r(),C={...u},a=$(k);return console.log("[ChatWidget] getFetchOptions - strategy:",c,"overrideToken:",k,"authHeaders:",a),C.headers={...C.headers,...a},c==="session"&&(C.credentials="include"),C},getOrCreateSession:async(u=!1)=>{let k=r(),c=t(),C=e.anonymousTokenKey||e.sessionTokenKey;if(k!=="anonymous")return e.authToken||c.authToken;if(!u){if(c.authToken)return c.authToken;let a=c.storage?.get(C);if(a)return s(g=>({...g,authToken:a})),a}try{let a=e.anonymousSessionEndpoint||e.apiPaths.anonymousSession,g=await fetch(`${e.backendUrl}${a}`,{method:"POST",headers:{"Content-Type":"application/json"}});if(g.ok){let w=await g.json();return s(v=>({...v,authToken:w.token})),c.storage?.set(C,w.token),w.token}}catch(a){console.warn("[ChatWidget] Failed to create session:",a)}return null},clearSession:()=>{let u=e.anonymousTokenKey||e.sessionTokenKey,k=t();s(c=>({...c,authToken:null})),k.storage?.set(u,null)},transformRequest:n,transformResponse:l}}function ye({config:e,onStateChange:t,markdownParser:s,apiRef:n}){console.log("[ChatWidget] Config:",{showConversationSidebar:e.showConversationSidebar,apiPaths:e.apiPaths});let[l,r]=q(e.embedded||e.forceOpen===!0),[$,i]=q(!1),[f,y]=q(!1),[u,k]=q(!1),[c,C]=q([]),[a,g]=q("chat"),[w,v]=q(!1),[T,m]=q(e.enableTTS),[W,U]=q(!1),[I,R]=q(null);$e(()=>{e.forceOpen!==void 0&&r(e.forceOpen)},[e.forceOpen]);let F=ze(()=>Ee(e.containerId),[e.containerId]),[P,B]=q(e.authToken||null),N=ze(()=>Je(e,()=>({authToken:P,storage:F}),Y=>{let V=Y({authToken:P,storage:F});V.authToken!==P&&B(V.authToken)}),[e,P,F]),h=ht(e,N,F),M=ze(()=>{if(!e.showDevTools)return e;let _=h.getEffectiveAgentKey();return _&&_!==e.agentKey?{...e,agentKey:_}:e},[e,h.getEffectiveAgentKey]),p=He(M,N,F),S=Ve(e,N,F),b=Be(e,N);$e(()=>{for(let _=p.messages.length-1;_>=0;_--){let G=p.messages[_];if(G.type==="sub_agent_start"){R({key:G.metadata?.subAgentKey,name:G.metadata?.agentName});return}if(G.type==="sub_agent_end"){R(null);return}}},[p.messages]),$e(()=>{let _=F.get(e.conversationIdKey);console.log("[ChatWidget] Initial load - storedConvId:",_,"key:",e.conversationIdKey),console.log("[ChatWidget] apiPaths.conversations:",e.apiPaths.conversations),_&&(console.log("[ChatWidget] Loading conversation:",_),p.loadConversation(_))},[]),$e(()=>{t&&t({isOpen:l,isExpanded:$,debugMode:f,messages:p.messages,conversationId:p.conversationId,isLoading:p.isLoading,error:p.error})},[l,$,f,p.messages,p.conversationId,p.isLoading,p.error]);let x=le(async()=>{if(e.showConversationSidebar){v(!0);try{let _=M.agentKey,G=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(_)}`,Y=await fetch(G,N.getFetchOptions({method:"GET"}));if(Y.ok){let V=await Y.json();C(V.results||V)}}catch(_){console.error("[ChatWidget] Failed to load conversations:",_),C([])}finally{v(!1)}}},[e,M,N]),d=le(()=>{let _=!u;k(_),_&&x()},[u,x]),A=le(_=>{_!==p.conversationId&&p.loadConversation(_),k(!1)},[p]),O=le(()=>{p.clearMessages(),k(!1)},[p]),o=le(_=>{p.sendMessage(_,{model:S.selectedModel,thinking:S.thinkingEnabled&&S.supportsThinking(),onAssistantMessage:G=>{}})},[p,T,S.selectedModel,S.thinkingEnabled,S.supportsThinking]),E=le(_=>{g(_),_==="tasks"&&b.loadTaskList()},[b]);if($e(()=>{n&&(n.current={open:()=>r(!0),close:()=>r(!1),send:_=>o(_),clearMessages:()=>p.clearMessages(),toggleTTS:()=>m(_=>!_),stopSpeech:()=>U(!1),setAuth:_=>{_.token!==void 0&&B(_.token)},clearAuth:()=>B(null)})},[p,n,o]),!e.embedded&&!l)return z`
587
587
  <button
588
588
  class="cw-fab"
589
589
  style=${{backgroundColor:e.primaryColor}}
@@ -593,9 +593,9 @@ var ft=Object.defineProperty;var $t=(e,t,s)=>t in e?ft(e,t,{enumerable:!0,config
593
593
  <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
594
594
  </svg>
595
595
  </button>
596
- `;let L=["cw-widget",$&&"cw-widget-expanded",e.embedded&&"cw-widget-embedded"].filter(Boolean).join(" "),j=e.headerTextColor||tt(e.primaryColor);return G`
596
+ `;let L=["cw-widget",$&&"cw-widget-expanded",e.embedded&&"cw-widget-embedded"].filter(Boolean).join(" "),j=e.headerTextColor||tt(e.primaryColor);return z`
597
597
  <div class=${L} style=${{"--cw-primary":e.primaryColor,"--cw-header-text":j}}>
598
- ${e.showConversationSidebar&&G`
598
+ ${e.showConversationSidebar&&z`
599
599
  <${Ke}
600
600
  isOpen=${u}
601
601
  conversations=${c}
@@ -607,23 +607,25 @@ var ft=Object.defineProperty;var $t=(e,t,s)=>t in e?ft(e,t,{enumerable:!0,config
607
607
  />
608
608
  `}
609
609
 
610
- <${Ae}
611
- config=${e}
612
- debugMode=${f}
613
- isExpanded=${$}
614
- isSpeaking=${W}
615
- messagesCount=${p.messages.length}
616
- isLoading=${p.isLoading}
617
- currentAgent=${I}
618
- onClose=${()=>r(!1)}
619
- onToggleExpand=${()=>i(!$)}
620
- onToggleDebug=${()=>y(!f)}
621
- onToggleTTS=${()=>m(!T)}
622
- onClear=${p.clearMessages}
623
- onToggleSidebar=${d}
624
- />
610
+ ${e.showHeader!==!1&&z`
611
+ <${Ae}
612
+ config=${e}
613
+ debugMode=${f}
614
+ isExpanded=${$}
615
+ isSpeaking=${W}
616
+ messagesCount=${p.messages.length}
617
+ isLoading=${p.isLoading}
618
+ currentAgent=${I}
619
+ onClose=${()=>r(!1)}
620
+ onToggleExpand=${()=>i(!$)}
621
+ onToggleDebug=${()=>y(!f)}
622
+ onToggleTTS=${()=>m(!T)}
623
+ onClear=${p.clearMessages}
624
+ onToggleSidebar=${d}
625
+ />
626
+ `}
625
627
 
626
- ${e.showDevTools&&G`
628
+ ${e.showDevTools&&z`
627
629
  <${rt}
628
630
  systems=${h.systems}
629
631
  agents=${h.agents}
@@ -639,7 +641,7 @@ var ft=Object.defineProperty;var $t=(e,t,s)=>t in e?ft(e,t,{enumerable:!0,config
639
641
  />
640
642
  `}
641
643
 
642
- ${e.showTasksTab!==!1&&G`
644
+ ${e.showTasksTab!==!1&&z`
643
645
  <div class="cw-tabs">
644
646
  <button
645
647
  class=${`cw-tab ${a==="chat"?"cw-tab-active":""}`}
@@ -651,15 +653,15 @@ var ft=Object.defineProperty;var $t=(e,t,s)=>t in e?ft(e,t,{enumerable:!0,config
651
653
  class=${`cw-tab ${a==="tasks"?"cw-tab-active":""}`}
652
654
  onClick=${()=>E("tasks")}
653
655
  >
654
- Tasks ${b.progress.total>0?G`<span class="cw-tab-badge">${b.progress.completed}/${b.progress.total}</span>`:""}
656
+ Tasks ${b.progress.total>0?z`<span class="cw-tab-badge">${b.progress.completed}/${b.progress.total}</span>`:""}
655
657
  </button>
656
658
  </div>
657
659
  `}
658
660
 
659
- ${f&&G`<div class="cw-status-bar"><span>🐛 Debug</span></div>`}
661
+ ${f&&z`<div class="cw-status-bar"><span>🐛 Debug</span></div>`}
660
662
 
661
- ${a==="chat"?G`
662
- <${Fe}
663
+ ${a==="chat"?z`
664
+ <${De}
663
665
  messages=${p.messages}
664
666
  isLoading=${p.isLoading}
665
667
  hasMoreMessages=${p.hasMoreMessages}
@@ -673,9 +675,9 @@ var ft=Object.defineProperty;var $t=(e,t,s)=>t in e?ft(e,t,{enumerable:!0,config
673
675
  emptyStateMessage=${e.emptyStateMessage}
674
676
  />
675
677
 
676
- ${p.error&&G`<div class="cw-error-bar">${p.error}</div>`}
678
+ ${p.error&&z`<div class="cw-error-bar">${p.error}</div>`}
677
679
 
678
- ${e.showModelSelector&&S.availableModels.length>0&&G`
680
+ ${e.showModelSelector&&S.availableModels.length>0&&z`
679
681
  <${We}
680
682
  availableModels=${S.availableModels}
681
683
  selectedModel=${S.selectedModel}
@@ -693,8 +695,9 @@ var ft=Object.defineProperty;var $t=(e,t,s)=>t in e?ft(e,t,{enumerable:!0,config
693
695
  placeholder=${e.placeholder}
694
696
  primaryColor=${e.primaryColor}
695
697
  enableVoice=${e.enableVoice}
698
+ enableFiles=${e.showFileAttachment!==!1}
696
699
  />
697
- `:G`
700
+ `:z`
698
701
  <${Ne}
699
702
  tasks=${b.tasks}
700
703
  progress=${b.progress}
@@ -707,9 +710,9 @@ var ft=Object.defineProperty;var $t=(e,t,s)=>t in e?ft(e,t,{enumerable:!0,config
707
710
  />
708
711
  `}
709
712
  </div>
710
- `}var Ge={backendUrl:"http://localhost:8000",agentKey:"default-agent",title:"Chat Assistant",subtitle:"How can we help you today?",primaryColor:"#0066cc",headerTextColor:null,position:"bottom-right",defaultJourneyType:"general",enableDebugMode:!0,enableAutoRun:!0,journeyTypes:{},customerPrompts:{},placeholder:"Type your message...",emptyStateTitle:"Start a Conversation",emptyStateMessage:"Send a message to get started.",authStrategy:null,authToken:null,authHeader:null,authTokenPrefix:null,anonymousSessionEndpoint:null,anonymousTokenKey:"chat_widget_anonymous_token",onAuthError:null,anonymousTokenHeader:"X-Anonymous-Token",conversationIdKey:"chat_widget_conversation_id",sessionTokenKey:"chat_widget_session_token",apiPaths:{anonymousSession:"/api/accounts/anonymous-session/",conversations:"/api/agent-runtime/conversations/",runs:"/api/agent-runtime/runs/",runEvents:"/api/agent-runtime/runs/{runId}/events/",simulateCustomer:"/api/agent-runtime/simulate-customer/",ttsVoices:"/api/tts/voices/",ttsSetVoice:"/api/tts/set-voice/",models:"/api/agent-runtime/models/",systems:"/api/agent-runtime/systems/",agents:"/api/agent-runtime/agents/"},apiCaseStyle:"auto",theme:"light",showConversationSidebar:!0,showClearButton:!0,showDebugButton:!0,showTTSButton:!0,showVoiceSettings:!0,showExpandButton:!0,showModelSelector:!1,showDevTools:!1,enableVoice:!0,modelKey:"chat_widget_selected_model",autoRunDelay:1e3,autoRunMode:"automatic",enableTTS:!1,ttsProxyUrl:null,elevenLabsApiKey:null,ttsVoices:{assistant:null,user:null},ttsModel:"eleven_turbo_v2_5",ttsSettings:{stability:.5,similarity_boost:.75,style:0,use_speaker_boost:!0},availableVoices:[],onEvent:null,containerId:null,embedded:!1,metadata:{}};function qe(e){let t={...Ge.apiPaths,...e.apiPaths||{}};return{...Ge,...e,apiPaths:t}}import{render as mt}from"preact/compat";import{html as Mt}from"htm/preact";var _e=new Map,xt=0,F=null,Ye=class{constructor(t={}){Qe(this,"_handleStateChange",t=>{this._state=t});this.instanceId=`cw-${++xt}`,this.config=qe(t),this.container=null,this._state={},this._apiRef={current:null},_e.set(this.instanceId,this)}init(){if(this.config.containerId){if(this.container=document.getElementById(this.config.containerId),!this.container)return console.error(`[ChatWidget] Container not found: ${this.config.containerId}`),this;this.container.classList.add("cw-container-embedded")}else this.container=document.createElement("div"),this.container.id=this.instanceId,this.container.className=`cw-container cw-position-${this.config.position}`,document.body.appendChild(this.container);return this._applyTheme(),this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} initialized`),this}_applyTheme(){this.container&&(this.container.classList.remove("cw-dark","cw-auto"),this.config.theme==="dark"?this.container.classList.add("cw-dark"):this.config.theme==="auto"&&this.container.classList.add("cw-auto"))}_render(t={}){this.container&&mt(Mt`<${ye}
713
+ `}var Ge={backendUrl:"http://localhost:8000",agentKey:"default-agent",title:"Chat Assistant",subtitle:"How can we help you today?",primaryColor:"#0066cc",headerTextColor:null,position:"bottom-right",defaultJourneyType:"general",enableDebugMode:!0,enableAutoRun:!0,journeyTypes:{},customerPrompts:{},placeholder:"Type your message...",emptyStateTitle:"Start a Conversation",emptyStateMessage:"Send a message to get started.",authStrategy:null,authToken:null,authHeader:null,authTokenPrefix:null,anonymousSessionEndpoint:null,anonymousTokenKey:"chat_widget_anonymous_token",onAuthError:null,anonymousTokenHeader:"X-Anonymous-Token",conversationIdKey:"chat_widget_conversation_id",sessionTokenKey:"chat_widget_session_token",apiPaths:{anonymousSession:"/api/accounts/anonymous-session/",conversations:"/api/agent-runtime/conversations/",runs:"/api/agent-runtime/runs/",runEvents:"/api/agent-runtime/runs/{runId}/events/",simulateCustomer:"/api/agent-runtime/simulate-customer/",ttsVoices:"/api/tts/voices/",ttsSetVoice:"/api/tts/set-voice/",models:"/api/agent-runtime/models/",systems:"/api/agent-runtime/systems/",agents:"/api/agent-runtime/agents/"},apiCaseStyle:"auto",theme:"light",showHeader:!0,showFileAttachment:!0,showTasksTab:!0,showConversationSidebar:!0,showClearButton:!0,showDebugButton:!0,showTTSButton:!0,showVoiceSettings:!0,showExpandButton:!0,showModelSelector:!1,showDevTools:!1,enableVoice:!0,modelKey:"chat_widget_selected_model",autoRunDelay:1e3,autoRunMode:"automatic",enableTTS:!1,ttsProxyUrl:null,elevenLabsApiKey:null,ttsVoices:{assistant:null,user:null},ttsModel:"eleven_turbo_v2_5",ttsSettings:{stability:.5,similarity_boost:.75,style:0,use_speaker_boost:!0},availableVoices:[],onEvent:null,containerId:null,embedded:!1,metadata:{}};function qe(e){let t={...Ge.apiPaths,...e.apiPaths||{}};return{...Ge,...e,apiPaths:t}}import{render as mt}from"preact/compat";import{html as Mt}from"htm/preact";var _e=new Map,xt=0,D=null,Ye=class{constructor(t={}){Qe(this,"_handleStateChange",t=>{this._state=t});this.instanceId=`cw-${++xt}`,this.config=qe(t),this.container=null,this._state={},this._apiRef={current:null},_e.set(this.instanceId,this)}init(){if(this.config.containerId){if(this.container=document.getElementById(this.config.containerId),!this.container)return console.error(`[ChatWidget] Container not found: ${this.config.containerId}`),this;this.container.classList.add("cw-container-embedded")}else this.container=document.createElement("div"),this.container.id=this.instanceId,this.container.className=`cw-container cw-position-${this.config.position}`,document.body.appendChild(this.container);return this._applyTheme(),this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} initialized`),this}_applyTheme(){this.container&&(this.container.classList.remove("cw-dark","cw-auto"),this.config.theme==="dark"?this.container.classList.add("cw-dark"):this.config.theme==="auto"&&this.container.classList.add("cw-auto"))}_render(t={}){this.container&&mt(Mt`<${ye}
711
714
  config=${{...this.config,...t}}
712
715
  onStateChange=${this._handleStateChange}
713
716
  markdownParser=${Xe._enhancedMarkdownParser}
714
717
  apiRef=${this._apiRef}
715
- />`,this.container)}destroy(){this.container&&(mt(null,this.container),this.config.containerId?this.container.classList.remove("cw-container-embedded"):this.container.remove(),this.container=null),_e.delete(this.instanceId),console.log(`[ChatWidget] Instance ${this.instanceId} destroyed`)}open(){this._apiRef.current?this._apiRef.current.open():this._render({forceOpen:!0})}close(){this._apiRef.current?this._apiRef.current.close():this._render({forceOpen:!1})}send(t){this._apiRef.current&&this._apiRef.current.send(t)}clearMessages(){this._apiRef.current&&this._apiRef.current.clearMessages()}toggleTTS(){this._apiRef.current&&this._apiRef.current.toggleTTS()}stopSpeech(){this._apiRef.current&&this._apiRef.current.stopSpeech()}setAuth(t){this._apiRef.current&&this._apiRef.current.setAuth(t)}clearAuth(){this._apiRef.current&&this._apiRef.current.clearAuth()}getState(){return{...this._state}}getConfig(){return{...this.config}}updateMetadata(t){this.config.metadata={...this.config.metadata,...t},this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} metadata updated:`,t)}updateConfig(t){this.config={...this.config,...t},"theme"in t&&this._applyTheme(),this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} config updated`)}};function gt(e={}){return new Ye(e).init()}function Et(e={}){return F&&F.destroy(),F=gt(e),F}function It(){F&&(F.destroy(),F=null)}function At(){F&&F.open()}function Rt(){F&&F.close()}function Dt(e){F&&F.send(e)}function Ft(){F&&F.clearMessages()}function Ot(){F&&F.toggleTTS()}function Pt(){F&&F.stopSpeech()}function Lt(e){F&&F.setAuth(e)}function Kt(){F&&F.clearAuth()}function Wt(){return F?F.getState():null}function Nt(){return F?F.getConfig():null}var Xe={createInstance:gt,getInstance:e=>_e.get(e),getAllInstances:()=>Array.from(_e.values()),init:Et,destroy:It,open:At,close:Rt,send:Dt,clearMessages:Ft,toggleTTS:Ot,stopSpeech:Pt,setAuth:Lt,clearAuth:Kt,getState:Wt,getConfig:Nt,_enhancedMarkdownParser:null};typeof window<"u"&&(window.ChatWidget=Xe);var sn=ye;export{ye as ChatWidget,Xe as ChatWidgetAPI,Ge as DEFAULT_CONFIG,Ae as Header,Le as InputForm,De as Message,Fe as MessageList,We as ModelSelector,Ke as Sidebar,Ne as TaskList,ve as camelToSnake,Je as createApiClient,Ee as createStorage,sn as default,Me as formatDate,ue as formatFileSize,de as generateId,Ie as getCSRFToken,pe as getFileTypeIcon,ie as keysToCamel,ce as keysToSnake,qe as mergeConfig,xe as parseMarkdown,et as snakeToCamel,He as useChat,Ve as useModels,Be as useTasks};
718
+ />`,this.container)}destroy(){this.container&&(mt(null,this.container),this.config.containerId?this.container.classList.remove("cw-container-embedded"):this.container.remove(),this.container=null),_e.delete(this.instanceId),console.log(`[ChatWidget] Instance ${this.instanceId} destroyed`)}open(){this._apiRef.current?this._apiRef.current.open():this._render({forceOpen:!0})}close(){this._apiRef.current?this._apiRef.current.close():this._render({forceOpen:!1})}send(t){this._apiRef.current&&this._apiRef.current.send(t)}clearMessages(){this._apiRef.current&&this._apiRef.current.clearMessages()}toggleTTS(){this._apiRef.current&&this._apiRef.current.toggleTTS()}stopSpeech(){this._apiRef.current&&this._apiRef.current.stopSpeech()}setAuth(t){this._apiRef.current&&this._apiRef.current.setAuth(t)}clearAuth(){this._apiRef.current&&this._apiRef.current.clearAuth()}getState(){return{...this._state}}getConfig(){return{...this.config}}updateMetadata(t){this.config.metadata={...this.config.metadata,...t},this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} metadata updated:`,t)}updateConfig(t){this.config={...this.config,...t},"theme"in t&&this._applyTheme(),this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} config updated`)}};function gt(e={}){return new Ye(e).init()}function Et(e={}){return D&&D.destroy(),D=gt(e),D}function It(){D&&(D.destroy(),D=null)}function At(){D&&D.open()}function Rt(){D&&D.close()}function Ft(e){D&&D.send(e)}function Dt(){D&&D.clearMessages()}function Ot(){D&&D.toggleTTS()}function Pt(){D&&D.stopSpeech()}function Lt(e){D&&D.setAuth(e)}function Kt(){D&&D.clearAuth()}function Wt(){return D?D.getState():null}function Nt(){return D?D.getConfig():null}var Xe={createInstance:gt,getInstance:e=>_e.get(e),getAllInstances:()=>Array.from(_e.values()),init:Et,destroy:It,open:At,close:Rt,send:Ft,clearMessages:Dt,toggleTTS:Ot,stopSpeech:Pt,setAuth:Lt,clearAuth:Kt,getState:Wt,getConfig:Nt,_enhancedMarkdownParser:null};typeof window<"u"&&(window.ChatWidget=Xe);var sn=ye;export{ye as ChatWidget,Xe as ChatWidgetAPI,Ge as DEFAULT_CONFIG,Ae as Header,Le as InputForm,Fe as Message,De as MessageList,We as ModelSelector,Ke as Sidebar,Ne as TaskList,ve as camelToSnake,Je as createApiClient,Ee as createStorage,sn as default,Me as formatDate,ue as formatFileSize,de as generateId,Ie as getCSRFToken,pe as getFileTypeIcon,ie as keysToCamel,ce as keysToSnake,qe as mergeConfig,xe as parseMarkdown,et as snakeToCamel,He as useChat,Ve as useModels,Be as useTasks};