@makemore/agent-frontend 2.8.1 → 2.8.3

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.
@@ -1,9 +1,9 @@
1
- var nt=Object.defineProperty;var st=(e,t,n)=>t in e?nt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Me=(e,t,n)=>(st(e,typeof t!="symbol"?t+"":t,n),n);import{render as et}from"preact";import{html as ht}from"htm/preact";import{html as J}from"htm/preact";import{useState as W,useEffect as ae,useCallback as te,useMemo as Xe}from"preact/hooks";import{html as G}from"htm/preact";function at(e){return e.replace(/_([a-z])/g,(t,n)=>n.toUpperCase())}function we(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}function le(e){return Array.isArray(e)?e.map(le):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,n])=>[at(t),le(n)])):e}function ce(e){return Array.isArray(e)?e.map(ce):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,n])=>[we(t),ce(n)])):e}function de(){return"msg-"+Date.now()+"-"+Math.random().toString(36).substr(2,9)}function D(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function Ie(e){if(!e)return"";try{let t=new Date(e),o=new Date-t,i=Math.floor(o/6e4),c=Math.floor(o/36e5),w=Math.floor(o/864e5);return i<1?"Just now":i<60?`${i}m ago`:c<24?`${c}h ago`:w<7?`${w}d ago`:t.toLocaleDateString()}catch{return""}}function Ee(e,t=null){if(t)return t(e);let n=D(e);return n=n.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),n=n.replace(/__(.+?)__/g,"<strong>$1</strong>"),n=n.replace(/\*(.+?)\*/g,"<em>$1</em>"),n=n.replace(/_(.+?)_/g,"<em>$1</em>"),n=n.replace(/`(.+?)`/g,"<code>$1</code>"),n=n.replace(/\[(.+?)\]\((.+?)\)/g,'<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>'),n=n.replace(/\n/g,"<br>"),n}function xe(e=""){let t=n=>e?`${n}_${e}`:n;return{get(n){try{return localStorage.getItem(t(n))}catch{return null}},set(n,o){try{let i=t(n);o===null?localStorage.removeItem(i):localStorage.setItem(i,o)}catch{}}}}function Re(e="csrftoken"){let t=document.cookie.split(";");for(let o of t){let[i,c]=o.trim().split("=");if(i===e)return decodeURIComponent(c)}let n=document.querySelector('meta[name="csrf-token"]');return n?n.getAttribute("content"):null}function ue(e){if(e===0)return"0 B";let t=1024,n=["B","KB","MB","GB"],o=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/Math.pow(t,o)).toFixed(1))+" "+n[o]}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 Ae({config:e,debugMode:t,isExpanded:n,isSpeaking:o,messagesCount:i,isLoading:c,currentAgent:w,onClose:$,onToggleExpand:m,onToggleDebug:f,onToggleTTS:l,onClear:k,onToggleSidebar:p}){let{title:y,primaryColor:g,embedded:u,showConversationSidebar:h,showClearButton:v,showDebugButton:T,enableDebugMode:A,showTTSButton:F,showExpandButton:j,enableTTS:U,elevenLabsApiKey:N,ttsProxyUrl:P}=e,L=N||P;return G`
2
- <div class="cw-header" style=${{backgroundColor:g}}>
3
- ${h&&G`
1
+ var ot=Object.defineProperty;var rt=(e,t,n)=>t in e?ot(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Ee=(e,t,n)=>(rt(e,typeof t!="symbol"?t+"":t,n),n);import{render as st}from"preact";import{html as $t}from"htm/preact";import{html as J}from"htm/preact";import{useState as j,useEffect as ie,useCallback as se,useMemo as Qe}from"preact/hooks";import{html as X}from"htm/preact";function it(e){return e.replace(/_([a-z])/g,(t,n)=>n.toUpperCase())}function ve(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}function ue(e){return Array.isArray(e)?e.map(ue):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,n])=>[it(t),ue(n)])):e}function pe(e){return Array.isArray(e)?e.map(pe):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,n])=>[ve(t),pe(n)])):e}function he(){return"msg-"+Date.now()+"-"+Math.random().toString(36).substr(2,9)}function D(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function xe(e){if(!e)return"";try{let t=new Date(e),o=new Date-t,i=Math.floor(o/6e4),l=Math.floor(o/36e5),h=Math.floor(o/864e5);return i<1?"Just now":i<60?`${i}m ago`:l<24?`${l}h ago`:h<7?`${h}d ago`:t.toLocaleDateString()}catch{return""}}function Re(e,t=null){if(t)return t(e);let n=D(e);return n=n.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),n=n.replace(/__(.+?)__/g,"<strong>$1</strong>"),n=n.replace(/\*(.+?)\*/g,"<em>$1</em>"),n=n.replace(/_(.+?)_/g,"<em>$1</em>"),n=n.replace(/`(.+?)`/g,"<code>$1</code>"),n=n.replace(/\[(.+?)\]\((.+?)\)/g,'<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>'),n=n.replace(/\n/g,"<br>"),n}function Ae(e=""){let t=n=>e?`${n}_${e}`:n;return{get(n){try{return localStorage.getItem(t(n))}catch{return null}},set(n,o){try{let i=t(n);o===null?localStorage.removeItem(i):localStorage.setItem(i,o)}catch{}}}}function Oe(e="csrftoken"){let t=document.cookie.split(";");for(let o of t){let[i,l]=o.trim().split("=");if(i===e)return decodeURIComponent(l)}let n=document.querySelector('meta[name="csrf-token"]');return n?n.getAttribute("content"):null}function me(e){if(e===0)return"0 B";let t=1024,n=["B","KB","MB","GB"],o=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/Math.pow(t,o)).toFixed(1))+" "+n[o]}function fe(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 lt(e){if(!e||typeof e!="string")return 0;let t=e.replace("#","");if(t.length!==6&&t.length!==3)return 0;let n=t.length===3?t.split("").map(u=>u+u).join(""):t,o=parseInt(n.substr(0,2),16)/255,i=parseInt(n.substr(2,2),16)/255,l=parseInt(n.substr(4,2),16)/255,h=u=>u<=.03928?u/12.92:Math.pow((u+.055)/1.055,2.4);return .2126*h(o)+.7152*h(i)+.0722*h(l)}function Fe(e){return lt(e)>.179?"#000000":"#ffffff"}function De({config:e,debugMode:t,isExpanded:n,isSpeaking:o,messagesCount:i,isLoading:l,currentAgent:h,onClose:u,onToggleExpand:m,onToggleDebug:y,onToggleTTS:f,onClear:k,onToggleSidebar:d}){let{title:v,primaryColor:c,embedded:p,showConversationSidebar:g,showClearButton:$,showDebugButton:S,enableDebugMode:x,showTTSButton:P,showExpandButton:L,enableTTS:H,elevenLabsApiKey:K,ttsProxyUrl:N}=e,W=K||N;return X`
2
+ <div class="cw-header" style=${{backgroundColor:c}}>
3
+ ${g&&X`
4
4
  <button
5
5
  class="cw-header-btn cw-hamburger"
6
- onClick=${p}
6
+ onClick=${d}
7
7
  title="Conversations"
8
8
  >
9
9
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="16" height="16">
@@ -15,42 +15,42 @@ var nt=Object.defineProperty;var st=(e,t,n)=>t in e?nt(e,t,{enumerable:!0,config
15
15
  `}
16
16
 
17
17
  <div class="cw-title-container">
18
- <span class="cw-title">${D(y)}</span>
19
- ${w&&G`
18
+ <span class="cw-title">${D(v)}</span>
19
+ ${h&&X`
20
20
  <span class="cw-current-agent" title="Currently active agent">
21
21
  <span class="cw-agent-indicator">🤖</span>
22
- <span class="cw-agent-name">${D(w.name||w.key)}</span>
22
+ <span class="cw-agent-name">${D(h.name||h.key)}</span>
23
23
  </span>
24
24
  `}
25
25
  </div>
26
26
 
27
27
  <div class="cw-header-actions">
28
- ${v&&G`
28
+ ${$&&X`
29
29
  <button
30
30
  class="cw-header-btn"
31
31
  onClick=${k}
32
32
  title="Clear"
33
- disabled=${c||i===0}
33
+ disabled=${l||i===0}
34
34
  >🗑️</button>
35
35
  `}
36
36
 
37
- ${T&&A&&G`
37
+ ${S&&x&&X`
38
38
  <button
39
39
  class="cw-header-btn ${t?"cw-btn-active":""}"
40
- onClick=${f}
40
+ onClick=${y}
41
41
  title="Debug"
42
42
  >🐛</button>
43
43
  `}
44
44
 
45
- ${F&&L&&G`
45
+ ${P&&W&&X`
46
46
  <button
47
- class="cw-header-btn ${U?"cw-btn-active":""}"
48
- onClick=${l}
47
+ class="cw-header-btn ${H?"cw-btn-active":""}"
48
+ onClick=${f}
49
49
  title="TTS"
50
- >${U?"\u{1F50A}":"\u{1F507}"}</button>
50
+ >${H?"\u{1F50A}":"\u{1F507}"}</button>
51
51
  `}
52
52
 
53
- ${j&&!u&&G`
53
+ ${L&&!p&&X`
54
54
  <button
55
55
  class="cw-header-btn"
56
56
  onClick=${m}
@@ -58,29 +58,29 @@ var nt=Object.defineProperty;var st=(e,t,n)=>t in e?nt(e,t,{enumerable:!0,config
58
58
  >${n?"\u2296":"\u2295"}</button>
59
59
  `}
60
60
 
61
- ${!u&&G`
61
+ ${!p&&X`
62
62
  <button
63
63
  class="cw-header-btn"
64
- onClick=${$}
64
+ onClick=${u}
65
65
  title="Close"
66
66
  >✕</button>
67
67
  `}
68
68
  </div>
69
69
  </div>
70
- `}import{html as Q}from"htm/preact";import{useRef as Fe,useEffect as Pe}from"preact/hooks";import{html as O}from"htm/preact";import{useState as he,useRef as ot,useEffect as rt}from"preact/hooks";function ve({msg:e,show:t,onToggle:n}){return t?O`
70
+ `}import{html as Q}from"htm/preact";import{useRef as Ke,useEffect as Ne}from"preact/hooks";import{html as F}from"htm/preact";import{useState as ge,useRef as ct,useEffect as dt}from"preact/hooks";function be({msg:e,show:t,onToggle:n}){return t?F`
71
71
  <div class="cw-debug-payload">
72
72
  <button class="cw-debug-payload-close" onClick=${n}>×</button>
73
73
  <pre class="cw-debug-payload-content">${JSON.stringify(e,null,2)}</pre>
74
74
  </div>
75
- `:O`
75
+ `:F`
76
76
  <button
77
77
  class="cw-debug-payload-btn"
78
78
  onClick=${n}
79
79
  title="Show message payload"
80
80
  >{ }</button>
81
- `}function Oe({onEdit:e,onRetry:t,isLoading:n,position:o,showEdit:i=!0}){return n?null:O`
81
+ `}function Pe({onEdit:e,onRetry:t,isLoading:n,position:o,showEdit:i=!0}){return n?null:F`
82
82
  <div class="cw-message-actions cw-message-actions-${o||"left"}">
83
- ${i&&O`
83
+ ${i&&F`
84
84
  <button
85
85
  class="cw-message-action-btn"
86
86
  onClick=${e}
@@ -104,10 +104,10 @@ var nt=Object.defineProperty;var st=(e,t,n)=>t in e?nt(e,t,{enumerable:!0,config
104
104
  </svg>
105
105
  </button>
106
106
  </div>
107
- `}function it({initialContent:e,onSave:t,onCancel:n}){let[o,i]=he(e),c=ot(null);return rt(()=>{c.current&&(c.current.focus(),c.current.setSelectionRange(o.length,o.length),c.current.style.height="auto",c.current.style.height=c.current.scrollHeight+"px")},[]),O`
107
+ `}function ut({initialContent:e,onSave:t,onCancel:n}){let[o,i]=ge(e),l=ct(null);return dt(()=>{l.current&&(l.current.focus(),l.current.setSelectionRange(o.length,o.length),l.current.style.height="auto",l.current.style.height=l.current.scrollHeight+"px")},[]),F`
108
108
  <div class="cw-inline-edit">
109
109
  <textarea
110
- ref=${c}
110
+ ref=${l}
111
111
  class="cw-inline-edit-input"
112
112
  value=${o}
113
113
  onInput=${m=>{i(m.target.value),m.target.style.height="auto",m.target.style.height=m.target.scrollHeight+"px"}}
@@ -128,106 +128,106 @@ var nt=Object.defineProperty;var st=(e,t,n)=>t in e?nt(e,t,{enumerable:!0,config
128
128
  >Save & Send</button>
129
129
  </div>
130
130
  </div>
131
- `}function De({msg:e,debugMode:t,markdownParser:n,onEdit:o,onRetry:i,isLoading:c,messageIndex:w}){let[$,m]=he(!1),[f,l]=he(!1),[k,p]=he(!1),y=e.role==="user",g=e.role==="system",u=e.type==="tool_call",h=e.type==="tool_result",v=e.type==="error",T=e.type==="sub_agent_start",A=e.type==="sub_agent_end",F=e.type==="agent_context";if(g&&!t)return null;if(T||A||F)return O`
132
- <div class="cw-agent-context ${T?"cw-agent-delegating":""} ${A?"cw-agent-returned":""}" style="position: relative;">
133
- <span class="cw-agent-context-icon">${T?"\u{1F517}":A?"\u2713":"\u{1F916}"}</span>
131
+ `}function Le({msg:e,debugMode:t,markdownParser:n,onEdit:o,onRetry:i,isLoading:l,messageIndex:h}){let[u,m]=ge(!1),[y,f]=ge(!1),[k,d]=ge(!1),v=e.role==="user",c=e.role==="system",p=e.type==="tool_call",g=e.type==="tool_result",$=e.type==="error",S=e.type==="sub_agent_start",x=e.type==="sub_agent_end",P=e.type==="agent_context";if(c&&!t)return null;if(S||x||P)return F`
132
+ <div class="cw-agent-context ${S?"cw-agent-delegating":""} ${x?"cw-agent-returned":""}" style="position: relative;">
133
+ <span class="cw-agent-context-icon">${S?"\u{1F517}":x?"\u2713":"\u{1F916}"}</span>
134
134
  <span class="cw-agent-context-text">${e.content}</span>
135
- ${e.metadata?.agentName&&O`
135
+ ${e.metadata?.agentName&&F`
136
136
  <span class="cw-agent-context-name">${e.metadata.agentName}</span>
137
137
  `}
138
- ${t&&O`<${ve} msg=${e} show=${f} onToggle=${()=>l(!f)} />`}
138
+ ${t&&F`<${be} msg=${e} show=${y} onToggle=${()=>f(!y)} />`}
139
139
  </div>
140
- `;if(u||h){let b=e.metadata?.arguments||e.metadata?.result,M=r=>{if(typeof r=="string")try{return JSON.stringify(JSON.parse(r),null,2)}catch{return r}return JSON.stringify(r,null,2)};return O`
141
- <div class="cw-tool-message ${h?"cw-tool-result":"cw-tool-call"}" style="position: relative;">
142
- <span class="cw-tool-label" onClick=${()=>b&&m(!$)}>
140
+ `;if(p||g){let b=e.metadata?.arguments||e.metadata?.result,M=r=>{if(typeof r=="string")try{return JSON.stringify(JSON.parse(r),null,2)}catch{return r}return JSON.stringify(r,null,2)};return F`
141
+ <div class="cw-tool-message ${g?"cw-tool-result":"cw-tool-call"}" style="position: relative;">
142
+ <span class="cw-tool-label" onClick=${()=>b&&m(!u)}>
143
143
  ${e.content}
144
- ${b&&O`<span class="cw-tool-expand">${$?"\u25BC":"\u25B6"}</span>`}
144
+ ${b&&F`<span class="cw-tool-expand">${u?"\u25BC":"\u25B6"}</span>`}
145
145
  </span>
146
- ${$&&b&&O`
147
- <pre class="cw-tool-details">${D(M(u?e.metadata.arguments:e.metadata.result))}</pre>
146
+ ${u&&b&&F`
147
+ <pre class="cw-tool-details">${D(M(p?e.metadata.arguments:e.metadata.result))}</pre>
148
148
  `}
149
- ${t&&O`<${ve} msg=${e} show=${f} onToggle=${()=>l(!f)} />`}
149
+ ${t&&F`<${be} msg=${e} show=${y} onToggle=${()=>f(!y)} />`}
150
150
  </div>
151
- `}let j=["cw-message",y&&"cw-message-user",v&&"cw-message-error"].filter(Boolean).join(" "),U=`cw-message-row ${y?"cw-message-row-user":""}`,N=e.role==="assistant"?Ee(e.content,n):D(e.content),P=e.files&&e.files.length>0,L=()=>P?O`
151
+ `}let L=["cw-message",v&&"cw-message-user",$&&"cw-message-error"].filter(Boolean).join(" "),H=`cw-message-row ${v?"cw-message-row-user":""}`,K=e.role==="assistant"?Re(e.content,n):D(e.content),N=e.files&&e.files.length>0,W=()=>N?F`
152
152
  <div class="cw-message-attachments">
153
- ${e.files.map(b=>b.type&&b.type.startsWith("image/")?O`
153
+ ${e.files.map(b=>b.type&&b.type.startsWith("image/")?F`
154
154
  <a class="cw-attachment-thumbnail" href=${b.url} target="_blank" title=${b.name}>
155
155
  <img src=${b.url} alt=${b.name} />
156
156
  </a>
157
- `:O`
157
+ `:F`
158
158
  <a class="cw-attachment-file" href=${b.url} target="_blank" title=${b.name}>
159
- <span class="cw-attachment-icon">${pe(b.type)}</span>
159
+ <span class="cw-attachment-icon">${fe(b.type)}</span>
160
160
  <span class="cw-attachment-info">
161
161
  <span class="cw-attachment-name">${b.name}</span>
162
- <span class="cw-attachment-size">${ue(b.size)}</span>
162
+ <span class="cw-attachment-size">${me(b.size)}</span>
163
163
  </span>
164
164
  </a>
165
165
  `)}
166
166
  </div>
167
- `:null,z=b=>{p(!1),o&&o(w,b)},H=()=>{i&&i(w)};if(y&&k)return O`
168
- <div class=${U} style="position: relative;">
169
- ${L()}
170
- <${it}
167
+ `:null,z=b=>{d(!1),o&&o(h,b)},B=()=>{i&&i(h)};if(v&&k)return F`
168
+ <div class=${H} style="position: relative;">
169
+ ${W()}
170
+ <${ut}
171
171
  initialContent=${e.content}
172
172
  onSave=${z}
173
- onCancel=${()=>p(!1)}
173
+ onCancel=${()=>d(!1)}
174
174
  />
175
175
  </div>
176
- `;let s=y&&o&&i,C=e.role==="assistant"&&i&&!c;return O`
177
- <div class="${U} ${s||C?"cw-message-row-with-actions":""}">
178
- ${L()}
179
- ${s&&O`
176
+ `;let s=v&&o&&i,T=e.role==="assistant"&&i&&!l;return F`
177
+ <div class="${H} ${s||T?"cw-message-row-with-actions":""}">
178
+ ${W()}
179
+ ${s&&F`
180
180
  <div class="cw-user-actions-wrapper">
181
- <${Oe}
182
- onEdit=${()=>p(!0)}
183
- onRetry=${H}
184
- isLoading=${c}
181
+ <${Pe}
182
+ onEdit=${()=>d(!0)}
183
+ onRetry=${B}
184
+ isLoading=${l}
185
185
  position="left"
186
186
  showEdit=${!0}
187
187
  />
188
- <div class=${j} dangerouslySetInnerHTML=${{__html:N}} />
188
+ <div class=${L} dangerouslySetInnerHTML=${{__html:K}} />
189
189
  </div>
190
190
  `}
191
- ${!s&&O`
192
- <div class=${j} dangerouslySetInnerHTML=${{__html:N}} />
191
+ ${!s&&F`
192
+ <div class=${L} dangerouslySetInnerHTML=${{__html:K}} />
193
193
  `}
194
- ${C&&O`
195
- <${Oe}
196
- onRetry=${H}
197
- isLoading=${c}
194
+ ${T&&F`
195
+ <${Pe}
196
+ onRetry=${B}
197
+ isLoading=${l}
198
198
  position="right"
199
199
  showEdit=${!1}
200
200
  />
201
201
  `}
202
- ${t&&O`<${ve} msg=${e} show=${f} onToggle=${()=>l(!f)} />`}
202
+ ${t&&F`<${be} msg=${e} show=${y} onToggle=${()=>f(!y)} />`}
203
203
  </div>
204
- `}function Le({messages:e,isLoading:t,hasMoreMessages:n,loadingMoreMessages:o,onLoadMore:i,onEditMessage:c,onRetryMessage:w,debugMode:$,markdownParser:m,emptyStateTitle:f,emptyStateMessage:l}){let k=Fe(null),p=Fe(!0),y=u=>{let h=u.target,v=h.scrollHeight-h.scrollTop-h.clientHeight<100;if(p.current=v,h.scrollTop<50&&n&&!o){let T=h.scrollHeight;i().then(()=>{let A=h.scrollHeight;h.scrollTop=A-T+h.scrollTop})}};Pe(()=>{let u=k.current;u&&p.current&&requestAnimationFrame(()=>{u.scrollTop=u.scrollHeight})},[e,t]),Pe(()=>{let u=k.current;u&&e.length<=2&&(p.current=!0,requestAnimationFrame(()=>{u.scrollTop=u.scrollHeight}))},[e.length]);let g=e.length===0;return Q`
205
- <div class="cw-messages" ref=${k} onScroll=${y}>
206
- ${g&&Q`
204
+ `}function We({messages:e,isLoading:t,hasMoreMessages:n,loadingMoreMessages:o,onLoadMore:i,onEditMessage:l,onRetryMessage:h,debugMode:u,markdownParser:m,emptyStateTitle:y,emptyStateMessage:f}){let k=Ke(null),d=Ke(!0),v=p=>{let g=p.target,$=g.scrollHeight-g.scrollTop-g.clientHeight<100;if(d.current=$,g.scrollTop<50&&n&&!o){let S=g.scrollHeight;i().then(()=>{let x=g.scrollHeight;g.scrollTop=x-S+g.scrollTop})}};Ne(()=>{let p=k.current;p&&d.current&&requestAnimationFrame(()=>{p.scrollTop=p.scrollHeight})},[e,t]),Ne(()=>{let p=k.current;p&&e.length<=2&&(d.current=!0,requestAnimationFrame(()=>{p.scrollTop=p.scrollHeight}))},[e.length]);let c=e.length===0;return Q`
205
+ <div class="cw-messages" ref=${k} onScroll=${v}>
206
+ ${c&&Q`
207
207
  <div class="cw-empty-state">
208
208
  <svg class="cw-empty-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
209
209
  <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>
210
210
  </svg>
211
- <h3>${D(f)}</h3>
212
- <p>${D(l)}</p>
211
+ <h3>${D(y)}</h3>
212
+ <p>${D(f)}</p>
213
213
  </div>
214
214
  `}
215
215
 
216
- ${!g&&n&&Q`
216
+ ${!c&&n&&Q`
217
217
  <div class="cw-load-more" onClick=${i}>
218
218
  ${o?Q`<span class="cw-spinner"></span><span>Loading...</span>`:Q`<span>↑ Scroll up or click to load older messages</span>`}
219
219
  </div>
220
220
  `}
221
221
 
222
- ${e.map((u,h)=>Q`
223
- <${De}
224
- key=${u.id}
225
- msg=${u}
226
- messageIndex=${h}
227
- debugMode=${$}
222
+ ${e.map((p,g)=>Q`
223
+ <${Le}
224
+ key=${p.id}
225
+ msg=${p}
226
+ messageIndex=${g}
227
+ debugMode=${u}
228
228
  markdownParser=${m}
229
- onEdit=${c}
230
- onRetry=${w}
229
+ onEdit=${l}
230
+ onRetry=${h}
231
231
  isLoading=${t}
232
232
  />
233
233
  `)}
@@ -241,41 +241,41 @@ var nt=Object.defineProperty;var st=(e,t,n)=>t in e?nt(e,t,{enumerable:!0,config
241
241
  </div>
242
242
  `}
243
243
  </div>
244
- `}import{html as V}from"htm/preact";import{useState as ne,useRef as me,useEffect as ke}from"preact/hooks";var be=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function Ke({onSend:e,onCancel:t,isLoading:n,placeholder:o,primaryColor:i,enableVoice:c=!0,enableFiles:w=!0}){let[$,m]=ne(""),[f,l]=ne([]),[k,p]=ne(!1),[y,g]=ne(!1),[u]=ne(()=>!!be),h=me(null),v=me(null),T=me(null),A=me(!1);ke(()=>{!n&&h.current&&h.current.focus()},[n]),ke(()=>{h.current&&(h.current.style.height="auto",h.current.style.height=Math.min(h.current.scrollHeight,150)+"px")},[$]),ke(()=>()=>{A.current=!1,T.current&&T.current.abort()},[]);let F=r=>{r.preventDefault(),($.trim()||f.length>0)&&!n&&(e($,f),m(""),l([]),h.current&&(h.current.style.height="auto"),v.current&&(v.current.value=""))},j=r=>{let I=Array.from(r.target.files||[]);I.length>0&&l(R=>[...R,...I])},U=r=>{l(I=>I.filter((R,a)=>a!==r))},N=r=>{r.preventDefault(),v.current&&!n&&v.current.click()},P=r=>{r.key==="Enter"&&!r.shiftKey&&(r.preventDefault(),F(r))},L=r=>{n&&t&&(r.preventDefault(),t())},z=()=>{if(!be||n)return;A.current=!0;let r=new be;r.continuous=!0,r.interimResults=!0,r.lang=navigator.language||"en-US";let I=$,R="";r.onstart=()=>{g(!0)},r.onresult=a=>{R="";for(let d=a.resultIndex;d<a.results.length;d++){let E=a.results[d][0].transcript;a.results[d].isFinal?I+=(I?" ":"")+E:R+=E}m(I+(R?" "+R:""))},r.onerror=a=>{if(a.error==="no-speech"||a.error==="aborted"){console.log("[ChatWidget] Speech recognition:",a.error,"- continuing...");return}console.warn("[ChatWidget] Speech recognition error:",a.error),A.current=!1,g(!1),m(I||$)},r.onend=()=>{if(A.current){console.log("[ChatWidget] Recognition paused, restarting...");try{r.start();return}catch(a){console.warn("[ChatWidget] Could not restart recognition:",a)}}g(!1),I&&m(I),T.current=null},T.current=r,r.start()},H=()=>{A.current=!1,T.current&&T.current.stop()},s=r=>{r.preventDefault(),y?H():z()},_=V`
244
+ `}import{html as V}from"htm/preact";import{useState as ae,useRef as $e,useEffect as Ce}from"preact/hooks";var Se=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function He({onSend:e,onCancel:t,isLoading:n,placeholder:o,primaryColor:i,enableVoice:l=!0,enableFiles:h=!0}){let[u,m]=ae(""),[y,f]=ae([]),[k,d]=ae(!1),[v,c]=ae(!1),[p]=ae(()=>!!Se),g=$e(null),$=$e(null),S=$e(null),x=$e(!1);Ce(()=>{!n&&g.current&&g.current.focus()},[n]),Ce(()=>{g.current&&(g.current.style.height="auto",g.current.style.height=Math.min(g.current.scrollHeight,150)+"px")},[u]),Ce(()=>()=>{x.current=!1,S.current&&S.current.abort()},[]);let P=r=>{r.preventDefault(),(u.trim()||y.length>0)&&!n&&(e(u,y),m(""),f([]),g.current&&(g.current.style.height="auto"),$.current&&($.current.value=""))},L=r=>{let E=Array.from(r.target.files||[]);E.length>0&&f(R=>[...R,...E])},H=r=>{f(E=>E.filter((R,a)=>a!==r))},K=r=>{r.preventDefault(),$.current&&!n&&$.current.click()},N=r=>{r.key==="Enter"&&!r.shiftKey&&(r.preventDefault(),P(r))},W=r=>{n&&t&&(r.preventDefault(),t())},z=()=>{if(!Se||n)return;x.current=!0;let r=new Se;r.continuous=!0,r.interimResults=!0,r.lang=navigator.language||"en-US";let E=u,R="";r.onstart=()=>{c(!0)},r.onresult=a=>{R="";for(let I=a.resultIndex;I<a.results.length;I++){let w=a.results[I][0].transcript;a.results[I].isFinal?E+=(E?" ":"")+w:R+=w}m(E+(R?" "+R:""))},r.onerror=a=>{if(a.error==="no-speech"||a.error==="aborted"){console.log("[ChatWidget] Speech recognition:",a.error,"- continuing...");return}console.warn("[ChatWidget] Speech recognition error:",a.error),x.current=!1,c(!1),m(E||u)},r.onend=()=>{if(x.current){console.log("[ChatWidget] Recognition paused, restarting...");try{r.start();return}catch(a){console.warn("[ChatWidget] Could not restart recognition:",a)}}c(!1),E&&m(E),S.current=null},S.current=r,r.start()},B=()=>{x.current=!1,S.current&&S.current.stop()},s=r=>{r.preventDefault(),v?B():z()},C=V`
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>
248
- `,C=V`
248
+ `,T=V`
249
249
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
250
250
  <path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"></path>
251
251
  <path d="M19 10v2a7 7 0 0 1-14 0v-2"></path>
252
252
  <line x1="12" y1="19" x2="12" y2="23"></line>
253
253
  <line x1="8" y1="23" x2="16" y2="23"></line>
254
254
  </svg>
255
- `,S=V`
255
+ `,_=V`
256
256
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
257
257
  <path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"></path>
258
258
  </svg>
259
- `,b=c&&u,M=w;return V`
260
- <form class="cw-input-form" onSubmit=${F}>
259
+ `,b=l&&p,M=h;return V`
260
+ <form class="cw-input-form" onSubmit=${P}>
261
261
  <input
262
262
  type="file"
263
- ref=${v}
263
+ ref=${$}
264
264
  style="display: none"
265
265
  multiple
266
- onChange=${j}
266
+ onChange=${L}
267
267
  />
268
- ${f.length>0&&V`
268
+ ${y.length>0&&V`
269
269
  <div class="cw-file-chips">
270
- ${f.map((r,I)=>V`
271
- <div class="cw-file-chip" key=${I}>
272
- <span class="cw-file-chip-icon">${pe(r.type)}</span>
270
+ ${y.map((r,E)=>V`
271
+ <div class="cw-file-chip" key=${E}>
272
+ <span class="cw-file-chip-icon">${fe(r.type)}</span>
273
273
  <span class="cw-file-chip-name" title=${r.name}>${r.name.length>20?r.name.substring(0,17)+"...":r.name}</span>
274
- <span class="cw-file-chip-size">(${ue(r.size)})</span>
274
+ <span class="cw-file-chip-size">(${me(r.size)})</span>
275
275
  <button
276
276
  type="button"
277
277
  class="cw-file-chip-remove"
278
- onClick=${()=>U(I)}
278
+ onClick=${()=>H(E)}
279
279
  title="Remove file"
280
280
  >×</button>
281
281
  </div>
@@ -283,12 +283,12 @@ var nt=Object.defineProperty;var st=(e,t,n)=>t in e?nt(e,t,{enumerable:!0,config
283
283
  </div>
284
284
  `}
285
285
  <textarea
286
- ref=${h}
286
+ ref=${g}
287
287
  class="cw-input"
288
288
  placeholder=${D(o)}
289
- value=${$}
289
+ value=${u}
290
290
  onInput=${r=>m(r.target.value)}
291
- onKeyDown=${P}
291
+ onKeyDown=${N}
292
292
  disabled=${n}
293
293
  rows="1"
294
294
  />
@@ -296,66 +296,66 @@ var nt=Object.defineProperty;var st=(e,t,n)=>t in e?nt(e,t,{enumerable:!0,config
296
296
  <button
297
297
  type="button"
298
298
  class="cw-attach-btn"
299
- onClick=${N}
299
+ onClick=${K}
300
300
  disabled=${n}
301
301
  title="Attach files"
302
302
  >
303
- ${S}
303
+ ${_}
304
304
  </button>
305
305
  `}
306
306
  ${b&&V`
307
307
  <button
308
308
  type="button"
309
- class=${`cw-voice-btn ${y?"cw-voice-btn-recording":""}`}
309
+ class=${`cw-voice-btn ${v?"cw-voice-btn-recording":""}`}
310
310
  onClick=${s}
311
311
  disabled=${n}
312
- title=${y?"Stop recording":"Voice input"}
312
+ title=${v?"Stop recording":"Voice input"}
313
313
  >
314
- ${C}
314
+ ${T}
315
315
  </button>
316
316
  `}
317
317
  <button
318
318
  type=${n?"button":"submit"}
319
319
  class=${`cw-send-btn ${n?"cw-send-btn-loading":""} ${n&&k?"cw-send-btn-stop":""}`}
320
320
  style=${{backgroundColor:n&&k?"#dc2626":i}}
321
- onClick=${L}
322
- onMouseEnter=${()=>p(!0)}
323
- onMouseLeave=${()=>p(!1)}
321
+ onClick=${W}
322
+ onMouseEnter=${()=>d(!0)}
323
+ onMouseLeave=${()=>d(!1)}
324
324
  title=${n?"Stop":"Send"}
325
325
  >
326
- ${n?k?_:V`<span class="cw-spinner"></span>`:"\u27A4"}
326
+ ${n?k?C:V`<span class="cw-spinner"></span>`:"\u27A4"}
327
327
  </button>
328
328
  </form>
329
- `}import{html as fe}from"htm/preact";function Ne({isOpen:e,conversations:t,conversationsLoading:n,currentConversationId:o,onClose:i,onNewConversation:c,onSwitchConversation:w}){return fe`
329
+ `}import{html as ye}from"htm/preact";function Be({isOpen:e,conversations:t,conversationsLoading:n,currentConversationId:o,onClose:i,onNewConversation:l,onSwitchConversation:h}){return ye`
330
330
  <div class="cw-sidebar ${e?"cw-sidebar-open":""}">
331
331
  <div class="cw-sidebar-header">
332
332
  <span>Conversations</span>
333
333
  <button class="cw-sidebar-close" onClick=${i}>✕</button>
334
334
  </div>
335
335
 
336
- <button class="cw-new-conversation" onClick=${c}>
336
+ <button class="cw-new-conversation" onClick=${l}>
337
337
  <span>+ New Conversation</span>
338
338
  </button>
339
339
 
340
340
  <div class="cw-conversation-list">
341
- ${n&&fe`
341
+ ${n&&ye`
342
342
  <div class="cw-sidebar-loading">
343
343
  <span class="cw-spinner"></span>
344
344
  </div>
345
345
  `}
346
346
 
347
- ${!n&&t.length===0&&fe`
347
+ ${!n&&t.length===0&&ye`
348
348
  <div class="cw-sidebar-empty">No conversations yet</div>
349
349
  `}
350
350
 
351
- ${t.map($=>fe`
351
+ ${t.map(u=>ye`
352
352
  <div
353
- key=${$.id}
354
- class="cw-conversation-item ${$.id===o?"cw-conversation-active":""}"
355
- onClick=${()=>w($.id)}
353
+ key=${u.id}
354
+ class="cw-conversation-item ${u.id===o?"cw-conversation-active":""}"
355
+ onClick=${()=>h(u.id)}
356
356
  >
357
- <div class="cw-conversation-title">${D($.title||"Untitled")}</div>
358
- <div class="cw-conversation-date">${Ie($.updatedAt||$.createdAt)}</div>
357
+ <div class="cw-conversation-title">${D(u.title||"Untitled")}</div>
358
+ <div class="cw-conversation-date">${xe(u.updatedAt||u.createdAt)}</div>
359
359
  </div>
360
360
  `)}
361
361
  </div>
@@ -365,61 +365,75 @@ var nt=Object.defineProperty;var st=(e,t,n)=>t in e?nt(e,t,{enumerable:!0,config
365
365
  class="cw-sidebar-overlay ${e?"cw-sidebar-overlay-visible":""}"
366
366
  onClick=${i}
367
367
  />
368
- `}import{html as ge}from"htm/preact";import{useState as lt}from"preact/hooks";function He({availableModels:e,selectedModel:t,onSelectModel:n,disabled:o}){let[i,c]=lt(!1);if(!e||e.length===0)return null;let $=e.find(l=>l.id===t)?.name||"Select Model",m=()=>{o||c(!i)},f=l=>{n(l),c(!1)};return ge`
368
+ `}import{html as te}from"htm/preact";import{useState as pt}from"preact/hooks";function Ue({availableModels:e,selectedModel:t,onSelectModel:n,thinkingEnabled:o,onToggleThinking:i,disabled:l}){let[h,u]=pt(!1);if(!e||e.length===0)return null;let m=e.find(c=>c.id===t),y=m?.name||"Select Model",f=m?.supports_thinking||!1,k=()=>{l||u(!h)},d=c=>{n(c),u(!1)},v=c=>{c.stopPropagation(),i&&f&&i(!o)};return te`
369
369
  <div class="cw-model-selector">
370
- <button
371
- class="cw-model-btn"
372
- onClick=${m}
373
- disabled=${o}
370
+ <button
371
+ class="cw-model-btn"
372
+ onClick=${k}
373
+ disabled=${l}
374
374
  title="Select Model"
375
375
  >
376
376
  <span class="cw-model-icon">🤖</span>
377
- <span class="cw-model-name">${D($)}</span>
378
- <span class="cw-model-chevron">${i?"\u25B2":"\u25BC"}</span>
377
+ <span class="cw-model-name">${D(y)}</span>
378
+ <span class="cw-model-chevron">${h?"\u25B2":"\u25BC"}</span>
379
379
  </button>
380
-
381
- ${i&&ge`
380
+
381
+ ${f&&i&&te`
382
+ <button
383
+ class="cw-thinking-toggle ${o?"cw-thinking-enabled":""}"
384
+ onClick=${v}
385
+ disabled=${l}
386
+ title=${o?"Thinking enabled - click to disable":"Enable extended thinking"}
387
+ >
388
+ <span class="cw-thinking-icon">🧠</span>
389
+ </button>
390
+ `}
391
+
392
+ ${h&&te`
382
393
  <div class="cw-model-dropdown">
383
- ${e.map(l=>ge`
384
- <button
385
- key=${l.id}
386
- class="cw-model-option ${l.id===t?"cw-model-option-selected":""}"
387
- onClick=${()=>f(l.id)}
394
+ ${e.map(c=>te`
395
+ <button
396
+ key=${c.id}
397
+ class="cw-model-option ${c.id===t?"cw-model-option-selected":""}"
398
+ onClick=${()=>d(c.id)}
388
399
  >
389
- <span class="cw-model-option-name">${D(l.name)}</span>
390
- <span class="cw-model-option-provider">${D(l.provider)}</span>
391
- ${l.description&&ge`
392
- <span class="cw-model-option-desc">${D(l.description)}</span>
400
+ <span class="cw-model-option-name">
401
+ ${D(c.name)}
402
+ ${c.supports_thinking&&te`<span class="cw-thinking-badge" title="Supports extended thinking">🧠</span>`}
403
+ </span>
404
+ <span class="cw-model-option-provider">${D(c.provider)}</span>
405
+ ${c.description&&te`
406
+ <span class="cw-model-option-desc">${D(c.description)}</span>
393
407
  `}
394
408
  </button>
395
409
  `)}
396
410
  </div>
397
411
  `}
398
412
  </div>
399
- `}import{html as q}from"htm/preact";import{useState as Be,useCallback as se}from"preact/hooks";var ct={not_started:"\u25CB",in_progress:"\u25D0",complete:"\u25CF",cancelled:"\u2298"},dt={not_started:"Not Started",in_progress:"In Progress",complete:"Complete",cancelled:"Cancelled"};function ut({task:e,onUpdate:t,onRemove:n,depth:o=0}){let[i,c]=Be(!1),[w,$]=Be(e.name),m=se(()=>{let p={not_started:"in_progress",in_progress:"complete",complete:"not_started",cancelled:"not_started"};t(e.id,{state:p[e.state]||"not_started"})},[e,t]),f=se(()=>{w.trim()&&w!==e.name&&t(e.id,{name:w.trim()}),c(!1)},[e,w,t]),l=se(p=>{p.key==="Enter"&&f(),p.key==="Escape"&&($(e.name),c(!1))},[f,e.name]),k=`cw-task-state-${e.state.replace("_","-")}`;return q`
413
+ `}import{html as G}from"htm/preact";import{useState as je,useCallback as oe}from"preact/hooks";var ht={not_started:"\u25CB",in_progress:"\u25D0",complete:"\u25CF",cancelled:"\u2298"},mt={not_started:"Not Started",in_progress:"In Progress",complete:"Complete",cancelled:"Cancelled"};function ft({task:e,onUpdate:t,onRemove:n,depth:o=0}){let[i,l]=je(!1),[h,u]=je(e.name),m=oe(()=>{let d={not_started:"in_progress",in_progress:"complete",complete:"not_started",cancelled:"not_started"};t(e.id,{state:d[e.state]||"not_started"})},[e,t]),y=oe(()=>{h.trim()&&h!==e.name&&t(e.id,{name:h.trim()}),l(!1)},[e,h,t]),f=oe(d=>{d.key==="Enter"&&y(),d.key==="Escape"&&(u(e.name),l(!1))},[y,e.name]),k=`cw-task-state-${e.state.replace("_","-")}`;return G`
400
414
  <div class="cw-task-item ${k}" style=${{paddingLeft:`${o*16+8}px`}}>
401
415
  <button
402
416
  class="cw-task-state-btn"
403
417
  onClick=${m}
404
- title=${dt[e.state]}
418
+ title=${mt[e.state]}
405
419
  >
406
- ${ct[e.state]}
420
+ ${ht[e.state]}
407
421
  </button>
408
422
 
409
- ${i?q`
423
+ ${i?G`
410
424
  <input
411
425
  type="text"
412
426
  class="cw-task-edit-input"
413
- value=${w}
414
- onInput=${p=>$(p.target.value)}
415
- onBlur=${f}
416
- onKeyDown=${l}
427
+ value=${h}
428
+ onInput=${d=>u(d.target.value)}
429
+ onBlur=${y}
430
+ onKeyDown=${f}
417
431
  autoFocus
418
432
  />
419
- `:q`
433
+ `:G`
420
434
  <span
421
435
  class="cw-task-name"
422
- onClick=${()=>c(!0)}
436
+ onClick=${()=>l(!0)}
423
437
  title="Click to edit"
424
438
  >
425
439
  ${e.name}
@@ -434,16 +448,16 @@ var nt=Object.defineProperty;var st=(e,t,n)=>t in e?nt(e,t,{enumerable:!0,config
434
448
  ×
435
449
  </button>
436
450
  </div>
437
- `}function Ue({tasks:e,progress:t,isLoading:n,error:o,onUpdate:i,onRemove:c,onClear:w,onRefresh:$}){let m=se(k=>{let p=new Map,y=[];return k.forEach(g=>{p.set(g.id,{...g,children:[]})}),k.forEach(g=>{let u=p.get(g.id);g.parent_id&&p.has(g.parent_id)?p.get(g.parent_id).children.push(u):y.push(u)}),y},[]),f=se((k,p=0)=>q`
438
- <${ut}
451
+ `}function Je({tasks:e,progress:t,isLoading:n,error:o,onUpdate:i,onRemove:l,onClear:h,onRefresh:u}){let m=oe(k=>{let d=new Map,v=[];return k.forEach(c=>{d.set(c.id,{...c,children:[]})}),k.forEach(c=>{let p=d.get(c.id);c.parent_id&&d.has(c.parent_id)?d.get(c.parent_id).children.push(p):v.push(p)}),v},[]),y=oe((k,d=0)=>G`
452
+ <${ft}
439
453
  key=${k.id}
440
454
  task=${k}
441
- depth=${p}
455
+ depth=${d}
442
456
  onUpdate=${i}
443
- onRemove=${c}
457
+ onRemove=${l}
444
458
  />
445
- ${k.children?.map(y=>f(y,p+1))}
446
- `,[i,c]),l=m(e);return n&&e.length===0?q`<div class="cw-tasks-loading">Loading tasks...</div>`:q`
459
+ ${k.children?.map(v=>y(v,d+1))}
460
+ `,[i,l]),f=m(e);return n&&e.length===0?G`<div class="cw-tasks-loading">Loading tasks...</div>`:G`
447
461
  <div class="cw-tasks-container">
448
462
  <div class="cw-tasks-header">
449
463
  <div class="cw-tasks-progress">
@@ -458,41 +472,41 @@ var nt=Object.defineProperty;var st=(e,t,n)=>t in e?nt(e,t,{enumerable:!0,config
458
472
  </div>
459
473
  </div>
460
474
  <div class="cw-tasks-actions">
461
- <button class="cw-tasks-action-btn" onClick=${$} title="Refresh">↻</button>
462
- ${e.length>0&&q`
463
- <button class="cw-tasks-action-btn" onClick=${w} title="Clear all">🗑</button>
475
+ <button class="cw-tasks-action-btn" onClick=${u} title="Refresh">↻</button>
476
+ ${e.length>0&&G`
477
+ <button class="cw-tasks-action-btn" onClick=${h} title="Clear all">🗑</button>
464
478
  `}
465
479
  </div>
466
480
  </div>
467
481
 
468
- ${o&&q`<div class="cw-tasks-error">${o}</div>`}
482
+ ${o&&G`<div class="cw-tasks-error">${o}</div>`}
469
483
 
470
484
  <div class="cw-tasks-list">
471
- ${l.length===0?q`
485
+ ${f.length===0?G`
472
486
  <div class="cw-tasks-empty">
473
487
  <p>No tasks yet</p>
474
488
  <p class="cw-tasks-empty-hint">Tasks will appear here when the agent creates them</p>
475
489
  </div>
476
- `:l.map(k=>f(k))}
490
+ `:f.map(k=>y(k))}
477
491
  </div>
478
492
  </div>
479
- `}import{useState as Y,useCallback as X,useRef as We,useEffect as je}from"preact/hooks";function Je(e,t,n){let[o,i]=Y([]),[c,w]=Y(!1),[$,m]=Y(null),[f,l]=Y(()=>n?.get(e.conversationIdKey)||null),[k,p]=Y(!1),[y,g]=Y(!1),[u,h]=Y(0),v=We(null),T=We(null);je(()=>{f&&n?.set(e.conversationIdKey,f)},[f,e.conversationIdKey,n]);let A=X(async(s,_,C)=>{v.current&&v.current.close();let S=e.apiPaths.runEvents.replace("{runId}",s),b=`${e.backendUrl}${S}`;_&&(b+=`?anonymous_token=${encodeURIComponent(_)}`);let M=new EventSource(b);v.current=M;let r="";M.addEventListener("assistant.message",R=>{try{let a=JSON.parse(R.data);e.onEvent&&e.onEvent("assistant.message",a.payload);let d=a.payload.content;d&&(r+=d,i(E=>{let K=E[E.length-1];return K?.role==="assistant"&&K.id.startsWith("assistant-stream-")?[...E.slice(0,-1),{...K,content:r}]:[...E,{id:"assistant-stream-"+Date.now(),role:"assistant",content:r,timestamp:new Date,type:"message"}]}))}catch(a){console.error("[ChatWidget] Parse error:",a)}}),M.addEventListener("tool.call",R=>{try{let a=JSON.parse(R.data);e.onEvent&&e.onEvent("tool.call",a.payload),i(d=>[...d,{id:"tool-call-"+Date.now(),role:"assistant",content:`\u{1F527} ${a.payload.name}`,timestamp:new Date,type:"tool_call",metadata:{toolName:a.payload.name,arguments:a.payload.arguments,toolCallId:a.payload.id}}])}catch(a){console.error("[ChatWidget] Parse error:",a)}}),M.addEventListener("tool.result",R=>{try{let a=JSON.parse(R.data);e.onEvent&&e.onEvent("tool.result",a.payload);let d=a.payload.result,E=d?.error;i(K=>[...K,{id:"tool-result-"+Date.now(),role:"system",content:E?`\u274C ${d.error}`:"\u2713 Done",timestamp:new Date,type:"tool_result",metadata:{toolName:a.payload.name,result:d,toolCallId:a.payload.tool_call_id}}])}catch(a){console.error("[ChatWidget] Parse error:",a)}}),M.addEventListener("custom",R=>{try{let a=JSON.parse(R.data);e.onEvent&&e.onEvent("custom",a.payload),a.payload?.type==="ui_control"&&e.onUIControl&&e.onUIControl(a.payload),a.payload?.type==="agent_context"&&i(d=>[...d,{id:"agent-context-"+Date.now(),role:"system",content:`\u{1F517} ${a.payload.agent_name||"Sub-agent"} is now handling this request`,timestamp:new Date,type:"agent_context",metadata:{agentKey:a.payload.agent_key,agentName:a.payload.agent_name,action:a.payload.action}}])}catch(a){console.error("[ChatWidget] Parse error:",a)}}),M.addEventListener("sub_agent.start",R=>{try{let a=JSON.parse(R.data);e.onEvent&&e.onEvent("sub_agent.start",a.payload),i(d=>[...d,{id:"sub-agent-start-"+Date.now(),role:"system",content:`\u{1F517} Delegating to ${a.payload.agent_name||a.payload.sub_agent_key||"sub-agent"}...`,timestamp:new Date,type:"sub_agent_start",metadata:{subAgentKey:a.payload.sub_agent_key,agentName:a.payload.agent_name,invocationMode:a.payload.invocation_mode}}])}catch(a){console.error("[ChatWidget] Parse error:",a)}}),M.addEventListener("sub_agent.end",R=>{try{let a=JSON.parse(R.data);e.onEvent&&e.onEvent("sub_agent.end",a.payload),i(d=>[...d,{id:"sub-agent-end-"+Date.now(),role:"system",content:`\u2713 ${a.payload.agent_name||"Sub-agent"} completed`,timestamp:new Date,type:"sub_agent_end",metadata:{subAgentKey:a.payload.sub_agent_key,agentName:a.payload.agent_name}}])}catch(a){console.error("[ChatWidget] Parse error:",a)}});let I=R=>{try{let a=JSON.parse(R.data);if(e.onEvent&&e.onEvent(a.type,a.payload),a.type==="run.failed"){let d=a.payload.error||"Agent run failed";m(d),i(E=>[...E,{id:"error-"+Date.now(),role:"system",content:`\u274C Error: ${d}`,timestamp:new Date,type:"error"}])}}catch(a){console.error("[ChatWidget] Parse error:",a)}w(!1),M.close(),v.current=null,r&&C&&C(r)};M.addEventListener("run.succeeded",I),M.addEventListener("run.failed",I),M.addEventListener("run.cancelled",I),M.addEventListener("run.timed_out",I),M.onerror=()=>{w(!1),M.close(),v.current=null}},[e]),F=X(async(s,_={},C={})=>{if(!s.trim()||c)return;let S=[],b={};typeof _=="function"?b={onAssistantMessage:_}:Array.isArray(_)?(S=_,b=C):b=_||{};let{model:M,onAssistantMessage:r,supersedeFromMessageIndex:I}=b;w(!0),m(null);let R={id:de(),role:"user",content:s.trim(),timestamp:new Date,type:"message",files:S.length>0?S.map(a=>({name:a.name,size:a.size,type:a.type})):void 0};i(a=>[...a,R]);try{let a=await t.getOrCreateSession(),d;if(S.length>0){let B=e.apiCaseStyle!=="camel",_e=ie=>B?we(ie):ie,Z=new FormData;Z.append(_e("agentKey"),e.agentKey),f&&Z.append(_e("conversationId"),f),Z.append("messages",JSON.stringify([{role:"user",content:s.trim()}])),Z.append("metadata",JSON.stringify(B?{...e.metadata,journey_type:e.defaultJourneyType}:{...e.metadata,journeyType:e.defaultJourneyType})),M&&Z.append("model",M),S.forEach(ie=>{Z.append("files",ie)}),d=t.getFetchOptions({method:"POST",body:Z},a)}else{let B=t.transformRequest({agentKey:e.agentKey,conversationId:f,messages:[{role:"user",content:s.trim()}],metadata:{...e.metadata,journeyType:e.defaultJourneyType},...M&&{model:M},...I!==void 0&&{supersedeFromMessageIndex:I}});d=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(B)},a)}let E=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,d),K=a;if(E.status===401){t.clearSession();let B=await t.getOrCreateSession(!0);B&&(K=B,S.length>0?d=t.getFetchOptions({method:"POST",body:d.body},B):d=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:d.body},B),E=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,d))}if(!E.ok){let B=await E.json().catch(()=>({}));throw new Error(B.error||B.detail||`HTTP ${E.status}`)}let oe=await E.json(),re=t.transformResponse(oe);T.current=re.id,!f&&re.conversationId&&l(re.conversationId),await A(re.id,K,r)}catch(a){m(a.message||"Failed to send message"),w(!1)}finally{T.current=null}},[e,t,f,c,A]),j=X(async()=>{let s=T.current;if(!(!s||!c))try{let _=e.apiPaths.cancelRun?e.apiPaths.cancelRun.replace("{runId}",s):`${e.apiPaths.runs}${s}/cancel/`;(await fetch(`${e.backendUrl}${_}`,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"}}))).ok&&(v.current&&(v.current.close(),v.current=null),w(!1),T.current=null,i(S=>[...S,{id:"cancelled-"+Date.now(),role:"system",content:"\u23F9 Run cancelled",timestamp:new Date,type:"cancelled"}]))}catch(_){console.error("[ChatWidget] Failed to cancel run:",_)}},[e,t,c]),U=X(()=>{i([]),l(null),m(null),p(!1),h(0),n?.set(e.conversationIdKey,null)},[e.conversationIdKey,n]),N=s=>{let _={id:de(),role:s.role,timestamp:s.timestamp?new Date(s.timestamp):new Date};if(s.role==="tool")return{..._,role:"system",content:"\u2713 Done",type:"tool_result",metadata:{result:s.content,toolCallId:s.toolCallId}};if(s.role==="assistant"&&s.toolCalls&&s.toolCalls.length>0)return s.toolCalls.map(S=>({id:de(),role:"assistant",content:`\u{1F527} ${S.function?.name||S.name||"tool"}`,timestamp:_.timestamp,type:"tool_call",metadata:{toolName:S.function?.name||S.name,arguments:S.function?.arguments||S.arguments,toolCallId:S.id}}));let C=typeof s.content=="string"?s.content:JSON.stringify(s.content);return s.role==="assistant"&&!C?.trim()?null:{..._,content:C,type:"message"}},P=X(async s=>{w(!0),i([]),l(s);try{let _=await t.getOrCreateSession(),S=`${e.backendUrl}${e.apiPaths.conversations}${s}/?limit=10&offset=0`,b=await fetch(S,t.getFetchOptions({method:"GET"},_));if(b.ok){let M=await b.json(),r=t.transformResponse(M);r.messages&&i(r.messages.flatMap(N).filter(Boolean)),p(r.hasMore||!1),h(r.messages?.length||0)}else b.status===404&&(l(null),n?.set(e.conversationIdKey,null))}catch(_){console.error("[ChatWidget] Failed to load conversation:",_)}finally{w(!1)}},[e,t,n]),L=X(async()=>{if(!(!f||y||!k)){g(!0);try{let s=await t.getOrCreateSession(),C=`${e.backendUrl}${e.apiPaths.conversations}${f}/?limit=10&offset=${u}`,S=await fetch(C,t.getFetchOptions({method:"GET"},s));if(S.ok){let b=await S.json(),M=t.transformResponse(b);if(M.messages?.length>0){let r=M.messages.flatMap(N).filter(Boolean);i(I=>[...r,...I]),h(I=>I+M.messages.length),p(M.hasMore||!1)}else p(!1)}}catch(s){console.error("[ChatWidget] Failed to load more messages:",s)}finally{g(!1)}}},[e,t,f,u,y,k]),z=X(async(s,_,C={})=>{if(c)return;let S=o[s];if(!S||S.role!=="user")return;let b=o.slice(0,s);i(b),await F(_,{...C,supersedeFromMessageIndex:s})},[o,c,F]),H=X(async(s,_={})=>{if(c)return;let C=o[s];if(!C)return;let S=s,b=C;if(C.role==="assistant"){for(let r=s-1;r>=0;r--)if(o[r].role==="user"){S=r,b=o[r];break}if(b.role!=="user")return}else if(C.role!=="user")return;let M=o.slice(0,S);i(M),await F(b.content,{..._,supersedeFromMessageIndex:S})},[o,c,F]);return je(()=>()=>{v.current&&v.current.close()},[]),{messages:o,isLoading:c,error:$,conversationId:f,hasMoreMessages:k,loadingMoreMessages:y,sendMessage:F,cancelRun:j,clearMessages:U,loadConversation:P,loadMoreMessages:L,setConversationId:l,editMessage:z,retryMessage:H}}import{useState as $e,useEffect as pt,useCallback as ze}from"preact/hooks";function Ve(e,t,n){let[o,i]=$e([]),[c,w]=$e(null),[$,m]=$e(null),[f,l]=$e(!1);pt(()=>{(async()=>{if(e.showModelSelector){l(!0);try{let g=await fetch(`${e.backendUrl}${e.apiPaths.models}`,t.getFetchOptions({method:"GET"}));if(g.ok){let u=await g.json(),h=u.models||[];i(h),m(u.default);let v=n?.get(e.modelKey);v&&h.some(T=>T.id===v)?w(v):w(u.default)}}catch(g){console.warn("[ChatWidget] Failed to load models:",g)}finally{l(!1)}}})()},[e.backendUrl,e.apiPaths.models,e.showModelSelector,e.modelKey,t,n]);let k=ze(y=>{w(y),n?.set(e.modelKey,y)},[e.modelKey,n]),p=ze(()=>o.find(y=>y.id===c)||null,[o,c]);return{availableModels:o,selectedModel:c,defaultModel:$,isLoading:f,selectModel:k,getSelectedModelInfo:p}}import{useState as Ce,useCallback as ee}from"preact/hooks";function qe(e,t){let[n,o]=Ce(null),[i,c]=Ce(!1),[w,$]=Ce(null),m=e.apiPaths?.tasks||"/api/agent/tasks/",f=ee(async()=>{c(!0),$(null);try{let u=`${e.backendUrl}${m}`,h=await fetch(u,t.getFetchOptions({method:"GET"}));if(h.ok){let v=await h.json();o(v)}else{let v=await h.json().catch(()=>({}));$(v.error||"Failed to load tasks")}}catch(u){console.error("[useTasks] Failed to load task list:",u),$("Failed to load tasks")}finally{c(!1)}},[e.backendUrl,m,t]),l=ee(async u=>{if(!n)return null;try{let h=`${e.backendUrl}${m}${n.id}/add_task/`,v=await fetch(h,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)}));if(v.ok){let T=await v.json();return await f(),T}else{let T=await v.json().catch(()=>({}));return $(T.error||"Failed to add task"),null}}catch(h){return console.error("[useTasks] Failed to add task:",h),$("Failed to add task"),null}},[e.backendUrl,m,n,t,f]),k=ee(async(u,h)=>{if(!n)return null;try{let v=`${e.backendUrl}${m}${n.id}/update_task/${u}/`,T=await fetch(v,t.getFetchOptions({method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(h)}));if(T.ok){let A=await T.json();return await f(),A}else{let A=await T.json().catch(()=>({}));return $(A.error||"Failed to update task"),null}}catch(v){return console.error("[useTasks] Failed to update task:",v),$("Failed to update task"),null}},[e.backendUrl,m,n,t,f]),p=ee(async u=>{if(!n)return!1;try{let h=`${e.backendUrl}${m}${n.id}/remove_task/${u}/`,v=await fetch(h,t.getFetchOptions({method:"DELETE"}));if(v.ok)return await f(),!0;{let T=await v.json().catch(()=>({}));return $(T.error||"Failed to remove task"),!1}}catch(h){return console.error("[useTasks] Failed to remove task:",h),$("Failed to remove task"),!1}},[e.backendUrl,m,n,t,f]),y=ee(async()=>{if(!n)return!1;try{let u=`${e.backendUrl}${m}${n.id}/clear/`,h=await fetch(u,t.getFetchOptions({method:"POST"}));if(h.ok)return await f(),!0;{let v=await h.json().catch(()=>({}));return $(v.error||"Failed to clear tasks"),!1}}catch(u){return console.error("[useTasks] Failed to clear tasks:",u),$("Failed to clear tasks"),!1}},[e.backendUrl,m,n,t,f]),g=ee(()=>$(null),[]);return{taskList:n,tasks:n?.tasks||[],progress:n?.progress||{total:0,completed:0,percent_complete:0},isLoading:i,error:w,loadTaskList:f,addTask:l,updateTask:k,removeTask:p,clearTasks:y,clearError:g}}function Ge(e,t,n){let o=l=>!l||typeof l!="object"||e.apiCaseStyle==="camel"?l:ce(l),i=l=>!l||typeof l!="object"||e.apiCaseStyle==="snake"?l:le(l),c=()=>e.authStrategy?e.authStrategy:e.authToken?"token":e.apiPaths.anonymousSession||e.anonymousSessionEndpoint?"anonymous":"none",w=(l=null)=>{let k=c(),p={},y=l||e.authToken||t().authToken;if(k==="token"&&y){let g=e.authHeader||"Authorization",u=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Token";p[g]=u?`${u} ${y}`:y}else if(k==="jwt"&&y){let g=e.authHeader||"Authorization",u=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Bearer";p[g]=u?`${u} ${y}`:y}else if(k==="anonymous"&&y){let g=e.authHeader||e.anonymousTokenHeader||"X-Anonymous-Token";p[g]=y}if(k==="session"){let g=Re(e.csrfCookieName);g&&(p["X-CSRFToken"]=g)}return p};return{getAuthStrategy:c,getAuthHeaders:w,getFetchOptions:(l={},k=null)=>{let p=c(),y={...l},g=w(k);return console.log("[ChatWidget] getFetchOptions - strategy:",p,"overrideToken:",k,"authHeaders:",g),y.headers={...y.headers,...g},p==="session"&&(y.credentials="include"),y},getOrCreateSession:async(l=!1)=>{let k=c(),p=t(),y=e.anonymousTokenKey||e.sessionTokenKey;if(k!=="anonymous")return e.authToken||p.authToken;if(!l){if(p.authToken)return p.authToken;let g=p.storage?.get(y);if(g)return n(u=>({...u,authToken:g})),g}try{let g=e.anonymousSessionEndpoint||e.apiPaths.anonymousSession,u=await fetch(`${e.backendUrl}${g}`,{method:"POST",headers:{"Content-Type":"application/json"}});if(u.ok){let h=await u.json();return n(v=>({...v,authToken:h.token})),p.storage?.set(y,h.token),h.token}}catch(g){console.warn("[ChatWidget] Failed to create session:",g)}return null},clearSession:()=>{let l=e.anonymousTokenKey||e.sessionTokenKey,k=t();n(p=>({...p,authToken:null})),k.storage?.set(l,null)},transformRequest:o,transformResponse:i}}function Ze({config:e,onStateChange:t,markdownParser:n,apiRef:o}){let[i,c]=W(e.embedded||e.forceOpen===!0),[w,$]=W(!1),[m,f]=W(!1),[l,k]=W(!1),[p,y]=W([]),[g,u]=W("chat"),[h,v]=W(!1),[T,A]=W(e.enableTTS),[F,j]=W(!1),[U,N]=W(null);ae(()=>{e.forceOpen!==void 0&&c(e.forceOpen)},[e.forceOpen]);let P=Xe(()=>xe(e.containerId),[e.containerId]),[L,z]=W(e.authToken||null),H=Xe(()=>Ge(e,()=>({authToken:L,storage:P}),K=>{let oe=K({authToken:L,storage:P});oe.authToken!==L&&z(oe.authToken)}),[e,L,P]),s=Je(e,H,P),_=Ve(e,H,P),C=qe(e,H);ae(()=>{for(let d=s.messages.length-1;d>=0;d--){let E=s.messages[d];if(E.type==="sub_agent_start"){N({key:E.metadata?.subAgentKey,name:E.metadata?.agentName});return}if(E.type==="sub_agent_end"){N(null);return}}},[s.messages]),ae(()=>{let d=P.get(e.conversationIdKey);d&&s.loadConversation(d)},[]),ae(()=>{t&&t({isOpen:i,isExpanded:w,debugMode:m,messages:s.messages,conversationId:s.conversationId,isLoading:s.isLoading,error:s.error})},[i,w,m,s.messages,s.conversationId,s.isLoading,s.error]);let S=te(async()=>{if(e.showConversationSidebar){v(!0);try{let d=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(e.agentKey)}`,E=await fetch(d,H.getFetchOptions({method:"GET"}));if(E.ok){let K=await E.json();y(K.results||K)}}catch(d){console.error("[ChatWidget] Failed to load conversations:",d),y([])}finally{v(!1)}}},[e,H]),b=te(()=>{let d=!l;k(d),d&&S()},[l,S]),M=te(d=>{d!==s.conversationId&&s.loadConversation(d),k(!1)},[s]),r=te(()=>{s.clearMessages(),k(!1)},[s]),I=te(d=>{s.sendMessage(d,{model:_.selectedModel,onAssistantMessage:E=>{}})},[s,T,_.selectedModel]),R=te(d=>{u(d),d==="tasks"&&C.loadTaskList()},[C]);if(ae(()=>{o&&(o.current={open:()=>c(!0),close:()=>c(!1),send:d=>I(d),clearMessages:()=>s.clearMessages(),toggleTTS:()=>A(d=>!d),stopSpeech:()=>j(!1),setAuth:d=>{d.token!==void 0&&z(d.token)},clearAuth:()=>z(null)})},[s,o,I]),!e.embedded&&!i)return J`
493
+ `}import{useState as ee,useCallback as Y,useRef as ze,useEffect as Ve}from"preact/hooks";function Ge(e,t,n){let[o,i]=ee([]),[l,h]=ee(!1),[u,m]=ee(null),[y,f]=ee(()=>n?.get(e.conversationIdKey)||null),[k,d]=ee(!1),[v,c]=ee(!1),[p,g]=ee(0),$=ze(null),S=ze(null);Ve(()=>{y&&n?.set(e.conversationIdKey,y)},[y,e.conversationIdKey,n]);let x=Y(async(s,C,T)=>{$.current&&$.current.close();let _=e.apiPaths.runEvents.replace("{runId}",s),b=`${e.backendUrl}${_}`;C&&(b+=`?anonymous_token=${encodeURIComponent(C)}`);let M=new EventSource(b);$.current=M;let r="";M.addEventListener("assistant.message",R=>{try{let a=JSON.parse(R.data);e.onEvent&&e.onEvent("assistant.message",a.payload);let I=a.payload.content;I&&(r+=I,i(w=>{let O=w[w.length-1];return O?.role==="assistant"&&O.id.startsWith("assistant-stream-")?[...w.slice(0,-1),{...O,content:r}]:[...w,{id:"assistant-stream-"+Date.now(),role:"assistant",content:r,timestamp:new Date,type:"message"}]}))}catch(a){console.error("[ChatWidget] Parse error:",a)}}),M.addEventListener("tool.call",R=>{try{let a=JSON.parse(R.data);e.onEvent&&e.onEvent("tool.call",a.payload),i(I=>[...I,{id:"tool-call-"+Date.now(),role:"assistant",content:`\u{1F527} ${a.payload.name}`,timestamp:new Date,type:"tool_call",metadata:{toolName:a.payload.name,arguments:a.payload.arguments,toolCallId:a.payload.id}}])}catch(a){console.error("[ChatWidget] Parse error:",a)}}),M.addEventListener("tool.result",R=>{try{let a=JSON.parse(R.data);e.onEvent&&e.onEvent("tool.result",a.payload);let I=a.payload.result,w=I?.error;i(O=>[...O,{id:"tool-result-"+Date.now(),role:"system",content:w?`\u274C ${I.error}`:"\u2713 Done",timestamp:new Date,type:"tool_result",metadata:{toolName:a.payload.name,result:I,toolCallId:a.payload.tool_call_id}}])}catch(a){console.error("[ChatWidget] Parse error:",a)}}),M.addEventListener("custom",R=>{try{let a=JSON.parse(R.data);e.onEvent&&e.onEvent("custom",a.payload),a.payload?.type==="ui_control"&&e.onUIControl&&e.onUIControl(a.payload),a.payload?.type==="agent_context"&&i(I=>[...I,{id:"agent-context-"+Date.now(),role:"system",content:`\u{1F517} ${a.payload.agent_name||"Sub-agent"} is now handling this request`,timestamp:new Date,type:"agent_context",metadata:{agentKey:a.payload.agent_key,agentName:a.payload.agent_name,action:a.payload.action}}])}catch(a){console.error("[ChatWidget] Parse error:",a)}}),M.addEventListener("sub_agent.start",R=>{try{let a=JSON.parse(R.data);e.onEvent&&e.onEvent("sub_agent.start",a.payload),i(I=>[...I,{id:"sub-agent-start-"+Date.now(),role:"system",content:`\u{1F517} Delegating to ${a.payload.agent_name||a.payload.sub_agent_key||"sub-agent"}...`,timestamp:new Date,type:"sub_agent_start",metadata:{subAgentKey:a.payload.sub_agent_key,agentName:a.payload.agent_name,invocationMode:a.payload.invocation_mode}}])}catch(a){console.error("[ChatWidget] Parse error:",a)}}),M.addEventListener("sub_agent.end",R=>{try{let a=JSON.parse(R.data);e.onEvent&&e.onEvent("sub_agent.end",a.payload),i(I=>[...I,{id:"sub-agent-end-"+Date.now(),role:"system",content:`\u2713 ${a.payload.agent_name||"Sub-agent"} completed`,timestamp:new Date,type:"sub_agent_end",metadata:{subAgentKey:a.payload.sub_agent_key,agentName:a.payload.agent_name}}])}catch(a){console.error("[ChatWidget] Parse error:",a)}});let E=R=>{try{let a=JSON.parse(R.data);if(e.onEvent&&e.onEvent(a.type,a.payload),a.type==="run.failed"){let I=a.payload.error||"Agent run failed";m(I),i(w=>[...w,{id:"error-"+Date.now(),role:"system",content:`\u274C Error: ${I}`,timestamp:new Date,type:"error"}])}}catch(a){console.error("[ChatWidget] Parse error:",a)}h(!1),M.close(),$.current=null,r&&T&&T(r)};M.addEventListener("run.succeeded",E),M.addEventListener("run.failed",E),M.addEventListener("run.cancelled",E),M.addEventListener("run.timed_out",E),M.onerror=()=>{h(!1),M.close(),$.current=null}},[e]),P=Y(async(s,C={},T={})=>{if(!s.trim()||l)return;let _=[],b={};typeof C=="function"?b={onAssistantMessage:C}:Array.isArray(C)?(_=C,b=T):b=C||{};let{model:M,thinking:r,onAssistantMessage:E,supersedeFromMessageIndex:R}=b;h(!0),m(null);let a={id:he(),role:"user",content:s.trim(),timestamp:new Date,type:"message",files:_.length>0?_.map(I=>({name:I.name,size:I.size,type:I.type})):void 0};i(I=>[...I,a]);try{let I=await t.getOrCreateSession(),w;if(_.length>0){let U=e.apiCaseStyle!=="camel",Ie=de=>U?ve(de):de,q=new FormData;q.append(Ie("agentKey"),e.agentKey),y&&q.append(Ie("conversationId"),y),q.append("messages",JSON.stringify([{role:"user",content:s.trim()}])),q.append("metadata",JSON.stringify(U?{...e.metadata,journey_type:e.defaultJourneyType}:{...e.metadata,journeyType:e.defaultJourneyType})),M&&q.append("model",M),r&&q.append("thinking","true"),_.forEach(de=>{q.append("files",de)}),w=t.getFetchOptions({method:"POST",body:q},I)}else{let U=t.transformRequest({agentKey:e.agentKey,conversationId:y,messages:[{role:"user",content:s.trim()}],metadata:{...e.metadata,journeyType:e.defaultJourneyType},...M&&{model:M},...r&&{thinking:!0},...R!==void 0&&{supersedeFromMessageIndex:R}});w=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(U)},I)}let O=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,w),Z=I;if(O.status===401){t.clearSession();let U=await t.getOrCreateSession(!0);U&&(Z=U,_.length>0?w=t.getFetchOptions({method:"POST",body:w.body},U):w=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:w.body},U),O=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,w))}if(!O.ok){let U=await O.json().catch(()=>({}));throw new Error(U.error||U.detail||`HTTP ${O.status}`)}let le=await O.json(),ce=t.transformResponse(le);S.current=ce.id,!y&&ce.conversationId&&f(ce.conversationId),await x(ce.id,Z,E)}catch(I){m(I.message||"Failed to send message"),h(!1)}finally{S.current=null}},[e,t,y,l,x]),L=Y(async()=>{let s=S.current;if(!(!s||!l))try{let C=e.apiPaths.cancelRun?e.apiPaths.cancelRun.replace("{runId}",s):`${e.apiPaths.runs}${s}/cancel/`;(await fetch(`${e.backendUrl}${C}`,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"}}))).ok&&($.current&&($.current.close(),$.current=null),h(!1),S.current=null,i(_=>[..._,{id:"cancelled-"+Date.now(),role:"system",content:"\u23F9 Run cancelled",timestamp:new Date,type:"cancelled"}]))}catch(C){console.error("[ChatWidget] Failed to cancel run:",C)}},[e,t,l]),H=Y(()=>{i([]),f(null),m(null),d(!1),g(0),n?.set(e.conversationIdKey,null)},[e.conversationIdKey,n]),K=s=>{let C={id:he(),role:s.role,timestamp:s.timestamp?new Date(s.timestamp):new Date};if(s.role==="tool")return{...C,role:"system",content:"\u2713 Done",type:"tool_result",metadata:{result:s.content,toolCallId:s.toolCallId}};if(s.role==="assistant"&&s.toolCalls&&s.toolCalls.length>0)return s.toolCalls.map(_=>({id:he(),role:"assistant",content:`\u{1F527} ${_.function?.name||_.name||"tool"}`,timestamp:C.timestamp,type:"tool_call",metadata:{toolName:_.function?.name||_.name,arguments:_.function?.arguments||_.arguments,toolCallId:_.id}}));let T=typeof s.content=="string"?s.content:JSON.stringify(s.content);return s.role==="assistant"&&!T?.trim()?null:{...C,content:T,type:"message"}},N=Y(async s=>{console.log("[ChatWidget] loadConversation called with:",s),h(!0),i([]),f(s);try{let C=await t.getOrCreateSession(),_=`${e.backendUrl}${e.apiPaths.conversations}${s}/?limit=10&offset=0`;console.log("[ChatWidget] Fetching conversation from:",_);let b=await fetch(_,t.getFetchOptions({method:"GET"},C));if(console.log("[ChatWidget] Response status:",b.status),b.ok){let M=await b.json();console.log("[ChatWidget] Raw conversation:",M);let r=t.transformResponse(M);if(console.log("[ChatWidget] Transformed conversation:",r),r.messages){let E=r.messages.flatMap(K).filter(Boolean);console.log("[ChatWidget] Mapped messages:",E),i(E)}d(r.hasMore||!1),g(r.messages?.length||0)}else b.status===404?(console.log("[ChatWidget] Conversation not found, clearing"),f(null),n?.set(e.conversationIdKey,null)):console.error("[ChatWidget] Unexpected response status:",b.status)}catch(C){console.error("[ChatWidget] Failed to load conversation:",C)}finally{h(!1)}},[e,t,n]),W=Y(async()=>{if(!(!y||v||!k)){c(!0);try{let s=await t.getOrCreateSession(),T=`${e.backendUrl}${e.apiPaths.conversations}${y}/?limit=10&offset=${p}`,_=await fetch(T,t.getFetchOptions({method:"GET"},s));if(_.ok){let b=await _.json(),M=t.transformResponse(b);if(M.messages?.length>0){let r=M.messages.flatMap(K).filter(Boolean);i(E=>[...r,...E]),g(E=>E+M.messages.length),d(M.hasMore||!1)}else d(!1)}}catch(s){console.error("[ChatWidget] Failed to load more messages:",s)}finally{c(!1)}}},[e,t,y,p,v,k]),z=Y(async(s,C,T={})=>{if(l)return;let _=o[s];if(!_||_.role!=="user")return;let b=o.slice(0,s);i(b),await P(C,{...T,supersedeFromMessageIndex:s})},[o,l,P]),B=Y(async(s,C={})=>{if(l)return;let T=o[s];if(!T)return;let _=s,b=T;if(T.role==="assistant"){for(let r=s-1;r>=0;r--)if(o[r].role==="user"){_=r,b=o[r];break}if(b.role!=="user")return}else if(T.role!=="user")return;let M=o.slice(0,_);i(M),await P(b.content,{...C,supersedeFromMessageIndex:_})},[o,l,P]);return Ve(()=>()=>{$.current&&$.current.close()},[]),{messages:o,isLoading:l,error:u,conversationId:y,hasMoreMessages:k,loadingMoreMessages:v,sendMessage:P,cancelRun:L,clearMessages:H,loadConversation:N,loadMoreMessages:W,setConversationId:f,editMessage:z,retryMessage:B}}import{useState as re,useEffect as gt,useCallback as we}from"preact/hooks";var qe="cw_thinking_enabled";function Xe(e,t,n){let[o,i]=re([]),[l,h]=re(null),[u,m]=re(null),[y,f]=re(!1),[k,d]=re(!1);gt(()=>{(async()=>{if(e.showModelSelector){f(!0);try{let S=await fetch(`${e.backendUrl}${e.apiPaths.models}`,t.getFetchOptions({method:"GET"}));if(S.ok){let x=await S.json(),P=x.models||[];i(P),m(x.default);let L=n?.get(e.modelKey);L&&P.some(K=>K.id===L)?h(L):h(x.default),n?.get(qe)==="true"&&d(!0)}}catch(S){console.warn("[ChatWidget] Failed to load models:",S)}finally{f(!1)}}})()},[e.backendUrl,e.apiPaths.models,e.showModelSelector,e.modelKey,t,n]);let v=we($=>{h($),n?.set(e.modelKey,$)},[e.modelKey,n]),c=we($=>{d($),n?.set(qe,$?"true":"false")},[n]),p=we(()=>o.find($=>$.id===l)||null,[o,l]),g=we(()=>p()?.supports_thinking||!1,[p]);return{availableModels:o,selectedModel:l,defaultModel:u,isLoading:y,selectModel:v,getSelectedModelInfo:p,thinkingEnabled:k,toggleThinking:c,supportsThinking:g}}import{useState as Te,useCallback as ne}from"preact/hooks";function Ye(e,t){let[n,o]=Te(null),[i,l]=Te(!1),[h,u]=Te(null),m=e.apiPaths?.tasks||"/api/agent/tasks/",y=ne(async()=>{l(!0),u(null);try{let p=`${e.backendUrl}${m}`,g=await fetch(p,t.getFetchOptions({method:"GET"}));if(g.ok){let $=await g.json();o($)}else{let $=await g.json().catch(()=>({}));u($.error||"Failed to load tasks")}}catch(p){console.error("[useTasks] Failed to load task list:",p),u("Failed to load tasks")}finally{l(!1)}},[e.backendUrl,m,t]),f=ne(async p=>{if(!n)return null;try{let g=`${e.backendUrl}${m}${n.id}/add_task/`,$=await fetch(g,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(p)}));if($.ok){let S=await $.json();return await y(),S}else{let S=await $.json().catch(()=>({}));return u(S.error||"Failed to add task"),null}}catch(g){return console.error("[useTasks] Failed to add task:",g),u("Failed to add task"),null}},[e.backendUrl,m,n,t,y]),k=ne(async(p,g)=>{if(!n)return null;try{let $=`${e.backendUrl}${m}${n.id}/update_task/${p}/`,S=await fetch($,t.getFetchOptions({method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)}));if(S.ok){let x=await S.json();return await y(),x}else{let x=await S.json().catch(()=>({}));return u(x.error||"Failed to update task"),null}}catch($){return console.error("[useTasks] Failed to update task:",$),u("Failed to update task"),null}},[e.backendUrl,m,n,t,y]),d=ne(async p=>{if(!n)return!1;try{let g=`${e.backendUrl}${m}${n.id}/remove_task/${p}/`,$=await fetch(g,t.getFetchOptions({method:"DELETE"}));if($.ok)return await y(),!0;{let S=await $.json().catch(()=>({}));return u(S.error||"Failed to remove task"),!1}}catch(g){return console.error("[useTasks] Failed to remove task:",g),u("Failed to remove task"),!1}},[e.backendUrl,m,n,t,y]),v=ne(async()=>{if(!n)return!1;try{let p=`${e.backendUrl}${m}${n.id}/clear/`,g=await fetch(p,t.getFetchOptions({method:"POST"}));if(g.ok)return await y(),!0;{let $=await g.json().catch(()=>({}));return u($.error||"Failed to clear tasks"),!1}}catch(p){return console.error("[useTasks] Failed to clear tasks:",p),u("Failed to clear tasks"),!1}},[e.backendUrl,m,n,t,y]),c=ne(()=>u(null),[]);return{taskList:n,tasks:n?.tasks||[],progress:n?.progress||{total:0,completed:0,percent_complete:0},isLoading:i,error:h,loadTaskList:y,addTask:f,updateTask:k,removeTask:d,clearTasks:v,clearError:c}}function Ze(e,t,n){let o=f=>!f||typeof f!="object"||e.apiCaseStyle==="camel"?f:pe(f),i=f=>!f||typeof f!="object"||e.apiCaseStyle==="snake"?f:ue(f),l=()=>e.authStrategy?e.authStrategy:e.authToken?"token":e.apiPaths.anonymousSession||e.anonymousSessionEndpoint?"anonymous":"none",h=(f=null)=>{let k=l(),d={},v=f||e.authToken||t().authToken;if(k==="token"&&v){let c=e.authHeader||"Authorization",p=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Token";d[c]=p?`${p} ${v}`:v}else if(k==="jwt"&&v){let c=e.authHeader||"Authorization",p=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Bearer";d[c]=p?`${p} ${v}`:v}else if(k==="anonymous"&&v){let c=e.authHeader||e.anonymousTokenHeader||"X-Anonymous-Token";d[c]=v}if(k==="session"){let c=Oe(e.csrfCookieName);c&&(d["X-CSRFToken"]=c)}return d};return{getAuthStrategy:l,getAuthHeaders:h,getFetchOptions:(f={},k=null)=>{let d=l(),v={...f},c=h(k);return console.log("[ChatWidget] getFetchOptions - strategy:",d,"overrideToken:",k,"authHeaders:",c),v.headers={...v.headers,...c},d==="session"&&(v.credentials="include"),v},getOrCreateSession:async(f=!1)=>{let k=l(),d=t(),v=e.anonymousTokenKey||e.sessionTokenKey;if(k!=="anonymous")return e.authToken||d.authToken;if(!f){if(d.authToken)return d.authToken;let c=d.storage?.get(v);if(c)return n(p=>({...p,authToken:c})),c}try{let c=e.anonymousSessionEndpoint||e.apiPaths.anonymousSession,p=await fetch(`${e.backendUrl}${c}`,{method:"POST",headers:{"Content-Type":"application/json"}});if(p.ok){let g=await p.json();return n($=>({...$,authToken:g.token})),d.storage?.set(v,g.token),g.token}}catch(c){console.warn("[ChatWidget] Failed to create session:",c)}return null},clearSession:()=>{let f=e.anonymousTokenKey||e.sessionTokenKey,k=t();n(d=>({...d,authToken:null})),k.storage?.set(f,null)},transformRequest:o,transformResponse:i}}function et({config:e,onStateChange:t,markdownParser:n,apiRef:o}){console.log("[ChatWidget] Config:",{showConversationSidebar:e.showConversationSidebar,apiPaths:e.apiPaths});let[i,l]=j(e.embedded||e.forceOpen===!0),[h,u]=j(!1),[m,y]=j(!1),[f,k]=j(!1),[d,v]=j([]),[c,p]=j("chat"),[g,$]=j(!1),[S,x]=j(e.enableTTS),[P,L]=j(!1),[H,K]=j(null);ie(()=>{e.forceOpen!==void 0&&l(e.forceOpen)},[e.forceOpen]);let N=Qe(()=>Ae(e.containerId),[e.containerId]),[W,z]=j(e.authToken||null),B=Qe(()=>Ze(e,()=>({authToken:W,storage:N}),Z=>{let le=Z({authToken:W,storage:N});le.authToken!==W&&z(le.authToken)}),[e,W,N]),s=Ge(e,B,N),C=Xe(e,B,N),T=Ye(e,B);ie(()=>{for(let w=s.messages.length-1;w>=0;w--){let O=s.messages[w];if(O.type==="sub_agent_start"){K({key:O.metadata?.subAgentKey,name:O.metadata?.agentName});return}if(O.type==="sub_agent_end"){K(null);return}}},[s.messages]),ie(()=>{let w=N.get(e.conversationIdKey);console.log("[ChatWidget] Initial load - storedConvId:",w,"key:",e.conversationIdKey),console.log("[ChatWidget] apiPaths.conversations:",e.apiPaths.conversations),w&&(console.log("[ChatWidget] Loading conversation:",w),s.loadConversation(w))},[]),ie(()=>{t&&t({isOpen:i,isExpanded:h,debugMode:m,messages:s.messages,conversationId:s.conversationId,isLoading:s.isLoading,error:s.error})},[i,h,m,s.messages,s.conversationId,s.isLoading,s.error]);let _=se(async()=>{if(e.showConversationSidebar){$(!0);try{let w=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(e.agentKey)}`,O=await fetch(w,B.getFetchOptions({method:"GET"}));if(O.ok){let Z=await O.json();v(Z.results||Z)}}catch(w){console.error("[ChatWidget] Failed to load conversations:",w),v([])}finally{$(!1)}}},[e,B]),b=se(()=>{let w=!f;k(w),w&&_()},[f,_]),M=se(w=>{w!==s.conversationId&&s.loadConversation(w),k(!1)},[s]),r=se(()=>{s.clearMessages(),k(!1)},[s]),E=se(w=>{s.sendMessage(w,{model:C.selectedModel,thinking:C.thinkingEnabled&&C.supportsThinking(),onAssistantMessage:O=>{}})},[s,S,C.selectedModel,C.thinkingEnabled,C.supportsThinking]),R=se(w=>{p(w),w==="tasks"&&T.loadTaskList()},[T]);if(ie(()=>{o&&(o.current={open:()=>l(!0),close:()=>l(!1),send:w=>E(w),clearMessages:()=>s.clearMessages(),toggleTTS:()=>x(w=>!w),stopSpeech:()=>L(!1),setAuth:w=>{w.token!==void 0&&z(w.token)},clearAuth:()=>z(null)})},[s,o,E]),!e.embedded&&!i)return J`
480
494
  <button
481
495
  class="cw-fab"
482
496
  style=${{backgroundColor:e.primaryColor}}
483
- onClick=${()=>c(!0)}
497
+ onClick=${()=>l(!0)}
484
498
  >
485
499
  <svg class="cw-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
486
500
  <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>
487
501
  </svg>
488
502
  </button>
489
- `;let a=["cw-widget",w&&"cw-widget-expanded",e.embedded&&"cw-widget-embedded"].filter(Boolean).join(" ");return J`
490
- <div class=${a} style=${{"--cw-primary":e.primaryColor}}>
503
+ `;let a=["cw-widget",h&&"cw-widget-expanded",e.embedded&&"cw-widget-embedded"].filter(Boolean).join(" "),I=e.headerTextColor||Fe(e.primaryColor);return J`
504
+ <div class=${a} style=${{"--cw-primary":e.primaryColor,"--cw-header-text":I}}>
491
505
  ${e.showConversationSidebar&&J`
492
- <${Ne}
493
- isOpen=${l}
494
- conversations=${p}
495
- conversationsLoading=${h}
506
+ <${Be}
507
+ isOpen=${f}
508
+ conversations=${d}
509
+ conversationsLoading=${g}
496
510
  currentConversationId=${s.conversationId}
497
511
  onClose=${()=>k(!1)}
498
512
  onNewConversation=${r}
@@ -500,18 +514,18 @@ var nt=Object.defineProperty;var st=(e,t,n)=>t in e?nt(e,t,{enumerable:!0,config
500
514
  />
501
515
  `}
502
516
 
503
- <${Ae}
517
+ <${De}
504
518
  config=${e}
505
519
  debugMode=${m}
506
- isExpanded=${w}
507
- isSpeaking=${F}
520
+ isExpanded=${h}
521
+ isSpeaking=${P}
508
522
  messagesCount=${s.messages.length}
509
523
  isLoading=${s.isLoading}
510
- currentAgent=${U}
511
- onClose=${()=>c(!1)}
512
- onToggleExpand=${()=>$(!w)}
513
- onToggleDebug=${()=>f(!m)}
514
- onToggleTTS=${()=>A(!T)}
524
+ currentAgent=${H}
525
+ onClose=${()=>l(!1)}
526
+ onToggleExpand=${()=>u(!h)}
527
+ onToggleDebug=${()=>y(!m)}
528
+ onToggleTTS=${()=>x(!S)}
515
529
  onClear=${s.clearMessages}
516
530
  onToggleSidebar=${b}
517
531
  />
@@ -519,24 +533,24 @@ var nt=Object.defineProperty;var st=(e,t,n)=>t in e?nt(e,t,{enumerable:!0,config
519
533
  ${e.showTasksTab!==!1&&J`
520
534
  <div class="cw-tabs">
521
535
  <button
522
- class=${`cw-tab ${g==="chat"?"cw-tab-active":""}`}
536
+ class=${`cw-tab ${c==="chat"?"cw-tab-active":""}`}
523
537
  onClick=${()=>R("chat")}
524
538
  >
525
539
  Chat
526
540
  </button>
527
541
  <button
528
- class=${`cw-tab ${g==="tasks"?"cw-tab-active":""}`}
542
+ class=${`cw-tab ${c==="tasks"?"cw-tab-active":""}`}
529
543
  onClick=${()=>R("tasks")}
530
544
  >
531
- Tasks ${C.progress.total>0?J`<span class="cw-tab-badge">${C.progress.completed}/${C.progress.total}</span>`:""}
545
+ Tasks ${T.progress.total>0?J`<span class="cw-tab-badge">${T.progress.completed}/${T.progress.total}</span>`:""}
532
546
  </button>
533
547
  </div>
534
548
  `}
535
549
 
536
550
  ${m&&J`<div class="cw-status-bar"><span>🐛 Debug</span></div>`}
537
551
 
538
- ${g==="chat"?J`
539
- <${Le}
552
+ ${c==="chat"?J`
553
+ <${We}
540
554
  messages=${s.messages}
541
555
  isLoading=${s.isLoading}
542
556
  hasMoreMessages=${s.hasMoreMessages}
@@ -552,17 +566,19 @@ var nt=Object.defineProperty;var st=(e,t,n)=>t in e?nt(e,t,{enumerable:!0,config
552
566
 
553
567
  ${s.error&&J`<div class="cw-error-bar">${s.error}</div>`}
554
568
 
555
- ${e.showModelSelector&&_.availableModels.length>0&&J`
556
- <${He}
557
- availableModels=${_.availableModels}
558
- selectedModel=${_.selectedModel}
559
- onSelectModel=${_.selectModel}
569
+ ${e.showModelSelector&&C.availableModels.length>0&&J`
570
+ <${Ue}
571
+ availableModels=${C.availableModels}
572
+ selectedModel=${C.selectedModel}
573
+ onSelectModel=${C.selectModel}
574
+ thinkingEnabled=${C.thinkingEnabled}
575
+ onToggleThinking=${C.toggleThinking}
560
576
  disabled=${s.isLoading}
561
577
  />
562
578
  `}
563
579
 
564
- <${Ke}
565
- onSend=${I}
580
+ <${He}
581
+ onSend=${E}
566
582
  onCancel=${s.cancelRun}
567
583
  isLoading=${s.isLoading}
568
584
  placeholder=${e.placeholder}
@@ -570,21 +586,21 @@ var nt=Object.defineProperty;var st=(e,t,n)=>t in e?nt(e,t,{enumerable:!0,config
570
586
  enableVoice=${e.enableVoice}
571
587
  />
572
588
  `:J`
573
- <${Ue}
574
- tasks=${C.tasks}
575
- progress=${C.progress}
576
- isLoading=${C.isLoading}
577
- error=${C.error}
578
- onUpdate=${C.updateTask}
579
- onRemove=${C.removeTask}
580
- onClear=${C.clearTasks}
581
- onRefresh=${C.loadTaskList}
589
+ <${Je}
590
+ tasks=${T.tasks}
591
+ progress=${T.progress}
592
+ isLoading=${T.isLoading}
593
+ error=${T.error}
594
+ onUpdate=${T.updateTask}
595
+ onRemove=${T.removeTask}
596
+ onClear=${T.clearTasks}
597
+ onRefresh=${T.loadTaskList}
582
598
  />
583
599
  `}
584
600
  </div>
585
- `}var Qe={backendUrl:"http://localhost:8000",agentKey:"default-agent",title:"Chat Assistant",subtitle:"How can we help you today?",primaryColor:"#0066cc",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/"},apiCaseStyle:"auto",showConversationSidebar:!0,showClearButton:!0,showDebugButton:!0,showTTSButton:!0,showVoiceSettings:!0,showExpandButton:!0,showModelSelector:!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 Ye(e){let t={...Qe.apiPaths,...e.apiPaths||{}};return{...Qe,...e,apiPaths:t}}var ye=new Map,mt=0,x=null,Se=class{constructor(t={}){Me(this,"_handleStateChange",t=>{this._state=t});this.instanceId=`cw-${++mt}`,this.config=Ye(t),this.container=null,this._state={},this._apiRef={current:null},ye.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._render(),console.log(`[ChatWidget] Instance ${this.instanceId} initialized`),this}_render(t={}){this.container&&et(ht`<${Ze}
601
+ `}var tt={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/"},apiCaseStyle:"auto",showConversationSidebar:!0,showClearButton:!0,showDebugButton:!0,showTTSButton:!0,showVoiceSettings:!0,showExpandButton:!0,showModelSelector:!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 nt(e){let t={...tt.apiPaths,...e.apiPaths||{}};return{...tt,...e,apiPaths:t}}var ke=new Map,yt=0,A=null,_e=class{constructor(t={}){Ee(this,"_handleStateChange",t=>{this._state=t});this.instanceId=`cw-${++yt}`,this.config=nt(t),this.container=null,this._state={},this._apiRef={current:null},ke.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._render(),console.log(`[ChatWidget] Instance ${this.instanceId} initialized`),this}_render(t={}){this.container&&st($t`<${et}
586
602
  config=${{...this.config,...t}}
587
603
  onStateChange=${this._handleStateChange}
588
- markdownParser=${Te._enhancedMarkdownParser}
604
+ markdownParser=${Me._enhancedMarkdownParser}
589
605
  apiRef=${this._apiRef}
590
- />`,this.container)}destroy(){this.container&&(et(null,this.container),this.config.containerId?this.container.classList.remove("cw-container-embedded"):this.container.remove(),this.container=null),ye.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},this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} config updated`)}};function tt(e={}){return new Se(e).init()}function ft(e={}){return x&&x.destroy(),x=tt(e),x}function gt(){x&&(x.destroy(),x=null)}function $t(){x&&x.open()}function yt(){x&&x.close()}function wt(e){x&&x.send(e)}function vt(){x&&x.clearMessages()}function kt(){x&&x.toggleTTS()}function bt(){x&&x.stopSpeech()}function Ct(e){x&&x.setAuth(e)}function St(){x&&x.clearAuth()}function Tt(){return x?x.getState():null}function _t(){return x?x.getConfig():null}var Te={createInstance:tt,getInstance:e=>ye.get(e),getAllInstances:()=>Array.from(ye.values()),init:ft,destroy:gt,open:$t,close:yt,send:wt,clearMessages:vt,toggleTTS:kt,stopSpeech:bt,setAuth:Ct,clearAuth:St,getState:Tt,getConfig:_t,_enhancedMarkdownParser:null};var An=Te;typeof window<"u"&&(window.ChatWidget=Te);export{Te as ChatWidget,An as default};
606
+ />`,this.container)}destroy(){this.container&&(st(null,this.container),this.config.containerId?this.container.classList.remove("cw-container-embedded"):this.container.remove(),this.container=null),ke.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},this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} config updated`)}};function at(e={}){return new _e(e).init()}function wt(e={}){return A&&A.destroy(),A=at(e),A}function kt(){A&&(A.destroy(),A=null)}function vt(){A&&A.open()}function bt(){A&&A.close()}function Ct(e){A&&A.send(e)}function St(){A&&A.clearMessages()}function Tt(){A&&A.toggleTTS()}function _t(){A&&A.stopSpeech()}function Mt(e){A&&A.setAuth(e)}function It(){A&&A.clearAuth()}function Et(){return A?A.getState():null}function xt(){return A?A.getConfig():null}var Me={createInstance:at,getInstance:e=>ke.get(e),getAllInstances:()=>Array.from(ke.values()),init:wt,destroy:kt,open:vt,close:bt,send:Ct,clearMessages:St,toggleTTS:Tt,stopSpeech:_t,setAuth:Mt,clearAuth:It,getState:Et,getConfig:xt,_enhancedMarkdownParser:null};var Pn=Me;typeof window<"u"&&(window.ChatWidget=Me);export{Me as ChatWidget,Pn as default};