@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.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var
|
|
1
|
+
var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[t]=s;var Oe=(e,t,s)=>(ft(e,typeof t!="symbol"?t+"":t,s),s);import{render as ht}from"preact";import{html as Mt}from"htm/preact";import{html as z}from"htm/preact";import{useState as q,useEffect as pe,useCallback as le,useMemo as Ae}from"preact/hooks";import{html as ee}from"htm/preact";function $t(e){return e.replace(/_([a-z])/g,(t,s)=>s.toUpperCase())}function Te(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])=>[$t(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])=>[Te(t),ge(s)])):e}function fe(){return"msg-"+Date.now()+"-"+Math.random().toString(36).substr(2,9)}function W(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function Pe(e){if(!e)return"";try{let t=new Date(e),n=new Date-t,l=Math.floor(n/6e4),r=Math.floor(n/36e5),$=Math.floor(n/864e5);return l<1?"Just now":l<60?`${l}m ago`:r<24?`${r}h ago`:$<7?`${$}d ago`:t.toLocaleDateString()}catch{return""}}function Ke(e,t=null){if(t)return t(e);let s=W(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 Le(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 l=t(s);n===null?localStorage.removeItem(l):localStorage.setItem(l,n)}catch{}}}}function Ne(e="csrftoken"){let t=document.cookie.split(";");for(let n of t){let[l,r]=n.trim().split("=");if(l===e)return decodeURIComponent(r)}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 yt(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,l=parseInt(s.substr(2,2),16)/255,r=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*$(l)+.0722*$(r)}function He(e){return yt(e)>.179?"#000000":"#ffffff"}function We({config:e,debugMode:t,isExpanded:s,isSpeaking:n,messagesCount:l,isLoading:r,currentAgent:$,onClose:i,onToggleExpand:f,onToggleDebug:y,onToggleTTS:u,onClear:k,onToggleSidebar:c}){let{title:S,primaryColor:a,embedded:g,showConversationSidebar:w,showClearButton:v,showDebugButton:T,enableDebugMode:m,showTTSButton:N,showExpandButton:U,enableTTS:x,elevenLabsApiKey:R,ttsProxyUrl:D}=e,P=R||D;return ee`
|
|
2
2
|
<div class="cw-header" style=${{backgroundColor:a}}>
|
|
3
3
|
${w&&ee`
|
|
4
4
|
<button
|
|
@@ -15,11 +15,11 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(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">${W(S)}</span>
|
|
19
19
|
${$&&ee`
|
|
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">${W($.name||$.key)}</span>
|
|
23
23
|
</span>
|
|
24
24
|
`}
|
|
25
25
|
</div>
|
|
@@ -144,11 +144,11 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
144
144
|
${b&&L`<span class="cw-tool-expand">${i?"\u25BC":"\u25B6"}</span>`}
|
|
145
145
|
</span>
|
|
146
146
|
${i&&b&&L`
|
|
147
|
-
<pre class="cw-tool-details">${
|
|
147
|
+
<pre class="cw-tool-details">${W(E(g?e.metadata.arguments:e.metadata.result))}</pre>
|
|
148
148
|
`}
|
|
149
149
|
${t&&L`<${_e} msg=${e} show=${y} onToggle=${()=>u(!y)} />`}
|
|
150
150
|
</div>
|
|
151
|
-
`}let U=["cw-message",S&&"cw-message-user",v&&"cw-message-error"].filter(Boolean).join(" "),x=`cw-message-row ${S?"cw-message-row-user":""}`,R=e.role==="assistant"?Ke(e.content,s):
|
|
151
|
+
`}let U=["cw-message",S&&"cw-message-user",v&&"cw-message-error"].filter(Boolean).join(" "),x=`cw-message-row ${S?"cw-message-row-user":""}`,R=e.role==="assistant"?Ke(e.content,s):W(e.content),D=e.files&&e.files.length>0,P=()=>D?L`
|
|
152
152
|
<div class="cw-message-attachments">
|
|
153
153
|
${e.files.map(b=>b.type&&b.type.startsWith("image/")?L`
|
|
154
154
|
<a class="cw-attachment-thumbnail" href=${b.url} target="_blank" title=${b.name}>
|
|
@@ -164,7 +164,7 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
164
164
|
</a>
|
|
165
165
|
`)}
|
|
166
166
|
</div>
|
|
167
|
-
`:null,B=b=>{c(!1),n&&n($,b)},
|
|
167
|
+
`:null,B=b=>{c(!1),n&&n($,b)},H=()=>{l&&l($)};if(S&&k)return L`
|
|
168
168
|
<div class=${x} style="position: relative;">
|
|
169
169
|
${P()}
|
|
170
170
|
<${kt}
|
|
@@ -180,7 +180,7 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
180
180
|
<div class="cw-user-actions-wrapper">
|
|
181
181
|
<${Ve}
|
|
182
182
|
onEdit=${()=>c(!0)}
|
|
183
|
-
onRetry=${
|
|
183
|
+
onRetry=${H}
|
|
184
184
|
isLoading=${r}
|
|
185
185
|
position="left"
|
|
186
186
|
showEdit=${!0}
|
|
@@ -193,7 +193,7 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
193
193
|
`}
|
|
194
194
|
${p&&L`
|
|
195
195
|
<${Ve}
|
|
196
|
-
onRetry=${
|
|
196
|
+
onRetry=${H}
|
|
197
197
|
isLoading=${r}
|
|
198
198
|
position="right"
|
|
199
199
|
showEdit=${!1}
|
|
@@ -208,8 +208,8 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
208
208
|
<svg class="cw-empty-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
209
209
|
<path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
|
|
210
210
|
</svg>
|
|
211
|
-
<h3>${
|
|
212
|
-
<p>${
|
|
211
|
+
<h3>${W(y)}</h3>
|
|
212
|
+
<p>${W(u)}</p>
|
|
213
213
|
</div>
|
|
214
214
|
`}
|
|
215
215
|
|
|
@@ -241,7 +241,7 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
241
241
|
</div>
|
|
242
242
|
`}
|
|
243
243
|
</div>
|
|
244
|
-
`}import{html as X}from"htm/preact";import{useState as ie,useRef as ve,useEffect as Me}from"preact/hooks";var Ee=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function ze({onSend:e,onCancel:t,isLoading:s,placeholder:n,primaryColor:l,enableVoice:r=!0,enableFiles:$=!0}){let[i,f]=ie(""),[y,u]=ie([]),[k,c]=ie(!1),[S,a]=ie(!1),[g]=ie(()=>!!Ee),w=ve(null),v=ve(null),T=ve(null),m=ve(!1);Me(()=>{!s&&w.current&&w.current.focus()},[s]),Me(()=>{w.current&&(w.current.style.height="auto",w.current.style.height=Math.min(w.current.scrollHeight,150)+"px")},[i]),Me(()=>()=>{m.current=!1,T.current&&T.current.abort()},[]);let N=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=""))},U=d=>{let A=Array.from(d.target.files||[]);A.length>0&&u(
|
|
244
|
+
`}import{html as X}from"htm/preact";import{useState as ie,useRef as ve,useEffect as Me}from"preact/hooks";var Ee=typeof window<"u"?window.SpeechRecognition||window.webkitSpeechRecognition:null;function ze({onSend:e,onCancel:t,isLoading:s,placeholder:n,primaryColor:l,enableVoice:r=!0,enableFiles:$=!0}){let[i,f]=ie(""),[y,u]=ie([]),[k,c]=ie(!1),[S,a]=ie(!1),[g]=ie(()=>!!Ee),w=ve(null),v=ve(null),T=ve(null),m=ve(!1);Me(()=>{!s&&w.current&&w.current.focus()},[s]),Me(()=>{w.current&&(w.current.style.height="auto",w.current.style.height=Math.min(w.current.scrollHeight,150)+"px")},[i]),Me(()=>()=>{m.current=!1,T.current&&T.current.abort()},[]);let N=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=""))},U=d=>{let A=Array.from(d.target.files||[]);A.length>0&&u(O=>[...O,...A])},x=d=>{u(A=>A.filter((O,o)=>o!==d))},R=d=>{d.preventDefault(),v.current&&!s&&v.current.click()},D=d=>{d.key==="Enter"&&!d.shiftKey&&(d.preventDefault(),N(d))},P=d=>{s&&t&&(d.preventDefault(),t())},B=()=>{if(!Ee||s)return;m.current=!0;let d=new Ee;d.continuous=!0,d.interimResults=!0,d.lang=navigator.language||"en-US";let A=i,O="";d.onstart=()=>{a(!0)},d.onresult=o=>{O="";for(let I=o.resultIndex;I<o.results.length;I++){let K=o.results[I][0].transcript;o.results[I].isFinal?A+=(A?" ":"")+K:O+=K}f(A+(O?" "+O:""))},d.onerror=o=>{if(o.error==="no-speech"||o.error==="aborted"){console.log("[ChatWidget] Speech recognition:",o.error,"- continuing...");return}console.warn("[ChatWidget] Speech recognition error:",o.error),m.current=!1,a(!1),f(A||i)},d.onend=()=>{if(m.current){console.log("[ChatWidget] Recognition paused, restarting...");try{d.start();return}catch(o){console.warn("[ChatWidget] Could not restart recognition:",o)}}a(!1),A&&f(A),T.current=null},T.current=d,d.start()},H=()=>{m.current=!1,T.current&&T.current.stop()},h=d=>{d.preventDefault(),S?H():B()},M=X`
|
|
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>
|
|
@@ -285,7 +285,7 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
285
285
|
<textarea
|
|
286
286
|
ref=${w}
|
|
287
287
|
class="cw-input"
|
|
288
|
-
placeholder=${
|
|
288
|
+
placeholder=${W(n)}
|
|
289
289
|
value=${i}
|
|
290
290
|
onInput=${d=>f(d.target.value)}
|
|
291
291
|
onKeyDown=${D}
|
|
@@ -354,7 +354,7 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
354
354
|
class="cw-conversation-item ${i.id===n?"cw-conversation-active":""}"
|
|
355
355
|
onClick=${()=>$(i.id)}
|
|
356
356
|
>
|
|
357
|
-
<div class="cw-conversation-title">${
|
|
357
|
+
<div class="cw-conversation-title">${W(i.title||"Untitled")}</div>
|
|
358
358
|
<div class="cw-conversation-date">${Pe(i.updatedAt||i.createdAt)}</div>
|
|
359
359
|
</div>
|
|
360
360
|
`)}
|
|
@@ -374,7 +374,7 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
374
374
|
title="Select Model"
|
|
375
375
|
>
|
|
376
376
|
<span class="cw-model-icon">🤖</span>
|
|
377
|
-
<span class="cw-model-name">${
|
|
377
|
+
<span class="cw-model-name">${W(y)}</span>
|
|
378
378
|
<span class="cw-model-chevron">${$?"\u25B2":"\u25BC"}</span>
|
|
379
379
|
</button>
|
|
380
380
|
|
|
@@ -398,12 +398,12 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
398
398
|
onClick=${()=>c(a.id)}
|
|
399
399
|
>
|
|
400
400
|
<span class="cw-model-option-name">
|
|
401
|
-
${
|
|
401
|
+
${W(a.name)}
|
|
402
402
|
${a.supports_thinking&&oe`<span class="cw-thinking-badge" title="Supports extended thinking">🧠</span>`}
|
|
403
403
|
</span>
|
|
404
|
-
<span class="cw-model-option-provider">${
|
|
404
|
+
<span class="cw-model-option-provider">${W(a.provider)}</span>
|
|
405
405
|
${a.description&&oe`
|
|
406
|
-
<span class="cw-model-option-desc">${
|
|
406
|
+
<span class="cw-model-option-desc">${W(a.description)}</span>
|
|
407
407
|
`}
|
|
408
408
|
</button>
|
|
409
409
|
`)}
|
|
@@ -583,7 +583,7 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
583
583
|
</div>
|
|
584
584
|
</div>
|
|
585
585
|
</div>
|
|
586
|
-
`}import{useState as ne,useCallback as te,useRef as Qe,useEffect as et}from"preact/hooks";function tt(e,t,s){let[n,l]=ne([]),[r,$]=ne(!1),[i,f]=ne(null),[y,u]=ne(()=>s?.get(e.conversationIdKey)||null),[k,c]=ne(!1),[S,a]=ne(!1),[g,w]=ne(0),v=Qe(null),T=Qe(null);et(()=>{y&&s?.set(e.conversationIdKey,y)},[y,e.conversationIdKey,s]);let m=te(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",F=>{try{let o=JSON.parse(F.data);e.onEvent&&e.onEvent("assistant.message",o.payload);let I=o.payload.content;I&&(d+=I,l(K=>{let j=K[K.length-1];return j?.role==="assistant"&&j.id.startsWith("assistant-stream-")?[...K.slice(0,-1),{...j,content:d}]:[...K,{id:"assistant-stream-"+Date.now(),role:"assistant",content:d,timestamp:new Date,type:"message"}]}))}catch(o){console.error("[ChatWidget] Parse error:",o)}}),E.addEventListener("tool.call",F=>{try{let o=JSON.parse(F.data);e.onEvent&&e.onEvent("tool.call",o.payload),l(I=>[...I,{id:"tool-call-"+Date.now(),role:"assistant",content:`\u{1F527} ${o.payload.name}`,timestamp:new Date,type:"tool_call",metadata:{toolName:o.payload.name,arguments:o.payload.arguments,toolCallId:o.payload.id}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),E.addEventListener("tool.result",F=>{try{let o=JSON.parse(F.data);e.onEvent&&e.onEvent("tool.result",o.payload);let I=o.payload.result,K=I?.error;l(j=>[...j,{id:"tool-result-"+Date.now(),role:"system",content:K?`\u274C ${I.error}`:"\u2713 Done",timestamp:new Date,type:"tool_result",metadata:{toolName:o.payload.name,result:I,toolCallId:o.payload.tool_call_id}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),E.addEventListener("custom",F=>{try{let o=JSON.parse(F.data);e.onEvent&&e.onEvent("custom",o.payload),o.payload?.type==="ui_control"&&e.onUIControl&&e.onUIControl(o.payload),o.payload?.type==="agent_context"&&l(I=>[...I,{id:"agent-context-"+Date.now(),role:"system",content:`\u{1F517} ${o.payload.agent_name||"Sub-agent"} is now handling this request`,timestamp:new Date,type:"agent_context",metadata:{agentKey:o.payload.agent_key,agentName:o.payload.agent_name,action:o.payload.action}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),E.addEventListener("sub_agent.start",F=>{try{let o=JSON.parse(F.data);e.onEvent&&e.onEvent("sub_agent.start",o.payload),l(I=>[...I,{id:"sub-agent-start-"+Date.now(),role:"system",content:`\u{1F517} Delegating to ${o.payload.agent_name||o.payload.sub_agent_key||"sub-agent"}...`,timestamp:new Date,type:"sub_agent_start",metadata:{subAgentKey:o.payload.sub_agent_key,agentName:o.payload.agent_name,invocationMode:o.payload.invocation_mode}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),E.addEventListener("sub_agent.end",F=>{try{let o=JSON.parse(F.data);e.onEvent&&e.onEvent("sub_agent.end",o.payload),l(I=>[...I,{id:"sub-agent-end-"+Date.now(),role:"system",content:`\u2713 ${o.payload.agent_name||"Sub-agent"} completed`,timestamp:new Date,type:"sub_agent_end",metadata:{subAgentKey:o.payload.sub_agent_key,agentName:o.payload.agent_name}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}});let A=F=>{try{let o=JSON.parse(F.data);if(e.onEvent&&e.onEvent(o.type,o.payload),o.type==="run.failed"){let I=o.payload.error||"Agent run failed";f(I),l(K=>[...K,{id:"error-"+Date.now(),role:"system",content:`\u274C Error: ${I}`,timestamp:new Date,type:"error"}])}}catch(o){console.error("[ChatWidget] Parse error:",o)}$(!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]),N=te(async(h,M={},p={})=>{if(!h.trim()||r)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:F}=b;$(!0),f(null);let o={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};l(I=>[...I,o]);try{let I=await t.getOrCreateSession(),K;if(C.length>0){let V=e.apiCaseStyle!=="camel",Oe=he=>V?Te(he):he,Q=new FormData;Q.append(Oe("agentKey"),e.agentKey),y&&Q.append(Oe("conversationId"),y),Q.append("messages",JSON.stringify([{role:"user",content:h.trim()}])),Q.append("metadata",JSON.stringify(V?{...e.metadata,journey_type:e.defaultJourneyType}:{...e.metadata,journeyType:e.defaultJourneyType})),E&&Q.append("model",E),d&&Q.append("thinking","true"),C.forEach(he=>{Q.append("files",he)}),K=t.getFetchOptions({method:"POST",body:Q},I)}else{let V=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},...F!==void 0&&{supersedeFromMessageIndex:F}});K=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(V)},I)}let j=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,K),_=I;if(j.status===401){t.clearSession();let V=await t.getOrCreateSession(!0);V&&(_=V,C.length>0?K=t.getFetchOptions({method:"POST",body:K.body},V):K=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:K.body},V),j=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,K))}if(!j.ok){let V=await j.json().catch(()=>({}));throw new Error(V.error||V.detail||`HTTP ${j.status}`)}let z=await j.json(),Y=t.transformResponse(z);T.current=Y.id,!y&&Y.conversationId&&u(Y.conversationId),await m(Y.id,_,A)}catch(I){f(I.message||"Failed to send message"),$(!1)}finally{T.current=null}},[e,t,y,r,m]),U=te(async()=>{let h=T.current;if(!(!h||!r))try{let M=e.apiPaths.cancelRun?e.apiPaths.cancelRun.replace("{runId}",h):`${e.apiPaths.runs}${h}/cancel/`;(await fetch(`${e.backendUrl}${M}`,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"}}))).ok&&(v.current&&(v.current.close(),v.current=null),$(!1),T.current=null,l(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,r]),x=te(()=>{l([]),u(null),f(null),c(!1),w(0),s?.set(e.conversationIdKey,null)},[e.conversationIdKey,s]),R=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"}},D=te(async h=>{console.log("[ChatWidget] loadConversation called with:",h),$(!0),l([]),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(R).filter(Boolean);console.log("[ChatWidget] Mapped messages:",A),l(A)}c(d.hasMore||!1),w(d.messages?.length||0)}else b.status===404?(console.log("[ChatWidget] Conversation not found, clearing"),u(null),s?.set(e.conversationIdKey,null)):console.error("[ChatWidget] Unexpected response status:",b.status)}catch(M){console.error("[ChatWidget] Failed to load conversation:",M)}finally{$(!1)}},[e,t,s]),P=te(async()=>{if(!(!y||S||!k)){a(!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(R).filter(Boolean);l(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{a(!1)}}},[e,t,y,g,S,k]),B=te(async(h,M,p={})=>{if(r)return;let C=n[h];if(!C||C.role!=="user")return;let b=n.slice(0,h);l(b),await N(M,{...p,supersedeFromMessageIndex:h})},[n,r,N]),W=te(async(h,M={})=>{if(r)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);l(E),await N(b.content,{...M,supersedeFromMessageIndex:C})},[n,r,N]);return et(()=>()=>{v.current&&v.current.close()},[]),{messages:n,isLoading:r,error:i,conversationId:y,hasMoreMessages:k,loadingMoreMessages:S,sendMessage:N,cancelRun:U,clearMessages:x,loadConversation:D,loadMoreMessages:P,setConversationId:u,editMessage:B,retryMessage:W}}import{useState as de,useEffect as _t,useCallback as be}from"preact/hooks";var st="cw_thinking_enabled";function nt(e,t,s){let[n,l]=de([]),[r,$]=de(null),[i,f]=de(null),[y,u]=de(!1),[k,c]=de(!1);_t(()=>{(async()=>{if(e.showModelSelector){u(!0);try{let T=await fetch(`${e.backendUrl}${e.apiPaths.models}`,t.getFetchOptions({method:"GET"}));if(T.ok){let m=await T.json(),N=m.models||[];l(N),f(m.default);let U=s?.get(e.modelKey);U&&N.some(R=>R.id===U)?$(U):$(m.default),s?.get(st)==="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=be(v=>{$(v),s?.set(e.modelKey,v)},[e.modelKey,s]),a=be(v=>{c(v),s?.set(st,v?"true":"false")},[s]),g=be(()=>n.find(v=>v.id===r)||null,[n,r]),w=be(()=>g()?.supports_thinking||!1,[g]);return{availableModels:n,selectedModel:r,defaultModel:i,isLoading:y,selectModel:S,getSelectedModelInfo:g,thinkingEnabled:k,toggleThinking:a,supportsThinking:w}}import{useState as Ie,useCallback as re}from"preact/hooks";function at(e,t){let[s,n]=Ie(null),[l,r]=Ie(!1),[$,i]=Ie(null),f=e.apiPaths?.tasks||"/api/agent/tasks/",y=re(async()=>{r(!0),i(null);try{let g=`${e.backendUrl}${f}`,w=await fetch(g,t.getFetchOptions({method:"GET"}));if(w.ok){let v=await w.json();n(v)}else{let v=await w.json().catch(()=>({}));i(v.error||"Failed to load tasks")}}catch(g){console.error("[useTasks] Failed to load task list:",g),i("Failed to load tasks")}finally{r(!1)}},[e.backendUrl,f,t]),u=re(async g=>{if(!s)return null;try{let w=`${e.backendUrl}${f}${s.id}/add_task/`,v=await fetch(w,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)}));if(v.ok){let T=await v.json();return await y(),T}else{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to add task"),null}}catch(w){return console.error("[useTasks] Failed to add task:",w),i("Failed to add task"),null}},[e.backendUrl,f,s,t,y]),k=re(async(g,w)=>{if(!s)return null;try{let v=`${e.backendUrl}${f}${s.id}/update_task/${g}/`,T=await fetch(v,t.getFetchOptions({method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(w)}));if(T.ok){let m=await T.json();return await y(),m}else{let m=await T.json().catch(()=>({}));return i(m.error||"Failed to update task"),null}}catch(v){return console.error("[useTasks] Failed to update task:",v),i("Failed to update task"),null}},[e.backendUrl,f,s,t,y]),c=re(async g=>{if(!s)return!1;try{let w=`${e.backendUrl}${f}${s.id}/remove_task/${g}/`,v=await fetch(w,t.getFetchOptions({method:"DELETE"}));if(v.ok)return await y(),!0;{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to remove task"),!1}}catch(w){return console.error("[useTasks] Failed to remove task:",w),i("Failed to remove task"),!1}},[e.backendUrl,f,s,t,y]),S=re(async()=>{if(!s)return!1;try{let g=`${e.backendUrl}${f}${s.id}/clear/`,w=await fetch(g,t.getFetchOptions({method:"POST"}));if(w.ok)return await y(),!0;{let v=await w.json().catch(()=>({}));return i(v.error||"Failed to clear tasks"),!1}}catch(g){return console.error("[useTasks] Failed to clear tasks:",g),i("Failed to clear tasks"),!1}},[e.backendUrl,f,s,t,y]),a=re(()=>i(null),[]);return{taskList:s,tasks:s?.tasks||[],progress:s?.progress||{total:0,completed:0,percent_complete:0},isLoading:l,error:$,loadTaskList:y,addTask:u,updateTask:k,removeTask:c,clearTasks:S,clearError:a}}import{useState as ae,useEffect as ot,useCallback as ue}from"preact/hooks";var rt="cw_selected_system",xe="cw_selected_agent",lt="cw_selected_system_version",Se="cw_selected_agent_version";function it(e,t,s){let[n,l]=ae([]),[r,$]=ae([]),[i,f]=ae(null),[y,u]=ae(null),[k,c]=ae(null),[S,a]=ae(null),[g,w]=ae(!1),v=ue(()=>{if(y)return y;if(i){let x=n.find(R=>R.slug===i);if(x?.entry_agent)return x.entry_agent.slug}return e.agentKey},[y,i,n,e.agentKey]);ot(()=>{if(!e.showDevTools)return;(async()=>{w(!0);try{let R=await fetch(`${e.backendUrl}${e.apiPaths.systems}`,t.getFetchOptions({method:"GET"}));if(R.ok){let D=await R.json(),P=D.results||D;l(P);let B=s?.get(rt);B&&P.some(W=>W.slug===B)?f(B):P.length===1&&f(P[0].slug)}}catch(R){console.warn("[ChatWidget] Failed to load systems:",R)}finally{w(!1)}})()},[e.backendUrl,e.apiPaths.systems,e.showDevTools,t,s]),ot(()=>{if(!e.showDevTools)return;(async()=>{try{let R=i?`?system=${encodeURIComponent(i)}`:"",D=await fetch(`${e.backendUrl}${e.apiPaths.agents}${R}`,t.getFetchOptions({method:"GET"}));if(D.ok){let P=await D.json(),B=P.results||P;$(B);let W=s?.get(xe);if(W&&B.some(M=>M.slug===W))u(W);else if(i){let M=n.find(p=>p.slug===i);M?.entry_agent&&u(M.entry_agent.slug)}let h=s?.get(Se);h&&a(h)}}catch(R){console.warn("[ChatWidget] Failed to load agents:",R)}})()},[e.backendUrl,e.apiPaths.agents,e.showDevTools,i,t,s,n]);let T=ue(x=>{f(x),s?.set(rt,x),u(null),a(null),s?.set(xe,null),s?.set(Se,null);let D=n.find(P=>P.slug===x)?.active_version||null;c(D),s?.set(lt,D)},[s,n]),m=ue(x=>{u(x),s?.set(xe,x);let D=r.find(P=>P.slug===x)?.active_version||null;a(D),s?.set(Se,D)},[s,r]),N=ue(x=>{c(x),s?.set(lt,x)},[s]),U=ue(x=>{a(x),s?.set(Se,x)},[s]);return{systems:n,agents:r,selectedSystem:i,selectedAgent:y,selectedSystemVersion:k,selectedAgentVersion:S,isLoading:g,selectSystem:T,selectAgent:m,selectSystemVersion:N,selectAgentVersion:U,getEffectiveAgentKey:v}}function ct(e,t,s){let n=u=>!u||typeof u!="object"||e.apiCaseStyle==="camel"?u:ge(u),l=u=>!u||typeof u!="object"||e.apiCaseStyle==="snake"?u:me(u),r=()=>e.authStrategy?e.authStrategy:e.authToken?"token":e.apiPaths.anonymousSession||e.anonymousSessionEndpoint?"anonymous":"none",$=(u=null)=>{let k=r(),c={},S=u||e.authToken||t().authToken;if(k==="token"&&S){let a=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Token";c[a]=g?`${g} ${S}`:S}else if(k==="jwt"&&S){let a=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Bearer";c[a]=g?`${g} ${S}`:S}else if(k==="anonymous"&&S){let a=e.authHeader||e.anonymousTokenHeader||"X-Anonymous-Token";c[a]=S}if(k==="session"){let a=Ne(e.csrfCookieName);a&&(c["X-CSRFToken"]=a)}return c};return{getAuthStrategy:r,getAuthHeaders:$,getFetchOptions:(u={},k=null)=>{let c=r(),S={...u},a=$(k);return console.log("[ChatWidget] getFetchOptions - strategy:",c,"overrideToken:",k,"authHeaders:",a),S.headers={...S.headers,...a},c==="session"&&(S.credentials="include"),S},getOrCreateSession:async(u=!1)=>{let k=r(),c=t(),S=e.anonymousTokenKey||e.sessionTokenKey;if(k!=="anonymous")return e.authToken||c.authToken;if(!u){if(c.authToken)return c.authToken;let a=c.storage?.get(S);if(a)return s(g=>({...g,authToken:a})),a}try{let a=e.anonymousSessionEndpoint||e.apiPaths.anonymousSession,g=await fetch(`${e.backendUrl}${a}`,{method:"POST",headers:{"Content-Type":"application/json"}});if(g.ok){let w=await g.json();return s(v=>({...v,authToken:w.token})),c.storage?.set(S,w.token),w.token}}catch(a){console.warn("[ChatWidget] Failed to create session:",a)}return null},clearSession:()=>{let u=e.anonymousTokenKey||e.sessionTokenKey,k=t();s(c=>({...c,authToken:null})),k.storage?.set(u,null)},transformRequest:n,transformResponse:l}}function dt({config:e,onStateChange:t,markdownParser:s,apiRef:n}){console.log("[ChatWidget] Config:",{showConversationSidebar:e.showConversationSidebar,apiPaths:e.apiPaths});let[l,r]=q(e.embedded||e.forceOpen===!0),[$,i]=q(!1),[f,y]=q(!1),[u,k]=q(!1),[c,S]=q([]),[a,g]=q("chat"),[w,v]=q(!1),[T,m]=q(e.enableTTS),[N,U]=q(!1),[x,R]=q(null);pe(()=>{e.forceOpen!==void 0&&r(e.forceOpen)},[e.forceOpen]);let D=Ae(()=>Le(e.containerId),[e.containerId]),[P,B]=q(e.authToken||null),W=Ae(()=>ct(e,()=>({authToken:P,storage:D}),Y=>{let V=Y({authToken:P,storage:D});V.authToken!==P&&B(V.authToken)}),[e,P,D]),h=it(e,W,D),M=Ae(()=>{if(!e.showDevTools)return e;let _=h.getEffectiveAgentKey();return _&&_!==e.agentKey?{...e,agentKey:_}:e},[e,h.getEffectiveAgentKey]),p=tt(M,W,D),C=nt(e,W,D),b=at(e,W);pe(()=>{for(let _=p.messages.length-1;_>=0;_--){let z=p.messages[_];if(z.type==="sub_agent_start"){R({key:z.metadata?.subAgentKey,name:z.metadata?.agentName});return}if(z.type==="sub_agent_end"){R(null);return}}},[p.messages]),pe(()=>{let _=D.get(e.conversationIdKey);console.log("[ChatWidget] Initial load - storedConvId:",_,"key:",e.conversationIdKey),console.log("[ChatWidget] apiPaths.conversations:",e.apiPaths.conversations),_&&(console.log("[ChatWidget] Loading conversation:",_),p.loadConversation(_))},[]),pe(()=>{t&&t({isOpen:l,isExpanded:$,debugMode:f,messages:p.messages,conversationId:p.conversationId,isLoading:p.isLoading,error:p.error})},[l,$,f,p.messages,p.conversationId,p.isLoading,p.error]);let E=le(async()=>{if(e.showConversationSidebar){v(!0);try{let _=M.agentKey,z=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(_)}`,Y=await fetch(z,W.getFetchOptions({method:"GET"}));if(Y.ok){let V=await Y.json();S(V.results||V)}}catch(_){console.error("[ChatWidget] Failed to load conversations:",_),S([])}finally{v(!1)}}},[e,M,W]),d=le(()=>{let _=!u;k(_),_&&E()},[u,E]),A=le(_=>{_!==p.conversationId&&p.loadConversation(_),k(!1)},[p]),F=le(()=>{p.clearMessages(),k(!1)},[p]),o=le(_=>{p.sendMessage(_,{model:C.selectedModel,thinking:C.thinkingEnabled&&C.supportsThinking(),onAssistantMessage:z=>{}})},[p,T,C.selectedModel,C.thinkingEnabled,C.supportsThinking]),I=le(_=>{g(_),_==="tasks"&&b.loadTaskList()},[b]);if(pe(()=>{n&&(n.current={open:()=>r(!0),close:()=>r(!1),send:_=>o(_),clearMessages:()=>p.clearMessages(),toggleTTS:()=>m(_=>!_),stopSpeech:()=>U(!1),setAuth:_=>{_.token!==void 0&&B(_.token)},clearAuth:()=>B(null)})},[p,n,o]),!e.embedded&&!l)return G`
|
|
586
|
+
`}import{useState as ne,useCallback as te,useRef as Qe,useEffect as et}from"preact/hooks";function tt(e,t,s){let[n,l]=ne([]),[r,$]=ne(!1),[i,f]=ne(null),[y,u]=ne(()=>s?.get(e.conversationIdKey)||null),[k,c]=ne(!1),[S,a]=ne(!1),[g,w]=ne(0),v=Qe(null),T=Qe(null);et(()=>{y&&s?.set(e.conversationIdKey,y)},[y,e.conversationIdKey,s]);let m=te(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",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("assistant.message",o.payload);let I=o.payload.content;I&&(d+=I,l(K=>{let j=K[K.length-1];return j?.role==="assistant"&&j.id.startsWith("assistant-stream-")?[...K.slice(0,-1),{...j,content:d}]:[...K,{id:"assistant-stream-"+Date.now(),role:"assistant",content:d,timestamp:new Date,type:"message"}]}))}catch(o){console.error("[ChatWidget] Parse error:",o)}}),E.addEventListener("tool.call",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("tool.call",o.payload),l(I=>[...I,{id:"tool-call-"+Date.now(),role:"assistant",content:`\u{1F527} ${o.payload.name}`,timestamp:new Date,type:"tool_call",metadata:{toolName:o.payload.name,arguments:o.payload.arguments,toolCallId:o.payload.id}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),E.addEventListener("tool.result",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("tool.result",o.payload);let I=o.payload.result,K=I?.error;l(j=>[...j,{id:"tool-result-"+Date.now(),role:"system",content:K?`\u274C ${I.error}`:"\u2713 Done",timestamp:new Date,type:"tool_result",metadata:{toolName:o.payload.name,result:I,toolCallId:o.payload.tool_call_id}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),E.addEventListener("custom",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("custom",o.payload),o.payload?.type==="ui_control"&&e.onUIControl&&e.onUIControl(o.payload),o.payload?.type==="agent_context"&&l(I=>[...I,{id:"agent-context-"+Date.now(),role:"system",content:`\u{1F517} ${o.payload.agent_name||"Sub-agent"} is now handling this request`,timestamp:new Date,type:"agent_context",metadata:{agentKey:o.payload.agent_key,agentName:o.payload.agent_name,action:o.payload.action}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),E.addEventListener("sub_agent.start",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("sub_agent.start",o.payload),l(I=>[...I,{id:"sub-agent-start-"+Date.now(),role:"system",content:`\u{1F517} Delegating to ${o.payload.agent_name||o.payload.sub_agent_key||"sub-agent"}...`,timestamp:new Date,type:"sub_agent_start",metadata:{subAgentKey:o.payload.sub_agent_key,agentName:o.payload.agent_name,invocationMode:o.payload.invocation_mode}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}}),E.addEventListener("sub_agent.end",O=>{try{let o=JSON.parse(O.data);e.onEvent&&e.onEvent("sub_agent.end",o.payload),l(I=>[...I,{id:"sub-agent-end-"+Date.now(),role:"system",content:`\u2713 ${o.payload.agent_name||"Sub-agent"} completed`,timestamp:new Date,type:"sub_agent_end",metadata:{subAgentKey:o.payload.sub_agent_key,agentName:o.payload.agent_name}}])}catch(o){console.error("[ChatWidget] Parse error:",o)}});let A=O=>{try{let o=JSON.parse(O.data);if(e.onEvent&&e.onEvent(o.type,o.payload),o.type==="run.failed"){let I=o.payload.error||"Agent run failed";f(I),l(K=>[...K,{id:"error-"+Date.now(),role:"system",content:`\u274C Error: ${I}`,timestamp:new Date,type:"error"}])}}catch(o){console.error("[ChatWidget] Parse error:",o)}$(!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]),N=te(async(h,M={},p={})=>{if(!h.trim()||r)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:O}=b;$(!0),f(null);let o={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};l(I=>[...I,o]);try{let I=await t.getOrCreateSession(),K;if(C.length>0){let V=e.apiCaseStyle!=="camel",Fe=he=>V?Te(he):he,Q=new FormData;Q.append(Fe("agentKey"),e.agentKey),y&&Q.append(Fe("conversationId"),y),Q.append("messages",JSON.stringify([{role:"user",content:h.trim()}])),Q.append("metadata",JSON.stringify(V?{...e.metadata,journey_type:e.defaultJourneyType}:{...e.metadata,journeyType:e.defaultJourneyType})),E&&Q.append("model",E),d&&Q.append("thinking","true"),C.forEach(he=>{Q.append("files",he)}),K=t.getFetchOptions({method:"POST",body:Q},I)}else{let V=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},...O!==void 0&&{supersedeFromMessageIndex:O}});K=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(V)},I)}let j=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,K),_=I;if(j.status===401){t.clearSession();let V=await t.getOrCreateSession(!0);V&&(_=V,C.length>0?K=t.getFetchOptions({method:"POST",body:K.body},V):K=t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:K.body},V),j=await fetch(`${e.backendUrl}${e.apiPaths.runs}`,K))}if(!j.ok){let V=await j.json().catch(()=>({}));throw new Error(V.error||V.detail||`HTTP ${j.status}`)}let G=await j.json(),Y=t.transformResponse(G);T.current=Y.id,!y&&Y.conversationId&&u(Y.conversationId),await m(Y.id,_,A)}catch(I){f(I.message||"Failed to send message"),$(!1)}finally{T.current=null}},[e,t,y,r,m]),U=te(async()=>{let h=T.current;if(!(!h||!r))try{let M=e.apiPaths.cancelRun?e.apiPaths.cancelRun.replace("{runId}",h):`${e.apiPaths.runs}${h}/cancel/`;(await fetch(`${e.backendUrl}${M}`,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"}}))).ok&&(v.current&&(v.current.close(),v.current=null),$(!1),T.current=null,l(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,r]),x=te(()=>{l([]),u(null),f(null),c(!1),w(0),s?.set(e.conversationIdKey,null)},[e.conversationIdKey,s]),R=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"}},D=te(async h=>{console.log("[ChatWidget] loadConversation called with:",h),$(!0),l([]),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(R).filter(Boolean);console.log("[ChatWidget] Mapped messages:",A),l(A)}c(d.hasMore||!1),w(d.messages?.length||0)}else b.status===404?(console.log("[ChatWidget] Conversation not found, clearing"),u(null),s?.set(e.conversationIdKey,null)):console.error("[ChatWidget] Unexpected response status:",b.status)}catch(M){console.error("[ChatWidget] Failed to load conversation:",M)}finally{$(!1)}},[e,t,s]),P=te(async()=>{if(!(!y||S||!k)){a(!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(R).filter(Boolean);l(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{a(!1)}}},[e,t,y,g,S,k]),B=te(async(h,M,p={})=>{if(r)return;let C=n[h];if(!C||C.role!=="user")return;let b=n.slice(0,h);l(b),await N(M,{...p,supersedeFromMessageIndex:h})},[n,r,N]),H=te(async(h,M={})=>{if(r)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);l(E),await N(b.content,{...M,supersedeFromMessageIndex:C})},[n,r,N]);return et(()=>()=>{v.current&&v.current.close()},[]),{messages:n,isLoading:r,error:i,conversationId:y,hasMoreMessages:k,loadingMoreMessages:S,sendMessage:N,cancelRun:U,clearMessages:x,loadConversation:D,loadMoreMessages:P,setConversationId:u,editMessage:B,retryMessage:H}}import{useState as de,useEffect as _t,useCallback as be}from"preact/hooks";var st="cw_thinking_enabled";function nt(e,t,s){let[n,l]=de([]),[r,$]=de(null),[i,f]=de(null),[y,u]=de(!1),[k,c]=de(!1);_t(()=>{(async()=>{if(e.showModelSelector){u(!0);try{let T=await fetch(`${e.backendUrl}${e.apiPaths.models}`,t.getFetchOptions({method:"GET"}));if(T.ok){let m=await T.json(),N=m.models||[];l(N),f(m.default);let U=s?.get(e.modelKey);U&&N.some(R=>R.id===U)?$(U):$(m.default),s?.get(st)==="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=be(v=>{$(v),s?.set(e.modelKey,v)},[e.modelKey,s]),a=be(v=>{c(v),s?.set(st,v?"true":"false")},[s]),g=be(()=>n.find(v=>v.id===r)||null,[n,r]),w=be(()=>g()?.supports_thinking||!1,[g]);return{availableModels:n,selectedModel:r,defaultModel:i,isLoading:y,selectModel:S,getSelectedModelInfo:g,thinkingEnabled:k,toggleThinking:a,supportsThinking:w}}import{useState as Ie,useCallback as re}from"preact/hooks";function at(e,t){let[s,n]=Ie(null),[l,r]=Ie(!1),[$,i]=Ie(null),f=e.apiPaths?.tasks||"/api/agent/tasks/",y=re(async()=>{r(!0),i(null);try{let g=`${e.backendUrl}${f}`,w=await fetch(g,t.getFetchOptions({method:"GET"}));if(w.ok){let v=await w.json();n(v)}else{let v=await w.json().catch(()=>({}));i(v.error||"Failed to load tasks")}}catch(g){console.error("[useTasks] Failed to load task list:",g),i("Failed to load tasks")}finally{r(!1)}},[e.backendUrl,f,t]),u=re(async g=>{if(!s)return null;try{let w=`${e.backendUrl}${f}${s.id}/add_task/`,v=await fetch(w,t.getFetchOptions({method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)}));if(v.ok){let T=await v.json();return await y(),T}else{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to add task"),null}}catch(w){return console.error("[useTasks] Failed to add task:",w),i("Failed to add task"),null}},[e.backendUrl,f,s,t,y]),k=re(async(g,w)=>{if(!s)return null;try{let v=`${e.backendUrl}${f}${s.id}/update_task/${g}/`,T=await fetch(v,t.getFetchOptions({method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(w)}));if(T.ok){let m=await T.json();return await y(),m}else{let m=await T.json().catch(()=>({}));return i(m.error||"Failed to update task"),null}}catch(v){return console.error("[useTasks] Failed to update task:",v),i("Failed to update task"),null}},[e.backendUrl,f,s,t,y]),c=re(async g=>{if(!s)return!1;try{let w=`${e.backendUrl}${f}${s.id}/remove_task/${g}/`,v=await fetch(w,t.getFetchOptions({method:"DELETE"}));if(v.ok)return await y(),!0;{let T=await v.json().catch(()=>({}));return i(T.error||"Failed to remove task"),!1}}catch(w){return console.error("[useTasks] Failed to remove task:",w),i("Failed to remove task"),!1}},[e.backendUrl,f,s,t,y]),S=re(async()=>{if(!s)return!1;try{let g=`${e.backendUrl}${f}${s.id}/clear/`,w=await fetch(g,t.getFetchOptions({method:"POST"}));if(w.ok)return await y(),!0;{let v=await w.json().catch(()=>({}));return i(v.error||"Failed to clear tasks"),!1}}catch(g){return console.error("[useTasks] Failed to clear tasks:",g),i("Failed to clear tasks"),!1}},[e.backendUrl,f,s,t,y]),a=re(()=>i(null),[]);return{taskList:s,tasks:s?.tasks||[],progress:s?.progress||{total:0,completed:0,percent_complete:0},isLoading:l,error:$,loadTaskList:y,addTask:u,updateTask:k,removeTask:c,clearTasks:S,clearError:a}}import{useState as ae,useEffect as ot,useCallback as ue}from"preact/hooks";var rt="cw_selected_system",xe="cw_selected_agent",lt="cw_selected_system_version",Se="cw_selected_agent_version";function it(e,t,s){let[n,l]=ae([]),[r,$]=ae([]),[i,f]=ae(null),[y,u]=ae(null),[k,c]=ae(null),[S,a]=ae(null),[g,w]=ae(!1),v=ue(()=>{if(y)return y;if(i){let x=n.find(R=>R.slug===i);if(x?.entry_agent)return x.entry_agent.slug}return e.agentKey},[y,i,n,e.agentKey]);ot(()=>{if(!e.showDevTools)return;(async()=>{w(!0);try{let R=await fetch(`${e.backendUrl}${e.apiPaths.systems}`,t.getFetchOptions({method:"GET"}));if(R.ok){let D=await R.json(),P=D.results||D;l(P);let B=s?.get(rt);B&&P.some(H=>H.slug===B)?f(B):P.length===1&&f(P[0].slug)}}catch(R){console.warn("[ChatWidget] Failed to load systems:",R)}finally{w(!1)}})()},[e.backendUrl,e.apiPaths.systems,e.showDevTools,t,s]),ot(()=>{if(!e.showDevTools)return;(async()=>{try{let R=i?`?system=${encodeURIComponent(i)}`:"",D=await fetch(`${e.backendUrl}${e.apiPaths.agents}${R}`,t.getFetchOptions({method:"GET"}));if(D.ok){let P=await D.json(),B=P.results||P;$(B);let H=s?.get(xe);if(H&&B.some(M=>M.slug===H))u(H);else if(i){let M=n.find(p=>p.slug===i);M?.entry_agent&&u(M.entry_agent.slug)}let h=s?.get(Se);h&&a(h)}}catch(R){console.warn("[ChatWidget] Failed to load agents:",R)}})()},[e.backendUrl,e.apiPaths.agents,e.showDevTools,i,t,s,n]);let T=ue(x=>{f(x),s?.set(rt,x),u(null),a(null),s?.set(xe,null),s?.set(Se,null);let D=n.find(P=>P.slug===x)?.active_version||null;c(D),s?.set(lt,D)},[s,n]),m=ue(x=>{u(x),s?.set(xe,x);let D=r.find(P=>P.slug===x)?.active_version||null;a(D),s?.set(Se,D)},[s,r]),N=ue(x=>{c(x),s?.set(lt,x)},[s]),U=ue(x=>{a(x),s?.set(Se,x)},[s]);return{systems:n,agents:r,selectedSystem:i,selectedAgent:y,selectedSystemVersion:k,selectedAgentVersion:S,isLoading:g,selectSystem:T,selectAgent:m,selectSystemVersion:N,selectAgentVersion:U,getEffectiveAgentKey:v}}function ct(e,t,s){let n=u=>!u||typeof u!="object"||e.apiCaseStyle==="camel"?u:ge(u),l=u=>!u||typeof u!="object"||e.apiCaseStyle==="snake"?u:me(u),r=()=>e.authStrategy?e.authStrategy:e.authToken?"token":e.apiPaths.anonymousSession||e.anonymousSessionEndpoint?"anonymous":"none",$=(u=null)=>{let k=r(),c={},S=u||e.authToken||t().authToken;if(k==="token"&&S){let a=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Token";c[a]=g?`${g} ${S}`:S}else if(k==="jwt"&&S){let a=e.authHeader||"Authorization",g=e.authTokenPrefix!==void 0?e.authTokenPrefix:"Bearer";c[a]=g?`${g} ${S}`:S}else if(k==="anonymous"&&S){let a=e.authHeader||e.anonymousTokenHeader||"X-Anonymous-Token";c[a]=S}if(k==="session"){let a=Ne(e.csrfCookieName);a&&(c["X-CSRFToken"]=a)}return c};return{getAuthStrategy:r,getAuthHeaders:$,getFetchOptions:(u={},k=null)=>{let c=r(),S={...u},a=$(k);return console.log("[ChatWidget] getFetchOptions - strategy:",c,"overrideToken:",k,"authHeaders:",a),S.headers={...S.headers,...a},c==="session"&&(S.credentials="include"),S},getOrCreateSession:async(u=!1)=>{let k=r(),c=t(),S=e.anonymousTokenKey||e.sessionTokenKey;if(k!=="anonymous")return e.authToken||c.authToken;if(!u){if(c.authToken)return c.authToken;let a=c.storage?.get(S);if(a)return s(g=>({...g,authToken:a})),a}try{let a=e.anonymousSessionEndpoint||e.apiPaths.anonymousSession,g=await fetch(`${e.backendUrl}${a}`,{method:"POST",headers:{"Content-Type":"application/json"}});if(g.ok){let w=await g.json();return s(v=>({...v,authToken:w.token})),c.storage?.set(S,w.token),w.token}}catch(a){console.warn("[ChatWidget] Failed to create session:",a)}return null},clearSession:()=>{let u=e.anonymousTokenKey||e.sessionTokenKey,k=t();s(c=>({...c,authToken:null})),k.storage?.set(u,null)},transformRequest:n,transformResponse:l}}function dt({config:e,onStateChange:t,markdownParser:s,apiRef:n}){console.log("[ChatWidget] Config:",{showConversationSidebar:e.showConversationSidebar,apiPaths:e.apiPaths});let[l,r]=q(e.embedded||e.forceOpen===!0),[$,i]=q(!1),[f,y]=q(!1),[u,k]=q(!1),[c,S]=q([]),[a,g]=q("chat"),[w,v]=q(!1),[T,m]=q(e.enableTTS),[N,U]=q(!1),[x,R]=q(null);pe(()=>{e.forceOpen!==void 0&&r(e.forceOpen)},[e.forceOpen]);let D=Ae(()=>Le(e.containerId),[e.containerId]),[P,B]=q(e.authToken||null),H=Ae(()=>ct(e,()=>({authToken:P,storage:D}),Y=>{let V=Y({authToken:P,storage:D});V.authToken!==P&&B(V.authToken)}),[e,P,D]),h=it(e,H,D),M=Ae(()=>{if(!e.showDevTools)return e;let _=h.getEffectiveAgentKey();return _&&_!==e.agentKey?{...e,agentKey:_}:e},[e,h.getEffectiveAgentKey]),p=tt(M,H,D),C=nt(e,H,D),b=at(e,H);pe(()=>{for(let _=p.messages.length-1;_>=0;_--){let G=p.messages[_];if(G.type==="sub_agent_start"){R({key:G.metadata?.subAgentKey,name:G.metadata?.agentName});return}if(G.type==="sub_agent_end"){R(null);return}}},[p.messages]),pe(()=>{let _=D.get(e.conversationIdKey);console.log("[ChatWidget] Initial load - storedConvId:",_,"key:",e.conversationIdKey),console.log("[ChatWidget] apiPaths.conversations:",e.apiPaths.conversations),_&&(console.log("[ChatWidget] Loading conversation:",_),p.loadConversation(_))},[]),pe(()=>{t&&t({isOpen:l,isExpanded:$,debugMode:f,messages:p.messages,conversationId:p.conversationId,isLoading:p.isLoading,error:p.error})},[l,$,f,p.messages,p.conversationId,p.isLoading,p.error]);let E=le(async()=>{if(e.showConversationSidebar){v(!0);try{let _=M.agentKey,G=`${e.backendUrl}${e.apiPaths.conversations}?agent_key=${encodeURIComponent(_)}`,Y=await fetch(G,H.getFetchOptions({method:"GET"}));if(Y.ok){let V=await Y.json();S(V.results||V)}}catch(_){console.error("[ChatWidget] Failed to load conversations:",_),S([])}finally{v(!1)}}},[e,M,H]),d=le(()=>{let _=!u;k(_),_&&E()},[u,E]),A=le(_=>{_!==p.conversationId&&p.loadConversation(_),k(!1)},[p]),O=le(()=>{p.clearMessages(),k(!1)},[p]),o=le(_=>{p.sendMessage(_,{model:C.selectedModel,thinking:C.thinkingEnabled&&C.supportsThinking(),onAssistantMessage:G=>{}})},[p,T,C.selectedModel,C.thinkingEnabled,C.supportsThinking]),I=le(_=>{g(_),_==="tasks"&&b.loadTaskList()},[b]);if(pe(()=>{n&&(n.current={open:()=>r(!0),close:()=>r(!1),send:_=>o(_),clearMessages:()=>p.clearMessages(),toggleTTS:()=>m(_=>!_),stopSpeech:()=>U(!1),setAuth:_=>{_.token!==void 0&&B(_.token)},clearAuth:()=>B(null)})},[p,n,o]),!e.embedded&&!l)return z`
|
|
587
587
|
<button
|
|
588
588
|
class="cw-fab"
|
|
589
589
|
style=${{backgroundColor:e.primaryColor}}
|
|
@@ -593,37 +593,39 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
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 K=["cw-widget",$&&"cw-widget-expanded",e.embedded&&"cw-widget-embedded"].filter(Boolean).join(" "),j=e.headerTextColor||
|
|
596
|
+
`;let K=["cw-widget",$&&"cw-widget-expanded",e.embedded&&"cw-widget-embedded"].filter(Boolean).join(" "),j=e.headerTextColor||He(e.primaryColor);return z`
|
|
597
597
|
<div class=${K} style=${{"--cw-primary":e.primaryColor,"--cw-header-text":j}}>
|
|
598
|
-
${e.showConversationSidebar&&
|
|
598
|
+
${e.showConversationSidebar&&z`
|
|
599
599
|
<${Ge}
|
|
600
600
|
isOpen=${u}
|
|
601
601
|
conversations=${c}
|
|
602
602
|
conversationsLoading=${w}
|
|
603
603
|
currentConversationId=${p.conversationId}
|
|
604
604
|
onClose=${()=>k(!1)}
|
|
605
|
-
onNewConversation=${
|
|
605
|
+
onNewConversation=${O}
|
|
606
606
|
onSwitchConversation=${A}
|
|
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`
|
|
611
|
+
<${We}
|
|
612
|
+
config=${e}
|
|
613
|
+
debugMode=${f}
|
|
614
|
+
isExpanded=${$}
|
|
615
|
+
isSpeaking=${N}
|
|
616
|
+
messagesCount=${p.messages.length}
|
|
617
|
+
isLoading=${p.isLoading}
|
|
618
|
+
currentAgent=${x}
|
|
619
|
+
onClose=${()=>r(!1)}
|
|
620
|
+
onToggleExpand=${()=>i(!$)}
|
|
621
|
+
onToggleDebug=${()=>y(!f)}
|
|
622
|
+
onToggleTTS=${()=>m(!T)}
|
|
623
|
+
onClear=${p.clearMessages}
|
|
624
|
+
onToggleSidebar=${d}
|
|
625
|
+
/>
|
|
626
|
+
`}
|
|
625
627
|
|
|
626
|
-
${e.showDevTools&&
|
|
628
|
+
${e.showDevTools&&z`
|
|
627
629
|
<${Ze}
|
|
628
630
|
systems=${h.systems}
|
|
629
631
|
agents=${h.agents}
|
|
@@ -639,7 +641,7 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
639
641
|
/>
|
|
640
642
|
`}
|
|
641
643
|
|
|
642
|
-
${e.showTasksTab!==!1&&
|
|
644
|
+
${e.showTasksTab!==!1&&z`
|
|
643
645
|
<div class="cw-tabs">
|
|
644
646
|
<button
|
|
645
647
|
class=${`cw-tab ${a==="chat"?"cw-tab-active":""}`}
|
|
@@ -651,14 +653,14 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
651
653
|
class=${`cw-tab ${a==="tasks"?"cw-tab-active":""}`}
|
|
652
654
|
onClick=${()=>I("tasks")}
|
|
653
655
|
>
|
|
654
|
-
Tasks ${b.progress.total>0?
|
|
656
|
+
Tasks ${b.progress.total>0?z`<span class="cw-tab-badge">${b.progress.completed}/${b.progress.total}</span>`:""}
|
|
655
657
|
</button>
|
|
656
658
|
</div>
|
|
657
659
|
`}
|
|
658
660
|
|
|
659
|
-
${f&&
|
|
661
|
+
${f&&z`<div class="cw-status-bar"><span>🐛 Debug</span></div>`}
|
|
660
662
|
|
|
661
|
-
${a==="chat"?
|
|
663
|
+
${a==="chat"?z`
|
|
662
664
|
<${Je}
|
|
663
665
|
messages=${p.messages}
|
|
664
666
|
isLoading=${p.isLoading}
|
|
@@ -673,9 +675,9 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
673
675
|
emptyStateMessage=${e.emptyStateMessage}
|
|
674
676
|
/>
|
|
675
677
|
|
|
676
|
-
${p.error&&
|
|
678
|
+
${p.error&&z`<div class="cw-error-bar">${p.error}</div>`}
|
|
677
679
|
|
|
678
|
-
${e.showModelSelector&&C.availableModels.length>0&&
|
|
680
|
+
${e.showModelSelector&&C.availableModels.length>0&&z`
|
|
679
681
|
<${qe}
|
|
680
682
|
availableModels=${C.availableModels}
|
|
681
683
|
selectedModel=${C.selectedModel}
|
|
@@ -693,8 +695,9 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
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`
|
|
698
701
|
<${Xe}
|
|
699
702
|
tasks=${b.tasks}
|
|
700
703
|
progress=${b.progress}
|
|
@@ -707,9 +710,9 @@ var gt=Object.defineProperty;var ft=(e,t,s)=>t in e?gt(e,t,{enumerable:!0,config
|
|
|
707
710
|
/>
|
|
708
711
|
`}
|
|
709
712
|
</div>
|
|
710
|
-
`}var ut={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 pt(e){let t={...ut.apiPaths,...e.apiPaths||{}};return{...ut,...e,apiPaths:t}}var Ce=new Map,Et=0,
|
|
713
|
+
`}var ut={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 pt(e){let t={...ut.apiPaths,...e.apiPaths||{}};return{...ut,...e,apiPaths:t}}var Ce=new Map,Et=0,F=null,Re=class{constructor(t={}){Oe(this,"_handleStateChange",t=>{this._state=t});this.instanceId=`cw-${++Et}`,this.config=pt(t),this.container=null,this._state={},this._apiRef={current:null},Ce.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&&ht(Mt`<${dt}
|
|
711
714
|
config=${{...this.config,...t}}
|
|
712
715
|
onStateChange=${this._handleStateChange}
|
|
713
716
|
markdownParser=${De._enhancedMarkdownParser}
|
|
714
717
|
apiRef=${this._apiRef}
|
|
715
|
-
/>`,this.container)}destroy(){this.container&&(ht(null,this.container),this.config.containerId?this.container.classList.remove("cw-container-embedded"):this.container.remove(),this.container=null),Ce.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 mt(e={}){return new Re(e).init()}function It(e={}){return
|
|
718
|
+
/>`,this.container)}destroy(){this.container&&(ht(null,this.container),this.config.containerId?this.container.classList.remove("cw-container-embedded"):this.container.remove(),this.container=null),Ce.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 mt(e={}){return new Re(e).init()}function It(e={}){return F&&F.destroy(),F=mt(e),F}function xt(){F&&(F.destroy(),F=null)}function At(){F&&F.open()}function Rt(){F&&F.close()}function Dt(e){F&&F.send(e)}function Ft(){F&&F.clearMessages()}function Ot(){F&&F.toggleTTS()}function Pt(){F&&F.stopSpeech()}function Kt(e){F&&F.setAuth(e)}function Lt(){F&&F.clearAuth()}function Nt(){return F?F.getState():null}function Ht(){return F?F.getConfig():null}var De={createInstance:mt,getInstance:e=>Ce.get(e),getAllInstances:()=>Array.from(Ce.values()),init:It,destroy:xt,open:At,close:Rt,send:Dt,clearMessages:Ft,toggleTTS:Ot,stopSpeech:Pt,setAuth:Kt,clearAuth:Lt,getState:Nt,getConfig:Ht,_enhancedMarkdownParser:null};var Qs=De;typeof window<"u"&&(window.ChatWidget=De);export{De as ChatWidget,Qs as default};
|