@makemore/agent-frontend 2.11.0 → 2.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat-widget.cjs.js +233 -231
- package/dist/chat-widget.esm.js +267 -265
- package/dist/chat-widget.js +207 -205
- package/dist/react.cjs.js +233 -231
- package/dist/react.esm.js +267 -265
- package/package.json +1 -1
- package/src/components/ChatWidget.js +1 -0
- package/src/components/Message.js +6 -3
- package/src/components/MessageList.js +2 -0
package/dist/chat-widget.esm.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var Pe=(e,t,s)=>(kt(e,typeof t!="symbol"?t+"":t,s),s);import{render as yt}from"preact";import{html as Wt}from"htm/preact";import{html as G}from"htm/preact";import{useState as Y,useEffect as he,useCallback as ie,useMemo as Re}from"preact/hooks";import{html as te}from"htm/preact";function bt(e){return e.replace(/_([a-z])/g,(t,s)=>s.toUpperCase())}function Me(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}function ge(e){return Array.isArray(e)?e.map(ge):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[bt(t),ge(s)])):e}function fe(e){return Array.isArray(e)?e.map(fe):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[Me(t),fe(s)])):e}function $e(){return"msg-"+Date.now()+"-"+Math.random().toString(36).substr(2,9)}function
|
|
2
|
-
<div class="cw-header" style=${{backgroundColor:
|
|
3
|
-
${
|
|
1
|
+
var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var Pe=(e,t,s)=>(kt(e,typeof t!="symbol"?t+"":t,s),s);import{render as yt}from"preact";import{html as Wt}from"htm/preact";import{html as G}from"htm/preact";import{useState as Y,useEffect as he,useCallback as ie,useMemo as Re}from"preact/hooks";import{html as te}from"htm/preact";function bt(e){return e.replace(/_([a-z])/g,(t,s)=>s.toUpperCase())}function Me(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}function ge(e){return Array.isArray(e)?e.map(ge):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[bt(t),ge(s)])):e}function fe(e){return Array.isArray(e)?e.map(fe):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[Me(t),fe(s)])):e}function $e(){return"msg-"+Date.now()+"-"+Math.random().toString(36).substr(2,9)}function H(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function Le(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 Ke(e,t=null){if(t)return t(e);let s=H(e);return s=s.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),s=s.replace(/__(.+?)__/g,"<strong>$1</strong>"),s=s.replace(/\*(.+?)\*/g,"<em>$1</em>"),s=s.replace(/_(.+?)_/g,"<em>$1</em>"),s=s.replace(/`(.+?)`/g,"<code>$1</code>"),s=s.replace(/\[(.+?)\]\((.+?)\)/g,'<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>'),s=s.replace(/\n/g,"<br>"),s}function Ne(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 Be(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 ye(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 we(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 He(e){return Ct(e)>.179?"#000000":"#ffffff"}function We({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:F,ttsProxyUrl:D}=e,L=F||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,159 +15,159 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
15
15
|
`}
|
|
16
16
|
|
|
17
17
|
<div class="cw-title-container">
|
|
18
|
-
<span class="cw-title">${
|
|
18
|
+
<span class="cw-title">${H(v)}</span>
|
|
19
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">${H(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
|
-
${
|
|
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 ne}from"htm/preact";import{useRef as qe,useEffect as Ye}from"preact/hooks";import{html as
|
|
70
|
+
`}import{html as ne}from"htm/preact";import{useRef as qe,useEffect as Ye}from"preact/hooks";import{html as N}from"htm/preact";import{useState as ke,useRef as Ot,useEffect as Ft}from"preact/hooks";import{html as A}from"htm/preact";import{useState as Ve}from"preact/hooks";function Ue({block:e,onAction:t,markdownParser:s}){return A`
|
|
71
71
|
<div class="cw-block-card">
|
|
72
|
-
${e.image&&
|
|
72
|
+
${e.image&&A`<img class="cw-block-card-image" src=${e.image} alt=${e.title||""} />`}
|
|
73
73
|
<div class="cw-block-card-body">
|
|
74
|
-
${e.badge&&
|
|
75
|
-
${e.title&&
|
|
76
|
-
${e.subtitle&&
|
|
77
|
-
${e.metadata&&e.metadata.length>0&&
|
|
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
78
|
<div class="cw-block-card-meta">
|
|
79
|
-
${e.metadata.map(n=>
|
|
79
|
+
${e.metadata.map(n=>A`
|
|
80
80
|
<span class="cw-block-meta-pair">
|
|
81
81
|
<span class="cw-block-meta-label">${n.label}:</span> ${n.value}
|
|
82
82
|
</span>
|
|
83
83
|
`)}
|
|
84
84
|
</div>
|
|
85
85
|
`}
|
|
86
|
-
${e.actions&&e.actions.length>0&&
|
|
86
|
+
${e.actions&&e.actions.length>0&&A`
|
|
87
87
|
<div class="cw-block-card-actions">
|
|
88
|
-
${e.actions.map(n=>
|
|
88
|
+
${e.actions.map(n=>A`<${je} action=${n} onAction=${t} />`)}
|
|
89
89
|
</div>
|
|
90
90
|
`}
|
|
91
91
|
</div>
|
|
92
92
|
</div>
|
|
93
|
-
`}function St({block:e,onAction:t,markdownParser:s}){let n=e.layout||"vertical";return
|
|
93
|
+
`}function St({block:e,onAction:t,markdownParser:s}){let n=e.layout||"vertical";return A`
|
|
94
94
|
<div class="cw-block-card-list cw-block-card-list-${n}">
|
|
95
|
-
${(e.items||[]).map(
|
|
96
|
-
<${Ue} block=${{type:"card",...
|
|
95
|
+
${(e.items||[]).map(r=>A`
|
|
96
|
+
<${Ue} block=${{type:"card",...r}} onAction=${t} markdownParser=${s} />
|
|
97
97
|
`)}
|
|
98
98
|
</div>
|
|
99
|
-
`}function je({action:e,onAction:t}){let s=e.style||"primary",n=()=>{t&&t(e)};return e.type==="link"?
|
|
99
|
+
`}function je({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
100
|
<div class="cw-block-action-buttons">
|
|
101
|
-
${(e.buttons||[]).map(s=>
|
|
101
|
+
${(e.buttons||[]).map(s=>A`<${je} action=${s} onAction=${t} />`)}
|
|
102
102
|
</div>
|
|
103
|
-
`}function _t({block:e}){let t=e.style||"info";return
|
|
103
|
+
`}function _t({block:e}){let t=e.style||"info";return A`
|
|
104
104
|
<div class="cw-block-callout cw-block-callout-${t}">
|
|
105
105
|
<span class="cw-block-callout-icon">${{info:"\u2139\uFE0F",success:"\u2705",warning:"\u26A0\uFE0F"}[t]||"\u2139\uFE0F"}</span>
|
|
106
106
|
<div class="cw-block-callout-content">
|
|
107
|
-
${e.title&&
|
|
108
|
-
${e.body&&
|
|
107
|
+
${e.title&&A`<strong>${e.title}</strong>`}
|
|
108
|
+
${e.body&&A`<span>${e.body}</span>`}
|
|
109
109
|
</div>
|
|
110
110
|
</div>
|
|
111
|
-
`}function Mt({block:e}){return
|
|
111
|
+
`}function Mt({block:e}){return A`
|
|
112
112
|
<figure class="cw-block-image">
|
|
113
113
|
<img src=${e.url} alt=${e.alt||""} />
|
|
114
|
-
${e.caption&&
|
|
114
|
+
${e.caption&&A`<figcaption>${e.caption}</figcaption>`}
|
|
115
115
|
</figure>
|
|
116
|
-
`}function Et(){return
|
|
116
|
+
`}function Et(){return A`<hr class="cw-block-divider" />`}function It({block:e}){return A`
|
|
117
117
|
<div class="cw-block-table-wrapper">
|
|
118
118
|
<table class="cw-block-table">
|
|
119
|
-
${e.headers&&e.headers.length>0&&
|
|
120
|
-
<thead><tr>${e.headers.map(t=>
|
|
119
|
+
${e.headers&&e.headers.length>0&&A`
|
|
120
|
+
<thead><tr>${e.headers.map(t=>A`<th>${t}</th>`)}</tr></thead>
|
|
121
121
|
`}
|
|
122
122
|
<tbody>
|
|
123
|
-
${(e.rows||[]).map(t=>
|
|
124
|
-
<tr>${t.map(s=>
|
|
123
|
+
${(e.rows||[]).map(t=>A`
|
|
124
|
+
<tr>${t.map(s=>A`<td>${s}</td>`)}</tr>
|
|
125
125
|
`)}
|
|
126
126
|
</tbody>
|
|
127
127
|
</table>
|
|
128
128
|
</div>
|
|
129
|
-
`}function xt({block:e}){let[t,s]=Ve(!1),n=()=>{navigator.clipboard.writeText(e.code).then(()=>{s(!0),setTimeout(()=>s(!1),1500)})};return
|
|
129
|
+
`}function xt({block:e}){let[t,s]=Ve(!1),n=()=>{navigator.clipboard.writeText(e.code).then(()=>{s(!0),setTimeout(()=>s(!1),1500)})};return A`
|
|
130
130
|
<div class="cw-block-code">
|
|
131
|
-
${e.filename&&
|
|
132
|
-
<pre><code>${
|
|
133
|
-
${e.copyable!==!1&&
|
|
131
|
+
${e.filename&&A`<div class="cw-block-code-filename">${e.filename}</div>`}
|
|
132
|
+
<pre><code>${H(e.code)}</code></pre>
|
|
133
|
+
${e.copyable!==!1&&A`
|
|
134
134
|
<button class="cw-block-code-copy" onClick=${n}>${t?"\u2713":"\u2398"}</button>
|
|
135
135
|
`}
|
|
136
136
|
</div>
|
|
137
|
-
`}function At({block:e}){let[t,s]=Ve(e.defaultOpen||!1);return
|
|
137
|
+
`}function At({block:e}){let[t,s]=Ve(e.defaultOpen||!1);return A`
|
|
138
138
|
<details class="cw-block-collapsible" open=${t} onClick=${n=>{n.preventDefault(),s(!t)}}>
|
|
139
139
|
<summary>${e.title}</summary>
|
|
140
140
|
<div class="cw-block-collapsible-body">${e.body}</div>
|
|
141
141
|
</details>
|
|
142
|
-
`}function Rt({block:e}){let t={loading:"\u23F3",success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F"};return
|
|
142
|
+
`}function Rt({block:e}){let t={loading:"\u23F3",success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F"};return A`
|
|
143
143
|
<div class="cw-block-status cw-block-status-${e.state||"info"}">
|
|
144
144
|
<span class="cw-block-status-icon">${t[e.state]||"\u2139\uFE0F"}</span>
|
|
145
145
|
<div>
|
|
146
146
|
<strong>${e.title}</strong>
|
|
147
|
-
${e.body&&
|
|
148
|
-
${e.progress!=null&&
|
|
147
|
+
${e.body&&A`<div>${e.body}</div>`}
|
|
148
|
+
${e.progress!=null&&A`
|
|
149
149
|
<div class="cw-block-progress"><div class="cw-block-progress-bar" style=${{width:`${e.progress*100}%`}}></div></div>
|
|
150
150
|
`}
|
|
151
151
|
</div>
|
|
152
152
|
</div>
|
|
153
|
-
`}var Dt={card:Ue,cardList:St,actionButtons:Tt,callout:_t,image:Mt,divider:Et,table:It,code:xt,collapsible:At,status:Rt};function Je({blocks:e,onAction:t,markdownParser:s}){return!e||e.length===0?null:
|
|
153
|
+
`}var Dt={card:Ue,cardList:St,actionButtons:Tt,callout:_t,image:Mt,divider:Et,table:It,code:xt,collapsible:At,status:Rt};function Je({blocks:e,onAction:t,markdownParser:s}){return!e||e.length===0?null:A`
|
|
154
154
|
<div class="cw-content-blocks">
|
|
155
|
-
${e.map((n,
|
|
155
|
+
${e.map((n,r)=>{let l=Dt[n.type];return l?A`<${l} key=${r} block=${n} onAction=${t} markdownParser=${s} />`:null})}
|
|
156
156
|
</div>
|
|
157
|
-
`}function ve({msg:e,show:t,onToggle:s}){return t?
|
|
157
|
+
`}function ve({msg:e,show:t,onToggle:s}){return t?N`
|
|
158
158
|
<div class="cw-debug-payload">
|
|
159
159
|
<button class="cw-debug-payload-close" onClick=${s}>×</button>
|
|
160
160
|
<pre class="cw-debug-payload-content">${JSON.stringify(e,null,2)}</pre>
|
|
161
161
|
</div>
|
|
162
|
-
`:
|
|
162
|
+
`:N`
|
|
163
163
|
<button
|
|
164
164
|
class="cw-debug-payload-btn"
|
|
165
165
|
onClick=${s}
|
|
166
166
|
title="Show message payload"
|
|
167
167
|
>{ }</button>
|
|
168
|
-
`}function ze({onEdit:e,onRetry:t,isLoading:s,position:n,showEdit:
|
|
168
|
+
`}function ze({onEdit:e,onRetry:t,isLoading:s,position:n,showEdit:r=!0}){return s?null:N`
|
|
169
169
|
<div class="cw-message-actions cw-message-actions-${n||"left"}">
|
|
170
|
-
${
|
|
170
|
+
${r&&N`
|
|
171
171
|
<button
|
|
172
172
|
class="cw-message-action-btn"
|
|
173
173
|
onClick=${e}
|
|
@@ -191,14 +191,14 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
191
191
|
</svg>
|
|
192
192
|
</button>
|
|
193
193
|
</div>
|
|
194
|
-
`}function Pt({initialContent:e,onSave:t,onCancel:s}){let[n,
|
|
194
|
+
`}function Pt({initialContent:e,onSave:t,onCancel:s}){let[n,r]=ke(e),l=Ot(null);return Ft(()=>{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`
|
|
195
195
|
<div class="cw-inline-edit">
|
|
196
196
|
<textarea
|
|
197
|
-
ref=${
|
|
197
|
+
ref=${l}
|
|
198
198
|
class="cw-inline-edit-input"
|
|
199
199
|
value=${n}
|
|
200
|
-
onInput=${
|
|
201
|
-
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()}}
|
|
202
202
|
rows="1"
|
|
203
203
|
/>
|
|
204
204
|
<div class="cw-inline-edit-actions">
|
|
@@ -215,42 +215,42 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
215
215
|
>Save & Send</button>
|
|
216
216
|
</div>
|
|
217
217
|
</div>
|
|
218
|
-
`}function Ge({msg:e,debugMode:t,markdownParser:s,onEdit:n,onRetry:
|
|
219
|
-
<div class="cw-agent-context ${
|
|
220
|
-
<span class="cw-agent-context-icon">${
|
|
218
|
+
`}function Ge({msg:e,debugMode:t,markdownParser:s,onEdit:n,onRetry:r,onSendMessage:l,isLoading:y,messageIndex:d}){let[h,b]=ke(!1),[c,w]=ke(!1),[p,v]=ke(!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>
|
|
221
221
|
<span class="cw-agent-context-text">${e.content}</span>
|
|
222
|
-
${e.metadata?.agentName&&
|
|
222
|
+
${e.metadata?.agentName&&N`
|
|
223
223
|
<span class="cw-agent-context-name">${e.metadata.agentName}</span>
|
|
224
224
|
`}
|
|
225
|
-
${t&&
|
|
225
|
+
${t&&N`<${ve} msg=${e} show=${c} onToggle=${()=>w(!c)} />`}
|
|
226
226
|
</div>
|
|
227
|
-
`;if(e.type==="content_blocks"&&e.metadata?.blocks){let k=
|
|
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
228
|
<div class="cw-message-row" style="position: relative;">
|
|
229
229
|
<${Je}
|
|
230
230
|
blocks=${e.metadata.blocks}
|
|
231
231
|
onAction=${k}
|
|
232
232
|
markdownParser=${s}
|
|
233
233
|
/>
|
|
234
|
-
${t&&
|
|
234
|
+
${t&&N`<${ve} msg=${e} show=${c} onToggle=${()=>w(!c)} />`}
|
|
235
235
|
</div>
|
|
236
|
-
`}if(
|
|
237
|
-
<div class="cw-tool-message ${
|
|
238
|
-
<span class="cw-tool-label" onClick=${()=>k
|
|
236
|
+
`}if($||u){let k=e.metadata?.arguments||e.metadata?.result,i=x=>{if(typeof x=="string")try{return JSON.stringify(JSON.parse(x),null,2)}catch{return x}return JSON.stringify(x,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)}>
|
|
239
239
|
${e.content}
|
|
240
|
-
${k&&
|
|
240
|
+
${k&&N`<span class="cw-tool-expand">${h?"\u25BC":"\u25B6"}</span>`}
|
|
241
241
|
</span>
|
|
242
|
-
${
|
|
243
|
-
<pre class="cw-tool-details">${
|
|
242
|
+
${h&&k&&N`
|
|
243
|
+
<pre class="cw-tool-details">${H(i($?e.metadata.arguments:e.metadata.result))}</pre>
|
|
244
244
|
`}
|
|
245
|
-
${t&&
|
|
245
|
+
${t&&N`<${ve} msg=${e} show=${c} onToggle=${()=>w(!c)} />`}
|
|
246
246
|
</div>
|
|
247
|
-
`}let
|
|
247
|
+
`}let R=["cw-message",o&&"cw-message-user",T&&"cw-message-error"].filter(Boolean).join(" "),F=`cw-message-row ${o?"cw-message-row-user":""}`,D=e.role==="assistant"?Ke(e.content,s):H(e.content),L=e.files&&e.files.length>0,U=()=>L?N`
|
|
248
248
|
<div class="cw-message-attachments">
|
|
249
|
-
${e.files.map(k=>k.type&&k.type.startsWith("image/")?
|
|
249
|
+
${e.files.map(k=>k.type&&k.type.startsWith("image/")?N`
|
|
250
250
|
<a class="cw-attachment-thumbnail" href=${k.url} target="_blank" title=${k.name}>
|
|
251
251
|
<img src=${k.url} alt=${k.name} />
|
|
252
252
|
</a>
|
|
253
|
-
`:
|
|
253
|
+
`:N`
|
|
254
254
|
<a class="cw-attachment-file" href=${k.url} target="_blank" title=${k.name}>
|
|
255
255
|
<span class="cw-attachment-icon">${we(k.type)}</span>
|
|
256
256
|
<span class="cw-attachment-info">
|
|
@@ -260,70 +260,71 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
260
260
|
</a>
|
|
261
261
|
`)}
|
|
262
262
|
</div>
|
|
263
|
-
`:null,
|
|
264
|
-
<div class=${
|
|
265
|
-
${
|
|
263
|
+
`:null,W=k=>{v(!1),n&&n(d,k)},g=()=>{r&&r(d)};if(o&&p)return N`
|
|
264
|
+
<div class=${F} style="position: relative;">
|
|
265
|
+
${U()}
|
|
266
266
|
<${Pt}
|
|
267
267
|
initialContent=${e.content}
|
|
268
|
-
onSave=${
|
|
269
|
-
onCancel=${()=>
|
|
268
|
+
onSave=${W}
|
|
269
|
+
onCancel=${()=>v(!1)}
|
|
270
270
|
/>
|
|
271
271
|
</div>
|
|
272
|
-
`;let
|
|
273
|
-
<div class="${
|
|
274
|
-
${
|
|
275
|
-
${
|
|
272
|
+
`;let _=o&&n&&r,S=e.role==="assistant"&&r&&!y;return N`
|
|
273
|
+
<div class="${F} ${_||S?"cw-message-row-with-actions":""}">
|
|
274
|
+
${U()}
|
|
275
|
+
${_&&N`
|
|
276
276
|
<div class="cw-user-actions-wrapper">
|
|
277
277
|
<${ze}
|
|
278
|
-
onEdit=${()=>
|
|
279
|
-
onRetry=${
|
|
280
|
-
isLoading=${
|
|
278
|
+
onEdit=${()=>v(!0)}
|
|
279
|
+
onRetry=${g}
|
|
280
|
+
isLoading=${y}
|
|
281
281
|
position="left"
|
|
282
282
|
showEdit=${!0}
|
|
283
283
|
/>
|
|
284
|
-
<div class=${
|
|
284
|
+
<div class=${R} dangerouslySetInnerHTML=${{__html:D}} />
|
|
285
285
|
</div>
|
|
286
286
|
`}
|
|
287
|
-
${!
|
|
288
|
-
<div class=${
|
|
287
|
+
${!_&&N`
|
|
288
|
+
<div class=${R} dangerouslySetInnerHTML=${{__html:D}} />
|
|
289
289
|
`}
|
|
290
|
-
${
|
|
290
|
+
${S&&N`
|
|
291
291
|
<${ze}
|
|
292
|
-
onRetry=${
|
|
293
|
-
isLoading=${
|
|
292
|
+
onRetry=${g}
|
|
293
|
+
isLoading=${y}
|
|
294
294
|
position="right"
|
|
295
295
|
showEdit=${!1}
|
|
296
296
|
/>
|
|
297
297
|
`}
|
|
298
|
-
${t&&
|
|
298
|
+
${t&&N`<${ve} msg=${e} show=${c} onToggle=${()=>w(!c)} />`}
|
|
299
299
|
</div>
|
|
300
|
-
`}function Xe({messages:e,isLoading:t,hasMoreMessages:s,loadingMoreMessages:n,onLoadMore:
|
|
301
|
-
<div class="cw-messages" ref=${
|
|
302
|
-
${
|
|
300
|
+
`}function Xe({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=qe(null),v=qe(!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})}};Ye(()=>{let $=p.current;$&&v.current&&requestAnimationFrame(()=>{$.scrollTop=$.scrollHeight})},[e,t]),Ye(()=>{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`
|
|
303
303
|
<div class="cw-empty-state">
|
|
304
304
|
<svg class="cw-empty-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
305
305
|
<path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
|
|
306
306
|
</svg>
|
|
307
|
-
<h3>${
|
|
308
|
-
<p>${
|
|
307
|
+
<h3>${H(c)}</h3>
|
|
308
|
+
<p>${H(w)}</p>
|
|
309
309
|
</div>
|
|
310
310
|
`}
|
|
311
311
|
|
|
312
|
-
${!
|
|
313
|
-
<div class="cw-load-more" onClick=${
|
|
312
|
+
${!C&&s&&ne`
|
|
313
|
+
<div class="cw-load-more" onClick=${r}>
|
|
314
314
|
${n?ne`<span class="cw-spinner"></span><span>Loading...</span>`:ne`<span>↑ Scroll up or click to load older messages</span>`}
|
|
315
315
|
</div>
|
|
316
316
|
`}
|
|
317
317
|
|
|
318
|
-
${e.map((
|
|
318
|
+
${e.map(($,u)=>ne`
|
|
319
319
|
<${Ge}
|
|
320
|
-
key=${
|
|
321
|
-
msg=${
|
|
322
|
-
messageIndex=${
|
|
323
|
-
debugMode=${
|
|
324
|
-
markdownParser=${
|
|
325
|
-
onEdit=${
|
|
320
|
+
key=${$.id}
|
|
321
|
+
msg=${$}
|
|
322
|
+
messageIndex=${u}
|
|
323
|
+
debugMode=${h}
|
|
324
|
+
markdownParser=${b}
|
|
325
|
+
onEdit=${l}
|
|
326
326
|
onRetry=${y}
|
|
327
|
+
onSendMessage=${d}
|
|
327
328
|
isLoading=${t}
|
|
328
329
|
/>
|
|
329
330
|
`)}
|
|
@@ -337,11 +338,11 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
337
338
|
</div>
|
|
338
339
|
`}
|
|
339
340
|
</div>
|
|
340
|
-
`}import{html as Z}from"htm/preact";import{useState as ce,useRef as be,useEffect as Ee}from"preact/hooks";var Ie=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function Ze({onSend:e,onCancel:t,isLoading:s,placeholder:n,primaryColor:
|
|
341
|
+
`}import{html as Z}from"htm/preact";import{useState as ce,useRef as be,useEffect as Ee}from"preact/hooks";var Ie=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function Ze({onSend:e,onCancel:t,isLoading:s,placeholder:n,primaryColor:r,enableVoice:l=!0,enableFiles:y=!0}){let[d,h]=ce(""),[b,c]=ce([]),[w,p]=ce(!1),[v,o]=ce(!1),[C]=ce(()=>!!Ie),$=be(null),u=be(null),T=be(null),m=be(!1);Ee(()=>{!s&&$.current&&$.current.focus()},[s]),Ee(()=>{$.current&&($.current.style.height="auto",$.current.style.height=Math.min($.current.scrollHeight,150)+"px")},[d]),Ee(()=>()=>{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 x=Array.from(i.target.files||[]);x.length>0&&c(O=>[...O,...x])},R=i=>{c(x=>x.filter((O,a)=>a!==i))},F=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(!Ie||s)return;m.current=!0;let i=new Ie;i.continuous=!0,i.interimResults=!0,i.lang=navigator.language||"en-US";let x=d,O="";i.onstart=()=>{o(!0)},i.onresult=a=>{O="";for(let M=a.resultIndex;M<a.results.length;M++){let B=a.results[M][0].transcript;a.results[M].isFinal?x+=(x?" ":"")+B:O+=B}h(x+(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,o(!1),h(x||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),x&&h(x),T.current=null},T.current=i,i.start()},W=()=>{m.current=!1,T.current&&T.current.stop()},g=i=>{i.preventDefault(),v?W():U()},_=Z`
|
|
341
342
|
<svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor">
|
|
342
343
|
<rect x="2" y="2" width="10" height="10" rx="1" />
|
|
343
344
|
</svg>
|
|
344
|
-
`,
|
|
345
|
+
`,f=Z`
|
|
345
346
|
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
346
347
|
<path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"></path>
|
|
347
348
|
<path d="M19 10v2a7 7 0 0 1-14 0v-2"></path>
|
|
@@ -352,26 +353,26 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
352
353
|
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
353
354
|
<path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"></path>
|
|
354
355
|
</svg>
|
|
355
|
-
`,
|
|
356
|
-
<form class="cw-input-form" onSubmit=${
|
|
356
|
+
`,E=l&&C,k=y;return Z`
|
|
357
|
+
<form class="cw-input-form" onSubmit=${K}>
|
|
357
358
|
<input
|
|
358
359
|
type="file"
|
|
359
|
-
ref=${
|
|
360
|
+
ref=${u}
|
|
360
361
|
style="display: none"
|
|
361
362
|
multiple
|
|
362
|
-
onChange=${
|
|
363
|
+
onChange=${j}
|
|
363
364
|
/>
|
|
364
|
-
${
|
|
365
|
+
${b.length>0&&Z`
|
|
365
366
|
<div class="cw-file-chips">
|
|
366
|
-
${
|
|
367
|
-
<div class="cw-file-chip" key=${
|
|
368
|
-
<span class="cw-file-chip-icon">${we(
|
|
369
|
-
<span class="cw-file-chip-name" title=${
|
|
370
|
-
<span class="cw-file-chip-size">(${ye(
|
|
367
|
+
${b.map((i,x)=>Z`
|
|
368
|
+
<div class="cw-file-chip" key=${x}>
|
|
369
|
+
<span class="cw-file-chip-icon">${we(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">(${ye(i.size)})</span>
|
|
371
372
|
<button
|
|
372
373
|
type="button"
|
|
373
374
|
class="cw-file-chip-remove"
|
|
374
|
-
onClick=${()=>
|
|
375
|
+
onClick=${()=>R(x)}
|
|
375
376
|
title="Remove file"
|
|
376
377
|
>×</button>
|
|
377
378
|
</div>
|
|
@@ -379,57 +380,57 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
379
380
|
</div>
|
|
380
381
|
`}
|
|
381
382
|
<textarea
|
|
382
|
-
ref=${
|
|
383
|
+
ref=${$}
|
|
383
384
|
class="cw-input"
|
|
384
|
-
placeholder=${
|
|
385
|
-
value=${
|
|
386
|
-
onInput=${
|
|
387
|
-
onKeyDown=${
|
|
385
|
+
placeholder=${H(n)}
|
|
386
|
+
value=${d}
|
|
387
|
+
onInput=${i=>h(i.target.value)}
|
|
388
|
+
onKeyDown=${D}
|
|
388
389
|
disabled=${s}
|
|
389
390
|
rows="1"
|
|
390
391
|
/>
|
|
391
|
-
${
|
|
392
|
+
${k&&Z`
|
|
392
393
|
<button
|
|
393
394
|
type="button"
|
|
394
395
|
class="cw-attach-btn"
|
|
395
|
-
onClick=${
|
|
396
|
+
onClick=${F}
|
|
396
397
|
disabled=${s}
|
|
397
398
|
title="Attach files"
|
|
398
399
|
>
|
|
399
400
|
${S}
|
|
400
401
|
</button>
|
|
401
402
|
`}
|
|
402
|
-
${
|
|
403
|
+
${E&&Z`
|
|
403
404
|
<button
|
|
404
405
|
type="button"
|
|
405
|
-
class=${`cw-voice-btn ${
|
|
406
|
-
onClick=${
|
|
406
|
+
class=${`cw-voice-btn ${v?"cw-voice-btn-recording":""}`}
|
|
407
|
+
onClick=${g}
|
|
407
408
|
disabled=${s}
|
|
408
|
-
title=${
|
|
409
|
+
title=${v?"Stop recording":"Voice input"}
|
|
409
410
|
>
|
|
410
|
-
${
|
|
411
|
+
${f}
|
|
411
412
|
</button>
|
|
412
413
|
`}
|
|
413
414
|
<button
|
|
414
415
|
type=${s?"button":"submit"}
|
|
415
|
-
class=${`cw-send-btn ${s?"cw-send-btn-loading":""} ${s&&
|
|
416
|
-
style=${{backgroundColor:s&&
|
|
416
|
+
class=${`cw-send-btn ${s?"cw-send-btn-loading":""} ${s&&w?"cw-send-btn-stop":""}`}
|
|
417
|
+
style=${{backgroundColor:s&&w?"#dc2626":r}}
|
|
417
418
|
onClick=${L}
|
|
418
|
-
onMouseEnter=${()=>
|
|
419
|
-
onMouseLeave=${()=>
|
|
419
|
+
onMouseEnter=${()=>p(!0)}
|
|
420
|
+
onMouseLeave=${()=>p(!1)}
|
|
420
421
|
title=${s?"Stop":"Send"}
|
|
421
422
|
>
|
|
422
|
-
${s?
|
|
423
|
+
${s?w?_:Z`<span class="cw-spinner"></span>`:"\u27A4"}
|
|
423
424
|
</button>
|
|
424
425
|
</form>
|
|
425
|
-
`}import{html as Ce}from"htm/preact";function Qe({isOpen:e,conversations:t,conversationsLoading:s,currentConversationId:n,onClose:
|
|
426
|
+
`}import{html as Ce}from"htm/preact";function Qe({isOpen:e,conversations:t,conversationsLoading:s,currentConversationId:n,onClose:r,onNewConversation:l,onSwitchConversation:y}){return Ce`
|
|
426
427
|
<div class="cw-sidebar ${e?"cw-sidebar-open":""}">
|
|
427
428
|
<div class="cw-sidebar-header">
|
|
428
429
|
<span>Conversations</span>
|
|
429
|
-
<button class="cw-sidebar-close" onClick=${
|
|
430
|
+
<button class="cw-sidebar-close" onClick=${r}>✕</button>
|
|
430
431
|
</div>
|
|
431
432
|
|
|
432
|
-
<button class="cw-new-conversation" onClick=${
|
|
433
|
+
<button class="cw-new-conversation" onClick=${l}>
|
|
433
434
|
<span>+ New Conversation</span>
|
|
434
435
|
</button>
|
|
435
436
|
|
|
@@ -444,14 +445,14 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
444
445
|
<div class="cw-sidebar-empty">No conversations yet</div>
|
|
445
446
|
`}
|
|
446
447
|
|
|
447
|
-
${t.map(
|
|
448
|
+
${t.map(d=>Ce`
|
|
448
449
|
<div
|
|
449
|
-
key=${
|
|
450
|
-
class="cw-conversation-item ${
|
|
451
|
-
onClick=${()=>y(
|
|
450
|
+
key=${d.id}
|
|
451
|
+
class="cw-conversation-item ${d.id===n?"cw-conversation-active":""}"
|
|
452
|
+
onClick=${()=>y(d.id)}
|
|
452
453
|
>
|
|
453
|
-
<div class="cw-conversation-title">${
|
|
454
|
-
<div class="cw-conversation-date">${Le(
|
|
454
|
+
<div class="cw-conversation-title">${H(d.title||"Untitled")}</div>
|
|
455
|
+
<div class="cw-conversation-date">${Le(d.updatedAt||d.createdAt)}</div>
|
|
455
456
|
</div>
|
|
456
457
|
`)}
|
|
457
458
|
</div>
|
|
@@ -459,26 +460,26 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
459
460
|
|
|
460
461
|
<div
|
|
461
462
|
class="cw-sidebar-overlay ${e?"cw-sidebar-overlay-visible":""}"
|
|
462
|
-
onClick=${
|
|
463
|
+
onClick=${r}
|
|
463
464
|
/>
|
|
464
|
-
`}import{html as re}from"htm/preact";import{useState as Lt}from"preact/hooks";function et({availableModels:e,selectedModel:t,onSelectModel:s,thinkingEnabled:n,onToggleThinking:
|
|
465
|
+
`}import{html as re}from"htm/preact";import{useState as Lt}from"preact/hooks";function et({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`
|
|
465
466
|
<div class="cw-model-selector">
|
|
466
467
|
<button
|
|
467
468
|
class="cw-model-btn"
|
|
468
|
-
onClick=${
|
|
469
|
-
disabled=${
|
|
469
|
+
onClick=${w}
|
|
470
|
+
disabled=${l}
|
|
470
471
|
title="Select Model"
|
|
471
472
|
>
|
|
472
473
|
<span class="cw-model-icon">🤖</span>
|
|
473
|
-
<span class="cw-model-name">${
|
|
474
|
+
<span class="cw-model-name">${H(b)}</span>
|
|
474
475
|
<span class="cw-model-chevron">${y?"\u25B2":"\u25BC"}</span>
|
|
475
476
|
</button>
|
|
476
477
|
|
|
477
|
-
${
|
|
478
|
+
${c&&r&&re`
|
|
478
479
|
<button
|
|
479
480
|
class="cw-thinking-toggle ${n?"cw-thinking-enabled":""}"
|
|
480
|
-
onClick=${
|
|
481
|
-
disabled=${
|
|
481
|
+
onClick=${v}
|
|
482
|
+
disabled=${l}
|
|
482
483
|
title=${n?"Thinking enabled - click to disable":"Enable extended thinking"}
|
|
483
484
|
>
|
|
484
485
|
<span class="cw-thinking-icon">🧠</span>
|
|
@@ -487,49 +488,49 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
487
488
|
|
|
488
489
|
${y&&re`
|
|
489
490
|
<div class="cw-model-dropdown">
|
|
490
|
-
${e.map(
|
|
491
|
+
${e.map(o=>re`
|
|
491
492
|
<button
|
|
492
|
-
key=${
|
|
493
|
-
class="cw-model-option ${
|
|
494
|
-
onClick=${()=>
|
|
493
|
+
key=${o.id}
|
|
494
|
+
class="cw-model-option ${o.id===t?"cw-model-option-selected":""}"
|
|
495
|
+
onClick=${()=>p(o.id)}
|
|
495
496
|
>
|
|
496
497
|
<span class="cw-model-option-name">
|
|
497
|
-
${
|
|
498
|
-
${
|
|
498
|
+
${H(o.name)}
|
|
499
|
+
${o.supports_thinking&&re`<span class="cw-thinking-badge" title="Supports extended thinking">🧠</span>`}
|
|
499
500
|
</span>
|
|
500
|
-
<span class="cw-model-option-provider">${
|
|
501
|
-
${
|
|
502
|
-
<span class="cw-model-option-desc">${
|
|
501
|
+
<span class="cw-model-option-provider">${H(o.provider)}</span>
|
|
502
|
+
${o.description&&re`
|
|
503
|
+
<span class="cw-model-option-desc">${H(o.description)}</span>
|
|
503
504
|
`}
|
|
504
505
|
</button>
|
|
505
506
|
`)}
|
|
506
507
|
</div>
|
|
507
508
|
`}
|
|
508
509
|
</div>
|
|
509
|
-
`}import{html as Q}from"htm/preact";import{useState as tt,useCallback as de}from"preact/hooks";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 Bt({task:e,onUpdate:t,onRemove:s,depth:n=0}){let[
|
|
510
|
-
<div class="cw-task-item ${
|
|
510
|
+
`}import{html as Q}from"htm/preact";import{useState as tt,useCallback as de}from"preact/hooks";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 Bt({task:e,onUpdate:t,onRemove:s,depth:n=0}){let[r,l]=tt(!1),[y,d]=tt(e.name),h=de(()=>{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=de(()=>{y.trim()&&y!==e.name&&t(e.id,{name:y.trim()}),l(!1)},[e,y,t]),c=de(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`}}>
|
|
511
512
|
<button
|
|
512
513
|
class="cw-task-state-btn"
|
|
513
|
-
onClick=${
|
|
514
|
+
onClick=${h}
|
|
514
515
|
title=${Nt[e.state]}
|
|
515
516
|
>
|
|
516
517
|
${Kt[e.state]}
|
|
517
518
|
</button>
|
|
518
519
|
|
|
519
|
-
${
|
|
520
|
+
${r?Q`
|
|
520
521
|
<input
|
|
521
522
|
type="text"
|
|
522
523
|
class="cw-task-edit-input"
|
|
523
524
|
value=${y}
|
|
524
|
-
onInput=${
|
|
525
|
-
onBlur=${
|
|
526
|
-
onKeyDown=${
|
|
525
|
+
onInput=${p=>d(p.target.value)}
|
|
526
|
+
onBlur=${b}
|
|
527
|
+
onKeyDown=${c}
|
|
527
528
|
autoFocus
|
|
528
529
|
/>
|
|
529
530
|
`:Q`
|
|
530
531
|
<span
|
|
531
532
|
class="cw-task-name"
|
|
532
|
-
onClick=${()=>
|
|
533
|
+
onClick=${()=>l(!0)}
|
|
533
534
|
title="Click to edit"
|
|
534
535
|
>
|
|
535
536
|
${e.name}
|
|
@@ -544,16 +545,16 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
544
545
|
×
|
|
545
546
|
</button>
|
|
546
547
|
</div>
|
|
547
|
-
`}function st({tasks:e,progress:t,isLoading:s,error:n,onUpdate:
|
|
548
|
+
`}function st({tasks:e,progress:t,isLoading:s,error:n,onUpdate:r,onRemove:l,onClear:y,onRefresh:d}){let h=de(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=de((w,p=0)=>Q`
|
|
548
549
|
<${Bt}
|
|
549
|
-
key=${
|
|
550
|
-
task=${
|
|
551
|
-
depth=${
|
|
552
|
-
onUpdate=${
|
|
553
|
-
onRemove=${
|
|
550
|
+
key=${w.id}
|
|
551
|
+
task=${w}
|
|
552
|
+
depth=${p}
|
|
553
|
+
onUpdate=${r}
|
|
554
|
+
onRemove=${l}
|
|
554
555
|
/>
|
|
555
|
-
${
|
|
556
|
-
`,[
|
|
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`
|
|
557
558
|
<div class="cw-tasks-container">
|
|
558
559
|
<div class="cw-tasks-header">
|
|
559
560
|
<div class="cw-tasks-progress">
|
|
@@ -568,7 +569,7 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
568
569
|
</div>
|
|
569
570
|
</div>
|
|
570
571
|
<div class="cw-tasks-actions">
|
|
571
|
-
<button class="cw-tasks-action-btn" onClick=${
|
|
572
|
+
<button class="cw-tasks-action-btn" onClick=${d} title="Refresh">↻</button>
|
|
572
573
|
${e.length>0&&Q`
|
|
573
574
|
<button class="cw-tasks-action-btn" onClick=${y} title="Clear all">🗑</button>
|
|
574
575
|
`}
|
|
@@ -578,15 +579,15 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
578
579
|
${n&&Q`<div class="cw-tasks-error">${n}</div>`}
|
|
579
580
|
|
|
580
581
|
<div class="cw-tasks-list">
|
|
581
|
-
${
|
|
582
|
+
${c.length===0?Q`
|
|
582
583
|
<div class="cw-tasks-empty">
|
|
583
584
|
<p>No tasks yet</p>
|
|
584
585
|
<p class="cw-tasks-empty-hint">Tasks will appear here when the agent creates them</p>
|
|
585
586
|
</div>
|
|
586
|
-
`:
|
|
587
|
+
`:c.map(w=>b(w))}
|
|
587
588
|
</div>
|
|
588
589
|
</div>
|
|
589
|
-
`}import{html as z}from"htm/preact";function nt({systems:e,agents:t,selectedSystem:s,selectedAgent:n,selectedSystemVersion:
|
|
590
|
+
`}import{html as z}from"htm/preact";function nt({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`
|
|
590
591
|
<div class="cw-dev-toolbar">
|
|
591
592
|
<div class="cw-dev-toolbar-label">
|
|
592
593
|
<span class="cw-dev-toolbar-icon">🛠️</span>
|
|
@@ -597,12 +598,12 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
597
598
|
<!-- System -->
|
|
598
599
|
<div class="cw-dev-select-group">
|
|
599
600
|
<label class="cw-dev-label">System</label>
|
|
600
|
-
${
|
|
601
|
+
${C?z`
|
|
601
602
|
<select
|
|
602
603
|
class="cw-dev-select"
|
|
603
604
|
value=${s||""}
|
|
604
605
|
onChange=${m=>y(m.target.value)}
|
|
605
|
-
disabled=${
|
|
606
|
+
disabled=${c}
|
|
606
607
|
>
|
|
607
608
|
${e.map(m=>z`
|
|
608
609
|
<option key=${m.slug} value=${m.slug}>
|
|
@@ -611,167 +612,168 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
611
612
|
`)}
|
|
612
613
|
</select>
|
|
613
614
|
`:z`
|
|
614
|
-
<span class="cw-dev-badge">${
|
|
615
|
+
<span class="cw-dev-badge">${w?.name||"\u2014"}</span>
|
|
615
616
|
`}
|
|
616
617
|
</div>
|
|
617
618
|
|
|
618
619
|
<!-- System Version -->
|
|
619
620
|
<div class="cw-dev-select-group">
|
|
620
621
|
<label class="cw-dev-label">Sys Ver</label>
|
|
621
|
-
${
|
|
622
|
+
${u?z`
|
|
622
623
|
<select
|
|
623
624
|
class="cw-dev-select"
|
|
624
|
-
value=${
|
|
625
|
-
onChange=${m
|
|
626
|
-
disabled=${
|
|
625
|
+
value=${r||""}
|
|
626
|
+
onChange=${m=>h(m.target.value||null)}
|
|
627
|
+
disabled=${c}
|
|
627
628
|
>
|
|
628
|
-
${
|
|
629
|
+
${v.map(m=>z`
|
|
629
630
|
<option key=${m.version} value=${m.version}>
|
|
630
631
|
${m.version}${m.is_active?" \u2713":""}${m.is_draft?" (draft)":""}
|
|
631
632
|
</option>
|
|
632
633
|
`)}
|
|
633
634
|
</select>
|
|
634
635
|
`:z`
|
|
635
|
-
<span class="cw-dev-badge">${
|
|
636
|
+
<span class="cw-dev-badge">${v.length===1?v[0].version:"none"}</span>
|
|
636
637
|
`}
|
|
637
638
|
</div>
|
|
638
639
|
|
|
639
640
|
<!-- Agent -->
|
|
640
641
|
<div class="cw-dev-select-group">
|
|
641
642
|
<label class="cw-dev-label">Agent</label>
|
|
642
|
-
${
|
|
643
|
+
${$?z`
|
|
643
644
|
<select
|
|
644
645
|
class="cw-dev-select"
|
|
645
646
|
value=${n||""}
|
|
646
|
-
onChange=${m=>
|
|
647
|
-
disabled=${
|
|
647
|
+
onChange=${m=>d(m.target.value)}
|
|
648
|
+
disabled=${c}
|
|
648
649
|
>
|
|
649
650
|
${t.map(m=>z`
|
|
650
651
|
<option key=${m.slug} value=${m.slug}>
|
|
651
|
-
${m.name}${
|
|
652
|
+
${m.name}${w?.entry_agent?.slug===m.slug?" \u2605":""}
|
|
652
653
|
</option>
|
|
653
654
|
`)}
|
|
654
655
|
</select>
|
|
655
656
|
`:z`
|
|
656
|
-
<span class="cw-dev-badge">${
|
|
657
|
+
<span class="cw-dev-badge">${p?.name||t[0]?.name||"\u2014"}${w?.entry_agent?.slug===(p?.slug||t[0]?.slug)?" \u2605":""}</span>
|
|
657
658
|
`}
|
|
658
659
|
</div>
|
|
659
660
|
|
|
660
661
|
<!-- Agent Version -->
|
|
661
662
|
<div class="cw-dev-select-group">
|
|
662
663
|
<label class="cw-dev-label">Agent Ver</label>
|
|
663
|
-
${
|
|
664
|
+
${T?z`
|
|
664
665
|
<select
|
|
665
666
|
class="cw-dev-select"
|
|
666
|
-
value=${
|
|
667
|
-
onChange=${m=>
|
|
668
|
-
disabled=${
|
|
667
|
+
value=${l||""}
|
|
668
|
+
onChange=${m=>b(m.target.value||null)}
|
|
669
|
+
disabled=${c}
|
|
669
670
|
>
|
|
670
|
-
${
|
|
671
|
+
${o.map(m=>z`
|
|
671
672
|
<option key=${m.version} value=${m.version}>
|
|
672
673
|
${m.version}${m.is_active?" \u2713":""}${m.is_draft?" (draft)":""}
|
|
673
674
|
</option>
|
|
674
675
|
`)}
|
|
675
676
|
</select>
|
|
676
677
|
`:z`
|
|
677
|
-
<span class="cw-dev-badge">${
|
|
678
|
+
<span class="cw-dev-badge">${o.length===1?o[0].version:p?.active_version||"\u2014"}</span>
|
|
678
679
|
`}
|
|
679
680
|
</div>
|
|
680
681
|
</div>
|
|
681
682
|
</div>
|
|
682
|
-
`}import{useState as ae,useCallback as se,useRef as at,useEffect as ot}from"preact/hooks";function rt(e,t,s){let[n,o]=ae([]),[r,y]=ae(!1),[i,$]=ae(null),[g,u]=ae(()=>s?.get(e.conversationIdKey)||null),[b,c]=ae(!1),[C,l]=ae(!1),[f,w]=ae(0),v=at(null),_=at(null);ot(()=>{g&&s?.set(e.conversationIdKey,g)},[g,e.conversationIdKey,s]);let m=se(async(h,I,p)=>{v.current&&v.current.close();let S=e.apiPaths.runEvents.replace("{runId}",h),k=`${e.backendUrl}${S}`;I&&(k+=`?anonymous_token=${encodeURIComponent(I)}`);let T=new EventSource(k);v.current=T;let d="";T.addEventListener("assistant.message",D=>{try{let a=JSON.parse(D.data);e.onEvent&&e.onEvent("assistant.message",a.payload);let M=a.payload.content;M&&(d+=M,o(N=>{let J=N[N.length-1];return J?.role==="assistant"&&J.id.startsWith("assistant-stream-")?[...N.slice(0,-1),{...J,content:d}]:[...N,{id:"assistant-stream-"+Date.now(),role:"assistant",content:d,timestamp:new Date,type:"message"}]}))}catch(a){console.error("[ChatWidget] Parse error:",a)}}),T.addEventListener("tool.call",D=>{try{let a=JSON.parse(D.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)}}),T.addEventListener("tool.result",D=>{try{let a=JSON.parse(D.data);e.onEvent&&e.onEvent("tool.result",a.payload);let M=a.payload.result,N=M?.error;o(J=>[...J,{id:"tool-result-"+Date.now(),role:"system",content:N?`\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)}}),T.addEventListener("custom",D=>{try{let a=JSON.parse(D.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)}}),T.addEventListener("sub_agent.start",D=>{try{let a=JSON.parse(D.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)}}),T.addEventListener("sub_agent.end",D=>{try{let a=JSON.parse(D.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)}}),T.addEventListener("content.blocks",D=>{try{let a=JSON.parse(D.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 R=D=>{try{let a=JSON.parse(D.data);if(e.onEvent&&e.onEvent(a.type,a.payload),a.type==="run.failed"){let M=a.payload.error||"Agent run failed";$(M),o(N=>[...N,{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),T.close(),v.current=null,d&&p&&p(d)};T.addEventListener("run.succeeded",R),T.addEventListener("run.failed",R),T.addEventListener("run.cancelled",R),T.addEventListener("run.timed_out",R),T.onerror=()=>{y(!1),T.close(),v.current=null}},[e]),H=se(async(h,I={},p={})=>{if(!h.trim()||r)return;let S=[],k={};typeof I=="function"?k={onAssistantMessage:I}:Array.isArray(I)?(S=I,k=p):k=I||{};let{model:T,thinking:d,onAssistantMessage:R,supersedeFromMessageIndex:D}=k;y(!0),$(null);let a={id:$e(),role:"user",content:h.trim(),timestamp:new Date,type:"message",files:S.length>0?S.map(M=>({name:M.name,size:M.size,type:M.type})):void 0};o(M=>[...M,a]);try{let M=await t.getOrCreateSession(),N;if(S.length>0){let V=e.apiCaseStyle!=="camel",Fe=me=>V?Me(me):me,ee=new FormData;ee.append(Fe("agentKey"),e.agentKey),g&&ee.append(Fe("conversationId"),g),ee.append("messages",JSON.stringify([{role:"user",content:h.trim()}])),ee.append("metadata",JSON.stringify(V?{...e.metadata,journey_type:e.defaultJourneyType}:{...e.metadata,journeyType:e.defaultJourneyType})),T&&ee.append("model",T),d&&ee.append("thinking","true"),S.forEach(me=>{ee.append("files",me)}),N=t.getFetchOptions({method:"POST",body:ee},M)}else{let V=t.transformRequest({agentKey:e.agentKey,conversationId:g,messages:[{role:"user",content:h.trim()}],metadata:{...e.metadata,journeyType:e.defaultJourneyType},...T&&{model:T},...d&&{thinking:!0},...D!==void 0&&{supersedeFromMessageIndex:D}});N=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(V)},M)}let J=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,N),E=M;if(J.status===401){t.clearSession();let V=await t.getOrCreateSession(!0);V&&(E=V,S.length>0?N=t.getFetchOptions({method:"POST",body:N.body},V):N=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:N.body},V),J=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,N))}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);_.current=X.id,!g&&X.conversationId&&u(X.conversationId),await m(X.id,E,R)}catch(M){$(M.message||"Failed to send message"),y(!1)}finally{_.current=null}},[e,t,g,r,m]),U=se(async()=>{let h=_.current;if(!(!h||!r))try{let I=e.apiPaths.cancelRun?e.apiPaths.cancelRun.replace("{runId}",h):`${e.apiPaths.runs}${h}/cancel/`;(await fetch(`${e.backendUrl}${I}`,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"}}))).ok&&(v.current&&(v.current.close(),v.current=null),y(!1),_.current=null,o(S=>[...S,{id:"cancelled-"+Date.now(),role:"system",content:"\u23F9 Run cancelled",timestamp:new Date,type:"cancelled"}]))}catch(I){console.error("[ChatWidget] Failed to cancel run:",I)}},[e,t,r]),A=se(()=>{o([]),u(null),$(null),c(!1),w(0),s?.set(e.conversationIdKey,null)},[e.conversationIdKey,s]),O=h=>{let I={id:$e(),role:h.role,timestamp:h.timestamp?new Date(h.timestamp):new Date};if(h.role==="tool")return{...I,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:$e(),role:"assistant",content:`\u{1F527} ${S.function?.name||S.name||"tool"}`,timestamp:I.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:{...I,content:p,type:"message"}},F=se(async h=>{console.log("[ChatWidget] loadConversation called with:",h),y(!0),o([]),u(h);try{let I=await t.getOrCreateSession(),S=`${e.backendUrl}${e.apiPaths.conversations}${h}/?limit=10&offset=0`;console.log("[ChatWidget] Fetching conversation from:",S);let k=await fetch(S,t.getFetchOptions({method:"GET"},I));if(console.log("[ChatWidget] Response status:",k.status),k.ok){let T=await k.json();console.log("[ChatWidget] Raw conversation:",T);let d=t.transformResponse(T);if(console.log("[ChatWidget] Transformed conversation:",d),d.messages){let R=d.messages.flatMap(O).filter(Boolean);console.log("[ChatWidget] Mapped messages:",R),o(R)}c(d.hasMore||!1),w(d.messages?.length||0)}else k.status===404?(console.log("[ChatWidget] Conversation not found, clearing"),u(null),s?.set(e.conversationIdKey,null)):console.error("[ChatWidget] Unexpected response status:",k.status)}catch(I){console.error("[ChatWidget] Failed to load conversation:",I)}finally{y(!1)}},[e,t,s]),L=se(async()=>{if(!(!g||C||!b)){l(!0);try{let h=await t.getOrCreateSession(),p=`${e.backendUrl}${e.apiPaths.conversations}${g}/?limit=10&offset=${f}`,S=await fetch(p,t.getFetchOptions({method:"GET"},h));if(S.ok){let k=await S.json(),T=t.transformResponse(k);if(T.messages?.length>0){let d=T.messages.flatMap(O).filter(Boolean);o(R=>[...d,...R]),w(R=>R+T.messages.length),c(T.hasMore||!1)}else c(!1)}}catch(h){console.error("[ChatWidget] Failed to load more messages:",h)}finally{l(!1)}}},[e,t,g,f,C,b]),j=se(async(h,I,p={})=>{if(r)return;let S=n[h];if(!S||S.role!=="user")return;let k=n.slice(0,h);o(k),await H(I,{...p,supersedeFromMessageIndex:h})},[n,r,H]),W=se(async(h,I={})=>{if(r)return;let p=n[h];if(!p)return;let S=h,k=p;if(p.role==="assistant"){for(let d=h-1;d>=0;d--)if(n[d].role==="user"){S=d,k=n[d];break}if(k.role!=="user")return}else if(p.role!=="user")return;let T=n.slice(0,S);o(T),await H(k.content,{...I,supersedeFromMessageIndex:S})},[n,r,H]);return ot(()=>()=>{v.current&&v.current.close()},[]),{messages:n,isLoading:r,error:i,conversationId:g,hasMoreMessages:b,loadingMoreMessages:C,sendMessage:H,cancelRun:U,clearMessages:A,loadConversation:F,loadMoreMessages:L,setConversationId:u,editMessage:j,retryMessage:W}}import{useState as ue,useEffect as Ht,useCallback as Se}from"preact/hooks";var lt="cw_thinking_enabled";function it(e,t,s){let[n,o]=ue([]),[r,y]=ue(null),[i,$]=ue(null),[g,u]=ue(!1),[b,c]=ue(!1);Ht(()=>{(async()=>{if(e.showModelSelector){u(!0);try{let _=await fetch(`${e.backendUrl}${e.apiPaths.models}`,t.getFetchOptions({method:"GET"}));if(_.ok){let m=await _.json(),H=m.models||[];o(H),$(m.default);let U=s?.get(e.modelKey);U&&H.some(O=>O.id===U)?y(U):y(m.default),s?.get(lt)==="true"&&c(!0)}}catch(_){console.warn("[ChatWidget] Failed to load models:",_)}finally{u(!1)}}})()},[e.backendUrl,e.apiPaths.models,e.showModelSelector,e.modelKey,t,s]);let C=Se(v=>{y(v),s?.set(e.modelKey,v)},[e.modelKey,s]),l=Se(v=>{c(v),s?.set(lt,v?"true":"false")},[s]),f=Se(()=>n.find(v=>v.id===r)||null,[n,r]),w=Se(()=>f()?.supports_thinking||!1,[f]);return{availableModels:n,selectedModel:r,defaultModel:i,isLoading:g,selectModel:C,getSelectedModelInfo:f,thinkingEnabled:b,toggleThinking:l,supportsThinking:w}}import{useState as xe,useCallback as le}from"preact/hooks";function ct(e,t){let[s,n]=xe(null),[o,r]=xe(!1),[y,i]=xe(null),$=e.apiPaths?.tasks||"/api/agent/tasks/",g=le(async()=>{r(!0),i(null);try{let f=`${e.backendUrl}${$}`,w=await fetch(f,t.getFetchOptions({method:"GET"}));if(w.ok){let v=await w.json();n(v)}else{let v=await w.json().catch(()=>({}));i(v.error||"Failed to load tasks")}}catch(f){console.error("[useTasks] Failed to load task list:",f),i("Failed to load tasks")}finally{r(!1)}},[e.backendUrl,$,t]),u=le(async f=>{if(!s)return null;try{let w=`${e.backendUrl}${$}${s.id}/add_task/`,v=await fetch(w,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(f)}));if(v.ok){let _=await v.json();return await g(),_}else{let _=await v.json().catch(()=>({}));return i(_.error||"Failed to add task"),null}}catch(w){return console.error("[useTasks] Failed to add task:",w),i("Failed to add task"),null}},[e.backendUrl,$,s,t,g]),b=le(async(f,w)=>{if(!s)return null;try{let v=`${e.backendUrl}${$}${s.id}/update_task/${f}/`,_=await fetch(v,t.getFetchOptions({method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(w)}));if(_.ok){let m=await _.json();return await g(),m}else{let m=await _.json().catch(()=>({}));return i(m.error||"Failed to update task"),null}}catch(v){return console.error("[useTasks] Failed to update task:",v),i("Failed to update task"),null}},[e.backendUrl,$,s,t,g]),c=le(async f=>{if(!s)return!1;try{let w=`${e.backendUrl}${$}${s.id}/remove_task/${f}/`,v=await fetch(w,t.getFetchOptions({method:"DELETE"}));if(v.ok)return await g(),!0;{let _=await v.json().catch(()=>({}));return i(_.error||"Failed to remove task"),!1}}catch(w){return console.error("[useTasks] Failed to remove task:",w),i("Failed to remove task"),!1}},[e.backendUrl,$,s,t,g]),C=le(async()=>{if(!s)return!1;try{let f=`${e.backendUrl}${$}${s.id}/clear/`,w=await fetch(f,t.getFetchOptions({method:"POST"}));if(w.ok)return await g(),!0;{let v=await w.json().catch(()=>({}));return i(v.error||"Failed to clear tasks"),!1}}catch(f){return console.error("[useTasks] Failed to clear tasks:",f),i("Failed to clear tasks"),!1}},[e.backendUrl,$,s,t,g]),l=le(()=>i(null),[]);return{taskList:s,tasks:s?.tasks||[],progress:s?.progress||{total:0,completed:0,percent_complete:0},isLoading:o,error:y,loadTaskList:g,addTask:u,updateTask:b,removeTask:c,clearTasks:C,clearError:l}}import{useState as oe,useEffect as dt,useCallback as pe}from"preact/hooks";var ut="cw_selected_system",Ae="cw_selected_agent",pt="cw_selected_system_version",Te="cw_selected_agent_version";function ht(e,t,s){let[n,o]=oe([]),[r,y]=oe([]),[i,$]=oe(null),[g,u]=oe(null),[b,c]=oe(null),[C,l]=oe(null),[f,w]=oe(!1),v=pe(()=>{if(g)return g;if(i){let A=n.find(O=>O.slug===i);if(A?.entry_agent)return A.entry_agent.slug}return e.agentKey},[g,i,n,e.agentKey]);dt(()=>{if(!e.showDevTools)return;(async()=>{w(!0);try{let O=await fetch(`${e.backendUrl}${e.apiPaths.systems}`,t.getFetchOptions({method:"GET"}));if(O.ok){let F=await O.json(),L=F.results||F;o(L);let j=s?.get(ut);j&&L.some(W=>W.slug===j)?$(j):L.length===1&&$(L[0].slug)}}catch(O){console.warn("[ChatWidget] Failed to load systems:",O)}finally{w(!1)}})()},[e.backendUrl,e.apiPaths.systems,e.showDevTools,t,s]),dt(()=>{if(!e.showDevTools)return;(async()=>{try{let O=i?`?system=${encodeURIComponent(i)}`:"",F=await fetch(`${e.backendUrl}${e.apiPaths.agents}${O}`,t.getFetchOptions({method:"GET"}));if(F.ok){let L=await F.json(),j=L.results||L;y(j);let W=s?.get(Ae);if(W&&j.some(I=>I.slug===W))u(W);else if(i){let I=n.find(p=>p.slug===i);I?.entry_agent&&u(I.entry_agent.slug)}let h=s?.get(Te);h&&l(h)}}catch(O){console.warn("[ChatWidget] Failed to load agents:",O)}})()},[e.backendUrl,e.apiPaths.agents,e.showDevTools,i,t,s,n]);let _=pe(A=>{$(A),s?.set(ut,A),u(null),l(null),s?.set(Ae,null),s?.set(Te,null);let F=n.find(L=>L.slug===A)?.active_version||null;c(F),s?.set(pt,F)},[s,n]),m=pe(A=>{u(A),s?.set(Ae,A);let F=r.find(L=>L.slug===A)?.active_version||null;l(F),s?.set(Te,F)},[s,r]),H=pe(A=>{c(A),s?.set(pt,A)},[s]),U=pe(A=>{l(A),s?.set(Te,A)},[s]);return{systems:n,agents:r,selectedSystem:i,selectedAgent:g,selectedSystemVersion:b,selectedAgentVersion:C,isLoading:f,selectSystem:_,selectAgent:m,selectSystemVersion:H,selectAgentVersion:U,getEffectiveAgentKey:v}}function mt(e,t,s){let n=u=>!u||typeof u!="object"||e.apiCaseStyle==="camel"?u:fe(u),o=u=>!u||typeof u!="object"||e.apiCaseStyle==="snake"?u:ge(u),r=()=>e.authStrategy?e.authStrategy:e.authToken?"token":e.apiPaths.anonymousSession||e.anonymousSessionEndpoint?"anonymous":"none",y=(u=null)=>{let b=r(),c={},C=u||e.authToken||t().authToken;if(b==="token"&&C){let l=e.authHeader||"Authorization",f=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Token";c[l]=f?`${f} ${C}`:C}else if(b==="jwt"&&C){let l=e.authHeader||"Authorization",f=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Bearer";c[l]=f?`${f} ${C}`:C}else if(b==="anonymous"&&C){let l=e.authHeader||e.anonymousTokenHeader||"X-Anonymous-Token";c[l]=C}if(b==="session"){let l=Be(e.csrfCookieName);l&&(c["X-CSRFToken"]=l)}return c};return{getAuthStrategy:r,getAuthHeaders:y,getFetchOptions:(u={},b=null)=>{let c=r(),C={...u},l=y(b);return console.log("[ChatWidget] getFetchOptions - strategy:",c,"overrideToken:",b,"authHeaders:",l),C.headers={...C.headers,...l},c==="session"&&(C.credentials="include"),C},getOrCreateSession:async(u=!1)=>{let b=r(),c=t(),C=e.anonymousTokenKey||e.sessionTokenKey;if(b!=="anonymous")return e.authToken||c.authToken;if(!u){if(c.authToken)return c.authToken;let l=c.storage?.get(C);if(l)return s(f=>({...f,authToken:l})),l}try{let l=e.anonymousSessionEndpoint||e.apiPaths.anonymousSession,f=await fetch(`${e.backendUrl}${l}`,{method:"POST",headers:{"Content-Type":"application/json"}});if(f.ok){let w=await f.json();return s(v=>({...v,authToken:w.token})),c.storage?.set(C,w.token),w.token}}catch(l){console.warn("[ChatWidget] Failed to create session:",l)}return null},clearSession:()=>{let u=e.anonymousTokenKey||e.sessionTokenKey,b=t();s(c=>({...c,authToken:null})),b.storage?.set(u,null)},transformRequest:n,transformResponse:o}}function gt({config:e,onStateChange:t,markdownParser:s,apiRef:n}){console.log("[ChatWidget] Config:",{showConversationSidebar:e.showConversationSidebar,apiPaths:e.apiPaths});let[o,r]=Y(e.embedded||e.forceOpen===!0),[y,i]=Y(!1),[$,g]=Y(!1),[u,b]=Y(!1),[c,C]=Y([]),[l,f]=Y("chat"),[w,v]=Y(!1),[_,m]=Y(e.enableTTS),[H,U]=Y(!1),[A,O]=Y(null);he(()=>{e.forceOpen!==void 0&&r(e.forceOpen)},[e.forceOpen]);let F=Re(()=>Ne(e.containerId),[e.containerId]),[L,j]=Y(e.authToken||null),W=Re(()=>mt(e,()=>({authToken:L,storage:F}),X=>{let V=X({authToken:L,storage:F});V.authToken!==L&&j(V.authToken)}),[e,L,F]),h=ht(e,W,F),I=Re(()=>{if(!e.showDevTools)return e;let E=h.getEffectiveAgentKey();return E&&E!==e.agentKey?{...e,agentKey:E}:e},[e,h.getEffectiveAgentKey]),p=rt(I,W,F),S=it(e,W,F),k=ct(e,W);he(()=>{for(let E=p.messages.length-1;E>=0;E--){let q=p.messages[E];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}}},[p.messages]),he(()=>{let E=F.get(e.conversationIdKey);console.log("[ChatWidget] Initial load - storedConvId:",E,"key:",e.conversationIdKey),console.log("[ChatWidget] apiPaths.conversations:",e.apiPaths.conversations),E&&(console.log("[ChatWidget] Loading conversation:",E),p.loadConversation(E))},[]),he(()=>{t&&t({isOpen:o,isExpanded:y,debugMode:$,messages:p.messages,conversationId:p.conversationId,isLoading:p.isLoading,error:p.error})},[o,y,$,p.messages,p.conversationId,p.isLoading,p.error]);let T=ie(async()=>{if(e.showConversationSidebar){v(!0);try{let E=I.agentKey,q=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(E)}`,X=await fetch(q,W.getFetchOptions({method:"GET"}));if(X.ok){let V=await X.json();C(V.results||V)}}catch(E){console.error("[ChatWidget] Failed to load conversations:",E),C([])}finally{v(!1)}}},[e,I,W]),d=ie(()=>{let E=!u;b(E),E&&T()},[u,T]),R=ie(E=>{E!==p.conversationId&&p.loadConversation(E),b(!1)},[p]),D=ie(()=>{p.clearMessages(),b(!1)},[p]),a=ie(E=>{p.sendMessage(E,{model:S.selectedModel,thinking:S.thinkingEnabled&&S.supportsThinking(),onAssistantMessage:q=>{}})},[p,_,S.selectedModel,S.thinkingEnabled,S.supportsThinking]),M=ie(E=>{f(E),E==="tasks"&&k.loadTaskList()},[k]);if(he(()=>{n&&(n.current={open:()=>r(!0),close:()=>r(!1),send:E=>a(E),clearMessages:()=>p.clearMessages(),toggleTTS:()=>m(E=>!E),stopSpeech:()=>U(!1),setAuth:E=>{E.token!==void 0&&j(E.token)},clearAuth:()=>j(null)})},[p,n,a]),!e.embedded&&!o)return G`
|
|
683
|
+
`}import{useState as ae,useCallback as se,useRef as at,useEffect as ot}from"preact/hooks";function rt(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=at(null),T=at(null);ot(()=>{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",O=>{try{let a=JSON.parse(O.data);e.onEvent&&e.onEvent("assistant.message",a.payload);let M=a.payload.content;M&&(i+=M,r(B=>{let J=B[B.length-1];return J?.role==="assistant"&&J.id.startsWith("assistant-stream-")?[...B.slice(0,-1),{...J,content:i}]:[...B,{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),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",O=>{try{let a=JSON.parse(O.data);e.onEvent&&e.onEvent("tool.result",a.payload);let M=a.payload.result,B=M?.error;r(J=>[...J,{id:"tool-result-"+Date.now(),role:"system",content:B?`\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"&&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",O=>{try{let a=JSON.parse(O.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",O=>{try{let a=JSON.parse(O.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",O=>{try{let a=JSON.parse(O.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 x=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),r(B=>[...B,{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",x),k.addEventListener("run.failed",x),k.addEventListener("run.cancelled",x),k.addEventListener("run.timed_out",x),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:x,supersedeFromMessageIndex:O}=E;y(!0),h(null);let a={id:$e(),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(),B;if(S.length>0){let V=e.apiCaseStyle!=="camel",Fe=me=>V?Me(me):me,ee=new FormData;ee.append(Fe("agentKey"),e.agentKey),b&&ee.append(Fe("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(me=>{ee.append("files",me)}),B=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},...O!==void 0&&{supersedeFromMessageIndex:O}});B=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(V)},M)}let J=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,B),I=M;if(J.status===401){t.clearSession();let V=await t.getOrCreateSession(!0);V&&(I=V,S.length>0?B=t.getFetchOptions({method:"POST",body:B.body},V):B=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:B.body},V),J=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,B))}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,I,x)}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]),F=g=>{let _={id:$e(),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:$e(),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 x=i.messages.flatMap(F).filter(Boolean);console.log("[ChatWidget] Mapped messages:",x),r(x)}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(F).filter(Boolean);r(x=>[...i,...x]),$(x=>x+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]),W=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 ot(()=>()=>{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:W}}import{useState as ue,useEffect as Ht,useCallback as Se}from"preact/hooks";var lt="cw_thinking_enabled";function it(e,t,s){let[n,r]=ue([]),[l,y]=ue(null),[d,h]=ue(null),[b,c]=ue(!1),[w,p]=ue(!1);Ht(()=>{(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(F=>F.id===j)?y(j):y(m.default),s?.get(lt)==="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=Se(u=>{y(u),s?.set(e.modelKey,u)},[e.modelKey,s]),o=Se(u=>{p(u),s?.set(lt,u?"true":"false")},[s]),C=Se(()=>n.find(u=>u.id===l)||null,[n,l]),$=Se(()=>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 xe,useCallback as le}from"preact/hooks";function ct(e,t){let[s,n]=xe(null),[r,l]=xe(!1),[y,d]=xe(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 dt,useCallback as pe}from"preact/hooks";var ut="cw_selected_system",Ae="cw_selected_agent",pt="cw_selected_system_version",Te="cw_selected_agent_version";function ht(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=pe(()=>{if(b)return b;if(d){let R=n.find(F=>F.slug===d);if(R?.entry_agent)return R.entry_agent.slug}return e.agentKey},[b,d,n,e.agentKey]);dt(()=>{if(!e.showDevTools)return;(async()=>{$(!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;r(L);let U=s?.get(ut);U&&L.some(W=>W.slug===U)?h(U):L.length===1&&h(L[0].slug)}}catch(F){console.warn("[ChatWidget] Failed to load systems:",F)}finally{$(!1)}})()},[e.backendUrl,e.apiPaths.systems,e.showDevTools,t,s]),dt(()=>{if(!e.showDevTools)return;(async()=>{try{let F=d?`?system=${encodeURIComponent(d)}`:"",D=await fetch(`${e.backendUrl}${e.apiPaths.agents}${F}`,t.getFetchOptions({method:"GET"}));if(D.ok){let L=await D.json(),U=L.results||L;y(U);let W=s?.get(Ae);if(W&&U.some(_=>_.slug===W))c(W);else if(d){let _=n.find(f=>f.slug===d);_?.entry_agent&&c(_.entry_agent.slug)}let g=s?.get(Te);g&&o(g)}}catch(F){console.warn("[ChatWidget] Failed to load agents:",F)}})()},[e.backendUrl,e.apiPaths.agents,e.showDevTools,d,t,s,n]);let T=pe(R=>{h(R),s?.set(ut,R),c(null),o(null),s?.set(Ae,null),s?.set(Te,null);let D=n.find(L=>L.slug===R)?.active_version||null;p(D),s?.set(pt,D)},[s,n]),m=pe(R=>{c(R),s?.set(Ae,R);let D=l.find(L=>L.slug===R)?.active_version||null;o(D),s?.set(Te,D)},[s,l]),K=pe(R=>{p(R),s?.set(pt,R)},[s]),j=pe(R=>{o(R),s?.set(Te,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 mt(e,t,s){let n=c=>!c||typeof c!="object"||e.apiCaseStyle==="camel"?c:fe(c),r=c=>!c||typeof c!="object"||e.apiCaseStyle==="snake"?c:ge(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=Be(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 gt({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,F]=Y(null);he(()=>{e.forceOpen!==void 0&&l(e.forceOpen)},[e.forceOpen]);let D=Re(()=>Ne(e.containerId),[e.containerId]),[L,U]=Y(e.authToken||null),W=Re(()=>mt(e,()=>({authToken:L,storage:D}),X=>{let V=X({authToken:L,storage:D});V.authToken!==L&&U(V.authToken)}),[e,L,D]),g=ht(e,W,D),_=Re(()=>{if(!e.showDevTools)return e;let I=g.getEffectiveAgentKey();return I&&I!==e.agentKey?{...e,agentKey:I}:e},[e,g.getEffectiveAgentKey]),f=rt(_,W,D),S=it(e,W,D),E=ct(e,W);he(()=>{for(let I=f.messages.length-1;I>=0;I--){let q=f.messages[I];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}}},[f.messages]),he(()=>{let I=D.get(e.conversationIdKey);console.log("[ChatWidget] Initial load - storedConvId:",I,"key:",e.conversationIdKey),console.log("[ChatWidget] apiPaths.conversations:",e.apiPaths.conversations),I&&(console.log("[ChatWidget] Loading conversation:",I),f.loadConversation(I))},[]),he(()=>{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 I=_.agentKey,q=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(I)}`,X=await fetch(q,W.getFetchOptions({method:"GET"}));if(X.ok){let V=await X.json();v(V.results||V)}}catch(I){console.error("[ChatWidget] Failed to load conversations:",I),v([])}finally{u(!1)}}},[e,_,W]),i=ie(()=>{let I=!c;w(I),I&&k()},[c,k]),x=ie(I=>{I!==f.conversationId&&f.loadConversation(I),w(!1)},[f]),O=ie(()=>{f.clearMessages(),w(!1)},[f]),a=ie(I=>{f.sendMessage(I,{model:S.selectedModel,thinking:S.thinkingEnabled&&S.supportsThinking(),onAssistantMessage:q=>{}})},[f,T,S.selectedModel,S.thinkingEnabled,S.supportsThinking]),M=ie(I=>{C(I),I==="tasks"&&E.loadTaskList()},[E]);if(he(()=>{n&&(n.current={open:()=>l(!0),close:()=>l(!1),send:I=>a(I),clearMessages:()=>f.clearMessages(),toggleTTS:()=>m(I=>!I),stopSpeech:()=>j(!1),setAuth:I=>{I.token!==void 0&&U(I.token)},clearAuth:()=>U(null)})},[f,n,a]),!e.embedded&&!r)return G`
|
|
683
684
|
<button
|
|
684
685
|
class="cw-fab"
|
|
685
686
|
style=${{backgroundColor:e.primaryColor}}
|
|
686
|
-
onClick=${()=>
|
|
687
|
+
onClick=${()=>l(!0)}
|
|
687
688
|
>
|
|
688
689
|
<svg class="cw-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
689
690
|
<path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
|
|
690
691
|
</svg>
|
|
691
692
|
</button>
|
|
692
|
-
`;let
|
|
693
|
-
<div class=${
|
|
693
|
+
`;let B=["cw-widget",y&&"cw-widget-expanded",e.embedded&&"cw-widget-embedded"].filter(Boolean).join(" "),J=e.headerTextColor||He(e.primaryColor);return G`
|
|
694
|
+
<div class=${B} style=${{"--cw-primary":e.primaryColor,"--cw-header-text":J}}>
|
|
694
695
|
${e.showConversationSidebar&&G`
|
|
695
696
|
<${Qe}
|
|
696
|
-
isOpen=${
|
|
697
|
-
conversations=${
|
|
698
|
-
conversationsLoading=${
|
|
699
|
-
currentConversationId=${
|
|
700
|
-
onClose=${()=>
|
|
701
|
-
onNewConversation=${
|
|
702
|
-
onSwitchConversation=${
|
|
697
|
+
isOpen=${c}
|
|
698
|
+
conversations=${p}
|
|
699
|
+
conversationsLoading=${$}
|
|
700
|
+
currentConversationId=${f.conversationId}
|
|
701
|
+
onClose=${()=>w(!1)}
|
|
702
|
+
onNewConversation=${O}
|
|
703
|
+
onSwitchConversation=${x}
|
|
703
704
|
/>
|
|
704
705
|
`}
|
|
705
706
|
|
|
706
707
|
${e.showHeader!==!1&&G`
|
|
707
708
|
<${We}
|
|
708
709
|
config=${e}
|
|
709
|
-
debugMode=${
|
|
710
|
+
debugMode=${h}
|
|
710
711
|
isExpanded=${y}
|
|
711
|
-
isSpeaking=${
|
|
712
|
-
messagesCount=${
|
|
713
|
-
isLoading=${
|
|
714
|
-
currentAgent=${
|
|
715
|
-
onClose=${()=>
|
|
716
|
-
onToggleExpand=${()=>
|
|
717
|
-
onToggleDebug=${()=>
|
|
718
|
-
onToggleTTS=${()=>m(!
|
|
719
|
-
onClear=${
|
|
720
|
-
onToggleSidebar=${
|
|
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)}
|
|
719
|
+
onToggleTTS=${()=>m(!T)}
|
|
720
|
+
onClear=${f.clearMessages}
|
|
721
|
+
onToggleSidebar=${i}
|
|
721
722
|
/>
|
|
722
723
|
`}
|
|
723
724
|
|
|
724
725
|
${e.showDevTools&&G`
|
|
725
726
|
<${nt}
|
|
726
|
-
systems=${
|
|
727
|
-
agents=${
|
|
728
|
-
selectedSystem=${
|
|
729
|
-
selectedAgent=${
|
|
730
|
-
selectedSystemVersion=${
|
|
731
|
-
selectedAgentVersion=${
|
|
732
|
-
onSelectSystem=${
|
|
733
|
-
onSelectAgent=${
|
|
734
|
-
onSelectSystemVersion=${
|
|
735
|
-
onSelectAgentVersion=${
|
|
736
|
-
disabled=${
|
|
727
|
+
systems=${g.systems}
|
|
728
|
+
agents=${g.agents}
|
|
729
|
+
selectedSystem=${g.selectedSystem}
|
|
730
|
+
selectedAgent=${g.selectedAgent}
|
|
731
|
+
selectedSystemVersion=${g.selectedSystemVersion}
|
|
732
|
+
selectedAgentVersion=${g.selectedAgentVersion}
|
|
733
|
+
onSelectSystem=${g.selectSystem}
|
|
734
|
+
onSelectAgent=${g.selectAgent}
|
|
735
|
+
onSelectSystemVersion=${g.selectSystemVersion}
|
|
736
|
+
onSelectAgentVersion=${g.selectAgentVersion}
|
|
737
|
+
disabled=${f.isLoading}
|
|
737
738
|
/>
|
|
738
739
|
`}
|
|
739
740
|
|
|
740
741
|
${e.showTasksTab!==!1&&G`
|
|
741
742
|
<div class="cw-tabs">
|
|
742
743
|
<button
|
|
743
|
-
class=${`cw-tab ${
|
|
744
|
+
class=${`cw-tab ${o==="chat"?"cw-tab-active":""}`}
|
|
744
745
|
onClick=${()=>M("chat")}
|
|
745
746
|
>
|
|
746
747
|
Chat
|
|
747
748
|
</button>
|
|
748
749
|
<button
|
|
749
|
-
class=${`cw-tab ${
|
|
750
|
+
class=${`cw-tab ${o==="tasks"?"cw-tab-active":""}`}
|
|
750
751
|
onClick=${()=>M("tasks")}
|
|
751
752
|
>
|
|
752
|
-
Tasks ${
|
|
753
|
+
Tasks ${E.progress.total>0?G`<span class="cw-tab-badge">${E.progress.completed}/${E.progress.total}</span>`:""}
|
|
753
754
|
</button>
|
|
754
755
|
</div>
|
|
755
756
|
`}
|
|
756
757
|
|
|
757
|
-
${
|
|
758
|
+
${h&&G`<div class="cw-status-bar"><span>🐛 Debug</span></div>`}
|
|
758
759
|
|
|
759
|
-
${
|
|
760
|
+
${o==="chat"?G`
|
|
760
761
|
<${Xe}
|
|
761
|
-
messages=${
|
|
762
|
-
isLoading=${
|
|
763
|
-
hasMoreMessages=${
|
|
764
|
-
loadingMoreMessages=${
|
|
765
|
-
onLoadMore=${
|
|
766
|
-
onEditMessage=${
|
|
767
|
-
onRetryMessage=${
|
|
768
|
-
|
|
762
|
+
messages=${f.messages}
|
|
763
|
+
isLoading=${f.isLoading}
|
|
764
|
+
hasMoreMessages=${f.hasMoreMessages}
|
|
765
|
+
loadingMoreMessages=${f.loadingMoreMessages}
|
|
766
|
+
onLoadMore=${f.loadMoreMessages}
|
|
767
|
+
onEditMessage=${f.editMessage}
|
|
768
|
+
onRetryMessage=${f.retryMessage}
|
|
769
|
+
onSendMessage=${a}
|
|
770
|
+
debugMode=${h}
|
|
769
771
|
markdownParser=${s}
|
|
770
772
|
emptyStateTitle=${e.emptyStateTitle}
|
|
771
773
|
emptyStateMessage=${e.emptyStateMessage}
|
|
772
774
|
/>
|
|
773
775
|
|
|
774
|
-
${
|
|
776
|
+
${f.error&&G`<div class="cw-error-bar">${f.error}</div>`}
|
|
775
777
|
|
|
776
778
|
${e.showModelSelector&&S.availableModels.length>0&&G`
|
|
777
779
|
<${et}
|
|
@@ -780,14 +782,14 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
780
782
|
onSelectModel=${S.selectModel}
|
|
781
783
|
thinkingEnabled=${S.thinkingEnabled}
|
|
782
784
|
onToggleThinking=${S.toggleThinking}
|
|
783
|
-
disabled=${
|
|
785
|
+
disabled=${f.isLoading}
|
|
784
786
|
/>
|
|
785
787
|
`}
|
|
786
788
|
|
|
787
789
|
<${Ze}
|
|
788
790
|
onSend=${a}
|
|
789
|
-
onCancel=${
|
|
790
|
-
isLoading=${
|
|
791
|
+
onCancel=${f.cancelRun}
|
|
792
|
+
isLoading=${f.isLoading}
|
|
791
793
|
placeholder=${e.placeholder}
|
|
792
794
|
primaryColor=${e.primaryColor}
|
|
793
795
|
enableVoice=${e.enableVoice}
|
|
@@ -795,14 +797,14 @@ var vt=Object.defineProperty;var kt=(e,t,s)=>t in e?vt(e,t,{enumerable:!0,config
|
|
|
795
797
|
/>
|
|
796
798
|
`:G`
|
|
797
799
|
<${st}
|
|
798
|
-
tasks=${
|
|
799
|
-
progress=${
|
|
800
|
-
isLoading=${
|
|
801
|
-
error=${
|
|
802
|
-
onUpdate=${
|
|
803
|
-
onRemove=${
|
|
804
|
-
onClear=${
|
|
805
|
-
onRefresh=${
|
|
800
|
+
tasks=${E.tasks}
|
|
801
|
+
progress=${E.progress}
|
|
802
|
+
isLoading=${E.isLoading}
|
|
803
|
+
error=${E.error}
|
|
804
|
+
onUpdate=${E.updateTask}
|
|
805
|
+
onRemove=${E.removeTask}
|
|
806
|
+
onClear=${E.clearTasks}
|
|
807
|
+
onRefresh=${E.loadTaskList}
|
|
806
808
|
/>
|
|
807
809
|
`}
|
|
808
810
|
</div>
|