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