@makemore/agent-frontend 2.11.0 → 2.11.1

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,9 +1,9 @@
1
- var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Object.getOwnPropertyNames;var pt=Object.prototype.hasOwnProperty;var ht=(e,t,s)=>t in e?ke(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var mt=(e,t)=>{for(var s in t)ke(e,s,{get:t[s],enumerable:!0})},gt=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ut(t))!pt.call(e,a)&&a!==s&&ke(e,a,{get:()=>t[a],enumerable:!(n=dt(t,a))||n.enumerable});return e};var ft=e=>gt(ke({},"__esModule",{value:!0}),e);var Ye=(e,t,s)=>(ht(e,typeof t!="symbol"?t+"":t,s),s);var Jt={};mt(Jt,{ChatWidget:()=>$e,ChatWidgetAPI:()=>He,DEFAULT_CONFIG:()=>Ne,Header:()=>_e,InputForm:()=>Ie,Message:()=>Ee,MessageList:()=>xe,ModelSelector:()=>Re,Sidebar:()=>Ae,TaskList:()=>De,camelToSnake:()=>ye,createApiClient:()=>Ke,createStorage:()=>Se,default:()=>jt,formatDate:()=>be,formatFileSize:()=>me,generateId:()=>he,getCSRFToken:()=>Te,getFileTypeIcon:()=>ge,keysToCamel:()=>ue,keysToSnake:()=>pe,mergeConfig:()=>We,parseMarkdown:()=>Ce,snakeToCamel:()=>Ve,useChat:()=>Fe,useModels:()=>Oe,useTasks:()=>Pe});module.exports=ft(Jt);var Q=require("htm/preact"),D=require("preact/compat");var oe=require("htm/preact");function Ve(e){return e.replace(/_([a-z])/g,(t,s)=>s.toUpperCase())}function ye(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,s])=>[Ve(t),ue(s)])):e}function pe(e){return Array.isArray(e)?e.map(pe):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[ye(t),pe(s)])):e}function he(){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 be(e){if(!e)return"";try{let t=new Date(e),n=new Date-t,a=Math.floor(n/6e4),r=Math.floor(n/36e5),y=Math.floor(n/864e5);return a<1?"Just now":a<60?`${a}m ago`:r<24?`${r}h ago`:y<7?`${y}d ago`:t.toLocaleDateString()}catch{return""}}function Ce(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 Se(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 Te(e="csrftoken"){let t=document.cookie.split(";");for(let n of t){let[a,r]=n.trim().split("=");if(a===e)return decodeURIComponent(r)}let s=document.querySelector('meta[name="csrf-token"]');return s?s.getAttribute("content"):null}function me(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 ge(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 $t(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,r=parseInt(s.substr(4,2),16)/255,y=i=>i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4);return .2126*y(n)+.7152*y(a)+.0722*y(r)}function Xe(e){return $t(e)>.179?"#000000":"#ffffff"}function _e({config:e,debugMode:t,isExpanded:s,isSpeaking:n,messagesCount:a,isLoading:r,currentAgent:y,onClose:i,onToggleExpand:$,onToggleDebug:g,onToggleTTS:u,onClear:b,onToggleSidebar:c}){let{title:C,primaryColor:l,embedded:f,showConversationSidebar:w,showClearButton:v,showDebugButton:_,enableDebugMode:m,showTTSButton:V,showExpandButton:z,enableTTS:A,elevenLabsApiKey:O,ttsProxyUrl:P}=e,K=O||P;return oe.html`
2
- <div class="cw-header" style=${{backgroundColor:l}}>
3
- ${w&&oe.html`
1
+ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Object.getOwnPropertyNames;var pt=Object.prototype.hasOwnProperty;var ht=(e,t,s)=>t in e?ke(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var mt=(e,t)=>{for(var s in t)ke(e,s,{get:t[s],enumerable:!0})},gt=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ut(t))!pt.call(e,o)&&o!==s&&ke(e,o,{get:()=>t[o],enumerable:!(n=dt(t,o))||n.enumerable});return e};var ft=e=>gt(ke({},"__esModule",{value:!0}),e);var Ye=(e,t,s)=>(ht(e,typeof t!="symbol"?t+"":t,s),s);var Jt={};mt(Jt,{ChatWidget:()=>$e,ChatWidgetAPI:()=>He,DEFAULT_CONFIG:()=>Ne,Header:()=>_e,InputForm:()=>Ie,Message:()=>Ee,MessageList:()=>xe,ModelSelector:()=>Re,Sidebar:()=>Ae,TaskList:()=>De,camelToSnake:()=>ye,createApiClient:()=>Ke,createStorage:()=>Se,default:()=>jt,formatDate:()=>be,formatFileSize:()=>me,generateId:()=>he,getCSRFToken:()=>Te,getFileTypeIcon:()=>ge,keysToCamel:()=>ue,keysToSnake:()=>pe,mergeConfig:()=>We,parseMarkdown:()=>Ce,snakeToCamel:()=>Ve,useChat:()=>Fe,useModels:()=>Oe,useTasks:()=>Pe});module.exports=ft(Jt);var Q=require("htm/preact"),D=require("preact/compat");var oe=require("htm/preact");function Ve(e){return e.replace(/_([a-z])/g,(t,s)=>s.toUpperCase())}function ye(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,s])=>[Ve(t),ue(s)])):e}function pe(e){return Array.isArray(e)?e.map(pe):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[ye(t),pe(s)])):e}function he(){return"msg-"+Date.now()+"-"+Math.random().toString(36).substr(2,9)}function V(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function be(e){if(!e)return"";try{let t=new Date(e),n=new Date-t,o=Math.floor(n/6e4),l=Math.floor(n/36e5),y=Math.floor(n/864e5);return o<1?"Just now":o<60?`${o}m ago`:l<24?`${l}h ago`:y<7?`${y}d ago`:t.toLocaleDateString()}catch{return""}}function Ce(e,t=null){if(t)return t(e);let s=V(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 Se(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 o=t(s);n===null?localStorage.removeItem(o):localStorage.setItem(o,n)}catch{}}}}function Te(e="csrftoken"){let t=document.cookie.split(";");for(let n of t){let[o,l]=n.trim().split("=");if(o===e)return decodeURIComponent(l)}let s=document.querySelector('meta[name="csrf-token"]');return s?s.getAttribute("content"):null}function me(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 ge(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 $t(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(d=>d+d).join(""):t,n=parseInt(s.substr(0,2),16)/255,o=parseInt(s.substr(2,2),16)/255,l=parseInt(s.substr(4,2),16)/255,y=d=>d<=.03928?d/12.92:Math.pow((d+.055)/1.055,2.4);return .2126*y(n)+.7152*y(o)+.0722*y(l)}function Xe(e){return $t(e)>.179?"#000000":"#ffffff"}function _e({config:e,debugMode:t,isExpanded:s,isSpeaking:n,messagesCount:o,isLoading:l,currentAgent:y,onClose:d,onToggleExpand:h,onToggleDebug:b,onToggleTTS:c,onClear:w,onToggleSidebar:p}){let{title:v,primaryColor:r,embedded:C,showConversationSidebar:$,showClearButton:u,showDebugButton:T,enableDebugMode:m,showTTSButton:W,showExpandButton:G,enableTTS:R,elevenLabsApiKey:P,ttsProxyUrl:F}=e,K=P||F;return oe.html`
2
+ <div class="cw-header" style=${{backgroundColor:r}}>
3
+ ${$&&oe.html`
4
4
  <button
5
5
  class="cw-header-btn cw-hamburger"
6
- onClick=${c}
6
+ onClick=${p}
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,53 +15,53 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
15
15
  `}
16
16
 
17
17
  <div class="cw-title-container">
18
- <span class="cw-title">${H(C)}</span>
18
+ <span class="cw-title">${V(v)}</span>
19
19
  ${y&&oe.html`
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">${H(y.name||y.key)}</span>
22
+ <span class="cw-agent-name">${V(y.name||y.key)}</span>
23
23
  </span>
24
24
  `}
25
25
  </div>
26
26
 
27
27
  <div class="cw-header-actions">
28
- ${v&&oe.html`
28
+ ${u&&oe.html`
29
29
  <button
30
30
  class="cw-header-btn"
31
- onClick=${b}
31
+ onClick=${w}
32
32
  title="Clear"
33
- disabled=${r||a===0}
33
+ disabled=${l||o===0}
34
34
  >🗑️</button>
35
35
  `}
36
36
 
37
- ${_&&m&&oe.html`
37
+ ${T&&m&&oe.html`
38
38
  <button
39
39
  class="cw-header-btn ${t?"cw-btn-active":""}"
40
- onClick=${g}
40
+ onClick=${b}
41
41
  title="Debug"
42
42
  >🐛</button>
43
43
  `}
44
44
 
45
- ${V&&K&&oe.html`
45
+ ${W&&K&&oe.html`
46
46
  <button
47
- class="cw-header-btn ${A?"cw-btn-active":""}"
48
- onClick=${u}
47
+ class="cw-header-btn ${R?"cw-btn-active":""}"
48
+ onClick=${c}
49
49
  title="TTS"
50
- >${A?"\u{1F50A}":"\u{1F507}"}</button>
50
+ >${R?"\u{1F50A}":"\u{1F507}"}</button>
51
51
  `}
52
52
 
53
- ${z&&!f&&oe.html`
53
+ ${G&&!C&&oe.html`
54
54
  <button
55
55
  class="cw-header-btn"
56
- onClick=${$}
56
+ onClick=${h}
57
57
  title=${s?"Minimize":"Expand"}
58
58
  >${s?"\u2296":"\u2295"}</button>
59
59
  `}
60
60
 
61
- ${!f&&oe.html`
61
+ ${!C&&oe.html`
62
62
  <button
63
63
  class="cw-header-btn"
64
- onClick=${i}
64
+ onClick=${d}
65
65
  title="Close"
66
66
  >✕</button>
67
67
  `}
@@ -92,8 +92,8 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
92
92
  </div>
93
93
  `}function yt({block:e,onAction:t,markdownParser:s}){let n=e.layout||"vertical";return I.html`
94
94
  <div class="cw-block-card-list cw-block-card-list-${n}">
95
- ${(e.items||[]).map(a=>I.html`
96
- <${Ze} block=${{type:"card",...a}} onAction=${t} markdownParser=${s} />
95
+ ${(e.items||[]).map(o=>I.html`
96
+ <${Ze} block=${{type:"card",...o}} onAction=${t} markdownParser=${s} />
97
97
  `)}
98
98
  </div>
99
99
  `}function Qe({action:e,onAction:t}){let s=e.style||"primary",n=()=>{t&&t(e)};return e.type==="link"?I.html`<a class="cw-block-btn cw-block-btn-${s}" href=${e.url} target="_blank" rel="noopener">${e.label}</a>`:I.html`<button class="cw-block-btn cw-block-btn-${s}" onClick=${n}>${e.label}</button>`}function wt({block:e,onAction:t}){return I.html`
@@ -129,7 +129,7 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
129
129
  `}function St({block:e}){let[t,s]=(0,Ue.useState)(!1),n=()=>{navigator.clipboard.writeText(e.code).then(()=>{s(!0),setTimeout(()=>s(!1),1500)})};return I.html`
130
130
  <div class="cw-block-code">
131
131
  ${e.filename&&I.html`<div class="cw-block-code-filename">${e.filename}</div>`}
132
- <pre><code>${H(e.code)}</code></pre>
132
+ <pre><code>${V(e.code)}</code></pre>
133
133
  ${e.copyable!==!1&&I.html`
134
134
  <button class="cw-block-code-copy" onClick=${n}>${t?"\u2713":"\u2398"}</button>
135
135
  `}
@@ -152,7 +152,7 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
152
152
  </div>
153
153
  `}var Mt={card:Ze,cardList:yt,actionButtons:wt,callout:vt,image:kt,divider:bt,table:Ct,code:St,collapsible:Tt,status:_t};function et({blocks:e,onAction:t,markdownParser:s}){return!e||e.length===0?null:I.html`
154
154
  <div class="cw-content-blocks">
155
- ${e.map((n,a)=>{let r=Mt[n.type];return r?I.html`<${r} key=${a} block=${n} onAction=${t} markdownParser=${s} />`:null})}
155
+ ${e.map((n,o)=>{let l=Mt[n.type];return l?I.html`<${l} key=${o} block=${n} onAction=${t} markdownParser=${s} />`:null})}
156
156
  </div>
157
157
  `}function Me({msg:e,show:t,onToggle:s}){return t?N.html`
158
158
  <div class="cw-debug-payload">
@@ -165,9 +165,9 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
165
165
  onClick=${s}
166
166
  title="Show message payload"
167
167
  >{ }</button>
168
- `}function tt({onEdit:e,onRetry:t,isLoading:s,position:n,showEdit:a=!0}){return s?null:N.html`
168
+ `}function tt({onEdit:e,onRetry:t,isLoading:s,position:n,showEdit:o=!0}){return s?null:N.html`
169
169
  <div class="cw-message-actions cw-message-actions-${n||"left"}">
170
- ${a&&N.html`
170
+ ${o&&N.html`
171
171
  <button
172
172
  class="cw-message-action-btn"
173
173
  onClick=${e}
@@ -191,14 +191,14 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
191
191
  </svg>
192
192
  </button>
193
193
  </div>
194
- `}function Et({initialContent:e,onSave:t,onCancel:s}){let[n,a]=(0,re.useState)(e),r=(0,re.useRef)(null);return(0,re.useEffect)(()=>{r.current&&(r.current.focus(),r.current.setSelectionRange(n.length,n.length),r.current.style.height="auto",r.current.style.height=r.current.scrollHeight+"px")},[]),N.html`
194
+ `}function Et({initialContent:e,onSave:t,onCancel:s}){let[n,o]=(0,re.useState)(e),l=(0,re.useRef)(null);return(0,re.useEffect)(()=>{l.current&&(l.current.focus(),l.current.setSelectionRange(n.length,n.length),l.current.style.height="auto",l.current.style.height=l.current.scrollHeight+"px")},[]),N.html`
195
195
  <div class="cw-inline-edit">
196
196
  <textarea
197
- ref=${r}
197
+ ref=${l}
198
198
  class="cw-inline-edit-input"
199
199
  value=${n}
200
- onInput=${$=>{a($.target.value),$.target.style.height="auto",$.target.style.height=$.target.scrollHeight+"px"}}
201
- onKeyDown=${$=>{$.key==="Enter"&&!$.shiftKey?($.preventDefault(),n.trim()&&t(n.trim())):$.key==="Escape"&&s()}}
200
+ onInput=${h=>{o(h.target.value),h.target.style.height="auto",h.target.style.height=h.target.scrollHeight+"px"}}
201
+ onKeyDown=${h=>{h.key==="Enter"&&!h.shiftKey?(h.preventDefault(),n.trim()&&t(n.trim())):h.key==="Escape"&&s()}}
202
202
  rows="1"
203
203
  />
204
204
  <div class="cw-inline-edit-actions">
@@ -215,36 +215,36 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
215
215
  >Save & Send</button>
216
216
  </div>
217
217
  </div>
218
- `}function Ee({msg:e,debugMode:t,markdownParser:s,onEdit:n,onRetry:a,isLoading:r,messageIndex:y}){let[i,$]=(0,re.useState)(!1),[g,u]=(0,re.useState)(!1),[b,c]=(0,re.useState)(!1),C=e.role==="user",l=e.role==="system",f=e.type==="tool_call",w=e.type==="tool_result",v=e.type==="error",_=e.type==="sub_agent_start",m=e.type==="sub_agent_end",V=e.type==="agent_context";if(l&&!t)return null;if(_||m||V)return N.html`
219
- <div class="cw-agent-context ${_?"cw-agent-delegating":""} ${m?"cw-agent-returned":""}" style="position: relative;">
220
- <span class="cw-agent-context-icon">${_?"\u{1F517}":m?"\u2713":"\u{1F916}"}</span>
218
+ `}function Ee({msg:e,debugMode:t,markdownParser:s,onEdit:n,onRetry:o,onSendMessage:l,isLoading:y,messageIndex:d}){let[h,b]=(0,re.useState)(!1),[c,w]=(0,re.useState)(!1),[p,v]=(0,re.useState)(!1),r=e.role==="user",C=e.role==="system",$=e.type==="tool_call",u=e.type==="tool_result",T=e.type==="error",m=e.type==="sub_agent_start",W=e.type==="sub_agent_end",G=e.type==="agent_context";if(C&&!t)return null;if(m||W||G)return N.html`
219
+ <div class="cw-agent-context ${m?"cw-agent-delegating":""} ${W?"cw-agent-returned":""}" style="position: relative;">
220
+ <span class="cw-agent-context-icon">${m?"\u{1F517}":W?"\u2713":"\u{1F916}"}</span>
221
221
  <span class="cw-agent-context-text">${e.content}</span>
222
222
  ${e.metadata?.agentName&&N.html`
223
223
  <span class="cw-agent-context-name">${e.metadata.agentName}</span>
224
224
  `}
225
- ${t&&N.html`<${Me} msg=${e} show=${g} onToggle=${()=>u(!g)} />`}
225
+ ${t&&N.html`<${Me} msg=${e} show=${c} onToggle=${()=>w(!c)} />`}
226
226
  </div>
227
- `;if(e.type==="content_blocks"&&e.metadata?.blocks){let k=T=>{T.type==="message"&&e._onSendMessage&&e._onSendMessage(T.message),T.type==="callback"&&e._onCallback&&e._onCallback(T.callbackId)};return N.html`
227
+ `;if(e.type==="content_blocks"&&e.metadata?.blocks){let k=i=>{i.type==="message"&&l&&l(i.message),i.type==="callback"&&e._onCallback&&e._onCallback(i.callbackId),i.type==="link"&&i.url&&window.open(i.url,"_blank","noopener")};return N.html`
228
228
  <div class="cw-message-row" style="position: relative;">
229
229
  <${et}
230
230
  blocks=${e.metadata.blocks}
231
231
  onAction=${k}
232
232
  markdownParser=${s}
233
233
  />
234
- ${t&&N.html`<${Me} msg=${e} show=${g} onToggle=${()=>u(!g)} />`}
234
+ ${t&&N.html`<${Me} msg=${e} show=${c} onToggle=${()=>w(!c)} />`}
235
235
  </div>
236
- `}if(f||w){let k=e.metadata?.arguments||e.metadata?.result,T=d=>{if(typeof d=="string")try{return JSON.stringify(JSON.parse(d),null,2)}catch{return d}return JSON.stringify(d,null,2)};return N.html`
237
- <div class="cw-tool-message ${w?"cw-tool-result":"cw-tool-call"}" style="position: relative;">
238
- <span class="cw-tool-label" onClick=${()=>k&&$(!i)}>
236
+ `}if($||u){let k=e.metadata?.arguments||e.metadata?.result,i=A=>{if(typeof A=="string")try{return JSON.stringify(JSON.parse(A),null,2)}catch{return A}return JSON.stringify(A,null,2)};return N.html`
237
+ <div class="cw-tool-message ${u?"cw-tool-result":"cw-tool-call"}" style="position: relative;">
238
+ <span class="cw-tool-label" onClick=${()=>k&&b(!h)}>
239
239
  ${e.content}
240
- ${k&&N.html`<span class="cw-tool-expand">${i?"\u25BC":"\u25B6"}</span>`}
240
+ ${k&&N.html`<span class="cw-tool-expand">${h?"\u25BC":"\u25B6"}</span>`}
241
241
  </span>
242
- ${i&&k&&N.html`
243
- <pre class="cw-tool-details">${H(T(f?e.metadata.arguments:e.metadata.result))}</pre>
242
+ ${h&&k&&N.html`
243
+ <pre class="cw-tool-details">${V(i($?e.metadata.arguments:e.metadata.result))}</pre>
244
244
  `}
245
- ${t&&N.html`<${Me} msg=${e} show=${g} onToggle=${()=>u(!g)} />`}
245
+ ${t&&N.html`<${Me} msg=${e} show=${c} onToggle=${()=>w(!c)} />`}
246
246
  </div>
247
- `}let z=["cw-message",C&&"cw-message-user",v&&"cw-message-error"].filter(Boolean).join(" "),A=`cw-message-row ${C?"cw-message-row-user":""}`,O=e.role==="assistant"?Ce(e.content,s):H(e.content),P=e.files&&e.files.length>0,K=()=>P?N.html`
247
+ `}let R=["cw-message",r&&"cw-message-user",T&&"cw-message-error"].filter(Boolean).join(" "),P=`cw-message-row ${r?"cw-message-row-user":""}`,F=e.role==="assistant"?Ce(e.content,s):V(e.content),K=e.files&&e.files.length>0,J=()=>K?N.html`
248
248
  <div class="cw-message-attachments">
249
249
  ${e.files.map(k=>k.type&&k.type.startsWith("image/")?N.html`
250
250
  <a class="cw-attachment-thumbnail" href=${k.url} target="_blank" title=${k.name}>
@@ -260,70 +260,71 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
260
260
  </a>
261
261
  `)}
262
262
  </div>
263
- `:null,G=k=>{c(!1),n&&n(y,k)},U=()=>{a&&a(y)};if(C&&b)return N.html`
264
- <div class=${A} style="position: relative;">
265
- ${K()}
263
+ `:null,U=k=>{v(!1),n&&n(d,k)},g=()=>{o&&o(d)};if(r&&p)return N.html`
264
+ <div class=${P} style="position: relative;">
265
+ ${J()}
266
266
  <${Et}
267
267
  initialContent=${e.content}
268
- onSave=${G}
269
- onCancel=${()=>c(!1)}
268
+ onSave=${U}
269
+ onCancel=${()=>v(!1)}
270
270
  />
271
271
  </div>
272
- `;let h=C&&n&&a,p=e.role==="assistant"&&a&&!r;return N.html`
273
- <div class="${A} ${h||p?"cw-message-row-with-actions":""}">
274
- ${K()}
275
- ${h&&N.html`
272
+ `;let _=r&&n&&o,S=e.role==="assistant"&&o&&!y;return N.html`
273
+ <div class="${P} ${_||S?"cw-message-row-with-actions":""}">
274
+ ${J()}
275
+ ${_&&N.html`
276
276
  <div class="cw-user-actions-wrapper">
277
277
  <${tt}
278
- onEdit=${()=>c(!0)}
279
- onRetry=${U}
280
- isLoading=${r}
278
+ onEdit=${()=>v(!0)}
279
+ onRetry=${g}
280
+ isLoading=${y}
281
281
  position="left"
282
282
  showEdit=${!0}
283
283
  />
284
- <div class=${z} dangerouslySetInnerHTML=${{__html:O}} />
284
+ <div class=${R} dangerouslySetInnerHTML=${{__html:F}} />
285
285
  </div>
286
286
  `}
287
- ${!h&&N.html`
288
- <div class=${z} dangerouslySetInnerHTML=${{__html:O}} />
287
+ ${!_&&N.html`
288
+ <div class=${R} dangerouslySetInnerHTML=${{__html:F}} />
289
289
  `}
290
- ${p&&N.html`
290
+ ${S&&N.html`
291
291
  <${tt}
292
- onRetry=${U}
293
- isLoading=${r}
292
+ onRetry=${g}
293
+ isLoading=${y}
294
294
  position="right"
295
295
  showEdit=${!1}
296
296
  />
297
297
  `}
298
- ${t&&N.html`<${Me} msg=${e} show=${g} onToggle=${()=>u(!g)} />`}
298
+ ${t&&N.html`<${Me} msg=${e} show=${c} onToggle=${()=>w(!c)} />`}
299
299
  </div>
300
- `}function xe({messages:e,isLoading:t,hasMoreMessages:s,loadingMoreMessages:n,onLoadMore:a,onEditMessage:r,onRetryMessage:y,debugMode:i,markdownParser:$,emptyStateTitle:g,emptyStateMessage:u}){let b=(0,fe.useRef)(null),c=(0,fe.useRef)(!0),C=f=>{let w=f.target,v=w.scrollHeight-w.scrollTop-w.clientHeight<100;if(c.current=v,w.scrollTop<50&&s&&!n){let _=w.scrollHeight;a().then(()=>{let m=w.scrollHeight;w.scrollTop=m-_+w.scrollTop})}};(0,fe.useEffect)(()=>{let f=b.current;f&&c.current&&requestAnimationFrame(()=>{f.scrollTop=f.scrollHeight})},[e,t]),(0,fe.useEffect)(()=>{let f=b.current;f&&e.length<=2&&(c.current=!0,requestAnimationFrame(()=>{f.scrollTop=f.scrollHeight}))},[e.length]);let l=e.length===0;return ce.html`
301
- <div class="cw-messages" ref=${b} onScroll=${C}>
302
- ${l&&ce.html`
300
+ `}function xe({messages:e,isLoading:t,hasMoreMessages:s,loadingMoreMessages:n,onLoadMore:o,onEditMessage:l,onRetryMessage:y,onSendMessage:d,debugMode:h,markdownParser:b,emptyStateTitle:c,emptyStateMessage:w}){let p=(0,fe.useRef)(null),v=(0,fe.useRef)(!0),r=$=>{let u=$.target,T=u.scrollHeight-u.scrollTop-u.clientHeight<100;if(v.current=T,u.scrollTop<50&&s&&!n){let m=u.scrollHeight;o().then(()=>{let W=u.scrollHeight;u.scrollTop=W-m+u.scrollTop})}};(0,fe.useEffect)(()=>{let $=p.current;$&&v.current&&requestAnimationFrame(()=>{$.scrollTop=$.scrollHeight})},[e,t]),(0,fe.useEffect)(()=>{let $=p.current;$&&e.length<=2&&(v.current=!0,requestAnimationFrame(()=>{$.scrollTop=$.scrollHeight}))},[e.length]);let C=e.length===0;return ce.html`
301
+ <div class="cw-messages" ref=${p} onScroll=${r}>
302
+ ${C&&ce.html`
303
303
  <div class="cw-empty-state">
304
304
  <svg class="cw-empty-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
305
305
  <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>
306
306
  </svg>
307
- <h3>${H(g)}</h3>
308
- <p>${H(u)}</p>
307
+ <h3>${V(c)}</h3>
308
+ <p>${V(w)}</p>
309
309
  </div>
310
310
  `}
311
311
 
312
- ${!l&&s&&ce.html`
313
- <div class="cw-load-more" onClick=${a}>
312
+ ${!C&&s&&ce.html`
313
+ <div class="cw-load-more" onClick=${o}>
314
314
  ${n?ce.html`<span class="cw-spinner"></span><span>Loading...</span>`:ce.html`<span>↑ Scroll up or click to load older messages</span>`}
315
315
  </div>
316
316
  `}
317
317
 
318
- ${e.map((f,w)=>ce.html`
318
+ ${e.map(($,u)=>ce.html`
319
319
  <${Ee}
320
- key=${f.id}
321
- msg=${f}
322
- messageIndex=${w}
323
- debugMode=${i}
324
- markdownParser=${$}
325
- onEdit=${r}
320
+ key=${$.id}
321
+ msg=${$}
322
+ messageIndex=${u}
323
+ debugMode=${h}
324
+ markdownParser=${b}
325
+ onEdit=${l}
326
326
  onRetry=${y}
327
+ onSendMessage=${d}
327
328
  isLoading=${t}
328
329
  />
329
330
  `)}
@@ -337,11 +338,11 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
337
338
  </div>
338
339
  `}
339
340
  </div>
340
- `}var se=require("htm/preact"),q=require("preact/compat");var je=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function Ie({onSend:e,onCancel:t,isLoading:s,placeholder:n,primaryColor:a,enableVoice:r=!0,enableFiles:y=!0}){let[i,$]=(0,q.useState)(""),[g,u]=(0,q.useState)([]),[b,c]=(0,q.useState)(!1),[C,l]=(0,q.useState)(!1),[f]=(0,q.useState)(()=>!!je),w=(0,q.useRef)(null),v=(0,q.useRef)(null),_=(0,q.useRef)(null),m=(0,q.useRef)(!1);(0,q.useEffect)(()=>{!s&&w.current&&w.current.focus()},[s]),(0,q.useEffect)(()=>{w.current&&(w.current.style.height="auto",w.current.style.height=Math.min(w.current.scrollHeight,150)+"px")},[i]),(0,q.useEffect)(()=>()=>{m.current=!1,_.current&&_.current.abort()},[]);let V=d=>{d.preventDefault(),(i.trim()||g.length>0)&&!s&&(e(i,g),$(""),u([]),w.current&&(w.current.style.height="auto"),v.current&&(v.current.value=""))},z=d=>{let R=Array.from(d.target.files||[]);R.length>0&&u(F=>[...F,...R])},A=d=>{u(R=>R.filter((F,o)=>o!==d))},O=d=>{d.preventDefault(),v.current&&!s&&v.current.click()},P=d=>{d.key==="Enter"&&!d.shiftKey&&(d.preventDefault(),V(d))},K=d=>{s&&t&&(d.preventDefault(),t())},G=()=>{if(!je||s)return;m.current=!0;let d=new je;d.continuous=!0,d.interimResults=!0,d.lang=navigator.language||"en-US";let R=i,F="";d.onstart=()=>{l(!0)},d.onresult=o=>{F="";for(let M=o.resultIndex;M<o.results.length;M++){let B=o.results[M][0].transcript;o.results[M].isFinal?R+=(R?" ":"")+B:F+=B}$(R+(F?" "+F:""))},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,l(!1),$(R||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)}}l(!1),R&&$(R),_.current=null},_.current=d,d.start()},U=()=>{m.current=!1,_.current&&_.current.stop()},h=d=>{d.preventDefault(),C?U():G()},x=se.html`
341
+ `}var se=require("htm/preact"),q=require("preact/compat");var je=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function Ie({onSend:e,onCancel:t,isLoading:s,placeholder:n,primaryColor:o,enableVoice:l=!0,enableFiles:y=!0}){let[d,h]=(0,q.useState)(""),[b,c]=(0,q.useState)([]),[w,p]=(0,q.useState)(!1),[v,r]=(0,q.useState)(!1),[C]=(0,q.useState)(()=>!!je),$=(0,q.useRef)(null),u=(0,q.useRef)(null),T=(0,q.useRef)(null),m=(0,q.useRef)(!1);(0,q.useEffect)(()=>{!s&&$.current&&$.current.focus()},[s]),(0,q.useEffect)(()=>{$.current&&($.current.style.height="auto",$.current.style.height=Math.min($.current.scrollHeight,150)+"px")},[d]),(0,q.useEffect)(()=>()=>{m.current=!1,T.current&&T.current.abort()},[]);let W=i=>{i.preventDefault(),(d.trim()||b.length>0)&&!s&&(e(d,b),h(""),c([]),$.current&&($.current.style.height="auto"),u.current&&(u.current.value=""))},G=i=>{let A=Array.from(i.target.files||[]);A.length>0&&c(O=>[...O,...A])},R=i=>{c(A=>A.filter((O,a)=>a!==i))},P=i=>{i.preventDefault(),u.current&&!s&&u.current.click()},F=i=>{i.key==="Enter"&&!i.shiftKey&&(i.preventDefault(),W(i))},K=i=>{s&&t&&(i.preventDefault(),t())},J=()=>{if(!je||s)return;m.current=!0;let i=new je;i.continuous=!0,i.interimResults=!0,i.lang=navigator.language||"en-US";let A=d,O="";i.onstart=()=>{r(!0)},i.onresult=a=>{O="";for(let M=a.resultIndex;M<a.results.length;M++){let H=a.results[M][0].transcript;a.results[M].isFinal?A+=(A?" ":"")+H:O+=H}h(A+(O?" "+O:""))},i.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),m.current=!1,r(!1),h(A||d)},i.onend=()=>{if(m.current){console.log("[ChatWidget] Recognition paused, restarting...");try{i.start();return}catch(a){console.warn("[ChatWidget] Could not restart recognition:",a)}}r(!1),A&&h(A),T.current=null},T.current=i,i.start()},U=()=>{m.current=!1,T.current&&T.current.stop()},g=i=>{i.preventDefault(),v?U():J()},_=se.html`
341
342
  <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor">
342
343
  <rect x="2" y="2" width="10" height="10" rx="1" />
343
344
  </svg>
344
- `,p=se.html`
345
+ `,f=se.html`
345
346
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
346
347
  <path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"></path>
347
348
  <path d="M19 10v2a7 7 0 0 1-14 0v-2"></path>
@@ -352,26 +353,26 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
352
353
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
353
354
  <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>
354
355
  </svg>
355
- `,k=r&&f,T=y;return se.html`
356
- <form class="cw-input-form" onSubmit=${V}>
356
+ `,E=l&&C,k=y;return se.html`
357
+ <form class="cw-input-form" onSubmit=${W}>
357
358
  <input
358
359
  type="file"
359
- ref=${v}
360
+ ref=${u}
360
361
  style="display: none"
361
362
  multiple
362
- onChange=${z}
363
+ onChange=${G}
363
364
  />
364
- ${g.length>0&&se.html`
365
+ ${b.length>0&&se.html`
365
366
  <div class="cw-file-chips">
366
- ${g.map((d,R)=>se.html`
367
- <div class="cw-file-chip" key=${R}>
368
- <span class="cw-file-chip-icon">${ge(d.type)}</span>
369
- <span class="cw-file-chip-name" title=${d.name}>${d.name.length>20?d.name.substring(0,17)+"...":d.name}</span>
370
- <span class="cw-file-chip-size">(${me(d.size)})</span>
367
+ ${b.map((i,A)=>se.html`
368
+ <div class="cw-file-chip" key=${A}>
369
+ <span class="cw-file-chip-icon">${ge(i.type)}</span>
370
+ <span class="cw-file-chip-name" title=${i.name}>${i.name.length>20?i.name.substring(0,17)+"...":i.name}</span>
371
+ <span class="cw-file-chip-size">(${me(i.size)})</span>
371
372
  <button
372
373
  type="button"
373
374
  class="cw-file-chip-remove"
374
- onClick=${()=>A(R)}
375
+ onClick=${()=>R(A)}
375
376
  title="Remove file"
376
377
  >×</button>
377
378
  </div>
@@ -379,57 +380,57 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
379
380
  </div>
380
381
  `}
381
382
  <textarea
382
- ref=${w}
383
+ ref=${$}
383
384
  class="cw-input"
384
- placeholder=${H(n)}
385
- value=${i}
386
- onInput=${d=>$(d.target.value)}
387
- onKeyDown=${P}
385
+ placeholder=${V(n)}
386
+ value=${d}
387
+ onInput=${i=>h(i.target.value)}
388
+ onKeyDown=${F}
388
389
  disabled=${s}
389
390
  rows="1"
390
391
  />
391
- ${T&&se.html`
392
+ ${k&&se.html`
392
393
  <button
393
394
  type="button"
394
395
  class="cw-attach-btn"
395
- onClick=${O}
396
+ onClick=${P}
396
397
  disabled=${s}
397
398
  title="Attach files"
398
399
  >
399
400
  ${S}
400
401
  </button>
401
402
  `}
402
- ${k&&se.html`
403
+ ${E&&se.html`
403
404
  <button
404
405
  type="button"
405
- class=${`cw-voice-btn ${C?"cw-voice-btn-recording":""}`}
406
- onClick=${h}
406
+ class=${`cw-voice-btn ${v?"cw-voice-btn-recording":""}`}
407
+ onClick=${g}
407
408
  disabled=${s}
408
- title=${C?"Stop recording":"Voice input"}
409
+ title=${v?"Stop recording":"Voice input"}
409
410
  >
410
- ${p}
411
+ ${f}
411
412
  </button>
412
413
  `}
413
414
  <button
414
415
  type=${s?"button":"submit"}
415
- class=${`cw-send-btn ${s?"cw-send-btn-loading":""} ${s&&b?"cw-send-btn-stop":""}`}
416
- style=${{backgroundColor:s&&b?"#dc2626":a}}
416
+ class=${`cw-send-btn ${s?"cw-send-btn-loading":""} ${s&&w?"cw-send-btn-stop":""}`}
417
+ style=${{backgroundColor:s&&w?"#dc2626":o}}
417
418
  onClick=${K}
418
- onMouseEnter=${()=>c(!0)}
419
- onMouseLeave=${()=>c(!1)}
419
+ onMouseEnter=${()=>p(!0)}
420
+ onMouseLeave=${()=>p(!1)}
420
421
  title=${s?"Stop":"Send"}
421
422
  >
422
- ${s?b?x:se.html`<span class="cw-spinner"></span>`:"\u27A4"}
423
+ ${s?w?_:se.html`<span class="cw-spinner"></span>`:"\u27A4"}
423
424
  </button>
424
425
  </form>
425
- `}var we=require("htm/preact");function Ae({isOpen:e,conversations:t,conversationsLoading:s,currentConversationId:n,onClose:a,onNewConversation:r,onSwitchConversation:y}){return we.html`
426
+ `}var we=require("htm/preact");function Ae({isOpen:e,conversations:t,conversationsLoading:s,currentConversationId:n,onClose:o,onNewConversation:l,onSwitchConversation:y}){return we.html`
426
427
  <div class="cw-sidebar ${e?"cw-sidebar-open":""}">
427
428
  <div class="cw-sidebar-header">
428
429
  <span>Conversations</span>
429
- <button class="cw-sidebar-close" onClick=${a}>✕</button>
430
+ <button class="cw-sidebar-close" onClick=${o}>✕</button>
430
431
  </div>
431
432
 
432
- <button class="cw-new-conversation" onClick=${r}>
433
+ <button class="cw-new-conversation" onClick=${l}>
433
434
  <span>+ New Conversation</span>
434
435
  </button>
435
436
 
@@ -444,14 +445,14 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
444
445
  <div class="cw-sidebar-empty">No conversations yet</div>
445
446
  `}
446
447
 
447
- ${t.map(i=>we.html`
448
+ ${t.map(d=>we.html`
448
449
  <div
449
- key=${i.id}
450
- class="cw-conversation-item ${i.id===n?"cw-conversation-active":""}"
451
- onClick=${()=>y(i.id)}
450
+ key=${d.id}
451
+ class="cw-conversation-item ${d.id===n?"cw-conversation-active":""}"
452
+ onClick=${()=>y(d.id)}
452
453
  >
453
- <div class="cw-conversation-title">${H(i.title||"Untitled")}</div>
454
- <div class="cw-conversation-date">${be(i.updatedAt||i.createdAt)}</div>
454
+ <div class="cw-conversation-title">${V(d.title||"Untitled")}</div>
455
+ <div class="cw-conversation-date">${be(d.updatedAt||d.createdAt)}</div>
455
456
  </div>
456
457
  `)}
457
458
  </div>
@@ -459,26 +460,26 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
459
460
 
460
461
  <div
461
462
  class="cw-sidebar-overlay ${e?"cw-sidebar-overlay-visible":""}"
462
- onClick=${a}
463
+ onClick=${o}
463
464
  />
464
- `}var de=require("htm/preact"),st=require("preact/compat");function Re({availableModels:e,selectedModel:t,onSelectModel:s,thinkingEnabled:n,onToggleThinking:a,disabled:r}){let[y,i]=(0,st.useState)(!1);if(!e||e.length===0)return null;let $=e.find(l=>l.id===t),g=$?.name||"Select Model",u=$?.supports_thinking||!1,b=()=>{r||i(!y)},c=l=>{s(l),i(!1)},C=l=>{l.stopPropagation(),a&&u&&a(!n)};return de.html`
465
+ `}var de=require("htm/preact"),st=require("preact/compat");function Re({availableModels:e,selectedModel:t,onSelectModel:s,thinkingEnabled:n,onToggleThinking:o,disabled:l}){let[y,d]=(0,st.useState)(!1);if(!e||e.length===0)return null;let h=e.find(r=>r.id===t),b=h?.name||"Select Model",c=h?.supports_thinking||!1,w=()=>{l||d(!y)},p=r=>{s(r),d(!1)},v=r=>{r.stopPropagation(),o&&c&&o(!n)};return de.html`
465
466
  <div class="cw-model-selector">
466
467
  <button
467
468
  class="cw-model-btn"
468
- onClick=${b}
469
- disabled=${r}
469
+ onClick=${w}
470
+ disabled=${l}
470
471
  title="Select Model"
471
472
  >
472
473
  <span class="cw-model-icon">🤖</span>
473
- <span class="cw-model-name">${H(g)}</span>
474
+ <span class="cw-model-name">${V(b)}</span>
474
475
  <span class="cw-model-chevron">${y?"\u25B2":"\u25BC"}</span>
475
476
  </button>
476
477
 
477
- ${u&&a&&de.html`
478
+ ${c&&o&&de.html`
478
479
  <button
479
480
  class="cw-thinking-toggle ${n?"cw-thinking-enabled":""}"
480
- onClick=${C}
481
- disabled=${r}
481
+ onClick=${v}
482
+ disabled=${l}
482
483
  title=${n?"Thinking enabled - click to disable":"Enable extended thinking"}
483
484
  >
484
485
  <span class="cw-thinking-icon">🧠</span>
@@ -487,49 +488,49 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
487
488
 
488
489
  ${y&&de.html`
489
490
  <div class="cw-model-dropdown">
490
- ${e.map(l=>de.html`
491
+ ${e.map(r=>de.html`
491
492
  <button
492
- key=${l.id}
493
- class="cw-model-option ${l.id===t?"cw-model-option-selected":""}"
494
- onClick=${()=>c(l.id)}
493
+ key=${r.id}
494
+ class="cw-model-option ${r.id===t?"cw-model-option-selected":""}"
495
+ onClick=${()=>p(r.id)}
495
496
  >
496
497
  <span class="cw-model-option-name">
497
- ${H(l.name)}
498
- ${l.supports_thinking&&de.html`<span class="cw-thinking-badge" title="Supports extended thinking">🧠</span>`}
498
+ ${V(r.name)}
499
+ ${r.supports_thinking&&de.html`<span class="cw-thinking-badge" title="Supports extended thinking">🧠</span>`}
499
500
  </span>
500
- <span class="cw-model-option-provider">${H(l.provider)}</span>
501
- ${l.description&&de.html`
502
- <span class="cw-model-option-desc">${H(l.description)}</span>
501
+ <span class="cw-model-option-provider">${V(r.provider)}</span>
502
+ ${r.description&&de.html`
503
+ <span class="cw-model-option-desc">${V(r.description)}</span>
503
504
  `}
504
505
  </button>
505
506
  `)}
506
507
  </div>
507
508
  `}
508
509
  </div>
509
- `}var ne=require("htm/preact"),le=require("preact/compat"),xt={not_started:"\u25CB",in_progress:"\u25D0",complete:"\u25CF",cancelled:"\u2298"},It={not_started:"Not Started",in_progress:"In Progress",complete:"Complete",cancelled:"Cancelled"};function At({task:e,onUpdate:t,onRemove:s,depth:n=0}){let[a,r]=(0,le.useState)(!1),[y,i]=(0,le.useState)(e.name),$=(0,le.useCallback)(()=>{let c={not_started:"in_progress",in_progress:"complete",complete:"not_started",cancelled:"not_started"};t(e.id,{state:c[e.state]||"not_started"})},[e,t]),g=(0,le.useCallback)(()=>{y.trim()&&y!==e.name&&t(e.id,{name:y.trim()}),r(!1)},[e,y,t]),u=(0,le.useCallback)(c=>{c.key==="Enter"&&g(),c.key==="Escape"&&(i(e.name),r(!1))},[g,e.name]),b=`cw-task-state-${e.state.replace("_","-")}`;return ne.html`
510
- <div class="cw-task-item ${b}" style=${{paddingLeft:`${n*16+8}px`}}>
510
+ `}var ne=require("htm/preact"),le=require("preact/compat"),xt={not_started:"\u25CB",in_progress:"\u25D0",complete:"\u25CF",cancelled:"\u2298"},It={not_started:"Not Started",in_progress:"In Progress",complete:"Complete",cancelled:"Cancelled"};function At({task:e,onUpdate:t,onRemove:s,depth:n=0}){let[o,l]=(0,le.useState)(!1),[y,d]=(0,le.useState)(e.name),h=(0,le.useCallback)(()=>{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]),b=(0,le.useCallback)(()=>{y.trim()&&y!==e.name&&t(e.id,{name:y.trim()}),l(!1)},[e,y,t]),c=(0,le.useCallback)(p=>{p.key==="Enter"&&b(),p.key==="Escape"&&(d(e.name),l(!1))},[b,e.name]),w=`cw-task-state-${e.state.replace("_","-")}`;return ne.html`
511
+ <div class="cw-task-item ${w}" style=${{paddingLeft:`${n*16+8}px`}}>
511
512
  <button
512
513
  class="cw-task-state-btn"
513
- onClick=${$}
514
+ onClick=${h}
514
515
  title=${It[e.state]}
515
516
  >
516
517
  ${xt[e.state]}
517
518
  </button>
518
519
 
519
- ${a?ne.html`
520
+ ${o?ne.html`
520
521
  <input
521
522
  type="text"
522
523
  class="cw-task-edit-input"
523
524
  value=${y}
524
- onInput=${c=>i(c.target.value)}
525
- onBlur=${g}
526
- onKeyDown=${u}
525
+ onInput=${p=>d(p.target.value)}
526
+ onBlur=${b}
527
+ onKeyDown=${c}
527
528
  autoFocus
528
529
  />
529
530
  `:ne.html`
530
531
  <span
531
532
  class="cw-task-name"
532
- onClick=${()=>r(!0)}
533
+ onClick=${()=>l(!0)}
533
534
  title="Click to edit"
534
535
  >
535
536
  ${e.name}
@@ -544,16 +545,16 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
544
545
  ×
545
546
  </button>
546
547
  </div>
547
- `}function De({tasks:e,progress:t,isLoading:s,error:n,onUpdate:a,onRemove:r,onClear:y,onRefresh:i}){let $=(0,le.useCallback)(b=>{let c=new Map,C=[];return b.forEach(l=>{c.set(l.id,{...l,children:[]})}),b.forEach(l=>{let f=c.get(l.id);l.parent_id&&c.has(l.parent_id)?c.get(l.parent_id).children.push(f):C.push(f)}),C},[]),g=(0,le.useCallback)((b,c=0)=>ne.html`
548
+ `}function De({tasks:e,progress:t,isLoading:s,error:n,onUpdate:o,onRemove:l,onClear:y,onRefresh:d}){let h=(0,le.useCallback)(w=>{let p=new Map,v=[];return w.forEach(r=>{p.set(r.id,{...r,children:[]})}),w.forEach(r=>{let C=p.get(r.id);r.parent_id&&p.has(r.parent_id)?p.get(r.parent_id).children.push(C):v.push(C)}),v},[]),b=(0,le.useCallback)((w,p=0)=>ne.html`
548
549
  <${At}
549
- key=${b.id}
550
- task=${b}
551
- depth=${c}
552
- onUpdate=${a}
553
- onRemove=${r}
550
+ key=${w.id}
551
+ task=${w}
552
+ depth=${p}
553
+ onUpdate=${o}
554
+ onRemove=${l}
554
555
  />
555
- ${b.children?.map(C=>g(C,c+1))}
556
- `,[a,r]),u=$(e);return s&&e.length===0?ne.html`<div class="cw-tasks-loading">Loading tasks...</div>`:ne.html`
556
+ ${w.children?.map(v=>b(v,p+1))}
557
+ `,[o,l]),c=h(e);return s&&e.length===0?ne.html`<div class="cw-tasks-loading">Loading tasks...</div>`:ne.html`
557
558
  <div class="cw-tasks-container">
558
559
  <div class="cw-tasks-header">
559
560
  <div class="cw-tasks-progress">
@@ -568,7 +569,7 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
568
569
  </div>
569
570
  </div>
570
571
  <div class="cw-tasks-actions">
571
- <button class="cw-tasks-action-btn" onClick=${i} title="Refresh">↻</button>
572
+ <button class="cw-tasks-action-btn" onClick=${d} title="Refresh">↻</button>
572
573
  ${e.length>0&&ne.html`
573
574
  <button class="cw-tasks-action-btn" onClick=${y} title="Clear all">🗑</button>
574
575
  `}
@@ -578,15 +579,15 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
578
579
  ${n&&ne.html`<div class="cw-tasks-error">${n}</div>`}
579
580
 
580
581
  <div class="cw-tasks-list">
581
- ${u.length===0?ne.html`
582
+ ${c.length===0?ne.html`
582
583
  <div class="cw-tasks-empty">
583
584
  <p>No tasks yet</p>
584
585
  <p class="cw-tasks-empty-hint">Tasks will appear here when the agent creates them</p>
585
586
  </div>
586
- `:u.map(b=>g(b))}
587
+ `:c.map(w=>b(w))}
587
588
  </div>
588
589
  </div>
589
- `}var X=require("htm/preact");function nt({systems:e,agents:t,selectedSystem:s,selectedAgent:n,selectedSystemVersion:a,selectedAgentVersion:r,onSelectSystem:y,onSelectAgent:i,onSelectSystemVersion:$,onSelectAgentVersion:g,disabled:u}){let b=e.find(m=>m.slug===s),c=t.find(m=>m.slug===n),C=b?.versions||[],l=c?.versions||[];if(e.length===0&&t.length===0)return null;let f=e.length>1,w=t.length>1,v=C.length>1,_=l.length>1;return X.html`
590
+ `}var X=require("htm/preact");function nt({systems:e,agents:t,selectedSystem:s,selectedAgent:n,selectedSystemVersion:o,selectedAgentVersion:l,onSelectSystem:y,onSelectAgent:d,onSelectSystemVersion:h,onSelectAgentVersion:b,disabled:c}){let w=e.find(m=>m.slug===s),p=t.find(m=>m.slug===n),v=w?.versions||[],r=p?.versions||[];if(e.length===0&&t.length===0)return null;let C=e.length>1,$=t.length>1,u=v.length>1,T=r.length>1;return X.html`
590
591
  <div class="cw-dev-toolbar">
591
592
  <div class="cw-dev-toolbar-label">
592
593
  <span class="cw-dev-toolbar-icon">🛠️</span>
@@ -597,12 +598,12 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
597
598
  <!-- System -->
598
599
  <div class="cw-dev-select-group">
599
600
  <label class="cw-dev-label">System</label>
600
- ${f?X.html`
601
+ ${C?X.html`
601
602
  <select
602
603
  class="cw-dev-select"
603
604
  value=${s||""}
604
605
  onChange=${m=>y(m.target.value)}
605
- disabled=${u}
606
+ disabled=${c}
606
607
  >
607
608
  ${e.map(m=>X.html`
608
609
  <option key=${m.slug} value=${m.slug}>
@@ -611,167 +612,168 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
611
612
  `)}
612
613
  </select>
613
614
  `:X.html`
614
- <span class="cw-dev-badge">${b?.name||"\u2014"}</span>
615
+ <span class="cw-dev-badge">${w?.name||"\u2014"}</span>
615
616
  `}
616
617
  </div>
617
618
 
618
619
  <!-- System Version -->
619
620
  <div class="cw-dev-select-group">
620
621
  <label class="cw-dev-label">Sys Ver</label>
621
- ${v?X.html`
622
+ ${u?X.html`
622
623
  <select
623
624
  class="cw-dev-select"
624
- value=${a||""}
625
- onChange=${m=>$(m.target.value||null)}
626
- disabled=${u}
625
+ value=${o||""}
626
+ onChange=${m=>h(m.target.value||null)}
627
+ disabled=${c}
627
628
  >
628
- ${C.map(m=>X.html`
629
+ ${v.map(m=>X.html`
629
630
  <option key=${m.version} value=${m.version}>
630
631
  ${m.version}${m.is_active?" \u2713":""}${m.is_draft?" (draft)":""}
631
632
  </option>
632
633
  `)}
633
634
  </select>
634
635
  `:X.html`
635
- <span class="cw-dev-badge">${C.length===1?C[0].version:"none"}</span>
636
+ <span class="cw-dev-badge">${v.length===1?v[0].version:"none"}</span>
636
637
  `}
637
638
  </div>
638
639
 
639
640
  <!-- Agent -->
640
641
  <div class="cw-dev-select-group">
641
642
  <label class="cw-dev-label">Agent</label>
642
- ${w?X.html`
643
+ ${$?X.html`
643
644
  <select
644
645
  class="cw-dev-select"
645
646
  value=${n||""}
646
- onChange=${m=>i(m.target.value)}
647
- disabled=${u}
647
+ onChange=${m=>d(m.target.value)}
648
+ disabled=${c}
648
649
  >
649
650
  ${t.map(m=>X.html`
650
651
  <option key=${m.slug} value=${m.slug}>
651
- ${m.name}${b?.entry_agent?.slug===m.slug?" \u2605":""}
652
+ ${m.name}${w?.entry_agent?.slug===m.slug?" \u2605":""}
652
653
  </option>
653
654
  `)}
654
655
  </select>
655
656
  `:X.html`
656
- <span class="cw-dev-badge">${c?.name||t[0]?.name||"\u2014"}${b?.entry_agent?.slug===(c?.slug||t[0]?.slug)?" \u2605":""}</span>
657
+ <span class="cw-dev-badge">${p?.name||t[0]?.name||"\u2014"}${w?.entry_agent?.slug===(p?.slug||t[0]?.slug)?" \u2605":""}</span>
657
658
  `}
658
659
  </div>
659
660
 
660
661
  <!-- Agent Version -->
661
662
  <div class="cw-dev-select-group">
662
663
  <label class="cw-dev-label">Agent Ver</label>
663
- ${_?X.html`
664
+ ${T?X.html`
664
665
  <select
665
666
  class="cw-dev-select"
666
- value=${r||""}
667
- onChange=${m=>g(m.target.value||null)}
668
- disabled=${u}
667
+ value=${l||""}
668
+ onChange=${m=>b(m.target.value||null)}
669
+ disabled=${c}
669
670
  >
670
- ${l.map(m=>X.html`
671
+ ${r.map(m=>X.html`
671
672
  <option key=${m.version} value=${m.version}>
672
673
  ${m.version}${m.is_active?" \u2713":""}${m.is_draft?" (draft)":""}
673
674
  </option>
674
675
  `)}
675
676
  </select>
676
677
  `:X.html`
677
- <span class="cw-dev-badge">${l.length===1?l[0].version:c?.active_version||"\u2014"}</span>
678
+ <span class="cw-dev-badge">${r.length===1?r[0].version:p?.active_version||"\u2014"}</span>
678
679
  `}
679
680
  </div>
680
681
  </div>
681
682
  </div>
682
- `}var W=require("preact/compat");function Fe(e,t,s){let[n,a]=(0,W.useState)([]),[r,y]=(0,W.useState)(!1),[i,$]=(0,W.useState)(null),[g,u]=(0,W.useState)(()=>s?.get(e.conversationIdKey)||null),[b,c]=(0,W.useState)(!1),[C,l]=(0,W.useState)(!1),[f,w]=(0,W.useState)(0),v=(0,W.useRef)(null),_=(0,W.useRef)(null);(0,W.useEffect)(()=>{g&&s?.set(e.conversationIdKey,g)},[g,e.conversationIdKey,s]);let m=(0,W.useCallback)(async(h,x,p)=>{v.current&&v.current.close();let S=e.apiPaths.runEvents.replace("{runId}",h),k=`${e.backendUrl}${S}`;x&&(k+=`?anonymous_token=${encodeURIComponent(x)}`);let T=new EventSource(k);v.current=T;let d="";T.addEventListener("assistant.message",F=>{try{let o=JSON.parse(F.data);e.onEvent&&e.onEvent("assistant.message",o.payload);let M=o.payload.content;M&&(d+=M,a(B=>{let Y=B[B.length-1];return Y?.role==="assistant"&&Y.id.startsWith("assistant-stream-")?[...B.slice(0,-1),{...Y,content:d}]:[...B,{id:"assistant-stream-"+Date.now(),role:"assistant",content:d,timestamp:new Date,type:"message"}]}))}catch(o){console.error("[ChatWidget] Parse error:",o)}}),T.addEventListener("tool.call",F=>{try{let o=JSON.parse(F.data);e.onEvent&&e.onEvent("tool.call",o.payload),a(M=>[...M,{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)}}),T.addEventListener("tool.result",F=>{try{let o=JSON.parse(F.data);e.onEvent&&e.onEvent("tool.result",o.payload);let M=o.payload.result,B=M?.error;a(Y=>[...Y,{id:"tool-result-"+Date.now(),role:"system",content:B?`\u274C ${M.error}`:"\u2713 Done",timestamp:new Date,type:"tool_result",metadata:{toolName:o.payload.name,result:M,toolCallId:o.payload.tool_call_id}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),T.addEventListener("custom",F=>{try{let o=JSON.parse(F.data);e.onEvent&&e.onEvent("custom",o.payload),o.payload?.type==="ui_control"&&e.onUIControl&&e.onUIControl(o.payload),o.payload?.type==="agent_context"&&a(M=>[...M,{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)}}),T.addEventListener("sub_agent.start",F=>{try{let o=JSON.parse(F.data);e.onEvent&&e.onEvent("sub_agent.start",o.payload),a(M=>[...M,{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)}}),T.addEventListener("sub_agent.end",F=>{try{let o=JSON.parse(F.data);e.onEvent&&e.onEvent("sub_agent.end",o.payload),a(M=>[...M,{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)}}),T.addEventListener("content.blocks",F=>{try{let o=JSON.parse(F.data);e.onEvent&&e.onEvent("content.blocks",o.payload),a(M=>[...M,{id:"content-blocks-"+Date.now(),role:"assistant",content:"",timestamp:new Date,type:"content_blocks",metadata:{toolName:o.payload.tool_name,toolCallId:o.payload.tool_call_id,blocks:o.payload.blocks}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}});let R=F=>{try{let o=JSON.parse(F.data);if(e.onEvent&&e.onEvent(o.type,o.payload),o.type==="run.failed"){let M=o.payload.error||"Agent run failed";$(M),a(B=>[...B,{id:"error-"+Date.now(),role:"system",content:`\u274C Error: ${M}`,timestamp:new Date,type:"error"}])}}catch(o){console.error("[ChatWidget] Parse error:",o)}y(!1),T.close(),v.current=null,d&&p&&p(d)};T.addEventListener("run.succeeded",R),T.addEventListener("run.failed",R),T.addEventListener("run.cancelled",R),T.addEventListener("run.timed_out",R),T.onerror=()=>{y(!1),T.close(),v.current=null}},[e]),V=(0,W.useCallback)(async(h,x={},p={})=>{if(!h.trim()||r)return;let S=[],k={};typeof x=="function"?k={onAssistantMessage:x}:Array.isArray(x)?(S=x,k=p):k=x||{};let{model:T,thinking:d,onAssistantMessage:R,supersedeFromMessageIndex:F}=k;y(!0),$(null);let o={id:he(),role:"user",content:h.trim(),timestamp:new Date,type:"message",files:S.length>0?S.map(M=>({name:M.name,size:M.size,type:M.type})):void 0};a(M=>[...M,o]);try{let M=await t.getOrCreateSession(),B;if(S.length>0){let j=e.apiCaseStyle!=="camel",qe=ve=>j?ye(ve):ve,ie=new FormData;ie.append(qe("agentKey"),e.agentKey),g&&ie.append(qe("conversationId"),g),ie.append("messages",JSON.stringify([{role:"user",content:h.trim()}])),ie.append("metadata",JSON.stringify(j?{...e.metadata,journey_type:e.defaultJourneyType}:{...e.metadata,journeyType:e.defaultJourneyType})),T&&ie.append("model",T),d&&ie.append("thinking","true"),S.forEach(ve=>{ie.append("files",ve)}),B=t.getFetchOptions({method:"POST",body:ie},M)}else{let j=t.transformRequest({agentKey:e.agentKey,conversationId:g,messages:[{role:"user",content:h.trim()}],metadata:{...e.metadata,journeyType:e.defaultJourneyType},...T&&{model:T},...d&&{thinking:!0},...F!==void 0&&{supersedeFromMessageIndex:F}});B=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(j)},M)}let Y=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,B),E=M;if(Y.status===401){t.clearSession();let j=await t.getOrCreateSession(!0);j&&(E=j,S.length>0?B=t.getFetchOptions({method:"POST",body:B.body},j):B=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:B.body},j),Y=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,B))}if(!Y.ok){let j=await Y.json().catch(()=>({}));throw new Error(j.error||j.detail||`HTTP ${Y.status}`)}let ee=await Y.json(),ae=t.transformResponse(ee);_.current=ae.id,!g&&ae.conversationId&&u(ae.conversationId),await m(ae.id,E,R)}catch(M){$(M.message||"Failed to send message"),y(!1)}finally{_.current=null}},[e,t,g,r,m]),z=(0,W.useCallback)(async()=>{let h=_.current;if(!(!h||!r))try{let x=e.apiPaths.cancelRun?e.apiPaths.cancelRun.replace("{runId}",h):`${e.apiPaths.runs}${h}/cancel/`;(await fetch(`${e.backendUrl}${x}`,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"}}))).ok&&(v.current&&(v.current.close(),v.current=null),y(!1),_.current=null,a(S=>[...S,{id:"cancelled-"+Date.now(),role:"system",content:"\u23F9 Run cancelled",timestamp:new Date,type:"cancelled"}]))}catch(x){console.error("[ChatWidget] Failed to cancel run:",x)}},[e,t,r]),A=(0,W.useCallback)(()=>{a([]),u(null),$(null),c(!1),w(0),s?.set(e.conversationIdKey,null)},[e.conversationIdKey,s]),O=h=>{let x={id:he(),role:h.role,timestamp:h.timestamp?new Date(h.timestamp):new Date};if(h.role==="tool")return{...x,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:he(),role:"assistant",content:`\u{1F527} ${S.function?.name||S.name||"tool"}`,timestamp:x.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:{...x,content:p,type:"message"}},P=(0,W.useCallback)(async h=>{console.log("[ChatWidget] loadConversation called with:",h),y(!0),a([]),u(h);try{let x=await t.getOrCreateSession(),S=`${e.backendUrl}${e.apiPaths.conversations}${h}/?limit=10&offset=0`;console.log("[ChatWidget] Fetching conversation from:",S);let k=await fetch(S,t.getFetchOptions({method:"GET"},x));if(console.log("[ChatWidget] Response status:",k.status),k.ok){let T=await k.json();console.log("[ChatWidget] Raw conversation:",T);let d=t.transformResponse(T);if(console.log("[ChatWidget] Transformed conversation:",d),d.messages){let R=d.messages.flatMap(O).filter(Boolean);console.log("[ChatWidget] Mapped messages:",R),a(R)}c(d.hasMore||!1),w(d.messages?.length||0)}else k.status===404?(console.log("[ChatWidget] Conversation not found, clearing"),u(null),s?.set(e.conversationIdKey,null)):console.error("[ChatWidget] Unexpected response status:",k.status)}catch(x){console.error("[ChatWidget] Failed to load conversation:",x)}finally{y(!1)}},[e,t,s]),K=(0,W.useCallback)(async()=>{if(!(!g||C||!b)){l(!0);try{let h=await t.getOrCreateSession(),p=`${e.backendUrl}${e.apiPaths.conversations}${g}/?limit=10&offset=${f}`,S=await fetch(p,t.getFetchOptions({method:"GET"},h));if(S.ok){let k=await S.json(),T=t.transformResponse(k);if(T.messages?.length>0){let d=T.messages.flatMap(O).filter(Boolean);a(R=>[...d,...R]),w(R=>R+T.messages.length),c(T.hasMore||!1)}else c(!1)}}catch(h){console.error("[ChatWidget] Failed to load more messages:",h)}finally{l(!1)}}},[e,t,g,f,C,b]),G=(0,W.useCallback)(async(h,x,p={})=>{if(r)return;let S=n[h];if(!S||S.role!=="user")return;let k=n.slice(0,h);a(k),await V(x,{...p,supersedeFromMessageIndex:h})},[n,r,V]),U=(0,W.useCallback)(async(h,x={})=>{if(r)return;let p=n[h];if(!p)return;let S=h,k=p;if(p.role==="assistant"){for(let d=h-1;d>=0;d--)if(n[d].role==="user"){S=d,k=n[d];break}if(k.role!=="user")return}else if(p.role!=="user")return;let T=n.slice(0,S);a(T),await V(k.content,{...x,supersedeFromMessageIndex:S})},[n,r,V]);return(0,W.useEffect)(()=>()=>{v.current&&v.current.close()},[]),{messages:n,isLoading:r,error:i,conversationId:g,hasMoreMessages:b,loadingMoreMessages:C,sendMessage:V,cancelRun:z,clearMessages:A,loadConversation:P,loadMoreMessages:K,setConversationId:u,editMessage:G,retryMessage:U}}var Z=require("preact/compat"),at="cw_thinking_enabled";function Oe(e,t,s){let[n,a]=(0,Z.useState)([]),[r,y]=(0,Z.useState)(null),[i,$]=(0,Z.useState)(null),[g,u]=(0,Z.useState)(!1),[b,c]=(0,Z.useState)(!1);(0,Z.useEffect)(()=>{(async()=>{if(e.showModelSelector){u(!0);try{let _=await fetch(`${e.backendUrl}${e.apiPaths.models}`,t.getFetchOptions({method:"GET"}));if(_.ok){let m=await _.json(),V=m.models||[];a(V),$(m.default);let z=s?.get(e.modelKey);z&&V.some(O=>O.id===z)?y(z):y(m.default),s?.get(at)==="true"&&c(!0)}}catch(_){console.warn("[ChatWidget] Failed to load models:",_)}finally{u(!1)}}})()},[e.backendUrl,e.apiPaths.models,e.showModelSelector,e.modelKey,t,s]);let C=(0,Z.useCallback)(v=>{y(v),s?.set(e.modelKey,v)},[e.modelKey,s]),l=(0,Z.useCallback)(v=>{c(v),s?.set(at,v?"true":"false")},[s]),f=(0,Z.useCallback)(()=>n.find(v=>v.id===r)||null,[n,r]),w=(0,Z.useCallback)(()=>f()?.supports_thinking||!1,[f]);return{availableModels:n,selectedModel:r,defaultModel:i,isLoading:g,selectModel:C,getSelectedModelInfo:f,thinkingEnabled:b,toggleThinking:l,supportsThinking:w}}var te=require("preact/compat");function Pe(e,t){let[s,n]=(0,te.useState)(null),[a,r]=(0,te.useState)(!1),[y,i]=(0,te.useState)(null),$=e.apiPaths?.tasks||"/api/agent/tasks/",g=(0,te.useCallback)(async()=>{r(!0),i(null);try{let f=`${e.backendUrl}${$}`,w=await fetch(f,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(f){console.error("[useTasks] Failed to load task list:",f),i("Failed to load tasks")}finally{r(!1)}},[e.backendUrl,$,t]),u=(0,te.useCallback)(async f=>{if(!s)return null;try{let w=`${e.backendUrl}${$}${s.id}/add_task/`,v=await fetch(w,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(f)}));if(v.ok){let _=await v.json();return await g(),_}else{let _=await v.json().catch(()=>({}));return i(_.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,$,s,t,g]),b=(0,te.useCallback)(async(f,w)=>{if(!s)return null;try{let v=`${e.backendUrl}${$}${s.id}/update_task/${f}/`,_=await fetch(v,t.getFetchOptions({method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(w)}));if(_.ok){let m=await _.json();return await g(),m}else{let m=await _.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,$,s,t,g]),c=(0,te.useCallback)(async f=>{if(!s)return!1;try{let w=`${e.backendUrl}${$}${s.id}/remove_task/${f}/`,v=await fetch(w,t.getFetchOptions({method:"DELETE"}));if(v.ok)return await g(),!0;{let _=await v.json().catch(()=>({}));return i(_.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,$,s,t,g]),C=(0,te.useCallback)(async()=>{if(!s)return!1;try{let f=`${e.backendUrl}${$}${s.id}/clear/`,w=await fetch(f,t.getFetchOptions({method:"POST"}));if(w.ok)return await g(),!0;{let v=await w.json().catch(()=>({}));return i(v.error||"Failed to clear tasks"),!1}}catch(f){return console.error("[useTasks] Failed to clear tasks:",f),i("Failed to clear tasks"),!1}},[e.backendUrl,$,s,t,g]),l=(0,te.useCallback)(()=>i(null),[]);return{taskList:s,tasks:s?.tasks||[],progress:s?.progress||{total:0,completed:0,percent_complete:0},isLoading:a,error:y,loadTaskList:g,addTask:u,updateTask:b,removeTask:c,clearTasks:C,clearError:l}}var J=require("preact/compat"),ot="cw_selected_system",Je="cw_selected_agent",rt="cw_selected_system_version",Le="cw_selected_agent_version";function lt(e,t,s){let[n,a]=(0,J.useState)([]),[r,y]=(0,J.useState)([]),[i,$]=(0,J.useState)(null),[g,u]=(0,J.useState)(null),[b,c]=(0,J.useState)(null),[C,l]=(0,J.useState)(null),[f,w]=(0,J.useState)(!1),v=(0,J.useCallback)(()=>{if(g)return g;if(i){let A=n.find(O=>O.slug===i);if(A?.entry_agent)return A.entry_agent.slug}return e.agentKey},[g,i,n,e.agentKey]);(0,J.useEffect)(()=>{if(!e.showDevTools)return;(async()=>{w(!0);try{let O=await fetch(`${e.backendUrl}${e.apiPaths.systems}`,t.getFetchOptions({method:"GET"}));if(O.ok){let P=await O.json(),K=P.results||P;a(K);let G=s?.get(ot);G&&K.some(U=>U.slug===G)?$(G):K.length===1&&$(K[0].slug)}}catch(O){console.warn("[ChatWidget] Failed to load systems:",O)}finally{w(!1)}})()},[e.backendUrl,e.apiPaths.systems,e.showDevTools,t,s]),(0,J.useEffect)(()=>{if(!e.showDevTools)return;(async()=>{try{let O=i?`?system=${encodeURIComponent(i)}`:"",P=await fetch(`${e.backendUrl}${e.apiPaths.agents}${O}`,t.getFetchOptions({method:"GET"}));if(P.ok){let K=await P.json(),G=K.results||K;y(G);let U=s?.get(Je);if(U&&G.some(x=>x.slug===U))u(U);else if(i){let x=n.find(p=>p.slug===i);x?.entry_agent&&u(x.entry_agent.slug)}let h=s?.get(Le);h&&l(h)}}catch(O){console.warn("[ChatWidget] Failed to load agents:",O)}})()},[e.backendUrl,e.apiPaths.agents,e.showDevTools,i,t,s,n]);let _=(0,J.useCallback)(A=>{$(A),s?.set(ot,A),u(null),l(null),s?.set(Je,null),s?.set(Le,null);let P=n.find(K=>K.slug===A)?.active_version||null;c(P),s?.set(rt,P)},[s,n]),m=(0,J.useCallback)(A=>{u(A),s?.set(Je,A);let P=r.find(K=>K.slug===A)?.active_version||null;l(P),s?.set(Le,P)},[s,r]),V=(0,J.useCallback)(A=>{c(A),s?.set(rt,A)},[s]),z=(0,J.useCallback)(A=>{l(A),s?.set(Le,A)},[s]);return{systems:n,agents:r,selectedSystem:i,selectedAgent:g,selectedSystemVersion:b,selectedAgentVersion:C,isLoading:f,selectSystem:_,selectAgent:m,selectSystemVersion:V,selectAgentVersion:z,getEffectiveAgentKey:v}}function Ke(e,t,s){let n=u=>!u||typeof u!="object"||e.apiCaseStyle==="camel"?u:pe(u),a=u=>!u||typeof u!="object"||e.apiCaseStyle==="snake"?u:ue(u),r=()=>e.authStrategy?e.authStrategy:e.authToken?"token":e.apiPaths.anonymousSession||e.anonymousSessionEndpoint?"anonymous":"none",y=(u=null)=>{let b=r(),c={},C=u||e.authToken||t().authToken;if(b==="token"&&C){let l=e.authHeader||"Authorization",f=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Token";c[l]=f?`${f} ${C}`:C}else if(b==="jwt"&&C){let l=e.authHeader||"Authorization",f=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Bearer";c[l]=f?`${f} ${C}`:C}else if(b==="anonymous"&&C){let l=e.authHeader||e.anonymousTokenHeader||"X-Anonymous-Token";c[l]=C}if(b==="session"){let l=Te(e.csrfCookieName);l&&(c["X-CSRFToken"]=l)}return c};return{getAuthStrategy:r,getAuthHeaders:y,getFetchOptions:(u={},b=null)=>{let c=r(),C={...u},l=y(b);return console.log("[ChatWidget] getFetchOptions - strategy:",c,"overrideToken:",b,"authHeaders:",l),C.headers={...C.headers,...l},c==="session"&&(C.credentials="include"),C},getOrCreateSession:async(u=!1)=>{let b=r(),c=t(),C=e.anonymousTokenKey||e.sessionTokenKey;if(b!=="anonymous")return e.authToken||c.authToken;if(!u){if(c.authToken)return c.authToken;let l=c.storage?.get(C);if(l)return s(f=>({...f,authToken:l})),l}try{let l=e.anonymousSessionEndpoint||e.apiPaths.anonymousSession,f=await fetch(`${e.backendUrl}${l}`,{method:"POST",headers:{"Content-Type":"application/json"}});if(f.ok){let w=await f.json();return s(v=>({...v,authToken:w.token})),c.storage?.set(C,w.token),w.token}}catch(l){console.warn("[ChatWidget] Failed to create session:",l)}return null},clearSession:()=>{let u=e.anonymousTokenKey||e.sessionTokenKey,b=t();s(c=>({...c,authToken:null})),b.storage?.set(u,null)},transformRequest:n,transformResponse:a}}function $e({config:e,onStateChange:t,markdownParser:s,apiRef:n}){console.log("[ChatWidget] Config:",{showConversationSidebar:e.showConversationSidebar,apiPaths:e.apiPaths});let[a,r]=(0,D.useState)(e.embedded||e.forceOpen===!0),[y,i]=(0,D.useState)(!1),[$,g]=(0,D.useState)(!1),[u,b]=(0,D.useState)(!1),[c,C]=(0,D.useState)([]),[l,f]=(0,D.useState)("chat"),[w,v]=(0,D.useState)(!1),[_,m]=(0,D.useState)(e.enableTTS),[V,z]=(0,D.useState)(!1),[A,O]=(0,D.useState)(null);(0,D.useEffect)(()=>{e.forceOpen!==void 0&&r(e.forceOpen)},[e.forceOpen]);let P=(0,D.useMemo)(()=>Se(e.containerId),[e.containerId]),[K,G]=(0,D.useState)(e.authToken||null),U=(0,D.useMemo)(()=>Ke(e,()=>({authToken:K,storage:P}),ae=>{let j=ae({authToken:K,storage:P});j.authToken!==K&&G(j.authToken)}),[e,K,P]),h=lt(e,U,P),x=(0,D.useMemo)(()=>{if(!e.showDevTools)return e;let E=h.getEffectiveAgentKey();return E&&E!==e.agentKey?{...e,agentKey:E}:e},[e,h.getEffectiveAgentKey]),p=Fe(x,U,P),S=Oe(e,U,P),k=Pe(e,U);(0,D.useEffect)(()=>{for(let E=p.messages.length-1;E>=0;E--){let ee=p.messages[E];if(ee.type==="sub_agent_start"){O({key:ee.metadata?.subAgentKey,name:ee.metadata?.agentName});return}if(ee.type==="sub_agent_end"){O(null);return}}},[p.messages]),(0,D.useEffect)(()=>{let E=P.get(e.conversationIdKey);console.log("[ChatWidget] Initial load - storedConvId:",E,"key:",e.conversationIdKey),console.log("[ChatWidget] apiPaths.conversations:",e.apiPaths.conversations),E&&(console.log("[ChatWidget] Loading conversation:",E),p.loadConversation(E))},[]),(0,D.useEffect)(()=>{t&&t({isOpen:a,isExpanded:y,debugMode:$,messages:p.messages,conversationId:p.conversationId,isLoading:p.isLoading,error:p.error})},[a,y,$,p.messages,p.conversationId,p.isLoading,p.error]);let T=(0,D.useCallback)(async()=>{if(e.showConversationSidebar){v(!0);try{let E=x.agentKey,ee=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(E)}`,ae=await fetch(ee,U.getFetchOptions({method:"GET"}));if(ae.ok){let j=await ae.json();C(j.results||j)}}catch(E){console.error("[ChatWidget] Failed to load conversations:",E),C([])}finally{v(!1)}}},[e,x,U]),d=(0,D.useCallback)(()=>{let E=!u;b(E),E&&T()},[u,T]),R=(0,D.useCallback)(E=>{E!==p.conversationId&&p.loadConversation(E),b(!1)},[p]),F=(0,D.useCallback)(()=>{p.clearMessages(),b(!1)},[p]),o=(0,D.useCallback)(E=>{p.sendMessage(E,{model:S.selectedModel,thinking:S.thinkingEnabled&&S.supportsThinking(),onAssistantMessage:ee=>{}})},[p,_,S.selectedModel,S.thinkingEnabled,S.supportsThinking]),M=(0,D.useCallback)(E=>{f(E),E==="tasks"&&k.loadTaskList()},[k]);if((0,D.useEffect)(()=>{n&&(n.current={open:()=>r(!0),close:()=>r(!1),send:E=>o(E),clearMessages:()=>p.clearMessages(),toggleTTS:()=>m(E=>!E),stopSpeech:()=>z(!1),setAuth:E=>{E.token!==void 0&&G(E.token)},clearAuth:()=>G(null)})},[p,n,o]),!e.embedded&&!a)return Q.html`
683
+ `}var B=require("preact/compat");function Fe(e,t,s){let[n,o]=(0,B.useState)([]),[l,y]=(0,B.useState)(!1),[d,h]=(0,B.useState)(null),[b,c]=(0,B.useState)(()=>s?.get(e.conversationIdKey)||null),[w,p]=(0,B.useState)(!1),[v,r]=(0,B.useState)(!1),[C,$]=(0,B.useState)(0),u=(0,B.useRef)(null),T=(0,B.useRef)(null);(0,B.useEffect)(()=>{b&&s?.set(e.conversationIdKey,b)},[b,e.conversationIdKey,s]);let m=(0,B.useCallback)(async(g,_,f)=>{u.current&&u.current.close();let S=e.apiPaths.runEvents.replace("{runId}",g),E=`${e.backendUrl}${S}`;_&&(E+=`?anonymous_token=${encodeURIComponent(_)}`);let k=new EventSource(E);u.current=k;let i="";k.addEventListener("assistant.message",O=>{try{let a=JSON.parse(O.data);e.onEvent&&e.onEvent("assistant.message",a.payload);let M=a.payload.content;M&&(i+=M,o(H=>{let Y=H[H.length-1];return Y?.role==="assistant"&&Y.id.startsWith("assistant-stream-")?[...H.slice(0,-1),{...Y,content:i}]:[...H,{id:"assistant-stream-"+Date.now(),role:"assistant",content:i,timestamp:new Date,type:"message"}]}))}catch(a){console.error("[ChatWidget] Parse error:",a)}}),k.addEventListener("tool.call",O=>{try{let a=JSON.parse(O.data);e.onEvent&&e.onEvent("tool.call",a.payload),o(M=>[...M,{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)}}),k.addEventListener("tool.result",O=>{try{let a=JSON.parse(O.data);e.onEvent&&e.onEvent("tool.result",a.payload);let M=a.payload.result,H=M?.error;o(Y=>[...Y,{id:"tool-result-"+Date.now(),role:"system",content:H?`\u274C ${M.error}`:"\u2713 Done",timestamp:new Date,type:"tool_result",metadata:{toolName:a.payload.name,result:M,toolCallId:a.payload.tool_call_id}}])}catch(a){console.error("[ChatWidget] Parse error:",a)}}),k.addEventListener("custom",O=>{try{let a=JSON.parse(O.data);e.onEvent&&e.onEvent("custom",a.payload),a.payload?.type==="ui_control"&&e.onUIControl&&e.onUIControl(a.payload),a.payload?.type==="agent_context"&&o(M=>[...M,{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)}}),k.addEventListener("sub_agent.start",O=>{try{let a=JSON.parse(O.data);e.onEvent&&e.onEvent("sub_agent.start",a.payload),o(M=>[...M,{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)}}),k.addEventListener("sub_agent.end",O=>{try{let a=JSON.parse(O.data);e.onEvent&&e.onEvent("sub_agent.end",a.payload),o(M=>[...M,{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)}}),k.addEventListener("content.blocks",O=>{try{let a=JSON.parse(O.data);e.onEvent&&e.onEvent("content.blocks",a.payload),o(M=>[...M,{id:"content-blocks-"+Date.now(),role:"assistant",content:"",timestamp:new Date,type:"content_blocks",metadata:{toolName:a.payload.tool_name,toolCallId:a.payload.tool_call_id,blocks:a.payload.blocks}}])}catch(a){console.error("[ChatWidget] Parse error:",a)}});let A=O=>{try{let a=JSON.parse(O.data);if(e.onEvent&&e.onEvent(a.type,a.payload),a.type==="run.failed"){let M=a.payload.error||"Agent run failed";h(M),o(H=>[...H,{id:"error-"+Date.now(),role:"system",content:`\u274C Error: ${M}`,timestamp:new Date,type:"error"}])}}catch(a){console.error("[ChatWidget] Parse error:",a)}y(!1),k.close(),u.current=null,i&&f&&f(i)};k.addEventListener("run.succeeded",A),k.addEventListener("run.failed",A),k.addEventListener("run.cancelled",A),k.addEventListener("run.timed_out",A),k.onerror=()=>{y(!1),k.close(),u.current=null}},[e]),W=(0,B.useCallback)(async(g,_={},f={})=>{if(!g.trim()||l)return;let S=[],E={};typeof _=="function"?E={onAssistantMessage:_}:Array.isArray(_)?(S=_,E=f):E=_||{};let{model:k,thinking:i,onAssistantMessage:A,supersedeFromMessageIndex:O}=E;y(!0),h(null);let a={id:he(),role:"user",content:g.trim(),timestamp:new Date,type:"message",files:S.length>0?S.map(M=>({name:M.name,size:M.size,type:M.type})):void 0};o(M=>[...M,a]);try{let M=await t.getOrCreateSession(),H;if(S.length>0){let j=e.apiCaseStyle!=="camel",qe=ve=>j?ye(ve):ve,ie=new FormData;ie.append(qe("agentKey"),e.agentKey),b&&ie.append(qe("conversationId"),b),ie.append("messages",JSON.stringify([{role:"user",content:g.trim()}])),ie.append("metadata",JSON.stringify(j?{...e.metadata,journey_type:e.defaultJourneyType}:{...e.metadata,journeyType:e.defaultJourneyType})),k&&ie.append("model",k),i&&ie.append("thinking","true"),S.forEach(ve=>{ie.append("files",ve)}),H=t.getFetchOptions({method:"POST",body:ie},M)}else{let j=t.transformRequest({agentKey:e.agentKey,conversationId:b,messages:[{role:"user",content:g.trim()}],metadata:{...e.metadata,journeyType:e.defaultJourneyType},...k&&{model:k},...i&&{thinking:!0},...O!==void 0&&{supersedeFromMessageIndex:O}});H=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(j)},M)}let Y=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,H),x=M;if(Y.status===401){t.clearSession();let j=await t.getOrCreateSession(!0);j&&(x=j,S.length>0?H=t.getFetchOptions({method:"POST",body:H.body},j):H=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:H.body},j),Y=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,H))}if(!Y.ok){let j=await Y.json().catch(()=>({}));throw new Error(j.error||j.detail||`HTTP ${Y.status}`)}let ee=await Y.json(),ae=t.transformResponse(ee);T.current=ae.id,!b&&ae.conversationId&&c(ae.conversationId),await m(ae.id,x,A)}catch(M){h(M.message||"Failed to send message"),y(!1)}finally{T.current=null}},[e,t,b,l,m]),G=(0,B.useCallback)(async()=>{let g=T.current;if(!(!g||!l))try{let _=e.apiPaths.cancelRun?e.apiPaths.cancelRun.replace("{runId}",g):`${e.apiPaths.runs}${g}/cancel/`;(await fetch(`${e.backendUrl}${_}`,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"}}))).ok&&(u.current&&(u.current.close(),u.current=null),y(!1),T.current=null,o(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,l]),R=(0,B.useCallback)(()=>{o([]),c(null),h(null),p(!1),$(0),s?.set(e.conversationIdKey,null)},[e.conversationIdKey,s]),P=g=>{let _={id:he(),role:g.role,timestamp:g.timestamp?new Date(g.timestamp):new Date};if(g.role==="tool")return{..._,role:"system",content:"\u2713 Done",type:"tool_result",metadata:{result:g.content,toolCallId:g.toolCallId}};if(g.role==="assistant"&&g.toolCalls&&g.toolCalls.length>0)return g.toolCalls.map(S=>({id:he(),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 f=typeof g.content=="string"?g.content:JSON.stringify(g.content);return g.role==="assistant"&&!f?.trim()?null:{..._,content:f,type:"message"}},F=(0,B.useCallback)(async g=>{console.log("[ChatWidget] loadConversation called with:",g),y(!0),o([]),c(g);try{let _=await t.getOrCreateSession(),S=`${e.backendUrl}${e.apiPaths.conversations}${g}/?limit=10&offset=0`;console.log("[ChatWidget] Fetching conversation from:",S);let E=await fetch(S,t.getFetchOptions({method:"GET"},_));if(console.log("[ChatWidget] Response status:",E.status),E.ok){let k=await E.json();console.log("[ChatWidget] Raw conversation:",k);let i=t.transformResponse(k);if(console.log("[ChatWidget] Transformed conversation:",i),i.messages){let A=i.messages.flatMap(P).filter(Boolean);console.log("[ChatWidget] Mapped messages:",A),o(A)}p(i.hasMore||!1),$(i.messages?.length||0)}else E.status===404?(console.log("[ChatWidget] Conversation not found, clearing"),c(null),s?.set(e.conversationIdKey,null)):console.error("[ChatWidget] Unexpected response status:",E.status)}catch(_){console.error("[ChatWidget] Failed to load conversation:",_)}finally{y(!1)}},[e,t,s]),K=(0,B.useCallback)(async()=>{if(!(!b||v||!w)){r(!0);try{let g=await t.getOrCreateSession(),f=`${e.backendUrl}${e.apiPaths.conversations}${b}/?limit=10&offset=${C}`,S=await fetch(f,t.getFetchOptions({method:"GET"},g));if(S.ok){let E=await S.json(),k=t.transformResponse(E);if(k.messages?.length>0){let i=k.messages.flatMap(P).filter(Boolean);o(A=>[...i,...A]),$(A=>A+k.messages.length),p(k.hasMore||!1)}else p(!1)}}catch(g){console.error("[ChatWidget] Failed to load more messages:",g)}finally{r(!1)}}},[e,t,b,C,v,w]),J=(0,B.useCallback)(async(g,_,f={})=>{if(l)return;let S=n[g];if(!S||S.role!=="user")return;let E=n.slice(0,g);o(E),await W(_,{...f,supersedeFromMessageIndex:g})},[n,l,W]),U=(0,B.useCallback)(async(g,_={})=>{if(l)return;let f=n[g];if(!f)return;let S=g,E=f;if(f.role==="assistant"){for(let i=g-1;i>=0;i--)if(n[i].role==="user"){S=i,E=n[i];break}if(E.role!=="user")return}else if(f.role!=="user")return;let k=n.slice(0,S);o(k),await W(E.content,{..._,supersedeFromMessageIndex:S})},[n,l,W]);return(0,B.useEffect)(()=>()=>{u.current&&u.current.close()},[]),{messages:n,isLoading:l,error:d,conversationId:b,hasMoreMessages:w,loadingMoreMessages:v,sendMessage:W,cancelRun:G,clearMessages:R,loadConversation:F,loadMoreMessages:K,setConversationId:c,editMessage:J,retryMessage:U}}var Z=require("preact/compat"),at="cw_thinking_enabled";function Oe(e,t,s){let[n,o]=(0,Z.useState)([]),[l,y]=(0,Z.useState)(null),[d,h]=(0,Z.useState)(null),[b,c]=(0,Z.useState)(!1),[w,p]=(0,Z.useState)(!1);(0,Z.useEffect)(()=>{(async()=>{if(e.showModelSelector){c(!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||[];o(W),h(m.default);let G=s?.get(e.modelKey);G&&W.some(P=>P.id===G)?y(G):y(m.default),s?.get(at)==="true"&&p(!0)}}catch(T){console.warn("[ChatWidget] Failed to load models:",T)}finally{c(!1)}}})()},[e.backendUrl,e.apiPaths.models,e.showModelSelector,e.modelKey,t,s]);let v=(0,Z.useCallback)(u=>{y(u),s?.set(e.modelKey,u)},[e.modelKey,s]),r=(0,Z.useCallback)(u=>{p(u),s?.set(at,u?"true":"false")},[s]),C=(0,Z.useCallback)(()=>n.find(u=>u.id===l)||null,[n,l]),$=(0,Z.useCallback)(()=>C()?.supports_thinking||!1,[C]);return{availableModels:n,selectedModel:l,defaultModel:d,isLoading:b,selectModel:v,getSelectedModelInfo:C,thinkingEnabled:w,toggleThinking:r,supportsThinking:$}}var te=require("preact/compat");function Pe(e,t){let[s,n]=(0,te.useState)(null),[o,l]=(0,te.useState)(!1),[y,d]=(0,te.useState)(null),h=e.apiPaths?.tasks||"/api/agent/tasks/",b=(0,te.useCallback)(async()=>{l(!0),d(null);try{let C=`${e.backendUrl}${h}`,$=await fetch(C,t.getFetchOptions({method:"GET"}));if($.ok){let u=await $.json();n(u)}else{let u=await $.json().catch(()=>({}));d(u.error||"Failed to load tasks")}}catch(C){console.error("[useTasks] Failed to load task list:",C),d("Failed to load tasks")}finally{l(!1)}},[e.backendUrl,h,t]),c=(0,te.useCallback)(async C=>{if(!s)return null;try{let $=`${e.backendUrl}${h}${s.id}/add_task/`,u=await fetch($,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(C)}));if(u.ok){let T=await u.json();return await b(),T}else{let T=await u.json().catch(()=>({}));return d(T.error||"Failed to add task"),null}}catch($){return console.error("[useTasks] Failed to add task:",$),d("Failed to add task"),null}},[e.backendUrl,h,s,t,b]),w=(0,te.useCallback)(async(C,$)=>{if(!s)return null;try{let u=`${e.backendUrl}${h}${s.id}/update_task/${C}/`,T=await fetch(u,t.getFetchOptions({method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify($)}));if(T.ok){let m=await T.json();return await b(),m}else{let m=await T.json().catch(()=>({}));return d(m.error||"Failed to update task"),null}}catch(u){return console.error("[useTasks] Failed to update task:",u),d("Failed to update task"),null}},[e.backendUrl,h,s,t,b]),p=(0,te.useCallback)(async C=>{if(!s)return!1;try{let $=`${e.backendUrl}${h}${s.id}/remove_task/${C}/`,u=await fetch($,t.getFetchOptions({method:"DELETE"}));if(u.ok)return await b(),!0;{let T=await u.json().catch(()=>({}));return d(T.error||"Failed to remove task"),!1}}catch($){return console.error("[useTasks] Failed to remove task:",$),d("Failed to remove task"),!1}},[e.backendUrl,h,s,t,b]),v=(0,te.useCallback)(async()=>{if(!s)return!1;try{let C=`${e.backendUrl}${h}${s.id}/clear/`,$=await fetch(C,t.getFetchOptions({method:"POST"}));if($.ok)return await b(),!0;{let u=await $.json().catch(()=>({}));return d(u.error||"Failed to clear tasks"),!1}}catch(C){return console.error("[useTasks] Failed to clear tasks:",C),d("Failed to clear tasks"),!1}},[e.backendUrl,h,s,t,b]),r=(0,te.useCallback)(()=>d(null),[]);return{taskList:s,tasks:s?.tasks||[],progress:s?.progress||{total:0,completed:0,percent_complete:0},isLoading:o,error:y,loadTaskList:b,addTask:c,updateTask:w,removeTask:p,clearTasks:v,clearError:r}}var z=require("preact/compat"),ot="cw_selected_system",Je="cw_selected_agent",rt="cw_selected_system_version",Le="cw_selected_agent_version";function lt(e,t,s){let[n,o]=(0,z.useState)([]),[l,y]=(0,z.useState)([]),[d,h]=(0,z.useState)(null),[b,c]=(0,z.useState)(null),[w,p]=(0,z.useState)(null),[v,r]=(0,z.useState)(null),[C,$]=(0,z.useState)(!1),u=(0,z.useCallback)(()=>{if(b)return b;if(d){let R=n.find(P=>P.slug===d);if(R?.entry_agent)return R.entry_agent.slug}return e.agentKey},[b,d,n,e.agentKey]);(0,z.useEffect)(()=>{if(!e.showDevTools)return;(async()=>{$(!0);try{let P=await fetch(`${e.backendUrl}${e.apiPaths.systems}`,t.getFetchOptions({method:"GET"}));if(P.ok){let F=await P.json(),K=F.results||F;o(K);let J=s?.get(ot);J&&K.some(U=>U.slug===J)?h(J):K.length===1&&h(K[0].slug)}}catch(P){console.warn("[ChatWidget] Failed to load systems:",P)}finally{$(!1)}})()},[e.backendUrl,e.apiPaths.systems,e.showDevTools,t,s]),(0,z.useEffect)(()=>{if(!e.showDevTools)return;(async()=>{try{let P=d?`?system=${encodeURIComponent(d)}`:"",F=await fetch(`${e.backendUrl}${e.apiPaths.agents}${P}`,t.getFetchOptions({method:"GET"}));if(F.ok){let K=await F.json(),J=K.results||K;y(J);let U=s?.get(Je);if(U&&J.some(_=>_.slug===U))c(U);else if(d){let _=n.find(f=>f.slug===d);_?.entry_agent&&c(_.entry_agent.slug)}let g=s?.get(Le);g&&r(g)}}catch(P){console.warn("[ChatWidget] Failed to load agents:",P)}})()},[e.backendUrl,e.apiPaths.agents,e.showDevTools,d,t,s,n]);let T=(0,z.useCallback)(R=>{h(R),s?.set(ot,R),c(null),r(null),s?.set(Je,null),s?.set(Le,null);let F=n.find(K=>K.slug===R)?.active_version||null;p(F),s?.set(rt,F)},[s,n]),m=(0,z.useCallback)(R=>{c(R),s?.set(Je,R);let F=l.find(K=>K.slug===R)?.active_version||null;r(F),s?.set(Le,F)},[s,l]),W=(0,z.useCallback)(R=>{p(R),s?.set(rt,R)},[s]),G=(0,z.useCallback)(R=>{r(R),s?.set(Le,R)},[s]);return{systems:n,agents:l,selectedSystem:d,selectedAgent:b,selectedSystemVersion:w,selectedAgentVersion:v,isLoading:C,selectSystem:T,selectAgent:m,selectSystemVersion:W,selectAgentVersion:G,getEffectiveAgentKey:u}}function Ke(e,t,s){let n=c=>!c||typeof c!="object"||e.apiCaseStyle==="camel"?c:pe(c),o=c=>!c||typeof c!="object"||e.apiCaseStyle==="snake"?c:ue(c),l=()=>e.authStrategy?e.authStrategy:e.authToken?"token":e.apiPaths.anonymousSession||e.anonymousSessionEndpoint?"anonymous":"none",y=(c=null)=>{let w=l(),p={},v=c||e.authToken||t().authToken;if(w==="token"&&v){let r=e.authHeader||"Authorization",C=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Token";p[r]=C?`${C} ${v}`:v}else if(w==="jwt"&&v){let r=e.authHeader||"Authorization",C=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Bearer";p[r]=C?`${C} ${v}`:v}else if(w==="anonymous"&&v){let r=e.authHeader||e.anonymousTokenHeader||"X-Anonymous-Token";p[r]=v}if(w==="session"){let r=Te(e.csrfCookieName);r&&(p["X-CSRFToken"]=r)}return p};return{getAuthStrategy:l,getAuthHeaders:y,getFetchOptions:(c={},w=null)=>{let p=l(),v={...c},r=y(w);return console.log("[ChatWidget] getFetchOptions - strategy:",p,"overrideToken:",w,"authHeaders:",r),v.headers={...v.headers,...r},p==="session"&&(v.credentials="include"),v},getOrCreateSession:async(c=!1)=>{let w=l(),p=t(),v=e.anonymousTokenKey||e.sessionTokenKey;if(w!=="anonymous")return e.authToken||p.authToken;if(!c){if(p.authToken)return p.authToken;let r=p.storage?.get(v);if(r)return s(C=>({...C,authToken:r})),r}try{let r=e.anonymousSessionEndpoint||e.apiPaths.anonymousSession,C=await fetch(`${e.backendUrl}${r}`,{method:"POST",headers:{"Content-Type":"application/json"}});if(C.ok){let $=await C.json();return s(u=>({...u,authToken:$.token})),p.storage?.set(v,$.token),$.token}}catch(r){console.warn("[ChatWidget] Failed to create session:",r)}return null},clearSession:()=>{let c=e.anonymousTokenKey||e.sessionTokenKey,w=t();s(p=>({...p,authToken:null})),w.storage?.set(c,null)},transformRequest:n,transformResponse:o}}function $e({config:e,onStateChange:t,markdownParser:s,apiRef:n}){console.log("[ChatWidget] Config:",{showConversationSidebar:e.showConversationSidebar,apiPaths:e.apiPaths});let[o,l]=(0,D.useState)(e.embedded||e.forceOpen===!0),[y,d]=(0,D.useState)(!1),[h,b]=(0,D.useState)(!1),[c,w]=(0,D.useState)(!1),[p,v]=(0,D.useState)([]),[r,C]=(0,D.useState)("chat"),[$,u]=(0,D.useState)(!1),[T,m]=(0,D.useState)(e.enableTTS),[W,G]=(0,D.useState)(!1),[R,P]=(0,D.useState)(null);(0,D.useEffect)(()=>{e.forceOpen!==void 0&&l(e.forceOpen)},[e.forceOpen]);let F=(0,D.useMemo)(()=>Se(e.containerId),[e.containerId]),[K,J]=(0,D.useState)(e.authToken||null),U=(0,D.useMemo)(()=>Ke(e,()=>({authToken:K,storage:F}),ae=>{let j=ae({authToken:K,storage:F});j.authToken!==K&&J(j.authToken)}),[e,K,F]),g=lt(e,U,F),_=(0,D.useMemo)(()=>{if(!e.showDevTools)return e;let x=g.getEffectiveAgentKey();return x&&x!==e.agentKey?{...e,agentKey:x}:e},[e,g.getEffectiveAgentKey]),f=Fe(_,U,F),S=Oe(e,U,F),E=Pe(e,U);(0,D.useEffect)(()=>{for(let x=f.messages.length-1;x>=0;x--){let ee=f.messages[x];if(ee.type==="sub_agent_start"){P({key:ee.metadata?.subAgentKey,name:ee.metadata?.agentName});return}if(ee.type==="sub_agent_end"){P(null);return}}},[f.messages]),(0,D.useEffect)(()=>{let x=F.get(e.conversationIdKey);console.log("[ChatWidget] Initial load - storedConvId:",x,"key:",e.conversationIdKey),console.log("[ChatWidget] apiPaths.conversations:",e.apiPaths.conversations),x&&(console.log("[ChatWidget] Loading conversation:",x),f.loadConversation(x))},[]),(0,D.useEffect)(()=>{t&&t({isOpen:o,isExpanded:y,debugMode:h,messages:f.messages,conversationId:f.conversationId,isLoading:f.isLoading,error:f.error})},[o,y,h,f.messages,f.conversationId,f.isLoading,f.error]);let k=(0,D.useCallback)(async()=>{if(e.showConversationSidebar){u(!0);try{let x=_.agentKey,ee=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(x)}`,ae=await fetch(ee,U.getFetchOptions({method:"GET"}));if(ae.ok){let j=await ae.json();v(j.results||j)}}catch(x){console.error("[ChatWidget] Failed to load conversations:",x),v([])}finally{u(!1)}}},[e,_,U]),i=(0,D.useCallback)(()=>{let x=!c;w(x),x&&k()},[c,k]),A=(0,D.useCallback)(x=>{x!==f.conversationId&&f.loadConversation(x),w(!1)},[f]),O=(0,D.useCallback)(()=>{f.clearMessages(),w(!1)},[f]),a=(0,D.useCallback)(x=>{f.sendMessage(x,{model:S.selectedModel,thinking:S.thinkingEnabled&&S.supportsThinking(),onAssistantMessage:ee=>{}})},[f,T,S.selectedModel,S.thinkingEnabled,S.supportsThinking]),M=(0,D.useCallback)(x=>{C(x),x==="tasks"&&E.loadTaskList()},[E]);if((0,D.useEffect)(()=>{n&&(n.current={open:()=>l(!0),close:()=>l(!1),send:x=>a(x),clearMessages:()=>f.clearMessages(),toggleTTS:()=>m(x=>!x),stopSpeech:()=>G(!1),setAuth:x=>{x.token!==void 0&&J(x.token)},clearAuth:()=>J(null)})},[f,n,a]),!e.embedded&&!o)return Q.html`
683
684
  <button
684
685
  class="cw-fab"
685
686
  style=${{backgroundColor:e.primaryColor}}
686
- onClick=${()=>r(!0)}
687
+ onClick=${()=>l(!0)}
687
688
  >
688
689
  <svg class="cw-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
689
690
  <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>
690
691
  </svg>
691
692
  </button>
692
- `;let B=["cw-widget",y&&"cw-widget-expanded",e.embedded&&"cw-widget-embedded"].filter(Boolean).join(" "),Y=e.headerTextColor||Xe(e.primaryColor);return Q.html`
693
- <div class=${B} style=${{"--cw-primary":e.primaryColor,"--cw-header-text":Y}}>
693
+ `;let H=["cw-widget",y&&"cw-widget-expanded",e.embedded&&"cw-widget-embedded"].filter(Boolean).join(" "),Y=e.headerTextColor||Xe(e.primaryColor);return Q.html`
694
+ <div class=${H} style=${{"--cw-primary":e.primaryColor,"--cw-header-text":Y}}>
694
695
  ${e.showConversationSidebar&&Q.html`
695
696
  <${Ae}
696
- isOpen=${u}
697
- conversations=${c}
698
- conversationsLoading=${w}
699
- currentConversationId=${p.conversationId}
700
- onClose=${()=>b(!1)}
701
- onNewConversation=${F}
702
- onSwitchConversation=${R}
697
+ isOpen=${c}
698
+ conversations=${p}
699
+ conversationsLoading=${$}
700
+ currentConversationId=${f.conversationId}
701
+ onClose=${()=>w(!1)}
702
+ onNewConversation=${O}
703
+ onSwitchConversation=${A}
703
704
  />
704
705
  `}
705
706
 
706
707
  ${e.showHeader!==!1&&Q.html`
707
708
  <${_e}
708
709
  config=${e}
709
- debugMode=${$}
710
+ debugMode=${h}
710
711
  isExpanded=${y}
711
- isSpeaking=${V}
712
- messagesCount=${p.messages.length}
713
- isLoading=${p.isLoading}
714
- currentAgent=${A}
715
- onClose=${()=>r(!1)}
716
- onToggleExpand=${()=>i(!y)}
717
- onToggleDebug=${()=>g(!$)}
718
- onToggleTTS=${()=>m(!_)}
719
- onClear=${p.clearMessages}
720
- onToggleSidebar=${d}
712
+ isSpeaking=${W}
713
+ messagesCount=${f.messages.length}
714
+ isLoading=${f.isLoading}
715
+ currentAgent=${R}
716
+ onClose=${()=>l(!1)}
717
+ onToggleExpand=${()=>d(!y)}
718
+ onToggleDebug=${()=>b(!h)}
719
+ onToggleTTS=${()=>m(!T)}
720
+ onClear=${f.clearMessages}
721
+ onToggleSidebar=${i}
721
722
  />
722
723
  `}
723
724
 
724
725
  ${e.showDevTools&&Q.html`
725
726
  <${nt}
726
- systems=${h.systems}
727
- agents=${h.agents}
728
- selectedSystem=${h.selectedSystem}
729
- selectedAgent=${h.selectedAgent}
730
- selectedSystemVersion=${h.selectedSystemVersion}
731
- selectedAgentVersion=${h.selectedAgentVersion}
732
- onSelectSystem=${h.selectSystem}
733
- onSelectAgent=${h.selectAgent}
734
- onSelectSystemVersion=${h.selectSystemVersion}
735
- onSelectAgentVersion=${h.selectAgentVersion}
736
- disabled=${p.isLoading}
727
+ systems=${g.systems}
728
+ agents=${g.agents}
729
+ selectedSystem=${g.selectedSystem}
730
+ selectedAgent=${g.selectedAgent}
731
+ selectedSystemVersion=${g.selectedSystemVersion}
732
+ selectedAgentVersion=${g.selectedAgentVersion}
733
+ onSelectSystem=${g.selectSystem}
734
+ onSelectAgent=${g.selectAgent}
735
+ onSelectSystemVersion=${g.selectSystemVersion}
736
+ onSelectAgentVersion=${g.selectAgentVersion}
737
+ disabled=${f.isLoading}
737
738
  />
738
739
  `}
739
740
 
740
741
  ${e.showTasksTab!==!1&&Q.html`
741
742
  <div class="cw-tabs">
742
743
  <button
743
- class=${`cw-tab ${l==="chat"?"cw-tab-active":""}`}
744
+ class=${`cw-tab ${r==="chat"?"cw-tab-active":""}`}
744
745
  onClick=${()=>M("chat")}
745
746
  >
746
747
  Chat
747
748
  </button>
748
749
  <button
749
- class=${`cw-tab ${l==="tasks"?"cw-tab-active":""}`}
750
+ class=${`cw-tab ${r==="tasks"?"cw-tab-active":""}`}
750
751
  onClick=${()=>M("tasks")}
751
752
  >
752
- Tasks ${k.progress.total>0?Q.html`<span class="cw-tab-badge">${k.progress.completed}/${k.progress.total}</span>`:""}
753
+ Tasks ${E.progress.total>0?Q.html`<span class="cw-tab-badge">${E.progress.completed}/${E.progress.total}</span>`:""}
753
754
  </button>
754
755
  </div>
755
756
  `}
756
757
 
757
- ${$&&Q.html`<div class="cw-status-bar"><span>🐛 Debug</span></div>`}
758
+ ${h&&Q.html`<div class="cw-status-bar"><span>🐛 Debug</span></div>`}
758
759
 
759
- ${l==="chat"?Q.html`
760
+ ${r==="chat"?Q.html`
760
761
  <${xe}
761
- messages=${p.messages}
762
- isLoading=${p.isLoading}
763
- hasMoreMessages=${p.hasMoreMessages}
764
- loadingMoreMessages=${p.loadingMoreMessages}
765
- onLoadMore=${p.loadMoreMessages}
766
- onEditMessage=${p.editMessage}
767
- onRetryMessage=${p.retryMessage}
768
- debugMode=${$}
762
+ messages=${f.messages}
763
+ isLoading=${f.isLoading}
764
+ hasMoreMessages=${f.hasMoreMessages}
765
+ loadingMoreMessages=${f.loadingMoreMessages}
766
+ onLoadMore=${f.loadMoreMessages}
767
+ onEditMessage=${f.editMessage}
768
+ onRetryMessage=${f.retryMessage}
769
+ onSendMessage=${a}
770
+ debugMode=${h}
769
771
  markdownParser=${s}
770
772
  emptyStateTitle=${e.emptyStateTitle}
771
773
  emptyStateMessage=${e.emptyStateMessage}
772
774
  />
773
775
 
774
- ${p.error&&Q.html`<div class="cw-error-bar">${p.error}</div>`}
776
+ ${f.error&&Q.html`<div class="cw-error-bar">${f.error}</div>`}
775
777
 
776
778
  ${e.showModelSelector&&S.availableModels.length>0&&Q.html`
777
779
  <${Re}
@@ -780,14 +782,14 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
780
782
  onSelectModel=${S.selectModel}
781
783
  thinkingEnabled=${S.thinkingEnabled}
782
784
  onToggleThinking=${S.toggleThinking}
783
- disabled=${p.isLoading}
785
+ disabled=${f.isLoading}
784
786
  />
785
787
  `}
786
788
 
787
789
  <${Ie}
788
- onSend=${o}
789
- onCancel=${p.cancelRun}
790
- isLoading=${p.isLoading}
790
+ onSend=${a}
791
+ onCancel=${f.cancelRun}
792
+ isLoading=${f.isLoading}
791
793
  placeholder=${e.placeholder}
792
794
  primaryColor=${e.primaryColor}
793
795
  enableVoice=${e.enableVoice}
@@ -795,14 +797,14 @@ var ke=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Objec
795
797
  />
796
798
  `:Q.html`
797
799
  <${De}
798
- tasks=${k.tasks}
799
- progress=${k.progress}
800
- isLoading=${k.isLoading}
801
- error=${k.error}
802
- onUpdate=${k.updateTask}
803
- onRemove=${k.removeTask}
804
- onClear=${k.clearTasks}
805
- onRefresh=${k.loadTaskList}
800
+ tasks=${E.tasks}
801
+ progress=${E.progress}
802
+ isLoading=${E.isLoading}
803
+ error=${E.error}
804
+ onUpdate=${E.updateTask}
805
+ onRemove=${E.removeTask}
806
+ onClear=${E.clearTasks}
807
+ onRefresh=${E.loadTaskList}
806
808
  />
807
809
  `}
808
810
  </div>