@makemore/agent-frontend 2.10.0 → 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.cjs.js CHANGED
@@ -1,6 +1,6 @@
1
- var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Object.getOwnPropertyNames;var lt=Object.prototype.hasOwnProperty;var it=(e,t,s)=>t in e?ve(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var ct=(e,t)=>{for(var s in t)ve(e,s,{get:t[s],enumerable:!0})},dt=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of rt(t))!lt.call(e,a)&&a!==s&&ve(e,a,{get:()=>t[a],enumerable:!(n=ot(t,a))||n.enumerable});return e};var ut=e=>dt(ve({},"__esModule",{value:!0}),e);var Ge=(e,t,s)=>(it(e,typeof t!="symbol"?t+"":t,s),s);var At={};ct(At,{ChatWidget:()=>fe,ChatWidgetAPI:()=>Ne,DEFAULT_CONFIG:()=>Le,Header:()=>Te,InputForm:()=>xe,Message:()=>_e,MessageList:()=>Me,ModelSelector:()=>Ie,Sidebar:()=>Ee,TaskList:()=>Ae,camelToSnake:()=>$e,createApiClient:()=>Pe,createStorage:()=>Ce,default:()=>It,formatDate:()=>ke,formatFileSize:()=>he,generateId:()=>pe,getCSRFToken:()=>Se,getFileTypeIcon:()=>me,keysToCamel:()=>de,keysToSnake:()=>ue,mergeConfig:()=>Ke,parseMarkdown:()=>be,snakeToCamel:()=>He,useChat:()=>Re,useModels:()=>Fe,useTasks:()=>De});module.exports=ut(At);var Z=require("htm/preact"),R=require("preact/compat");var ae=require("htm/preact");function He(e){return e.replace(/_([a-z])/g,(t,s)=>s.toUpperCase())}function $e(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}function de(e){return Array.isArray(e)?e.map(de):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[He(t),de(s)])):e}function ue(e){return Array.isArray(e)?e.map(ue):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[$e(t),ue(s)])):e}function pe(){return"msg-"+Date.now()+"-"+Math.random().toString(36).substr(2,9)}function U(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function ke(e){if(!e)return"";try{let t=new Date(e),n=new Date-t,a=Math.floor(n/6e4),l=Math.floor(n/36e5),$=Math.floor(n/864e5);return a<1?"Just now":a<60?`${a}m ago`:l<24?`${l}h ago`:$<7?`${$}d ago`:t.toLocaleDateString()}catch{return""}}function be(e,t=null){if(t)return t(e);let s=U(e);return s=s.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),s=s.replace(/__(.+?)__/g,"<strong>$1</strong>"),s=s.replace(/\*(.+?)\*/g,"<em>$1</em>"),s=s.replace(/_(.+?)_/g,"<em>$1</em>"),s=s.replace(/`(.+?)`/g,"<code>$1</code>"),s=s.replace(/\[(.+?)\]\((.+?)\)/g,'<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>'),s=s.replace(/\n/g,"<br>"),s}function Ce(e=""){let t=s=>e?`${s}_${e}`:s;return{get(s){try{return localStorage.getItem(t(s))}catch{return null}},set(s,n){try{let a=t(s);n===null?localStorage.removeItem(a):localStorage.setItem(a,n)}catch{}}}}function Se(e="csrftoken"){let t=document.cookie.split(";");for(let n of t){let[a,l]=n.trim().split("=");if(a===e)return decodeURIComponent(l)}let s=document.querySelector('meta[name="csrf-token"]');return s?s.getAttribute("content"):null}function he(e){if(e===0)return"0 B";let t=1024,s=["B","KB","MB","GB"],n=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/Math.pow(t,n)).toFixed(1))+" "+s[n]}function me(e){return e?e.startsWith("image/")?"\u{1F5BC}\uFE0F":e.startsWith("video/")?"\u{1F3AC}":e.startsWith("audio/")?"\u{1F3B5}":e.includes("pdf")?"\u{1F4D5}":e.includes("spreadsheet")||e.includes("excel")?"\u{1F4CA}":e.includes("document")||e.includes("word")?"\u{1F4DD}":e.includes("presentation")||e.includes("powerpoint")?"\u{1F4FD}\uFE0F":e.includes("zip")||e.includes("compressed")?"\u{1F5DC}\uFE0F":(e.includes("text/"),"\u{1F4C4}"):"\u{1F4C4}"}function pt(e){if(!e||typeof e!="string")return 0;let t=e.replace("#","");if(t.length!==6&&t.length!==3)return 0;let s=t.length===3?t.split("").map(i=>i+i).join(""):t,n=parseInt(s.substr(0,2),16)/255,a=parseInt(s.substr(2,2),16)/255,l=parseInt(s.substr(4,2),16)/255,$=i=>i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4);return .2126*$(n)+.7152*$(a)+.0722*$(l)}function qe(e){return pt(e)>.179?"#000000":"#ffffff"}function Te({config:e,debugMode:t,isExpanded:s,isSpeaking:n,messagesCount:a,isLoading:l,currentAgent:$,onClose:i,onToggleExpand:f,onToggleDebug:y,onToggleTTS:u,onClear:k,onToggleSidebar:c}){let{title:C,primaryColor:o,embedded:g,showConversationSidebar:w,showClearButton:v,showDebugButton:T,enableDebugMode:m,showTTSButton:H,showExpandButton:J,enableTTS:I,elevenLabsApiKey:F,ttsProxyUrl:D}=e,L=F||D;return ae.html`
2
- <div class="cw-header" style=${{backgroundColor:o}}>
3
- ${w&&ae.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 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`
4
4
  <button
5
5
  class="cw-header-btn cw-hamburger"
6
6
  onClick=${c}
@@ -15,50 +15,50 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
15
15
  `}
16
16
 
17
17
  <div class="cw-title-container">
18
- <span class="cw-title">${U(C)}</span>
19
- ${$&&ae.html`
18
+ <span class="cw-title">${H(C)}</span>
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">${U($.name||$.key)}</span>
22
+ <span class="cw-agent-name">${H(y.name||y.key)}</span>
23
23
  </span>
24
24
  `}
25
25
  </div>
26
26
 
27
27
  <div class="cw-header-actions">
28
- ${v&&ae.html`
28
+ ${v&&oe.html`
29
29
  <button
30
30
  class="cw-header-btn"
31
- onClick=${k}
31
+ onClick=${b}
32
32
  title="Clear"
33
- disabled=${l||a===0}
33
+ disabled=${r||a===0}
34
34
  >🗑️</button>
35
35
  `}
36
36
 
37
- ${T&&m&&ae.html`
37
+ ${_&&m&&oe.html`
38
38
  <button
39
39
  class="cw-header-btn ${t?"cw-btn-active":""}"
40
- onClick=${y}
40
+ onClick=${g}
41
41
  title="Debug"
42
42
  >🐛</button>
43
43
  `}
44
44
 
45
- ${H&&L&&ae.html`
45
+ ${V&&K&&oe.html`
46
46
  <button
47
- class="cw-header-btn ${I?"cw-btn-active":""}"
47
+ class="cw-header-btn ${A?"cw-btn-active":""}"
48
48
  onClick=${u}
49
49
  title="TTS"
50
- >${I?"\u{1F50A}":"\u{1F507}"}</button>
50
+ >${A?"\u{1F50A}":"\u{1F507}"}</button>
51
51
  `}
52
52
 
53
- ${J&&!g&&ae.html`
53
+ ${z&&!f&&oe.html`
54
54
  <button
55
55
  class="cw-header-btn"
56
- onClick=${f}
56
+ onClick=${$}
57
57
  title=${s?"Minimize":"Expand"}
58
58
  >${s?"\u2296":"\u2295"}</button>
59
59
  `}
60
60
 
61
- ${!g&&ae.html`
61
+ ${!f&&oe.html`
62
62
  <button
63
63
  class="cw-header-btn"
64
64
  onClick=${i}
@@ -67,7 +67,94 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
67
67
  `}
68
68
  </div>
69
69
  </div>
70
- `}var ie=require("htm/preact"),ge=require("preact/compat");var N=require("htm/preact"),oe=require("preact/compat");function Ve({msg:e,show:t,onToggle:s}){return t?N.html`
70
+ `}var ce=require("htm/preact"),fe=require("preact/compat");var N=require("htm/preact"),re=require("preact/compat");var I=require("htm/preact"),Ue=require("preact/compat");function Ze({block:e,onAction:t,markdownParser:s}){return I.html`
71
+ <div class="cw-block-card">
72
+ ${e.image&&I.html`<img class="cw-block-card-image" src=${e.image} alt=${e.title||""} />`}
73
+ <div class="cw-block-card-body">
74
+ ${e.badge&&I.html`<span class="cw-block-card-badge">${e.badge}</span>`}
75
+ ${e.title&&I.html`<div class="cw-block-card-title">${e.title}</div>`}
76
+ ${e.subtitle&&I.html`<div class="cw-block-card-subtitle">${e.subtitle}</div>`}
77
+ ${e.metadata&&e.metadata.length>0&&I.html`
78
+ <div class="cw-block-card-meta">
79
+ ${e.metadata.map(n=>I.html`
80
+ <span class="cw-block-meta-pair">
81
+ <span class="cw-block-meta-label">${n.label}:</span> ${n.value}
82
+ </span>
83
+ `)}
84
+ </div>
85
+ `}
86
+ ${e.actions&&e.actions.length>0&&I.html`
87
+ <div class="cw-block-card-actions">
88
+ ${e.actions.map(n=>I.html`<${Qe} action=${n} onAction=${t} />`)}
89
+ </div>
90
+ `}
91
+ </div>
92
+ </div>
93
+ `}function yt({block:e,onAction:t,markdownParser:s}){let n=e.layout||"vertical";return I.html`
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} />
97
+ `)}
98
+ </div>
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`
100
+ <div class="cw-block-action-buttons">
101
+ ${(e.buttons||[]).map(s=>I.html`<${Qe} action=${s} onAction=${t} />`)}
102
+ </div>
103
+ `}function vt({block:e}){let t=e.style||"info";return I.html`
104
+ <div class="cw-block-callout cw-block-callout-${t}">
105
+ <span class="cw-block-callout-icon">${{info:"\u2139\uFE0F",success:"\u2705",warning:"\u26A0\uFE0F"}[t]||"\u2139\uFE0F"}</span>
106
+ <div class="cw-block-callout-content">
107
+ ${e.title&&I.html`<strong>${e.title}</strong>`}
108
+ ${e.body&&I.html`<span>${e.body}</span>`}
109
+ </div>
110
+ </div>
111
+ `}function kt({block:e}){return I.html`
112
+ <figure class="cw-block-image">
113
+ <img src=${e.url} alt=${e.alt||""} />
114
+ ${e.caption&&I.html`<figcaption>${e.caption}</figcaption>`}
115
+ </figure>
116
+ `}function bt(){return I.html`<hr class="cw-block-divider" />`}function Ct({block:e}){return I.html`
117
+ <div class="cw-block-table-wrapper">
118
+ <table class="cw-block-table">
119
+ ${e.headers&&e.headers.length>0&&I.html`
120
+ <thead><tr>${e.headers.map(t=>I.html`<th>${t}</th>`)}</tr></thead>
121
+ `}
122
+ <tbody>
123
+ ${(e.rows||[]).map(t=>I.html`
124
+ <tr>${t.map(s=>I.html`<td>${s}</td>`)}</tr>
125
+ `)}
126
+ </tbody>
127
+ </table>
128
+ </div>
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
+ <div class="cw-block-code">
131
+ ${e.filename&&I.html`<div class="cw-block-code-filename">${e.filename}</div>`}
132
+ <pre><code>${H(e.code)}</code></pre>
133
+ ${e.copyable!==!1&&I.html`
134
+ <button class="cw-block-code-copy" onClick=${n}>${t?"\u2713":"\u2398"}</button>
135
+ `}
136
+ </div>
137
+ `}function Tt({block:e}){let[t,s]=(0,Ue.useState)(e.defaultOpen||!1);return I.html`
138
+ <details class="cw-block-collapsible" open=${t} onClick=${n=>{n.preventDefault(),s(!t)}}>
139
+ <summary>${e.title}</summary>
140
+ <div class="cw-block-collapsible-body">${e.body}</div>
141
+ </details>
142
+ `}function _t({block:e}){let t={loading:"\u23F3",success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F"};return I.html`
143
+ <div class="cw-block-status cw-block-status-${e.state||"info"}">
144
+ <span class="cw-block-status-icon">${t[e.state]||"\u2139\uFE0F"}</span>
145
+ <div>
146
+ <strong>${e.title}</strong>
147
+ ${e.body&&I.html`<div>${e.body}</div>`}
148
+ ${e.progress!=null&&I.html`
149
+ <div class="cw-block-progress"><div class="cw-block-progress-bar" style=${{width:`${e.progress*100}%`}}></div></div>
150
+ `}
151
+ </div>
152
+ </div>
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
+ <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})}
156
+ </div>
157
+ `}function Me({msg:e,show:t,onToggle:s}){return t?N.html`
71
158
  <div class="cw-debug-payload">
72
159
  <button class="cw-debug-payload-close" onClick=${s}>×</button>
73
160
  <pre class="cw-debug-payload-content">${JSON.stringify(e,null,2)}</pre>
@@ -78,7 +165,7 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
78
165
  onClick=${s}
79
166
  title="Show message payload"
80
167
  >{ }</button>
81
- `}function Ye({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:a=!0}){return s?null:N.html`
82
169
  <div class="cw-message-actions cw-message-actions-${n||"left"}">
83
170
  ${a&&N.html`
84
171
  <button
@@ -104,14 +191,14 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
104
191
  </svg>
105
192
  </button>
106
193
  </div>
107
- `}function ht({initialContent:e,onSave:t,onCancel:s}){let[n,a]=(0,oe.useState)(e),l=(0,oe.useRef)(null);return(0,oe.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`
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`
108
195
  <div class="cw-inline-edit">
109
196
  <textarea
110
- ref=${l}
197
+ ref=${r}
111
198
  class="cw-inline-edit-input"
112
199
  value=${n}
113
- onInput=${f=>{a(f.target.value),f.target.style.height="auto",f.target.style.height=f.target.scrollHeight+"px"}}
114
- onKeyDown=${f=>{f.key==="Enter"&&!f.shiftKey?(f.preventDefault(),n.trim()&&t(n.trim())):f.key==="Escape"&&s()}}
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()}}
115
202
  rows="1"
116
203
  />
117
204
  <div class="cw-inline-edit-actions">
@@ -128,111 +215,120 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
128
215
  >Save & Send</button>
129
216
  </div>
130
217
  </div>
131
- `}function _e({msg:e,debugMode:t,markdownParser:s,onEdit:n,onRetry:a,isLoading:l,messageIndex:$}){let[i,f]=(0,oe.useState)(!1),[y,u]=(0,oe.useState)(!1),[k,c]=(0,oe.useState)(!1),C=e.role==="user",o=e.role==="system",g=e.type==="tool_call",w=e.type==="tool_result",v=e.type==="error",T=e.type==="sub_agent_start",m=e.type==="sub_agent_end",H=e.type==="agent_context";if(o&&!t)return null;if(T||m||H)return N.html`
132
- <div class="cw-agent-context ${T?"cw-agent-delegating":""} ${m?"cw-agent-returned":""}" style="position: relative;">
133
- <span class="cw-agent-context-icon">${T?"\u{1F517}":m?"\u2713":"\u{1F916}"}</span>
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>
134
221
  <span class="cw-agent-context-text">${e.content}</span>
135
222
  ${e.metadata?.agentName&&N.html`
136
223
  <span class="cw-agent-context-name">${e.metadata.agentName}</span>
137
224
  `}
138
- ${t&&N.html`<${Ve} msg=${e} show=${y} onToggle=${()=>u(!y)} />`}
225
+ ${t&&N.html`<${Me} msg=${e} show=${g} onToggle=${()=>u(!g)} />`}
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`
228
+ <div class="cw-message-row" style="position: relative;">
229
+ <${et}
230
+ blocks=${e.metadata.blocks}
231
+ onAction=${k}
232
+ markdownParser=${s}
233
+ />
234
+ ${t&&N.html`<${Me} msg=${e} show=${g} onToggle=${()=>u(!g)} />`}
139
235
  </div>
140
- `;if(g||w){let b=e.metadata?.arguments||e.metadata?.result,x=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`
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`
141
237
  <div class="cw-tool-message ${w?"cw-tool-result":"cw-tool-call"}" style="position: relative;">
142
- <span class="cw-tool-label" onClick=${()=>b&&f(!i)}>
238
+ <span class="cw-tool-label" onClick=${()=>k&&$(!i)}>
143
239
  ${e.content}
144
- ${b&&N.html`<span class="cw-tool-expand">${i?"\u25BC":"\u25B6"}</span>`}
240
+ ${k&&N.html`<span class="cw-tool-expand">${i?"\u25BC":"\u25B6"}</span>`}
145
241
  </span>
146
- ${i&&b&&N.html`
147
- <pre class="cw-tool-details">${U(x(g?e.metadata.arguments:e.metadata.result))}</pre>
242
+ ${i&&k&&N.html`
243
+ <pre class="cw-tool-details">${H(T(f?e.metadata.arguments:e.metadata.result))}</pre>
148
244
  `}
149
- ${t&&N.html`<${Ve} msg=${e} show=${y} onToggle=${()=>u(!y)} />`}
245
+ ${t&&N.html`<${Me} msg=${e} show=${g} onToggle=${()=>u(!g)} />`}
150
246
  </div>
151
- `}let J=["cw-message",C&&"cw-message-user",v&&"cw-message-error"].filter(Boolean).join(" "),I=`cw-message-row ${C?"cw-message-row-user":""}`,F=e.role==="assistant"?be(e.content,s):U(e.content),D=e.files&&e.files.length>0,L=()=>D?N.html`
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`
152
248
  <div class="cw-message-attachments">
153
- ${e.files.map(b=>b.type&&b.type.startsWith("image/")?N.html`
154
- <a class="cw-attachment-thumbnail" href=${b.url} target="_blank" title=${b.name}>
155
- <img src=${b.url} alt=${b.name} />
249
+ ${e.files.map(k=>k.type&&k.type.startsWith("image/")?N.html`
250
+ <a class="cw-attachment-thumbnail" href=${k.url} target="_blank" title=${k.name}>
251
+ <img src=${k.url} alt=${k.name} />
156
252
  </a>
157
253
  `:N.html`
158
- <a class="cw-attachment-file" href=${b.url} target="_blank" title=${b.name}>
159
- <span class="cw-attachment-icon">${me(b.type)}</span>
254
+ <a class="cw-attachment-file" href=${k.url} target="_blank" title=${k.name}>
255
+ <span class="cw-attachment-icon">${ge(k.type)}</span>
160
256
  <span class="cw-attachment-info">
161
- <span class="cw-attachment-name">${b.name}</span>
162
- <span class="cw-attachment-size">${he(b.size)}</span>
257
+ <span class="cw-attachment-name">${k.name}</span>
258
+ <span class="cw-attachment-size">${me(k.size)}</span>
163
259
  </span>
164
260
  </a>
165
261
  `)}
166
262
  </div>
167
- `:null,z=b=>{c(!1),n&&n($,b)},V=()=>{a&&a($)};if(C&&k)return N.html`
168
- <div class=${I} style="position: relative;">
169
- ${L()}
170
- <${ht}
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()}
266
+ <${Et}
171
267
  initialContent=${e.content}
172
- onSave=${z}
268
+ onSave=${G}
173
269
  onCancel=${()=>c(!1)}
174
270
  />
175
271
  </div>
176
- `;let h=C&&n&&a,p=e.role==="assistant"&&a&&!l;return N.html`
177
- <div class="${I} ${h||p?"cw-message-row-with-actions":""}">
178
- ${L()}
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()}
179
275
  ${h&&N.html`
180
276
  <div class="cw-user-actions-wrapper">
181
- <${Ye}
277
+ <${tt}
182
278
  onEdit=${()=>c(!0)}
183
- onRetry=${V}
184
- isLoading=${l}
279
+ onRetry=${U}
280
+ isLoading=${r}
185
281
  position="left"
186
282
  showEdit=${!0}
187
283
  />
188
- <div class=${J} dangerouslySetInnerHTML=${{__html:F}} />
284
+ <div class=${z} dangerouslySetInnerHTML=${{__html:O}} />
189
285
  </div>
190
286
  `}
191
287
  ${!h&&N.html`
192
- <div class=${J} dangerouslySetInnerHTML=${{__html:F}} />
288
+ <div class=${z} dangerouslySetInnerHTML=${{__html:O}} />
193
289
  `}
194
290
  ${p&&N.html`
195
- <${Ye}
196
- onRetry=${V}
197
- isLoading=${l}
291
+ <${tt}
292
+ onRetry=${U}
293
+ isLoading=${r}
198
294
  position="right"
199
295
  showEdit=${!1}
200
296
  />
201
297
  `}
202
- ${t&&N.html`<${Ve} msg=${e} show=${y} onToggle=${()=>u(!y)} />`}
298
+ ${t&&N.html`<${Me} msg=${e} show=${g} onToggle=${()=>u(!g)} />`}
203
299
  </div>
204
- `}function Me({messages:e,isLoading:t,hasMoreMessages:s,loadingMoreMessages:n,onLoadMore:a,onEditMessage:l,onRetryMessage:$,debugMode:i,markdownParser:f,emptyStateTitle:y,emptyStateMessage:u}){let k=(0,ge.useRef)(null),c=(0,ge.useRef)(!0),C=g=>{let w=g.target,v=w.scrollHeight-w.scrollTop-w.clientHeight<100;if(c.current=v,w.scrollTop<50&&s&&!n){let T=w.scrollHeight;a().then(()=>{let m=w.scrollHeight;w.scrollTop=m-T+w.scrollTop})}};(0,ge.useEffect)(()=>{let g=k.current;g&&c.current&&requestAnimationFrame(()=>{g.scrollTop=g.scrollHeight})},[e,t]),(0,ge.useEffect)(()=>{let g=k.current;g&&e.length<=2&&(c.current=!0,requestAnimationFrame(()=>{g.scrollTop=g.scrollHeight}))},[e.length]);let o=e.length===0;return ie.html`
205
- <div class="cw-messages" ref=${k} onScroll=${C}>
206
- ${o&&ie.html`
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`
207
303
  <div class="cw-empty-state">
208
304
  <svg class="cw-empty-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
209
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>
210
306
  </svg>
211
- <h3>${U(y)}</h3>
212
- <p>${U(u)}</p>
307
+ <h3>${H(g)}</h3>
308
+ <p>${H(u)}</p>
213
309
  </div>
214
310
  `}
215
311
 
216
- ${!o&&s&&ie.html`
312
+ ${!l&&s&&ce.html`
217
313
  <div class="cw-load-more" onClick=${a}>
218
- ${n?ie.html`<span class="cw-spinner"></span><span>Loading...</span>`:ie.html`<span>↑ Scroll up or click to load older messages</span>`}
314
+ ${n?ce.html`<span class="cw-spinner"></span><span>Loading...</span>`:ce.html`<span>↑ Scroll up or click to load older messages</span>`}
219
315
  </div>
220
316
  `}
221
317
 
222
- ${e.map((g,w)=>ie.html`
223
- <${_e}
224
- key=${g.id}
225
- msg=${g}
318
+ ${e.map((f,w)=>ce.html`
319
+ <${Ee}
320
+ key=${f.id}
321
+ msg=${f}
226
322
  messageIndex=${w}
227
323
  debugMode=${i}
228
- markdownParser=${f}
229
- onEdit=${l}
230
- onRetry=${$}
324
+ markdownParser=${$}
325
+ onEdit=${r}
326
+ onRetry=${y}
231
327
  isLoading=${t}
232
328
  />
233
329
  `)}
234
330
 
235
- ${t&&ie.html`
331
+ ${t&&ce.html`
236
332
  <div class="cw-message-row">
237
333
  <div class="cw-typing">
238
334
  <span class="cw-spinner"></span>
@@ -241,41 +337,41 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
241
337
  </div>
242
338
  `}
243
339
  </div>
244
- `}var te=require("htm/preact"),G=require("preact/compat");var Ue=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function xe({onSend:e,onCancel:t,isLoading:s,placeholder:n,primaryColor:a,enableVoice:l=!0,enableFiles:$=!0}){let[i,f]=(0,G.useState)(""),[y,u]=(0,G.useState)([]),[k,c]=(0,G.useState)(!1),[C,o]=(0,G.useState)(!1),[g]=(0,G.useState)(()=>!!Ue),w=(0,G.useRef)(null),v=(0,G.useRef)(null),T=(0,G.useRef)(null),m=(0,G.useRef)(!1);(0,G.useEffect)(()=>{!s&&w.current&&w.current.focus()},[s]),(0,G.useEffect)(()=>{w.current&&(w.current.style.height="auto",w.current.style.height=Math.min(w.current.scrollHeight,150)+"px")},[i]),(0,G.useEffect)(()=>()=>{m.current=!1,T.current&&T.current.abort()},[]);let H=d=>{d.preventDefault(),(i.trim()||y.length>0)&&!s&&(e(i,y),f(""),u([]),w.current&&(w.current.style.height="auto"),v.current&&(v.current.value=""))},J=d=>{let A=Array.from(d.target.files||[]);A.length>0&&u(P=>[...P,...A])},I=d=>{u(A=>A.filter((P,r)=>r!==d))},F=d=>{d.preventDefault(),v.current&&!s&&v.current.click()},D=d=>{d.key==="Enter"&&!d.shiftKey&&(d.preventDefault(),H(d))},L=d=>{s&&t&&(d.preventDefault(),t())},z=()=>{if(!Ue||s)return;m.current=!0;let d=new Ue;d.continuous=!0,d.interimResults=!0,d.lang=navigator.language||"en-US";let A=i,P="";d.onstart=()=>{o(!0)},d.onresult=r=>{P="";for(let E=r.resultIndex;E<r.results.length;E++){let W=r.results[E][0].transcript;r.results[E].isFinal?A+=(A?" ":"")+W:P+=W}f(A+(P?" "+P:""))},d.onerror=r=>{if(r.error==="no-speech"||r.error==="aborted"){console.log("[ChatWidget] Speech recognition:",r.error,"- continuing...");return}console.warn("[ChatWidget] Speech recognition error:",r.error),m.current=!1,o(!1),f(A||i)},d.onend=()=>{if(m.current){console.log("[ChatWidget] Recognition paused, restarting...");try{d.start();return}catch(r){console.warn("[ChatWidget] Could not restart recognition:",r)}}o(!1),A&&f(A),T.current=null},T.current=d,d.start()},V=()=>{m.current=!1,T.current&&T.current.stop()},h=d=>{d.preventDefault(),C?V():z()},M=te.html`
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`
245
341
  <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor">
246
342
  <rect x="2" y="2" width="10" height="10" rx="1" />
247
343
  </svg>
248
- `,p=te.html`
344
+ `,p=se.html`
249
345
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
250
346
  <path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"></path>
251
347
  <path d="M19 10v2a7 7 0 0 1-14 0v-2"></path>
252
348
  <line x1="12" y1="19" x2="12" y2="23"></line>
253
349
  <line x1="8" y1="23" x2="16" y2="23"></line>
254
350
  </svg>
255
- `,S=te.html`
351
+ `,S=se.html`
256
352
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
257
353
  <path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"></path>
258
354
  </svg>
259
- `,b=l&&g,x=$;return te.html`
260
- <form class="cw-input-form" onSubmit=${H}>
355
+ `,k=r&&f,T=y;return se.html`
356
+ <form class="cw-input-form" onSubmit=${V}>
261
357
  <input
262
358
  type="file"
263
359
  ref=${v}
264
360
  style="display: none"
265
361
  multiple
266
- onChange=${J}
362
+ onChange=${z}
267
363
  />
268
- ${y.length>0&&te.html`
364
+ ${g.length>0&&se.html`
269
365
  <div class="cw-file-chips">
270
- ${y.map((d,A)=>te.html`
271
- <div class="cw-file-chip" key=${A}>
272
- <span class="cw-file-chip-icon">${me(d.type)}</span>
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>
273
369
  <span class="cw-file-chip-name" title=${d.name}>${d.name.length>20?d.name.substring(0,17)+"...":d.name}</span>
274
- <span class="cw-file-chip-size">(${he(d.size)})</span>
370
+ <span class="cw-file-chip-size">(${me(d.size)})</span>
275
371
  <button
276
372
  type="button"
277
373
  class="cw-file-chip-remove"
278
- onClick=${()=>I(A)}
374
+ onClick=${()=>A(R)}
279
375
  title="Remove file"
280
376
  >×</button>
281
377
  </div>
@@ -285,25 +381,25 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
285
381
  <textarea
286
382
  ref=${w}
287
383
  class="cw-input"
288
- placeholder=${U(n)}
384
+ placeholder=${H(n)}
289
385
  value=${i}
290
- onInput=${d=>f(d.target.value)}
291
- onKeyDown=${D}
386
+ onInput=${d=>$(d.target.value)}
387
+ onKeyDown=${P}
292
388
  disabled=${s}
293
389
  rows="1"
294
390
  />
295
- ${x&&te.html`
391
+ ${T&&se.html`
296
392
  <button
297
393
  type="button"
298
394
  class="cw-attach-btn"
299
- onClick=${F}
395
+ onClick=${O}
300
396
  disabled=${s}
301
397
  title="Attach files"
302
398
  >
303
399
  ${S}
304
400
  </button>
305
401
  `}
306
- ${b&&te.html`
402
+ ${k&&se.html`
307
403
  <button
308
404
  type="button"
309
405
  class=${`cw-voice-btn ${C?"cw-voice-btn-recording":""}`}
@@ -316,46 +412,46 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
316
412
  `}
317
413
  <button
318
414
  type=${s?"button":"submit"}
319
- class=${`cw-send-btn ${s?"cw-send-btn-loading":""} ${s&&k?"cw-send-btn-stop":""}`}
320
- style=${{backgroundColor:s&&k?"#dc2626":a}}
321
- onClick=${L}
415
+ class=${`cw-send-btn ${s?"cw-send-btn-loading":""} ${s&&b?"cw-send-btn-stop":""}`}
416
+ style=${{backgroundColor:s&&b?"#dc2626":a}}
417
+ onClick=${K}
322
418
  onMouseEnter=${()=>c(!0)}
323
419
  onMouseLeave=${()=>c(!1)}
324
420
  title=${s?"Stop":"Send"}
325
421
  >
326
- ${s?k?M:te.html`<span class="cw-spinner"></span>`:"\u27A4"}
422
+ ${s?b?x:se.html`<span class="cw-spinner"></span>`:"\u27A4"}
327
423
  </button>
328
424
  </form>
329
- `}var ye=require("htm/preact");function Ee({isOpen:e,conversations:t,conversationsLoading:s,currentConversationId:n,onClose:a,onNewConversation:l,onSwitchConversation:$}){return ye.html`
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`
330
426
  <div class="cw-sidebar ${e?"cw-sidebar-open":""}">
331
427
  <div class="cw-sidebar-header">
332
428
  <span>Conversations</span>
333
429
  <button class="cw-sidebar-close" onClick=${a}>✕</button>
334
430
  </div>
335
431
 
336
- <button class="cw-new-conversation" onClick=${l}>
432
+ <button class="cw-new-conversation" onClick=${r}>
337
433
  <span>+ New Conversation</span>
338
434
  </button>
339
435
 
340
436
  <div class="cw-conversation-list">
341
- ${s&&ye.html`
437
+ ${s&&we.html`
342
438
  <div class="cw-sidebar-loading">
343
439
  <span class="cw-spinner"></span>
344
440
  </div>
345
441
  `}
346
442
 
347
- ${!s&&t.length===0&&ye.html`
443
+ ${!s&&t.length===0&&we.html`
348
444
  <div class="cw-sidebar-empty">No conversations yet</div>
349
445
  `}
350
446
 
351
- ${t.map(i=>ye.html`
447
+ ${t.map(i=>we.html`
352
448
  <div
353
449
  key=${i.id}
354
450
  class="cw-conversation-item ${i.id===n?"cw-conversation-active":""}"
355
- onClick=${()=>$(i.id)}
451
+ onClick=${()=>y(i.id)}
356
452
  >
357
- <div class="cw-conversation-title">${U(i.title||"Untitled")}</div>
358
- <div class="cw-conversation-date">${ke(i.updatedAt||i.createdAt)}</div>
453
+ <div class="cw-conversation-title">${H(i.title||"Untitled")}</div>
454
+ <div class="cw-conversation-date">${be(i.updatedAt||i.createdAt)}</div>
359
455
  </div>
360
456
  `)}
361
457
  </div>
@@ -365,75 +461,75 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
365
461
  class="cw-sidebar-overlay ${e?"cw-sidebar-overlay-visible":""}"
366
462
  onClick=${a}
367
463
  />
368
- `}var ce=require("htm/preact"),Xe=require("preact/compat");function Ie({availableModels:e,selectedModel:t,onSelectModel:s,thinkingEnabled:n,onToggleThinking:a,disabled:l}){let[$,i]=(0,Xe.useState)(!1);if(!e||e.length===0)return null;let f=e.find(o=>o.id===t),y=f?.name||"Select Model",u=f?.supports_thinking||!1,k=()=>{l||i(!$)},c=o=>{s(o),i(!1)},C=o=>{o.stopPropagation(),a&&u&&a(!n)};return ce.html`
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`
369
465
  <div class="cw-model-selector">
370
466
  <button
371
467
  class="cw-model-btn"
372
- onClick=${k}
373
- disabled=${l}
468
+ onClick=${b}
469
+ disabled=${r}
374
470
  title="Select Model"
375
471
  >
376
472
  <span class="cw-model-icon">🤖</span>
377
- <span class="cw-model-name">${U(y)}</span>
378
- <span class="cw-model-chevron">${$?"\u25B2":"\u25BC"}</span>
473
+ <span class="cw-model-name">${H(g)}</span>
474
+ <span class="cw-model-chevron">${y?"\u25B2":"\u25BC"}</span>
379
475
  </button>
380
476
 
381
- ${u&&a&&ce.html`
477
+ ${u&&a&&de.html`
382
478
  <button
383
479
  class="cw-thinking-toggle ${n?"cw-thinking-enabled":""}"
384
480
  onClick=${C}
385
- disabled=${l}
481
+ disabled=${r}
386
482
  title=${n?"Thinking enabled - click to disable":"Enable extended thinking"}
387
483
  >
388
484
  <span class="cw-thinking-icon">🧠</span>
389
485
  </button>
390
486
  `}
391
487
 
392
- ${$&&ce.html`
488
+ ${y&&de.html`
393
489
  <div class="cw-model-dropdown">
394
- ${e.map(o=>ce.html`
490
+ ${e.map(l=>de.html`
395
491
  <button
396
- key=${o.id}
397
- class="cw-model-option ${o.id===t?"cw-model-option-selected":""}"
398
- onClick=${()=>c(o.id)}
492
+ key=${l.id}
493
+ class="cw-model-option ${l.id===t?"cw-model-option-selected":""}"
494
+ onClick=${()=>c(l.id)}
399
495
  >
400
496
  <span class="cw-model-option-name">
401
- ${U(o.name)}
402
- ${o.supports_thinking&&ce.html`<span class="cw-thinking-badge" title="Supports extended thinking">🧠</span>`}
497
+ ${H(l.name)}
498
+ ${l.supports_thinking&&de.html`<span class="cw-thinking-badge" title="Supports extended thinking">🧠</span>`}
403
499
  </span>
404
- <span class="cw-model-option-provider">${U(o.provider)}</span>
405
- ${o.description&&ce.html`
406
- <span class="cw-model-option-desc">${U(o.description)}</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>
407
503
  `}
408
504
  </button>
409
505
  `)}
410
506
  </div>
411
507
  `}
412
508
  </div>
413
- `}var se=require("htm/preact"),re=require("preact/compat"),mt={not_started:"\u25CB",in_progress:"\u25D0",complete:"\u25CF",cancelled:"\u2298"},gt={not_started:"Not Started",in_progress:"In Progress",complete:"Complete",cancelled:"Cancelled"};function ft({task:e,onUpdate:t,onRemove:s,depth:n=0}){let[a,l]=(0,re.useState)(!1),[$,i]=(0,re.useState)(e.name),f=(0,re.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]),y=(0,re.useCallback)(()=>{$.trim()&&$!==e.name&&t(e.id,{name:$.trim()}),l(!1)},[e,$,t]),u=(0,re.useCallback)(c=>{c.key==="Enter"&&y(),c.key==="Escape"&&(i(e.name),l(!1))},[y,e.name]),k=`cw-task-state-${e.state.replace("_","-")}`;return se.html`
414
- <div class="cw-task-item ${k}" style=${{paddingLeft:`${n*16+8}px`}}>
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`}}>
415
511
  <button
416
512
  class="cw-task-state-btn"
417
- onClick=${f}
418
- title=${gt[e.state]}
513
+ onClick=${$}
514
+ title=${It[e.state]}
419
515
  >
420
- ${mt[e.state]}
516
+ ${xt[e.state]}
421
517
  </button>
422
518
 
423
- ${a?se.html`
519
+ ${a?ne.html`
424
520
  <input
425
521
  type="text"
426
522
  class="cw-task-edit-input"
427
- value=${$}
523
+ value=${y}
428
524
  onInput=${c=>i(c.target.value)}
429
- onBlur=${y}
525
+ onBlur=${g}
430
526
  onKeyDown=${u}
431
527
  autoFocus
432
528
  />
433
- `:se.html`
529
+ `:ne.html`
434
530
  <span
435
531
  class="cw-task-name"
436
- onClick=${()=>l(!0)}
532
+ onClick=${()=>r(!0)}
437
533
  title="Click to edit"
438
534
  >
439
535
  ${e.name}
@@ -448,16 +544,16 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
448
544
  ×
449
545
  </button>
450
546
  </div>
451
- `}function Ae({tasks:e,progress:t,isLoading:s,error:n,onUpdate:a,onRemove:l,onClear:$,onRefresh:i}){let f=(0,re.useCallback)(k=>{let c=new Map,C=[];return k.forEach(o=>{c.set(o.id,{...o,children:[]})}),k.forEach(o=>{let g=c.get(o.id);o.parent_id&&c.has(o.parent_id)?c.get(o.parent_id).children.push(g):C.push(g)}),C},[]),y=(0,re.useCallback)((k,c=0)=>se.html`
452
- <${ft}
453
- key=${k.id}
454
- task=${k}
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
+ <${At}
549
+ key=${b.id}
550
+ task=${b}
455
551
  depth=${c}
456
552
  onUpdate=${a}
457
- onRemove=${l}
553
+ onRemove=${r}
458
554
  />
459
- ${k.children?.map(C=>y(C,c+1))}
460
- `,[a,l]),u=f(e);return s&&e.length===0?se.html`<div class="cw-tasks-loading">Loading tasks...</div>`:se.html`
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`
461
557
  <div class="cw-tasks-container">
462
558
  <div class="cw-tasks-header">
463
559
  <div class="cw-tasks-progress">
@@ -473,24 +569,24 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
473
569
  </div>
474
570
  <div class="cw-tasks-actions">
475
571
  <button class="cw-tasks-action-btn" onClick=${i} title="Refresh">↻</button>
476
- ${e.length>0&&se.html`
477
- <button class="cw-tasks-action-btn" onClick=${$} title="Clear all">🗑</button>
572
+ ${e.length>0&&ne.html`
573
+ <button class="cw-tasks-action-btn" onClick=${y} title="Clear all">🗑</button>
478
574
  `}
479
575
  </div>
480
576
  </div>
481
577
 
482
- ${n&&se.html`<div class="cw-tasks-error">${n}</div>`}
578
+ ${n&&ne.html`<div class="cw-tasks-error">${n}</div>`}
483
579
 
484
580
  <div class="cw-tasks-list">
485
- ${u.length===0?se.html`
581
+ ${u.length===0?ne.html`
486
582
  <div class="cw-tasks-empty">
487
583
  <p>No tasks yet</p>
488
584
  <p class="cw-tasks-empty-hint">Tasks will appear here when the agent creates them</p>
489
585
  </div>
490
- `:u.map(k=>y(k))}
586
+ `:u.map(b=>g(b))}
491
587
  </div>
492
588
  </div>
493
- `}var Y=require("htm/preact");function Ze({systems:e,agents:t,selectedSystem:s,selectedAgent:n,selectedSystemVersion:a,selectedAgentVersion:l,onSelectSystem:$,onSelectAgent:i,onSelectSystemVersion:f,onSelectAgentVersion:y,disabled:u}){let k=e.find(m=>m.slug===s),c=t.find(m=>m.slug===n),C=k?.versions||[],o=c?.versions||[];if(e.length===0&&t.length===0)return null;let g=e.length>1,w=t.length>1,v=C.length>1,T=o.length>1;return Y.html`
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`
494
590
  <div class="cw-dev-toolbar">
495
591
  <div class="cw-dev-toolbar-label">
496
592
  <span class="cw-dev-toolbar-icon">🛠️</span>
@@ -501,41 +597,41 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
501
597
  <!-- System -->
502
598
  <div class="cw-dev-select-group">
503
599
  <label class="cw-dev-label">System</label>
504
- ${g?Y.html`
600
+ ${f?X.html`
505
601
  <select
506
602
  class="cw-dev-select"
507
603
  value=${s||""}
508
- onChange=${m=>$(m.target.value)}
604
+ onChange=${m=>y(m.target.value)}
509
605
  disabled=${u}
510
606
  >
511
- ${e.map(m=>Y.html`
607
+ ${e.map(m=>X.html`
512
608
  <option key=${m.slug} value=${m.slug}>
513
609
  ${m.name}
514
610
  </option>
515
611
  `)}
516
612
  </select>
517
- `:Y.html`
518
- <span class="cw-dev-badge">${k?.name||"\u2014"}</span>
613
+ `:X.html`
614
+ <span class="cw-dev-badge">${b?.name||"\u2014"}</span>
519
615
  `}
520
616
  </div>
521
617
 
522
618
  <!-- System Version -->
523
619
  <div class="cw-dev-select-group">
524
620
  <label class="cw-dev-label">Sys Ver</label>
525
- ${v?Y.html`
621
+ ${v?X.html`
526
622
  <select
527
623
  class="cw-dev-select"
528
624
  value=${a||""}
529
- onChange=${m=>f(m.target.value||null)}
625
+ onChange=${m=>$(m.target.value||null)}
530
626
  disabled=${u}
531
627
  >
532
- ${C.map(m=>Y.html`
628
+ ${C.map(m=>X.html`
533
629
  <option key=${m.version} value=${m.version}>
534
630
  ${m.version}${m.is_active?" \u2713":""}${m.is_draft?" (draft)":""}
535
631
  </option>
536
632
  `)}
537
633
  </select>
538
- `:Y.html`
634
+ `:X.html`
539
635
  <span class="cw-dev-badge">${C.length===1?C[0].version:"none"}</span>
540
636
  `}
541
637
  </div>
@@ -543,90 +639,90 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
543
639
  <!-- Agent -->
544
640
  <div class="cw-dev-select-group">
545
641
  <label class="cw-dev-label">Agent</label>
546
- ${w?Y.html`
642
+ ${w?X.html`
547
643
  <select
548
644
  class="cw-dev-select"
549
645
  value=${n||""}
550
646
  onChange=${m=>i(m.target.value)}
551
647
  disabled=${u}
552
648
  >
553
- ${t.map(m=>Y.html`
649
+ ${t.map(m=>X.html`
554
650
  <option key=${m.slug} value=${m.slug}>
555
- ${m.name}${k?.entry_agent?.slug===m.slug?" \u2605":""}
651
+ ${m.name}${b?.entry_agent?.slug===m.slug?" \u2605":""}
556
652
  </option>
557
653
  `)}
558
654
  </select>
559
- `:Y.html`
560
- <span class="cw-dev-badge">${c?.name||t[0]?.name||"\u2014"}${k?.entry_agent?.slug===(c?.slug||t[0]?.slug)?" \u2605":""}</span>
655
+ `: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>
561
657
  `}
562
658
  </div>
563
659
 
564
660
  <!-- Agent Version -->
565
661
  <div class="cw-dev-select-group">
566
662
  <label class="cw-dev-label">Agent Ver</label>
567
- ${T?Y.html`
663
+ ${_?X.html`
568
664
  <select
569
665
  class="cw-dev-select"
570
- value=${l||""}
571
- onChange=${m=>y(m.target.value||null)}
666
+ value=${r||""}
667
+ onChange=${m=>g(m.target.value||null)}
572
668
  disabled=${u}
573
669
  >
574
- ${o.map(m=>Y.html`
670
+ ${l.map(m=>X.html`
575
671
  <option key=${m.version} value=${m.version}>
576
672
  ${m.version}${m.is_active?" \u2713":""}${m.is_draft?" (draft)":""}
577
673
  </option>
578
674
  `)}
579
675
  </select>
580
- `:Y.html`
581
- <span class="cw-dev-badge">${o.length===1?o[0].version:c?.active_version||"\u2014"}</span>
676
+ `:X.html`
677
+ <span class="cw-dev-badge">${l.length===1?l[0].version:c?.active_version||"\u2014"}</span>
582
678
  `}
583
679
  </div>
584
680
  </div>
585
681
  </div>
586
- `}var K=require("preact/compat");function Re(e,t,s){let[n,a]=(0,K.useState)([]),[l,$]=(0,K.useState)(!1),[i,f]=(0,K.useState)(null),[y,u]=(0,K.useState)(()=>s?.get(e.conversationIdKey)||null),[k,c]=(0,K.useState)(!1),[C,o]=(0,K.useState)(!1),[g,w]=(0,K.useState)(0),v=(0,K.useRef)(null),T=(0,K.useRef)(null);(0,K.useEffect)(()=>{y&&s?.set(e.conversationIdKey,y)},[y,e.conversationIdKey,s]);let m=(0,K.useCallback)(async(h,M,p)=>{v.current&&v.current.close();let S=e.apiPaths.runEvents.replace("{runId}",h),b=`${e.backendUrl}${S}`;M&&(b+=`?anonymous_token=${encodeURIComponent(M)}`);let x=new EventSource(b);v.current=x;let d="";x.addEventListener("assistant.message",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("assistant.message",r.payload);let E=r.payload.content;E&&(d+=E,a(W=>{let q=W[W.length-1];return q?.role==="assistant"&&q.id.startsWith("assistant-stream-")?[...W.slice(0,-1),{...q,content:d}]:[...W,{id:"assistant-stream-"+Date.now(),role:"assistant",content:d,timestamp:new Date,type:"message"}]}))}catch(r){console.error("[ChatWidget] Parse error:",r)}}),x.addEventListener("tool.call",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("tool.call",r.payload),a(E=>[...E,{id:"tool-call-"+Date.now(),role:"assistant",content:`\u{1F527} ${r.payload.name}`,timestamp:new Date,type:"tool_call",metadata:{toolName:r.payload.name,arguments:r.payload.arguments,toolCallId:r.payload.id}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),x.addEventListener("tool.result",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("tool.result",r.payload);let E=r.payload.result,W=E?.error;a(q=>[...q,{id:"tool-result-"+Date.now(),role:"system",content:W?`\u274C ${E.error}`:"\u2713 Done",timestamp:new Date,type:"tool_result",metadata:{toolName:r.payload.name,result:E,toolCallId:r.payload.tool_call_id}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),x.addEventListener("custom",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("custom",r.payload),r.payload?.type==="ui_control"&&e.onUIControl&&e.onUIControl(r.payload),r.payload?.type==="agent_context"&&a(E=>[...E,{id:"agent-context-"+Date.now(),role:"system",content:`\u{1F517} ${r.payload.agent_name||"Sub-agent"} is now handling this request`,timestamp:new Date,type:"agent_context",metadata:{agentKey:r.payload.agent_key,agentName:r.payload.agent_name,action:r.payload.action}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),x.addEventListener("sub_agent.start",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("sub_agent.start",r.payload),a(E=>[...E,{id:"sub-agent-start-"+Date.now(),role:"system",content:`\u{1F517} Delegating to ${r.payload.agent_name||r.payload.sub_agent_key||"sub-agent"}...`,timestamp:new Date,type:"sub_agent_start",metadata:{subAgentKey:r.payload.sub_agent_key,agentName:r.payload.agent_name,invocationMode:r.payload.invocation_mode}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),x.addEventListener("sub_agent.end",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("sub_agent.end",r.payload),a(E=>[...E,{id:"sub-agent-end-"+Date.now(),role:"system",content:`\u2713 ${r.payload.agent_name||"Sub-agent"} completed`,timestamp:new Date,type:"sub_agent_end",metadata:{subAgentKey:r.payload.sub_agent_key,agentName:r.payload.agent_name}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}});let A=P=>{try{let r=JSON.parse(P.data);if(e.onEvent&&e.onEvent(r.type,r.payload),r.type==="run.failed"){let E=r.payload.error||"Agent run failed";f(E),a(W=>[...W,{id:"error-"+Date.now(),role:"system",content:`\u274C Error: ${E}`,timestamp:new Date,type:"error"}])}}catch(r){console.error("[ChatWidget] Parse error:",r)}$(!1),x.close(),v.current=null,d&&p&&p(d)};x.addEventListener("run.succeeded",A),x.addEventListener("run.failed",A),x.addEventListener("run.cancelled",A),x.addEventListener("run.timed_out",A),x.onerror=()=>{$(!1),x.close(),v.current=null}},[e]),H=(0,K.useCallback)(async(h,M={},p={})=>{if(!h.trim()||l)return;let S=[],b={};typeof M=="function"?b={onAssistantMessage:M}:Array.isArray(M)?(S=M,b=p):b=M||{};let{model:x,thinking:d,onAssistantMessage:A,supersedeFromMessageIndex:P}=b;$(!0),f(null);let r={id:pe(),role:"user",content:h.trim(),timestamp:new Date,type:"message",files:S.length>0?S.map(E=>({name:E.name,size:E.size,type:E.type})):void 0};a(E=>[...E,r]);try{let E=await t.getOrCreateSession(),W;if(S.length>0){let B=e.apiCaseStyle!=="camel",ze=we=>B?$e(we):we,le=new FormData;le.append(ze("agentKey"),e.agentKey),y&&le.append(ze("conversationId"),y),le.append("messages",JSON.stringify([{role:"user",content:h.trim()}])),le.append("metadata",JSON.stringify(B?{...e.metadata,journey_type:e.defaultJourneyType}:{...e.metadata,journeyType:e.defaultJourneyType})),x&&le.append("model",x),d&&le.append("thinking","true"),S.forEach(we=>{le.append("files",we)}),W=t.getFetchOptions({method:"POST",body:le},E)}else{let B=t.transformRequest({agentKey:e.agentKey,conversationId:y,messages:[{role:"user",content:h.trim()}],metadata:{...e.metadata,journeyType:e.defaultJourneyType},...x&&{model:x},...d&&{thinking:!0},...P!==void 0&&{supersedeFromMessageIndex:P}});W=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(B)},E)}let q=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,W),_=E;if(q.status===401){t.clearSession();let B=await t.getOrCreateSession(!0);B&&(_=B,S.length>0?W=t.getFetchOptions({method:"POST",body:W.body},B):W=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:W.body},B),q=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,W))}if(!q.ok){let B=await q.json().catch(()=>({}));throw new Error(B.error||B.detail||`HTTP ${q.status}`)}let Q=await q.json(),ne=t.transformResponse(Q);T.current=ne.id,!y&&ne.conversationId&&u(ne.conversationId),await m(ne.id,_,A)}catch(E){f(E.message||"Failed to send message"),$(!1)}finally{T.current=null}},[e,t,y,l,m]),J=(0,K.useCallback)(async()=>{let h=T.current;if(!(!h||!l))try{let M=e.apiPaths.cancelRun?e.apiPaths.cancelRun.replace("{runId}",h):`${e.apiPaths.runs}${h}/cancel/`;(await fetch(`${e.backendUrl}${M}`,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"}}))).ok&&(v.current&&(v.current.close(),v.current=null),$(!1),T.current=null,a(S=>[...S,{id:"cancelled-"+Date.now(),role:"system",content:"\u23F9 Run cancelled",timestamp:new Date,type:"cancelled"}]))}catch(M){console.error("[ChatWidget] Failed to cancel run:",M)}},[e,t,l]),I=(0,K.useCallback)(()=>{a([]),u(null),f(null),c(!1),w(0),s?.set(e.conversationIdKey,null)},[e.conversationIdKey,s]),F=h=>{let M={id:pe(),role:h.role,timestamp:h.timestamp?new Date(h.timestamp):new Date};if(h.role==="tool")return{...M,role:"system",content:"\u2713 Done",type:"tool_result",metadata:{result:h.content,toolCallId:h.toolCallId}};if(h.role==="assistant"&&h.toolCalls&&h.toolCalls.length>0)return h.toolCalls.map(S=>({id:pe(),role:"assistant",content:`\u{1F527} ${S.function?.name||S.name||"tool"}`,timestamp:M.timestamp,type:"tool_call",metadata:{toolName:S.function?.name||S.name,arguments:S.function?.arguments||S.arguments,toolCallId:S.id}}));let p=typeof h.content=="string"?h.content:JSON.stringify(h.content);return h.role==="assistant"&&!p?.trim()?null:{...M,content:p,type:"message"}},D=(0,K.useCallback)(async h=>{console.log("[ChatWidget] loadConversation called with:",h),$(!0),a([]),u(h);try{let M=await t.getOrCreateSession(),S=`${e.backendUrl}${e.apiPaths.conversations}${h}/?limit=10&offset=0`;console.log("[ChatWidget] Fetching conversation from:",S);let b=await fetch(S,t.getFetchOptions({method:"GET"},M));if(console.log("[ChatWidget] Response status:",b.status),b.ok){let x=await b.json();console.log("[ChatWidget] Raw conversation:",x);let d=t.transformResponse(x);if(console.log("[ChatWidget] Transformed conversation:",d),d.messages){let A=d.messages.flatMap(F).filter(Boolean);console.log("[ChatWidget] Mapped messages:",A),a(A)}c(d.hasMore||!1),w(d.messages?.length||0)}else b.status===404?(console.log("[ChatWidget] Conversation not found, clearing"),u(null),s?.set(e.conversationIdKey,null)):console.error("[ChatWidget] Unexpected response status:",b.status)}catch(M){console.error("[ChatWidget] Failed to load conversation:",M)}finally{$(!1)}},[e,t,s]),L=(0,K.useCallback)(async()=>{if(!(!y||C||!k)){o(!0);try{let h=await t.getOrCreateSession(),p=`${e.backendUrl}${e.apiPaths.conversations}${y}/?limit=10&offset=${g}`,S=await fetch(p,t.getFetchOptions({method:"GET"},h));if(S.ok){let b=await S.json(),x=t.transformResponse(b);if(x.messages?.length>0){let d=x.messages.flatMap(F).filter(Boolean);a(A=>[...d,...A]),w(A=>A+x.messages.length),c(x.hasMore||!1)}else c(!1)}}catch(h){console.error("[ChatWidget] Failed to load more messages:",h)}finally{o(!1)}}},[e,t,y,g,C,k]),z=(0,K.useCallback)(async(h,M,p={})=>{if(l)return;let S=n[h];if(!S||S.role!=="user")return;let b=n.slice(0,h);a(b),await H(M,{...p,supersedeFromMessageIndex:h})},[n,l,H]),V=(0,K.useCallback)(async(h,M={})=>{if(l)return;let p=n[h];if(!p)return;let S=h,b=p;if(p.role==="assistant"){for(let d=h-1;d>=0;d--)if(n[d].role==="user"){S=d,b=n[d];break}if(b.role!=="user")return}else if(p.role!=="user")return;let x=n.slice(0,S);a(x),await H(b.content,{...M,supersedeFromMessageIndex:S})},[n,l,H]);return(0,K.useEffect)(()=>()=>{v.current&&v.current.close()},[]),{messages:n,isLoading:l,error:i,conversationId:y,hasMoreMessages:k,loadingMoreMessages:C,sendMessage:H,cancelRun:J,clearMessages:I,loadConversation:D,loadMoreMessages:L,setConversationId:u,editMessage:z,retryMessage:V}}var X=require("preact/compat"),Qe="cw_thinking_enabled";function Fe(e,t,s){let[n,a]=(0,X.useState)([]),[l,$]=(0,X.useState)(null),[i,f]=(0,X.useState)(null),[y,u]=(0,X.useState)(!1),[k,c]=(0,X.useState)(!1);(0,X.useEffect)(()=>{(async()=>{if(e.showModelSelector){u(!0);try{let T=await fetch(`${e.backendUrl}${e.apiPaths.models}`,t.getFetchOptions({method:"GET"}));if(T.ok){let m=await T.json(),H=m.models||[];a(H),f(m.default);let J=s?.get(e.modelKey);J&&H.some(F=>F.id===J)?$(J):$(m.default),s?.get(Qe)==="true"&&c(!0)}}catch(T){console.warn("[ChatWidget] Failed to load models:",T)}finally{u(!1)}}})()},[e.backendUrl,e.apiPaths.models,e.showModelSelector,e.modelKey,t,s]);let C=(0,X.useCallback)(v=>{$(v),s?.set(e.modelKey,v)},[e.modelKey,s]),o=(0,X.useCallback)(v=>{c(v),s?.set(Qe,v?"true":"false")},[s]),g=(0,X.useCallback)(()=>n.find(v=>v.id===l)||null,[n,l]),w=(0,X.useCallback)(()=>g()?.supports_thinking||!1,[g]);return{availableModels:n,selectedModel:l,defaultModel:i,isLoading:y,selectModel:C,getSelectedModelInfo:g,thinkingEnabled:k,toggleThinking:o,supportsThinking:w}}var ee=require("preact/compat");function De(e,t){let[s,n]=(0,ee.useState)(null),[a,l]=(0,ee.useState)(!1),[$,i]=(0,ee.useState)(null),f=e.apiPaths?.tasks||"/api/agent/tasks/",y=(0,ee.useCallback)(async()=>{l(!0),i(null);try{let g=`${e.backendUrl}${f}`,w=await fetch(g,t.getFetchOptions({method:"GET"}));if(w.ok){let v=await w.json();n(v)}else{let v=await w.json().catch(()=>({}));i(v.error||"Failed to load tasks")}}catch(g){console.error("[useTasks] Failed to load task list:",g),i("Failed to load tasks")}finally{l(!1)}},[e.backendUrl,f,t]),u=(0,ee.useCallback)(async g=>{if(!s)return null;try{let w=`${e.backendUrl}${f}${s.id}/add_task/`,v=await fetch(w,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)}));if(v.ok){let T=await v.json();return await y(),T}else{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to add task"),null}}catch(w){return console.error("[useTasks] Failed to add task:",w),i("Failed to add task"),null}},[e.backendUrl,f,s,t,y]),k=(0,ee.useCallback)(async(g,w)=>{if(!s)return null;try{let v=`${e.backendUrl}${f}${s.id}/update_task/${g}/`,T=await fetch(v,t.getFetchOptions({method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(w)}));if(T.ok){let m=await T.json();return await y(),m}else{let m=await T.json().catch(()=>({}));return i(m.error||"Failed to update task"),null}}catch(v){return console.error("[useTasks] Failed to update task:",v),i("Failed to update task"),null}},[e.backendUrl,f,s,t,y]),c=(0,ee.useCallback)(async g=>{if(!s)return!1;try{let w=`${e.backendUrl}${f}${s.id}/remove_task/${g}/`,v=await fetch(w,t.getFetchOptions({method:"DELETE"}));if(v.ok)return await y(),!0;{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to remove task"),!1}}catch(w){return console.error("[useTasks] Failed to remove task:",w),i("Failed to remove task"),!1}},[e.backendUrl,f,s,t,y]),C=(0,ee.useCallback)(async()=>{if(!s)return!1;try{let g=`${e.backendUrl}${f}${s.id}/clear/`,w=await fetch(g,t.getFetchOptions({method:"POST"}));if(w.ok)return await y(),!0;{let v=await w.json().catch(()=>({}));return i(v.error||"Failed to clear tasks"),!1}}catch(g){return console.error("[useTasks] Failed to clear tasks:",g),i("Failed to clear tasks"),!1}},[e.backendUrl,f,s,t,y]),o=(0,ee.useCallback)(()=>i(null),[]);return{taskList:s,tasks:s?.tasks||[],progress:s?.progress||{total:0,completed:0,percent_complete:0},isLoading:a,error:$,loadTaskList:y,addTask:u,updateTask:k,removeTask:c,clearTasks:C,clearError:o}}var j=require("preact/compat"),et="cw_selected_system",Be="cw_selected_agent",tt="cw_selected_system_version",Oe="cw_selected_agent_version";function st(e,t,s){let[n,a]=(0,j.useState)([]),[l,$]=(0,j.useState)([]),[i,f]=(0,j.useState)(null),[y,u]=(0,j.useState)(null),[k,c]=(0,j.useState)(null),[C,o]=(0,j.useState)(null),[g,w]=(0,j.useState)(!1),v=(0,j.useCallback)(()=>{if(y)return y;if(i){let I=n.find(F=>F.slug===i);if(I?.entry_agent)return I.entry_agent.slug}return e.agentKey},[y,i,n,e.agentKey]);(0,j.useEffect)(()=>{if(!e.showDevTools)return;(async()=>{w(!0);try{let F=await fetch(`${e.backendUrl}${e.apiPaths.systems}`,t.getFetchOptions({method:"GET"}));if(F.ok){let D=await F.json(),L=D.results||D;a(L);let z=s?.get(et);z&&L.some(V=>V.slug===z)?f(z):L.length===1&&f(L[0].slug)}}catch(F){console.warn("[ChatWidget] Failed to load systems:",F)}finally{w(!1)}})()},[e.backendUrl,e.apiPaths.systems,e.showDevTools,t,s]),(0,j.useEffect)(()=>{if(!e.showDevTools)return;(async()=>{try{let F=i?`?system=${encodeURIComponent(i)}`:"",D=await fetch(`${e.backendUrl}${e.apiPaths.agents}${F}`,t.getFetchOptions({method:"GET"}));if(D.ok){let L=await D.json(),z=L.results||L;$(z);let V=s?.get(Be);if(V&&z.some(M=>M.slug===V))u(V);else if(i){let M=n.find(p=>p.slug===i);M?.entry_agent&&u(M.entry_agent.slug)}let h=s?.get(Oe);h&&o(h)}}catch(F){console.warn("[ChatWidget] Failed to load agents:",F)}})()},[e.backendUrl,e.apiPaths.agents,e.showDevTools,i,t,s,n]);let T=(0,j.useCallback)(I=>{f(I),s?.set(et,I),u(null),o(null),s?.set(Be,null),s?.set(Oe,null);let D=n.find(L=>L.slug===I)?.active_version||null;c(D),s?.set(tt,D)},[s,n]),m=(0,j.useCallback)(I=>{u(I),s?.set(Be,I);let D=l.find(L=>L.slug===I)?.active_version||null;o(D),s?.set(Oe,D)},[s,l]),H=(0,j.useCallback)(I=>{c(I),s?.set(tt,I)},[s]),J=(0,j.useCallback)(I=>{o(I),s?.set(Oe,I)},[s]);return{systems:n,agents:l,selectedSystem:i,selectedAgent:y,selectedSystemVersion:k,selectedAgentVersion:C,isLoading:g,selectSystem:T,selectAgent:m,selectSystemVersion:H,selectAgentVersion:J,getEffectiveAgentKey:v}}function Pe(e,t,s){let n=u=>!u||typeof u!="object"||e.apiCaseStyle==="camel"?u:ue(u),a=u=>!u||typeof u!="object"||e.apiCaseStyle==="snake"?u:de(u),l=()=>e.authStrategy?e.authStrategy:e.authToken?"token":e.apiPaths.anonymousSession||e.anonymousSessionEndpoint?"anonymous":"none",$=(u=null)=>{let k=l(),c={},C=u||e.authToken||t().authToken;if(k==="token"&&C){let o=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Token";c[o]=g?`${g} ${C}`:C}else if(k==="jwt"&&C){let o=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Bearer";c[o]=g?`${g} ${C}`:C}else if(k==="anonymous"&&C){let o=e.authHeader||e.anonymousTokenHeader||"X-Anonymous-Token";c[o]=C}if(k==="session"){let o=Se(e.csrfCookieName);o&&(c["X-CSRFToken"]=o)}return c};return{getAuthStrategy:l,getAuthHeaders:$,getFetchOptions:(u={},k=null)=>{let c=l(),C={...u},o=$(k);return console.log("[ChatWidget] getFetchOptions - strategy:",c,"overrideToken:",k,"authHeaders:",o),C.headers={...C.headers,...o},c==="session"&&(C.credentials="include"),C},getOrCreateSession:async(u=!1)=>{let k=l(),c=t(),C=e.anonymousTokenKey||e.sessionTokenKey;if(k!=="anonymous")return e.authToken||c.authToken;if(!u){if(c.authToken)return c.authToken;let o=c.storage?.get(C);if(o)return s(g=>({...g,authToken:o})),o}try{let o=e.anonymousSessionEndpoint||e.apiPaths.anonymousSession,g=await fetch(`${e.backendUrl}${o}`,{method:"POST",headers:{"Content-Type":"application/json"}});if(g.ok){let w=await g.json();return s(v=>({...v,authToken:w.token})),c.storage?.set(C,w.token),w.token}}catch(o){console.warn("[ChatWidget] Failed to create session:",o)}return null},clearSession:()=>{let u=e.anonymousTokenKey||e.sessionTokenKey,k=t();s(c=>({...c,authToken:null})),k.storage?.set(u,null)},transformRequest:n,transformResponse:a}}function fe({config:e,onStateChange:t,markdownParser:s,apiRef:n}){console.log("[ChatWidget] Config:",{showConversationSidebar:e.showConversationSidebar,apiPaths:e.apiPaths});let[a,l]=(0,R.useState)(e.embedded||e.forceOpen===!0),[$,i]=(0,R.useState)(!1),[f,y]=(0,R.useState)(!1),[u,k]=(0,R.useState)(!1),[c,C]=(0,R.useState)([]),[o,g]=(0,R.useState)("chat"),[w,v]=(0,R.useState)(!1),[T,m]=(0,R.useState)(e.enableTTS),[H,J]=(0,R.useState)(!1),[I,F]=(0,R.useState)(null);(0,R.useEffect)(()=>{e.forceOpen!==void 0&&l(e.forceOpen)},[e.forceOpen]);let D=(0,R.useMemo)(()=>Ce(e.containerId),[e.containerId]),[L,z]=(0,R.useState)(e.authToken||null),V=(0,R.useMemo)(()=>Pe(e,()=>({authToken:L,storage:D}),ne=>{let B=ne({authToken:L,storage:D});B.authToken!==L&&z(B.authToken)}),[e,L,D]),h=st(e,V,D),M=(0,R.useMemo)(()=>{if(!e.showDevTools)return e;let _=h.getEffectiveAgentKey();return _&&_!==e.agentKey?{...e,agentKey:_}:e},[e,h.getEffectiveAgentKey]),p=Re(M,V,D),S=Fe(e,V,D),b=De(e,V);(0,R.useEffect)(()=>{for(let _=p.messages.length-1;_>=0;_--){let Q=p.messages[_];if(Q.type==="sub_agent_start"){F({key:Q.metadata?.subAgentKey,name:Q.metadata?.agentName});return}if(Q.type==="sub_agent_end"){F(null);return}}},[p.messages]),(0,R.useEffect)(()=>{let _=D.get(e.conversationIdKey);console.log("[ChatWidget] Initial load - storedConvId:",_,"key:",e.conversationIdKey),console.log("[ChatWidget] apiPaths.conversations:",e.apiPaths.conversations),_&&(console.log("[ChatWidget] Loading conversation:",_),p.loadConversation(_))},[]),(0,R.useEffect)(()=>{t&&t({isOpen:a,isExpanded:$,debugMode:f,messages:p.messages,conversationId:p.conversationId,isLoading:p.isLoading,error:p.error})},[a,$,f,p.messages,p.conversationId,p.isLoading,p.error]);let x=(0,R.useCallback)(async()=>{if(e.showConversationSidebar){v(!0);try{let _=M.agentKey,Q=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(_)}`,ne=await fetch(Q,V.getFetchOptions({method:"GET"}));if(ne.ok){let B=await ne.json();C(B.results||B)}}catch(_){console.error("[ChatWidget] Failed to load conversations:",_),C([])}finally{v(!1)}}},[e,M,V]),d=(0,R.useCallback)(()=>{let _=!u;k(_),_&&x()},[u,x]),A=(0,R.useCallback)(_=>{_!==p.conversationId&&p.loadConversation(_),k(!1)},[p]),P=(0,R.useCallback)(()=>{p.clearMessages(),k(!1)},[p]),r=(0,R.useCallback)(_=>{p.sendMessage(_,{model:S.selectedModel,thinking:S.thinkingEnabled&&S.supportsThinking(),onAssistantMessage:Q=>{}})},[p,T,S.selectedModel,S.thinkingEnabled,S.supportsThinking]),E=(0,R.useCallback)(_=>{g(_),_==="tasks"&&b.loadTaskList()},[b]);if((0,R.useEffect)(()=>{n&&(n.current={open:()=>l(!0),close:()=>l(!1),send:_=>r(_),clearMessages:()=>p.clearMessages(),toggleTTS:()=>m(_=>!_),stopSpeech:()=>J(!1),setAuth:_=>{_.token!==void 0&&z(_.token)},clearAuth:()=>z(null)})},[p,n,r]),!e.embedded&&!a)return Z.html`
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`
587
683
  <button
588
684
  class="cw-fab"
589
685
  style=${{backgroundColor:e.primaryColor}}
590
- onClick=${()=>l(!0)}
686
+ onClick=${()=>r(!0)}
591
687
  >
592
688
  <svg class="cw-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
593
689
  <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
594
690
  </svg>
595
691
  </button>
596
- `;let W=["cw-widget",$&&"cw-widget-expanded",e.embedded&&"cw-widget-embedded"].filter(Boolean).join(" "),q=e.headerTextColor||qe(e.primaryColor);return Z.html`
597
- <div class=${W} style=${{"--cw-primary":e.primaryColor,"--cw-header-text":q}}>
598
- ${e.showConversationSidebar&&Z.html`
599
- <${Ee}
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}}>
694
+ ${e.showConversationSidebar&&Q.html`
695
+ <${Ae}
600
696
  isOpen=${u}
601
697
  conversations=${c}
602
698
  conversationsLoading=${w}
603
699
  currentConversationId=${p.conversationId}
604
- onClose=${()=>k(!1)}
605
- onNewConversation=${P}
606
- onSwitchConversation=${A}
700
+ onClose=${()=>b(!1)}
701
+ onNewConversation=${F}
702
+ onSwitchConversation=${R}
607
703
  />
608
704
  `}
609
705
 
610
- ${e.showHeader!==!1&&Z.html`
611
- <${Te}
706
+ ${e.showHeader!==!1&&Q.html`
707
+ <${_e}
612
708
  config=${e}
613
- debugMode=${f}
614
- isExpanded=${$}
615
- isSpeaking=${H}
709
+ debugMode=${$}
710
+ isExpanded=${y}
711
+ isSpeaking=${V}
616
712
  messagesCount=${p.messages.length}
617
713
  isLoading=${p.isLoading}
618
- currentAgent=${I}
619
- onClose=${()=>l(!1)}
620
- onToggleExpand=${()=>i(!$)}
621
- onToggleDebug=${()=>y(!f)}
622
- onToggleTTS=${()=>m(!T)}
714
+ currentAgent=${A}
715
+ onClose=${()=>r(!1)}
716
+ onToggleExpand=${()=>i(!y)}
717
+ onToggleDebug=${()=>g(!$)}
718
+ onToggleTTS=${()=>m(!_)}
623
719
  onClear=${p.clearMessages}
624
720
  onToggleSidebar=${d}
625
721
  />
626
722
  `}
627
723
 
628
- ${e.showDevTools&&Z.html`
629
- <${Ze}
724
+ ${e.showDevTools&&Q.html`
725
+ <${nt}
630
726
  systems=${h.systems}
631
727
  agents=${h.agents}
632
728
  selectedSystem=${h.selectedSystem}
@@ -641,27 +737,27 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
641
737
  />
642
738
  `}
643
739
 
644
- ${e.showTasksTab!==!1&&Z.html`
740
+ ${e.showTasksTab!==!1&&Q.html`
645
741
  <div class="cw-tabs">
646
742
  <button
647
- class=${`cw-tab ${o==="chat"?"cw-tab-active":""}`}
648
- onClick=${()=>E("chat")}
743
+ class=${`cw-tab ${l==="chat"?"cw-tab-active":""}`}
744
+ onClick=${()=>M("chat")}
649
745
  >
650
746
  Chat
651
747
  </button>
652
748
  <button
653
- class=${`cw-tab ${o==="tasks"?"cw-tab-active":""}`}
654
- onClick=${()=>E("tasks")}
749
+ class=${`cw-tab ${l==="tasks"?"cw-tab-active":""}`}
750
+ onClick=${()=>M("tasks")}
655
751
  >
656
- Tasks ${b.progress.total>0?Z.html`<span class="cw-tab-badge">${b.progress.completed}/${b.progress.total}</span>`:""}
752
+ Tasks ${k.progress.total>0?Q.html`<span class="cw-tab-badge">${k.progress.completed}/${k.progress.total}</span>`:""}
657
753
  </button>
658
754
  </div>
659
755
  `}
660
756
 
661
- ${f&&Z.html`<div class="cw-status-bar"><span>🐛 Debug</span></div>`}
757
+ ${$&&Q.html`<div class="cw-status-bar"><span>🐛 Debug</span></div>`}
662
758
 
663
- ${o==="chat"?Z.html`
664
- <${Me}
759
+ ${l==="chat"?Q.html`
760
+ <${xe}
665
761
  messages=${p.messages}
666
762
  isLoading=${p.isLoading}
667
763
  hasMoreMessages=${p.hasMoreMessages}
@@ -669,16 +765,16 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
669
765
  onLoadMore=${p.loadMoreMessages}
670
766
  onEditMessage=${p.editMessage}
671
767
  onRetryMessage=${p.retryMessage}
672
- debugMode=${f}
768
+ debugMode=${$}
673
769
  markdownParser=${s}
674
770
  emptyStateTitle=${e.emptyStateTitle}
675
771
  emptyStateMessage=${e.emptyStateMessage}
676
772
  />
677
773
 
678
- ${p.error&&Z.html`<div class="cw-error-bar">${p.error}</div>`}
774
+ ${p.error&&Q.html`<div class="cw-error-bar">${p.error}</div>`}
679
775
 
680
- ${e.showModelSelector&&S.availableModels.length>0&&Z.html`
681
- <${Ie}
776
+ ${e.showModelSelector&&S.availableModels.length>0&&Q.html`
777
+ <${Re}
682
778
  availableModels=${S.availableModels}
683
779
  selectedModel=${S.selectedModel}
684
780
  onSelectModel=${S.selectModel}
@@ -688,8 +784,8 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
688
784
  />
689
785
  `}
690
786
 
691
- <${xe}
692
- onSend=${r}
787
+ <${Ie}
788
+ onSend=${o}
693
789
  onCancel=${p.cancelRun}
694
790
  isLoading=${p.isLoading}
695
791
  placeholder=${e.placeholder}
@@ -697,22 +793,22 @@ var ve=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var rt=Objec
697
793
  enableVoice=${e.enableVoice}
698
794
  enableFiles=${e.showFileAttachment!==!1}
699
795
  />
700
- `:Z.html`
701
- <${Ae}
702
- tasks=${b.tasks}
703
- progress=${b.progress}
704
- isLoading=${b.isLoading}
705
- error=${b.error}
706
- onUpdate=${b.updateTask}
707
- onRemove=${b.removeTask}
708
- onClear=${b.clearTasks}
709
- onRefresh=${b.loadTaskList}
796
+ `:Q.html`
797
+ <${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}
710
806
  />
711
807
  `}
712
808
  </div>
713
- `}var Le={backendUrl:"http://localhost:8000",agentKey:"default-agent",title:"Chat Assistant",subtitle:"How can we help you today?",primaryColor:"#0066cc",headerTextColor:null,position:"bottom-right",defaultJourneyType:"general",enableDebugMode:!0,enableAutoRun:!0,journeyTypes:{},customerPrompts:{},placeholder:"Type your message...",emptyStateTitle:"Start a Conversation",emptyStateMessage:"Send a message to get started.",authStrategy:null,authToken:null,authHeader:null,authTokenPrefix:null,anonymousSessionEndpoint:null,anonymousTokenKey:"chat_widget_anonymous_token",onAuthError:null,anonymousTokenHeader:"X-Anonymous-Token",conversationIdKey:"chat_widget_conversation_id",sessionTokenKey:"chat_widget_session_token",apiPaths:{anonymousSession:"/api/accounts/anonymous-session/",conversations:"/api/agent-runtime/conversations/",runs:"/api/agent-runtime/runs/",runEvents:"/api/agent-runtime/runs/{runId}/events/",simulateCustomer:"/api/agent-runtime/simulate-customer/",ttsVoices:"/api/tts/voices/",ttsSetVoice:"/api/tts/set-voice/",models:"/api/agent-runtime/models/",systems:"/api/agent-runtime/systems/",agents:"/api/agent-runtime/agents/"},apiCaseStyle:"auto",theme:"light",showHeader:!0,showFileAttachment:!0,showTasksTab:!0,showConversationSidebar:!0,showClearButton:!0,showDebugButton:!0,showTTSButton:!0,showVoiceSettings:!0,showExpandButton:!0,showModelSelector:!1,showDevTools:!1,enableVoice:!0,modelKey:"chat_widget_selected_model",autoRunDelay:1e3,autoRunMode:"automatic",enableTTS:!1,ttsProxyUrl:null,elevenLabsApiKey:null,ttsVoices:{assistant:null,user:null},ttsModel:"eleven_turbo_v2_5",ttsSettings:{stability:.5,similarity_boost:.75,style:0,use_speaker_boost:!0},availableVoices:[],onEvent:null,containerId:null,embedded:!1,metadata:{}};function Ke(e){let t={...Le.apiPaths,...e.apiPaths||{}};return{...Le,...e,apiPaths:t}}var je=require("preact/compat"),nt=require("htm/preact");var We=new Map,$t=0,O=null,Je=class{constructor(t={}){Ge(this,"_handleStateChange",t=>{this._state=t});this.instanceId=`cw-${++$t}`,this.config=Ke(t),this.container=null,this._state={},this._apiRef={current:null},We.set(this.instanceId,this)}init(){if(this.config.containerId){if(this.container=document.getElementById(this.config.containerId),!this.container)return console.error(`[ChatWidget] Container not found: ${this.config.containerId}`),this;this.container.classList.add("cw-container-embedded")}else this.container=document.createElement("div"),this.container.id=this.instanceId,this.container.className=`cw-container cw-position-${this.config.position}`,document.body.appendChild(this.container);return this._applyTheme(),this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} initialized`),this}_applyTheme(){this.container&&(this.container.classList.remove("cw-dark","cw-auto"),this.config.theme==="dark"?this.container.classList.add("cw-dark"):this.config.theme==="auto"&&this.container.classList.add("cw-auto"))}_render(t={}){this.container&&(0,je.render)(nt.html`<${fe}
809
+ `}var Ne={backendUrl:"http://localhost:8000",agentKey:"default-agent",title:"Chat Assistant",subtitle:"How can we help you today?",primaryColor:"#0066cc",headerTextColor:null,position:"bottom-right",defaultJourneyType:"general",enableDebugMode:!0,enableAutoRun:!0,journeyTypes:{},customerPrompts:{},placeholder:"Type your message...",emptyStateTitle:"Start a Conversation",emptyStateMessage:"Send a message to get started.",authStrategy:null,authToken:null,authHeader:null,authTokenPrefix:null,anonymousSessionEndpoint:null,anonymousTokenKey:"chat_widget_anonymous_token",onAuthError:null,anonymousTokenHeader:"X-Anonymous-Token",conversationIdKey:"chat_widget_conversation_id",sessionTokenKey:"chat_widget_session_token",apiPaths:{anonymousSession:"/api/accounts/anonymous-session/",conversations:"/api/agent-runtime/conversations/",runs:"/api/agent-runtime/runs/",runEvents:"/api/agent-runtime/runs/{runId}/events/",simulateCustomer:"/api/agent-runtime/simulate-customer/",ttsVoices:"/api/tts/voices/",ttsSetVoice:"/api/tts/set-voice/",models:"/api/agent-runtime/models/",systems:"/api/agent-runtime/systems/",agents:"/api/agent-runtime/agents/"},apiCaseStyle:"auto",theme:"light",showHeader:!0,showFileAttachment:!0,showTasksTab:!0,showConversationSidebar:!0,showClearButton:!0,showDebugButton:!0,showTTSButton:!0,showVoiceSettings:!0,showExpandButton:!0,showModelSelector:!1,showDevTools:!1,enableVoice:!0,modelKey:"chat_widget_selected_model",autoRunDelay:1e3,autoRunMode:"automatic",enableTTS:!1,ttsProxyUrl:null,elevenLabsApiKey:null,ttsVoices:{assistant:null,user:null},ttsModel:"eleven_turbo_v2_5",ttsSettings:{stability:.5,similarity_boost:.75,style:0,use_speaker_boost:!0},availableVoices:[],onEvent:null,containerId:null,embedded:!1,metadata:{}};function We(e){let t={...Ne.apiPaths,...e.apiPaths||{}};return{...Ne,...e,apiPaths:t}}var ze=require("preact/compat"),it=require("htm/preact");var Be=new Map,Rt=0,L=null,Ge=class{constructor(t={}){Ye(this,"_handleStateChange",t=>{this._state=t});this.instanceId=`cw-${++Rt}`,this.config=We(t),this.container=null,this._state={},this._apiRef={current:null},Be.set(this.instanceId,this)}init(){if(this.config.containerId){if(this.container=document.getElementById(this.config.containerId),!this.container)return console.error(`[ChatWidget] Container not found: ${this.config.containerId}`),this;this.container.classList.add("cw-container-embedded")}else this.container=document.createElement("div"),this.container.id=this.instanceId,this.container.className=`cw-container cw-position-${this.config.position}`,document.body.appendChild(this.container);return this._applyTheme(),this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} initialized`),this}_applyTheme(){this.container&&(this.container.classList.remove("cw-dark","cw-auto"),this.config.theme==="dark"?this.container.classList.add("cw-dark"):this.config.theme==="auto"&&this.container.classList.add("cw-auto"))}_render(t={}){this.container&&(0,ze.render)(it.html`<${$e}
714
810
  config=${{...this.config,...t}}
715
811
  onStateChange=${this._handleStateChange}
716
- markdownParser=${Ne._enhancedMarkdownParser}
812
+ markdownParser=${He._enhancedMarkdownParser}
717
813
  apiRef=${this._apiRef}
718
- />`,this.container)}destroy(){this.container&&((0,je.render)(null,this.container),this.config.containerId?this.container.classList.remove("cw-container-embedded"):this.container.remove(),this.container=null),We.delete(this.instanceId),console.log(`[ChatWidget] Instance ${this.instanceId} destroyed`)}open(){this._apiRef.current?this._apiRef.current.open():this._render({forceOpen:!0})}close(){this._apiRef.current?this._apiRef.current.close():this._render({forceOpen:!1})}send(t){this._apiRef.current&&this._apiRef.current.send(t)}clearMessages(){this._apiRef.current&&this._apiRef.current.clearMessages()}toggleTTS(){this._apiRef.current&&this._apiRef.current.toggleTTS()}stopSpeech(){this._apiRef.current&&this._apiRef.current.stopSpeech()}setAuth(t){this._apiRef.current&&this._apiRef.current.setAuth(t)}clearAuth(){this._apiRef.current&&this._apiRef.current.clearAuth()}getState(){return{...this._state}}getConfig(){return{...this.config}}updateMetadata(t){this.config.metadata={...this.config.metadata,...t},this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} metadata updated:`,t)}updateConfig(t){this.config={...this.config,...t},"theme"in t&&this._applyTheme(),this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} config updated`)}};function at(e={}){return new Je(e).init()}function yt(e={}){return O&&O.destroy(),O=at(e),O}function wt(){O&&(O.destroy(),O=null)}function vt(){O&&O.open()}function kt(){O&&O.close()}function bt(e){O&&O.send(e)}function Ct(){O&&O.clearMessages()}function St(){O&&O.toggleTTS()}function Tt(){O&&O.stopSpeech()}function _t(e){O&&O.setAuth(e)}function Mt(){O&&O.clearAuth()}function xt(){return O?O.getState():null}function Et(){return O?O.getConfig():null}var Ne={createInstance:at,getInstance:e=>We.get(e),getAllInstances:()=>Array.from(We.values()),init:yt,destroy:wt,open:vt,close:kt,send:bt,clearMessages:Ct,toggleTTS:St,stopSpeech:Tt,setAuth:_t,clearAuth:Mt,getState:xt,getConfig:Et,_enhancedMarkdownParser:null};typeof window<"u"&&(window.ChatWidget=Ne);var It=fe;
814
+ />`,this.container)}destroy(){this.container&&((0,ze.render)(null,this.container),this.config.containerId?this.container.classList.remove("cw-container-embedded"):this.container.remove(),this.container=null),Be.delete(this.instanceId),console.log(`[ChatWidget] Instance ${this.instanceId} destroyed`)}open(){this._apiRef.current?this._apiRef.current.open():this._render({forceOpen:!0})}close(){this._apiRef.current?this._apiRef.current.close():this._render({forceOpen:!1})}send(t){this._apiRef.current&&this._apiRef.current.send(t)}clearMessages(){this._apiRef.current&&this._apiRef.current.clearMessages()}toggleTTS(){this._apiRef.current&&this._apiRef.current.toggleTTS()}stopSpeech(){this._apiRef.current&&this._apiRef.current.stopSpeech()}setAuth(t){this._apiRef.current&&this._apiRef.current.setAuth(t)}clearAuth(){this._apiRef.current&&this._apiRef.current.clearAuth()}getState(){return{...this._state}}getConfig(){return{...this.config}}updateMetadata(t){this.config.metadata={...this.config.metadata,...t},this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} metadata updated:`,t)}updateConfig(t){this.config={...this.config,...t},"theme"in t&&this._applyTheme(),this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} config updated`)}};function ct(e={}){return new Ge(e).init()}function Dt(e={}){return L&&L.destroy(),L=ct(e),L}function Ft(){L&&(L.destroy(),L=null)}function Ot(){L&&L.open()}function Pt(){L&&L.close()}function Lt(e){L&&L.send(e)}function Kt(){L&&L.clearMessages()}function Nt(){L&&L.toggleTTS()}function Wt(){L&&L.stopSpeech()}function Bt(e){L&&L.setAuth(e)}function Ht(){L&&L.clearAuth()}function Vt(){return L?L.getState():null}function Ut(){return L?L.getConfig():null}var He={createInstance:ct,getInstance:e=>Be.get(e),getAllInstances:()=>Array.from(Be.values()),init:Dt,destroy:Ft,open:Ot,close:Pt,send:Lt,clearMessages:Kt,toggleTTS:Nt,stopSpeech:Wt,setAuth:Bt,clearAuth:Ht,getState:Vt,getConfig:Ut,_enhancedMarkdownParser:null};typeof window<"u"&&(window.ChatWidget=He);var jt=$e;