@makemore/agent-frontend 2.10.0 → 2.11.1

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