@makemore/agent-frontend 2.9.0 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat-widget.cjs.js +51 -48
- package/dist/chat-widget.esm.js +49 -46
- package/dist/chat-widget.js +37 -34
- package/dist/react.cjs.js +27 -24
- package/dist/react.esm.js +39 -36
- package/package.json +1 -1
- package/src/components/ChatWidget.js +18 -15
- package/src/utils/config.js +3 -0
package/dist/chat-widget.cjs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Object.getOwnPropertyNames;var rt=Object.prototype.hasOwnProperty;var lt=(e,t,s)=>t in e?he(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var it=(e,t)=>{for(var s in t)he(e,s,{get:t[s],enumerable:!0})},ct=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ot(t))!rt.call(e,a)&&a!==s&&he(e,a,{get:()=>t[a],enumerable:!(n=at(t,a))||n.enumerable});return e};var dt=e=>ct(he({},"__esModule",{value:!0}),e);var Ie=(e,t,s)=>(lt(e,typeof t!="symbol"?t+"":t,s),s);var At={};it(At,{ChatWidget:()=>ke,default:()=>xt});module.exports=dt(At);var _e=require("preact"),st=require("htm/preact");var Z=require("htm/preact"),R=require("preact/hooks");var ae=require("htm/preact");function ut(e){return e.replace(/_([a-z])/g,(t,s)=>s.toUpperCase())}function be(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}function me(e){return Array.isArray(e)?e.map(me):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[ut(t),me(s)])):e}function ge(e){return Array.isArray(e)?e.map(ge):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[be(t),ge(s)])):e}function fe(){return"msg-"+Date.now()+"-"+Math.random().toString(36).substr(2,9)}function U(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function xe(e){if(!e)return"";try{let t=new Date(e),n=new Date-t,a=Math.floor(n/6e4),l=Math.floor(n/36e5),$=Math.floor(n/864e5);return a<1?"Just now":a<60?`${a}m ago`:l<24?`${l}h ago`:$<7?`${$}d ago`:t.toLocaleDateString()}catch{return""}}function Ae(e,t=null){if(t)return t(e);let s=U(e);return s=s.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),s=s.replace(/__(.+?)__/g,"<strong>$1</strong>"),s=s.replace(/\*(.+?)\*/g,"<em>$1</em>"),s=s.replace(/_(.+?)_/g,"<em>$1</em>"),s=s.replace(/`(.+?)`/g,"<code>$1</code>"),s=s.replace(/\[(.+?)\]\((.+?)\)/g,'<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>'),s=s.replace(/\n/g,"<br>"),s}function Re(e=""){let t=s=>e?`${s}_${e}`:s;return{get(s){try{return localStorage.getItem(t(s))}catch{return null}},set(s,n){try{let a=t(s);n===null?localStorage.removeItem(a):localStorage.setItem(a,n)}catch{}}}}function De(e="csrftoken"){let t=document.cookie.split(";");for(let n of t){let[a,l]=n.trim().split("=");if(a===e)return decodeURIComponent(l)}let s=document.querySelector('meta[name="csrf-token"]');return s?s.getAttribute("content"):null}function $e(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 ye(e){return e?e.startsWith("image/")?"\u{1F5BC}\uFE0F":e.startsWith("video/")?"\u{1F3AC}":e.startsWith("audio/")?"\u{1F3B5}":e.includes("pdf")?"\u{1F4D5}":e.includes("spreadsheet")||e.includes("excel")?"\u{1F4CA}":e.includes("document")||e.includes("word")?"\u{1F4DD}":e.includes("presentation")||e.includes("powerpoint")?"\u{1F4FD}\uFE0F":e.includes("zip")||e.includes("compressed")?"\u{1F5DC}\uFE0F":(e.includes("text/"),"\u{1F4C4}"):"\u{1F4C4}"}function pt(e){if(!e||typeof e!="string")return 0;let t=e.replace("#","");if(t.length!==6&&t.length!==3)return 0;let s=t.length===3?t.split("").map(i=>i+i).join(""):t,n=parseInt(s.substr(0,2),16)/255,a=parseInt(s.substr(2,2),16)/255,l=parseInt(s.substr(4,2),16)/255,$=i=>i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4);return .2126*$(n)+.7152*$(a)+.0722*$(l)}function
|
|
1
|
+
var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Object.getOwnPropertyNames;var rt=Object.prototype.hasOwnProperty;var lt=(e,t,s)=>t in e?he(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var it=(e,t)=>{for(var s in t)he(e,s,{get:t[s],enumerable:!0})},ct=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ot(t))!rt.call(e,a)&&a!==s&&he(e,a,{get:()=>t[a],enumerable:!(n=at(t,a))||n.enumerable});return e};var dt=e=>ct(he({},"__esModule",{value:!0}),e);var Ie=(e,t,s)=>(lt(e,typeof t!="symbol"?t+"":t,s),s);var At={};it(At,{ChatWidget:()=>ke,default:()=>xt});module.exports=dt(At);var _e=require("preact"),st=require("htm/preact");var Z=require("htm/preact"),R=require("preact/hooks");var ae=require("htm/preact");function ut(e){return e.replace(/_([a-z])/g,(t,s)=>s.toUpperCase())}function be(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}function me(e){return Array.isArray(e)?e.map(me):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[ut(t),me(s)])):e}function ge(e){return Array.isArray(e)?e.map(ge):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,s])=>[be(t),ge(s)])):e}function fe(){return"msg-"+Date.now()+"-"+Math.random().toString(36).substr(2,9)}function U(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function xe(e){if(!e)return"";try{let t=new Date(e),n=new Date-t,a=Math.floor(n/6e4),l=Math.floor(n/36e5),$=Math.floor(n/864e5);return a<1?"Just now":a<60?`${a}m ago`:l<24?`${l}h ago`:$<7?`${$}d ago`:t.toLocaleDateString()}catch{return""}}function Ae(e,t=null){if(t)return t(e);let s=U(e);return s=s.replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>"),s=s.replace(/__(.+?)__/g,"<strong>$1</strong>"),s=s.replace(/\*(.+?)\*/g,"<em>$1</em>"),s=s.replace(/_(.+?)_/g,"<em>$1</em>"),s=s.replace(/`(.+?)`/g,"<code>$1</code>"),s=s.replace(/\[(.+?)\]\((.+?)\)/g,'<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>'),s=s.replace(/\n/g,"<br>"),s}function Re(e=""){let t=s=>e?`${s}_${e}`:s;return{get(s){try{return localStorage.getItem(t(s))}catch{return null}},set(s,n){try{let a=t(s);n===null?localStorage.removeItem(a):localStorage.setItem(a,n)}catch{}}}}function De(e="csrftoken"){let t=document.cookie.split(";");for(let n of t){let[a,l]=n.trim().split("=");if(a===e)return decodeURIComponent(l)}let s=document.querySelector('meta[name="csrf-token"]');return s?s.getAttribute("content"):null}function $e(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 ye(e){return e?e.startsWith("image/")?"\u{1F5BC}\uFE0F":e.startsWith("video/")?"\u{1F3AC}":e.startsWith("audio/")?"\u{1F3B5}":e.includes("pdf")?"\u{1F4D5}":e.includes("spreadsheet")||e.includes("excel")?"\u{1F4CA}":e.includes("document")||e.includes("word")?"\u{1F4DD}":e.includes("presentation")||e.includes("powerpoint")?"\u{1F4FD}\uFE0F":e.includes("zip")||e.includes("compressed")?"\u{1F5DC}\uFE0F":(e.includes("text/"),"\u{1F4C4}"):"\u{1F4C4}"}function pt(e){if(!e||typeof e!="string")return 0;let t=e.replace("#","");if(t.length!==6&&t.length!==3)return 0;let s=t.length===3?t.split("").map(i=>i+i).join(""):t,n=parseInt(s.substr(0,2),16)/255,a=parseInt(s.substr(2,2),16)/255,l=parseInt(s.substr(4,2),16)/255,$=i=>i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4);return .2126*$(n)+.7152*$(a)+.0722*$(l)}function Fe(e){return pt(e)>.179?"#000000":"#ffffff"}function Oe({config:e,debugMode:t,isExpanded:s,isSpeaking:n,messagesCount:a,isLoading:l,currentAgent:$,onClose:i,onToggleExpand:f,onToggleDebug:y,onToggleTTS:u,onClear:k,onToggleSidebar:c}){let{title:S,primaryColor:o,embedded:g,showConversationSidebar:w,showClearButton:v,showDebugButton:T,enableDebugMode:m,showTTSButton:W,showExpandButton:J,enableTTS:x,elevenLabsApiKey:D,ttsProxyUrl:F}=e,K=D||F;return ae.html`
|
|
2
2
|
<div class="cw-header" style=${{backgroundColor:o}}>
|
|
3
3
|
${w&&ae.html`
|
|
4
4
|
<button
|
|
@@ -42,7 +42,7 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
42
42
|
>🐛</button>
|
|
43
43
|
`}
|
|
44
44
|
|
|
45
|
-
${
|
|
45
|
+
${W&&K&&ae.html`
|
|
46
46
|
<button
|
|
47
47
|
class="cw-header-btn ${x?"cw-btn-active":""}"
|
|
48
48
|
onClick=${u}
|
|
@@ -67,20 +67,20 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
67
67
|
`}
|
|
68
68
|
</div>
|
|
69
69
|
</div>
|
|
70
|
-
`}var ie=require("htm/preact"),de=require("preact/hooks");var
|
|
70
|
+
`}var ie=require("htm/preact"),de=require("preact/hooks");var H=require("htm/preact"),oe=require("preact/hooks");function Se({msg:e,show:t,onToggle:s}){return t?H.html`
|
|
71
71
|
<div class="cw-debug-payload">
|
|
72
72
|
<button class="cw-debug-payload-close" onClick=${s}>×</button>
|
|
73
73
|
<pre class="cw-debug-payload-content">${JSON.stringify(e,null,2)}</pre>
|
|
74
74
|
</div>
|
|
75
|
-
`:
|
|
75
|
+
`:H.html`
|
|
76
76
|
<button
|
|
77
77
|
class="cw-debug-payload-btn"
|
|
78
78
|
onClick=${s}
|
|
79
79
|
title="Show message payload"
|
|
80
80
|
>{ }</button>
|
|
81
|
-
`}function Pe({onEdit:e,onRetry:t,isLoading:s,position:n,showEdit:a=!0}){return s?null:
|
|
81
|
+
`}function Pe({onEdit:e,onRetry:t,isLoading:s,position:n,showEdit:a=!0}){return s?null:H.html`
|
|
82
82
|
<div class="cw-message-actions cw-message-actions-${n||"left"}">
|
|
83
|
-
${a&&
|
|
83
|
+
${a&&H.html`
|
|
84
84
|
<button
|
|
85
85
|
class="cw-message-action-btn"
|
|
86
86
|
onClick=${e}
|
|
@@ -104,7 +104,7 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
104
104
|
</svg>
|
|
105
105
|
</button>
|
|
106
106
|
</div>
|
|
107
|
-
`}function ht({initialContent:e,onSave:t,onCancel:s}){let[n,a]=(0,oe.useState)(e),l=(0,oe.useRef)(null);return(0,oe.useEffect)(()=>{l.current&&(l.current.focus(),l.current.setSelectionRange(n.length,n.length),l.current.style.height="auto",l.current.style.height=l.current.scrollHeight+"px")},[]),
|
|
107
|
+
`}function ht({initialContent:e,onSave:t,onCancel:s}){let[n,a]=(0,oe.useState)(e),l=(0,oe.useRef)(null);return(0,oe.useEffect)(()=>{l.current&&(l.current.focus(),l.current.setSelectionRange(n.length,n.length),l.current.style.height="auto",l.current.style.height=l.current.scrollHeight+"px")},[]),H.html`
|
|
108
108
|
<div class="cw-inline-edit">
|
|
109
109
|
<textarea
|
|
110
110
|
ref=${l}
|
|
@@ -128,33 +128,33 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
128
128
|
>Save & Send</button>
|
|
129
129
|
</div>
|
|
130
130
|
</div>
|
|
131
|
-
`}function Ke({msg:e,debugMode:t,markdownParser:s,onEdit:n,onRetry:a,isLoading:l,messageIndex:$}){let[i,f]=(0,oe.useState)(!1),[y,u]=(0,oe.useState)(!1),[k,c]=(0,oe.useState)(!1),S=e.role==="user",o=e.role==="system",g=e.type==="tool_call",w=e.type==="tool_result",v=e.type==="error",T=e.type==="sub_agent_start",m=e.type==="sub_agent_end",
|
|
131
|
+
`}function Ke({msg:e,debugMode:t,markdownParser:s,onEdit:n,onRetry:a,isLoading:l,messageIndex:$}){let[i,f]=(0,oe.useState)(!1),[y,u]=(0,oe.useState)(!1),[k,c]=(0,oe.useState)(!1),S=e.role==="user",o=e.role==="system",g=e.type==="tool_call",w=e.type==="tool_result",v=e.type==="error",T=e.type==="sub_agent_start",m=e.type==="sub_agent_end",W=e.type==="agent_context";if(o&&!t)return null;if(T||m||W)return H.html`
|
|
132
132
|
<div class="cw-agent-context ${T?"cw-agent-delegating":""} ${m?"cw-agent-returned":""}" style="position: relative;">
|
|
133
133
|
<span class="cw-agent-context-icon">${T?"\u{1F517}":m?"\u2713":"\u{1F916}"}</span>
|
|
134
134
|
<span class="cw-agent-context-text">${e.content}</span>
|
|
135
|
-
${e.metadata?.agentName&&
|
|
135
|
+
${e.metadata?.agentName&&H.html`
|
|
136
136
|
<span class="cw-agent-context-name">${e.metadata.agentName}</span>
|
|
137
137
|
`}
|
|
138
|
-
${t&&
|
|
138
|
+
${t&&H.html`<${Se} msg=${e} show=${y} onToggle=${()=>u(!y)} />`}
|
|
139
139
|
</div>
|
|
140
|
-
`;if(g||w){let b=e.metadata?.arguments||e.metadata?.result,E=d=>{if(typeof d=="string")try{return JSON.stringify(JSON.parse(d),null,2)}catch{return d}return JSON.stringify(d,null,2)};return
|
|
140
|
+
`;if(g||w){let b=e.metadata?.arguments||e.metadata?.result,E=d=>{if(typeof d=="string")try{return JSON.stringify(JSON.parse(d),null,2)}catch{return d}return JSON.stringify(d,null,2)};return H.html`
|
|
141
141
|
<div class="cw-tool-message ${w?"cw-tool-result":"cw-tool-call"}" style="position: relative;">
|
|
142
142
|
<span class="cw-tool-label" onClick=${()=>b&&f(!i)}>
|
|
143
143
|
${e.content}
|
|
144
|
-
${b&&
|
|
144
|
+
${b&&H.html`<span class="cw-tool-expand">${i?"\u25BC":"\u25B6"}</span>`}
|
|
145
145
|
</span>
|
|
146
|
-
${i&&b&&
|
|
146
|
+
${i&&b&&H.html`
|
|
147
147
|
<pre class="cw-tool-details">${U(E(g?e.metadata.arguments:e.metadata.result))}</pre>
|
|
148
148
|
`}
|
|
149
|
-
${t&&
|
|
149
|
+
${t&&H.html`<${Se} msg=${e} show=${y} onToggle=${()=>u(!y)} />`}
|
|
150
150
|
</div>
|
|
151
|
-
`}let J=["cw-message",S&&"cw-message-user",v&&"cw-message-error"].filter(Boolean).join(" "),x=`cw-message-row ${S?"cw-message-row-user":""}`,D=e.role==="assistant"?Ae(e.content,s):U(e.content),
|
|
151
|
+
`}let J=["cw-message",S&&"cw-message-user",v&&"cw-message-error"].filter(Boolean).join(" "),x=`cw-message-row ${S?"cw-message-row-user":""}`,D=e.role==="assistant"?Ae(e.content,s):U(e.content),F=e.files&&e.files.length>0,K=()=>F?H.html`
|
|
152
152
|
<div class="cw-message-attachments">
|
|
153
|
-
${e.files.map(b=>b.type&&b.type.startsWith("image/")?
|
|
153
|
+
${e.files.map(b=>b.type&&b.type.startsWith("image/")?H.html`
|
|
154
154
|
<a class="cw-attachment-thumbnail" href=${b.url} target="_blank" title=${b.name}>
|
|
155
155
|
<img src=${b.url} alt=${b.name} />
|
|
156
156
|
</a>
|
|
157
|
-
`:
|
|
157
|
+
`:H.html`
|
|
158
158
|
<a class="cw-attachment-file" href=${b.url} target="_blank" title=${b.name}>
|
|
159
159
|
<span class="cw-attachment-icon">${ye(b.type)}</span>
|
|
160
160
|
<span class="cw-attachment-info">
|
|
@@ -164,7 +164,7 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
164
164
|
</a>
|
|
165
165
|
`)}
|
|
166
166
|
</div>
|
|
167
|
-
`:null,z=b=>{c(!1),n&&n($,b)},V=()=>{a&&a($)};if(S&&k)return
|
|
167
|
+
`:null,z=b=>{c(!1),n&&n($,b)},V=()=>{a&&a($)};if(S&&k)return H.html`
|
|
168
168
|
<div class=${x} style="position: relative;">
|
|
169
169
|
${K()}
|
|
170
170
|
<${ht}
|
|
@@ -173,10 +173,10 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
173
173
|
onCancel=${()=>c(!1)}
|
|
174
174
|
/>
|
|
175
175
|
</div>
|
|
176
|
-
`;let h=S&&n&&a,p=e.role==="assistant"&&a&&!l;return
|
|
176
|
+
`;let h=S&&n&&a,p=e.role==="assistant"&&a&&!l;return H.html`
|
|
177
177
|
<div class="${x} ${h||p?"cw-message-row-with-actions":""}">
|
|
178
178
|
${K()}
|
|
179
|
-
${h&&
|
|
179
|
+
${h&&H.html`
|
|
180
180
|
<div class="cw-user-actions-wrapper">
|
|
181
181
|
<${Pe}
|
|
182
182
|
onEdit=${()=>c(!0)}
|
|
@@ -188,10 +188,10 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
188
188
|
<div class=${J} dangerouslySetInnerHTML=${{__html:D}} />
|
|
189
189
|
</div>
|
|
190
190
|
`}
|
|
191
|
-
${!h&&
|
|
191
|
+
${!h&&H.html`
|
|
192
192
|
<div class=${J} dangerouslySetInnerHTML=${{__html:D}} />
|
|
193
193
|
`}
|
|
194
|
-
${p&&
|
|
194
|
+
${p&&H.html`
|
|
195
195
|
<${Pe}
|
|
196
196
|
onRetry=${V}
|
|
197
197
|
isLoading=${l}
|
|
@@ -199,7 +199,7 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
199
199
|
showEdit=${!1}
|
|
200
200
|
/>
|
|
201
201
|
`}
|
|
202
|
-
${t&&
|
|
202
|
+
${t&&H.html`<${Se} msg=${e} show=${y} onToggle=${()=>u(!y)} />`}
|
|
203
203
|
</div>
|
|
204
204
|
`}function Le({messages:e,isLoading:t,hasMoreMessages:s,loadingMoreMessages:n,onLoadMore:a,onEditMessage:l,onRetryMessage:$,debugMode:i,markdownParser:f,emptyStateTitle:y,emptyStateMessage:u}){let k=(0,de.useRef)(null),c=(0,de.useRef)(!0),S=g=>{let w=g.target,v=w.scrollHeight-w.scrollTop-w.clientHeight<100;if(c.current=v,w.scrollTop<50&&s&&!n){let T=w.scrollHeight;a().then(()=>{let m=w.scrollHeight;w.scrollTop=m-T+w.scrollTop})}};(0,de.useEffect)(()=>{let g=k.current;g&&c.current&&requestAnimationFrame(()=>{g.scrollTop=g.scrollHeight})},[e,t]),(0,de.useEffect)(()=>{let g=k.current;g&&e.length<=2&&(c.current=!0,requestAnimationFrame(()=>{g.scrollTop=g.scrollHeight}))},[e.length]);let o=e.length===0;return ie.html`
|
|
205
205
|
<div class="cw-messages" ref=${k} onScroll=${S}>
|
|
@@ -241,7 +241,7 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
241
241
|
</div>
|
|
242
242
|
`}
|
|
243
243
|
</div>
|
|
244
|
-
`}var te=require("htm/preact"),G=require("preact/hooks");var Ce=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function Ne({onSend:e,onCancel:t,isLoading:s,placeholder:n,primaryColor:a,enableVoice:l=!0,enableFiles:$=!0}){let[i,f]=(0,G.useState)(""),[y,u]=(0,G.useState)([]),[k,c]=(0,G.useState)(!1),[S,o]=(0,G.useState)(!1),[g]=(0,G.useState)(()=>!!Ce),w=(0,G.useRef)(null),v=(0,G.useRef)(null),T=(0,G.useRef)(null),m=(0,G.useRef)(!1);(0,G.useEffect)(()=>{!s&&w.current&&w.current.focus()},[s]),(0,G.useEffect)(()=>{w.current&&(w.current.style.height="auto",w.current.style.height=Math.min(w.current.scrollHeight,150)+"px")},[i]),(0,G.useEffect)(()=>()=>{m.current=!1,T.current&&T.current.abort()},[]);let
|
|
244
|
+
`}var te=require("htm/preact"),G=require("preact/hooks");var Ce=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function Ne({onSend:e,onCancel:t,isLoading:s,placeholder:n,primaryColor:a,enableVoice:l=!0,enableFiles:$=!0}){let[i,f]=(0,G.useState)(""),[y,u]=(0,G.useState)([]),[k,c]=(0,G.useState)(!1),[S,o]=(0,G.useState)(!1),[g]=(0,G.useState)(()=>!!Ce),w=(0,G.useRef)(null),v=(0,G.useRef)(null),T=(0,G.useRef)(null),m=(0,G.useRef)(!1);(0,G.useEffect)(()=>{!s&&w.current&&w.current.focus()},[s]),(0,G.useEffect)(()=>{w.current&&(w.current.style.height="auto",w.current.style.height=Math.min(w.current.scrollHeight,150)+"px")},[i]),(0,G.useEffect)(()=>()=>{m.current=!1,T.current&&T.current.abort()},[]);let W=d=>{d.preventDefault(),(i.trim()||y.length>0)&&!s&&(e(i,y),f(""),u([]),w.current&&(w.current.style.height="auto"),v.current&&(v.current.value=""))},J=d=>{let A=Array.from(d.target.files||[]);A.length>0&&u(P=>[...P,...A])},x=d=>{u(A=>A.filter((P,r)=>r!==d))},D=d=>{d.preventDefault(),v.current&&!s&&v.current.click()},F=d=>{d.key==="Enter"&&!d.shiftKey&&(d.preventDefault(),W(d))},K=d=>{s&&t&&(d.preventDefault(),t())},z=()=>{if(!Ce||s)return;m.current=!0;let d=new Ce;d.continuous=!0,d.interimResults=!0,d.lang=navigator.language||"en-US";let A=i,P="";d.onstart=()=>{o(!0)},d.onresult=r=>{P="";for(let I=r.resultIndex;I<r.results.length;I++){let N=r.results[I][0].transcript;r.results[I].isFinal?A+=(A?" ":"")+N:P+=N}f(A+(P?" "+P:""))},d.onerror=r=>{if(r.error==="no-speech"||r.error==="aborted"){console.log("[ChatWidget] Speech recognition:",r.error,"- continuing...");return}console.warn("[ChatWidget] Speech recognition error:",r.error),m.current=!1,o(!1),f(A||i)},d.onend=()=>{if(m.current){console.log("[ChatWidget] Recognition paused, restarting...");try{d.start();return}catch(r){console.warn("[ChatWidget] Could not restart recognition:",r)}}o(!1),A&&f(A),T.current=null},T.current=d,d.start()},V=()=>{m.current=!1,T.current&&T.current.stop()},h=d=>{d.preventDefault(),S?V():z()},M=te.html`
|
|
245
245
|
<svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor">
|
|
246
246
|
<rect x="2" y="2" width="10" height="10" rx="1" />
|
|
247
247
|
</svg>
|
|
@@ -257,7 +257,7 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
257
257
|
<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
258
|
</svg>
|
|
259
259
|
`,b=l&&g,E=$;return te.html`
|
|
260
|
-
<form class="cw-input-form" onSubmit=${
|
|
260
|
+
<form class="cw-input-form" onSubmit=${W}>
|
|
261
261
|
<input
|
|
262
262
|
type="file"
|
|
263
263
|
ref=${v}
|
|
@@ -288,7 +288,7 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
288
288
|
placeholder=${U(n)}
|
|
289
289
|
value=${i}
|
|
290
290
|
onInput=${d=>f(d.target.value)}
|
|
291
|
-
onKeyDown=${
|
|
291
|
+
onKeyDown=${F}
|
|
292
292
|
disabled=${s}
|
|
293
293
|
rows="1"
|
|
294
294
|
/>
|
|
@@ -326,7 +326,7 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
326
326
|
${s?k?M:te.html`<span class="cw-spinner"></span>`:"\u27A4"}
|
|
327
327
|
</button>
|
|
328
328
|
</form>
|
|
329
|
-
`}var ue=require("htm/preact");function
|
|
329
|
+
`}var ue=require("htm/preact");function He({isOpen:e,conversations:t,conversationsLoading:s,currentConversationId:n,onClose:a,onNewConversation:l,onSwitchConversation:$}){return ue.html`
|
|
330
330
|
<div class="cw-sidebar ${e?"cw-sidebar-open":""}">
|
|
331
331
|
<div class="cw-sidebar-header">
|
|
332
332
|
<span>Conversations</span>
|
|
@@ -365,7 +365,7 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
365
365
|
class="cw-sidebar-overlay ${e?"cw-sidebar-overlay-visible":""}"
|
|
366
366
|
onClick=${a}
|
|
367
367
|
/>
|
|
368
|
-
`}var ce=require("htm/preact"),
|
|
368
|
+
`}var ce=require("htm/preact"),We=require("preact/hooks");function Ve({availableModels:e,selectedModel:t,onSelectModel:s,thinkingEnabled:n,onToggleThinking:a,disabled:l}){let[$,i]=(0,We.useState)(!1);if(!e||e.length===0)return null;let f=e.find(o=>o.id===t),y=f?.name||"Select Model",u=f?.supports_thinking||!1,k=()=>{l||i(!$)},c=o=>{s(o),i(!1)},S=o=>{o.stopPropagation(),a&&u&&a(!n)};return ce.html`
|
|
369
369
|
<div class="cw-model-selector">
|
|
370
370
|
<button
|
|
371
371
|
class="cw-model-btn"
|
|
@@ -583,7 +583,7 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
583
583
|
</div>
|
|
584
584
|
</div>
|
|
585
585
|
</div>
|
|
586
|
-
`}var L=require("preact/hooks");function je(e,t,s){let[n,a]=(0,L.useState)([]),[l,$]=(0,L.useState)(!1),[i,f]=(0,L.useState)(null),[y,u]=(0,L.useState)(()=>s?.get(e.conversationIdKey)||null),[k,c]=(0,L.useState)(!1),[S,o]=(0,L.useState)(!1),[g,w]=(0,L.useState)(0),v=(0,L.useRef)(null),T=(0,L.useRef)(null);(0,L.useEffect)(()=>{y&&s?.set(e.conversationIdKey,y)},[y,e.conversationIdKey,s]);let m=(0,L.useCallback)(async(h,M,p)=>{v.current&&v.current.close();let C=e.apiPaths.runEvents.replace("{runId}",h),b=`${e.backendUrl}${C}`;M&&(b+=`?anonymous_token=${encodeURIComponent(M)}`);let E=new EventSource(b);v.current=E;let d="";E.addEventListener("assistant.message",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("assistant.message",r.payload);let I=r.payload.content;I&&(d+=I,a(N=>{let q=N[N.length-1];return q?.role==="assistant"&&q.id.startsWith("assistant-stream-")?[...N.slice(0,-1),{...q,content:d}]:[...N,{id:"assistant-stream-"+Date.now(),role:"assistant",content:d,timestamp:new Date,type:"message"}]}))}catch(r){console.error("[ChatWidget] Parse error:",r)}}),E.addEventListener("tool.call",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("tool.call",r.payload),a(I=>[...I,{id:"tool-call-"+Date.now(),role:"assistant",content:`\u{1F527} ${r.payload.name}`,timestamp:new Date,type:"tool_call",metadata:{toolName:r.payload.name,arguments:r.payload.arguments,toolCallId:r.payload.id}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),E.addEventListener("tool.result",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("tool.result",r.payload);let I=r.payload.result,N=I?.error;a(q=>[...q,{id:"tool-result-"+Date.now(),role:"system",content:N?`\u274C ${I.error}`:"\u2713 Done",timestamp:new Date,type:"tool_result",metadata:{toolName:r.payload.name,result:I,toolCallId:r.payload.tool_call_id}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),E.addEventListener("custom",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("custom",r.payload),r.payload?.type==="ui_control"&&e.onUIControl&&e.onUIControl(r.payload),r.payload?.type==="agent_context"&&a(I=>[...I,{id:"agent-context-"+Date.now(),role:"system",content:`\u{1F517} ${r.payload.agent_name||"Sub-agent"} is now handling this request`,timestamp:new Date,type:"agent_context",metadata:{agentKey:r.payload.agent_key,agentName:r.payload.agent_name,action:r.payload.action}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),E.addEventListener("sub_agent.start",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("sub_agent.start",r.payload),a(I=>[...I,{id:"sub-agent-start-"+Date.now(),role:"system",content:`\u{1F517} Delegating to ${r.payload.agent_name||r.payload.sub_agent_key||"sub-agent"}...`,timestamp:new Date,type:"sub_agent_start",metadata:{subAgentKey:r.payload.sub_agent_key,agentName:r.payload.agent_name,invocationMode:r.payload.invocation_mode}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),E.addEventListener("sub_agent.end",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("sub_agent.end",r.payload),a(I=>[...I,{id:"sub-agent-end-"+Date.now(),role:"system",content:`\u2713 ${r.payload.agent_name||"Sub-agent"} completed`,timestamp:new Date,type:"sub_agent_end",metadata:{subAgentKey:r.payload.sub_agent_key,agentName:r.payload.agent_name}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}});let A=P=>{try{let r=JSON.parse(P.data);if(e.onEvent&&e.onEvent(r.type,r.payload),r.type==="run.failed"){let I=r.payload.error||"Agent run failed";f(I),a(N=>[...N,{id:"error-"+Date.now(),role:"system",content:`\u274C Error: ${I}`,timestamp:new Date,type:"error"}])}}catch(r){console.error("[ChatWidget] Parse error:",r)}$(!1),E.close(),v.current=null,d&&p&&p(d)};E.addEventListener("run.succeeded",A),E.addEventListener("run.failed",A),E.addEventListener("run.cancelled",A),E.addEventListener("run.timed_out",A),E.onerror=()=>{$(!1),E.close(),v.current=null}},[e]),H=(0,L.useCallback)(async(h,M={},p={})=>{if(!h.trim()||l)return;let C=[],b={};typeof M=="function"?b={onAssistantMessage:M}:Array.isArray(M)?(C=M,b=p):b=M||{};let{model:E,thinking:d,onAssistantMessage:A,supersedeFromMessageIndex:P}=b;$(!0),f(null);let r={id:fe(),role:"user",content:h.trim(),timestamp:new Date,type:"message",files:C.length>0?C.map(I=>({name:I.name,size:I.size,type:I.type})):void 0};a(I=>[...I,r]);try{let I=await t.getOrCreateSession(),N;if(C.length>0){let B=e.apiCaseStyle!=="camel",Ee=pe=>B?be(pe):pe,le=new FormData;le.append(Ee("agentKey"),e.agentKey),y&&le.append(Ee("conversationId"),y),le.append("messages",JSON.stringify([{role:"user",content:h.trim()}])),le.append("metadata",JSON.stringify(B?{...e.metadata,journey_type:e.defaultJourneyType}:{...e.metadata,journeyType:e.defaultJourneyType})),E&&le.append("model",E),d&&le.append("thinking","true"),C.forEach(pe=>{le.append("files",pe)}),N=t.getFetchOptions({method:"POST",body:le},I)}else{let B=t.transformRequest({agentKey:e.agentKey,conversationId:y,messages:[{role:"user",content:h.trim()}],metadata:{...e.metadata,journeyType:e.defaultJourneyType},...E&&{model:E},...d&&{thinking:!0},...P!==void 0&&{supersedeFromMessageIndex:P}});N=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(B)},I)}let q=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,N),_=I;if(q.status===401){t.clearSession();let B=await t.getOrCreateSession(!0);B&&(_=B,C.length>0?N=t.getFetchOptions({method:"POST",body:N.body},B):N=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:N.body},B),q=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,N))}if(!q.ok){let B=await q.json().catch(()=>({}));throw new Error(B.error||B.detail||`HTTP ${q.status}`)}let Q=await q.json(),ne=t.transformResponse(Q);T.current=ne.id,!y&&ne.conversationId&&u(ne.conversationId),await m(ne.id,_,A)}catch(I){f(I.message||"Failed to send message"),$(!1)}finally{T.current=null}},[e,t,y,l,m]),J=(0,L.useCallback)(async()=>{let h=T.current;if(!(!h||!l))try{let M=e.apiPaths.cancelRun?e.apiPaths.cancelRun.replace("{runId}",h):`${e.apiPaths.runs}${h}/cancel/`;(await fetch(`${e.backendUrl}${M}`,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"}}))).ok&&(v.current&&(v.current.close(),v.current=null),$(!1),T.current=null,a(C=>[...C,{id:"cancelled-"+Date.now(),role:"system",content:"\u23F9 Run cancelled",timestamp:new Date,type:"cancelled"}]))}catch(M){console.error("[ChatWidget] Failed to cancel run:",M)}},[e,t,l]),x=(0,L.useCallback)(()=>{a([]),u(null),f(null),c(!1),w(0),s?.set(e.conversationIdKey,null)},[e.conversationIdKey,s]),D=h=>{let M={id:fe(),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(C=>({id:fe(),role:"assistant",content:`\u{1F527} ${C.function?.name||C.name||"tool"}`,timestamp:M.timestamp,type:"tool_call",metadata:{toolName:C.function?.name||C.name,arguments:C.function?.arguments||C.arguments,toolCallId:C.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"}},O=(0,L.useCallback)(async h=>{console.log("[ChatWidget] loadConversation called with:",h),$(!0),a([]),u(h);try{let M=await t.getOrCreateSession(),C=`${e.backendUrl}${e.apiPaths.conversations}${h}/?limit=10&offset=0`;console.log("[ChatWidget] Fetching conversation from:",C);let b=await fetch(C,t.getFetchOptions({method:"GET"},M));if(console.log("[ChatWidget] Response status:",b.status),b.ok){let E=await b.json();console.log("[ChatWidget] Raw conversation:",E);let d=t.transformResponse(E);if(console.log("[ChatWidget] Transformed conversation:",d),d.messages){let A=d.messages.flatMap(D).filter(Boolean);console.log("[ChatWidget] Mapped messages:",A),a(A)}c(d.hasMore||!1),w(d.messages?.length||0)}else b.status===404?(console.log("[ChatWidget] Conversation not found, clearing"),u(null),s?.set(e.conversationIdKey,null)):console.error("[ChatWidget] Unexpected response status:",b.status)}catch(M){console.error("[ChatWidget] Failed to load conversation:",M)}finally{$(!1)}},[e,t,s]),K=(0,L.useCallback)(async()=>{if(!(!y||S||!k)){o(!0);try{let h=await t.getOrCreateSession(),p=`${e.backendUrl}${e.apiPaths.conversations}${y}/?limit=10&offset=${g}`,C=await fetch(p,t.getFetchOptions({method:"GET"},h));if(C.ok){let b=await C.json(),E=t.transformResponse(b);if(E.messages?.length>0){let d=E.messages.flatMap(D).filter(Boolean);a(A=>[...d,...A]),w(A=>A+E.messages.length),c(E.hasMore||!1)}else c(!1)}}catch(h){console.error("[ChatWidget] Failed to load more messages:",h)}finally{o(!1)}}},[e,t,y,g,S,k]),z=(0,L.useCallback)(async(h,M,p={})=>{if(l)return;let C=n[h];if(!C||C.role!=="user")return;let b=n.slice(0,h);a(b),await H(M,{...p,supersedeFromMessageIndex:h})},[n,l,H]),V=(0,L.useCallback)(async(h,M={})=>{if(l)return;let p=n[h];if(!p)return;let C=h,b=p;if(p.role==="assistant"){for(let d=h-1;d>=0;d--)if(n[d].role==="user"){C=d,b=n[d];break}if(b.role!=="user")return}else if(p.role!=="user")return;let E=n.slice(0,C);a(E),await H(b.content,{...M,supersedeFromMessageIndex:C})},[n,l,H]);return(0,L.useEffect)(()=>()=>{v.current&&v.current.close()},[]),{messages:n,isLoading:l,error:i,conversationId:y,hasMoreMessages:k,loadingMoreMessages:S,sendMessage:H,cancelRun:J,clearMessages:x,loadConversation:O,loadMoreMessages:K,setConversationId:u,editMessage:z,retryMessage:V}}var X=require("preact/hooks"),Je="cw_thinking_enabled";function ze(e,t,s){let[n,a]=(0,X.useState)([]),[l,$]=(0,X.useState)(null),[i,f]=(0,X.useState)(null),[y,u]=(0,X.useState)(!1),[k,c]=(0,X.useState)(!1);(0,X.useEffect)(()=>{(async()=>{if(e.showModelSelector){u(!0);try{let T=await fetch(`${e.backendUrl}${e.apiPaths.models}`,t.getFetchOptions({method:"GET"}));if(T.ok){let m=await T.json(),H=m.models||[];a(H),f(m.default);let J=s?.get(e.modelKey);J&&H.some(D=>D.id===J)?$(J):$(m.default),s?.get(Je)==="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 S=(0,X.useCallback)(v=>{$(v),s?.set(e.modelKey,v)},[e.modelKey,s]),o=(0,X.useCallback)(v=>{c(v),s?.set(Je,v?"true":"false")},[s]),g=(0,X.useCallback)(()=>n.find(v=>v.id===l)||null,[n,l]),w=(0,X.useCallback)(()=>g()?.supports_thinking||!1,[g]);return{availableModels:n,selectedModel:l,defaultModel:i,isLoading:y,selectModel:S,getSelectedModelInfo:g,thinkingEnabled:k,toggleThinking:o,supportsThinking:w}}var ee=require("preact/hooks");function Ge(e,t){let[s,n]=(0,ee.useState)(null),[a,l]=(0,ee.useState)(!1),[$,i]=(0,ee.useState)(null),f=e.apiPaths?.tasks||"/api/agent/tasks/",y=(0,ee.useCallback)(async()=>{l(!0),i(null);try{let g=`${e.backendUrl}${f}`,w=await fetch(g,t.getFetchOptions({method:"GET"}));if(w.ok){let v=await w.json();n(v)}else{let v=await w.json().catch(()=>({}));i(v.error||"Failed to load tasks")}}catch(g){console.error("[useTasks] Failed to load task list:",g),i("Failed to load tasks")}finally{l(!1)}},[e.backendUrl,f,t]),u=(0,ee.useCallback)(async g=>{if(!s)return null;try{let w=`${e.backendUrl}${f}${s.id}/add_task/`,v=await fetch(w,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)}));if(v.ok){let T=await v.json();return await y(),T}else{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to add task"),null}}catch(w){return console.error("[useTasks] Failed to add task:",w),i("Failed to add task"),null}},[e.backendUrl,f,s,t,y]),k=(0,ee.useCallback)(async(g,w)=>{if(!s)return null;try{let v=`${e.backendUrl}${f}${s.id}/update_task/${g}/`,T=await fetch(v,t.getFetchOptions({method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(w)}));if(T.ok){let m=await T.json();return await y(),m}else{let m=await T.json().catch(()=>({}));return i(m.error||"Failed to update task"),null}}catch(v){return console.error("[useTasks] Failed to update task:",v),i("Failed to update task"),null}},[e.backendUrl,f,s,t,y]),c=(0,ee.useCallback)(async g=>{if(!s)return!1;try{let w=`${e.backendUrl}${f}${s.id}/remove_task/${g}/`,v=await fetch(w,t.getFetchOptions({method:"DELETE"}));if(v.ok)return await y(),!0;{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to remove task"),!1}}catch(w){return console.error("[useTasks] Failed to remove task:",w),i("Failed to remove task"),!1}},[e.backendUrl,f,s,t,y]),S=(0,ee.useCallback)(async()=>{if(!s)return!1;try{let g=`${e.backendUrl}${f}${s.id}/clear/`,w=await fetch(g,t.getFetchOptions({method:"POST"}));if(w.ok)return await y(),!0;{let v=await w.json().catch(()=>({}));return i(v.error||"Failed to clear tasks"),!1}}catch(g){return console.error("[useTasks] Failed to clear tasks:",g),i("Failed to clear tasks"),!1}},[e.backendUrl,f,s,t,y]),o=(0,ee.useCallback)(()=>i(null),[]);return{taskList:s,tasks:s?.tasks||[],progress:s?.progress||{total:0,completed:0,percent_complete:0},isLoading:a,error:$,loadTaskList:y,addTask:u,updateTask:k,removeTask:c,clearTasks:S,clearError:o}}var j=require("preact/hooks"),qe="cw_selected_system",Te="cw_selected_agent",Ye="cw_selected_system_version",we="cw_selected_agent_version";function Xe(e,t,s){let[n,a]=(0,j.useState)([]),[l,$]=(0,j.useState)([]),[i,f]=(0,j.useState)(null),[y,u]=(0,j.useState)(null),[k,c]=(0,j.useState)(null),[S,o]=(0,j.useState)(null),[g,w]=(0,j.useState)(!1),v=(0,j.useCallback)(()=>{if(y)return y;if(i){let x=n.find(D=>D.slug===i);if(x?.entry_agent)return x.entry_agent.slug}return e.agentKey},[y,i,n,e.agentKey]);(0,j.useEffect)(()=>{if(!e.showDevTools)return;(async()=>{w(!0);try{let D=await fetch(`${e.backendUrl}${e.apiPaths.systems}`,t.getFetchOptions({method:"GET"}));if(D.ok){let O=await D.json(),K=O.results||O;a(K);let z=s?.get(qe);z&&K.some(V=>V.slug===z)?f(z):K.length===1&&f(K[0].slug)}}catch(D){console.warn("[ChatWidget] Failed to load systems:",D)}finally{w(!1)}})()},[e.backendUrl,e.apiPaths.systems,e.showDevTools,t,s]),(0,j.useEffect)(()=>{if(!e.showDevTools)return;(async()=>{try{let D=i?`?system=${encodeURIComponent(i)}`:"",O=await fetch(`${e.backendUrl}${e.apiPaths.agents}${D}`,t.getFetchOptions({method:"GET"}));if(O.ok){let K=await O.json(),z=K.results||K;$(z);let V=s?.get(Te);if(V&&z.some(M=>M.slug===V))u(V);else if(i){let M=n.find(p=>p.slug===i);M?.entry_agent&&u(M.entry_agent.slug)}let h=s?.get(we);h&&o(h)}}catch(D){console.warn("[ChatWidget] Failed to load agents:",D)}})()},[e.backendUrl,e.apiPaths.agents,e.showDevTools,i,t,s,n]);let T=(0,j.useCallback)(x=>{f(x),s?.set(qe,x),u(null),o(null),s?.set(Te,null),s?.set(we,null);let O=n.find(K=>K.slug===x)?.active_version||null;c(O),s?.set(Ye,O)},[s,n]),m=(0,j.useCallback)(x=>{u(x),s?.set(Te,x);let O=l.find(K=>K.slug===x)?.active_version||null;o(O),s?.set(we,O)},[s,l]),H=(0,j.useCallback)(x=>{c(x),s?.set(Ye,x)},[s]),J=(0,j.useCallback)(x=>{o(x),s?.set(we,x)},[s]);return{systems:n,agents:l,selectedSystem:i,selectedAgent:y,selectedSystemVersion:k,selectedAgentVersion:S,isLoading:g,selectSystem:T,selectAgent:m,selectSystemVersion:H,selectAgentVersion:J,getEffectiveAgentKey:v}}function Ze(e,t,s){let n=u=>!u||typeof u!="object"||e.apiCaseStyle==="camel"?u:ge(u),a=u=>!u||typeof u!="object"||e.apiCaseStyle==="snake"?u:me(u),l=()=>e.authStrategy?e.authStrategy:e.authToken?"token":e.apiPaths.anonymousSession||e.anonymousSessionEndpoint?"anonymous":"none",$=(u=null)=>{let k=l(),c={},S=u||e.authToken||t().authToken;if(k==="token"&&S){let o=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Token";c[o]=g?`${g} ${S}`:S}else if(k==="jwt"&&S){let o=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Bearer";c[o]=g?`${g} ${S}`:S}else if(k==="anonymous"&&S){let o=e.authHeader||e.anonymousTokenHeader||"X-Anonymous-Token";c[o]=S}if(k==="session"){let o=De(e.csrfCookieName);o&&(c["X-CSRFToken"]=o)}return c};return{getAuthStrategy:l,getAuthHeaders:$,getFetchOptions:(u={},k=null)=>{let c=l(),S={...u},o=$(k);return console.log("[ChatWidget] getFetchOptions - strategy:",c,"overrideToken:",k,"authHeaders:",o),S.headers={...S.headers,...o},c==="session"&&(S.credentials="include"),S},getOrCreateSession:async(u=!1)=>{let k=l(),c=t(),S=e.anonymousTokenKey||e.sessionTokenKey;if(k!=="anonymous")return e.authToken||c.authToken;if(!u){if(c.authToken)return c.authToken;let o=c.storage?.get(S);if(o)return s(g=>({...g,authToken:o})),o}try{let o=e.anonymousSessionEndpoint||e.apiPaths.anonymousSession,g=await fetch(`${e.backendUrl}${o}`,{method:"POST",headers:{"Content-Type":"application/json"}});if(g.ok){let w=await g.json();return s(v=>({...v,authToken:w.token})),c.storage?.set(S,w.token),w.token}}catch(o){console.warn("[ChatWidget] Failed to create session:",o)}return null},clearSession:()=>{let u=e.anonymousTokenKey||e.sessionTokenKey,k=t();s(c=>({...c,authToken:null})),k.storage?.set(u,null)},transformRequest:n,transformResponse:a}}function Qe({config:e,onStateChange:t,markdownParser:s,apiRef:n}){console.log("[ChatWidget] Config:",{showConversationSidebar:e.showConversationSidebar,apiPaths:e.apiPaths});let[a,l]=(0,R.useState)(e.embedded||e.forceOpen===!0),[$,i]=(0,R.useState)(!1),[f,y]=(0,R.useState)(!1),[u,k]=(0,R.useState)(!1),[c,S]=(0,R.useState)([]),[o,g]=(0,R.useState)("chat"),[w,v]=(0,R.useState)(!1),[T,m]=(0,R.useState)(e.enableTTS),[H,J]=(0,R.useState)(!1),[x,D]=(0,R.useState)(null);(0,R.useEffect)(()=>{e.forceOpen!==void 0&&l(e.forceOpen)},[e.forceOpen]);let O=(0,R.useMemo)(()=>Re(e.containerId),[e.containerId]),[K,z]=(0,R.useState)(e.authToken||null),V=(0,R.useMemo)(()=>Ze(e,()=>({authToken:K,storage:O}),ne=>{let B=ne({authToken:K,storage:O});B.authToken!==K&&z(B.authToken)}),[e,K,O]),h=Xe(e,V,O),M=(0,R.useMemo)(()=>{if(!e.showDevTools)return e;let _=h.getEffectiveAgentKey();return _&&_!==e.agentKey?{...e,agentKey:_}:e},[e,h.getEffectiveAgentKey]),p=je(M,V,O),C=ze(e,V,O),b=Ge(e,V);(0,R.useEffect)(()=>{for(let _=p.messages.length-1;_>=0;_--){let Q=p.messages[_];if(Q.type==="sub_agent_start"){D({key:Q.metadata?.subAgentKey,name:Q.metadata?.agentName});return}if(Q.type==="sub_agent_end"){D(null);return}}},[p.messages]),(0,R.useEffect)(()=>{let _=O.get(e.conversationIdKey);console.log("[ChatWidget] Initial load - storedConvId:",_,"key:",e.conversationIdKey),console.log("[ChatWidget] apiPaths.conversations:",e.apiPaths.conversations),_&&(console.log("[ChatWidget] Loading conversation:",_),p.loadConversation(_))},[]),(0,R.useEffect)(()=>{t&&t({isOpen:a,isExpanded:$,debugMode:f,messages:p.messages,conversationId:p.conversationId,isLoading:p.isLoading,error:p.error})},[a,$,f,p.messages,p.conversationId,p.isLoading,p.error]);let E=(0,R.useCallback)(async()=>{if(e.showConversationSidebar){v(!0);try{let _=M.agentKey,Q=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(_)}`,ne=await fetch(Q,V.getFetchOptions({method:"GET"}));if(ne.ok){let B=await ne.json();S(B.results||B)}}catch(_){console.error("[ChatWidget] Failed to load conversations:",_),S([])}finally{v(!1)}}},[e,M,V]),d=(0,R.useCallback)(()=>{let _=!u;k(_),_&&E()},[u,E]),A=(0,R.useCallback)(_=>{_!==p.conversationId&&p.loadConversation(_),k(!1)},[p]),P=(0,R.useCallback)(()=>{p.clearMessages(),k(!1)},[p]),r=(0,R.useCallback)(_=>{p.sendMessage(_,{model:C.selectedModel,thinking:C.thinkingEnabled&&C.supportsThinking(),onAssistantMessage:Q=>{}})},[p,T,C.selectedModel,C.thinkingEnabled,C.supportsThinking]),I=(0,R.useCallback)(_=>{g(_),_==="tasks"&&b.loadTaskList()},[b]);if((0,R.useEffect)(()=>{n&&(n.current={open:()=>l(!0),close:()=>l(!1),send:_=>r(_),clearMessages:()=>p.clearMessages(),toggleTTS:()=>m(_=>!_),stopSpeech:()=>J(!1),setAuth:_=>{_.token!==void 0&&z(_.token)},clearAuth:()=>z(null)})},[p,n,r]),!e.embedded&&!a)return Z.html`
|
|
586
|
+
`}var L=require("preact/hooks");function je(e,t,s){let[n,a]=(0,L.useState)([]),[l,$]=(0,L.useState)(!1),[i,f]=(0,L.useState)(null),[y,u]=(0,L.useState)(()=>s?.get(e.conversationIdKey)||null),[k,c]=(0,L.useState)(!1),[S,o]=(0,L.useState)(!1),[g,w]=(0,L.useState)(0),v=(0,L.useRef)(null),T=(0,L.useRef)(null);(0,L.useEffect)(()=>{y&&s?.set(e.conversationIdKey,y)},[y,e.conversationIdKey,s]);let m=(0,L.useCallback)(async(h,M,p)=>{v.current&&v.current.close();let C=e.apiPaths.runEvents.replace("{runId}",h),b=`${e.backendUrl}${C}`;M&&(b+=`?anonymous_token=${encodeURIComponent(M)}`);let E=new EventSource(b);v.current=E;let d="";E.addEventListener("assistant.message",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("assistant.message",r.payload);let I=r.payload.content;I&&(d+=I,a(N=>{let q=N[N.length-1];return q?.role==="assistant"&&q.id.startsWith("assistant-stream-")?[...N.slice(0,-1),{...q,content:d}]:[...N,{id:"assistant-stream-"+Date.now(),role:"assistant",content:d,timestamp:new Date,type:"message"}]}))}catch(r){console.error("[ChatWidget] Parse error:",r)}}),E.addEventListener("tool.call",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("tool.call",r.payload),a(I=>[...I,{id:"tool-call-"+Date.now(),role:"assistant",content:`\u{1F527} ${r.payload.name}`,timestamp:new Date,type:"tool_call",metadata:{toolName:r.payload.name,arguments:r.payload.arguments,toolCallId:r.payload.id}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),E.addEventListener("tool.result",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("tool.result",r.payload);let I=r.payload.result,N=I?.error;a(q=>[...q,{id:"tool-result-"+Date.now(),role:"system",content:N?`\u274C ${I.error}`:"\u2713 Done",timestamp:new Date,type:"tool_result",metadata:{toolName:r.payload.name,result:I,toolCallId:r.payload.tool_call_id}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),E.addEventListener("custom",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("custom",r.payload),r.payload?.type==="ui_control"&&e.onUIControl&&e.onUIControl(r.payload),r.payload?.type==="agent_context"&&a(I=>[...I,{id:"agent-context-"+Date.now(),role:"system",content:`\u{1F517} ${r.payload.agent_name||"Sub-agent"} is now handling this request`,timestamp:new Date,type:"agent_context",metadata:{agentKey:r.payload.agent_key,agentName:r.payload.agent_name,action:r.payload.action}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),E.addEventListener("sub_agent.start",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("sub_agent.start",r.payload),a(I=>[...I,{id:"sub-agent-start-"+Date.now(),role:"system",content:`\u{1F517} Delegating to ${r.payload.agent_name||r.payload.sub_agent_key||"sub-agent"}...`,timestamp:new Date,type:"sub_agent_start",metadata:{subAgentKey:r.payload.sub_agent_key,agentName:r.payload.agent_name,invocationMode:r.payload.invocation_mode}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}}),E.addEventListener("sub_agent.end",P=>{try{let r=JSON.parse(P.data);e.onEvent&&e.onEvent("sub_agent.end",r.payload),a(I=>[...I,{id:"sub-agent-end-"+Date.now(),role:"system",content:`\u2713 ${r.payload.agent_name||"Sub-agent"} completed`,timestamp:new Date,type:"sub_agent_end",metadata:{subAgentKey:r.payload.sub_agent_key,agentName:r.payload.agent_name}}])}catch(r){console.error("[ChatWidget] Parse error:",r)}});let A=P=>{try{let r=JSON.parse(P.data);if(e.onEvent&&e.onEvent(r.type,r.payload),r.type==="run.failed"){let I=r.payload.error||"Agent run failed";f(I),a(N=>[...N,{id:"error-"+Date.now(),role:"system",content:`\u274C Error: ${I}`,timestamp:new Date,type:"error"}])}}catch(r){console.error("[ChatWidget] Parse error:",r)}$(!1),E.close(),v.current=null,d&&p&&p(d)};E.addEventListener("run.succeeded",A),E.addEventListener("run.failed",A),E.addEventListener("run.cancelled",A),E.addEventListener("run.timed_out",A),E.onerror=()=>{$(!1),E.close(),v.current=null}},[e]),W=(0,L.useCallback)(async(h,M={},p={})=>{if(!h.trim()||l)return;let C=[],b={};typeof M=="function"?b={onAssistantMessage:M}:Array.isArray(M)?(C=M,b=p):b=M||{};let{model:E,thinking:d,onAssistantMessage:A,supersedeFromMessageIndex:P}=b;$(!0),f(null);let r={id:fe(),role:"user",content:h.trim(),timestamp:new Date,type:"message",files:C.length>0?C.map(I=>({name:I.name,size:I.size,type:I.type})):void 0};a(I=>[...I,r]);try{let I=await t.getOrCreateSession(),N;if(C.length>0){let B=e.apiCaseStyle!=="camel",Ee=pe=>B?be(pe):pe,le=new FormData;le.append(Ee("agentKey"),e.agentKey),y&&le.append(Ee("conversationId"),y),le.append("messages",JSON.stringify([{role:"user",content:h.trim()}])),le.append("metadata",JSON.stringify(B?{...e.metadata,journey_type:e.defaultJourneyType}:{...e.metadata,journeyType:e.defaultJourneyType})),E&&le.append("model",E),d&&le.append("thinking","true"),C.forEach(pe=>{le.append("files",pe)}),N=t.getFetchOptions({method:"POST",body:le},I)}else{let B=t.transformRequest({agentKey:e.agentKey,conversationId:y,messages:[{role:"user",content:h.trim()}],metadata:{...e.metadata,journeyType:e.defaultJourneyType},...E&&{model:E},...d&&{thinking:!0},...P!==void 0&&{supersedeFromMessageIndex:P}});N=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(B)},I)}let q=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,N),_=I;if(q.status===401){t.clearSession();let B=await t.getOrCreateSession(!0);B&&(_=B,C.length>0?N=t.getFetchOptions({method:"POST",body:N.body},B):N=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:N.body},B),q=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,N))}if(!q.ok){let B=await q.json().catch(()=>({}));throw new Error(B.error||B.detail||`HTTP ${q.status}`)}let Q=await q.json(),ne=t.transformResponse(Q);T.current=ne.id,!y&&ne.conversationId&&u(ne.conversationId),await m(ne.id,_,A)}catch(I){f(I.message||"Failed to send message"),$(!1)}finally{T.current=null}},[e,t,y,l,m]),J=(0,L.useCallback)(async()=>{let h=T.current;if(!(!h||!l))try{let M=e.apiPaths.cancelRun?e.apiPaths.cancelRun.replace("{runId}",h):`${e.apiPaths.runs}${h}/cancel/`;(await fetch(`${e.backendUrl}${M}`,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"}}))).ok&&(v.current&&(v.current.close(),v.current=null),$(!1),T.current=null,a(C=>[...C,{id:"cancelled-"+Date.now(),role:"system",content:"\u23F9 Run cancelled",timestamp:new Date,type:"cancelled"}]))}catch(M){console.error("[ChatWidget] Failed to cancel run:",M)}},[e,t,l]),x=(0,L.useCallback)(()=>{a([]),u(null),f(null),c(!1),w(0),s?.set(e.conversationIdKey,null)},[e.conversationIdKey,s]),D=h=>{let M={id:fe(),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(C=>({id:fe(),role:"assistant",content:`\u{1F527} ${C.function?.name||C.name||"tool"}`,timestamp:M.timestamp,type:"tool_call",metadata:{toolName:C.function?.name||C.name,arguments:C.function?.arguments||C.arguments,toolCallId:C.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=(0,L.useCallback)(async h=>{console.log("[ChatWidget] loadConversation called with:",h),$(!0),a([]),u(h);try{let M=await t.getOrCreateSession(),C=`${e.backendUrl}${e.apiPaths.conversations}${h}/?limit=10&offset=0`;console.log("[ChatWidget] Fetching conversation from:",C);let b=await fetch(C,t.getFetchOptions({method:"GET"},M));if(console.log("[ChatWidget] Response status:",b.status),b.ok){let E=await b.json();console.log("[ChatWidget] Raw conversation:",E);let d=t.transformResponse(E);if(console.log("[ChatWidget] Transformed conversation:",d),d.messages){let A=d.messages.flatMap(D).filter(Boolean);console.log("[ChatWidget] Mapped messages:",A),a(A)}c(d.hasMore||!1),w(d.messages?.length||0)}else b.status===404?(console.log("[ChatWidget] Conversation not found, clearing"),u(null),s?.set(e.conversationIdKey,null)):console.error("[ChatWidget] Unexpected response status:",b.status)}catch(M){console.error("[ChatWidget] Failed to load conversation:",M)}finally{$(!1)}},[e,t,s]),K=(0,L.useCallback)(async()=>{if(!(!y||S||!k)){o(!0);try{let h=await t.getOrCreateSession(),p=`${e.backendUrl}${e.apiPaths.conversations}${y}/?limit=10&offset=${g}`,C=await fetch(p,t.getFetchOptions({method:"GET"},h));if(C.ok){let b=await C.json(),E=t.transformResponse(b);if(E.messages?.length>0){let d=E.messages.flatMap(D).filter(Boolean);a(A=>[...d,...A]),w(A=>A+E.messages.length),c(E.hasMore||!1)}else c(!1)}}catch(h){console.error("[ChatWidget] Failed to load more messages:",h)}finally{o(!1)}}},[e,t,y,g,S,k]),z=(0,L.useCallback)(async(h,M,p={})=>{if(l)return;let C=n[h];if(!C||C.role!=="user")return;let b=n.slice(0,h);a(b),await W(M,{...p,supersedeFromMessageIndex:h})},[n,l,W]),V=(0,L.useCallback)(async(h,M={})=>{if(l)return;let p=n[h];if(!p)return;let C=h,b=p;if(p.role==="assistant"){for(let d=h-1;d>=0;d--)if(n[d].role==="user"){C=d,b=n[d];break}if(b.role!=="user")return}else if(p.role!=="user")return;let E=n.slice(0,C);a(E),await W(b.content,{...M,supersedeFromMessageIndex:C})},[n,l,W]);return(0,L.useEffect)(()=>()=>{v.current&&v.current.close()},[]),{messages:n,isLoading:l,error:i,conversationId:y,hasMoreMessages:k,loadingMoreMessages:S,sendMessage:W,cancelRun:J,clearMessages:x,loadConversation:F,loadMoreMessages:K,setConversationId:u,editMessage:z,retryMessage:V}}var X=require("preact/hooks"),Je="cw_thinking_enabled";function ze(e,t,s){let[n,a]=(0,X.useState)([]),[l,$]=(0,X.useState)(null),[i,f]=(0,X.useState)(null),[y,u]=(0,X.useState)(!1),[k,c]=(0,X.useState)(!1);(0,X.useEffect)(()=>{(async()=>{if(e.showModelSelector){u(!0);try{let T=await fetch(`${e.backendUrl}${e.apiPaths.models}`,t.getFetchOptions({method:"GET"}));if(T.ok){let m=await T.json(),W=m.models||[];a(W),f(m.default);let J=s?.get(e.modelKey);J&&W.some(D=>D.id===J)?$(J):$(m.default),s?.get(Je)==="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 S=(0,X.useCallback)(v=>{$(v),s?.set(e.modelKey,v)},[e.modelKey,s]),o=(0,X.useCallback)(v=>{c(v),s?.set(Je,v?"true":"false")},[s]),g=(0,X.useCallback)(()=>n.find(v=>v.id===l)||null,[n,l]),w=(0,X.useCallback)(()=>g()?.supports_thinking||!1,[g]);return{availableModels:n,selectedModel:l,defaultModel:i,isLoading:y,selectModel:S,getSelectedModelInfo:g,thinkingEnabled:k,toggleThinking:o,supportsThinking:w}}var ee=require("preact/hooks");function Ge(e,t){let[s,n]=(0,ee.useState)(null),[a,l]=(0,ee.useState)(!1),[$,i]=(0,ee.useState)(null),f=e.apiPaths?.tasks||"/api/agent/tasks/",y=(0,ee.useCallback)(async()=>{l(!0),i(null);try{let g=`${e.backendUrl}${f}`,w=await fetch(g,t.getFetchOptions({method:"GET"}));if(w.ok){let v=await w.json();n(v)}else{let v=await w.json().catch(()=>({}));i(v.error||"Failed to load tasks")}}catch(g){console.error("[useTasks] Failed to load task list:",g),i("Failed to load tasks")}finally{l(!1)}},[e.backendUrl,f,t]),u=(0,ee.useCallback)(async g=>{if(!s)return null;try{let w=`${e.backendUrl}${f}${s.id}/add_task/`,v=await fetch(w,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)}));if(v.ok){let T=await v.json();return await y(),T}else{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to add task"),null}}catch(w){return console.error("[useTasks] Failed to add task:",w),i("Failed to add task"),null}},[e.backendUrl,f,s,t,y]),k=(0,ee.useCallback)(async(g,w)=>{if(!s)return null;try{let v=`${e.backendUrl}${f}${s.id}/update_task/${g}/`,T=await fetch(v,t.getFetchOptions({method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(w)}));if(T.ok){let m=await T.json();return await y(),m}else{let m=await T.json().catch(()=>({}));return i(m.error||"Failed to update task"),null}}catch(v){return console.error("[useTasks] Failed to update task:",v),i("Failed to update task"),null}},[e.backendUrl,f,s,t,y]),c=(0,ee.useCallback)(async g=>{if(!s)return!1;try{let w=`${e.backendUrl}${f}${s.id}/remove_task/${g}/`,v=await fetch(w,t.getFetchOptions({method:"DELETE"}));if(v.ok)return await y(),!0;{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to remove task"),!1}}catch(w){return console.error("[useTasks] Failed to remove task:",w),i("Failed to remove task"),!1}},[e.backendUrl,f,s,t,y]),S=(0,ee.useCallback)(async()=>{if(!s)return!1;try{let g=`${e.backendUrl}${f}${s.id}/clear/`,w=await fetch(g,t.getFetchOptions({method:"POST"}));if(w.ok)return await y(),!0;{let v=await w.json().catch(()=>({}));return i(v.error||"Failed to clear tasks"),!1}}catch(g){return console.error("[useTasks] Failed to clear tasks:",g),i("Failed to clear tasks"),!1}},[e.backendUrl,f,s,t,y]),o=(0,ee.useCallback)(()=>i(null),[]);return{taskList:s,tasks:s?.tasks||[],progress:s?.progress||{total:0,completed:0,percent_complete:0},isLoading:a,error:$,loadTaskList:y,addTask:u,updateTask:k,removeTask:c,clearTasks:S,clearError:o}}var j=require("preact/hooks"),qe="cw_selected_system",Te="cw_selected_agent",Ye="cw_selected_system_version",we="cw_selected_agent_version";function Xe(e,t,s){let[n,a]=(0,j.useState)([]),[l,$]=(0,j.useState)([]),[i,f]=(0,j.useState)(null),[y,u]=(0,j.useState)(null),[k,c]=(0,j.useState)(null),[S,o]=(0,j.useState)(null),[g,w]=(0,j.useState)(!1),v=(0,j.useCallback)(()=>{if(y)return y;if(i){let x=n.find(D=>D.slug===i);if(x?.entry_agent)return x.entry_agent.slug}return e.agentKey},[y,i,n,e.agentKey]);(0,j.useEffect)(()=>{if(!e.showDevTools)return;(async()=>{w(!0);try{let D=await fetch(`${e.backendUrl}${e.apiPaths.systems}`,t.getFetchOptions({method:"GET"}));if(D.ok){let F=await D.json(),K=F.results||F;a(K);let z=s?.get(qe);z&&K.some(V=>V.slug===z)?f(z):K.length===1&&f(K[0].slug)}}catch(D){console.warn("[ChatWidget] Failed to load systems:",D)}finally{w(!1)}})()},[e.backendUrl,e.apiPaths.systems,e.showDevTools,t,s]),(0,j.useEffect)(()=>{if(!e.showDevTools)return;(async()=>{try{let D=i?`?system=${encodeURIComponent(i)}`:"",F=await fetch(`${e.backendUrl}${e.apiPaths.agents}${D}`,t.getFetchOptions({method:"GET"}));if(F.ok){let K=await F.json(),z=K.results||K;$(z);let V=s?.get(Te);if(V&&z.some(M=>M.slug===V))u(V);else if(i){let M=n.find(p=>p.slug===i);M?.entry_agent&&u(M.entry_agent.slug)}let h=s?.get(we);h&&o(h)}}catch(D){console.warn("[ChatWidget] Failed to load agents:",D)}})()},[e.backendUrl,e.apiPaths.agents,e.showDevTools,i,t,s,n]);let T=(0,j.useCallback)(x=>{f(x),s?.set(qe,x),u(null),o(null),s?.set(Te,null),s?.set(we,null);let F=n.find(K=>K.slug===x)?.active_version||null;c(F),s?.set(Ye,F)},[s,n]),m=(0,j.useCallback)(x=>{u(x),s?.set(Te,x);let F=l.find(K=>K.slug===x)?.active_version||null;o(F),s?.set(we,F)},[s,l]),W=(0,j.useCallback)(x=>{c(x),s?.set(Ye,x)},[s]),J=(0,j.useCallback)(x=>{o(x),s?.set(we,x)},[s]);return{systems:n,agents:l,selectedSystem:i,selectedAgent:y,selectedSystemVersion:k,selectedAgentVersion:S,isLoading:g,selectSystem:T,selectAgent:m,selectSystemVersion:W,selectAgentVersion:J,getEffectiveAgentKey:v}}function Ze(e,t,s){let n=u=>!u||typeof u!="object"||e.apiCaseStyle==="camel"?u:ge(u),a=u=>!u||typeof u!="object"||e.apiCaseStyle==="snake"?u:me(u),l=()=>e.authStrategy?e.authStrategy:e.authToken?"token":e.apiPaths.anonymousSession||e.anonymousSessionEndpoint?"anonymous":"none",$=(u=null)=>{let k=l(),c={},S=u||e.authToken||t().authToken;if(k==="token"&&S){let o=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Token";c[o]=g?`${g} ${S}`:S}else if(k==="jwt"&&S){let o=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Bearer";c[o]=g?`${g} ${S}`:S}else if(k==="anonymous"&&S){let o=e.authHeader||e.anonymousTokenHeader||"X-Anonymous-Token";c[o]=S}if(k==="session"){let o=De(e.csrfCookieName);o&&(c["X-CSRFToken"]=o)}return c};return{getAuthStrategy:l,getAuthHeaders:$,getFetchOptions:(u={},k=null)=>{let c=l(),S={...u},o=$(k);return console.log("[ChatWidget] getFetchOptions - strategy:",c,"overrideToken:",k,"authHeaders:",o),S.headers={...S.headers,...o},c==="session"&&(S.credentials="include"),S},getOrCreateSession:async(u=!1)=>{let k=l(),c=t(),S=e.anonymousTokenKey||e.sessionTokenKey;if(k!=="anonymous")return e.authToken||c.authToken;if(!u){if(c.authToken)return c.authToken;let o=c.storage?.get(S);if(o)return s(g=>({...g,authToken:o})),o}try{let o=e.anonymousSessionEndpoint||e.apiPaths.anonymousSession,g=await fetch(`${e.backendUrl}${o}`,{method:"POST",headers:{"Content-Type":"application/json"}});if(g.ok){let w=await g.json();return s(v=>({...v,authToken:w.token})),c.storage?.set(S,w.token),w.token}}catch(o){console.warn("[ChatWidget] Failed to create session:",o)}return null},clearSession:()=>{let u=e.anonymousTokenKey||e.sessionTokenKey,k=t();s(c=>({...c,authToken:null})),k.storage?.set(u,null)},transformRequest:n,transformResponse:a}}function Qe({config:e,onStateChange:t,markdownParser:s,apiRef:n}){console.log("[ChatWidget] Config:",{showConversationSidebar:e.showConversationSidebar,apiPaths:e.apiPaths});let[a,l]=(0,R.useState)(e.embedded||e.forceOpen===!0),[$,i]=(0,R.useState)(!1),[f,y]=(0,R.useState)(!1),[u,k]=(0,R.useState)(!1),[c,S]=(0,R.useState)([]),[o,g]=(0,R.useState)("chat"),[w,v]=(0,R.useState)(!1),[T,m]=(0,R.useState)(e.enableTTS),[W,J]=(0,R.useState)(!1),[x,D]=(0,R.useState)(null);(0,R.useEffect)(()=>{e.forceOpen!==void 0&&l(e.forceOpen)},[e.forceOpen]);let F=(0,R.useMemo)(()=>Re(e.containerId),[e.containerId]),[K,z]=(0,R.useState)(e.authToken||null),V=(0,R.useMemo)(()=>Ze(e,()=>({authToken:K,storage:F}),ne=>{let B=ne({authToken:K,storage:F});B.authToken!==K&&z(B.authToken)}),[e,K,F]),h=Xe(e,V,F),M=(0,R.useMemo)(()=>{if(!e.showDevTools)return e;let _=h.getEffectiveAgentKey();return _&&_!==e.agentKey?{...e,agentKey:_}:e},[e,h.getEffectiveAgentKey]),p=je(M,V,F),C=ze(e,V,F),b=Ge(e,V);(0,R.useEffect)(()=>{for(let _=p.messages.length-1;_>=0;_--){let Q=p.messages[_];if(Q.type==="sub_agent_start"){D({key:Q.metadata?.subAgentKey,name:Q.metadata?.agentName});return}if(Q.type==="sub_agent_end"){D(null);return}}},[p.messages]),(0,R.useEffect)(()=>{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(_))},[]),(0,R.useEffect)(()=>{t&&t({isOpen:a,isExpanded:$,debugMode:f,messages:p.messages,conversationId:p.conversationId,isLoading:p.isLoading,error:p.error})},[a,$,f,p.messages,p.conversationId,p.isLoading,p.error]);let E=(0,R.useCallback)(async()=>{if(e.showConversationSidebar){v(!0);try{let _=M.agentKey,Q=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(_)}`,ne=await fetch(Q,V.getFetchOptions({method:"GET"}));if(ne.ok){let B=await ne.json();S(B.results||B)}}catch(_){console.error("[ChatWidget] Failed to load conversations:",_),S([])}finally{v(!1)}}},[e,M,V]),d=(0,R.useCallback)(()=>{let _=!u;k(_),_&&E()},[u,E]),A=(0,R.useCallback)(_=>{_!==p.conversationId&&p.loadConversation(_),k(!1)},[p]),P=(0,R.useCallback)(()=>{p.clearMessages(),k(!1)},[p]),r=(0,R.useCallback)(_=>{p.sendMessage(_,{model:C.selectedModel,thinking:C.thinkingEnabled&&C.supportsThinking(),onAssistantMessage:Q=>{}})},[p,T,C.selectedModel,C.thinkingEnabled,C.supportsThinking]),I=(0,R.useCallback)(_=>{g(_),_==="tasks"&&b.loadTaskList()},[b]);if((0,R.useEffect)(()=>{n&&(n.current={open:()=>l(!0),close:()=>l(!1),send:_=>r(_),clearMessages:()=>p.clearMessages(),toggleTTS:()=>m(_=>!_),stopSpeech:()=>J(!1),setAuth:_=>{_.token!==void 0&&z(_.token)},clearAuth:()=>z(null)})},[p,n,r]),!e.embedded&&!a)return Z.html`
|
|
587
587
|
<button
|
|
588
588
|
class="cw-fab"
|
|
589
589
|
style=${{backgroundColor:e.primaryColor}}
|
|
@@ -593,10 +593,10 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
593
593
|
<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
594
|
</svg>
|
|
595
595
|
</button>
|
|
596
|
-
`;let N=["cw-widget",$&&"cw-widget-expanded",e.embedded&&"cw-widget-embedded"].filter(Boolean).join(" "),q=e.headerTextColor||
|
|
596
|
+
`;let N=["cw-widget",$&&"cw-widget-expanded",e.embedded&&"cw-widget-embedded"].filter(Boolean).join(" "),q=e.headerTextColor||Fe(e.primaryColor);return Z.html`
|
|
597
597
|
<div class=${N} style=${{"--cw-primary":e.primaryColor,"--cw-header-text":q}}>
|
|
598
598
|
${e.showConversationSidebar&&Z.html`
|
|
599
|
-
<${
|
|
599
|
+
<${He}
|
|
600
600
|
isOpen=${u}
|
|
601
601
|
conversations=${c}
|
|
602
602
|
conversationsLoading=${w}
|
|
@@ -607,21 +607,23 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
607
607
|
/>
|
|
608
608
|
`}
|
|
609
609
|
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
610
|
+
${e.showHeader!==!1&&Z.html`
|
|
611
|
+
<${Oe}
|
|
612
|
+
config=${e}
|
|
613
|
+
debugMode=${f}
|
|
614
|
+
isExpanded=${$}
|
|
615
|
+
isSpeaking=${W}
|
|
616
|
+
messagesCount=${p.messages.length}
|
|
617
|
+
isLoading=${p.isLoading}
|
|
618
|
+
currentAgent=${x}
|
|
619
|
+
onClose=${()=>l(!1)}
|
|
620
|
+
onToggleExpand=${()=>i(!$)}
|
|
621
|
+
onToggleDebug=${()=>y(!f)}
|
|
622
|
+
onToggleTTS=${()=>m(!T)}
|
|
623
|
+
onClear=${p.clearMessages}
|
|
624
|
+
onToggleSidebar=${d}
|
|
625
|
+
/>
|
|
626
|
+
`}
|
|
625
627
|
|
|
626
628
|
${e.showDevTools&&Z.html`
|
|
627
629
|
<${Be}
|
|
@@ -693,6 +695,7 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
693
695
|
placeholder=${e.placeholder}
|
|
694
696
|
primaryColor=${e.primaryColor}
|
|
695
697
|
enableVoice=${e.enableVoice}
|
|
698
|
+
enableFiles=${e.showFileAttachment!==!1}
|
|
696
699
|
/>
|
|
697
700
|
`:Z.html`
|
|
698
701
|
<${Ue}
|
|
@@ -707,9 +710,9 @@ var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Objec
|
|
|
707
710
|
/>
|
|
708
711
|
`}
|
|
709
712
|
</div>
|
|
710
|
-
`}var et={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",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 tt(e){let t={...et.apiPaths,...e.apiPaths||{}};return{...et,...e,apiPaths:t}}var ve=new Map,$t=0,
|
|
713
|
+
`}var et={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 tt(e){let t={...et.apiPaths,...e.apiPaths||{}};return{...et,...e,apiPaths:t}}var ve=new Map,$t=0,O=null,Me=class{constructor(t={}){Ie(this,"_handleStateChange",t=>{this._state=t});this.instanceId=`cw-${++$t}`,this.config=tt(t),this.container=null,this._state={},this._apiRef={current:null},ve.set(this.instanceId,this)}init(){if(this.config.containerId){if(this.container=document.getElementById(this.config.containerId),!this.container)return console.error(`[ChatWidget] Container not found: ${this.config.containerId}`),this;this.container.classList.add("cw-container-embedded")}else this.container=document.createElement("div"),this.container.id=this.instanceId,this.container.className=`cw-container cw-position-${this.config.position}`,document.body.appendChild(this.container);return this._applyTheme(),this._render(),console.log(`[ChatWidget] Instance ${this.instanceId} initialized`),this}_applyTheme(){this.container&&(this.container.classList.remove("cw-dark","cw-auto"),this.config.theme==="dark"?this.container.classList.add("cw-dark"):this.config.theme==="auto"&&this.container.classList.add("cw-auto"))}_render(t={}){this.container&&(0,_e.render)(st.html`<${Qe}
|
|
711
714
|
config=${{...this.config,...t}}
|
|
712
715
|
onStateChange=${this._handleStateChange}
|
|
713
716
|
markdownParser=${ke._enhancedMarkdownParser}
|
|
714
717
|
apiRef=${this._apiRef}
|
|
715
|
-
/>`,this.container)}destroy(){this.container&&((0,_e.render)(null,this.container),this.config.containerId?this.container.classList.remove("cw-container-embedded"):this.container.remove(),this.container=null),ve.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 nt(e={}){return new Me(e).init()}function yt(e={}){return
|
|
718
|
+
/>`,this.container)}destroy(){this.container&&((0,_e.render)(null,this.container),this.config.containerId?this.container.classList.remove("cw-container-embedded"):this.container.remove(),this.container=null),ve.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 nt(e={}){return new Me(e).init()}function yt(e={}){return O&&O.destroy(),O=nt(e),O}function wt(){O&&(O.destroy(),O=null)}function vt(){O&&O.open()}function kt(){O&&O.close()}function bt(e){O&&O.send(e)}function St(){O&&O.clearMessages()}function Ct(){O&&O.toggleTTS()}function Tt(){O&&O.stopSpeech()}function _t(e){O&&O.setAuth(e)}function Mt(){O&&O.clearAuth()}function Et(){return O?O.getState():null}function It(){return O?O.getConfig():null}var ke={createInstance:nt,getInstance:e=>ve.get(e),getAllInstances:()=>Array.from(ve.values()),init:yt,destroy:wt,open:vt,close:kt,send:bt,clearMessages:St,toggleTTS:Ct,stopSpeech:Tt,setAuth:_t,clearAuth:Mt,getState:Et,getConfig:It,_enhancedMarkdownParser:null};var xt=ke;typeof window<"u"&&(window.ChatWidget=ke);
|