@intelliweave/embedded 2.2.83 → 2.2.85

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.
@@ -1,37 +1,37 @@
1
- import Rt,{createContext as xi,useContext as Mi,useEffect as He,useMemo as Ii,useState as at}from"react";import Yt from"openai";import{v4 as zt}from"uuid";var O=class{constructor(){this.size=4096;this.groups=[]}createGroup(n){let e=new Je;return e.id=n,this.groups.push(e),e}group(n){return this.groups.find(e=>e.id===n)}static countTokensInText(n){return n==null?n="":typeof n=="number"?n=n+"":typeof n!="string"&&(n=JSON.stringify(n)),Math.ceil(n.length/3)}countTokens(){return this.groups.reduce((n,e)=>n+e.tokenCount,0)}removeOverflow(){let n=this.countTokens(),e=this.groups.reduce((t,i)=>t+i.weight,0);for(;n>this.size;){let t=this.groups.slice().sort((o,r)=>{let s=Math.floor(o.weight/e*this.size),l=Math.floor(r.weight/e*this.size),u=o.tokenCount-s;return r.tokenCount-l-u}),i=this.removeOneItem(t);if(!i)throw new Error("Too many items in the token window that cannot be removed.");n-=i.tokenCount}}removeOneItem(n){for(let e of n){let t=e.items.findIndex(o=>!o.cannotRemove);if(t===-1)continue;let i=e.items[t];return e.items.splice(t,1),e.tokenCount-=i.tokenCount,i}return null}},Je=class{constructor(){this.id="";this.items=[];this.weight=1;this.tokenCount=0;this.separator=`
2
- `;this.itemPadding=0;this.sortFunction=(n,e)=>n.sortOrder!==e.sortOrder?n.sortOrder-e.sortOrder:n.dateAdded!==e.dateAdded?n.dateAdded-e.dateAdded:0}setItemPadding(n){return this.itemPadding=n,this.recalculateTokens(),this}sortBy(n){return this.sortFunction=n,this.items.sort(this.sortFunction),this}setSeparator(n){return this.separator==n?this:(this.separator=n,this.recalculateTokens(),this)}setWeight(n){return this.weight=n,this}recalculateTokens(){this.tokenCount=this.items.reduce((n,e)=>(e.tokenCount=O.countTokensInText(typeof e.data=="string"?e.data:JSON.stringify(e.data))+O.countTokensInText(this.separator)+this.itemPadding,n+e.tokenCount),0)}add(n){typeof n=="string"&&(n={source:"user",data:n});let e=n;e.id===void 0&&(e.id=zt()),!e.sections?.length&&typeof e.data=="string"?e.text=e.data:e.text=e.sections?.map(i=>{if(i.type==="text")return i.text||"";if(i.type==="tool_call")return`[Tool Call: ${i.toolKbName||i.toolName}] `;if(i.type==="tool_result"&&i.toolErrorResponse)return`[Tool Error: ${i.toolErrorResponse}] `}).filter(i=>!!i).join(`
1
+ import _t,{createContext as Ni,useContext as Li,useEffect as $e,useMemo as Di,useState as ct}from"react";import Ht from"openai";import{v4 as Ft}from"uuid";var z=class{constructor(){this.size=4096;this.groups=[]}createGroup(i){let e=new Qe;return e.id=i,this.groups.push(e),e}group(i){return this.groups.find(e=>e.id===i)}static countTokensInText(i){return i==null?i="":typeof i=="number"?i=i+"":typeof i!="string"&&(i=JSON.stringify(i)),Math.ceil(i.length/3)}countTokens(){return this.groups.reduce((i,e)=>i+e.tokenCount,0)}removeOverflow(){let i=this.countTokens(),e=this.groups.reduce((t,n)=>t+n.weight,0);for(;i>this.size;){let t=this.groups.slice().sort((o,r)=>{let s=Math.floor(o.weight/e*this.size),l=Math.floor(r.weight/e*this.size),u=o.tokenCount-s;return r.tokenCount-l-u}),n=this.removeOneItem(t);if(!n)throw new Error("Too many items in the token window that cannot be removed.");i-=n.tokenCount}}removeOneItem(i){for(let e of i){let t=e.items.findIndex(o=>!o.cannotRemove);if(t===-1)continue;let n=e.items[t];return e.items.splice(t,1),e.tokenCount-=n.tokenCount,n}return null}},Qe=class{constructor(){this.id="";this.items=[];this.weight=1;this.tokenCount=0;this.separator=`
2
+ `;this.itemPadding=0;this.sortFunction=(i,e)=>i.sortOrder!==e.sortOrder?i.sortOrder-e.sortOrder:i.dateAdded!==e.dateAdded?i.dateAdded-e.dateAdded:0}setItemPadding(i){return this.itemPadding=i,this.recalculateTokens(),this}sortBy(i){return this.sortFunction=i,this.items.sort(this.sortFunction),this}setSeparator(i){return this.separator==i?this:(this.separator=i,this.recalculateTokens(),this)}setWeight(i){return this.weight=i,this}recalculateTokens(){this.tokenCount=this.items.reduce((i,e)=>(e.tokenCount=z.countTokensInText(typeof e.data=="string"?e.data:JSON.stringify(e.data))+z.countTokensInText(this.separator)+this.itemPadding,i+e.tokenCount),0)}add(i){typeof i=="string"&&(i={source:"user",data:i});let e=i;e.id===void 0&&(e.id=Ft()),!e.sections?.length&&typeof e.data=="string"?e.text=e.data:e.text=e.sections?.map(n=>{if(n.type==="text")return n.text||"";if(n.type==="tool_call")return`[Tool Call: ${n.toolKbName||n.toolName}] `;if(n.type==="tool_result"&&n.toolErrorResponse)return`[Tool Error: ${n.toolErrorResponse}] `}).filter(n=>!!n).join(`
3
3
 
4
- `)||"";let t=this.items.find(i=>i.id===e.id);return t?(this.tokenCount-=t.tokenCount,Object.assign(t,e),e=t):this.items.push(e),e.dateAdded===void 0&&(e.dateAdded=Date.now()),e.sortOrder===void 0&&(e.sortOrder=0),e.disabled===void 0&&(e.disabled=!1),e.source===void 0&&(e.source="user"),e.sections===void 0&&(e.sections=[]),e.tokenCount=e.disabled?0:O.countTokensInText(typeof n.data=="string"?n.data:JSON.stringify(n.data))+O.countTokensInText(this.separator)+this.itemPadding,this.tokenCount+=e.tokenCount,this.items.sort(this.sortFunction),e}remove(n){let e=this.items.findIndex(t=>t.id===n);return e===-1?!1:(this.tokenCount-=this.items[e].tokenCount||0,this.items.splice(e,1),!0)}getAllAsString(){return this.getAll().map(n=>n.text).join(this.separator)}getAll(){return this.items.filter(n=>!n.disabled)}empty(){this.items=[],this.tokenCount=0}};import{v4 as Vt}from"uuid";import{v4 as ut}from"uuid";function Se(a){let n=(a||"").split(`
5
- `);for(;n.length>0&&n[0].trim()=="";)n.shift();for(;n.length>0&&n[n.length-1].trim()=="";)n.pop();let e=1/0;for(let t of n){let i=t.match(/^\s*/)?.[0].length||0;e=Math.min(e,i)}return e>0&&e<1/0&&(n=n.map(t=>t.substring(e))),n.join(`
6
- `)}var Ot={};function V(){return typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:Ot}function b(){return V().intelliweave=V().intelliweave||V().webWeaver||{},V().intelliweave}function pt(){if(b().userID)return b().userID||"";if(typeof localStorage<"u"&&localStorage.getItem&&localStorage.setItem){let a=localStorage.getItem("intelliweave.uid")||"";return a||(a=ut(),localStorage.setItem("intelliweave.uid",a),a)}else return ut()}function ht(a){let n=a;if(n?.type=="object"&&n.properties)return a;let e={type:"object",properties:{},required:[]};if(a&&Array.isArray(a)){let t=a;for(let i of t)e.properties[i.name]={type:i.type||"string",description:i.description||""}}return e}var Te=class Te{constructor(n){this.module="IntelliWeave";this.module=n}get debugEnabled(){return Te.debug?!0:typeof window<"u"&&b().debug}log(...n){this.debugEnabled&&console.log(`[IntelliWeave > ${this.module}]`,...n)}debug(...n){this.debugEnabled&&console.debug(`[IntelliWeave > ${this.module}]`,...n)}info(...n){this.debugEnabled&&console.info(`[IntelliWeave > ${this.module}]`,...n)}warn(...n){console.warn(`[IntelliWeave > ${this.module}]`,...n)}error(...n){console.error(`[IntelliWeave > ${this.module}]`,...n)}timer(n,...e){let t=Date.now();return this.debug(`[${n} 0ms] Started`,...e),(...i)=>this.debug(`[${n} ${Math.floor(Date.now()-t)}ms]`,...i)}};Te.debug=!1;var f=Te;var mt=new f("ChatBase"),ie=class{constructor(n){this.id="";this.metadata={};this.maxToolCallsPerMessage=10;this.stats={tokensUsed:0};this.tokenWindow=(()=>{let n=new O;return n.createGroup("context").setSeparator(`
4
+ `)||"";let t=this.items.find(n=>n.id===e.id);return t?(this.tokenCount-=t.tokenCount,Object.assign(t,e),e=t):this.items.push(e),e.dateAdded===void 0&&(e.dateAdded=Date.now()),e.sortOrder===void 0&&(e.sortOrder=0),e.disabled===void 0&&(e.disabled=!1),e.source===void 0&&(e.source="user"),e.sections===void 0&&(e.sections=[]),e.tokenCount=e.disabled?0:z.countTokensInText(typeof i.data=="string"?i.data:JSON.stringify(i.data))+z.countTokensInText(this.separator)+this.itemPadding,this.tokenCount+=e.tokenCount,this.items.sort(this.sortFunction),e}remove(i){let e=this.items.findIndex(t=>t.id===i);return e===-1?!1:(this.tokenCount-=this.items[e].tokenCount||0,this.items.splice(e,1),!0)}getAllAsString(){return this.getAll().map(i=>i.text).join(this.separator)}getAll(){return this.items.filter(i=>!i.disabled)}empty(){this.items=[],this.tokenCount=0}};import{v4 as Kt}from"uuid";import{v4 as mt}from"uuid";function Ce(a){let i=(a||"").split(`
5
+ `);for(;i.length>0&&i[0].trim()=="";)i.shift();for(;i.length>0&&i[i.length-1].trim()=="";)i.pop();let e=1/0;for(let t of i){let n=t.match(/^\s*/)?.[0].length||0;e=Math.min(e,n)}return e>0&&e<1/0&&(i=i.map(t=>t.substring(e))),i.join(`
6
+ `)}var Ut={};function O(){return typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:Ut}function b(){return O().intelliweave=O().intelliweave||O().webWeaver||{},O().intelliweave}function gt(){if(b().userID)return b().userID||"";if(typeof localStorage<"u"&&localStorage.getItem&&localStorage.setItem){let a=localStorage.getItem("intelliweave.uid")||"";return a||(a=mt(),localStorage.setItem("intelliweave.uid",a),a)}else return mt()}function ft(a){let i=a;if(i?.type=="object"&&i.properties)return a;let e={type:"object",properties:{},required:[]};if(a&&Array.isArray(a)){let t=a;for(let n of t)e.properties[n.name]={type:n.type||"string",description:n.description||""}}return e}var Ee=class Ee{constructor(i){this.module="IntelliWeave";this.module=i}get debugEnabled(){return Ee.debug?!0:typeof window<"u"&&b().debug}log(...i){this.debugEnabled&&console.log(`[IntelliWeave > ${this.module}]`,...i)}debug(...i){this.debugEnabled&&console.debug(`[IntelliWeave > ${this.module}]`,...i)}info(...i){this.debugEnabled&&console.info(`[IntelliWeave > ${this.module}]`,...i)}warn(...i){console.warn(`[IntelliWeave > ${this.module}]`,...i)}error(...i){console.error(`[IntelliWeave > ${this.module}]`,...i)}timer(i,...e){let t=Date.now();return this.debug(`[${i} 0ms] Started`,...e),(...n)=>this.debug(`[${i} ${Math.floor(Date.now()-t)}ms]`,...n)}};Ee.debug=!1;var g=Ee;var bt=new g("ChatBase"),ee=class{constructor(i){this.id="";this.metadata={};this.maxToolCallsPerMessage=10;this.stats={tokensUsed:0};this.tokenWindow=(()=>{let i=new z;return i.createGroup("context").setSeparator(`
7
7
 
8
- `),n.createGroup("actions").setItemPadding(25),n.createGroup("messages").setItemPadding(10),n})();this.config=n,this.tokenWindow.size=this.config.maxTokens||16e3}get contextGroup(){return this.tokenWindow.group("context")}get toolGroup(){return this.tokenWindow.group("actions")}get messageGroup(){return this.tokenWindow.group("messages")}getBaseURL(){if(!this.config.endpoint)return;let n=this.config.endpoint;return n.endsWith("/chat/completions")&&(n=n.substring(0,n.length-17)),n}async sendMessage(n,e){throw new Error("Not implemented")}addUserMessage(n){throw new Error("Not implemented")}addAssistantMessage(n){throw new Error("Not implemented")}addTextMessage(n,e,t){this.messageGroup.add({id:"msg-"+Vt(),source:e,data:t,sections:[{type:"text",text:n}]})}onBeforeIncomingMessage(n){}resetConversation(){this.messageGroup.empty(),this.toolGroup.empty(),this.contextGroup.empty()}async trimMessages(){this.tokenWindow.removeOverflow()}registerTool(n){return this.toolGroup.add({id:n.name,data:n,cannotRemove:!n.canRemove,sortOrder:101,disabled:!!n.kbItem?.disabled})}findToolBySafeName(n){return this.toolGroup.getAll().find(e=>e.id==n||e.data?.kbItem?.name==n)?.data}async executeTool(n,e){if(!n)throw new Error("Tool not found");mt.debug(`Executing tool '${n.name}'`,e,n),this.config.onAIToolStart?.(n.kbItem?.name||n.name,e);let t;try{t=await n.callback(e)}catch(i){throw mt.error(`Error executing tool '${n.name}'`,i),i}return typeof t!="string"&&(t=JSON.stringify(t)||""),(t===""||t==="undefined")&&(t="success"),t}};import{v4 as Ft}from"uuid";var $e=new f("ChatGPT"),Ce=class extends ie{addUserMessage(n){this.addTextMessage(n,"user",{role:"user",content:n||""})}addAssistantMessage(n){this.addTextMessage(n,"assistant",{role:"assistant",content:n||""})}createOpenAIClient(){return new Yt({apiKey:this.config.apiKey,baseURL:this.getBaseURL(),dangerouslyAllowBrowser:!0})}async sendMessage(n,e){this.addUserMessage(n);let t=this.createOpenAIClient(),i=!0,o=[];for(;i;){let r="msg-"+Ft();i=!1,await this.config.onBeforeMessageProcessing?.(),await this.trimMessages(),$e.debug("Before processing state",{messages:this.messageGroup.getAll().map(d=>d.data),tools:this.toolGroup.getAll().map(d=>d.data),context:this.contextGroup.getAll().map(d=>d.text)});let s=this.toolGroup.getAll().filter(d=>!!d?.data).map(d=>({type:"function",function:{name:d.data.name,description:d.data.description||"",parameters:{type:"object",...d.data?.params}}})),l,u;if(this.config.stream){let d=t.chat.completions.stream({model:this.config.model,messages:[{role:"system",content:this.contextGroup.getAllAsString()},...this.messageGroup.getAll().map(h=>h.data)],tools:s,stream:!0,parallel_tool_calls:!0,stream_options:{include_usage:!0}});for await(let h of d){let p=d.currentChatCompletionSnapshot?.choices?.[0]?.message;if(!p)continue;let m=this.parseMessageBlock(r,p,void 0,!0);this.config.onAIMessage?.([...o,m],!0),e?.([...o,m])}l=await d.finalMessage(),u=await d.totalUsage()}else{let d=await t.chat.completions.create({model:this.config.model,messages:[{role:"system",content:this.contextGroup.getAllAsString()},...this.messageGroup.getAll().map(h=>h.data)],tools:s,parallel_tool_calls:!0});l=d.choices[0].message,u=d.usage}l.role=="assistant"&&!l.content&&!l.tool_calls?.length&&(l.content=""),$e.debug("Message received",l);let c=this.messageGroup.add(this.parseMessageBlock(r,l,u,!1));o.push(c),await Promise.all((l.tool_calls||[]).map(async d=>{if(d.type!="function")return;let h=this.findToolBySafeName(d.function.name);try{let p=null;try{p=d.function.arguments?JSON.parse(d.function.arguments):null}catch(y){throw new Error(`The AI provided invalid JSON arguments for tool call ${d.function.name}: ${y.message}`)}let m=await this.executeTool(h,p),g=this.messageGroup.add({source:"user",sections:[{type:"tool_result",toolName:d.function.name,toolKbID:h?.kbItem?.id,toolKbName:h?.kbItem?.name,toolSuccessResponse:m,toolCallInstanceID:d.id,toolCallHiddenInUI:h?.kbItem?.hideActionInUI}],data:{role:"tool",tool_call_id:d.id,content:m}});o.push(g)}catch(p){let m=p?.message||"An unknown error occurred",g=this.messageGroup.add({source:"user",sections:[{type:"tool_result",toolName:d.function.name,toolKbID:h?.kbItem?.id,toolKbName:h?.kbItem?.name,toolErrorResponse:m,toolCallInstanceID:d.id,toolCallHiddenInUI:h?.kbItem?.hideActionInUI}],data:{role:"tool",tool_call_id:d.id,content:`Error performing tool call ${d.function.name}: ${m}`}});o.push(g)}i=!0,this.config.onAIMessage?.(o,!0),e?.(o)})),this.stats.tokensUsed+=u?.total_tokens||0}return this.config.onAIMessage?.(o,!1),e?.(o),o}parseMessageBlock(n,e,t,i){let o=[];e.reasoning&&o.push({type:"thinking",text:e.reasoning});for(let r of e.tool_calls||[]){if(r.type!="function")continue;let s=this.findToolBySafeName(r.function.name),l=null;if(r.function.arguments)try{l=JSON.parse(r.function.arguments)}catch(u){i||$e.error(`Failed to parse tool parameters for tool call ${r.function.name}:`,u)}o.push({type:"tool_call",toolName:r.function.name,toolKbID:s?.kbItem?.id,toolKbName:s?.kbItem?.name,toolCallInstanceID:r.id,toolCallHiddenInUI:s?.kbItem?.hideActionInUI,toolParameters:l})}return typeof e.content=="string"&&o.push({type:"text",text:e.content||""}),{id:n,data:e,sections:o,source:"assistant",streamingInProgress:i,usage:{inputTokens:t?.prompt_tokens||0,outputTokens:t?.completion_tokens||0,cachedInputTokens:0,totalTokens:(t?.prompt_tokens||0)+(t?.completion_tokens||0)}}}async trimMessages(){for(await super.trimMessages();this.messageGroup.items.length&&this.messageGroup.items[0].data?.role=="tool";)this.messageGroup.items.shift()}};import Ut from"@anthropic-ai/sdk";import{v4 as Kt}from"uuid";var gt=new f("AnthropicChat"),Ee=class extends ie{addUserMessage(n){this.addTextMessage(n,"user",{role:"user",content:n||""})}addAssistantMessage(n){this.addTextMessage(n,"assistant",{role:"assistant",content:n||""})}async sendMessage(n,e){this.addUserMessage(n);let t=new Ut({apiKey:this.config.apiKey,baseURL:this.getBaseURL(),dangerouslyAllowBrowser:!0}),i=!0,o=[];for(;i;){i=!1,await this.config.onBeforeMessageProcessing?.(),await this.trimMessages(),gt.debug("Before processing state",{messages:this.messageGroup.getAll().map(c=>c.data),tools:this.toolGroup.getAll().map(c=>c.data),context:this.contextGroup.getAll().map(c=>c.text)});let r=this.toolGroup.getAll().map(c=>({name:c.data?.name||"",description:c.data?.description||"",input_schema:{...c.data?.params,type:"object"}})),s;if(this.config.stream){let c=t.messages.stream({model:this.config.model,max_tokens:16e3,system:this.contextGroup.getAllAsString(),messages:this.messageGroup.getAll().map(d=>d.data),tools:r,stream:!0});c.on("streamEvent",(d,h)=>{let p=this.parseMessageBlock(h,!0);this.config.onAIMessage?.([...o,p],!0),e?.([...o,p])});try{s=await c.finalMessage()}catch(d){throw d?.error?.error?.message?d.error.error:d}}else try{s=await t.messages.create({model:this.config.model,max_tokens:16e3,system:this.contextGroup.getAllAsString(),messages:this.messageGroup.items.map(c=>c.data),tools:r})}catch(c){throw c?.error?.error?.message?c.error.error:c}if(gt.debug("Message received",s),s.content?.length){let c=this.messageGroup.add(this.parseMessageBlock(s,!1));o.push(c)}let l=[],u=[];if(await Promise.all(s.content.map(async c=>{if(c.type!="tool_use")return;let d=this.findToolBySafeName(c.name);try{let h=await this.executeTool(d,c.input);u.push({type:"tool_result",tool_use_id:c.id,content:h}),l.push({type:"tool_result",toolKbID:d?.kbItem?.id,toolKbName:d?.kbItem?.name,toolName:c.name,toolSuccessResponse:h,toolCallInstanceID:c.id,toolCallHiddenInUI:d?.kbItem?.hideActionInUI})}catch(h){let p=h?.message||"An unknown error occurred";u.push({type:"tool_result",tool_use_id:c.id,content:`Error performing tool call ${c.name}: ${p}`}),l.push({type:"tool_result",toolKbID:d?.kbItem?.id,toolKbName:d?.kbItem?.name,toolName:c.name,toolErrorResponse:p,toolCallInstanceID:c.id,toolCallHiddenInUI:d?.kbItem?.hideActionInUI})}})),u.length>0){let c=this.messageGroup.add({id:"msg-"+Kt(),sections:l,data:{role:"user",content:u}});o.push(c),i=!0,this.config.onAIMessage?.(o,!0),e?.(o)}this.stats.tokensUsed+=s.usage.input_tokens+s.usage.output_tokens}return this.config.onAIMessage?.(o,!1),e?.(o),o}parseMessageBlock(n,e){let t=[];for(let i of n.content)if(i.type=="thinking")t.push({type:"thinking",text:i.thinking||""});else if(i.type=="text")t.push({type:"text",text:i.text||""});else if(i.type=="tool_use"){let o=this.findToolBySafeName(i.name);t.push({type:"tool_call",toolName:i.name,toolKbID:o?.kbItem?.id,toolKbName:o?.kbItem?.name,toolParameters:i.input,toolCallInstanceID:i.id,toolCallHiddenInUI:o?.kbItem?.hideActionInUI})}return{id:n.id,data:{role:n.role,content:n.content},sections:t,source:"assistant",streamingInProgress:e,usage:{inputTokens:n.usage?.input_tokens||0,outputTokens:n.usage?.output_tokens||0,cachedInputTokens:n.usage?.cache_read_input_tokens||0,totalTokens:(n.usage?.input_tokens||0)+(n.usage?.output_tokens||0)}}}async trimMessages(){for(await super.trimMessages();this.messageGroup.items[0]?.data?.content?.type=="tool_result";)this.messageGroup.items.shift()}};import{v4 as yt}from"uuid";import ni from"minisearch";var ft=a=>[{id:"search",type:"action",name:"Search the knowledge base.",content:"Search the knowledge base for information, actions, tools, tours, UI elements, etc. Use this on EVERY request if you don't have information. If the user asks for personal information, use this. If the user asks you to do something, use this to find the tool you need.",isContext:!0,hideActionInUI:"after-complete",disabled:!a?.knowledgeBase?.allowRagSearch,parameters:[{name:"query",type:"string",description:"The search query"}],action:async(n,e)=>{let t=await e.knowledgeBase.search(n.query),i=e;i._lastKBsearch=n.query,i._nextRequestUseKBitems=t;let o=t.filter(s=>s.type!="action").map(s=>"- "+s.name).join(`
8
+ `),i.createGroup("actions").setItemPadding(25),i.createGroup("messages").setItemPadding(10),i})();this.config=i,this.tokenWindow.size=this.config.maxTokens||16e3}get contextGroup(){return this.tokenWindow.group("context")}get toolGroup(){return this.tokenWindow.group("actions")}get messageGroup(){return this.tokenWindow.group("messages")}getBaseURL(){if(!this.config.endpoint)return;let i=this.config.endpoint;return i.endsWith("/chat/completions")&&(i=i.substring(0,i.length-17)),i}async sendMessage(i,e){throw new Error("Not implemented")}addUserMessage(i){throw new Error("Not implemented")}addAssistantMessage(i){throw new Error("Not implemented")}addTextMessage(i,e,t){this.messageGroup.add({id:"msg-"+Kt(),source:e,data:t,sections:[{type:"text",text:i}]})}onBeforeIncomingMessage(i){}resetConversation(){this.messageGroup.empty(),this.toolGroup.empty(),this.contextGroup.empty()}async trimMessages(){this.tokenWindow.removeOverflow()}getProviderErrorMessage(i){let e=[i?.error?.error?.message,i?.error?.message,i?.message];for(let o of e)if(typeof o=="string"&&o.trim())return o.trim();if(typeof i=="string"&&i.trim())return i.trim();let t=i?.status||i?.statusCode,n=i?.code||i?.type;if(t||n)return[t,n].filter(Boolean).join(" ");try{let o=JSON.stringify(i,null,2);if(o&&o!="{}")return o}catch{}return"Unknown provider error"}createProviderError(i,e){let t=this.getProviderErrorMessage(e),n=new Error(`${i} error: ${t}`);return n.cause=e,n}registerTool(i){return this.toolGroup.add({id:i.name,data:i,cannotRemove:!i.canRemove,sortOrder:101,disabled:!!i.kbItem?.disabled})}findToolBySafeName(i){return this.toolGroup.getAll().find(e=>e.id==i||e.data?.kbItem?.name==i)?.data}async executeTool(i,e){if(!i)throw new Error("Tool not found");bt.debug(`Executing tool '${i.name}'`,e,i),this.config.onAIToolStart?.(i.kbItem?.name||i.name,e);let t;try{t=await i.callback(e)}catch(n){throw bt.error(`Error executing tool '${i.name}'`,n),n}return typeof t!="string"&&(t=JSON.stringify(t)||""),(t===""||t==="undefined")&&(t="success"),t}};import{v4 as Jt}from"uuid";var qe=new g("ChatGPT"),Ae=class extends ee{addUserMessage(i){this.addTextMessage(i,"user",{role:"user",content:i||""})}addAssistantMessage(i){this.addTextMessage(i,"assistant",{role:"assistant",content:i||""})}createOpenAIClient(){return new Ht({apiKey:this.config.apiKey,baseURL:this.getBaseURL(),dangerouslyAllowBrowser:!0})}async sendMessage(i,e){this.addUserMessage(i);let t=this.createOpenAIClient(),n=!0,o=[];for(;n;){let r="msg-"+Jt();n=!1,await this.config.onBeforeMessageProcessing?.(),await this.trimMessages(),qe.debug("Before processing state",{messages:this.messageGroup.getAll().map(d=>d.data),tools:this.toolGroup.getAll().map(d=>d.data),context:this.contextGroup.getAll().map(d=>d.text)});let s=this.toolGroup.getAll().filter(d=>!!d?.data).map(d=>({type:"function",function:{name:d.data.name,description:d.data.description||"",parameters:{type:"object",...d.data?.params}}})),l,u;if(this.config.stream)try{let d=t.chat.completions.stream({model:this.config.model,messages:[{role:"system",content:this.contextGroup.getAllAsString()},...this.messageGroup.getAll().map(h=>h.data)],tools:s,stream:!0,parallel_tool_calls:!0,stream_options:{include_usage:!0}});for await(let h of d){let p=d.currentChatCompletionSnapshot?.choices?.[0]?.message;if(!p)continue;let m=this.parseMessageBlock(r,p,void 0,!0);this.config.onAIMessage?.([...o,m],!0),e?.([...o,m])}l=await d.finalMessage(),u=await d.totalUsage()}catch(d){throw this.createProviderError("ChatGPT provider",d)}else try{let d=await t.chat.completions.create({model:this.config.model,messages:[{role:"system",content:this.contextGroup.getAllAsString()},...this.messageGroup.getAll().map(h=>h.data)],tools:s,parallel_tool_calls:!0});l=d.choices[0].message,u=d.usage}catch(d){throw this.createProviderError("ChatGPT provider",d)}l.role=="assistant"&&!l.content&&!l.tool_calls?.length&&(l.content=""),qe.debug("Message received",l);let c=this.messageGroup.add(this.parseMessageBlock(r,l,u,!1));o.push(c),await Promise.all((l.tool_calls||[]).map(async d=>{if(d.type!="function")return;let h=this.findToolBySafeName(d.function.name);try{let p=null;try{p=d.function.arguments?JSON.parse(d.function.arguments):null}catch(y){throw new Error(`The AI provided invalid JSON arguments for tool call ${d.function.name}: ${y.message}`)}let m=await this.executeTool(h,p),f=this.messageGroup.add({source:"user",sections:[{type:"tool_result",toolName:d.function.name,toolKbID:h?.kbItem?.id,toolKbName:h?.kbItem?.name,toolSuccessResponse:m,toolCallInstanceID:d.id,toolCallHiddenInUI:h?.kbItem?.hideActionInUI}],data:{role:"tool",tool_call_id:d.id,content:m}});o.push(f)}catch(p){let m=p?.message||"An unknown error occurred",f=this.messageGroup.add({source:"user",sections:[{type:"tool_result",toolName:d.function.name,toolKbID:h?.kbItem?.id,toolKbName:h?.kbItem?.name,toolErrorResponse:m,toolCallInstanceID:d.id,toolCallHiddenInUI:h?.kbItem?.hideActionInUI}],data:{role:"tool",tool_call_id:d.id,content:`Error performing tool call ${d.function.name}: ${m}`}});o.push(f)}n=!0,this.config.onAIMessage?.(o,!0),e?.(o)})),this.stats.tokensUsed+=u?.total_tokens||0}return this.config.onAIMessage?.(o,!1),e?.(o),o}parseMessageBlock(i,e,t,n){let o=[];e.reasoning&&o.push({type:"thinking",text:e.reasoning});for(let r of e.tool_calls||[]){if(r.type!="function")continue;let s=this.findToolBySafeName(r.function.name),l=null;if(r.function.arguments)try{l=JSON.parse(r.function.arguments)}catch(u){n||qe.error(`Failed to parse tool parameters for tool call ${r.function.name}:`,u)}o.push({type:"tool_call",toolName:r.function.name,toolKbID:s?.kbItem?.id,toolKbName:s?.kbItem?.name,toolCallInstanceID:r.id,toolCallHiddenInUI:s?.kbItem?.hideActionInUI,toolParameters:l})}return typeof e.content=="string"&&o.push({type:"text",text:e.content||""}),{id:i,data:e,sections:o,source:"assistant",streamingInProgress:n,usage:{inputTokens:t?.prompt_tokens||0,outputTokens:t?.completion_tokens||0,cachedInputTokens:0,totalTokens:(t?.prompt_tokens||0)+(t?.completion_tokens||0)}}}async trimMessages(){for(await super.trimMessages();this.messageGroup.items.length&&this.messageGroup.items[0].data?.role=="tool";)this.messageGroup.items.shift()}};import $t from"@anthropic-ai/sdk";import{v4 as Qt}from"uuid";var yt=new g("AnthropicChat"),Ne=class extends ee{addUserMessage(i){this.addTextMessage(i,"user",{role:"user",content:i||""})}addAssistantMessage(i){this.addTextMessage(i,"assistant",{role:"assistant",content:i||""})}async sendMessage(i,e){this.addUserMessage(i);let t=new $t({apiKey:this.config.apiKey,baseURL:this.getBaseURL(),dangerouslyAllowBrowser:!0}),n=!0,o=[];for(;n;){n=!1,await this.config.onBeforeMessageProcessing?.(),await this.trimMessages(),yt.debug("Before processing state",{messages:this.messageGroup.getAll().map(c=>c.data),tools:this.toolGroup.getAll().map(c=>c.data),context:this.contextGroup.getAll().map(c=>c.text)});let r=this.toolGroup.getAll().map(c=>({name:c.data?.name||"",description:c.data?.description||"",input_schema:{...c.data?.params,type:"object"}})),s;if(this.config.stream){let c=t.messages.stream({model:this.config.model,max_tokens:16e3,system:this.contextGroup.getAllAsString(),messages:this.messageGroup.getAll().map(d=>d.data),tools:r,stream:!0});c.on("streamEvent",(d,h)=>{let p=this.parseMessageBlock(h,!0);this.config.onAIMessage?.([...o,p],!0),e?.([...o,p])});try{s=await c.finalMessage()}catch(d){throw this.createProviderError("Anthropic provider",d)}}else try{s=await t.messages.create({model:this.config.model,max_tokens:16e3,system:this.contextGroup.getAllAsString(),messages:this.messageGroup.items.map(c=>c.data),tools:r})}catch(c){throw this.createProviderError("Anthropic provider",c)}if(yt.debug("Message received",s),s.content?.length){let c=this.messageGroup.add(this.parseMessageBlock(s,!1));o.push(c)}let l=[],u=[];if(await Promise.all(s.content.map(async c=>{if(c.type!="tool_use")return;let d=this.findToolBySafeName(c.name);try{let h=await this.executeTool(d,c.input);u.push({type:"tool_result",tool_use_id:c.id,content:h}),l.push({type:"tool_result",toolKbID:d?.kbItem?.id,toolKbName:d?.kbItem?.name,toolName:c.name,toolSuccessResponse:h,toolCallInstanceID:c.id,toolCallHiddenInUI:d?.kbItem?.hideActionInUI})}catch(h){let p=h?.message||"An unknown error occurred";u.push({type:"tool_result",tool_use_id:c.id,content:`Error performing tool call ${c.name}: ${p}`}),l.push({type:"tool_result",toolKbID:d?.kbItem?.id,toolKbName:d?.kbItem?.name,toolName:c.name,toolErrorResponse:p,toolCallInstanceID:c.id,toolCallHiddenInUI:d?.kbItem?.hideActionInUI})}})),u.length>0){let c=this.messageGroup.add({id:"msg-"+Qt(),sections:l,data:{role:"user",content:u}});o.push(c),n=!0,this.config.onAIMessage?.(o,!0),e?.(o)}this.stats.tokensUsed+=s.usage.input_tokens+s.usage.output_tokens}return this.config.onAIMessage?.(o,!1),e?.(o),o}parseMessageBlock(i,e){let t=[];for(let n of i.content)if(n.type=="thinking")t.push({type:"thinking",text:n.thinking||""});else if(n.type=="text")t.push({type:"text",text:n.text||""});else if(n.type=="tool_use"){let o=this.findToolBySafeName(n.name);t.push({type:"tool_call",toolName:n.name,toolKbID:o?.kbItem?.id,toolKbName:o?.kbItem?.name,toolParameters:n.input,toolCallInstanceID:n.id,toolCallHiddenInUI:o?.kbItem?.hideActionInUI})}return{id:i.id,data:{role:i.role,content:i.content},sections:t,source:"assistant",streamingInProgress:e,usage:{inputTokens:i.usage?.input_tokens||0,outputTokens:i.usage?.output_tokens||0,cachedInputTokens:i.usage?.cache_read_input_tokens||0,totalTokens:(i.usage?.input_tokens||0)+(i.usage?.output_tokens||0)}}}async trimMessages(){for(await super.trimMessages();this.messageGroup.items[0]?.data?.content?.type=="tool_result";)this.messageGroup.items.shift()}};import{v4 as Mt}from"uuid";import li from"minisearch";var wt=a=>[{id:"search",type:"action",name:"Search the knowledge base.",content:"Search the knowledge base for information, actions, tools, tours, UI elements, etc. Use this on EVERY request if you don't have information. If the user asks for personal information, use this. If the user asks you to do something, use this to find the tool you need.",isContext:!0,hideActionInUI:"after-complete",disabled:!a?.knowledgeBase?.allowRagSearch,parameters:[{name:"query",type:"string",description:"The search query"}],action:async(i,e)=>{let t=await e.knowledgeBase.search(i.query),n=e;n._lastKBsearch=i.query,n._nextRequestUseKBitems=t;let o=t.filter(s=>s.type!="action").map(s=>"- "+s.name).join(`
9
9
  `)||"- (none)",r=t.filter(s=>s.type=="action").map(s=>"- "+s._functionID).join(`
10
10
  `)||"- (none)";return`Search complete, context has been updated.
11
11
  New information found:
12
12
  ${o}
13
13
 
14
14
  New tools available:
15
- ${r}`}},{id:"ui.openURL",type:"action",name:"Open a URL in a new tab.",tags:"open, url, website, navigate, visit, go to, new tab, browser",isContext:!0,disabled:typeof window>"u"||!a?.flags?.allowOpenNewTab,content:"Opens the specified URL in a new tab. Use this when the user asks to open a website, visit a URL, go to a page, or navigate to a specific website. Only available when allowOpenNewTab flag is enabled.",parameters:[{name:"url",type:"string",description:"The URL to open in a new tab"}],action:(n,e)=>{if(typeof window>"u")throw new Error("This action is only available in browser environments.");if(!e.flags.allowOpenNewTab)throw new Error("Open New Tab action is not enabled for this persona.");if(!n.url||typeof n.url!="string")throw new Error("URL parameter is required and must be a string.");if(!window.open(n.url,"_blank"))throw new Error("Window blocked by popup blocker. Please allow popups for this site.");return`Opened URL: ${n.url}`}},{id:"ui.changeRoute",type:"action",name:"Change the current page route.",tags:"navigate, route, path, page, go to, change page, routing, navigation",isContext:!0,disabled:typeof window>"u"||!a?.flags?.allowChangeRoute,content:"Changes the current page route to the specified path. Use this when the user asks to navigate to a different page, go to a specific section, or change the current page route. Only available when allowChangeRoute flag is enabled.",parameters:[{name:"path",type:"string",description:'The path to navigate to (e.g., "/home", "/dashboard")'}],action:(n,e)=>{if(typeof window>"u")throw new Error("This action is only available in browser environments.");if(!e.flags.allowChangeRoute)throw new Error("Change Route action is not enabled for this persona.");if(!n.path||typeof n.path!="string")throw new Error("Path parameter is required and must be a string.");let t=new URL(n.path,window.location.origin).pathname;return window.location.href=t,`Changed route to: ${t}`}},{id:"ui.sendEmail",type:"action",name:"Send an email",tags:"email, send, mail, compose, message, contact, mailto",isContext:!0,disabled:typeof window>"u"||!a?.flags?.allowSendEmail,content:"Sends an email using the user's default mail client by opening a mailto: link. Use this when the user asks to send an email, compose a message, or contact someone via email. Only available when allowSendEmail flag is enabled.",parameters:[{name:"email_address",type:"string",description:"The recipient email address"},{name:"subject",type:"string",description:"The email subject line"},{name:"body",type:"string",description:"The email body content"}],action:(n,e)=>{if(typeof window>"u")throw new Error("This action is only available in browser environments.");if(!e.flags.allowSendEmail)throw new Error("Send Email action is not enabled for this persona.");if(!n.email_address||typeof n.email_address!="string")throw new Error("Email address parameter is required and must be a string.");if(!n.subject||typeof n.subject!="string")throw new Error("Subject parameter is required and must be a string.");if(!n.body||typeof n.body!="string")throw new Error("Body parameter is required and must be a string.");let t=encodeURIComponent(n.email_address),i=encodeURIComponent(n.subject),o=encodeURIComponent(n.body),r=`mailto:${t}?subject=${i}&body=${o}`;try{window.location.href=r}catch(s){throw new Error(`Failed to open email client: ${s instanceof Error?s.message:String(s)}`)}return`Email opened in default mail client. Recipient: ${n.email_address}, Subject: ${n.subject}`}}];import{Client as Jt}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as $t}from"@modelcontextprotocol/sdk/client/streamableHttp.js";var Y={name:"@intelliweave/embedded",version:"2.2.83",description:"Integrate IntelliWeave into your app or website.",main:"./dist/webpack/index.js",types:"./dist/webpack/index.d.ts",type:"module",exports:{".":"./dist/webpack/index.js","./component":"./dist/component/component.js","./node":"./dist/node/node.js","./react":"./dist/react/react.js","./webpack":"./dist/webpack/index.js"},scripts:{build:"npm run build:lib && npm run build:docs","build:lib":"tsx build.ts","build:dev":"cross-env DEVELOPMENT=1 npm run build","build:docs":"typedoc src/index.mts --out dist/docs/",deploy:'npm run build && gsutil cp ./dist/web-weaver.min.js gs://metapress-cdn/web-weaver.min.js && gcloud compute url-maps invalidate-cdn-cache mp-cdn-loadbalancer --project="mp-backend-api" --path "/web-weaver.min.js" --async',"start:server":"cd server && npm run start","deploy:server":"cd server && npm run deploy","llm:build":"cd llm-server && docker build -t web-weaver-llm .","llm:start":"npm run llm:build && docker run -it --rm -p 8000:80 --gpus=all web-weaver-llm","llm:deploy.docker":"npm run llm:build && gcloud auth configure-docker us-central1-docker.pkg.dev && docker tag web-weaver-llm us-central1-docker.pkg.dev/ydangle-web-companion/docker-artifacts/web-weaver-llm && docker push us-central1-docker.pkg.dev/ydangle-web-companion/docker-artifacts/web-weaver-llm","llm:deploy":'npm run llm:deploy.docker && gcloud run deploy web-weaver-llm --project=ydangle-web-companion --image=us-central1-docker.pkg.dev/ydangle-web-companion/docker-artifacts/web-weaver-llm --allow-unauthenticated --region=us-central1 --description="Web Weaver LLM" --concurrency=2 --min-instances=0 --timeout=5m --memory=16Gi --cpu=8',prepack:"npm run build",test:"npm run build && vitest run","test:local":"IW_API_URL=http://localhost:3000/api npm run test"},keywords:["web","weaver","ai","assistant","chat"],author:"jjv360",license:"UNLICENSED",devDependencies:{"@types/audioworklet":"^0.0.97","@types/lodash":"^4.17.24","@types/react":"^19.2.14",bestzip:"^2.2.2","cross-env":"^10.1.0","find-cache-dir":"^6.0.0",lodash:"^4.17.23","onnxruntime-web":"^1.24.3",react:"^19.2.4","replace-in-file":"^8.4.0",tsup:"^8.5.1",tsx:"^4.21.0",typedoc:"^0.28.18",vitest:"^4.1.0"},peerDependencies:{"onnxruntime-web":"^1.20.0",react:"^18 || ^19"},dependencies:{"@anthropic-ai/sdk":"^0.80.0","@modelcontextprotocol/sdk":"^1.27.1","@types/json-schema":"^7.0.15",minisearch:"^7.2.0",openai:"^6.32.0","rehype-document":"^7.0.3","rehype-external-links":"^3.0.0","rehype-format":"^5.0.1","rehype-stringify":"^10.0.1","remark-gfm":"^4.0.1","remark-parse":"^11.0.0","remark-rehype":"^11.1.2",unified:"^11.0.5","utility-types":"^3.11.0",uuid:"^13.0.0"}};import{LoggingMessageNotificationSchema as Qt,ToolListChangedNotificationSchema as qt}from"@modelcontextprotocol/sdk/types.js";var I=new f("MCPKnowledgeClient"),ei="https://intelliweave-mcp-proxy-828827766277.us-central1.run.app",Ne=class{constructor(n){this.tools=[];this.iwActions=[];this.stats={toolsCalled:0};this.lastSearchQuery="";this.lastSearchResults=[];this.config=n}async connect(){return this.client?this.client:this.connectionPromise?await this.connectionPromise:(this.connectionPromise=this.connectInternal(),this.connectionPromise.finally(()=>{this.connectionPromise=void 0}),await this.connectionPromise)}async connectInternal(){I.debug("Connecting to MCP client");let n=this.config.connect?await this.config.connect():await Promise.resolve().then(async()=>{let e=new URL(this.config.baseURL),t={};this.config.headers&&(t={...t,...this.config.headers}),this.config.proxy?.enabled&&(t["Mcp-Target-Url"]=e.toString(),t["IntelliWeave-Api-Key"]=this.config.proxy.apiKey||"",e=new URL(this.config.proxy.url||ei));let i=new Jt({name:Y.name,version:Y.version}),o=new $t(e,{requestInit:{headers:t}});return await i.connect(o),I.debug("Connected with HTTP streaming mode"),i});return await this.disconnect(),this.client=n,n.onerror=e=>{I.error(`MCP client error: ${e.message}`)},n.onclose=()=>{I.debug("MCP client connection closed"),this.client=void 0},n.setNotificationHandler(Qt,e=>{e.params.level=="critical"?I.error(`[Server] ${e.params.data}`):e.params.level=="emergency"?I.error(`[Server] ${e.params.data}`):e.params.level=="error"?I.error(`[Server] ${e.params.data}`):e.params.level=="warning"?I.warn(`[Server] ${e.params.data}`):e.params.level=="info"?I.info(`[Server] ${e.params.data}`):e.params.level=="debug"?I.debug(`[Server] ${e.params.data}`):I.log(`[Server] ${e.params.data}`)}),n.setNotificationHandler(qt,e=>{I.debug("Tool list changed",e),this.fetchTools()}),I.debug("Fetching tools from MCP server..."),await this.fetchTools(),n}async disconnect(){await this.client?.close(),this.client=void 0,this.tools=[],this.iwActions=[]}async fetchTools(){let n=[],e;for(;;){let o=await this.client.listTools({cursor:e});e=o.nextCursor;for(let r of o.tools||[])n.push(r);if(!o?.tools?.length||!e)break}let t=[],i=this.config.id||"mcp";for(let o of n){let r=!!(this.config.searchToolName&&o.name==this.config.searchToolName&&!this.config.searchToolVisible),s=`${i}_${o.name}`;t.push({id:s,name:o.name,content:o.description||"",type:"action",isContext:!0,parameters:o.inputSchema,action:l=>this.performToolCall(o.name,l),disabled:r})}I.debug(`Fetched ${n.length} tools from MCP server.`),this.tools=n,this.iwActions=t}async search(n){if(n==this.lastSearchQuery)return this.lastSearchResults;await this.connect();let e=this.iwActions.slice(),t=await this.performSearchCall(n);return e=e.concat(t),this.lastSearchQuery=n,this.lastSearchResults=e,I.debug(`Search completed, found ${e.length} items.`),e}async performSearchCall(n){let e=[];if(!this.config.searchToolName)return e;let t=this.tools.find(o=>o.name==this.config.searchToolName);if(!t)return I.warn(`Search function ${this.config.searchToolName} not found on the MCP server.`),e;let i;if(t.inputSchema.required?.length==1){let o=t.inputSchema.required[0];i=await this.performToolCall(this.config.searchToolName,{[o]:n})}else if(t.inputSchema.properties&&Object.keys(t.inputSchema.properties).length==1){let o=Object.keys(t.inputSchema.properties)[0];i=await this.performToolCall(this.config.searchToolName,{[o]:n})}else i=await this.performToolCall(this.config.searchToolName,{});if(Array.isArray(i))for(let o=0;o<i.length;o++){let r=i[o];e.push({id:this.config.id+":"+this.config.searchToolName+":"+o,name:`Search result ${o+1} in ${this.config.searchToolName}`,type:"info",content:typeof r=="string"?r:JSON.stringify(r)})}else e.push({id:this.config.id+":"+this.config.searchToolName+":result",name:`Search result in ${this.config.searchToolName}`,type:"info",content:typeof i=="string"?i:JSON.stringify(i)});return e}async performToolCall(n,e){await this.connect(),I.debug(`Performing tool call for ${n} with params:`,e),this.stats.toolsCalled+=1;let t=await this.client.callTool({name:n,arguments:e});if(t.isError){let i=t.content?.[0]?.text||"Unknown error";throw I.error(`Error calling tool ${n}: ${i}`),new Error(`Error calling tool ${n}: ${i}`)}if(Array.isArray(t.content)&&t.content.length==1&&t.content[0].type=="text")try{return JSON.parse(t.content[0].text)}catch{}return t.content||[]}};import{v4 as ti}from"uuid";var ii=new f("Statistics"),ge=[];async function C(a,n){let e={...n,event_id:ti(),event_date:new Date().toISOString(),sdk_version:Y.version,conversation_id:a?.conversationID||"",api_key:a?.apiKey||"",user_id:a?.userID||""};if(ge.push(e),!a||(await new Promise(i=>setTimeout(i,5e3)),ge.length===0))return;let t=ge.slice();ge.length=0;try{let i=await fetch(a.hubAPI+"/analytics/stats",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({events:t})});if(!i.ok)throw new Error(`Analytics submission failed: ${i.status} ${i.statusText}`)}catch(i){ii.warn("Failed to submit analytics event:",i),ge.push(...t);return}}var F=new f("KnowledgeBase"),oi=8*1024,Qe=1,Ae=class a{constructor(n){this._sources=[];this._windowSources=[];this.lastResults=[];this.manualEntries=[];this.allowWindowSources=!0;this.allowGlobalConfigSources=!0;this.allowRagSearch=!0;this.ai=n,this.ensureInternalKnowledge()}ensureInternalKnowledge(){this._sources=this._sources.filter(n=>n.id!=="core.internal"),this._sources.push({id:"core.internal",query:async()=>ft(this.ai)})}reset(){this._windowSources=[],this.manualEntries=[],this.lastResults=[],this._sources=[],this.ensureInternalKnowledge()}registerSource(n,e){let t=n;return typeof n=="function"&&(e=n,t=`source.${Qe++}`),this._sources.push({id:t,query:e}),t}removeSource(n){this._sources=this.sources.filter(e=>e.id!==n&&e.query!==n)}addEntry(n){this.manualEntries.push(n)}removeEntry(n){this.manualEntries=this.manualEntries.filter(e=>e.id!==n)}get sources(){let n=this._sources;return this.allowGlobalConfigSources&&b().knowledgeBaseSources&&(n=n.concat(b().knowledgeBaseSources)),this.allowWindowSources&&typeof document<"u"&&(n=n.concat(this._windowSources)),n=n.filter(e=>!e.disabled),n}async search(n){F.debug(`Searching knowledge base for: ${n}`);let e=Date.now(),t=new Event("webweaver_kb_search",{bubbles:!0,cancelable:!0});t.query=n,t.entries=[],t.sources=[],this.allowWindowSources&&typeof document<"u"?(document.dispatchEvent(t),this._windowSources=t.sources):this._windowSources=[];let o=(await Promise.all(this.sources.map(async d=>{try{let h=Date.now(),p=await d.query(n);return F.debug(`Source '${d.id}' took ${Date.now()-h}ms`),p||[]}catch(h){return F.warn(`Knowledge source '${d.id}' failed:`,h),[]}}))).flat();o=o.concat(t.entries),o=o.concat(this.manualEntries),this.allowGlobalConfigSources&&b().knowledgeBase&&(o=o.concat(b().knowledgeBase)),o=o.filter(d=>d&&!d.disabled);let r=new Map;for(let d of o)d.id&&r.set(d.id,(r.get(d.id)||0)+1);for(let[d,h]of r)if(h>1){F.warn(`Duplicate knowledge base item ID detected: '${d}' appears ${h} times. Adding suffixes to make them unique.`);let p=1,m=!0;for(let g of o)if(g.id===d){if(m){m=!1;continue}g.id=`${d}(${p})`,p++}}for(let d=0;d<o.length;d++){let h=o[d];h.id=h.id||`temp.${d}`,h._functionID=h.id.replaceAll(/[^a-zA-Z0-9_]/g,"_")}let s=new ni({fields:["id","type","name","content","tags"],storeFields:[],searchOptions:{boost:{name:3,tags:2},fuzzy:.2}});s.addAll(o);let u=s.search(n).map(d=>o.find(h=>h.id==d.id)).filter(Boolean),c=0;u=u.filter(d=>{if(d.isContext)return!0;let h=(d.content||"").length;return c+h>oi?!1:(c+=h,!0)});for(let d of o)d.isContext&&(u.find(h=>h.id===d.id)||u.push(d));return this.lastResults=u,C(this.ai,{event_type:"kb_search",value:u.length,value_str:"",event_properties:{search_time_ms:Date.now()-e,sources_searched:this.sources.length}}),F.debug("Found results:",u),u}getCachedEntry(n){return this.lastResults.find(e=>e.id==n||e._functionID==n)}registerSourceFromURL(n,e){e||(e=`external.${Qe++}`),F.debug(`Registering remote knowledge base source: ${n}`);let t=[],i=[],o=!0,r=async(l,u)=>{F.debug(`Calling remote knowledge base action: ${l.id}`);let c={type:"action",userID:this.ai.userID,actionID:l.id,parameters:u},d=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)});if(!d.ok)throw new Error(`HTTP Error ${d.status} ${d.statusText}`);let h=await d.json();return s(h.updateItems||[]),h.response},s=l=>{for(let u of l){if(!u.id){F.warn("KB item skipped since it has no ID.",u);continue}let c=t.find(d=>d.id==u.id);if(c){c.name=u.name||c.name||"",c.content=u.content||c.content||"",c.disabled=u.disabled??c.disabled,c.isContext=u.isContext??c.isContext,c.parameters=u.parameters||c.parameters||[],c.tags=u.tags||c.tags,c.type=u.type||c.type;continue}t.push({...u,action:d=>r(u,d)})}};this.registerSource(e,async l=>{if(o&&i.includes(l))return t;let u={type:"search",userID:this.ai?.userID||"",query:l},c=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)});if(!c.ok)throw new Error(`HTTP Error ${c.status} ${c.statusText}`);let d=await c.json();return o=!d.noCache,i.includes(l)||i.push(l),s(d.items),t})}clone(n){let e=new a(n);return e._sources=this._sources.slice(),e._windowSources=this._windowSources.slice(),e.manualEntries=this.manualEntries.slice(),e.allowGlobalConfigSources=this.allowGlobalConfigSources,e.allowWindowSources=this.allowWindowSources,e.allowRagSearch=this.allowRagSearch,e.ensureInternalKnowledge(),e}registerMCPSource(n){n.id||(n.id=`external.${Qe++}`);let e=new Ne(n);return this.registerSource(n.id,t=>e.search(t)),e}};var Le=class{constructor(n){this.ai=n}async boolean(n){let e=await this.instruct({...n,instruction:`${n.instruction}
15
+ ${r}`}},{id:"ui.openURL",type:"action",name:"Open a URL in a new tab.",tags:"open, url, website, navigate, visit, go to, new tab, browser",isContext:!0,disabled:typeof window>"u"||!a?.flags?.allowOpenNewTab,content:"Opens the specified URL in a new tab. Use this when the user asks to open a website, visit a URL, go to a page, or navigate to a specific website. Only available when allowOpenNewTab flag is enabled.",parameters:[{name:"url",type:"string",description:"The URL to open in a new tab"}],action:(i,e)=>{if(typeof window>"u")throw new Error("This action is only available in browser environments.");if(!e.flags.allowOpenNewTab)throw new Error("Open New Tab action is not enabled for this persona.");if(!i.url||typeof i.url!="string")throw new Error("URL parameter is required and must be a string.");if(!window.open(i.url,"_blank"))throw new Error("Window blocked by popup blocker. Please allow popups for this site.");return`Opened URL: ${i.url}`}},{id:"ui.changeRoute",type:"action",name:"Change the current page route.",tags:"navigate, route, path, page, go to, change page, routing, navigation",isContext:!0,disabled:typeof window>"u"||!a?.flags?.allowChangeRoute,content:"Changes the current page route to the specified path. Use this when the user asks to navigate to a different page, go to a specific section, or change the current page route. Only available when allowChangeRoute flag is enabled.",parameters:[{name:"path",type:"string",description:'The path to navigate to (e.g., "/home", "/dashboard")'}],action:(i,e)=>{if(typeof window>"u")throw new Error("This action is only available in browser environments.");if(!e.flags.allowChangeRoute)throw new Error("Change Route action is not enabled for this persona.");if(!i.path||typeof i.path!="string")throw new Error("Path parameter is required and must be a string.");let t=new URL(i.path,window.location.origin).pathname;return window.location.href=t,`Changed route to: ${t}`}},{id:"ui.sendEmail",type:"action",name:"Send an email",tags:"email, send, mail, compose, message, contact, mailto",isContext:!0,disabled:typeof window>"u"||!a?.flags?.allowSendEmail,content:"Sends an email using the user's default mail client by opening a mailto: link. Use this when the user asks to send an email, compose a message, or contact someone via email. Only available when allowSendEmail flag is enabled.",parameters:[{name:"email_address",type:"string",description:"The recipient email address"},{name:"subject",type:"string",description:"The email subject line"},{name:"body",type:"string",description:"The email body content"}],action:(i,e)=>{if(typeof window>"u")throw new Error("This action is only available in browser environments.");if(!e.flags.allowSendEmail)throw new Error("Send Email action is not enabled for this persona.");if(!i.email_address||typeof i.email_address!="string")throw new Error("Email address parameter is required and must be a string.");if(!i.subject||typeof i.subject!="string")throw new Error("Subject parameter is required and must be a string.");if(!i.body||typeof i.body!="string")throw new Error("Body parameter is required and must be a string.");let t=encodeURIComponent(i.email_address),n=encodeURIComponent(i.subject),o=encodeURIComponent(i.body),r=`mailto:${t}?subject=${n}&body=${o}`;try{window.location.href=r}catch(s){throw new Error(`Failed to open email client: ${s instanceof Error?s.message:String(s)}`)}return`Email opened in default mail client. Recipient: ${i.email_address}, Subject: ${i.subject}`}}];import{Client as ei}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as ti}from"@modelcontextprotocol/sdk/client/streamableHttp.js";var et={name:"@intelliweave/embedded",version:"2.2.85",description:"Integrate IntelliWeave into your app or website.",main:"./dist/webpack/index.js",types:"./dist/webpack/index.d.ts",type:"module",exports:{".":"./dist/webpack/index.js","./component":"./dist/component/component.js","./node":"./dist/node/node.js","./react":"./dist/react/react.js","./webpack":"./dist/webpack/index.js"},scripts:{build:"npm run build:lib && npm run build:docs","build:lib":"tsx build.ts","build:dev":"cross-env DEVELOPMENT=1 npm run build","build:docs":"typedoc src/index.mts --out dist/docs/",deploy:'npm run build && gsutil cp ./dist/web-weaver.min.js gs://metapress-cdn/web-weaver.min.js && gcloud compute url-maps invalidate-cdn-cache mp-cdn-loadbalancer --project="mp-backend-api" --path "/web-weaver.min.js" --async',"start:server":"cd server && npm run start","deploy:server":"cd server && npm run deploy","llm:build":"cd llm-server && docker build -t web-weaver-llm .","llm:start":"npm run llm:build && docker run -it --rm -p 8000:80 --gpus=all web-weaver-llm","llm:deploy.docker":"npm run llm:build && gcloud auth configure-docker us-central1-docker.pkg.dev && docker tag web-weaver-llm us-central1-docker.pkg.dev/ydangle-web-companion/docker-artifacts/web-weaver-llm && docker push us-central1-docker.pkg.dev/ydangle-web-companion/docker-artifacts/web-weaver-llm","llm:deploy":'npm run llm:deploy.docker && gcloud run deploy web-weaver-llm --project=ydangle-web-companion --image=us-central1-docker.pkg.dev/ydangle-web-companion/docker-artifacts/web-weaver-llm --allow-unauthenticated --region=us-central1 --description="Web Weaver LLM" --concurrency=2 --min-instances=0 --timeout=5m --memory=16Gi --cpu=8',prepack:"npm run build",test:"npm run build && vitest run","test:local":"IW_API_URL=http://localhost:3000/api npm run test"},keywords:["web","weaver","ai","assistant","chat"],author:"jjv360",license:"UNLICENSED",devDependencies:{"@types/audioworklet":"^0.0.97","@types/lodash":"^4.17.24","@types/react":"^19.2.14",bestzip:"^2.2.2","cross-env":"^10.1.0","find-cache-dir":"^6.0.0",lodash:"^4.17.23","onnxruntime-web":"^1.24.3",react:"^19.2.4","replace-in-file":"^8.4.0",tsup:"^8.5.1",tsx:"^4.21.0",typedoc:"^0.28.18",vitest:"^4.1.0"},peerDependencies:{"onnxruntime-web":"^1.20.0",react:"^18 || ^19"},dependencies:{"@anthropic-ai/sdk":"^0.80.0","@modelcontextprotocol/sdk":"^1.27.1","@types/json-schema":"^7.0.15","idb-keyval":"^6.2.5","iron-webcrypto":"^2.0.0",minisearch:"^7.2.0",openai:"^6.32.0","rehype-document":"^7.0.3","rehype-external-links":"^3.0.0","rehype-format":"^5.0.1","rehype-stringify":"^10.0.1","remark-gfm":"^4.0.1","remark-parse":"^11.0.0","remark-rehype":"^11.1.2",unified:"^11.0.5","utility-types":"^3.11.0",uuid:"^13.0.0"}};import{LoggingMessageNotificationSchema as ii,ToolListChangedNotificationSchema as ni}from"@modelcontextprotocol/sdk/types.js";var I=new g("MCPKnowledgeClient"),oi="https://intelliweave-mcp-proxy-828827766277.us-central1.run.app",Le=class{constructor(i){this.tools=[];this.iwActions=[];this.stats={toolsCalled:0};this.lastSearchQuery="";this.lastSearchResults=[];this.config=i}async connect(){return this.client?this.client:this.connectionPromise?await this.connectionPromise:(this.connectionPromise=this.connectInternal(),this.connectionPromise.finally(()=>{this.connectionPromise=void 0}),await this.connectionPromise)}async connectInternal(){I.debug("Connecting to MCP client");let i=this.config.connect?await this.config.connect():await Promise.resolve().then(async()=>{let e=new URL(this.config.baseURL),t={};this.config.headers&&(t={...t,...this.config.headers}),this.config.proxy?.enabled&&(t["Mcp-Target-Url"]=e.toString(),t["IntelliWeave-Api-Key"]=this.config.proxy.apiKey||"",e=new URL(this.config.proxy.url||oi));let n=new ei({name:et.name,version:et.version}),o=new ti(e,{requestInit:{headers:t}});return await n.connect(o),I.debug("Connected with HTTP streaming mode"),n});return await this.disconnect(),this.client=i,i.onerror=e=>{I.error(`MCP client error: ${e.message}`)},i.onclose=()=>{I.debug("MCP client connection closed"),this.client=void 0},i.setNotificationHandler(ii,e=>{e.params.level=="critical"?I.error(`[Server] ${e.params.data}`):e.params.level=="emergency"?I.error(`[Server] ${e.params.data}`):e.params.level=="error"?I.error(`[Server] ${e.params.data}`):e.params.level=="warning"?I.warn(`[Server] ${e.params.data}`):e.params.level=="info"?I.info(`[Server] ${e.params.data}`):e.params.level=="debug"?I.debug(`[Server] ${e.params.data}`):I.log(`[Server] ${e.params.data}`)}),i.setNotificationHandler(ni,e=>{I.debug("Tool list changed",e),this.fetchTools()}),I.debug("Fetching tools from MCP server..."),await this.fetchTools(),i}async disconnect(){await this.client?.close(),this.client=void 0,this.tools=[],this.iwActions=[]}async fetchTools(){let i=[],e;for(;;){let o=await this.client.listTools({cursor:e});e=o.nextCursor;for(let r of o.tools||[])i.push(r);if(!o?.tools?.length||!e)break}let t=[],n=this.config.id||"mcp";for(let o of i){let r=!!(this.config.searchToolName&&o.name==this.config.searchToolName&&!this.config.searchToolVisible),s=`${n}_${o.name}`;t.push({id:s,name:o.name,content:o.description||"",type:"action",isContext:!0,parameters:o.inputSchema,action:l=>this.performToolCall(o.name,l),disabled:r})}I.debug(`Fetched ${i.length} tools from MCP server.`),this.tools=i,this.iwActions=t}async search(i){if(i==this.lastSearchQuery)return this.lastSearchResults;await this.connect();let e=this.iwActions.slice(),t=await this.performSearchCall(i);return e=e.concat(t),this.lastSearchQuery=i,this.lastSearchResults=e,I.debug(`Search completed, found ${e.length} items.`),e}async performSearchCall(i){let e=[];if(!this.config.searchToolName)return e;let t=this.tools.find(o=>o.name==this.config.searchToolName);if(!t)return I.warn(`Search function ${this.config.searchToolName} not found on the MCP server.`),e;let n;if(t.inputSchema.required?.length==1){let o=t.inputSchema.required[0];n=await this.performToolCall(this.config.searchToolName,{[o]:i})}else if(t.inputSchema.properties&&Object.keys(t.inputSchema.properties).length==1){let o=Object.keys(t.inputSchema.properties)[0];n=await this.performToolCall(this.config.searchToolName,{[o]:i})}else n=await this.performToolCall(this.config.searchToolName,{});if(Array.isArray(n))for(let o=0;o<n.length;o++){let r=n[o];e.push({id:this.config.id+":"+this.config.searchToolName+":"+o,name:`Search result ${o+1} in ${this.config.searchToolName}`,type:"info",content:typeof r=="string"?r:JSON.stringify(r)})}else e.push({id:this.config.id+":"+this.config.searchToolName+":result",name:`Search result in ${this.config.searchToolName}`,type:"info",content:typeof n=="string"?n:JSON.stringify(n)});return e}async performToolCall(i,e){await this.connect(),I.debug(`Performing tool call for ${i} with params:`,e),this.stats.toolsCalled+=1;let t=await this.client.callTool({name:i,arguments:e});if(t.isError){let n=t.content?.[0]?.text||"Unknown error";throw I.error(`Error calling tool ${i}: ${n}`),new Error(`Error calling tool ${i}: ${n}`)}if(Array.isArray(t.content)&&t.content.length==1&&t.content[0].type=="text")try{return JSON.parse(t.content[0].text)}catch{}return t.content||[]}};var fe={name:"@intelliweave/embedded",version:"2.2.85",description:"Integrate IntelliWeave into your app or website.",main:"./dist/webpack/index.js",types:"./dist/webpack/index.d.ts",type:"module",exports:{".":"./dist/webpack/index.js","./component":"./dist/component/component.js","./node":"./dist/node/node.js","./react":"./dist/react/react.js","./webpack":"./dist/webpack/index.js"},scripts:{build:"npm run build:lib && npm run build:docs","build:lib":"tsx build.ts","build:dev":"cross-env DEVELOPMENT=1 npm run build","build:docs":"typedoc src/index.mts --out dist/docs/",deploy:'npm run build && gsutil cp ./dist/web-weaver.min.js gs://metapress-cdn/web-weaver.min.js && gcloud compute url-maps invalidate-cdn-cache mp-cdn-loadbalancer --project="mp-backend-api" --path "/web-weaver.min.js" --async',"start:server":"cd server && npm run start","deploy:server":"cd server && npm run deploy","llm:build":"cd llm-server && docker build -t web-weaver-llm .","llm:start":"npm run llm:build && docker run -it --rm -p 8000:80 --gpus=all web-weaver-llm","llm:deploy.docker":"npm run llm:build && gcloud auth configure-docker us-central1-docker.pkg.dev && docker tag web-weaver-llm us-central1-docker.pkg.dev/ydangle-web-companion/docker-artifacts/web-weaver-llm && docker push us-central1-docker.pkg.dev/ydangle-web-companion/docker-artifacts/web-weaver-llm","llm:deploy":'npm run llm:deploy.docker && gcloud run deploy web-weaver-llm --project=ydangle-web-companion --image=us-central1-docker.pkg.dev/ydangle-web-companion/docker-artifacts/web-weaver-llm --allow-unauthenticated --region=us-central1 --description="Web Weaver LLM" --concurrency=2 --min-instances=0 --timeout=5m --memory=16Gi --cpu=8',prepack:"npm run build",test:"npm run build && vitest run","test:local":"IW_API_URL=http://localhost:3000/api npm run test"},keywords:["web","weaver","ai","assistant","chat"],author:"jjv360",license:"UNLICENSED",devDependencies:{"@types/audioworklet":"^0.0.97","@types/lodash":"^4.17.24","@types/react":"^19.2.14",bestzip:"^2.2.2","cross-env":"^10.1.0","find-cache-dir":"^6.0.0",lodash:"^4.17.23","onnxruntime-web":"^1.24.3",react:"^19.2.4","replace-in-file":"^8.4.0",tsup:"^8.5.1",tsx:"^4.21.0",typedoc:"^0.28.18",vitest:"^4.1.0"},peerDependencies:{"onnxruntime-web":"^1.20.0",react:"^18 || ^19"},dependencies:{"@anthropic-ai/sdk":"^0.80.0","@modelcontextprotocol/sdk":"^1.27.1","@types/json-schema":"^7.0.15","idb-keyval":"^6.2.5","iron-webcrypto":"^2.0.0",minisearch:"^7.2.0",openai:"^6.32.0","rehype-document":"^7.0.3","rehype-external-links":"^3.0.0","rehype-format":"^5.0.1","rehype-stringify":"^10.0.1","remark-gfm":"^4.0.1","remark-parse":"^11.0.0","remark-rehype":"^11.1.2",unified:"^11.0.5","utility-types":"^3.11.0",uuid:"^13.0.0"}};import{v4 as si}from"uuid";var ai=new g("Statistics"),be=[];async function C(a,i){let e={...i,event_id:si(),event_date:new Date().toISOString(),sdk_version:fe.version,conversation_id:a?.conversationID||"",api_key:a?.apiKey||"",user_id:a?.userID||""};if(be.push(e),!a||(await new Promise(n=>setTimeout(n,5e3)),be.length===0))return;let t=be.slice();be.length=0;try{let n=await fetch(a.hubAPI+"/analytics/stats",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({events:t})});if(!n.ok)throw new Error(`Analytics submission failed: ${n.status} ${n.statusText}`)}catch(n){ai.warn("Failed to submit analytics event:",n),be.push(...t);return}}var V=new g("KnowledgeBase"),di=8*1024,tt=1,De=class a{constructor(i){this._sources=[];this._windowSources=[];this.lastResults=[];this.manualEntries=[];this.allowWindowSources=!0;this.allowGlobalConfigSources=!0;this.allowRagSearch=!0;this.ai=i,this.ensureInternalKnowledge()}ensureInternalKnowledge(){this._sources=this._sources.filter(i=>i.id!=="core.internal"),this._sources.push({id:"core.internal",query:async()=>wt(this.ai)})}reset(){this._windowSources=[],this.manualEntries=[],this.lastResults=[],this._sources=[],this.ensureInternalKnowledge()}registerSource(i,e){let t=i;return typeof i=="function"&&(e=i,t=`source.${tt++}`),this._sources.push({id:t,query:e}),t}removeSource(i){this._sources=this.sources.filter(e=>e.id!==i&&e.query!==i)}addEntry(i){this.manualEntries.push(i)}removeEntry(i){this.manualEntries=this.manualEntries.filter(e=>e.id!==i)}get sources(){let i=this._sources;return this.allowGlobalConfigSources&&b().knowledgeBaseSources&&(i=i.concat(b().knowledgeBaseSources)),this.allowWindowSources&&typeof document<"u"&&(i=i.concat(this._windowSources)),i=i.filter(e=>!e.disabled),i}async search(i){V.debug(`Searching knowledge base for: ${i}`);let e=Date.now(),t=new Event("webweaver_kb_search",{bubbles:!0,cancelable:!0});t.query=i,t.entries=[],t.sources=[],this.allowWindowSources&&typeof document<"u"?(document.dispatchEvent(t),this._windowSources=t.sources):this._windowSources=[];let o=(await Promise.all(this.sources.map(async d=>{try{let h=Date.now(),p=await d.query(i);return V.debug(`Source '${d.id}' took ${Date.now()-h}ms`),p||[]}catch(h){return V.warn(`Knowledge source '${d.id}' failed:`,h),[]}}))).flat();o=o.concat(t.entries),o=o.concat(this.manualEntries),this.allowGlobalConfigSources&&b().knowledgeBase&&(o=o.concat(b().knowledgeBase)),o=o.filter(d=>d&&!d.disabled);let r=new Map;for(let d of o)d.id&&r.set(d.id,(r.get(d.id)||0)+1);for(let[d,h]of r)if(h>1){V.warn(`Duplicate knowledge base item ID detected: '${d}' appears ${h} times. Adding suffixes to make them unique.`);let p=1,m=!0;for(let f of o)if(f.id===d){if(m){m=!1;continue}f.id=`${d}(${p})`,p++}}for(let d=0;d<o.length;d++){let h=o[d];h.id=h.id||`temp.${d}`,h._functionID=h.id.replaceAll(/[^a-zA-Z0-9_]/g,"_")}let s=new li({fields:["id","type","name","content","tags"],storeFields:[],searchOptions:{boost:{name:3,tags:2},fuzzy:.2}});s.addAll(o);let u=s.search(i).map(d=>o.find(h=>h.id==d.id)).filter(Boolean),c=0;u=u.filter(d=>{if(d.isContext)return!0;let h=(d.content||"").length;return c+h>di?!1:(c+=h,!0)});for(let d of o)d.isContext&&(u.find(h=>h.id===d.id)||u.push(d));return this.lastResults=u,C(this.ai,{event_type:"kb_search",value:u.length,value_str:"",event_properties:{search_time_ms:Date.now()-e,sources_searched:this.sources.length}}),V.debug(`Found results for "${i}":`,u),u}getCachedEntry(i){return this.lastResults.find(e=>e.id==i||e._functionID==i)}registerSourceFromURL(i,e){e||(e=`external.${tt++}`),V.debug(`Registering remote knowledge base source: ${i}`);let t=[],n=[],o=!0,r=async(l,u)=>{V.debug(`Calling remote knowledge base action: ${l.id}`);let c={type:"action",userID:this.ai.userID,actionID:l.id,parameters:u},d=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)});if(!d.ok)throw new Error(`HTTP Error ${d.status} ${d.statusText}`);let h=await d.json();return s(h.updateItems||[]),h.response},s=l=>{for(let u of l){if(!u.id){V.warn("KB item skipped since it has no ID.",u);continue}let c=t.find(d=>d.id==u.id);if(c){c.name=u.name||c.name||"",c.content=u.content||c.content||"",c.disabled=u.disabled??c.disabled,c.isContext=u.isContext??c.isContext,c.parameters=u.parameters||c.parameters||[],c.tags=u.tags||c.tags,c.type=u.type||c.type;continue}t.push({...u,action:d=>r(u,d)})}};this.registerSource(e,async l=>{if(o&&n.includes(l))return t;let u={type:"search",userID:this.ai?.userID||"",query:l},c=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)});if(!c.ok)throw new Error(`HTTP Error ${c.status} ${c.statusText}`);let d=await c.json();return o=!d.noCache,n.includes(l)||n.push(l),s(d.items),t})}clone(i){let e=new a(i);return e._sources=this._sources.slice(),e._windowSources=this._windowSources.slice(),e.manualEntries=this.manualEntries.slice(),e.allowGlobalConfigSources=this.allowGlobalConfigSources,e.allowWindowSources=this.allowWindowSources,e.allowRagSearch=this.allowRagSearch,e.ensureInternalKnowledge(),e}registerMCPSource(i){i.id||(i.id=`external.${tt++}`);let e=new Le(i);return this.registerSource(i.id,t=>e.search(t)),e}};var ci=new g("AILogic"),Pe=class{constructor(i){this.ai=i}async boolean(i){let e=await this.instruct({...i,instruction:`${i.instruction}
16
16
 
17
- Return only the text "true" or "false" to indicate the answer to the question. Do not include any additional text or explanations.`});if(e.toLowerCase().includes("true"))return!0;if(e.toLowerCase().includes("false"))return!1;throw new Error("The AI did not give a boolean answer: "+e)}async choose(n){let e=await this.instruct({...n,instruction:`${n.instruction}
17
+ Return only the text "true" or "false" to indicate the answer to the question. Do not include any additional text or explanations.`});if(e.toLowerCase().includes("true"))return!0;if(e.toLowerCase().includes("false"))return!1;throw new Error("The AI did not give a boolean answer: "+e)}async choose(i){let e=await this.instruct({...i,instruction:`${i.instruction}
18
18
 
19
19
  Reply only with one of the following options:
20
- ${n.options.map(t=>`- "${t}"`).join(`
20
+ ${i.options.map(t=>`- "${t}"`).join(`
21
21
  `)}
22
22
 
23
- Do not include any additional text or explanations.`});return n.options.includes(e)?e:n.options.find(t=>e.toLowerCase().includes(t.toLowerCase()))}async extract(n){let e=`
24
- You will receive some data. Extraction instructions: ${n.instruction}
23
+ Do not include any additional text or explanations.`});return i.options.includes(e)?e:i.options.find(t=>e.toLowerCase().includes(t.toLowerCase()))}async extract(i){let e=`
24
+ You will receive some data. Extraction instructions: ${i.instruction}
25
25
 
26
- ${n.allowMultiple?"Return a JSONL string only, one JSON object on each line.":"Return a valid JSON object only."}
26
+ ${i.allowMultiple?"Return a JSONL string only, one JSON object on each line.":"Return a valid JSON object only."}
27
27
 
28
28
  Objects should have the following keys:
29
- ${n.extractions.map(i=>`- ${i.name} (${i.type}): ${i.description||"No description provided."}`).join(`
29
+ ${i.extractions.map(n=>`- ${n.name} (${n.type}): ${n.description||"No description provided."}`).join(`
30
30
  `)}
31
- `,t=await this.instruct({...n,instruction:e});if(t=t.replace(/```jsonl/g,"").replace(/```json/g,"").replace(/```/g,""),n.allowMultiple){let i=t.split(`
32
- `).map(r=>r.trim()).filter(r=>!!r.trim()),o=[];for(let r of i)try{o.push(JSON.parse(r))}catch(s){console.error("Failed to parse line as JSON:",r,s.message)}return o}else return[JSON.parse(t.trim())]}async generateMarkdown(n){return this.instruct({...n,instruction:"Generate a Markdown document based on the input text. Always include a header on every response. Give long detailed answers with many paragraphs, and explain concepts step by step."})}async instruct(n){let e=this.ai.clone();return e.resetConversation(),e.getContextPrefix=async()=>n.instruction,n.callback&&e.addEventListener("output",t=>{n.callback(t.detail.message)}),n.allowKB||(e.knowledgeBase._sources=[]),await e.sendMessage(typeof n.data=="string"?n.data:JSON.stringify(n.data)).then(t=>t.text())}};function qe(a){let n="",e=[],t=0;for(;t<a.length;){let i=a.indexOf("<[[",t);if(i===-1){n+=a.slice(t);break}n+=a.slice(t,i);let o=a.indexOf("]]>",i+3);if(o===-1)break;let r=a.slice(i,o+3),s=a.slice(i+3,o).trim(),l={raw:r,content:s};try{let u=JSON.parse(s);u&&typeof u=="object"&&!Array.isArray(u)&&(l.action=u)}catch{}e.push(l),t=o+3}return{visibleText:n,actions:e.flatMap(i=>i.action?[i.action]:[]),blocks:e}}function bt(a){return qe(a).visibleText}var oe=class{constructor(n){this.messages=n}text(){return this.messages?.flatMap(n=>n.sections)?.filter(n=>n?.type=="text")?.map(n=>bt(n?.text||""))?.filter(n=>!!n)?.join(`
31
+ `,t=await this.instruct({...i,instruction:e});if(t=t.replace(/```jsonl/g,"").replace(/```json/g,"").replace(/```/g,""),i.allowMultiple){let n=t.split(`
32
+ `).map(r=>r.trim()).filter(r=>!!r.trim()),o=[];for(let r of n)try{o.push(JSON.parse(r))}catch(s){ci.error("Failed to parse line as JSON:",r,s.message)}return o}else return[JSON.parse(t.trim())]}async generateMarkdown(i){return this.instruct({...i,instruction:"Generate a Markdown document based on the input text. Always include a header on every response. Give long detailed answers with many paragraphs, and explain concepts step by step."})}async instruct(i){let e=this.ai.clone();return e.resetConversation(),e.getContextPrefix=async()=>i.instruction,i.callback&&e.addEventListener("output",t=>{i.callback(t.detail.message)}),i.allowKB||(e.knowledgeBase._sources=[]),await e.sendMessage(typeof i.data=="string"?i.data:JSON.stringify(i.data)).then(t=>t.text())}};function it(a){let i="",e=[],t=0;for(;t<a.length;){let n=a.indexOf("<[[",t);if(n===-1){i+=a.slice(t);break}i+=a.slice(t,n);let o=a.indexOf("]]>",n+3);if(o===-1)break;let r=a.slice(n,o+3),s=a.slice(n+3,o).trim(),l={raw:r,content:s};try{let u=JSON.parse(s);u&&typeof u=="object"&&!Array.isArray(u)&&(l.action=u)}catch{}e.push(l),t=o+3}return{visibleText:i,actions:e.flatMap(n=>n.action?[n.action]:[]),blocks:e}}function vt(a){return it(a).visibleText}var ie=class{constructor(i){this.messages=i}text(){return this.messages?.flatMap(i=>i.sections)?.filter(i=>i?.type=="text")?.map(i=>vt(i?.text||""))?.filter(i=>!!i)?.join(`
33
33
 
34
- `)?.trim()||""}tokenUsage(){return{cachedInputTokens:this.messages?.reduce((n,e)=>n+(e.usage?.cachedInputTokens||0),0)||0,inputTokens:this.messages?.reduce((n,e)=>n+(e.usage?.inputTokens||0),0)||0,outputTokens:this.messages?.reduce((n,e)=>n+(e.usage?.outputTokens||0),0)||0,totalTokens:this.messages?.reduce((n,e)=>n+(e.usage?.totalTokens||0),0)||0}}sections(){return this.messages?.flatMap(n=>n.sections||[])||[]}toolCalls(){return this.messages?.flatMap(n=>n.sections?.filter(e=>e.type=="tool_call")||[])||[]}toolResult(n){return this.messages?.map(e=>e.sections?.find(t=>t.type=="tool_result"&&t.toolCallInstanceID==n)).filter(e=>!!e)[0]||null}};var De=class{constructor(n){this.subagents=[];this.cachedSubagents={};this.ai=n}register(n){if(this.subagents.find(e=>e.id==n.id))throw new Error(`Sub-agent with ID ${n.id} already exists`);this.subagents.push(n),this.ai.knowledgeBase.registerSource("subagent:"+n.id,e=>[{type:"action",id:"ask:"+n.id,name:`Ask ${n.name||"subagent"}`,content:n.usageInstructions||`Use this tool to ask ${n.name||"subagent"} a question.`,isContext:!0,parameters:[{type:"string",name:"query",description:"The question to ask the subagent"}],action:async(t,i)=>await this.runQuery(n,t.query)}])}remove(n){this.subagents=this.subagents.filter(e=>e.id!=n),this.ai.knowledgeBase.removeSource("subagent:"+n)}async runQuery(n,e){let t=n.apiKey||this.ai.apiKey,i=this.cachedSubagents[t];return i||(i=new U,i.userID=this.ai.userID,await i.load(t,n.config),this.cachedSubagents[t]=i),i=i.clone(),i.knowledgeBase.allowGlobalConfigSources=!1,i.knowledgeBase.allowWindowSources=!1,n.clearExistingKnowledge&&i.knowledgeBase.reset(),i.knowledgeBase.allowRagSearch=!n.disableRagSearch,n.knowledge&&i.knowledgeBase.registerSource(n.knowledge),n.onAgentLoaded&&await n.onAgentLoaded(i),(await i.sendMessage(e)).text()}};var A=new f("Main"),wt=new Set,Q=class Q extends EventTarget{constructor(){super(...arguments);this.conversationID=yt();this.knowledgeBase=new Ae(this);this.subAgents=new De(this);this._lastKBsearch="";this.models=[];this.audio=null;this.apiKey="";this.logic=new Le(this);this.userID=pt();this.hubAPI="https://intelliweave.ai/api";this._lastSystemMsg="";this.lastKBItems=[];this.isProcessing=!1;this.activeAnalyticsPromises=[]}get loaded(){return!!(this.config&&this.currentModel)}get flags(){return this.config?.flags||{}}getBuiltInActionsInfo(){return{version:Q.builtInActionsVersion,availableActions:["ui.openURL - Open URLs in new tabs","ui.changeRoute - Change page routes","ui.sendEmail - Send emails via mailto links","embedded.suggestion - Add hidden follow-up suggestion buttons in the built-in UI","embedded.emoji - Trigger hidden emoji effects in the built-in UI","search - Search knowledge base"],enabledFlags:this.flags}}async load(e,t){if(this.apiKey=e,!e)throw new Error("API key is required to load the AI.");t?.userID&&(this.userID=t.userID),t?.hubAPI&&(this.hubAPI=t.hubAPI);try{await Promise.all([(async()=>{A.debug("Loading configuration...");let i=await fetch(this.hubAPI+"/config/get",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:e,userID:this.userID})});if(!i.ok){let o=`${i.status} ${i.statusText}`;try{let r=await i.json();r.error?o=r.error:r.message&&(o=r.message)}catch(r){A.debug("Could not parse error response body:",r)}throw new Error(`Failed to load configuration: ${o}`)}try{this.config=await i.json(),A.debug("Config loaded successfully:",this.config),t&&(this.config={...this.config,...t}),this.config&&A.debug("UI Properties - logo:",this.config.logo,"background:",this.config.background,"textColor:",this.config.textColor)}catch(o){A.error("Failed to parse JSON response:",o);try{let r=await i.clone().text();A.error("Raw response that failed parsing:",r)}catch{A.error("Could not get raw response text either")}throw new Error(`Failed to parse configuration: ${o}`)}})(),(async()=>{try{let i=await fetch("https://cdn.intelliweave.ai/models/silero_vad_3.onnx");if(!i.ok)throw new Error(`Failed to load VAD model: ${i.status} ${i.statusText}`);this.vadModel=await i.blob()}catch(i){A.warn(`Failed to load VAD model, some features will be unavailable. ${i.message}`)}})()]),this.models=[{id:this.config.id,config:this.config.model}],this.setModel(this.config.id);for(let i of this.config.knowledge||[])i.url&&i.backendType=="mcp"?this.knowledgeBase.registerMCPSource({id:i.id,searchToolName:i.mcpSearchToolName,baseURL:i.url}):i.url&&this.knowledgeBase.registerSourceFromURL(i.url);for(let i of this.config.knowledge||[])i.entries?.length&&this.knowledgeBase.registerSource(i.id,()=>i.entries||[]);if(this.config.mcpServers)for(let i of this.config.mcpServers)this.knowledgeBase.registerMCPSource(i);for(let i of this.config.subagents||[])this.subAgents.register(i);return this.resetConversation(),this.dispatchEvent(new CustomEvent("load",{detail:{ai:this}})),typeof window<"u"&&window.dispatchEvent(new CustomEvent("webweaver_loaded",{detail:{ai:this}})),this}catch(i){throw A.warn("Failed to load:",i),this.error=i,this.dispatchEvent(new CustomEvent("error",{detail:{ai:this,error:i}})),typeof window<"u"&&window.dispatchEvent(new CustomEvent("webweaver_error",{detail:{ai:this,error:i}})),i}}setModel(e){let t=this.models.find(o=>o.id==e);if(!t)throw new Error(`Model with ID "${e}" not found.`);let i={...t.config,stream:!0,systemMessage:"",onBeforeMessageProcessing:this.onBeforeMessageProcessing.bind(this),onAIMessage:this.processIncomingMessage.bind(this),onAIToolStart:(o,r)=>{let s=this.knowledgeBase.getCachedEntry(o);this.onAIToolStart?.(s?.id||o,r)}};this.config?.onCreateProvider?this.currentModel=this.config.onCreateProvider(i):t.config.providerID==="anthropic"?this.currentModel=new Ee(i):this.currentModel=new Ce(i),this.currentModel.id=t.id,this.currentModel.metadata=t}async getContextPrefix(){let e=b().pageSummary||`You are ${this.config?.name||"IntelliWeave"}. ${this.config?.instructions||"Speak in short sentences."}`;return typeof e=="function"&&(e=await e()),e}async onBeforeMessageProcessing(){this._lastKBsearch||(this._lastKBsearch="__intelliweaveblanksearchforcontextitems__");let e=this._nextRequestUseKBitems||await this.knowledgeBase.search(this._lastKBsearch);this._nextRequestUseKBitems=void 0;let t=await this.getContextPrefix();this.currentModel.contextGroup.add({id:"_iw_main",sortOrder:1,cannotRemove:!0,data:t}),this.currentModel.contextGroup.add({id:"_iw_kb_only_rule",sortOrder:2,cannotRemove:!0,disabled:!this.flags.onlyUseKnowledgeBase,data:"Important rule: Only use knowledge from your knowledge base to answer questions, do not speak about anything that is not included in your knowledge base."}),this.currentModel.contextGroup.add({id:"_iw_kb_rag",sortOrder:99,cannotRemove:!0,disabled:!this.knowledgeBase.allowRagSearch,data:Se(`
34
+ `)?.trim()||""}tokenUsage(){return{cachedInputTokens:this.messages?.reduce((i,e)=>i+(e.usage?.cachedInputTokens||0),0)||0,inputTokens:this.messages?.reduce((i,e)=>i+(e.usage?.inputTokens||0),0)||0,outputTokens:this.messages?.reduce((i,e)=>i+(e.usage?.outputTokens||0),0)||0,totalTokens:this.messages?.reduce((i,e)=>i+(e.usage?.totalTokens||0),0)||0}}sections(){return this.messages?.flatMap(i=>i.sections||[])||[]}toolCalls(){return this.messages?.flatMap(i=>i.sections?.filter(e=>e.type=="tool_call")||[])||[]}toolResult(i){return this.messages?.map(e=>e.sections?.find(t=>t.type=="tool_result"&&t.toolCallInstanceID==i)).filter(e=>!!e)[0]||null}};var We=class{constructor(i){this.subagents=[];this.cachedSubagents={};this.ai=i}register(i){if(this.subagents.find(e=>e.id==i.id))throw new Error(`Sub-agent with ID ${i.id} already exists`);this.subagents.push(i),this.ai.knowledgeBase.registerSource("subagent:"+i.id,e=>[{type:"action",id:"ask:"+i.id,name:`Ask ${i.name||"subagent"}`,content:i.usageInstructions||`Use this tool to ask ${i.name||"subagent"} a question.`,isContext:!0,parameters:[{type:"string",name:"query",description:"The question to ask the subagent"}],action:async(t,n)=>await this.runQuery(i,t.query)}])}remove(i){this.subagents=this.subagents.filter(e=>e.id!=i),this.ai.knowledgeBase.removeSource("subagent:"+i)}async runQuery(i,e){let t=i.apiKey||this.ai.apiKey,n=this.cachedSubagents[t];return n||(n=new Y,n.userID=this.ai.userID,await n.load(t,i.config),this.cachedSubagents[t]=n),n=n.clone(),n.knowledgeBase.allowGlobalConfigSources=!1,n.knowledgeBase.allowWindowSources=!1,i.clearExistingKnowledge&&n.knowledgeBase.reset(),n.knowledgeBase.allowRagSearch=!i.disableRagSearch,i.knowledge&&n.knowledgeBase.registerSource(i.knowledge),i.onAgentLoaded&&await i.onAgentLoaded(n),(await n.sendMessage(e)).text()}};import{get as ui,set as pi}from"idb-keyval";import*as oe from"iron-webcrypto";var ne=new g("InternalUtilities");async function xt(a,i,e){let n="IntelliWeave_98"+"JE".toLowerCase()+112+"Ho".toLowerCase(),o=`v1_${i}`,r=await hi(n,o),s=null;try{let u=await ui(`intelliweave_config_v1_${i}`)||"";u&&(s=await oe.unseal(u,r,oe.defaults))}catch(u){u?.message?.includes("indexedDB is not defined")||ne.warn(`Failed to get cached config for API key ${i}:`,u),s=null}ne.debug("Loading configuration...");let l=await fetch(a+"/config/get",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:i,userID:e,cacheKey:s?.cacheKey,apiVersion:"v1"})});if(l.status===304&&s)return ne.debug("Configuration not modified, using cached version"),s;if(l.ok){let u=await l.json();if(u.sealed){let c=await oe.unseal(u.sealed,r,oe.defaults);try{await pi(`intelliweave_config_v1_${i}`,u.sealed)}catch(d){d?.message?.includes("indexedDB is not defined")||ne.warn(`Failed to save config to cache for API key ${i}:`,d)}return c}else return ne.warn("Received old API formatted config"),u}else{let u=`${l.status} ${l.statusText}`;try{let c=await l.json();c.error?u=c.error:c.message&&(u=c.message)}catch(c){ne.debug("Could not parse error response body:",c)}throw new Error(`Failed to load configuration: ${u}`)}}async function hi(a,i){let e=await crypto.subtle.importKey("raw",new TextEncoder().encode(a),{name:"HMAC",hash:"SHA-256"},!1,["sign"]),t=await crypto.subtle.sign("HMAC",e,new TextEncoder().encode(i));return[...new Uint8Array(t)].map(n=>n.toString(16).padStart(2,"0")).join("")}var re=new g("Main"),It=new Set,$=class $ extends EventTarget{constructor(){super(...arguments);this.conversationID=Mt();this.knowledgeBase=new De(this);this.subAgents=new We(this);this._lastKBsearch="";this.models=[];this.audio=null;this.apiKey="";this.logic=new Pe(this);this.userID=gt();this.hubAPI="https://intelliweave.ai/api";this._lastSystemMsg="";this.lastKBItems=[];this.isProcessing=!1;this.activeAnalyticsPromises=[]}get loaded(){return!!(this.config&&this.currentModel)}get flags(){return this.config?.flags||{}}getBuiltInActionsInfo(){return{version:$.builtInActionsVersion,availableActions:["ui.openURL - Open URLs in new tabs","ui.changeRoute - Change page routes","ui.sendEmail - Send emails via mailto links","embedded.suggestion - Add hidden follow-up suggestion buttons in the built-in UI","embedded.emoji - Trigger hidden emoji effects in the built-in UI","search - Search knowledge base"],enabledFlags:this.flags}}async load(e,t){if(this.apiKey=e,!e)throw new Error("API key is required to load the AI.");t?.userID&&(this.userID=t.userID),t?.hubAPI&&(this.hubAPI=t.hubAPI);try{await Promise.all([(async()=>{this.config=await xt(this.hubAPI,this.apiKey,this.userID),t&&(this.config={...this.config,...t})})(),(async()=>{try{let n=await fetch("https://cdn.intelliweave.ai/models/silero_vad_3.onnx");if(!n.ok)throw new Error(`Failed to load VAD model: ${n.status} ${n.statusText}`);this.vadModel=await n.blob()}catch(n){re.warn(`Failed to load VAD model, some features will be unavailable. ${n.message}`)}})()]),this.models=[{id:this.config.id,config:this.config.model}],this.setModel(this.config.id);for(let n of this.config.knowledge||[])n.url&&n.backendType=="mcp"?this.knowledgeBase.registerMCPSource({id:n.id,searchToolName:n.mcpSearchToolName,baseURL:n.url}):n.url&&this.knowledgeBase.registerSourceFromURL(n.url);for(let n of this.config.knowledge||[])n.entries?.length&&this.knowledgeBase.registerSource(n.id,()=>n.entries||[]);if(this.config.mcpServers)for(let n of this.config.mcpServers)this.knowledgeBase.registerMCPSource(n);for(let n of this.config.subagents||[])this.subAgents.register(n);return this.resetConversation(),this.dispatchEvent(new CustomEvent("load",{detail:{ai:this}})),typeof window<"u"&&window.dispatchEvent(new CustomEvent("webweaver_loaded",{detail:{ai:this}})),this}catch(n){throw re.warn("Failed to load:",n),this.error=n,this.dispatchEvent(new CustomEvent("error",{detail:{ai:this,error:n}})),typeof window<"u"&&window.dispatchEvent(new CustomEvent("webweaver_error",{detail:{ai:this,error:n}})),n}}setModel(e){let t=this.models.find(o=>o.id==e);if(!t)throw new Error(`Model with ID "${e}" not found.`);let n={...t.config,stream:!0,systemMessage:"",onBeforeMessageProcessing:this.onBeforeMessageProcessing.bind(this),onAIMessage:this.processIncomingMessage.bind(this),onAIToolStart:(o,r)=>{let s=this.knowledgeBase.getCachedEntry(o);this.onAIToolStart?.(s?.id||o,r)}};this.config?.onCreateProvider?this.currentModel=this.config.onCreateProvider(n):t.config.providerID==="anthropic"?this.currentModel=new Ne(n):this.currentModel=new Ae(n),this.currentModel.id=t.id,this.currentModel.metadata=t}async getContextPrefix(){let e=b().pageSummary||`You are ${this.config?.name||"IntelliWeave"}. ${this.config?.instructions||"Speak in short sentences."}`;return typeof e=="function"&&(e=await e()),e}async onBeforeMessageProcessing(){this._lastKBsearch||(this._lastKBsearch="__intelliweaveblanksearchforcontextitems__");let e=this._nextRequestUseKBitems||await this.knowledgeBase.search(this._lastKBsearch);this._nextRequestUseKBitems=void 0;let t=await this.getContextPrefix();this.currentModel.contextGroup.add({id:"_iw_main",sortOrder:1,cannotRemove:!0,data:t}),this.currentModel.contextGroup.add({id:"_iw_kb_only_rule",sortOrder:2,cannotRemove:!0,disabled:!this.flags.onlyUseKnowledgeBase,data:"Important rule: Only use knowledge from your knowledge base to answer questions, do not speak about anything that is not included in your knowledge base."}),this.currentModel.contextGroup.add({id:"_iw_kb_rag",sortOrder:99,cannotRemove:!0,disabled:!this.knowledgeBase.allowRagSearch,data:Ce(`
35
35
  # RAG search
36
36
  Use the \`search\` tool proactively as much as possible to find missing information or tools.
37
37
  Use the \`search\` tool when you are unsure about specific details or actions to take.
@@ -39,20 +39,20 @@ ${n.extractions.map(i=>`- ${i.name} (${i.type}): ${i.description||"No descriptio
39
39
  If you're about to say "I don't have access..." or "I can't..." use the \`search\` tool first.
40
40
  `)}),this.currentModel.contextGroup.add({id:"_iw_kb_description",sortOrder:100,cannotRemove:!0,data:`# Knowledge Database${e.length==0?`
41
41
 
42
- (no items found)`:""}`});for(let i of e)if(i.type=="info"||i.type=="tour"||i.type=="input-event"){let o=Se(i.content),r=!0;if(i.attachments?.length)for(let s of i.attachments)s.url&&(r&&(o+=`
42
+ (no items found)`:""}`});for(let n of e)if(n.type=="info"||n.type=="tour"||n.type=="input-event"){let o=Ce(n.content),r=!0;if(n.attachments?.length)for(let s of n.attachments)s.url&&(r&&(o+=`
43
43
 
44
44
  \`\`\`yaml
45
45
  attachments:
46
46
  `,r=!1),o+=`- name: "${s.name||""}"
47
47
  mimetype: "${s.mimeType||""}"
48
48
  url: "${s.url}"
49
- `);r||(o+="```\n"),this.currentModel.contextGroup.add({id:i.id,data:`## ${i.type}: ${i.name}
50
- ${o}`,cannotRemove:i.isContext,sortOrder:101,disabled:typeof i.disabled=="function"?i.disabled(this):i.disabled})}else if(i.type=="action"){let o={name:i._functionID,description:Se(i.content),params:ht(i.parameters||[{name:"value",type:"string",description:"Input"}]),callback:r=>this.toolRunKBAction(i,r),canRemove:!i.isContext,kbItem:i};this.currentModel.registerTool(o)}else continue;for(let i of this.lastKBItems)!i.isContext||!i.id||e.find(r=>r.id==i.id)||(this.currentModel.contextGroup.remove(i.id),i._functionID&&this.currentModel.toolGroup.remove(i._functionID));this.lastKBItems=e}processIncomingMessage(e,t){if(!t){let i=this.currentModel?.stats?.tokensUsed||0,o=e.reduce((r,s)=>r+(s.usage?.totalTokens||0),0);C(this,{event_type:"message_receive",value:o,value_str:"",event_properties:{response_time_ms:Date.now()-(this._messageStartTime||Date.now()),is_streaming:!1,is_chunk:!1,total_tokens:i}})}this.dispatchEvent(new CustomEvent("output",{detail:{ai:this,isPartial:t,messages:e}})),this.onAIMessage?.(e,!!t)}async sendMessage(e,t){if(!this.currentModel)throw new Error("No model selected. Please call load() first.");if(this.isProcessing)throw new Error("Cannot send message while another message is being processed.");this.isProcessing=!0;try{this._messageStartTime=Date.now(),wt.has(this.conversationID)||(wt.add(this.conversationID),C(this,{event_type:"session_start"})),C(this,{event_type:"message_send",value_str:"",event_properties:{message_length:e.length,is_voice_input:!!this.audio?.speechRecognition?.isRunning}}),this.dispatchEvent(new CustomEvent("input",{detail:{ai:this,message:e}})),this.submitAnalyticsEvent({type:"message",role:"user",message:e});let i=Date.now(),o=await this.currentModel.sendMessage(e),r=new oe(o);(this._voiceTracker||A.debug.bind(A))(`LLM response took ${Date.now()-i}ms`);let l=this.currentModel.contextGroup.getAllAsString();l+=`
49
+ `);r||(o+="```\n"),this.currentModel.contextGroup.add({id:n.id,data:`## ${n.type}: ${n.name}
50
+ ${o}`,cannotRemove:n.isContext,sortOrder:101,disabled:typeof n.disabled=="function"?n.disabled(this):n.disabled})}else if(n.type=="action"){let o={name:n._functionID,description:Ce(n.content),params:ft(n.parameters||[{name:"value",type:"string",description:"Input"}]),callback:r=>this.toolRunKBAction(n,r),canRemove:!n.isContext,kbItem:n};this.currentModel.registerTool(o)}else continue;for(let n of this.lastKBItems)!n.isContext||!n.id||e.find(r=>r.id==n.id)||(this.currentModel.contextGroup.remove(n.id),n._functionID&&this.currentModel.toolGroup.remove(n._functionID));this.lastKBItems=e}processIncomingMessage(e,t){if(!t){let n=this.currentModel?.stats?.tokensUsed||0,o=e.reduce((r,s)=>r+(s.usage?.totalTokens||0),0);C(this,{event_type:"message_receive",value:o,value_str:"",event_properties:{response_time_ms:Date.now()-(this._messageStartTime||Date.now()),is_streaming:!1,is_chunk:!1,total_tokens:n}})}this.dispatchEvent(new CustomEvent("output",{detail:{ai:this,isPartial:t,messages:e}})),this.onAIMessage?.(e,!!t)}async sendMessage(e,t){if(!this.currentModel)throw new Error("No model selected. Please call load() first.");if(this.isProcessing)throw new Error("Cannot send message while another message is being processed.");this.isProcessing=!0;try{this._messageStartTime=Date.now(),It.has(this.conversationID)||(It.add(this.conversationID),C(this,{event_type:"session_start"})),C(this,{event_type:"message_send",value_str:"",event_properties:{message_length:e.length,is_voice_input:!!this.audio?.speechRecognition?.isRunning}}),this.dispatchEvent(new CustomEvent("input",{detail:{ai:this,message:e}})),this.submitAnalyticsEvent({type:"message",role:"user",message:e});let n=Date.now(),o=await this.currentModel.sendMessage(e),r=new ie(o);(this._voiceTracker||re.debug.bind(re))(`LLM response took ${Date.now()-n}ms`);let l=this.currentModel.contextGroup.getAllAsString();l+=`
51
51
 
52
52
  === TOOLS ===
53
53
 
54
54
  `+this.currentModel.toolGroup.getAll().map(u=>"- "+u.data?.name).join(`
55
- `),this._lastSystemMsg!=l&&(this._lastSystemMsg=l,this.submitAnalyticsEvent({type:"system-msg",txt:l}));for(let u of o)for(let c of u.sections||[])if(c.type=="text")this.submitAnalyticsEvent({type:"message",role:"assistant",message:c.text||""});else if(c.type=="thinking")this.submitAnalyticsEvent({type:"thinking",role:"assistant",message:c.text||""});else if(c.type=="tool_call"){let d=r.toolResult(c.toolCallInstanceID);this.submitAnalyticsEvent({type:"action",role:"assistant",action:c.toolKbID||"",actionName:c.toolKbName||"",value:c.toolParameters,result:d?.toolErrorResponse||d?.toolSuccessResponse,isError:!!d?.toolErrorResponse})}else c.type=="tool_result"||this.submitAnalyticsEvent({type:"other",role:"assistant"});return r}finally{this.isProcessing=!1}}async toolRunKBAction(e,t){let i=Date.now();try{this.dispatchEvent(new CustomEvent("toolstart",{detail:{knowledgeBaseEntry:e,input:t,ai:this}}));let o=await e.action(t,this),r=Date.now()-i;return C(this,{event_type:"tool_call",value_str:e.id||"",event_properties:{tool_args:t,execution_time_ms:r,success:!0}}),this.dispatchEvent(new CustomEvent("tool",{detail:{knowledgeBaseEntry:e,input:t,ai:this,result:o}})),o}catch(o){let r=Date.now()-i;throw C(this,{event_type:"tool_call",value_str:e.id||"",event_properties:{tool_args:t,execution_time_ms:r,success:!1,error_message:o.message}}),this.dispatchEvent(new CustomEvent("tool",{detail:{knowledgeBaseEntry:e,input:t,ai:this,error:o}})),o}}submitAnalyticsEvent(e){if(b().analytics===!1||this.config?.analytics===!1)return;let t=fetch(this.hubAPI+"/analytics/post",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...e,apiKey:this.apiKey,time:Date.now(),conversationID:this.conversationID,personaID:this.config?.id})}).catch(i=>{A.debug("Failed to submit analytics event:",i)});this.activeAnalyticsPromises.push(t),t.finally(()=>{this.activeAnalyticsPromises=this.activeAnalyticsPromises.filter(i=>i!==t)})}async waitForAnalytics(){this.activeAnalyticsPromises.length!==0&&(await Promise.all(this.activeAnalyticsPromises),this.activeAnalyticsPromises.length>0&&await this.waitForAnalytics())}resetConversation(){this.currentModel&&(this.currentModel.resetConversation(),this._lastKBsearch="",this._nextRequestUseKBitems=void 0,this.conversationID=yt(),this._lastSystemMsg="")}insertAssistantMessage(e){if(!this.currentModel)throw new Error("No model selected. Please call load() first.");this.currentModel.addAssistantMessage(e)}exportState(){return{type:"intelliweave/state/v2",conversationID:this.conversationID,messages:this.currentModel?.messageGroup.getAll()}}importState(e){if(!this.currentModel)throw new Error("No model selected. Please call load() first.");if(e?.type!="intelliweave/state/v2")throw new Error(`Invalid state type: ${e.type}`);this.conversationID=e.conversationID;for(let t of e.messages)this.currentModel.messageGroup.add(t)}clone(){let e=new Q;return e.apiKey=this.apiKey,e.config=this.config,e.models=this.models,this.config?.id&&e.setModel(this.config.id),e.audio=this.audio,e.vadModel=this.vadModel,e.userID=this.userID,e.knowledgeBase=this.knowledgeBase.clone(e),e}get messages(){return this.currentModel?.messageGroup.items||[]}};Q.version=Y.version,Q.builtInActionsVersion="1.2.0",A.debug(`Loaded: version=${Y.version} builtInActionsVersion=${Q.builtInActionsVersion}`);var U=Q;var L=class extends HTMLElement{constructor(){super(...arguments);this._state={}}get root(){return this._shadow}static register(){this._isRegistered||(this._isRegistered=!0,this.tagName||(this.tagName="anonymous-component-"+this.name.toLowerCase().replace(/[^a-z0-9-]/g,"-")+"--"+Math.random().toString(36).substring(2)),window.customElements.define(this.tagName,this))}static create(e={},t=""){this.register();let i=document.createElement(this.tagName);for(let o in e)i.setAttribute(o,e[o]);return i.onBeforeCreate(),i.innerHTML=t,i}static add(e={},t=""){this.register();let i=o=>o.replaceAll("&","&amp;").replaceAll('"',"&quot;").replaceAll("<","&lt;").replaceAll(">","&gt;");return`<${this.tagName} ${Object.keys(e).map(o=>`${o}="${i(e[o]+"")}"`).join(" ")}>${t}</${this.tagName}>`}static createElement(){return this.register(),document.createElement(this.tagName)}connectedCallback(){this._shadow||(this._shadow=this.attachShadow({mode:"closed"}),this._shadow.innerHTML=this.html(),this.onCreate()),this.onUpdate()}disconnectedCallback(){this._shadow=void 0,this.onDestroy()}html(){return""}onBeforeCreate(){}onCreate(){}onUpdate(){}onDestroy(){}attributeChangedCallback(e,t,i){this._shadow&&this.onUpdate()}get attr(){return this._attrProxy?this._attrProxy:(this._attrProxy=new Proxy({},{get:(e,t)=>this.getAttribute(t.toString())||"",set:(e,t,i)=>(this.getAttribute(t.toString())===i||(i?this.setAttribute(t.toString(),i):this.removeAttribute(t.toString()),this._shadow&&this.onUpdate()),!0)}),this._attrProxy)}get state(){return this._stateProxy?this._stateProxy:(this._stateProxy=new Proxy({},{get:(e,t)=>this._state[t],set:(e,t,i)=>(this._state[t]=i,this._shadow&&this.onUpdate(),!0)}),this._stateProxy)}hasChild(e){return!!this.root?.getElementById(e)}child(e){let t=this.root?.getElementById(e);if(!t)throw new Error(`Child with ID ${e} not found`);return t}};L.observedAttributes=[],L.tagName="",L._isRegistered=!1;var vt='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" width="200" height="200" style="shape-rendering: auto; display: block; " xmlns:xlink="http://www.w3.org/1999/xlink"><g><circle cx="84" cy="50" r="10" fill="%23797979">%0A <animate attributeName="r" repeatCount="indefinite" dur="0.5s" calcMode="spline" keyTimes="0;1" values="10;0" keySplines="0 0.5 0.5 1" begin="0s"></animate>%0A <animate attributeName="fill" repeatCount="indefinite" dur="2s" calcMode="discrete" keyTimes="0;0.25;0.5;0.75;1" values="%23797979;%23797979;%23797979;%23797979;%23797979" begin="0s"></animate>%0A</circle><circle cx="16" cy="50" r="10" fill="%23797979">%0A <animate attributeName="r" repeatCount="indefinite" dur="2s" calcMode="spline" keyTimes="0;0.25;0.5;0.75;1" values="0;0;10;10;10" keySplines="0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1" begin="0s"></animate>%0A <animate attributeName="cx" repeatCount="indefinite" dur="2s" calcMode="spline" keyTimes="0;0.25;0.5;0.75;1" values="16;16;16;50;84" keySplines="0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1" begin="0s"></animate>%0A</circle><circle cx="50" cy="50" r="10" fill="%23797979">%0A <animate attributeName="r" repeatCount="indefinite" dur="2s" calcMode="spline" keyTimes="0;0.25;0.5;0.75;1" values="0;0;10;10;10" keySplines="0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1" begin="-0.5s"></animate>%0A <animate attributeName="cx" repeatCount="indefinite" dur="2s" calcMode="spline" keyTimes="0;0.25;0.5;0.75;1" values="16;16;16;50;84" keySplines="0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1" begin="-0.5s"></animate>%0A</circle><circle cx="84" cy="50" r="10" fill="%23797979">%0A <animate attributeName="r" repeatCount="indefinite" dur="2s" calcMode="spline" keyTimes="0;0.25;0.5;0.75;1" values="0;0;10;10;10" keySplines="0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1" begin="-1s"></animate>%0A <animate attributeName="cx" repeatCount="indefinite" dur="2s" calcMode="spline" keyTimes="0;0.25;0.5;0.75;1" values="16;16;16;50;84" keySplines="0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1" begin="-1s"></animate>%0A</circle><circle cx="16" cy="50" r="10" fill="%23797979">%0A <animate attributeName="r" repeatCount="indefinite" dur="2s" calcMode="spline" keyTimes="0;0.25;0.5;0.75;1" values="0;0;10;10;10" keySplines="0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1" begin="-1.5s"></animate>%0A <animate attributeName="cx" repeatCount="indefinite" dur="2s" calcMode="spline" keyTimes="0;0.25;0.5;0.75;1" values="16;16;16;50;84" keySplines="0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1" begin="-1.5s"></animate>%0A</circle><g></g></g><!-- [ldio] generated by https://loading.io --></svg>';var xt='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" x="0" y="0" viewBox="0 0 475.085 475.085" style="enable-background:new 0 0 512 512" xml:space="preserve" class=""><g><path d="M237.541 328.897c25.128 0 46.632-8.946 64.523-26.83 17.888-17.884 26.833-39.399 26.833-64.525V91.365c0-25.126-8.938-46.632-26.833-64.525C284.173 8.951 262.669 0 237.541 0c-25.125 0-46.632 8.951-64.524 26.84-17.893 17.89-26.838 39.399-26.838 64.525v146.177c0 25.125 8.949 46.641 26.838 64.525 17.889 17.884 39.399 26.83 64.524 26.83z" fill="%23ffffff" opacity="1" data-original="%23000000" class=""></path><path d="M396.563 188.15c-3.606-3.617-7.898-5.426-12.847-5.426-4.944 0-9.226 1.809-12.847 5.426-3.613 3.616-5.421 7.898-5.421 12.845v36.547c0 35.214-12.518 65.333-37.548 90.362-25.022 25.03-55.145 37.545-90.36 37.545-35.214 0-65.334-12.515-90.365-37.545-25.028-25.022-37.541-55.147-37.541-90.362v-36.547c0-4.947-1.809-9.229-5.424-12.845-3.617-3.617-7.895-5.426-12.847-5.426s-9.235 1.809-12.85 5.426c-3.618 3.616-5.426 7.898-5.426 12.845v36.547c0 42.065 14.04 78.659 42.112 109.776 28.073 31.118 62.762 48.961 104.068 53.526v37.691h-73.089c-4.949 0-9.231 1.811-12.847 5.428-3.617 3.614-5.426 7.898-5.426 12.847 0 4.941 1.809 9.233 5.426 12.847 3.616 3.614 7.898 5.428 12.847 5.428h182.719c4.948 0 9.236-1.813 12.847-5.428 3.621-3.613 5.431-7.905 5.431-12.847 0-4.948-1.81-9.232-5.431-12.847-3.61-3.617-7.898-5.428-12.847-5.428h-73.08v-37.691c41.299-4.565 75.985-22.408 104.061-53.526 28.076-31.117 42.12-67.711 42.12-109.776v-36.547c0-4.946-1.813-9.225-5.435-12.845z" fill="%23ffffff" opacity="1" data-original="%23000000" class=""></path></g></svg>';var Mt='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" x="0" y="0" viewBox="0 0 448.075 448.075" style="enable-background:new 0 0 512 512" xml:space="preserve" class=""><g><path d="M352.021 16.075c0-6.08-3.52-11.84-8.96-14.4-5.76-2.88-12.16-1.92-16.96 1.92l-141.76 112.96 167.68 167.68zM443.349 420.747l-416-416c-6.24-6.24-16.384-6.24-22.624 0s-6.24 16.384 0 22.624l100.672 100.704h-9.376c-9.92 0-18.56 4.48-24.32 11.52-4.8 5.44-7.68 12.8-7.68 20.48v128c0 17.6 14.4 32 32 32h74.24l155.84 124.48c2.88 2.24 6.4 3.52 9.92 3.52 2.24 0 4.8-.64 7.04-1.6 5.44-2.56 8.96-8.32 8.96-14.4v-57.376l68.672 68.672c3.136 3.136 7.232 4.704 11.328 4.704s8.192-1.568 11.328-4.672c6.24-6.272 6.24-16.384 0-22.656z" fill="%23ffffff" opacity="1" data-original="%23000000" class=""></path></g></svg>';var fe=class extends L{constructor(){super(...arguments);this.html=()=>`
55
+ `),this._lastSystemMsg!=l&&(this._lastSystemMsg=l,this.submitAnalyticsEvent({type:"system-msg",txt:l}));for(let u of o)for(let c of u.sections||[])if(c.type=="text")this.submitAnalyticsEvent({type:"message",role:"assistant",message:c.text||""});else if(c.type=="thinking")this.submitAnalyticsEvent({type:"thinking",role:"assistant",message:c.text||""});else if(c.type=="tool_call"){let d=r.toolResult(c.toolCallInstanceID);this.submitAnalyticsEvent({type:"action",role:"assistant",action:c.toolKbID||"",actionName:c.toolKbName||"",value:c.toolParameters,result:d?.toolErrorResponse||d?.toolSuccessResponse,isError:!!d?.toolErrorResponse})}else c.type=="tool_result"||this.submitAnalyticsEvent({type:"other",role:"assistant"});return r}finally{this.isProcessing=!1}}async toolRunKBAction(e,t){let n=Date.now();try{this.dispatchEvent(new CustomEvent("toolstart",{detail:{knowledgeBaseEntry:e,input:t,ai:this}}));let o=await e.action(t,this),r=Date.now()-n;return C(this,{event_type:"tool_call",value_str:e.id||"",event_properties:{tool_args:t,execution_time_ms:r,success:!0}}),this.dispatchEvent(new CustomEvent("tool",{detail:{knowledgeBaseEntry:e,input:t,ai:this,result:o}})),o}catch(o){let r=Date.now()-n;throw C(this,{event_type:"tool_call",value_str:e.id||"",event_properties:{tool_args:t,execution_time_ms:r,success:!1,error_message:o.message}}),this.dispatchEvent(new CustomEvent("tool",{detail:{knowledgeBaseEntry:e,input:t,ai:this,error:o}})),o}}submitAnalyticsEvent(e){if(b().analytics===!1||this.config?.analytics===!1)return;let t=fetch(this.hubAPI+"/analytics/post",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...e,apiKey:this.apiKey,time:Date.now(),conversationID:this.conversationID,personaID:this.config?.id})}).catch(n=>{re.debug("Failed to submit analytics event:",n)});this.activeAnalyticsPromises.push(t),t.finally(()=>{this.activeAnalyticsPromises=this.activeAnalyticsPromises.filter(n=>n!==t)})}async waitForAnalytics(){this.activeAnalyticsPromises.length!==0&&(await Promise.all(this.activeAnalyticsPromises),this.activeAnalyticsPromises.length>0&&await this.waitForAnalytics())}resetConversation(){this.currentModel&&(this.currentModel.resetConversation(),this._lastKBsearch="",this._nextRequestUseKBitems=void 0,this.conversationID=Mt(),this._lastSystemMsg="")}insertAssistantMessage(e){if(!this.currentModel)throw new Error("No model selected. Please call load() first.");this.currentModel.addAssistantMessage(e)}exportState(){return{type:"intelliweave/state/v2",conversationID:this.conversationID,messages:this.currentModel?.messageGroup.getAll()}}importState(e){if(!this.currentModel)throw new Error("No model selected. Please call load() first.");if(e?.type!="intelliweave/state/v2")throw new Error(`Invalid state type: ${e.type}`);this.conversationID=e.conversationID;for(let t of e.messages)this.currentModel.messageGroup.add(t)}clone(){let e=new $;return e.apiKey=this.apiKey,e.config=this.config,e.models=this.models,this.config?.id&&e.setModel(this.config.id),e.audio=this.audio,e.vadModel=this.vadModel,e.userID=this.userID,e.knowledgeBase=this.knowledgeBase.clone(e),e}get messages(){return this.currentModel?.messageGroup.items||[]}};$.version=fe.version,$.builtInActionsVersion="1.2.0",re.debug(`Loaded: version=${fe.version} builtInActionsVersion=${$.builtInActionsVersion}`);var Y=$;var N=class extends HTMLElement{constructor(){super(...arguments);this._state={}}get root(){return this._shadow}static register(){this._isRegistered||(this._isRegistered=!0,this.tagName||(this.tagName="anonymous-component-"+this.name.toLowerCase().replace(/[^a-z0-9-]/g,"-")+"--"+Math.random().toString(36).substring(2)),window.customElements.define(this.tagName,this))}static create(e={},t=""){this.register();let n=document.createElement(this.tagName);for(let o in e)n.setAttribute(o,e[o]);return n.onBeforeCreate(),n.innerHTML=t,n}static add(e={},t=""){this.register();let n=o=>o.replaceAll("&","&amp;").replaceAll('"',"&quot;").replaceAll("<","&lt;").replaceAll(">","&gt;");return`<${this.tagName} ${Object.keys(e).map(o=>`${o}="${n(e[o]+"")}"`).join(" ")}>${t}</${this.tagName}>`}static createElement(){return this.register(),document.createElement(this.tagName)}connectedCallback(){this._shadow||(this._shadow=this.attachShadow({mode:"closed"}),this._shadow.innerHTML=this.html(),this.onCreate()),this.onUpdate()}disconnectedCallback(){this._shadow=void 0,this.onDestroy()}html(){return""}onBeforeCreate(){}onCreate(){}onUpdate(){}onDestroy(){}attributeChangedCallback(e,t,n){this._shadow&&this.onUpdate()}get attr(){return this._attrProxy?this._attrProxy:(this._attrProxy=new Proxy({},{get:(e,t)=>this.getAttribute(t.toString())||"",set:(e,t,n)=>(this.getAttribute(t.toString())===n||(n?this.setAttribute(t.toString(),n):this.removeAttribute(t.toString()),this._shadow&&this.onUpdate()),!0)}),this._attrProxy)}get state(){return this._stateProxy?this._stateProxy:(this._stateProxy=new Proxy({},{get:(e,t)=>this._state[t],set:(e,t,n)=>(this._state[t]=n,this._shadow&&this.onUpdate(),!0)}),this._stateProxy)}hasChild(e){return!!this.root?.getElementById(e)}child(e){let t=this.root?.getElementById(e);if(!t)throw new Error(`Child with ID ${e} not found`);return t}};N.observedAttributes=[],N.tagName="",N._isRegistered=!1;var kt='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" width="200" height="200" style="shape-rendering: auto; display: block; " xmlns:xlink="http://www.w3.org/1999/xlink"><g><circle cx="84" cy="50" r="10" fill="%23797979">%0A <animate attributeName="r" repeatCount="indefinite" dur="0.5s" calcMode="spline" keyTimes="0;1" values="10;0" keySplines="0 0.5 0.5 1" begin="0s"></animate>%0A <animate attributeName="fill" repeatCount="indefinite" dur="2s" calcMode="discrete" keyTimes="0;0.25;0.5;0.75;1" values="%23797979;%23797979;%23797979;%23797979;%23797979" begin="0s"></animate>%0A</circle><circle cx="16" cy="50" r="10" fill="%23797979">%0A <animate attributeName="r" repeatCount="indefinite" dur="2s" calcMode="spline" keyTimes="0;0.25;0.5;0.75;1" values="0;0;10;10;10" keySplines="0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1" begin="0s"></animate>%0A <animate attributeName="cx" repeatCount="indefinite" dur="2s" calcMode="spline" keyTimes="0;0.25;0.5;0.75;1" values="16;16;16;50;84" keySplines="0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1" begin="0s"></animate>%0A</circle><circle cx="50" cy="50" r="10" fill="%23797979">%0A <animate attributeName="r" repeatCount="indefinite" dur="2s" calcMode="spline" keyTimes="0;0.25;0.5;0.75;1" values="0;0;10;10;10" keySplines="0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1" begin="-0.5s"></animate>%0A <animate attributeName="cx" repeatCount="indefinite" dur="2s" calcMode="spline" keyTimes="0;0.25;0.5;0.75;1" values="16;16;16;50;84" keySplines="0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1" begin="-0.5s"></animate>%0A</circle><circle cx="84" cy="50" r="10" fill="%23797979">%0A <animate attributeName="r" repeatCount="indefinite" dur="2s" calcMode="spline" keyTimes="0;0.25;0.5;0.75;1" values="0;0;10;10;10" keySplines="0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1" begin="-1s"></animate>%0A <animate attributeName="cx" repeatCount="indefinite" dur="2s" calcMode="spline" keyTimes="0;0.25;0.5;0.75;1" values="16;16;16;50;84" keySplines="0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1" begin="-1s"></animate>%0A</circle><circle cx="16" cy="50" r="10" fill="%23797979">%0A <animate attributeName="r" repeatCount="indefinite" dur="2s" calcMode="spline" keyTimes="0;0.25;0.5;0.75;1" values="0;0;10;10;10" keySplines="0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1" begin="-1.5s"></animate>%0A <animate attributeName="cx" repeatCount="indefinite" dur="2s" calcMode="spline" keyTimes="0;0.25;0.5;0.75;1" values="16;16;16;50;84" keySplines="0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1;0 0.5 0.5 1" begin="-1.5s"></animate>%0A</circle><g></g></g><!-- [ldio] generated by https://loading.io --></svg>';var St='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" x="0" y="0" viewBox="0 0 475.085 475.085" style="enable-background:new 0 0 512 512" xml:space="preserve" class=""><g><path d="M237.541 328.897c25.128 0 46.632-8.946 64.523-26.83 17.888-17.884 26.833-39.399 26.833-64.525V91.365c0-25.126-8.938-46.632-26.833-64.525C284.173 8.951 262.669 0 237.541 0c-25.125 0-46.632 8.951-64.524 26.84-17.893 17.89-26.838 39.399-26.838 64.525v146.177c0 25.125 8.949 46.641 26.838 64.525 17.889 17.884 39.399 26.83 64.524 26.83z" fill="%23ffffff" opacity="1" data-original="%23000000" class=""></path><path d="M396.563 188.15c-3.606-3.617-7.898-5.426-12.847-5.426-4.944 0-9.226 1.809-12.847 5.426-3.613 3.616-5.421 7.898-5.421 12.845v36.547c0 35.214-12.518 65.333-37.548 90.362-25.022 25.03-55.145 37.545-90.36 37.545-35.214 0-65.334-12.515-90.365-37.545-25.028-25.022-37.541-55.147-37.541-90.362v-36.547c0-4.947-1.809-9.229-5.424-12.845-3.617-3.617-7.895-5.426-12.847-5.426s-9.235 1.809-12.85 5.426c-3.618 3.616-5.426 7.898-5.426 12.845v36.547c0 42.065 14.04 78.659 42.112 109.776 28.073 31.118 62.762 48.961 104.068 53.526v37.691h-73.089c-4.949 0-9.231 1.811-12.847 5.428-3.617 3.614-5.426 7.898-5.426 12.847 0 4.941 1.809 9.233 5.426 12.847 3.616 3.614 7.898 5.428 12.847 5.428h182.719c4.948 0 9.236-1.813 12.847-5.428 3.621-3.613 5.431-7.905 5.431-12.847 0-4.948-1.81-9.232-5.431-12.847-3.61-3.617-7.898-5.428-12.847-5.428h-73.08v-37.691c41.299-4.565 75.985-22.408 104.061-53.526 28.076-31.117 42.12-67.711 42.12-109.776v-36.547c0-4.946-1.813-9.225-5.435-12.845z" fill="%23ffffff" opacity="1" data-original="%23000000" class=""></path></g></svg>';var Tt='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" x="0" y="0" viewBox="0 0 448.075 448.075" style="enable-background:new 0 0 512 512" xml:space="preserve" class=""><g><path d="M352.021 16.075c0-6.08-3.52-11.84-8.96-14.4-5.76-2.88-12.16-1.92-16.96 1.92l-141.76 112.96 167.68 167.68zM443.349 420.747l-416-416c-6.24-6.24-16.384-6.24-22.624 0s-6.24 16.384 0 22.624l100.672 100.704h-9.376c-9.92 0-18.56 4.48-24.32 11.52-4.8 5.44-7.68 12.8-7.68 20.48v128c0 17.6 14.4 32 32 32h74.24l155.84 124.48c2.88 2.24 6.4 3.52 9.92 3.52 2.24 0 4.8-.64 7.04-1.6 5.44-2.56 8.96-8.32 8.96-14.4v-57.376l68.672 68.672c3.136 3.136 7.232 4.704 11.328 4.704s8.192-1.568 11.328-4.672c6.24-6.272 6.24-16.384 0-22.656z" fill="%23ffffff" opacity="1" data-original="%23000000" class=""></path></g></svg>';var ye=class extends N{constructor(){super(...arguments);this.html=()=>`
56
56
 
57
57
  <!-- Styling -->
58
58
  <style>
@@ -133,7 +133,7 @@ ${o}`,cannotRemove:i.isContext,sortOrder:101,disabled:typeof i.disabled=="functi
133
133
  }
134
134
 
135
135
  :host #loader {
136
- background-image: url('${vt}');
136
+ background-image: url('${kt}');
137
137
  background-size: 64px 64px;
138
138
  background-position: center;
139
139
  background-repeat: no-repeat;
@@ -156,7 +156,7 @@ ${o}`,cannotRemove:i.isContext,sortOrder:101,disabled:typeof i.disabled=="functi
156
156
  }
157
157
 
158
158
  :host #microphone-button {
159
- background-image: url('${xt}');
159
+ background-image: url('${St}');
160
160
  z-index: 2;
161
161
  margin-right: -10px;
162
162
  }
@@ -180,7 +180,7 @@ ${o}`,cannotRemove:i.isContext,sortOrder:101,disabled:typeof i.disabled=="functi
180
180
  }
181
181
 
182
182
  :host #cancel-speech-button {
183
- background-image: url('${Mt}');
183
+ background-image: url('${Tt}');
184
184
  z-index: 2;
185
185
  }
186
186
 
@@ -329,7 +329,7 @@ ${o}`,cannotRemove:i.isContext,sortOrder:101,disabled:typeof i.disabled=="functi
329
329
  <!-- Loader bar -->
330
330
  <div id='loader'></div>
331
331
 
332
- `;this._wasLoading=!1;this.voiceAnimationPieces=[];this._micAnimFrameCounter=0}onCreate(){this.child("input-field").addEventListener("keypress",e=>this.onInputKeyPress(e),{capture:!0}),this.child("input-field").addEventListener("keydown",e=>e.stopPropagation(),{capture:!0}),this.child("llm-button").addEventListener("click",e=>this.onLLMButtonClick(e)),this.child("send-button").addEventListener("click",e=>this.onSendButtonClick(e)),this.child("microphone-button").addEventListener("click",e=>this.onMicButtonClick(e)),this.child("cancel-speech-button").addEventListener("click",e=>this.onCancelSpeechButtonClick(e))}connectAI(e){this.ai=e,this.ai.audio?.speechRecognition.addEventListener("speech",t=>this.onSpeechEvent(t)),this.ai.audio?.speechRecognition.addEventListener("start",t=>this.onUpdate()),this.ai.audio?.speechRecognition.addEventListener("end",t=>this.onUpdate()),this.ai.audio?.speechOutput.addEventListener("speechstart",t=>this.onUpdate()),this.ai.audio?.speechOutput.addEventListener("speechend",t=>this.onUpdate()),this.onUpdate()}onUpdate(){this.attr.textColor&&document.documentElement.style.setProperty("--intelliweave-text-color",this.attr.textColor),this.child("input-field").style.display=this.attr.loading||this.ai?.audio?.speechRecognition.isRunning?"none":"",this.child("llm-button").style.display=this.attr.loading||!this.attr.llmButtonVisible||this.state.micActiv?"none":"",this.child("llm-button").innerText=this.attr.llmName||"LLM",this.child("send-button").style.display=this.attr.loading||this.ai?.audio?.speechRecognition.isRunning?"none":"",this.child("loader").style.display=this.attr.loading?"block":"",this.child("microphone-button").style.display=!this.ai?.audio?.speechRecognition?.isSupported||this.attr.loading&&!this.ai?.audio?.speechRecognition.isRunning?"none":"",this.child("cancel-speech-button").style.display="none",this.ai?.audio?.speechRecognition.isRunning&&this.ai?.audio?.speechOutput.isSpeaking&&(this.child("microphone-button").style.display="none",this.child("cancel-speech-button").style.display=""),!this.attr.loading&&this._wasLoading&&this.child("input-field").focus(),this._wasLoading=this.attr.loading,this.child("microphone-button-bg").classList.toggle("active",!!this.ai?.audio?.speechRecognition.isRunning);let e=this.ai?.audio?.speechRecognition.isRunning&&!this.attr.loading;e&&!this.micStateAnimationTimer?this.micStateAnimationTimer=setInterval(()=>this.onMicAnimation(),1e3/60):!e&&this.micStateAnimationTimer&&(this.voiceAnimationPieces.forEach(t=>t.remove()),this.voiceAnimationPieces=[],clearInterval(this.micStateAnimationTimer),this.micStateAnimationTimer=void 0)}onInputKeyPress(e){if(e.stopPropagation(),e.key!="Enter")return;let t=this.child("input-field"),i=t.value?.trim();t.value="",i&&this.dispatchEvent(new CustomEvent("input-message",{detail:i}))}onLLMButtonClick(e){e.preventDefault(),this.dispatchEvent(new CustomEvent("llm-button-click"))}onSendButtonClick(e){e.preventDefault();let t=this.child("input-field"),i=t.value?.trim();t.value="",i&&this.dispatchEvent(new CustomEvent("input-message",{detail:i}))}onMicButtonClick(e){e.preventDefault(),this.ai.audio?.speechRecognition.isRunning?this.ai.audio?.speechRecognition.stop():this.ai.audio?.speechRecognition.start()}onMicAnimation(){if(!this.attr.loading){if(this._micAnimFrameCounter++,this._micAnimFrameCounter%5==0){let e="rgba(140, 170, 200, 0.5)";this.ai?.audio?.speechRecognition.voiceDetection?.isModelLoaded||(e="rgba(255, 0, 0, 0.5)"),this.ai?.audio?.speechRecognition.voiceDetection?.isTranscribing&&(e="rgba(96, 66, 245, 0.9)"),this.ai?.audio?.speechRecognition.wordsCurrentlyBeingSpoken&&(e="rgba(0, 128, 255, 0.9)"),this.ai?.audio?.speechRecognition.voiceDetection?.isVoicePossiblyEnding&&(e="rgba(0, 128, 255, 0.5)"),this.ai?.isProcessing&&(e="rgba(255, 255, 0, 0.5)"),this.ai?.audio?.speechOutput.isSpeaking&&(e="rgba(0, 255, 0, 0.5)");let t=this.ai?.audio?.speechRecognition.volumeLevel||0,i=30,o=6,r=Math.round(t*(i-o)+o),s=document.createElement("div"),l=this.child("microphone-button"),u=l?l.offsetLeft+l.offsetWidth+8:62;s.posX=u,s.style.cssText=`position: absolute; top: calc(50% - ${r}px/2); left: 0px; width: 6px; height: ${r}px; background-color: ${e}; border-radius: 3px; pointer-events: none; `,this.root?.appendChild(s),this.voiceAnimationPieces.push(s)}for(let e=0;e<this.voiceAnimationPieces.length;e++){let t=this.voiceAnimationPieces[e];t.posX+=2,t.style.transform=`translate(${t.posX}px, 0px)`;let i=this.offsetWidth||600;t.posX<i||(this.voiceAnimationPieces.splice(e--,1),t.remove())}}}onSpeechEvent(e){this.attr.loading||e.detail.isFinal&&this.dispatchEvent(new CustomEvent("input-message",{detail:e.detail.transcript}))}onCancelSpeechButtonClick(e){this.ai.audio?.speechOutput.interrupt(),this.onUpdate()}};fe.observedAttributes=["loading","llmName","llmButtonVisible","textColor","layout"];var We='data:image/svg+xml,<svg id="eLjt8NmVnoY1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 300" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" project-id="defaf4a7213e40159eb368f9622a2af1" export-id="e0405e7e1d4a45c0a08fbbedb06a02a8" cached="false"><defs><radialGradient id="eLjt8NmVnoY6-fill" cx="0" cy="0" r="1" spreadMethod="pad" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-58.520001 292.985 -172.197 -34.394001 203.907 57.158)"><stop id="eLjt8NmVnoY6-fill-0" offset="0%" stop-color="%232b3d43"/><stop id="eLjt8NmVnoY6-fill-1" offset="33%" stop-color="%23328897"/><stop id="eLjt8NmVnoY6-fill-2" offset="58%" stop-color="%23328897"/><stop id="eLjt8NmVnoY6-fill-3" offset="100%" stop-color="%237ebf96"/></radialGradient><radialGradient id="eLjt8NmVnoY7-fill" cx="0" cy="0" r="1.112049" spreadMethod="pad" gradientUnits="userSpaceOnUse" gradientTransform="matrix(182.129 -94.016999 94.016999 182.129 43.4553 184.626)"><stop id="eLjt8NmVnoY7-fill-0" offset="0%" stop-color="%233f2d2d"/><stop id="eLjt8NmVnoY7-fill-1" offset="28%" stop-color="%23c83b35"/><stop id="eLjt8NmVnoY7-fill-2" offset="81%" stop-color="%23f69153"/><stop id="eLjt8NmVnoY7-fill-3" offset="100%" stop-color="%23ffe388"/></radialGradient><radialGradient id="eLjt8NmVnoY9-fill" cx="0" cy="0" r="593.59" spreadMethod="pad" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-0.196117 0.98058 -0.578542 -0.115709 406.499077 117.274778)"><stop id="eLjt8NmVnoY9-fill-0" offset="0%" stop-color="%23252d3a"/><stop id="eLjt8NmVnoY9-fill-1" offset="60%" stop-color="%23c50"/><stop id="eLjt8NmVnoY9-fill-2" offset="100%" stop-color="%23fddc85"/></radialGradient><radialGradient id="eLjt8NmVnoY10-fill" cx="0" cy="0" r="454.77" spreadMethod="pad" gradientUnits="userSpaceOnUse" gradientTransform="translate(87.33 340.7)"><stop id="eLjt8NmVnoY10-fill-0" offset="0%" stop-color="%23002936"/><stop id="eLjt8NmVnoY10-fill-1" offset="44%" stop-color="%23007aa1"/><stop id="eLjt8NmVnoY10-fill-2" offset="67%" stop-color="%2326ab7f"/><stop id="eLjt8NmVnoY10-fill-3" offset="100%" stop-color="%2395e0c8"/></radialGradient></defs><g transform="matrix(.339855 0 0 0.339855 65.056641 64.89012)"><path d="M337.93,111.85c17.31-4.12,30.6-2.15,38.55,5.96c12.9,13.16,10.13,41.58-7.64,77.95-34.66,70.98-116.01,153.37-181.35,183.6-4.15,1.92-8.16,3.6-12.02,5.03l.05.18C83.95,418.36,13.7,365.53,1.49,278.27C15.34,403.24,121.28,500.43,249.94,500.43c138.07,0,250-111.93,250-250c0-9.8-.58-19.46-1.68-28.96-12-82.27-75.81-133.5-160.33-109.62Z" fill="url(%23eLjt8NmVnoY9-fill)"/><path d="M249.94,0.43c-138.07,0-250,111.93-250,250c0,9.41.54,18.69,1.55,27.84C13.7,365.54,83.95,418.36,175.52,384.58l-.05-.18c-11.22,4.17-21.17,6.24-29.61,6.24-9.59,0-17.18-2.67-22.44-8.03-12.9-13.19-10.13-41.61,7.64-77.98c18.26-37.41,49.51-77.98,84.51-112.41c31.45-32.33,62.2-54.66,91.14-68.47.16-.08.34-.16.49-.23c1.74-.85,3.47-1.68,5.18-2.49c9.22-4.27,17.77-7.33,25.54-9.17c84.52-23.88,148.33,27.35,160.33,109.62C483.91,97.04,378.22,0.43,249.94,0.43Z" fill="url(%23eLjt8NmVnoY10-fill)"/><path d="M337.93,111.85c-7.77,1.84-16.32,4.9-25.54,9.17-1.71.8-3.45,1.63-5.18,2.49-.16.08-.34.16-.49.23-28.94,13.81-59.69,36.14-91.14,68.47-35,34.43-66.24,75-84.51,112.41-17.77,36.37-20.54,64.79-7.64,77.98c5.26,5.36,12.85,8.03,22.44,8.03c8.45,0,18.39-2.07,29.61-6.24c3.86-1.42,7.88-3.11,12.02-5.03c65.34-30.23,146.68-112.62,181.35-183.6c17.77-36.37,20.54-64.79,7.64-77.95-7.95-8.11-21.24-10.08-38.55-5.96h-.01Z" fill="%23252d3a"/></g></svg>%0D%0A';var be=class extends L{constructor(){super(...arguments);this.html=()=>`
332
+ `;this._wasLoading=!1;this.voiceAnimationPieces=[];this._micAnimFrameCounter=0}onCreate(){this.child("input-field").addEventListener("keypress",e=>this.onInputKeyPress(e),{capture:!0}),this.child("input-field").addEventListener("keydown",e=>e.stopPropagation(),{capture:!0}),this.child("llm-button").addEventListener("click",e=>this.onLLMButtonClick(e)),this.child("send-button").addEventListener("click",e=>this.onSendButtonClick(e)),this.child("microphone-button").addEventListener("click",e=>this.onMicButtonClick(e)),this.child("cancel-speech-button").addEventListener("click",e=>this.onCancelSpeechButtonClick(e))}connectAI(e){this.ai=e,this.ai.audio?.speechRecognition.addEventListener("speech",t=>this.onSpeechEvent(t)),this.ai.audio?.speechRecognition.addEventListener("start",t=>this.onUpdate()),this.ai.audio?.speechRecognition.addEventListener("end",t=>this.onUpdate()),this.ai.audio?.speechOutput.addEventListener("speechstart",t=>this.onUpdate()),this.ai.audio?.speechOutput.addEventListener("speechend",t=>this.onUpdate()),this.onUpdate()}onUpdate(){this.attr.textColor&&document.documentElement.style.setProperty("--intelliweave-text-color",this.attr.textColor),this.child("input-field").style.display=this.attr.loading||this.ai?.audio?.speechRecognition.isRunning?"none":"",this.child("llm-button").style.display=this.attr.loading||!this.attr.llmButtonVisible||this.state.micActiv?"none":"",this.child("llm-button").innerText=this.attr.llmName||"LLM",this.child("send-button").style.display=this.attr.loading||this.ai?.audio?.speechRecognition.isRunning?"none":"",this.child("loader").style.display=this.attr.loading?"block":"",this.child("microphone-button").style.display=!this.ai?.audio?.speechRecognition?.isSupported||this.attr.loading&&!this.ai?.audio?.speechRecognition.isRunning?"none":"",this.child("cancel-speech-button").style.display="none",this.ai?.audio?.speechRecognition.isRunning&&this.ai?.audio?.speechOutput.isSpeaking&&(this.child("microphone-button").style.display="none",this.child("cancel-speech-button").style.display=""),!this.attr.loading&&this._wasLoading&&this.child("input-field").focus(),this._wasLoading=this.attr.loading,this.child("microphone-button-bg").classList.toggle("active",!!this.ai?.audio?.speechRecognition.isRunning);let e=this.ai?.audio?.speechRecognition.isRunning&&!this.attr.loading;e&&!this.micStateAnimationTimer?this.micStateAnimationTimer=setInterval(()=>this.onMicAnimation(),1e3/60):!e&&this.micStateAnimationTimer&&(this.voiceAnimationPieces.forEach(t=>t.remove()),this.voiceAnimationPieces=[],clearInterval(this.micStateAnimationTimer),this.micStateAnimationTimer=void 0)}onInputKeyPress(e){if(e.stopPropagation(),e.key!="Enter")return;let t=this.child("input-field"),n=t.value?.trim();t.value="",n&&this.dispatchEvent(new CustomEvent("input-message",{detail:n}))}onLLMButtonClick(e){e.preventDefault(),this.dispatchEvent(new CustomEvent("llm-button-click"))}onSendButtonClick(e){e.preventDefault();let t=this.child("input-field"),n=t.value?.trim();t.value="",n&&this.dispatchEvent(new CustomEvent("input-message",{detail:n}))}onMicButtonClick(e){e.preventDefault(),this.ai.audio?.speechRecognition.isRunning?this.ai.audio?.speechRecognition.stop():this.ai.audio?.speechRecognition.start()}onMicAnimation(){if(!this.attr.loading){if(this._micAnimFrameCounter++,this._micAnimFrameCounter%5==0){let e="rgba(140, 170, 200, 0.5)";this.ai?.audio?.speechRecognition.voiceDetection?.isModelLoaded||(e="rgba(255, 0, 0, 0.5)"),this.ai?.audio?.speechRecognition.voiceDetection?.isTranscribing&&(e="rgba(96, 66, 245, 0.9)"),this.ai?.audio?.speechRecognition.wordsCurrentlyBeingSpoken&&(e="rgba(0, 128, 255, 0.9)"),this.ai?.audio?.speechRecognition.voiceDetection?.isVoicePossiblyEnding&&(e="rgba(0, 128, 255, 0.5)"),this.ai?.isProcessing&&(e="rgba(255, 255, 0, 0.5)"),this.ai?.audio?.speechOutput.isSpeaking&&(e="rgba(0, 255, 0, 0.5)");let t=this.ai?.audio?.speechRecognition.volumeLevel||0,n=30,o=6,r=Math.round(t*(n-o)+o),s=document.createElement("div"),l=this.child("microphone-button"),u=l?l.offsetLeft+l.offsetWidth+8:62;s.posX=u,s.style.cssText=`position: absolute; top: calc(50% - ${r}px/2); left: 0px; width: 6px; height: ${r}px; background-color: ${e}; border-radius: 3px; pointer-events: none; `,this.root?.appendChild(s),this.voiceAnimationPieces.push(s)}for(let e=0;e<this.voiceAnimationPieces.length;e++){let t=this.voiceAnimationPieces[e];t.posX+=2,t.style.transform=`translate(${t.posX}px, 0px)`;let n=this.offsetWidth||600;t.posX<n||(this.voiceAnimationPieces.splice(e--,1),t.remove())}}}onSpeechEvent(e){this.attr.loading||e.detail.isFinal&&this.dispatchEvent(new CustomEvent("input-message",{detail:e.detail.transcript}))}onCancelSpeechButtonClick(e){this.ai.audio?.speechOutput.interrupt(),this.onUpdate()}};ye.observedAttributes=["loading","llmName","llmButtonVisible","textColor","layout"];var Ge='data:image/svg+xml,<svg id="eLjt8NmVnoY1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 300" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" project-id="defaf4a7213e40159eb368f9622a2af1" export-id="e0405e7e1d4a45c0a08fbbedb06a02a8" cached="false"><defs><radialGradient id="eLjt8NmVnoY6-fill" cx="0" cy="0" r="1" spreadMethod="pad" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-58.520001 292.985 -172.197 -34.394001 203.907 57.158)"><stop id="eLjt8NmVnoY6-fill-0" offset="0%" stop-color="%232b3d43"/><stop id="eLjt8NmVnoY6-fill-1" offset="33%" stop-color="%23328897"/><stop id="eLjt8NmVnoY6-fill-2" offset="58%" stop-color="%23328897"/><stop id="eLjt8NmVnoY6-fill-3" offset="100%" stop-color="%237ebf96"/></radialGradient><radialGradient id="eLjt8NmVnoY7-fill" cx="0" cy="0" r="1.112049" spreadMethod="pad" gradientUnits="userSpaceOnUse" gradientTransform="matrix(182.129 -94.016999 94.016999 182.129 43.4553 184.626)"><stop id="eLjt8NmVnoY7-fill-0" offset="0%" stop-color="%233f2d2d"/><stop id="eLjt8NmVnoY7-fill-1" offset="28%" stop-color="%23c83b35"/><stop id="eLjt8NmVnoY7-fill-2" offset="81%" stop-color="%23f69153"/><stop id="eLjt8NmVnoY7-fill-3" offset="100%" stop-color="%23ffe388"/></radialGradient><radialGradient id="eLjt8NmVnoY9-fill" cx="0" cy="0" r="593.59" spreadMethod="pad" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-0.196117 0.98058 -0.578542 -0.115709 406.499077 117.274778)"><stop id="eLjt8NmVnoY9-fill-0" offset="0%" stop-color="%23252d3a"/><stop id="eLjt8NmVnoY9-fill-1" offset="60%" stop-color="%23c50"/><stop id="eLjt8NmVnoY9-fill-2" offset="100%" stop-color="%23fddc85"/></radialGradient><radialGradient id="eLjt8NmVnoY10-fill" cx="0" cy="0" r="454.77" spreadMethod="pad" gradientUnits="userSpaceOnUse" gradientTransform="translate(87.33 340.7)"><stop id="eLjt8NmVnoY10-fill-0" offset="0%" stop-color="%23002936"/><stop id="eLjt8NmVnoY10-fill-1" offset="44%" stop-color="%23007aa1"/><stop id="eLjt8NmVnoY10-fill-2" offset="67%" stop-color="%2326ab7f"/><stop id="eLjt8NmVnoY10-fill-3" offset="100%" stop-color="%2395e0c8"/></radialGradient></defs><g transform="matrix(.339855 0 0 0.339855 65.056641 64.89012)"><path d="M337.93,111.85c17.31-4.12,30.6-2.15,38.55,5.96c12.9,13.16,10.13,41.58-7.64,77.95-34.66,70.98-116.01,153.37-181.35,183.6-4.15,1.92-8.16,3.6-12.02,5.03l.05.18C83.95,418.36,13.7,365.53,1.49,278.27C15.34,403.24,121.28,500.43,249.94,500.43c138.07,0,250-111.93,250-250c0-9.8-.58-19.46-1.68-28.96-12-82.27-75.81-133.5-160.33-109.62Z" fill="url(%23eLjt8NmVnoY9-fill)"/><path d="M249.94,0.43c-138.07,0-250,111.93-250,250c0,9.41.54,18.69,1.55,27.84C13.7,365.54,83.95,418.36,175.52,384.58l-.05-.18c-11.22,4.17-21.17,6.24-29.61,6.24-9.59,0-17.18-2.67-22.44-8.03-12.9-13.19-10.13-41.61,7.64-77.98c18.26-37.41,49.51-77.98,84.51-112.41c31.45-32.33,62.2-54.66,91.14-68.47.16-.08.34-.16.49-.23c1.74-.85,3.47-1.68,5.18-2.49c9.22-4.27,17.77-7.33,25.54-9.17c84.52-23.88,148.33,27.35,160.33,109.62C483.91,97.04,378.22,0.43,249.94,0.43Z" fill="url(%23eLjt8NmVnoY10-fill)"/><path d="M337.93,111.85c-7.77,1.84-16.32,4.9-25.54,9.17-1.71.8-3.45,1.63-5.18,2.49-.16.08-.34.16-.49.23-28.94,13.81-59.69,36.14-91.14,68.47-35,34.43-66.24,75-84.51,112.41-17.77,36.37-20.54,64.79-7.64,77.98c5.26,5.36,12.85,8.03,22.44,8.03c8.45,0,18.39-2.07,29.61-6.24c3.86-1.42,7.88-3.11,12.02-5.03c65.34-30.23,146.68-112.62,181.35-183.6c17.77-36.37,20.54-64.79,7.64-77.95-7.95-8.11-21.24-10.08-38.55-5.96h-.01Z" fill="%23252d3a"/></g></svg>%0D%0A';var we=class extends N{constructor(){super(...arguments);this.html=()=>`
333
333
 
334
334
  <!-- Styling -->
335
335
  <style>
@@ -382,7 +382,7 @@ ${o}`,cannotRemove:i.isContext,sortOrder:101,disabled:typeof i.disabled=="functi
382
382
  <!-- Logo -->
383
383
  <img id='root' />
384
384
 
385
- `;this._lastLogoSrc=""}onCreate(){this.layoutUpdateTimer=setInterval(()=>this.onUpdate(),100)}onDestroy(){clearInterval(this.layoutUpdateTimer)}onUpdate(){let e=this.child("root");if(!e)return;let t=this.attr.logo||We;this._lastLogoSrc!=t&&(this._lastLogoSrc=t,e.src=t);let i=this.attr.focusID?document.getElementById(this.attr.focusID):null;if(i){let o=window.visualViewport?.offsetTop||0,r=window.visualViewport?.offsetLeft||0,s=i.getBoundingClientRect();if(!s)return;e.classList.add("focused-mode"),e.style.width="128px",e.style.height="128px",e.style.left=Math.round(s.x+s.width/2-128/2+r)+"px",e.style.top=Math.round(s.y+s.height/2-128/2+o)+"px"}else e.classList.remove("focused-mode"),e.style.width="",e.style.height="",e.style.left="",e.style.top=""}refreshLayout(){setTimeout(()=>this.onUpdate(),100)}};be.observedAttributes=["logo","focusID"];import Nt from"rehype-external-links";import At from"rehype-format";import Lt from"rehype-stringify";import Dt from"remark-gfm";import Wt from"remark-parse";import Gt from"remark-rehype";var Ge=(function(a){if(a==null)return pi;if(typeof a=="function")return Pe(a);if(typeof a=="object")return Array.isArray(a)?di(a):ci(a);if(typeof a=="string")return ui(a);throw new Error("Expected function, string, or object as test")});function di(a){let n=[],e=-1;for(;++e<a.length;)n[e]=Ge(a[e]);return Pe(t);function t(...i){let o=-1;for(;++o<n.length;)if(n[o].apply(this,i))return!0;return!1}}function ci(a){let n=a;return Pe(e);function e(t){let i=t,o;for(o in a)if(i[o]!==n[o])return!1;return!0}}function ui(a){return Pe(n);function n(e){return e&&e.type===a}}function Pe(a){return n;function n(e,t,i){return!!(hi(e)&&a.call(this,e,typeof t=="number"?t:void 0,i||void 0))}}function pi(){return!0}function hi(a){return a!==null&&typeof a=="object"&&"type"in a}var It=[],et=!0,Ze=!1,tt="skip";function it(a,n,e,t){let i;typeof n=="function"&&typeof e!="function"?(t=e,e=n):i=n;let o=Ge(i),r=t?-1:1;s(a,void 0,[])();function s(l,u,c){let d=l&&typeof l=="object"?l:{};if(typeof d.type=="string"){let p=typeof d.tagName=="string"?d.tagName:typeof d.name=="string"?d.name:void 0;Object.defineProperty(h,"name",{value:"node ("+(l.type+(p?"<"+p+">":""))+")"})}return h;function h(){let p=It,m,g,y;if((!n||o(l,u,c[c.length-1]||void 0))&&(p=mi(e(l,c)),p[0]===Ze))return p;if("children"in l&&l.children){let w=l;if(w.children&&p[0]!==tt)for(g=(t?w.children.length:-1)+r,y=c.concat(w);g>-1&&g<w.children.length;){let k=w.children[g];if(m=s(k,g,y)(),m[0]===Ze)return m;g=typeof m[1]=="number"?m[1]:g+r}}return p}}}function mi(a){return Array.isArray(a)?a:typeof a=="number"?[et,a]:a==null?It:[a]}function nt(a,n,e,t){let i,o,r;typeof n=="function"&&typeof e!="function"?(o=void 0,r=n,i=e):(o=n,r=e,i=t),it(a,o,s,i);function s(l,u){let c=u[u.length-1],d=c?c.children.indexOf(l):void 0;return r(l,d,c)}}import{unified as Pt}from"unified";var ye=class extends L{constructor(){super(...arguments);this.html=()=>`
385
+ `;this._lastLogoSrc=""}onCreate(){this.layoutUpdateTimer=setInterval(()=>this.onUpdate(),100)}onDestroy(){clearInterval(this.layoutUpdateTimer)}onUpdate(){let e=this.child("root");if(!e)return;let t=this.attr.logo||Ge;this._lastLogoSrc!=t&&(this._lastLogoSrc=t,e.src=t);let n=this.attr.focusID?document.getElementById(this.attr.focusID):null;if(n){let o=window.visualViewport?.offsetTop||0,r=window.visualViewport?.offsetLeft||0,s=n.getBoundingClientRect();if(!s)return;e.classList.add("focused-mode"),e.style.width="128px",e.style.height="128px",e.style.left=Math.round(s.x+s.width/2-128/2+r)+"px",e.style.top=Math.round(s.y+s.height/2-128/2+o)+"px"}else e.classList.remove("focused-mode"),e.style.width="",e.style.height="",e.style.left="",e.style.top=""}refreshLayout(){setTimeout(()=>this.onUpdate(),100)}};we.observedAttributes=["logo","focusID"];import Pt from"rehype-external-links";import Wt from"rehype-format";import Gt from"rehype-stringify";import Zt from"remark-gfm";import Rt from"remark-parse";import Xt from"remark-rehype";var Ze=(function(a){if(a==null)return xi;if(typeof a=="function")return Re(a);if(typeof a=="object")return Array.isArray(a)?yi(a):wi(a);if(typeof a=="string")return vi(a);throw new Error("Expected function, string, or object as test")});function yi(a){let i=[],e=-1;for(;++e<a.length;)i[e]=Ze(a[e]);return Re(t);function t(...n){let o=-1;for(;++o<i.length;)if(i[o].apply(this,n))return!0;return!1}}function wi(a){let i=a;return Re(e);function e(t){let n=t,o;for(o in a)if(n[o]!==i[o])return!1;return!0}}function vi(a){return Re(i);function i(e){return e&&e.type===a}}function Re(a){return i;function i(e,t,n){return!!(Mi(e)&&a.call(this,e,typeof t=="number"?t:void 0,n||void 0))}}function xi(){return!0}function Mi(a){return a!==null&&typeof a=="object"&&"type"in a}var Ct=[],nt=!0,Xe=!1,ot="skip";function rt(a,i,e,t){let n;typeof i=="function"&&typeof e!="function"?(t=e,e=i):n=i;let o=Ze(n),r=t?-1:1;s(a,void 0,[])();function s(l,u,c){let d=l&&typeof l=="object"?l:{};if(typeof d.type=="string"){let p=typeof d.tagName=="string"?d.tagName:typeof d.name=="string"?d.name:void 0;Object.defineProperty(h,"name",{value:"node ("+(l.type+(p?"<"+p+">":""))+")"})}return h;function h(){let p=Ct,m,f,y;if((!i||o(l,u,c[c.length-1]||void 0))&&(p=Ii(e(l,c)),p[0]===Xe))return p;if("children"in l&&l.children){let w=l;if(w.children&&p[0]!==ot)for(f=(t?w.children.length:-1)+r,y=c.concat(w);f>-1&&f<w.children.length;){let k=w.children[f];if(m=s(k,f,y)(),m[0]===Xe)return m;f=typeof m[1]=="number"?m[1]:f+r}}return p}}}function Ii(a){return Array.isArray(a)?a:typeof a=="number"?[nt,a]:a==null?Ct:[a]}function st(a,i,e,t){let n,o,r;typeof i=="function"&&typeof e!="function"?(o=void 0,r=i,n=e):(o=i,r=e,n=t),rt(a,o,s,n);function s(l,u){let c=u[u.length-1],d=c?c.children.indexOf(l):void 0;return r(l,d,c)}}import{unified as Bt}from"unified";var ve=class extends N{constructor(){super(...arguments);this.html=()=>`
386
386
 
387
387
  <!-- Styling -->
388
388
  <style>
@@ -465,11 +465,11 @@ ${o}`,cannotRemove:i.isContext,sortOrder:101,disabled:typeof i.disabled=="functi
465
465
  <div id='llm-selector-list'></div>
466
466
  </div>
467
467
 
468
- `}onUpdate(){this.child("llm-selector-panel").className=this.attr.open?"open":"closed";let e=this.child("llm-selector-list");for(;e.lastChild;)e.lastChild.remove();for(let t of this.state.items||[]){let i=document.createElement("div");i.className="llm-selector-item"+(t.id==this.state.selectedID?" selected":""),i.innerHTML=`
468
+ `}onUpdate(){this.child("llm-selector-panel").className=this.attr.open?"open":"closed";let e=this.child("llm-selector-list");for(;e.lastChild;)e.lastChild.remove();for(let t of this.state.items||[]){let n=document.createElement("div");n.className="llm-selector-item"+(t.id==this.state.selectedID?" selected":""),n.innerHTML=`
469
469
  <div class='llm-selector-item-icon' style="background-image: url('${t.icon}'); "></div>
470
470
  <div class='llm-selector-item-name'>${t.name}</div>
471
471
  <div class='llm-selector-item-provider'>${t.provider}</div>
472
- `,i.addEventListener("click",o=>{this.dispatchEvent(new CustomEvent("select",{detail:t.id}))}),e.appendChild(i)}}};ye.observedAttributes=["open"];var re=new f("ONNXModel"),X=class a{constructor(n){this.stateTensors={};this.constantTensors={};this._runActive=!1;this.ignoreIfBusy=!1;this.session=n,re.debug(`Model input parameters: ${n.inputNames.join(", ")}`),re.debug(`Model output parameters: ${n.outputNames.join(", ")}`)}static isSupported(){return!!a.lib}static async load(n){if(!a.lib)throw new Error("ONNX runtime not loaded, please set the runtime loader. Example: ONNXModel.lib = () => import('onnxruntime-web')");this.onnx||(re.debug("Loading ONNX runtime"),this.onnx=await a.lib()),re.debug(`Loading model: ${n}`);let e=await this.onnx.InferenceSession.create(n);return new a(e)}makeTensor(n,e,t=0){let i=1;for(let r of e)i*=r;let o;if(n=="float32")o=new a.onnx.Tensor(new Float32Array(i),e);else if(n=="int8")o=new a.onnx.Tensor(new Int8Array(i),e);else if(n=="int16")o=new a.onnx.Tensor(new Int16Array(i),e);else if(n=="int32")o=new a.onnx.Tensor(new Int32Array(i),e);else if(n=="int64")o=new a.onnx.Tensor(new BigInt64Array(i),e);else if(n=="uint8")o=new a.onnx.Tensor(new Uint8Array(i),e);else if(n=="uint16")o=new a.onnx.Tensor(new Uint16Array(i),e);else if(n=="uint32")o=new a.onnx.Tensor(new Uint32Array(i),e);else if(n=="uint64")o=new a.onnx.Tensor(new BigUint64Array(i),e);else throw new Error(`Invalid type: ${n}`);return t!==0&&(n=="int64"||n=="uint64")?o.data.fill(BigInt(t)):t!==0&&o.data.fill(t),o}registerConstant(n,e){if(!this.session.inputNames.includes(n))throw new Error(`Model does not have an input named: ${n}`);return this.constantTensors[n]=e,e}makeConstant(n,e,t,i=0){return this.registerConstant(n,this.makeTensor(e,t,i))}registerState(n,e,t){if(e||(e=n),!this.session.inputNames.includes(n))throw new Error(`Model does not have an input named: ${n}`);if(!this.session.outputNames.includes(e))throw new Error(`Model does not have an output named: ${e}`);return this.stateTensors[n]={outputName:e,tensor:t},t}makeState(n,e,t,i,o=0){return this.registerState(n,e,this.makeTensor(t,i,o))}async run(n={}){if(this._runActive&&this.ignoreIfBusy)return re.debug("Ignoring run request because a previous run is still active");if(this._runActive)throw new Error("A previous run is still active");this._runActive=!0;for(let e in this.stateTensors)n[e]=this.stateTensors[e].tensor;for(let e in this.constantTensors)n[e]=this.constantTensors[e];try{let e=await this.session.run(n);for(let t in this.stateTensors){let i=e[this.stateTensors[t].outputName];this.stateTensors[t].tensor=i}return e}finally{this._runActive=!1}}resetState(){re.debug("Resetting state tensors");for(let n in this.stateTensors)this.stateTensors[n].tensor.data.fill(0)}};var kt="data:application/javascript;base64,dmFyIGM9Y2xhc3N7Y29uc3RydWN0b3IoaSx0KXt0aGlzLm91dHB1dEJ1ZmZlclNpemU9MDt0aGlzLnBhcnRpYWxCdWZmZXJzPVtdO3RoaXMucGFydGlhbEJ1ZmZlck9mZnNldD0wO2lmKCFpKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhcnJheSBjbGFzczogJHtpfWApO2lmKCF0fHx0PD0wKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvdXRwdXQgYnVmZmVyIHNpemU6ICR7dH1gKTt0aGlzLkFycmF5Q2xhc3M9aSx0aGlzLm91dHB1dEJ1ZmZlclNpemU9dH1nZXQgcXVldWVkU2l6ZSgpe3JldHVybiB0aGlzLnBhcnRpYWxCdWZmZXJzLnJlZHVjZSgoaSx0KT0+aSt0Lmxlbmd0aCwwKX1mZWVkKGkpe3RoaXMucGFydGlhbEJ1ZmZlcnMucHVzaChpKX1nZXQgY2FuRHJhaW4oKXtyZXR1cm4gdGhpcy5wYXJ0aWFsQnVmZmVycy5yZWR1Y2UoKHQscik9PnQrci5sZW5ndGgsMCktdGhpcy5wYXJ0aWFsQnVmZmVyT2Zmc2V0Pj10aGlzLm91dHB1dEJ1ZmZlclNpemV9ZHJhaW4oKXtpZighdGhpcy5jYW5EcmFpbilyZXR1cm4gbnVsbDtsZXQgaT10aGlzLkFycmF5Q2xhc3MsdD1uZXcgaSh0aGlzLm91dHB1dEJ1ZmZlclNpemUpLHI9MDtmb3IoO3IhPXQubGVuZ3RoOyl7aWYocj50Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYEJ1ZmZlciBvdmVyZmxvdzogJHtyfSA+ICR7dC5sZW5ndGh9YCk7bGV0IGE9dC5sZW5ndGgtcixzPXRoaXMucGFydGlhbEJ1ZmZlcnNbMF0sZj1zLmxlbmd0aC10aGlzLnBhcnRpYWxCdWZmZXJPZmZzZXQ7ZjxhPyh0LnNldChzLnN1YmFycmF5KHRoaXMucGFydGlhbEJ1ZmZlck9mZnNldCkscikscis9Zix0aGlzLnBhcnRpYWxCdWZmZXJzLnNoaWZ0KCksdGhpcy5wYXJ0aWFsQnVmZmVyT2Zmc2V0PTApOih0LnNldChzLnN1YmFycmF5KHRoaXMucGFydGlhbEJ1ZmZlck9mZnNldCx0aGlzLnBhcnRpYWxCdWZmZXJPZmZzZXQrYSkscikscis9YSx0aGlzLnBhcnRpYWxCdWZmZXJPZmZzZXQrPWEpfXJldHVybiB0fXBhZCgpe2xldCBpPXRoaXMucXVldWVkU2l6ZSV0aGlzLm91dHB1dEJ1ZmZlclNpemU7aWYoaT09MClyZXR1cm47bGV0IHQ9dGhpcy5BcnJheUNsYXNzLHI9bmV3IHQoaSk7dGhpcy5mZWVkKHIpfX07dmFyIGQ9Y2xhc3N7Y29uc3RydWN0b3IoaSx0LHIsYSl7aWYoIWl8fCF0fHwhcil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc2V0dGluZ3Mgc3BlY2lmaWVkIGZvciB0aGUgcmVzYW1wbGVyLiIpO3RoaXMucmVzYW1wbGVyPW51bGwsdGhpcy5mcm9tU2FtcGxlUmF0ZT1pLHRoaXMudG9TYW1wbGVSYXRlPXQsdGhpcy5jaGFubmVscz1yfHwwLHRoaXMuaW5wdXRCdWZmZXJTaXplPWEsdGhpcy5pbml0aWFsaXplKCl9aW5pdGlhbGl6ZSgpe3RoaXMuZnJvbVNhbXBsZVJhdGU9PXRoaXMudG9TYW1wbGVSYXRlPyh0aGlzLnJlc2FtcGxlcj1pPT5pLHRoaXMucmF0aW9XZWlnaHQ9MSk6KHRoaXMuZnJvbVNhbXBsZVJhdGU8dGhpcy50b1NhbXBsZVJhdGU/KHRoaXMubGluZWFySW50ZXJwb2xhdGlvbigpLHRoaXMubGFzdFdlaWdodD0xKToodGhpcy5tdWx0aVRhcCgpLHRoaXMudGFpbEV4aXN0cz0hMSx0aGlzLmxhc3RXZWlnaHQ9MCksdGhpcy5pbml0aWFsaXplQnVmZmVycygpLHRoaXMucmF0aW9XZWlnaHQ9dGhpcy5mcm9tU2FtcGxlUmF0ZS90aGlzLnRvU2FtcGxlUmF0ZSl9YnVmZmVyU2xpY2UoaSl7dHJ5e3JldHVybiB0aGlzLm91dHB1dEJ1ZmZlci5zdWJhcnJheSgwLGkpfWNhdGNoe3RyeXtyZXR1cm4gdGhpcy5vdXRwdXRCdWZmZXIubGVuZ3RoPWksdGhpcy5vdXRwdXRCdWZmZXJ9Y2F0Y2h7cmV0dXJuIHRoaXMub3V0cHV0QnVmZmVyLnNsaWNlKDAsaSl9fX1pbml0aWFsaXplQnVmZmVycygpe3RoaXMub3V0cHV0QnVmZmVyU2l6ZT1NYXRoLmNlaWwodGhpcy5pbnB1dEJ1ZmZlclNpemUqdGhpcy50b1NhbXBsZVJhdGUvdGhpcy5mcm9tU2FtcGxlUmF0ZS90aGlzLmNoYW5uZWxzKjEuMDAwMDAwNDc2ODM3MTU4MikrdGhpcy5jaGFubmVscyt0aGlzLmNoYW5uZWxzO3RyeXt0aGlzLm91dHB1dEJ1ZmZlcj1uZXcgRmxvYXQzMkFycmF5KHRoaXMub3V0cHV0QnVmZmVyU2l6ZSksdGhpcy5sYXN0T3V0cHV0PW5ldyBGbG9hdDMyQXJyYXkodGhpcy5jaGFubmVscyl9Y2F0Y2h7dGhpcy5vdXRwdXRCdWZmZXI9W10sdGhpcy5sYXN0T3V0cHV0PVtdfX1saW5lYXJJbnRlcnBvbGF0aW9uKCl7dGhpcy5yZXNhbXBsZXI9aT0+e2xldCB0PWkubGVuZ3RoLHI9dGhpcy5jaGFubmVscyxhLHMsZixoLGUsbix1LG8sbDtpZih0JXIhPT0wKXRocm93IG5ldyBFcnJvcigiQnVmZmVyIHdhcyBvZiBpbmNvcnJlY3Qgc2FtcGxlIGxlbmd0aC4iKTtpZih0PD0wKXJldHVybltdO2ZvcihhPXRoaXMub3V0cHV0QnVmZmVyU2l6ZSxzPXRoaXMucmF0aW9XZWlnaHQsZj10aGlzLmxhc3RXZWlnaHQsaD0wLGU9MCxuPTAsdT0wLG89dGhpcy5vdXRwdXRCdWZmZXI7ZjwxO2YrPXMpZm9yKGU9ZiUxLGg9MS1lLHRoaXMubGFzdFdlaWdodD1mJTEsbD0wO2w8dGhpcy5jaGFubmVsczsrK2wpb1t1KytdPXRoaXMubGFzdE91dHB1dFtsXSpoK2lbbF0qZTtmb3IoZi09MSx0LT1yLG49TWF0aC5mbG9vcihmKSpyO3U8YSYmbjx0Oyl7Zm9yKGU9ZiUxLGg9MS1lLGw9MDtsPHRoaXMuY2hhbm5lbHM7KytsKW9bdSsrXT1pW24rKGw+MD9sOjApXSpoK2lbbisocitsKV0qZTtmKz1zLG49TWF0aC5mbG9vcihmKSpyfWZvcihsPTA7bDxyOysrbCl0aGlzLmxhc3RPdXRwdXRbbF09aVtuKytdO3JldHVybiB0aGlzLmJ1ZmZlclNsaWNlKHUpfX1tdWx0aVRhcCgpe3RoaXMucmVzYW1wbGVyPWk9PntsZXQgdD1pLmxlbmd0aCxyLGEscz10aGlzLmNoYW5uZWxzLGYsaCxlLG4sdSxvLGwsbSxnO2lmKHQlcyE9PTApdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIgd2FzIG9mIGluY29ycmVjdCBzYW1wbGUgbGVuZ3RoLiIpO2lmKHQ8PTApcmV0dXJuW107Zm9yKHI9dGhpcy5vdXRwdXRCdWZmZXJTaXplLGE9W10sZj10aGlzLnJhdGlvV2VpZ2h0LGg9MCxuPTAsdT0wLG89IXRoaXMudGFpbEV4aXN0cyx0aGlzLnRhaWxFeGlzdHM9ITEsbD10aGlzLm91dHB1dEJ1ZmZlcixtPTAsZz0wLGU9MDtlPHM7KytlKWFbZV09MDtkb3tpZihvKWZvcihoPWYsZT0wO2U8czsrK2UpYVtlXT0wO2Vsc2V7Zm9yKGg9dGhpcy5sYXN0V2VpZ2h0LGU9MDtlPHM7KytlKWFbZV09dGhpcy5sYXN0T3V0cHV0W2VdO289ITB9Zm9yKDtoPjAmJm48dDspaWYodT0xK24tZyxoPj11KXtmb3IoZT0wO2U8czsrK2UpYVtlXSs9aVtuKytdKnU7Zz1uLGgtPXV9ZWxzZXtmb3IoZT0wO2U8czsrK2UpYVtlXSs9aVtuKyhlPjA/ZTowKV0qaDtnKz1oLGg9MDticmVha31pZihoPT09MClmb3IoZT0wO2U8czsrK2UpbFttKytdPWFbZV0vZjtlbHNle2Zvcih0aGlzLmxhc3RXZWlnaHQ9aCxlPTA7ZTxzOysrZSl0aGlzLmxhc3RPdXRwdXRbZV09YVtlXTt0aGlzLnRhaWxFeGlzdHM9ITA7YnJlYWt9fXdoaWxlKG48dCYmbTxyKTtyZXR1cm4gdGhpcy5idWZmZXJTbGljZShtKX19cmVzYW1wbGUoaSl7cmV0dXJuIHRoaXMuZnJvbVNhbXBsZVJhdGU9PXRoaXMudG9TYW1wbGVSYXRlP3RoaXMucmF0aW9XZWlnaHQ9MToodGhpcy5mcm9tU2FtcGxlUmF0ZTx0aGlzLnRvU2FtcGxlUmF0ZT90aGlzLmxhc3RXZWlnaHQ9MToodGhpcy50YWlsRXhpc3RzPSExLHRoaXMubGFzdFdlaWdodD0wKSx0aGlzLmluaXRpYWxpemVCdWZmZXJzKCksdGhpcy5yYXRpb1dlaWdodD10aGlzLmZyb21TYW1wbGVSYXRlL3RoaXMudG9TYW1wbGVSYXRlKSx0aGlzLnJlc2FtcGxlcihpKX19O2Z1bmN0aW9uIFMocCl7bGV0IGk9cC5sZW5ndGgsdD1uZXcgRmxvYXQzMkFycmF5KGkpO2Zvcig7aS0tOyl7bGV0IHI9cFtpXTt0W2ldPXI+PTMyNzY4Py0oNjU1MzYtcikvMzI3Njg6ci8zMjc2N31yZXR1cm4gdH12YXIgeT0xMDI0KjgsQj1jbGFzcyBleHRlbmRzIEF1ZGlvV29ya2xldFByb2Nlc3Nvcntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTt0aGlzLmNodW5rcz1bXTt0aGlzLmNodW5rUG9zaXRpb249MDt0aGlzLmlzRW5kZWQ9ITE7dGhpcy5pc0NhbmNlbGxlZD0hMTt0aGlzLnNhbXBsZVJhdGU9MDt0aGlzLmZvcm1hdD0iaW50MTYiO3RoaXMuYnVmZmVyT2Zmc2V0PTA7dGhpcy5sYXN0UGxheWVkQnVmZmVyU2l6ZT0wO3RoaXMuX2hhc1NlbnRFbmRFdmVudD0hMTt0aGlzLnBvcnQub25tZXNzYWdlPXI9PnRoaXMub25NZXNzYWdlKHIpfW9uTWVzc2FnZSh0KXtpZih0LmRhdGEuYWN0aW9uPT0ic3RhcnQiKXRoaXMuZm9ybWF0PXQuZGF0YS5mb3JtYXQsdGhpcy5zYW1wbGVSYXRlPXQuZGF0YS5pbnB1dFNhbXBsZVJhdGUsdGhpcy5yZXNhbXBsZXI9bmV3IGQodC5kYXRhLmlucHV0U2FtcGxlUmF0ZSx0LmRhdGEub3V0cHV0U2FtcGxlUmF0ZSwxLHkpLHRoaXMuZm9ybWF0PT0iaW50MTYiP3RoaXMuaW5wdXRCdWZmZXI9bmV3IGMoVWludDhBcnJheSx5KjIpOnRoaXMuZm9ybWF0PT0iZmxvYXQzMiImJih0aGlzLmlucHV0QnVmZmVyPW5ldyBjKFVpbnQ4QXJyYXkseSo0KSk7ZWxzZSBpZih0LmRhdGEuYWN0aW9uPT0iZGF0YSIpe2xldCByPW5ldyBVaW50OEFycmF5KHQuZGF0YS5idWZmZXIpO2Zvcih0aGlzLmlucHV0QnVmZmVyLmZlZWQocik7dGhpcy5pbnB1dEJ1ZmZlci5jYW5EcmFpbjspdGhpcy5kcmFpbkJ1ZmZlcigpfWVsc2UgdC5kYXRhLmFjdGlvbj09ImVuZCI/KHRoaXMubGFzdFBsYXllZEJ1ZmZlclNpemUmJnRoaXMuY2h1bmtzLnB1c2gobmV3IEZsb2F0MzJBcnJheSh0aGlzLmxhc3RQbGF5ZWRCdWZmZXJTaXplKjIpKSx0aGlzLmlzRW5kZWQ9ITApOnQuZGF0YS5hY3Rpb249PSJjYW5jZWwiJiYodGhpcy5pc0VuZGVkPSEwLHRoaXMuaXNDYW5jZWxsZWQ9ITApfWRyYWluQnVmZmVyKCl7bGV0IHQ9dGhpcy5pbnB1dEJ1ZmZlci5kcmFpbigpO2lmKCF0KXJldHVybjtsZXQgcjtpZih0aGlzLmZvcm1hdD09ImludDE2Iil7bGV0IHM9bmV3IEludDE2QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aC8yKTtyPVMocyl9ZWxzZSBpZih0aGlzLmZvcm1hdD09ImZsb2F0MzIiKXI9bmV3IEZsb2F0MzJBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoLzQpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZvcm1hdDogJHt0aGlzLmZvcm1hdH1gKTtsZXQgYT10aGlzLnJlc2FtcGxlci5yZXNhbXBsZShyKTt0aGlzLmNodW5rcy5wdXNoKGEpfW5leHRGbG9hdCgpe2lmKCF0aGlzLmNodW5rcy5sZW5ndGgpcmV0dXJuIDA7bGV0IHQ9dGhpcy5jaHVua3NbMF1bdGhpcy5jaHVua1Bvc2l0aW9uXTtyZXR1cm4gdGhpcy5jaHVua1Bvc2l0aW9uKyssdGhpcy5jaHVua1Bvc2l0aW9uPHRoaXMuY2h1bmtzWzBdLmxlbmd0aHx8KHRoaXMuY2h1bmtzLnNoaWZ0KCksdGhpcy5jaHVua1Bvc2l0aW9uPTApLHR9cHJvY2Vzcyh0LHIsYSl7aWYodGhpcy5pc0NhbmNlbGxlZClyZXR1cm4hMTtpZih0aGlzLmlzRW5kZWQmJiF0aGlzLmNodW5rcy5sZW5ndGgpcmV0dXJuIHRoaXMuX2hhc1NlbnRFbmRFdmVudHx8KHRoaXMuX2hhc1NlbnRFbmRFdmVudD0hMCx0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe2FjdGlvbjoiZW5kIn0pKSwhMTtsZXQgcz1yWzBdPy5bMF0/Lmxlbmd0aDtpZighcylyZXR1cm4hMDt0aGlzLmxhc3RQbGF5ZWRCdWZmZXJTaXplPXM7Zm9yKGxldCBmPTA7ZjxzO2YrKyl7bGV0IGg9dGhpcy5uZXh0RmxvYXQoKTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrKylmb3IobGV0IG49MDtuPHJbZV0ubGVuZ3RoO24rKylyW2VdW25dW2ZdPWh9cmV0dXJuITB9fTtyZWdpc3RlclByb2Nlc3NvcigicGNtLXBsYXllci1ub2RlIixCKTsK";var fi=new f("PCMPlayerNode"),se=class extends AudioWorkletNode{constructor(e,t,i){super(e,"pcm-player-node",{numberOfInputs:0});this.sampleRate=0;this.format="int16";this.isCancelled=!1;if(!t||t<=0)throw new Error(`Invalid sample rate: ${t}`);if(!i||i!="int16"&&i!="float32")throw new Error(`Invalid format: ${i}`);this.sampleRate=t,this.format=i,this.port.onmessage=o=>this.onWorkletMessage(o),this.port.postMessage({action:"start",inputSampleRate:t,outputSampleRate:e.sampleRate,format:i})}static async registerModule(e){await e.audioWorklet.addModule(kt)}feed(e){this.port.postMessage({action:"data",buffer:e.buffer},[e.buffer])}async play(e){if(this.isCancelled)throw new Error("PCMPlayerNode has already been cancelled.");if(this._playPromise)throw new Error("Already playing a stream");this._playPromise=new Promise(t=>this._playPromiseResolve=t),this.dispatchEvent(new CustomEvent("start",{detail:{player:this,stream:e}}));try{let t=e.getReader();for(;!this.isCancelled;){let{done:i,value:o}=await t.read();if(i||!o)break;this.feed(o)}}catch(t){fi.warn("Stream error:",t),this.dispatchEvent(new CustomEvent("error",{detail:{player:this,stream:e,error:t}}))}this.port.postMessage({action:"end"}),await this._playPromise}onWorkletMessage(e){e.data.action=="end"&&(this._playPromiseResolve?.(),this.dispatchEvent(new CustomEvent("end",{detail:{player:this}})))}stop(){this.isCancelled=!0,this.port.postMessage({action:"cancel"}),this._playPromiseResolve?.()}};var D=new f("ElevenLabs");function ot(a,n,e="pcm_24000"){let t=[],i=Date.now(),o=!1,r,s;return{stream:new ReadableStream({start:d=>{r=d,s=new WebSocket(`wss://api.elevenlabs.io/v1/text-to-speech/${n}/stream-input?inactivity_timeout=120&output_format=${e}`),s.addEventListener("open",()=>{D.debug(`[at ${Date.now()-i}ms] WebSocket connected`),s.send(JSON.stringify({text:" ","xi-api-key":a}));for(let h of t)s.send(JSON.stringify({text:h}));t.length=0}),s.addEventListener("close",()=>{D.debug(`[at ${Date.now()-i}ms] WebSocket closed`),r?.close(),o=!0}),s.addEventListener("message",h=>{let p=JSON.parse(h.data);if(p.final){s.close(),r?.close();return}if(D.debug(`[at ${Date.now()-i}ms] Message received: ${p.audio?.length||0} bytes of audio data`),!p.audio)return;let m=Uint8Array.from(atob(p.audio),g=>g.charCodeAt(0));r?.enqueue(m)})},cancel:()=>{D.debug(`[at ${Date.now()-i}ms] Stream cancelled`),s?.close(),o=!0}}),sendText:d=>{d&&(D.debug(`[at ${Date.now()-i}ms] Sending text: "${d}"`),s?.readyState===WebSocket.OPEN?s.send(JSON.stringify({text:d})):t.push(d))},endText:()=>{s?.readyState===WebSocket.OPEN?s.send(JSON.stringify({text:""})):t.push("")},get isClosed(){return o}}}function St(a,n="pcm_16000",e=16e3,t="vad"){let i=[],o=Date.now(),r=!1,s,l;return{stream:new ReadableStream({start:async p=>{s=p;let m=await fetch("https://api.elevenlabs.io/v1/single-use-token/realtime_scribe",{method:"POST",headers:{"xi-api-key":a}});if(!m.ok)throw new Error(`Failed to generate single-use token: ${m.status} ${m.statusText}`);let g=await m.json(),y=g.token;if(!y)throw new Error(`No token found in response: ${JSON.stringify(g)}`);l=new WebSocket(`wss://api.elevenlabs.io/v1/speech-to-text/realtime?token=${encodeURIComponent(y)}&audio_format=${n}&commit_strategy=${t}`),l.addEventListener("open",()=>{D.debug(`[at ${Date.now()-o}ms] WebSocket connected`);for(let w of i)l.send(w);i.length=0}),l.addEventListener("close",()=>{D.debug(`[at ${Date.now()-o}ms] WebSocket closed`),s?.close(),r=!0}),l.addEventListener("message",w=>{let k=JSON.parse(w.data);k.message_type=="committed_transcript"?(D.debug(`[at ${Date.now()-o}ms] Committed transcript received: "${k.text}"`),s?.enqueue(k.text)):k.error&&(D.warn(`[at ${Date.now()-o}ms] Error received: ${k.error}`),s?.error(new Error(k.error)),l?.close(),r=!0)})},cancel:()=>{D.debug(`[at ${Date.now()-o}ms] Stream cancelled`),l?.close(),r=!0}}),sendAudio:p=>{let m=JSON.stringify({message_type:"input_audio_chunk",audio_base_64:btoa(String.fromCharCode(...new Uint8Array(p))),commit:!1,sample_rate:e});D.debug(`[at ${Date.now()-o}ms] Sending audio: ${p.byteLength} bytes`),l?.readyState===WebSocket.OPEN?l.send(m):i.push(m)},commit:()=>{let p=JSON.stringify({message_type:"input_audio_chunk",audio_base_64:"",commit:!0,sample_rate:e});l?.readyState===WebSocket.OPEN?l.send(p):i.push(p)},close:()=>{D.debug("Closing connection"),l?.close(),r=!0,setTimeout(()=>{s?.close()},1e3)},get isClosed(){return r}}}var Re=new f("SpeechOutput"),Tt=.5,bi=.8,Xe=class extends EventTarget{constructor(e){super();this.autoSpeak=!0;this.preemptiveConnection=!0;this.processedMessages=new Set;this.maxVolumeHeard=0;this._queuedText=[];this._queueActive=!1;this.ai=e,this.ai.addEventListener("output",t=>this.onOutputFromAI(t)),this.ai.audio?.speechRecognition.addEventListener("speechstart",t=>this.interrupt())}onOutputFromAI(e){let t=e.detail.messages,i=e.detail.isPartial;if(!(!this.ai?.audio?.speechRecognition.isRunning||!this.autoSpeak)){for(let o of t)if(!o.streamingInProgress&&!(!o.id||this.processedMessages.has(o.id))){this.processedMessages.add(o.id);for(let r of o.sections||[])r.type=="text"&&r.text&&this.speak(r.text)}i||this.processedMessages.clear()}}get volumeLevel(){if(!this.analyserNode||!this.analyserBuffer)return 0;this.analyserNode.getFloatTimeDomainData(this.analyserBuffer);let e=0;for(let i of this.analyserBuffer)e+=i*i;let t=Math.sqrt(e/this.analyserBuffer.length);return t>this.maxVolumeHeard&&(this.maxVolumeHeard=t),this.maxVolumeHeard*=.999,this.maxVolumeHeard<.01&&(this.maxVolumeHeard=.01),Math.min(1,Math.max(0,t/this.maxVolumeHeard))}async speak(e){if(!this.ai?.config?.voice?.providerID)return Re.warn("No voice provider configured");this.ai._voiceTracker?.(`Added text to queue: ${e}`),this._queuedText.push(e),this._runQueue()}async _runQueue(){if(this._queueActive)return;let e=this._queuedText.shift();if(!e)return;this._queueActive=!0;let t=`speech-${yi++}`;try{await this.ai.audio.beginAccess(t),await this._speakWithLock(e)}finally{this._queueActive=!1,this.ai.audio.endAccess(t)}this._queuedText.length?await this._runQueue():this.onSpeechEnd()}_getElevenLabsConnection(){let e=this._elevenLabsPrecachedConnection;return(!e||e.isClosed)&&(e=ot(this.ai.config.voice.apiKey,this.ai.config.voice.voiceID,"pcm_24000")),this.preemptiveConnection&&(this._elevenLabsPrecachedConnection=ot(this.ai.config.voice.apiKey,this.ai.config.voice.voiceID,"pcm_24000")),e}async _speakWithLock(e){let t=new CustomEvent("speechfilter",{detail:{ai:this.ai,message:e}});if(this.dispatchEvent(t),e=t.detail.message,t.defaultPrevented||!e)return;this.ai.audio.speechRecognition.voiceDetection&&(this.ai.audio.speechRecognition.voiceDetection.sensitivity=bi);let i=this.ai?._voiceTracker||Re.timer(`${this.ai.config.voice.providerID} voice`);i(`Speak: ${e}`),this.currentPlayerVolume?.disconnect(),this.currentPlayerVolume=this.ai.audio.context.createGain(),this.currentPlayerVolume.connect(this.ai.audio.context.destination),this.analyserNode=this.ai.audio.context.createAnalyser(),this.analyserNode.fftSize=32,this.analyserNode.connect(this.currentPlayerVolume),this.maxVolumeHeard=0,this.analyserBuffer=new Float32Array(this.analyserNode.fftSize);let o=new se(this.ai.audio.context,24e3,"int16");this.currentPlayer=o,o.connect(this.analyserNode),o.addEventListener("end",l=>{let u=l;i(`PCM stream ${u.detail.interrupted?"interrupted":"ended"}`),this.currentPlayer==o&&!u.detail.interrupted&&(this.currentPlayer=void 0)});let r=Date.now(),s=null;if(this.ai.config.voice.providerID=="openai"){let l=await fetch("https://api.openai.com/v1/audio/speech",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.ai.config.voice.apiKey}`},body:JSON.stringify({model:"tts-1",input:e,voice:this.ai.config.voice.voiceID,response_format:"pcm"})});if(!l.ok){Re.warn(`Failed to generate voice sample: ${l.status} ${l.statusText}`);return}s=l.body}else if(this.ai.config.voice.providerID=="elevenlabs"){let l=this._getElevenLabsConnection();l.sendText(e),l.endText(),s=l.stream}else{Re.warn(`Unknown voice provider: ${this.ai.config.voice.providerID}`);return}i(`Received response in ${Date.now()-r}ms`),this.dispatchEvent(new CustomEvent("speechstart",{detail:{ai:this.ai,message:e}})),i("Playing PCM stream"),await o.play(s),i("Audio has ended")}get isSpeaking(){return!!this.currentPlayer}async interrupt(){if(this._queuedText=[],!this.currentPlayerVolume)return;this.ai._voiceTracker?.("Interrupted");let e=this.currentPlayerVolume,t=this.currentPlayer;this.currentPlayerVolume=void 0,this.currentPlayer=void 0,this.ai?.audio?.speechRecognition.voiceDetection&&(this.ai.audio.speechRecognition.voiceDetection.sensitivity=Tt);let i=400;e.gain.linearRampToValueAtTime(0,i/1e3),await new Promise(o=>setTimeout(o,i+250)),e.disconnect(),t?.stop(),t?.disconnect()}onSpeechEnd(){this.dispatchEvent(new CustomEvent("speechend",{detail:{ai:this.ai}})),this.ai?.audio?.speechRecognition.voiceDetection&&(this.ai.audio.speechRecognition.voiceDetection.sensitivity=Tt)}},yi=1;function Be(a,n){let e=n.reduce((l,u)=>l+u.byteLength,0),t=new DataView(new ArrayBuffer(44));t.setUint8(0,82),t.setUint8(1,73),t.setUint8(2,70),t.setUint8(3,70),t.setUint32(4,44+e,!0),t.setUint8(8,87),t.setUint8(9,65),t.setUint8(10,86),t.setUint8(11,69);let i=1,o=32,r=i*o/8,s=a*r;return t.setUint8(12,102),t.setUint8(13,109),t.setUint8(14,116),t.setUint8(15,32),t.setUint32(16,16,!0),t.setUint16(20,3,!0),t.setUint16(22,i,!0),t.setUint32(24,a,!0),t.setUint32(28,s,!0),t.setUint16(32,r,!0),t.setUint16(34,o,!0),t.setUint8(36,100),t.setUint8(37,97),t.setUint8(38,116),t.setUint8(39,97),t.setUint32(40,e,!0),new File([t,...n],"audio.wav",{type:"audio/wav"})}var Ct="data:application/javascript;base64,dmFyIGc9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LGksZil7aWYoIWV8fCF0fHwhaSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc2V0dGluZ3Mgc3BlY2lmaWVkIGZvciB0aGUgcmVzYW1wbGVyLiIpO3RoaXMucmVzYW1wbGVyPW51bGwsdGhpcy5mcm9tU2FtcGxlUmF0ZT1lLHRoaXMudG9TYW1wbGVSYXRlPXQsdGhpcy5jaGFubmVscz1pfHwwLHRoaXMuaW5wdXRCdWZmZXJTaXplPWYsdGhpcy5pbml0aWFsaXplKCl9aW5pdGlhbGl6ZSgpe3RoaXMuZnJvbVNhbXBsZVJhdGU9PXRoaXMudG9TYW1wbGVSYXRlPyh0aGlzLnJlc2FtcGxlcj1lPT5lLHRoaXMucmF0aW9XZWlnaHQ9MSk6KHRoaXMuZnJvbVNhbXBsZVJhdGU8dGhpcy50b1NhbXBsZVJhdGU/KHRoaXMubGluZWFySW50ZXJwb2xhdGlvbigpLHRoaXMubGFzdFdlaWdodD0xKToodGhpcy5tdWx0aVRhcCgpLHRoaXMudGFpbEV4aXN0cz0hMSx0aGlzLmxhc3RXZWlnaHQ9MCksdGhpcy5pbml0aWFsaXplQnVmZmVycygpLHRoaXMucmF0aW9XZWlnaHQ9dGhpcy5mcm9tU2FtcGxlUmF0ZS90aGlzLnRvU2FtcGxlUmF0ZSl9YnVmZmVyU2xpY2UoZSl7dHJ5e3JldHVybiB0aGlzLm91dHB1dEJ1ZmZlci5zdWJhcnJheSgwLGUpfWNhdGNoe3RyeXtyZXR1cm4gdGhpcy5vdXRwdXRCdWZmZXIubGVuZ3RoPWUsdGhpcy5vdXRwdXRCdWZmZXJ9Y2F0Y2h7cmV0dXJuIHRoaXMub3V0cHV0QnVmZmVyLnNsaWNlKDAsZSl9fX1pbml0aWFsaXplQnVmZmVycygpe3RoaXMub3V0cHV0QnVmZmVyU2l6ZT1NYXRoLmNlaWwodGhpcy5pbnB1dEJ1ZmZlclNpemUqdGhpcy50b1NhbXBsZVJhdGUvdGhpcy5mcm9tU2FtcGxlUmF0ZS90aGlzLmNoYW5uZWxzKjEuMDAwMDAwNDc2ODM3MTU4MikrdGhpcy5jaGFubmVscyt0aGlzLmNoYW5uZWxzO3RyeXt0aGlzLm91dHB1dEJ1ZmZlcj1uZXcgRmxvYXQzMkFycmF5KHRoaXMub3V0cHV0QnVmZmVyU2l6ZSksdGhpcy5sYXN0T3V0cHV0PW5ldyBGbG9hdDMyQXJyYXkodGhpcy5jaGFubmVscyl9Y2F0Y2h7dGhpcy5vdXRwdXRCdWZmZXI9W10sdGhpcy5sYXN0T3V0cHV0PVtdfX1saW5lYXJJbnRlcnBvbGF0aW9uKCl7dGhpcy5yZXNhbXBsZXI9ZT0+e2xldCB0PWUubGVuZ3RoLGk9dGhpcy5jaGFubmVscyxmLGgsYSxzLHIsdSxuLHAsbDtpZih0JWkhPT0wKXRocm93IG5ldyBFcnJvcigiQnVmZmVyIHdhcyBvZiBpbmNvcnJlY3Qgc2FtcGxlIGxlbmd0aC4iKTtpZih0PD0wKXJldHVybltdO2ZvcihmPXRoaXMub3V0cHV0QnVmZmVyU2l6ZSxoPXRoaXMucmF0aW9XZWlnaHQsYT10aGlzLmxhc3RXZWlnaHQscz0wLHI9MCx1PTAsbj0wLHA9dGhpcy5vdXRwdXRCdWZmZXI7YTwxO2ErPWgpZm9yKHI9YSUxLHM9MS1yLHRoaXMubGFzdFdlaWdodD1hJTEsbD0wO2w8dGhpcy5jaGFubmVsczsrK2wpcFtuKytdPXRoaXMubGFzdE91dHB1dFtsXSpzK2VbbF0qcjtmb3IoYS09MSx0LT1pLHU9TWF0aC5mbG9vcihhKSppO248ZiYmdTx0Oyl7Zm9yKHI9YSUxLHM9MS1yLGw9MDtsPHRoaXMuY2hhbm5lbHM7KytsKXBbbisrXT1lW3UrKGw+MD9sOjApXSpzK2VbdSsoaStsKV0qcjthKz1oLHU9TWF0aC5mbG9vcihhKSppfWZvcihsPTA7bDxpOysrbCl0aGlzLmxhc3RPdXRwdXRbbF09ZVt1KytdO3JldHVybiB0aGlzLmJ1ZmZlclNsaWNlKG4pfX1tdWx0aVRhcCgpe3RoaXMucmVzYW1wbGVyPWU9PntsZXQgdD1lLmxlbmd0aCxpLGYsaD10aGlzLmNoYW5uZWxzLGEscyxyLHUsbixwLGwsbSxCO2lmKHQlaCE9PTApdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIgd2FzIG9mIGluY29ycmVjdCBzYW1wbGUgbGVuZ3RoLiIpO2lmKHQ8PTApcmV0dXJuW107Zm9yKGk9dGhpcy5vdXRwdXRCdWZmZXJTaXplLGY9W10sYT10aGlzLnJhdGlvV2VpZ2h0LHM9MCx1PTAsbj0wLHA9IXRoaXMudGFpbEV4aXN0cyx0aGlzLnRhaWxFeGlzdHM9ITEsbD10aGlzLm91dHB1dEJ1ZmZlcixtPTAsQj0wLHI9MDtyPGg7KytyKWZbcl09MDtkb3tpZihwKWZvcihzPWEscj0wO3I8aDsrK3IpZltyXT0wO2Vsc2V7Zm9yKHM9dGhpcy5sYXN0V2VpZ2h0LHI9MDtyPGg7KytyKWZbcl09dGhpcy5sYXN0T3V0cHV0W3JdO3A9ITB9Zm9yKDtzPjAmJnU8dDspaWYobj0xK3UtQixzPj1uKXtmb3Iocj0wO3I8aDsrK3IpZltyXSs9ZVt1KytdKm47Qj11LHMtPW59ZWxzZXtmb3Iocj0wO3I8aDsrK3IpZltyXSs9ZVt1KyhyPjA/cjowKV0qcztCKz1zLHM9MDticmVha31pZihzPT09MClmb3Iocj0wO3I8aDsrK3IpbFttKytdPWZbcl0vYTtlbHNle2Zvcih0aGlzLmxhc3RXZWlnaHQ9cyxyPTA7cjxoOysrcil0aGlzLmxhc3RPdXRwdXRbcl09ZltyXTt0aGlzLnRhaWxFeGlzdHM9ITA7YnJlYWt9fXdoaWxlKHU8dCYmbTxpKTtyZXR1cm4gdGhpcy5idWZmZXJTbGljZShtKX19cmVzYW1wbGUoZSl7cmV0dXJuIHRoaXMuZnJvbVNhbXBsZVJhdGU9PXRoaXMudG9TYW1wbGVSYXRlP3RoaXMucmF0aW9XZWlnaHQ9MToodGhpcy5mcm9tU2FtcGxlUmF0ZTx0aGlzLnRvU2FtcGxlUmF0ZT90aGlzLmxhc3RXZWlnaHQ9MToodGhpcy50YWlsRXhpc3RzPSExLHRoaXMubGFzdFdlaWdodD0wKSx0aGlzLmluaXRpYWxpemVCdWZmZXJzKCksdGhpcy5yYXRpb1dlaWdodD10aGlzLmZyb21TYW1wbGVSYXRlL3RoaXMudG9TYW1wbGVSYXRlKSx0aGlzLnJlc2FtcGxlcihlKX19O2Z1bmN0aW9uIGQobyl7bGV0IGU9by5sZW5ndGgsdD1uZXcgSW50MTZBcnJheShlKTtmb3IoO2UtLTspe2xldCBpPU1hdGgubWF4KC0xLE1hdGgubWluKDEsb1tlXSkpO3RbZV09aTwwP2kqMzI3Njg6aSozMjc2N31yZXR1cm4gdH1mdW5jdGlvbiB3KG8pe2xldCBlPW8ubGVuZ3RoLHQ9bmV3IEJpZ0ludDY0QXJyYXkoZSk7Zm9yKDtlLS07KXtsZXQgaT1NYXRoLm1heCgtMSxNYXRoLm1pbigxLG9bZV0pKTt0W2VdPUJpZ0ludChNYXRoLmZsb29yKGk8MD9pKjMyNzY4OmkqMzI3NjcpKSoweDEwMDAwMDAwMDAwMG59cmV0dXJuIHR9dmFyIGM9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLm91dHB1dEJ1ZmZlclNpemU9MDt0aGlzLnBhcnRpYWxCdWZmZXJzPVtdO3RoaXMucGFydGlhbEJ1ZmZlck9mZnNldD0wO2lmKCFlKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhcnJheSBjbGFzczogJHtlfWApO2lmKCF0fHx0PD0wKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvdXRwdXQgYnVmZmVyIHNpemU6ICR7dH1gKTt0aGlzLkFycmF5Q2xhc3M9ZSx0aGlzLm91dHB1dEJ1ZmZlclNpemU9dH1nZXQgcXVldWVkU2l6ZSgpe3JldHVybiB0aGlzLnBhcnRpYWxCdWZmZXJzLnJlZHVjZSgoZSx0KT0+ZSt0Lmxlbmd0aCwwKX1mZWVkKGUpe3RoaXMucGFydGlhbEJ1ZmZlcnMucHVzaChlKX1nZXQgY2FuRHJhaW4oKXtyZXR1cm4gdGhpcy5wYXJ0aWFsQnVmZmVycy5yZWR1Y2UoKHQsaSk9PnQraS5sZW5ndGgsMCktdGhpcy5wYXJ0aWFsQnVmZmVyT2Zmc2V0Pj10aGlzLm91dHB1dEJ1ZmZlclNpemV9ZHJhaW4oKXtpZighdGhpcy5jYW5EcmFpbilyZXR1cm4gbnVsbDtsZXQgZT10aGlzLkFycmF5Q2xhc3MsdD1uZXcgZSh0aGlzLm91dHB1dEJ1ZmZlclNpemUpLGk9MDtmb3IoO2khPXQubGVuZ3RoOyl7aWYoaT50Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYEJ1ZmZlciBvdmVyZmxvdzogJHtpfSA+ICR7dC5sZW5ndGh9YCk7bGV0IGY9dC5sZW5ndGgtaSxoPXRoaXMucGFydGlhbEJ1ZmZlcnNbMF0sYT1oLmxlbmd0aC10aGlzLnBhcnRpYWxCdWZmZXJPZmZzZXQ7YTxmPyh0LnNldChoLnN1YmFycmF5KHRoaXMucGFydGlhbEJ1ZmZlck9mZnNldCksaSksaSs9YSx0aGlzLnBhcnRpYWxCdWZmZXJzLnNoaWZ0KCksdGhpcy5wYXJ0aWFsQnVmZmVyT2Zmc2V0PTApOih0LnNldChoLnN1YmFycmF5KHRoaXMucGFydGlhbEJ1ZmZlck9mZnNldCx0aGlzLnBhcnRpYWxCdWZmZXJPZmZzZXQrZiksaSksaSs9Zix0aGlzLnBhcnRpYWxCdWZmZXJPZmZzZXQrPWYpfXJldHVybiB0fXBhZCgpe2xldCBlPXRoaXMucXVldWVkU2l6ZSV0aGlzLm91dHB1dEJ1ZmZlclNpemU7aWYoZT09MClyZXR1cm47bGV0IHQ9dGhpcy5BcnJheUNsYXNzLGk9bmV3IHQoZSk7dGhpcy5mZWVkKGkpfX07dmFyIHk9Y2xhc3MgZXh0ZW5kcyBBdWRpb1dvcmtsZXRQcm9jZXNzb3J7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5mb3JtYXQ9ImludDE2Ijt0aGlzLmlucHV0QnVmZmVyPW5ldyBjKEZsb2F0MzJBcnJheSw0MDk2KTt0aGlzLnBvcnQub25tZXNzYWdlPWk9PnRoaXMub25NZXNzYWdlKGkpfW9uTWVzc2FnZSh0KXt0LmRhdGEuYWN0aW9uPT0ic3RhcnQiJiYodGhpcy5mb3JtYXQ9dC5kYXRhLmZvcm1hdCx0aGlzLnJlc2FtcGxlcj1uZXcgZyh0LmRhdGEuaW5wdXRTYW1wbGVSYXRlLHQuZGF0YS5vdXRwdXRTYW1wbGVSYXRlLDEsNDA5NiksdGhpcy5mb3JtYXQ9PSJpbnQxNiI/dGhpcy5vdXRwdXRCdWZmZXI9bmV3IGMoSW50MTZBcnJheSx0LmRhdGEuYnVmZmVyU2l6ZSk6dGhpcy5mb3JtYXQ9PSJpbnQ2NCI/dGhpcy5vdXRwdXRCdWZmZXI9bmV3IGMoQmlnSW50NjRBcnJheSx0LmRhdGEuYnVmZmVyU2l6ZSk6dGhpcy5mb3JtYXQ9PSJmbG9hdDMyIiYmKHRoaXMub3V0cHV0QnVmZmVyPW5ldyBjKEZsb2F0MzJBcnJheSx0LmRhdGEuYnVmZmVyU2l6ZSkpKX1wcm9jZXNzKHQsaSxmKXtmb3IobGV0IGE9MDthPGkubGVuZ3RoO2ErKyl7bGV0IHM9TWF0aC5taW4oaVthXS5sZW5ndGgsdFswXS5sZW5ndGgpO2ZvcihsZXQgcj0wO3I8cztyKyspaVthXVtyXS5zZXQodFswXVtyXSl9aWYoIXRoaXMucmVzYW1wbGVyKXJldHVybiEwO2xldCBoPW5ldyBGbG9hdDMyQXJyYXkoaVswXVswXS5sZW5ndGgpO2ZvcihoLnNldChpWzBdWzBdKSx0aGlzLmlucHV0QnVmZmVyLmZlZWQoaCk7dGhpcy5pbnB1dEJ1ZmZlci5jYW5EcmFpbjspe2xldCBhPXRoaXMuaW5wdXRCdWZmZXIuZHJhaW4oKSxzPXRoaXMucmVzYW1wbGVyLnJlc2FtcGxlKGEpO3RoaXMuZm9ybWF0PT0iaW50MTYiP3RoaXMub3V0cHV0QnVmZmVyLmZlZWQoZChzKSk6dGhpcy5mb3JtYXQ9PSJpbnQ2NCI/dGhpcy5vdXRwdXRCdWZmZXIuZmVlZCh3KHMpKTp0aGlzLmZvcm1hdD09ImZsb2F0MzIiJiZ0aGlzLm91dHB1dEJ1ZmZlci5mZWVkKHMpfWZvcig7dGhpcy5vdXRwdXRCdWZmZXIuY2FuRHJhaW47KXtsZXQgYT10aGlzLm91dHB1dEJ1ZmZlci5kcmFpbigpO2lmKCFhKWJyZWFrO3RoaXMucG9ydC5wb3N0TWVzc2FnZSh7YWN0aW9uOiJkYXRhIixidWZmZXI6YS5idWZmZXJ9LFthLmJ1ZmZlcl0pfXJldHVybiEwfX07cmVnaXN0ZXJQcm9jZXNzb3IoInBjbS1yZWNlaXZlci1ub2RlIix5KTsK";var ae=class extends AudioWorkletNode{constructor(e,t,i,o){super(e,"pcm-receiver-node",{numberOfInputs:1});this.format="int16";this.format=i;let r=["int16","int64","float32"];if(!t||t<=0)throw new Error(`Invalid sample rate: ${t}`);if(!r.includes(i))throw new Error(`Invalid format ${i}, must be one of: ${r.join(", ")}`);if(!o||o<=0)throw new Error(`Invalid buffer size: ${o}`);this.port.onmessage=s=>this.onWorkletMessage(s),this.port.postMessage({action:"start",inputSampleRate:e.sampleRate,outputSampleRate:t,format:i,bufferSize:o})}static async registerModule(e){await e.audioWorklet.addModule(Ct)}onWorkletMessage(e){if(e.data.action=="data"){let t=null;if(this.format=="int16"&&(t=new Int16Array(e.data.buffer)),this.format=="int64"&&(t=new BigInt64Array(e.data.buffer)),this.format=="float32"&&(t=new Float32Array(e.data.buffer)),!t)throw new Error(`Invalid format: ${this.format}`);this.onData(t),this.dispatchEvent(new CustomEvent("data",{detail:{data:t}}))}}onData(e){}};var rt=16e3,je=256,le=8,we=new f("VoiceDetectionNode"),ve=class ve extends ae{constructor(e){super(e,rt,"float32",je*le);this.isVoiceActive=!1;this.lastVoiceActiveDate=0;this.voiceEndTimeout=50;this.sensitivity=.5;this.sentivityEnd=.2;this.nextVadReset=0;this.currentProbability=0;this._lastVoiceActive=!1;if(!ve.vadModelURL)throw new Error("VAD model url not set, please load it and set it to VoiceDetectionNode.vadModelURL");this.loadModel()}get isVoicePossiblyEnding(){return this.isVoiceActive&&this.currentProbability<this.sensitivity}get sampleRate(){return rt}get numberOfSamples(){return je}get numberOfSampleChunks(){return le}get outputBufferSize(){return je*le}get isModelLoaded(){return!!this.vad}async loadModel(){we.debug("Loading VAD model"),this.vad=await X.load(ve.vadModelURL),this.vad.ignoreIfBusy=!0,we.debug("Model loaded"),this.vad.makeConstant("sr","int64",[1],rt),this.vad.makeState("h","hn","float32",[2,le,64]),this.vad.makeState("c","cn","float32",[2,le,64])}async onData(e){if(this.vad)try{let t=await this.vad.run({input:new X.onnx.Tensor(e,[le,je])});if(!t)return;this.currentProbability=0;for(let r=0;r<t.output.data.length;r++)t.output.data[r]>this.currentProbability&&(this.currentProbability=t.output.data[r]);let i=this.isVoiceActive?this.sentivityEnd:this.sensitivity,o=this.currentProbability>i;if(!o&&this._lastVoiceActive&&(this.nextVadReset=Date.now(),this.vad.resetState()),this._lastVoiceActive=o,o&&!this.isVoiceActive?(this.lastVoiceActiveDate=Date.now(),this.isVoiceActive=!0,this.dispatchEvent(new CustomEvent("speechstart")),this.onSpeechStart(),we.debug("Started speaking")):o?this.lastVoiceActiveDate=Date.now():!o&&this.isVoiceActive&&Date.now()<this.lastVoiceActiveDate+this.voiceEndTimeout||!o&&this.isVoiceActive&&(this.isVoiceActive=!1,this.dispatchEvent(new CustomEvent("speechend")),this.onSpeechEnd(),we.debug("Stopped speaking after timeout")),!o){let r=Date.now();r>this.nextVadReset&&(this.nextVadReset=r+5e3,this.vad.resetState())}}catch(t){we.error("VAD failed:",t)}}onSpeechStart(){}onSpeechEnd(){}};ve.vadModelURL="";var de=ve;var Et=new f("VoiceChunkOutputNode"),K=class extends de{constructor(){super(...arguments);this.buffers=[];this.recordedBuffers=[];this._voiceRecording=!1;this.backBufferDurationSeconds=3}get bufferDuration(){return this.buffers.reduce((e,t)=>e+t.length,0)/8e3}async onData(e){if(await super.onData(e),this.isVoiceActive&&!this._voiceRecording){Et.debug(`Voice detected, sending ${this.buffers.length} existing chunks`),this._voiceRecording=!0;for(let t of this.buffers)this.recordedBuffers.push(t),this.dispatchEvent(new CustomEvent("voicedata",{detail:{data:t,isFinal:!1}})),this.onVoiceChunk(t);this.recordedBuffers.push(e),this.dispatchEvent(new CustomEvent("voicedata",{detail:{data:e,isFinal:!1}})),this.onVoiceChunk(e),this.buffers=[]}else if(this.isVoiceActive)this.recordedBuffers.push(e),this.dispatchEvent(new CustomEvent("voicedata",{detail:{data:e,isFinal:!1}})),this.onVoiceChunk(e);else if(!this.isVoiceActive&&this._voiceRecording){this.recordedBuffers.push(e),this.dispatchEvent(new CustomEvent("voicedata",{detail:{data:e,isFinal:!0}})),this.onVoiceChunk(e),this._voiceRecording=!1;let t=this.recordedBuffers.reduce((i,o)=>i+o.length,0);Et.debug(`Voice complete, recorded ${(t/8e3).toFixed(2)} seconds of audio, ${t*4/1024} KB of data`),this.dispatchEvent(new CustomEvent("voicedataend",{detail:{data:this.recordedBuffers}})),this.onVoiceEnd(this.recordedBuffers),this.recordedBuffers=[]}else for(this.buffers.push(e);this.bufferDuration>this.backBufferDurationSeconds;)this.buffers.shift()}onVoiceChunk(e){}onVoiceEnd(e){}};var _e=new f("OpenAITranscriptionNode"),ze=class extends K{constructor(e,t){super(e);this.apiKey="";this.pendingBuffers=[];this.isTranscribing=!1;this.apiKey=t}async onVoiceEnd(e){let t=_e.timer("OpenAI Transcribe");this.isTranscribing=!0,this.pendingBuffers.push(...e);let i=Be(this.sampleRate,this.pendingBuffers);this.lastRequestAbortController?.abort(),this.lastRequestAbortController=new AbortController;let o="";try{let r=new FormData;r.append("file",i),r.append("model","whisper-1"),r.append("response_format","text");let s=await fetch("https://api.openai.com/v1/audio/transcriptions",{method:"POST",headers:{Authorization:`Bearer ${this.apiKey}`},body:r,signal:this.lastRequestAbortController.signal});if(!s.ok)throw new Error(`Failed to generate voice sample: ${s.status} ${s.statusText}`);t("Response received"),o=await s.text(),t("Content received: "+o),this.lastRequestAbortController=void 0}catch(r){_e.error(`Failed to transcribe speech: ${r.message}`);return}finally{this.isTranscribing=!1}if(this.pendingBuffers=[],!o)return _e.debug("Transcription complete, but no text was found");_e.debug(`Transcription: ${o}`),this.onVoiceTranscription(o),this.dispatchEvent(new CustomEvent("transcription",{detail:{text:o}}))}onVoiceTranscription(e){}};var Oe=class extends WebSocket{constructor(e){super(e);this.pendingData=[];this.addEventListener("open",()=>this._onOpen())}send(e){this.readyState==WebSocket.OPEN?super.send(e):this.pendingData.push(e)}_onOpen(){for(let e of this.pendingData)super.send(e);this.pendingData=[]}};var P=new f("IntelliWeaveTranscriptionNode"),vi="wss://speech.intelliweave.ai/api/v1/transcribe",Ye=class Ye extends K{constructor(e,t){super(e);this.apiAddress=vi;this.apiKey="";this.isTranscribing=!1;this.apiKey=t}async onVoiceChunk(e){this.isTranscribing=!0,this.ws?this.ws.send(e):(P.debug("Opening WebSocket connection"),this.ws=new Oe(this.apiAddress),this.ws.send(JSON.stringify({type:"hello",sampleRate:16e3,channels:1,format:"float32",apiKey:this.apiKey})),this.ws.send(e.buffer),this.ws.onopen=()=>{P.debug("WebSocket connection opened")},this.ws.addEventListener("message",i=>{let o=JSON.parse(i.data);if(o.error)return P.warn("Error: "+o.error);if(o.type!="transcription")return P.warn("Invalid response type",o);if(o.streaming&&!o.final)return P.debug("Partial transcription: "+o.partialText);if(this.isTranscribing=!1,!o.text.trim())return P.warn(`Empty transcription (${o.processingTime}ms)`);P.debug(`Transcription: ${o.text} (${o.processingTime}ms)`),this.onVoiceTranscription(o.text),this.dispatchEvent(new CustomEvent("transcription",{detail:{text:o.text}}))}),this.ws.addEventListener("close",()=>this.onSocketClose()),this.ws.addEventListener("error",i=>P.warn("WebSocket error")));let t=1e3*60*1;this.shutdownTimer&&clearTimeout(this.shutdownTimer),this.shutdownTimer=setTimeout(()=>{P.debug("Shutting down WebSocket connection"),this.ws?.close(),this.ws=void 0},t)}async onVoiceEnd(e){if(this.ws?.send(JSON.stringify({type:"end"})),Ye.debugExportWav){let t=Be(this.sampleRate,e),i=document.createElement("a");i.href=URL.createObjectURL(t),i.download="recording.wav",i.click()}}onVoiceTranscription(e){}onSocketClose(){P.debug("WebSocket connection closed"),this.ws=void 0,this.isTranscribing=!1}};Ye.debugExportWav=!1;var Ve=Ye;var ce=new f("ElevenLabsTranscriptionNode"),Fe=class extends K{constructor(e,t){super(e);this.apiKey="";this.isTranscribing=!1;this.apiKey=t}async onVoiceChunk(e){this.isTranscribing=!0;let t=new Int16Array(e.length);for(let o=0;o<e.length;o++)t[o]=e[o]*32767;!this.connection||this.connection.isClosed?(this.connection?.close(),this.connection=void 0,ce.debug(`Opening connection. sampleRate: ${this.sampleRate} format=${this.format}`),this.connection=St(this.apiKey,"pcm_"+this.sampleRate,this.sampleRate,"manual"),this.startReading(this.connection),this.connection.sendAudio(t.buffer)):this.connection.sendAudio(t.buffer);let i=1e3*60*1;this.shutdownTimer&&clearTimeout(this.shutdownTimer),this.shutdownTimer=setTimeout(()=>{ce.debug("Shutting down WebSocket connection"),this.connection?.close(),this.connection=void 0},i)}async startReading(e){let t=e.stream.getReader();try{for(;;){let{value:i,done:o}=await t.read();if(o){ce.debug("Stream closed");break}if(!i?.trim()){ce.warn("Empty transcription received");continue}this.isTranscribing=!1,ce.debug(`Transcription: ${i}`),this.onVoiceTranscription(i),this.dispatchEvent(new CustomEvent("transcription",{detail:{text:i}}))}}catch(i){ce.error(`Failed to read transcription stream: ${i.message}`),this.connection==e&&(this.connection=void 0);return}}async onVoiceEnd(e){this.connection?.commit()}onVoiceTranscription(e){}};var st=new f("SpeechRecognition"),Ue=class extends EventTarget{constructor(e){super();this.isRunning=!1;this._skipEvents=!1;this.maxVolumeHeard=0;this.ai=e}get isSupported(){if(!X.lib||!this.ai?.vadModel||!V().AudioWorkletNode)return!1;if(this.ai?.config?.transcription?.providerID!="intelliweave"){if(!(this.ai?.config?.transcription?.providerID=="openai"&&this.ai.config?.transcription?.apiKey)){if(!(this.ai?.config?.transcription?.providerID=="elevenlabs"&&this.ai.config?.transcription?.apiKey))return!1}}return!0}async start(){if(!this.isSupported)throw new Error("Speech recognition not supported in this persona and browser.");if(!this.isRunning){this.isRunning=!0;try{await this.ai.audio.beginAccess("speech-recognition"),this.micStream=await navigator.mediaDevices.getUserMedia({audio:{channelCount:1,echoCancellation:!0,autoGainControl:!0,noiseSuppression:!0}});let e=this.ai.audio.context.createMediaStreamSource(this.micStream);this.analyserNode=this.ai.audio.context.createAnalyser(),this.analyserNode.fftSize=32,e.connect(this.analyserNode),this.analyserBuffer=new Float32Array(this.analyserNode.fftSize),de.vadModelURL=URL.createObjectURL(this.ai.vadModel),this.ai?.config?.transcription?.providerID=="openai"?(this.voiceDetection=new ze(this.ai.audio.context,this.ai.config.transcription.apiKey),e.connect(this.voiceDetection)):this.ai?.config?.transcription?.providerID=="elevenlabs"?(this.voiceDetection=new Fe(this.ai.audio.context,this.ai.config.transcription.apiKey),e.connect(this.voiceDetection)):(this.voiceDetection=new Ve(this.ai.audio.context,this.ai.apiKey),this.voiceDetection.apiAddress=this.ai?.config?.transcription?.url||this.voiceDetection.apiAddress,e.connect(this.voiceDetection)),this.voiceDetection.addEventListener("speechstart",t=>{this.ai._voiceTracker=st.timer("voice interaction","Speech started"),this.recordingStartTime=Date.now(),C(this.ai,{event_type:"voice_start",event_properties:{audio_provider:this.ai.config?.transcription?.providerID||"intelliweave",sample_rate:16e3}}),this.dispatchEvent(new CustomEvent(t.type,{detail:t.detail}))}),this.voiceDetection.addEventListener("speechend",t=>{this.ai._voiceTracker?.("Speech ended");let i=this.recordingStartTime?Date.now()-this.recordingStartTime:0;C(this.ai,{event_type:"voice_end",event_properties:{recording_duration_ms:i}}),this.dispatchEvent(new CustomEvent(t.type,{detail:t.detail}))}),this.voiceDetection.addEventListener("transcription",t=>{this.ai._voiceTracker?.(`Transcription: ${t.detail.text}`),C(this.ai,{event_type:"voice_submit",value_str:"",event_properties:{transcription_provider:this.ai.config?.transcription?.providerID||"intelliweave",confidence_score:t.detail.confidence||void 0}}),this.onTranscription(t)}),this._skipEvents||this.dispatchEvent(new CustomEvent("start",{detail:{speechRecognition:this}}))}catch(e){st.error("Failed to start speech recognition:",e),this.stop()}}}stop(){this.isRunning&&(this.isRunning=!1,this.ai.audio.endAccess("speech-recognition"),this.voiceDetection?.disconnect(),this.voiceDetection=void 0,this.micStream?.getTracks().forEach(e=>e.stop()),this.micStream=void 0,this.analyserNode=void 0,this.analyserBuffer=void 0,this._skipEvents||this.dispatchEvent(new CustomEvent("end",{detail:{speechRecognition:this}})))}get volumeLevel(){if(!this.analyserNode||!this.analyserBuffer)return 0;this.analyserNode.getFloatTimeDomainData(this.analyserBuffer);let e=0;for(let i of this.analyserBuffer)e+=i*i;let t=Math.sqrt(e/this.analyserBuffer.length);return t>this.maxVolumeHeard&&(this.maxVolumeHeard=t),this.maxVolumeHeard*=.999,this.maxVolumeHeard<.01&&(this.maxVolumeHeard=.01),Math.min(1,Math.max(0,t/this.maxVolumeHeard))}get wordsCurrentlyBeingSpoken(){return!!this.voiceDetection?.isVoiceActive}get isTranscribing(){return!!this.voiceDetection?.isTranscribing}onTranscription(e){let t=e.detail.text;st.debug("Heard:",t),this.dispatchEvent(new CustomEvent("speech",{detail:{transcript:t,isFinal:!0}}))}async reset(){if(this.isRunning){this._skipEvents=!0;try{this.stop(),await this.start(),this._skipEvents=!1}catch(e){throw this._skipEvents=!1,e}}}};var Ke=new f("AudioSystem"),H=class a{constructor(n){this.locks=[];if(!n)throw new Error("AI reference is required. Please pass in the IntelliWeave instance to the constructor.");this.ai=n,this.ai.audio=this,this.speechRecognition=new Ue(this.ai),this.speechOutput=new Xe(this.ai)}static get isSupported(){return!(!X.lib||!V().AudioWorkletNode)}static async registerModules(n){await Promise.all([se.registerModule(n),ae.registerModule(n)])}async beginAccess(n){Ke.debug(`Began access for: ${n}`),this.locks.includes(n)||this.locks.push(n),!this.context&&(Ke.debug("Creating AudioContext"),this.context=new AudioContext({latencyHint:"interactive"}),this.context.resume(),await a.registerModules(this.context))}endAccess(n){Ke.debug(`Ended access for: ${n}`),this.locks=this.locks.filter(e=>e!=n),!this.locks.length&&(Ke.debug("Closing AudioContext"),this.context?.close(),this.context=void 0)}};var E=new f("Embed"),ue=class extends L{constructor(){super();this.config={};this.suggestions=[];this._previousOpenState=!1;this._handledEmbeddedActionBlocks=new Map;this._returnToCollapsedOnSwipeClose=!1;this._suppressNextContainerClick=!1;this._previousFullscreenState=!1;this.html=()=>`
472
+ `,n.addEventListener("click",o=>{this.dispatchEvent(new CustomEvent("select",{detail:t.id}))}),e.appendChild(n)}}};ve.observedAttributes=["open"];var se=new g("ONNXModel"),R=class a{constructor(i){this.stateTensors={};this.constantTensors={};this._runActive=!1;this.ignoreIfBusy=!1;this.session=i,se.debug(`Model input parameters: ${i.inputNames.join(", ")}`),se.debug(`Model output parameters: ${i.outputNames.join(", ")}`)}static isSupported(){return!!a.lib}static async load(i){if(!a.lib)throw new Error("ONNX runtime not loaded, please set the runtime loader. Example: ONNXModel.lib = () => import('onnxruntime-web')");this.onnx||(se.debug("Loading ONNX runtime"),this.onnx=await a.lib()),se.debug(`Loading model: ${i}`);let e=await this.onnx.InferenceSession.create(i);return new a(e)}makeTensor(i,e,t=0){let n=1;for(let r of e)n*=r;let o;if(i=="float32")o=new a.onnx.Tensor(new Float32Array(n),e);else if(i=="int8")o=new a.onnx.Tensor(new Int8Array(n),e);else if(i=="int16")o=new a.onnx.Tensor(new Int16Array(n),e);else if(i=="int32")o=new a.onnx.Tensor(new Int32Array(n),e);else if(i=="int64")o=new a.onnx.Tensor(new BigInt64Array(n),e);else if(i=="uint8")o=new a.onnx.Tensor(new Uint8Array(n),e);else if(i=="uint16")o=new a.onnx.Tensor(new Uint16Array(n),e);else if(i=="uint32")o=new a.onnx.Tensor(new Uint32Array(n),e);else if(i=="uint64")o=new a.onnx.Tensor(new BigUint64Array(n),e);else throw new Error(`Invalid type: ${i}`);return t!==0&&(i=="int64"||i=="uint64")?o.data.fill(BigInt(t)):t!==0&&o.data.fill(t),o}registerConstant(i,e){if(!this.session.inputNames.includes(i))throw new Error(`Model does not have an input named: ${i}`);return this.constantTensors[i]=e,e}makeConstant(i,e,t,n=0){return this.registerConstant(i,this.makeTensor(e,t,n))}registerState(i,e,t){if(e||(e=i),!this.session.inputNames.includes(i))throw new Error(`Model does not have an input named: ${i}`);if(!this.session.outputNames.includes(e))throw new Error(`Model does not have an output named: ${e}`);return this.stateTensors[i]={outputName:e,tensor:t},t}makeState(i,e,t,n,o=0){return this.registerState(i,e,this.makeTensor(t,n,o))}async run(i={}){if(this._runActive&&this.ignoreIfBusy)return se.debug("Ignoring run request because a previous run is still active");if(this._runActive)throw new Error("A previous run is still active");this._runActive=!0;for(let e in this.stateTensors)i[e]=this.stateTensors[e].tensor;for(let e in this.constantTensors)i[e]=this.constantTensors[e];try{let e=await this.session.run(i);for(let t in this.stateTensors){let n=e[this.stateTensors[t].outputName];this.stateTensors[t].tensor=n}return e}finally{this._runActive=!1}}resetState(){se.debug("Resetting state tensors");for(let i in this.stateTensors)this.stateTensors[i].tensor.data.fill(0)}};var Et="data:application/javascript;base64,dmFyIGM9Y2xhc3N7Y29uc3RydWN0b3IoaSx0KXt0aGlzLm91dHB1dEJ1ZmZlclNpemU9MDt0aGlzLnBhcnRpYWxCdWZmZXJzPVtdO3RoaXMucGFydGlhbEJ1ZmZlck9mZnNldD0wO2lmKCFpKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhcnJheSBjbGFzczogJHtpfWApO2lmKCF0fHx0PD0wKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvdXRwdXQgYnVmZmVyIHNpemU6ICR7dH1gKTt0aGlzLkFycmF5Q2xhc3M9aSx0aGlzLm91dHB1dEJ1ZmZlclNpemU9dH1nZXQgcXVldWVkU2l6ZSgpe3JldHVybiB0aGlzLnBhcnRpYWxCdWZmZXJzLnJlZHVjZSgoaSx0KT0+aSt0Lmxlbmd0aCwwKX1mZWVkKGkpe3RoaXMucGFydGlhbEJ1ZmZlcnMucHVzaChpKX1nZXQgY2FuRHJhaW4oKXtyZXR1cm4gdGhpcy5wYXJ0aWFsQnVmZmVycy5yZWR1Y2UoKHQscik9PnQrci5sZW5ndGgsMCktdGhpcy5wYXJ0aWFsQnVmZmVyT2Zmc2V0Pj10aGlzLm91dHB1dEJ1ZmZlclNpemV9ZHJhaW4oKXtpZighdGhpcy5jYW5EcmFpbilyZXR1cm4gbnVsbDtsZXQgaT10aGlzLkFycmF5Q2xhc3MsdD1uZXcgaSh0aGlzLm91dHB1dEJ1ZmZlclNpemUpLHI9MDtmb3IoO3IhPXQubGVuZ3RoOyl7aWYocj50Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYEJ1ZmZlciBvdmVyZmxvdzogJHtyfSA+ICR7dC5sZW5ndGh9YCk7bGV0IGE9dC5sZW5ndGgtcixzPXRoaXMucGFydGlhbEJ1ZmZlcnNbMF0sZj1zLmxlbmd0aC10aGlzLnBhcnRpYWxCdWZmZXJPZmZzZXQ7ZjxhPyh0LnNldChzLnN1YmFycmF5KHRoaXMucGFydGlhbEJ1ZmZlck9mZnNldCkscikscis9Zix0aGlzLnBhcnRpYWxCdWZmZXJzLnNoaWZ0KCksdGhpcy5wYXJ0aWFsQnVmZmVyT2Zmc2V0PTApOih0LnNldChzLnN1YmFycmF5KHRoaXMucGFydGlhbEJ1ZmZlck9mZnNldCx0aGlzLnBhcnRpYWxCdWZmZXJPZmZzZXQrYSkscikscis9YSx0aGlzLnBhcnRpYWxCdWZmZXJPZmZzZXQrPWEpfXJldHVybiB0fXBhZCgpe2xldCBpPXRoaXMucXVldWVkU2l6ZSV0aGlzLm91dHB1dEJ1ZmZlclNpemU7aWYoaT09MClyZXR1cm47bGV0IHQ9dGhpcy5BcnJheUNsYXNzLHI9bmV3IHQoaSk7dGhpcy5mZWVkKHIpfX07dmFyIGQ9Y2xhc3N7Y29uc3RydWN0b3IoaSx0LHIsYSl7aWYoIWl8fCF0fHwhcil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc2V0dGluZ3Mgc3BlY2lmaWVkIGZvciB0aGUgcmVzYW1wbGVyLiIpO3RoaXMucmVzYW1wbGVyPW51bGwsdGhpcy5mcm9tU2FtcGxlUmF0ZT1pLHRoaXMudG9TYW1wbGVSYXRlPXQsdGhpcy5jaGFubmVscz1yfHwwLHRoaXMuaW5wdXRCdWZmZXJTaXplPWEsdGhpcy5pbml0aWFsaXplKCl9aW5pdGlhbGl6ZSgpe3RoaXMuZnJvbVNhbXBsZVJhdGU9PXRoaXMudG9TYW1wbGVSYXRlPyh0aGlzLnJlc2FtcGxlcj1pPT5pLHRoaXMucmF0aW9XZWlnaHQ9MSk6KHRoaXMuZnJvbVNhbXBsZVJhdGU8dGhpcy50b1NhbXBsZVJhdGU/KHRoaXMubGluZWFySW50ZXJwb2xhdGlvbigpLHRoaXMubGFzdFdlaWdodD0xKToodGhpcy5tdWx0aVRhcCgpLHRoaXMudGFpbEV4aXN0cz0hMSx0aGlzLmxhc3RXZWlnaHQ9MCksdGhpcy5pbml0aWFsaXplQnVmZmVycygpLHRoaXMucmF0aW9XZWlnaHQ9dGhpcy5mcm9tU2FtcGxlUmF0ZS90aGlzLnRvU2FtcGxlUmF0ZSl9YnVmZmVyU2xpY2UoaSl7dHJ5e3JldHVybiB0aGlzLm91dHB1dEJ1ZmZlci5zdWJhcnJheSgwLGkpfWNhdGNoe3RyeXtyZXR1cm4gdGhpcy5vdXRwdXRCdWZmZXIubGVuZ3RoPWksdGhpcy5vdXRwdXRCdWZmZXJ9Y2F0Y2h7cmV0dXJuIHRoaXMub3V0cHV0QnVmZmVyLnNsaWNlKDAsaSl9fX1pbml0aWFsaXplQnVmZmVycygpe3RoaXMub3V0cHV0QnVmZmVyU2l6ZT1NYXRoLmNlaWwodGhpcy5pbnB1dEJ1ZmZlclNpemUqdGhpcy50b1NhbXBsZVJhdGUvdGhpcy5mcm9tU2FtcGxlUmF0ZS90aGlzLmNoYW5uZWxzKjEuMDAwMDAwNDc2ODM3MTU4MikrdGhpcy5jaGFubmVscyt0aGlzLmNoYW5uZWxzO3RyeXt0aGlzLm91dHB1dEJ1ZmZlcj1uZXcgRmxvYXQzMkFycmF5KHRoaXMub3V0cHV0QnVmZmVyU2l6ZSksdGhpcy5sYXN0T3V0cHV0PW5ldyBGbG9hdDMyQXJyYXkodGhpcy5jaGFubmVscyl9Y2F0Y2h7dGhpcy5vdXRwdXRCdWZmZXI9W10sdGhpcy5sYXN0T3V0cHV0PVtdfX1saW5lYXJJbnRlcnBvbGF0aW9uKCl7dGhpcy5yZXNhbXBsZXI9aT0+e2xldCB0PWkubGVuZ3RoLHI9dGhpcy5jaGFubmVscyxhLHMsZixoLGUsbix1LG8sbDtpZih0JXIhPT0wKXRocm93IG5ldyBFcnJvcigiQnVmZmVyIHdhcyBvZiBpbmNvcnJlY3Qgc2FtcGxlIGxlbmd0aC4iKTtpZih0PD0wKXJldHVybltdO2ZvcihhPXRoaXMub3V0cHV0QnVmZmVyU2l6ZSxzPXRoaXMucmF0aW9XZWlnaHQsZj10aGlzLmxhc3RXZWlnaHQsaD0wLGU9MCxuPTAsdT0wLG89dGhpcy5vdXRwdXRCdWZmZXI7ZjwxO2YrPXMpZm9yKGU9ZiUxLGg9MS1lLHRoaXMubGFzdFdlaWdodD1mJTEsbD0wO2w8dGhpcy5jaGFubmVsczsrK2wpb1t1KytdPXRoaXMubGFzdE91dHB1dFtsXSpoK2lbbF0qZTtmb3IoZi09MSx0LT1yLG49TWF0aC5mbG9vcihmKSpyO3U8YSYmbjx0Oyl7Zm9yKGU9ZiUxLGg9MS1lLGw9MDtsPHRoaXMuY2hhbm5lbHM7KytsKW9bdSsrXT1pW24rKGw+MD9sOjApXSpoK2lbbisocitsKV0qZTtmKz1zLG49TWF0aC5mbG9vcihmKSpyfWZvcihsPTA7bDxyOysrbCl0aGlzLmxhc3RPdXRwdXRbbF09aVtuKytdO3JldHVybiB0aGlzLmJ1ZmZlclNsaWNlKHUpfX1tdWx0aVRhcCgpe3RoaXMucmVzYW1wbGVyPWk9PntsZXQgdD1pLmxlbmd0aCxyLGEscz10aGlzLmNoYW5uZWxzLGYsaCxlLG4sdSxvLGwsbSxnO2lmKHQlcyE9PTApdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIgd2FzIG9mIGluY29ycmVjdCBzYW1wbGUgbGVuZ3RoLiIpO2lmKHQ8PTApcmV0dXJuW107Zm9yKHI9dGhpcy5vdXRwdXRCdWZmZXJTaXplLGE9W10sZj10aGlzLnJhdGlvV2VpZ2h0LGg9MCxuPTAsdT0wLG89IXRoaXMudGFpbEV4aXN0cyx0aGlzLnRhaWxFeGlzdHM9ITEsbD10aGlzLm91dHB1dEJ1ZmZlcixtPTAsZz0wLGU9MDtlPHM7KytlKWFbZV09MDtkb3tpZihvKWZvcihoPWYsZT0wO2U8czsrK2UpYVtlXT0wO2Vsc2V7Zm9yKGg9dGhpcy5sYXN0V2VpZ2h0LGU9MDtlPHM7KytlKWFbZV09dGhpcy5sYXN0T3V0cHV0W2VdO289ITB9Zm9yKDtoPjAmJm48dDspaWYodT0xK24tZyxoPj11KXtmb3IoZT0wO2U8czsrK2UpYVtlXSs9aVtuKytdKnU7Zz1uLGgtPXV9ZWxzZXtmb3IoZT0wO2U8czsrK2UpYVtlXSs9aVtuKyhlPjA/ZTowKV0qaDtnKz1oLGg9MDticmVha31pZihoPT09MClmb3IoZT0wO2U8czsrK2UpbFttKytdPWFbZV0vZjtlbHNle2Zvcih0aGlzLmxhc3RXZWlnaHQ9aCxlPTA7ZTxzOysrZSl0aGlzLmxhc3RPdXRwdXRbZV09YVtlXTt0aGlzLnRhaWxFeGlzdHM9ITA7YnJlYWt9fXdoaWxlKG48dCYmbTxyKTtyZXR1cm4gdGhpcy5idWZmZXJTbGljZShtKX19cmVzYW1wbGUoaSl7cmV0dXJuIHRoaXMuZnJvbVNhbXBsZVJhdGU9PXRoaXMudG9TYW1wbGVSYXRlP3RoaXMucmF0aW9XZWlnaHQ9MToodGhpcy5mcm9tU2FtcGxlUmF0ZTx0aGlzLnRvU2FtcGxlUmF0ZT90aGlzLmxhc3RXZWlnaHQ9MToodGhpcy50YWlsRXhpc3RzPSExLHRoaXMubGFzdFdlaWdodD0wKSx0aGlzLmluaXRpYWxpemVCdWZmZXJzKCksdGhpcy5yYXRpb1dlaWdodD10aGlzLmZyb21TYW1wbGVSYXRlL3RoaXMudG9TYW1wbGVSYXRlKSx0aGlzLnJlc2FtcGxlcihpKX19O2Z1bmN0aW9uIFMocCl7bGV0IGk9cC5sZW5ndGgsdD1uZXcgRmxvYXQzMkFycmF5KGkpO2Zvcig7aS0tOyl7bGV0IHI9cFtpXTt0W2ldPXI+PTMyNzY4Py0oNjU1MzYtcikvMzI3Njg6ci8zMjc2N31yZXR1cm4gdH12YXIgeT0xMDI0KjgsQj1jbGFzcyBleHRlbmRzIEF1ZGlvV29ya2xldFByb2Nlc3Nvcntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTt0aGlzLmNodW5rcz1bXTt0aGlzLmNodW5rUG9zaXRpb249MDt0aGlzLmlzRW5kZWQ9ITE7dGhpcy5pc0NhbmNlbGxlZD0hMTt0aGlzLnNhbXBsZVJhdGU9MDt0aGlzLmZvcm1hdD0iaW50MTYiO3RoaXMuYnVmZmVyT2Zmc2V0PTA7dGhpcy5sYXN0UGxheWVkQnVmZmVyU2l6ZT0wO3RoaXMuX2hhc1NlbnRFbmRFdmVudD0hMTt0aGlzLnBvcnQub25tZXNzYWdlPXI9PnRoaXMub25NZXNzYWdlKHIpfW9uTWVzc2FnZSh0KXtpZih0LmRhdGEuYWN0aW9uPT0ic3RhcnQiKXRoaXMuZm9ybWF0PXQuZGF0YS5mb3JtYXQsdGhpcy5zYW1wbGVSYXRlPXQuZGF0YS5pbnB1dFNhbXBsZVJhdGUsdGhpcy5yZXNhbXBsZXI9bmV3IGQodC5kYXRhLmlucHV0U2FtcGxlUmF0ZSx0LmRhdGEub3V0cHV0U2FtcGxlUmF0ZSwxLHkpLHRoaXMuZm9ybWF0PT0iaW50MTYiP3RoaXMuaW5wdXRCdWZmZXI9bmV3IGMoVWludDhBcnJheSx5KjIpOnRoaXMuZm9ybWF0PT0iZmxvYXQzMiImJih0aGlzLmlucHV0QnVmZmVyPW5ldyBjKFVpbnQ4QXJyYXkseSo0KSk7ZWxzZSBpZih0LmRhdGEuYWN0aW9uPT0iZGF0YSIpe2xldCByPW5ldyBVaW50OEFycmF5KHQuZGF0YS5idWZmZXIpO2Zvcih0aGlzLmlucHV0QnVmZmVyLmZlZWQocik7dGhpcy5pbnB1dEJ1ZmZlci5jYW5EcmFpbjspdGhpcy5kcmFpbkJ1ZmZlcigpfWVsc2UgdC5kYXRhLmFjdGlvbj09ImVuZCI/KHRoaXMubGFzdFBsYXllZEJ1ZmZlclNpemUmJnRoaXMuY2h1bmtzLnB1c2gobmV3IEZsb2F0MzJBcnJheSh0aGlzLmxhc3RQbGF5ZWRCdWZmZXJTaXplKjIpKSx0aGlzLmlzRW5kZWQ9ITApOnQuZGF0YS5hY3Rpb249PSJjYW5jZWwiJiYodGhpcy5pc0VuZGVkPSEwLHRoaXMuaXNDYW5jZWxsZWQ9ITApfWRyYWluQnVmZmVyKCl7bGV0IHQ9dGhpcy5pbnB1dEJ1ZmZlci5kcmFpbigpO2lmKCF0KXJldHVybjtsZXQgcjtpZih0aGlzLmZvcm1hdD09ImludDE2Iil7bGV0IHM9bmV3IEludDE2QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aC8yKTtyPVMocyl9ZWxzZSBpZih0aGlzLmZvcm1hdD09ImZsb2F0MzIiKXI9bmV3IEZsb2F0MzJBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoLzQpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZvcm1hdDogJHt0aGlzLmZvcm1hdH1gKTtsZXQgYT10aGlzLnJlc2FtcGxlci5yZXNhbXBsZShyKTt0aGlzLmNodW5rcy5wdXNoKGEpfW5leHRGbG9hdCgpe2lmKCF0aGlzLmNodW5rcy5sZW5ndGgpcmV0dXJuIDA7bGV0IHQ9dGhpcy5jaHVua3NbMF1bdGhpcy5jaHVua1Bvc2l0aW9uXTtyZXR1cm4gdGhpcy5jaHVua1Bvc2l0aW9uKyssdGhpcy5jaHVua1Bvc2l0aW9uPHRoaXMuY2h1bmtzWzBdLmxlbmd0aHx8KHRoaXMuY2h1bmtzLnNoaWZ0KCksdGhpcy5jaHVua1Bvc2l0aW9uPTApLHR9cHJvY2Vzcyh0LHIsYSl7aWYodGhpcy5pc0NhbmNlbGxlZClyZXR1cm4hMTtpZih0aGlzLmlzRW5kZWQmJiF0aGlzLmNodW5rcy5sZW5ndGgpcmV0dXJuIHRoaXMuX2hhc1NlbnRFbmRFdmVudHx8KHRoaXMuX2hhc1NlbnRFbmRFdmVudD0hMCx0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe2FjdGlvbjoiZW5kIn0pKSwhMTtsZXQgcz1yWzBdPy5bMF0/Lmxlbmd0aDtpZighcylyZXR1cm4hMDt0aGlzLmxhc3RQbGF5ZWRCdWZmZXJTaXplPXM7Zm9yKGxldCBmPTA7ZjxzO2YrKyl7bGV0IGg9dGhpcy5uZXh0RmxvYXQoKTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrKylmb3IobGV0IG49MDtuPHJbZV0ubGVuZ3RoO24rKylyW2VdW25dW2ZdPWh9cmV0dXJuITB9fTtyZWdpc3RlclByb2Nlc3NvcigicGNtLXBsYXllci1ub2RlIixCKTsK";var Si=new g("PCMPlayerNode"),ae=class extends AudioWorkletNode{constructor(e,t,n){super(e,"pcm-player-node",{numberOfInputs:0});this.sampleRate=0;this.format="int16";this.isCancelled=!1;if(!t||t<=0)throw new Error(`Invalid sample rate: ${t}`);if(!n||n!="int16"&&n!="float32")throw new Error(`Invalid format: ${n}`);this.sampleRate=t,this.format=n,this.port.onmessage=o=>this.onWorkletMessage(o),this.port.postMessage({action:"start",inputSampleRate:t,outputSampleRate:e.sampleRate,format:n})}static async registerModule(e){await e.audioWorklet.addModule(Et)}feed(e){this.port.postMessage({action:"data",buffer:e.buffer},[e.buffer])}async play(e){if(this.isCancelled)throw new Error("PCMPlayerNode has already been cancelled.");if(this._playPromise)throw new Error("Already playing a stream");this._playPromise=new Promise(t=>this._playPromiseResolve=t),this.dispatchEvent(new CustomEvent("start",{detail:{player:this,stream:e}}));try{let t=e.getReader();for(;!this.isCancelled;){let{done:n,value:o}=await t.read();if(n||!o)break;this.feed(o)}}catch(t){Si.warn("Stream error:",t),this.dispatchEvent(new CustomEvent("error",{detail:{player:this,stream:e,error:t}}))}this.port.postMessage({action:"end"}),await this._playPromise}onWorkletMessage(e){e.data.action=="end"&&(this._playPromiseResolve?.(),this.dispatchEvent(new CustomEvent("end",{detail:{player:this}})))}stop(){this.isCancelled=!0,this.port.postMessage({action:"cancel"}),this._playPromiseResolve?.()}};var L=new g("ElevenLabs");function at(a,i,e="pcm_24000"){let t=[],n=Date.now(),o=!1,r,s;return{stream:new ReadableStream({start:d=>{r=d,s=new WebSocket(`wss://api.elevenlabs.io/v1/text-to-speech/${i}/stream-input?inactivity_timeout=120&output_format=${e}`),s.addEventListener("open",()=>{L.debug(`[at ${Date.now()-n}ms] WebSocket connected`),s.send(JSON.stringify({text:" ","xi-api-key":a}));for(let h of t)s.send(JSON.stringify({text:h}));t.length=0}),s.addEventListener("close",()=>{L.debug(`[at ${Date.now()-n}ms] WebSocket closed`),r?.close(),o=!0}),s.addEventListener("message",h=>{let p=JSON.parse(h.data);if(p.final){s.close(),r?.close();return}if(L.debug(`[at ${Date.now()-n}ms] Message received: ${p.audio?.length||0} bytes of audio data`),!p.audio)return;let m=Uint8Array.from(atob(p.audio),f=>f.charCodeAt(0));r?.enqueue(m)})},cancel:()=>{L.debug(`[at ${Date.now()-n}ms] Stream cancelled`),s?.close(),o=!0}}),sendText:d=>{d&&(L.debug(`[at ${Date.now()-n}ms] Sending text: "${d}"`),s?.readyState===WebSocket.OPEN?s.send(JSON.stringify({text:d})):t.push(d))},endText:()=>{s?.readyState===WebSocket.OPEN?s.send(JSON.stringify({text:""})):t.push("")},get isClosed(){return o}}}function At(a,i="pcm_16000",e=16e3,t="vad"){let n=[],o=Date.now(),r=!1,s,l;return{stream:new ReadableStream({start:async p=>{s=p;let m=await fetch("https://api.elevenlabs.io/v1/single-use-token/realtime_scribe",{method:"POST",headers:{"xi-api-key":a}});if(!m.ok)throw new Error(`Failed to generate single-use token: ${m.status} ${m.statusText}`);let f=await m.json(),y=f.token;if(!y)throw new Error(`No token found in response: ${JSON.stringify(f)}`);l=new WebSocket(`wss://api.elevenlabs.io/v1/speech-to-text/realtime?token=${encodeURIComponent(y)}&audio_format=${i}&commit_strategy=${t}`),l.addEventListener("open",()=>{L.debug(`[at ${Date.now()-o}ms] WebSocket connected`);for(let w of n)l.send(w);n.length=0}),l.addEventListener("close",()=>{L.debug(`[at ${Date.now()-o}ms] WebSocket closed`),s?.close(),r=!0}),l.addEventListener("message",w=>{let k=JSON.parse(w.data);k.message_type=="committed_transcript"?(L.debug(`[at ${Date.now()-o}ms] Committed transcript received: "${k.text}"`),s?.enqueue(k.text)):k.error&&(L.warn(`[at ${Date.now()-o}ms] Error received: ${k.error}`),s?.error(new Error(k.error)),l?.close(),r=!0)})},cancel:()=>{L.debug(`[at ${Date.now()-o}ms] Stream cancelled`),l?.close(),r=!0}}),sendAudio:p=>{let m=JSON.stringify({message_type:"input_audio_chunk",audio_base_64:btoa(String.fromCharCode(...new Uint8Array(p))),commit:!1,sample_rate:e});L.debug(`[at ${Date.now()-o}ms] Sending audio: ${p.byteLength} bytes`),l?.readyState===WebSocket.OPEN?l.send(m):n.push(m)},commit:()=>{let p=JSON.stringify({message_type:"input_audio_chunk",audio_base_64:"",commit:!0,sample_rate:e});l?.readyState===WebSocket.OPEN?l.send(p):n.push(p)},close:()=>{L.debug("Closing connection"),l?.close(),r=!0,setTimeout(()=>{s?.close()},1e3)},get isClosed(){return r}}}var Be=new g("SpeechOutput"),Nt=.5,Ti=.8,je=class extends EventTarget{constructor(e){super();this.autoSpeak=!0;this.preemptiveConnection=!0;this.processedMessages=new Set;this.maxVolumeHeard=0;this._queuedText=[];this._queueActive=!1;this.ai=e,this.ai.addEventListener("output",t=>this.onOutputFromAI(t)),this.ai.audio?.speechRecognition.addEventListener("speechstart",t=>this.interrupt())}onOutputFromAI(e){let t=e.detail.messages,n=e.detail.isPartial;if(!(!this.ai?.audio?.speechRecognition.isRunning||!this.autoSpeak)){for(let o of t)if(!o.streamingInProgress&&!(!o.id||this.processedMessages.has(o.id))){this.processedMessages.add(o.id);for(let r of o.sections||[])r.type=="text"&&r.text&&this.speak(r.text)}n||this.processedMessages.clear()}}get volumeLevel(){if(!this.analyserNode||!this.analyserBuffer)return 0;this.analyserNode.getFloatTimeDomainData(this.analyserBuffer);let e=0;for(let n of this.analyserBuffer)e+=n*n;let t=Math.sqrt(e/this.analyserBuffer.length);return t>this.maxVolumeHeard&&(this.maxVolumeHeard=t),this.maxVolumeHeard*=.999,this.maxVolumeHeard<.01&&(this.maxVolumeHeard=.01),Math.min(1,Math.max(0,t/this.maxVolumeHeard))}async speak(e){if(!this.ai?.config?.voice?.providerID)return Be.warn("No voice provider configured");this.ai._voiceTracker?.(`Added text to queue: ${e}`),this._queuedText.push(e),this._runQueue()}async _runQueue(){if(this._queueActive)return;let e=this._queuedText.shift();if(!e)return;this._queueActive=!0;let t=`speech-${Ci++}`;try{await this.ai.audio.beginAccess(t),await this._speakWithLock(e)}finally{this._queueActive=!1,this.ai.audio.endAccess(t)}this._queuedText.length?await this._runQueue():this.onSpeechEnd()}_getElevenLabsConnection(){let e=this._elevenLabsPrecachedConnection;return(!e||e.isClosed)&&(e=at(this.ai.config.voice.apiKey,this.ai.config.voice.voiceID,"pcm_24000")),this.preemptiveConnection&&(this._elevenLabsPrecachedConnection=at(this.ai.config.voice.apiKey,this.ai.config.voice.voiceID,"pcm_24000")),e}async _speakWithLock(e){let t=new CustomEvent("speechfilter",{detail:{ai:this.ai,message:e}});if(this.dispatchEvent(t),e=t.detail.message,t.defaultPrevented||!e)return;this.ai.audio.speechRecognition.voiceDetection&&(this.ai.audio.speechRecognition.voiceDetection.sensitivity=Ti);let n=this.ai?._voiceTracker||Be.timer(`${this.ai.config.voice.providerID} voice`);n(`Speak: ${e}`),this.currentPlayerVolume?.disconnect(),this.currentPlayerVolume=this.ai.audio.context.createGain(),this.currentPlayerVolume.connect(this.ai.audio.context.destination),this.analyserNode=this.ai.audio.context.createAnalyser(),this.analyserNode.fftSize=32,this.analyserNode.connect(this.currentPlayerVolume),this.maxVolumeHeard=0,this.analyserBuffer=new Float32Array(this.analyserNode.fftSize);let o=new ae(this.ai.audio.context,24e3,"int16");this.currentPlayer=o,o.connect(this.analyserNode),o.addEventListener("end",l=>{let u=l;n(`PCM stream ${u.detail.interrupted?"interrupted":"ended"}`),this.currentPlayer==o&&!u.detail.interrupted&&(this.currentPlayer=void 0)});let r=Date.now(),s=null;if(this.ai.config.voice.providerID=="openai"){let l=await fetch("https://api.openai.com/v1/audio/speech",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.ai.config.voice.apiKey}`},body:JSON.stringify({model:"tts-1",input:e,voice:this.ai.config.voice.voiceID,response_format:"pcm"})});if(!l.ok){Be.warn(`Failed to generate voice sample: ${l.status} ${l.statusText}`);return}s=l.body}else if(this.ai.config.voice.providerID=="elevenlabs"){let l=this._getElevenLabsConnection();l.sendText(e),l.endText(),s=l.stream}else{Be.warn(`Unknown voice provider: ${this.ai.config.voice.providerID}`);return}n(`Received response in ${Date.now()-r}ms`),this.dispatchEvent(new CustomEvent("speechstart",{detail:{ai:this.ai,message:e}})),n("Playing PCM stream"),await o.play(s),n("Audio has ended")}get isSpeaking(){return!!this.currentPlayer}async interrupt(){if(this._queuedText=[],!this.currentPlayerVolume)return;this.ai._voiceTracker?.("Interrupted");let e=this.currentPlayerVolume,t=this.currentPlayer;this.currentPlayerVolume=void 0,this.currentPlayer=void 0,this.ai?.audio?.speechRecognition.voiceDetection&&(this.ai.audio.speechRecognition.voiceDetection.sensitivity=Nt);let n=400;e.gain.linearRampToValueAtTime(0,n/1e3),await new Promise(o=>setTimeout(o,n+250)),e.disconnect(),t?.stop(),t?.disconnect()}onSpeechEnd(){this.dispatchEvent(new CustomEvent("speechend",{detail:{ai:this.ai}})),this.ai?.audio?.speechRecognition.voiceDetection&&(this.ai.audio.speechRecognition.voiceDetection.sensitivity=Nt)}},Ci=1;function _e(a,i){let e=i.reduce((l,u)=>l+u.byteLength,0),t=new DataView(new ArrayBuffer(44));t.setUint8(0,82),t.setUint8(1,73),t.setUint8(2,70),t.setUint8(3,70),t.setUint32(4,44+e,!0),t.setUint8(8,87),t.setUint8(9,65),t.setUint8(10,86),t.setUint8(11,69);let n=1,o=32,r=n*o/8,s=a*r;return t.setUint8(12,102),t.setUint8(13,109),t.setUint8(14,116),t.setUint8(15,32),t.setUint32(16,16,!0),t.setUint16(20,3,!0),t.setUint16(22,n,!0),t.setUint32(24,a,!0),t.setUint32(28,s,!0),t.setUint16(32,r,!0),t.setUint16(34,o,!0),t.setUint8(36,100),t.setUint8(37,97),t.setUint8(38,116),t.setUint8(39,97),t.setUint32(40,e,!0),new File([t,...i],"audio.wav",{type:"audio/wav"})}var Lt="data:application/javascript;base64,dmFyIGc9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LGksZil7aWYoIWV8fCF0fHwhaSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc2V0dGluZ3Mgc3BlY2lmaWVkIGZvciB0aGUgcmVzYW1wbGVyLiIpO3RoaXMucmVzYW1wbGVyPW51bGwsdGhpcy5mcm9tU2FtcGxlUmF0ZT1lLHRoaXMudG9TYW1wbGVSYXRlPXQsdGhpcy5jaGFubmVscz1pfHwwLHRoaXMuaW5wdXRCdWZmZXJTaXplPWYsdGhpcy5pbml0aWFsaXplKCl9aW5pdGlhbGl6ZSgpe3RoaXMuZnJvbVNhbXBsZVJhdGU9PXRoaXMudG9TYW1wbGVSYXRlPyh0aGlzLnJlc2FtcGxlcj1lPT5lLHRoaXMucmF0aW9XZWlnaHQ9MSk6KHRoaXMuZnJvbVNhbXBsZVJhdGU8dGhpcy50b1NhbXBsZVJhdGU/KHRoaXMubGluZWFySW50ZXJwb2xhdGlvbigpLHRoaXMubGFzdFdlaWdodD0xKToodGhpcy5tdWx0aVRhcCgpLHRoaXMudGFpbEV4aXN0cz0hMSx0aGlzLmxhc3RXZWlnaHQ9MCksdGhpcy5pbml0aWFsaXplQnVmZmVycygpLHRoaXMucmF0aW9XZWlnaHQ9dGhpcy5mcm9tU2FtcGxlUmF0ZS90aGlzLnRvU2FtcGxlUmF0ZSl9YnVmZmVyU2xpY2UoZSl7dHJ5e3JldHVybiB0aGlzLm91dHB1dEJ1ZmZlci5zdWJhcnJheSgwLGUpfWNhdGNoe3RyeXtyZXR1cm4gdGhpcy5vdXRwdXRCdWZmZXIubGVuZ3RoPWUsdGhpcy5vdXRwdXRCdWZmZXJ9Y2F0Y2h7cmV0dXJuIHRoaXMub3V0cHV0QnVmZmVyLnNsaWNlKDAsZSl9fX1pbml0aWFsaXplQnVmZmVycygpe3RoaXMub3V0cHV0QnVmZmVyU2l6ZT1NYXRoLmNlaWwodGhpcy5pbnB1dEJ1ZmZlclNpemUqdGhpcy50b1NhbXBsZVJhdGUvdGhpcy5mcm9tU2FtcGxlUmF0ZS90aGlzLmNoYW5uZWxzKjEuMDAwMDAwNDc2ODM3MTU4MikrdGhpcy5jaGFubmVscyt0aGlzLmNoYW5uZWxzO3RyeXt0aGlzLm91dHB1dEJ1ZmZlcj1uZXcgRmxvYXQzMkFycmF5KHRoaXMub3V0cHV0QnVmZmVyU2l6ZSksdGhpcy5sYXN0T3V0cHV0PW5ldyBGbG9hdDMyQXJyYXkodGhpcy5jaGFubmVscyl9Y2F0Y2h7dGhpcy5vdXRwdXRCdWZmZXI9W10sdGhpcy5sYXN0T3V0cHV0PVtdfX1saW5lYXJJbnRlcnBvbGF0aW9uKCl7dGhpcy5yZXNhbXBsZXI9ZT0+e2xldCB0PWUubGVuZ3RoLGk9dGhpcy5jaGFubmVscyxmLGgsYSxzLHIsdSxuLHAsbDtpZih0JWkhPT0wKXRocm93IG5ldyBFcnJvcigiQnVmZmVyIHdhcyBvZiBpbmNvcnJlY3Qgc2FtcGxlIGxlbmd0aC4iKTtpZih0PD0wKXJldHVybltdO2ZvcihmPXRoaXMub3V0cHV0QnVmZmVyU2l6ZSxoPXRoaXMucmF0aW9XZWlnaHQsYT10aGlzLmxhc3RXZWlnaHQscz0wLHI9MCx1PTAsbj0wLHA9dGhpcy5vdXRwdXRCdWZmZXI7YTwxO2ErPWgpZm9yKHI9YSUxLHM9MS1yLHRoaXMubGFzdFdlaWdodD1hJTEsbD0wO2w8dGhpcy5jaGFubmVsczsrK2wpcFtuKytdPXRoaXMubGFzdE91dHB1dFtsXSpzK2VbbF0qcjtmb3IoYS09MSx0LT1pLHU9TWF0aC5mbG9vcihhKSppO248ZiYmdTx0Oyl7Zm9yKHI9YSUxLHM9MS1yLGw9MDtsPHRoaXMuY2hhbm5lbHM7KytsKXBbbisrXT1lW3UrKGw+MD9sOjApXSpzK2VbdSsoaStsKV0qcjthKz1oLHU9TWF0aC5mbG9vcihhKSppfWZvcihsPTA7bDxpOysrbCl0aGlzLmxhc3RPdXRwdXRbbF09ZVt1KytdO3JldHVybiB0aGlzLmJ1ZmZlclNsaWNlKG4pfX1tdWx0aVRhcCgpe3RoaXMucmVzYW1wbGVyPWU9PntsZXQgdD1lLmxlbmd0aCxpLGYsaD10aGlzLmNoYW5uZWxzLGEscyxyLHUsbixwLGwsbSxCO2lmKHQlaCE9PTApdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIgd2FzIG9mIGluY29ycmVjdCBzYW1wbGUgbGVuZ3RoLiIpO2lmKHQ8PTApcmV0dXJuW107Zm9yKGk9dGhpcy5vdXRwdXRCdWZmZXJTaXplLGY9W10sYT10aGlzLnJhdGlvV2VpZ2h0LHM9MCx1PTAsbj0wLHA9IXRoaXMudGFpbEV4aXN0cyx0aGlzLnRhaWxFeGlzdHM9ITEsbD10aGlzLm91dHB1dEJ1ZmZlcixtPTAsQj0wLHI9MDtyPGg7KytyKWZbcl09MDtkb3tpZihwKWZvcihzPWEscj0wO3I8aDsrK3IpZltyXT0wO2Vsc2V7Zm9yKHM9dGhpcy5sYXN0V2VpZ2h0LHI9MDtyPGg7KytyKWZbcl09dGhpcy5sYXN0T3V0cHV0W3JdO3A9ITB9Zm9yKDtzPjAmJnU8dDspaWYobj0xK3UtQixzPj1uKXtmb3Iocj0wO3I8aDsrK3IpZltyXSs9ZVt1KytdKm47Qj11LHMtPW59ZWxzZXtmb3Iocj0wO3I8aDsrK3IpZltyXSs9ZVt1KyhyPjA/cjowKV0qcztCKz1zLHM9MDticmVha31pZihzPT09MClmb3Iocj0wO3I8aDsrK3IpbFttKytdPWZbcl0vYTtlbHNle2Zvcih0aGlzLmxhc3RXZWlnaHQ9cyxyPTA7cjxoOysrcil0aGlzLmxhc3RPdXRwdXRbcl09ZltyXTt0aGlzLnRhaWxFeGlzdHM9ITA7YnJlYWt9fXdoaWxlKHU8dCYmbTxpKTtyZXR1cm4gdGhpcy5idWZmZXJTbGljZShtKX19cmVzYW1wbGUoZSl7cmV0dXJuIHRoaXMuZnJvbVNhbXBsZVJhdGU9PXRoaXMudG9TYW1wbGVSYXRlP3RoaXMucmF0aW9XZWlnaHQ9MToodGhpcy5mcm9tU2FtcGxlUmF0ZTx0aGlzLnRvU2FtcGxlUmF0ZT90aGlzLmxhc3RXZWlnaHQ9MToodGhpcy50YWlsRXhpc3RzPSExLHRoaXMubGFzdFdlaWdodD0wKSx0aGlzLmluaXRpYWxpemVCdWZmZXJzKCksdGhpcy5yYXRpb1dlaWdodD10aGlzLmZyb21TYW1wbGVSYXRlL3RoaXMudG9TYW1wbGVSYXRlKSx0aGlzLnJlc2FtcGxlcihlKX19O2Z1bmN0aW9uIGQobyl7bGV0IGU9by5sZW5ndGgsdD1uZXcgSW50MTZBcnJheShlKTtmb3IoO2UtLTspe2xldCBpPU1hdGgubWF4KC0xLE1hdGgubWluKDEsb1tlXSkpO3RbZV09aTwwP2kqMzI3Njg6aSozMjc2N31yZXR1cm4gdH1mdW5jdGlvbiB3KG8pe2xldCBlPW8ubGVuZ3RoLHQ9bmV3IEJpZ0ludDY0QXJyYXkoZSk7Zm9yKDtlLS07KXtsZXQgaT1NYXRoLm1heCgtMSxNYXRoLm1pbigxLG9bZV0pKTt0W2VdPUJpZ0ludChNYXRoLmZsb29yKGk8MD9pKjMyNzY4OmkqMzI3NjcpKSoweDEwMDAwMDAwMDAwMG59cmV0dXJuIHR9dmFyIGM9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLm91dHB1dEJ1ZmZlclNpemU9MDt0aGlzLnBhcnRpYWxCdWZmZXJzPVtdO3RoaXMucGFydGlhbEJ1ZmZlck9mZnNldD0wO2lmKCFlKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhcnJheSBjbGFzczogJHtlfWApO2lmKCF0fHx0PD0wKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvdXRwdXQgYnVmZmVyIHNpemU6ICR7dH1gKTt0aGlzLkFycmF5Q2xhc3M9ZSx0aGlzLm91dHB1dEJ1ZmZlclNpemU9dH1nZXQgcXVldWVkU2l6ZSgpe3JldHVybiB0aGlzLnBhcnRpYWxCdWZmZXJzLnJlZHVjZSgoZSx0KT0+ZSt0Lmxlbmd0aCwwKX1mZWVkKGUpe3RoaXMucGFydGlhbEJ1ZmZlcnMucHVzaChlKX1nZXQgY2FuRHJhaW4oKXtyZXR1cm4gdGhpcy5wYXJ0aWFsQnVmZmVycy5yZWR1Y2UoKHQsaSk9PnQraS5sZW5ndGgsMCktdGhpcy5wYXJ0aWFsQnVmZmVyT2Zmc2V0Pj10aGlzLm91dHB1dEJ1ZmZlclNpemV9ZHJhaW4oKXtpZighdGhpcy5jYW5EcmFpbilyZXR1cm4gbnVsbDtsZXQgZT10aGlzLkFycmF5Q2xhc3MsdD1uZXcgZSh0aGlzLm91dHB1dEJ1ZmZlclNpemUpLGk9MDtmb3IoO2khPXQubGVuZ3RoOyl7aWYoaT50Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYEJ1ZmZlciBvdmVyZmxvdzogJHtpfSA+ICR7dC5sZW5ndGh9YCk7bGV0IGY9dC5sZW5ndGgtaSxoPXRoaXMucGFydGlhbEJ1ZmZlcnNbMF0sYT1oLmxlbmd0aC10aGlzLnBhcnRpYWxCdWZmZXJPZmZzZXQ7YTxmPyh0LnNldChoLnN1YmFycmF5KHRoaXMucGFydGlhbEJ1ZmZlck9mZnNldCksaSksaSs9YSx0aGlzLnBhcnRpYWxCdWZmZXJzLnNoaWZ0KCksdGhpcy5wYXJ0aWFsQnVmZmVyT2Zmc2V0PTApOih0LnNldChoLnN1YmFycmF5KHRoaXMucGFydGlhbEJ1ZmZlck9mZnNldCx0aGlzLnBhcnRpYWxCdWZmZXJPZmZzZXQrZiksaSksaSs9Zix0aGlzLnBhcnRpYWxCdWZmZXJPZmZzZXQrPWYpfXJldHVybiB0fXBhZCgpe2xldCBlPXRoaXMucXVldWVkU2l6ZSV0aGlzLm91dHB1dEJ1ZmZlclNpemU7aWYoZT09MClyZXR1cm47bGV0IHQ9dGhpcy5BcnJheUNsYXNzLGk9bmV3IHQoZSk7dGhpcy5mZWVkKGkpfX07dmFyIHk9Y2xhc3MgZXh0ZW5kcyBBdWRpb1dvcmtsZXRQcm9jZXNzb3J7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7dGhpcy5mb3JtYXQ9ImludDE2Ijt0aGlzLmlucHV0QnVmZmVyPW5ldyBjKEZsb2F0MzJBcnJheSw0MDk2KTt0aGlzLnBvcnQub25tZXNzYWdlPWk9PnRoaXMub25NZXNzYWdlKGkpfW9uTWVzc2FnZSh0KXt0LmRhdGEuYWN0aW9uPT0ic3RhcnQiJiYodGhpcy5mb3JtYXQ9dC5kYXRhLmZvcm1hdCx0aGlzLnJlc2FtcGxlcj1uZXcgZyh0LmRhdGEuaW5wdXRTYW1wbGVSYXRlLHQuZGF0YS5vdXRwdXRTYW1wbGVSYXRlLDEsNDA5NiksdGhpcy5mb3JtYXQ9PSJpbnQxNiI/dGhpcy5vdXRwdXRCdWZmZXI9bmV3IGMoSW50MTZBcnJheSx0LmRhdGEuYnVmZmVyU2l6ZSk6dGhpcy5mb3JtYXQ9PSJpbnQ2NCI/dGhpcy5vdXRwdXRCdWZmZXI9bmV3IGMoQmlnSW50NjRBcnJheSx0LmRhdGEuYnVmZmVyU2l6ZSk6dGhpcy5mb3JtYXQ9PSJmbG9hdDMyIiYmKHRoaXMub3V0cHV0QnVmZmVyPW5ldyBjKEZsb2F0MzJBcnJheSx0LmRhdGEuYnVmZmVyU2l6ZSkpKX1wcm9jZXNzKHQsaSxmKXtmb3IobGV0IGE9MDthPGkubGVuZ3RoO2ErKyl7bGV0IHM9TWF0aC5taW4oaVthXS5sZW5ndGgsdFswXS5sZW5ndGgpO2ZvcihsZXQgcj0wO3I8cztyKyspaVthXVtyXS5zZXQodFswXVtyXSl9aWYoIXRoaXMucmVzYW1wbGVyKXJldHVybiEwO2xldCBoPW5ldyBGbG9hdDMyQXJyYXkoaVswXVswXS5sZW5ndGgpO2ZvcihoLnNldChpWzBdWzBdKSx0aGlzLmlucHV0QnVmZmVyLmZlZWQoaCk7dGhpcy5pbnB1dEJ1ZmZlci5jYW5EcmFpbjspe2xldCBhPXRoaXMuaW5wdXRCdWZmZXIuZHJhaW4oKSxzPXRoaXMucmVzYW1wbGVyLnJlc2FtcGxlKGEpO3RoaXMuZm9ybWF0PT0iaW50MTYiP3RoaXMub3V0cHV0QnVmZmVyLmZlZWQoZChzKSk6dGhpcy5mb3JtYXQ9PSJpbnQ2NCI/dGhpcy5vdXRwdXRCdWZmZXIuZmVlZCh3KHMpKTp0aGlzLmZvcm1hdD09ImZsb2F0MzIiJiZ0aGlzLm91dHB1dEJ1ZmZlci5mZWVkKHMpfWZvcig7dGhpcy5vdXRwdXRCdWZmZXIuY2FuRHJhaW47KXtsZXQgYT10aGlzLm91dHB1dEJ1ZmZlci5kcmFpbigpO2lmKCFhKWJyZWFrO3RoaXMucG9ydC5wb3N0TWVzc2FnZSh7YWN0aW9uOiJkYXRhIixidWZmZXI6YS5idWZmZXJ9LFthLmJ1ZmZlcl0pfXJldHVybiEwfX07cmVnaXN0ZXJQcm9jZXNzb3IoInBjbS1yZWNlaXZlci1ub2RlIix5KTsK";var le=class extends AudioWorkletNode{constructor(e,t,n,o){super(e,"pcm-receiver-node",{numberOfInputs:1});this.format="int16";this.format=n;let r=["int16","int64","float32"];if(!t||t<=0)throw new Error(`Invalid sample rate: ${t}`);if(!r.includes(n))throw new Error(`Invalid format ${n}, must be one of: ${r.join(", ")}`);if(!o||o<=0)throw new Error(`Invalid buffer size: ${o}`);this.port.onmessage=s=>this.onWorkletMessage(s),this.port.postMessage({action:"start",inputSampleRate:e.sampleRate,outputSampleRate:t,format:n,bufferSize:o})}static async registerModule(e){await e.audioWorklet.addModule(Lt)}onWorkletMessage(e){if(e.data.action=="data"){let t=null;if(this.format=="int16"&&(t=new Int16Array(e.data.buffer)),this.format=="int64"&&(t=new BigInt64Array(e.data.buffer)),this.format=="float32"&&(t=new Float32Array(e.data.buffer)),!t)throw new Error(`Invalid format: ${this.format}`);this.onData(t),this.dispatchEvent(new CustomEvent("data",{detail:{data:t}}))}}onData(e){}};var lt=16e3,ze=256,de=8,xe=new g("VoiceDetectionNode"),Me=class Me extends le{constructor(e){super(e,lt,"float32",ze*de);this.isVoiceActive=!1;this.lastVoiceActiveDate=0;this.voiceEndTimeout=50;this.sensitivity=.5;this.sentivityEnd=.2;this.nextVadReset=0;this.currentProbability=0;this._lastVoiceActive=!1;if(!Me.vadModelURL)throw new Error("VAD model url not set, please load it and set it to VoiceDetectionNode.vadModelURL");this.loadModel()}get isVoicePossiblyEnding(){return this.isVoiceActive&&this.currentProbability<this.sensitivity}get sampleRate(){return lt}get numberOfSamples(){return ze}get numberOfSampleChunks(){return de}get outputBufferSize(){return ze*de}get isModelLoaded(){return!!this.vad}async loadModel(){xe.debug("Loading VAD model"),this.vad=await R.load(Me.vadModelURL),this.vad.ignoreIfBusy=!0,xe.debug("Model loaded"),this.vad.makeConstant("sr","int64",[1],lt),this.vad.makeState("h","hn","float32",[2,de,64]),this.vad.makeState("c","cn","float32",[2,de,64])}async onData(e){if(this.vad)try{let t=await this.vad.run({input:new R.onnx.Tensor(e,[de,ze])});if(!t)return;this.currentProbability=0;for(let r=0;r<t.output.data.length;r++)t.output.data[r]>this.currentProbability&&(this.currentProbability=t.output.data[r]);let n=this.isVoiceActive?this.sentivityEnd:this.sensitivity,o=this.currentProbability>n;if(!o&&this._lastVoiceActive&&(this.nextVadReset=Date.now(),this.vad.resetState()),this._lastVoiceActive=o,o&&!this.isVoiceActive?(this.lastVoiceActiveDate=Date.now(),this.isVoiceActive=!0,this.dispatchEvent(new CustomEvent("speechstart")),this.onSpeechStart(),xe.debug("Started speaking")):o?this.lastVoiceActiveDate=Date.now():!o&&this.isVoiceActive&&Date.now()<this.lastVoiceActiveDate+this.voiceEndTimeout||!o&&this.isVoiceActive&&(this.isVoiceActive=!1,this.dispatchEvent(new CustomEvent("speechend")),this.onSpeechEnd(),xe.debug("Stopped speaking after timeout")),!o){let r=Date.now();r>this.nextVadReset&&(this.nextVadReset=r+5e3,this.vad.resetState())}}catch(t){xe.error("VAD failed:",t)}}onSpeechStart(){}onSpeechEnd(){}};Me.vadModelURL="";var ce=Me;var Dt=new g("VoiceChunkOutputNode"),F=class extends ce{constructor(){super(...arguments);this.buffers=[];this.recordedBuffers=[];this._voiceRecording=!1;this.backBufferDurationSeconds=3}get bufferDuration(){return this.buffers.reduce((e,t)=>e+t.length,0)/8e3}async onData(e){if(await super.onData(e),this.isVoiceActive&&!this._voiceRecording){Dt.debug(`Voice detected, sending ${this.buffers.length} existing chunks`),this._voiceRecording=!0;for(let t of this.buffers)this.recordedBuffers.push(t),this.dispatchEvent(new CustomEvent("voicedata",{detail:{data:t,isFinal:!1}})),this.onVoiceChunk(t);this.recordedBuffers.push(e),this.dispatchEvent(new CustomEvent("voicedata",{detail:{data:e,isFinal:!1}})),this.onVoiceChunk(e),this.buffers=[]}else if(this.isVoiceActive)this.recordedBuffers.push(e),this.dispatchEvent(new CustomEvent("voicedata",{detail:{data:e,isFinal:!1}})),this.onVoiceChunk(e);else if(!this.isVoiceActive&&this._voiceRecording){this.recordedBuffers.push(e),this.dispatchEvent(new CustomEvent("voicedata",{detail:{data:e,isFinal:!0}})),this.onVoiceChunk(e),this._voiceRecording=!1;let t=this.recordedBuffers.reduce((n,o)=>n+o.length,0);Dt.debug(`Voice complete, recorded ${(t/8e3).toFixed(2)} seconds of audio, ${t*4/1024} KB of data`),this.dispatchEvent(new CustomEvent("voicedataend",{detail:{data:this.recordedBuffers}})),this.onVoiceEnd(this.recordedBuffers),this.recordedBuffers=[]}else for(this.buffers.push(e);this.bufferDuration>this.backBufferDurationSeconds;)this.buffers.shift()}onVoiceChunk(e){}onVoiceEnd(e){}};var Oe=new g("OpenAITranscriptionNode"),Ve=class extends F{constructor(e,t){super(e);this.apiKey="";this.pendingBuffers=[];this.isTranscribing=!1;this.apiKey=t}async onVoiceEnd(e){let t=Oe.timer("OpenAI Transcribe");this.isTranscribing=!0,this.pendingBuffers.push(...e);let n=_e(this.sampleRate,this.pendingBuffers);this.lastRequestAbortController?.abort(),this.lastRequestAbortController=new AbortController;let o="";try{let r=new FormData;r.append("file",n),r.append("model","whisper-1"),r.append("response_format","text");let s=await fetch("https://api.openai.com/v1/audio/transcriptions",{method:"POST",headers:{Authorization:`Bearer ${this.apiKey}`},body:r,signal:this.lastRequestAbortController.signal});if(!s.ok)throw new Error(`Failed to generate voice sample: ${s.status} ${s.statusText}`);t("Response received"),o=await s.text(),t("Content received: "+o),this.lastRequestAbortController=void 0}catch(r){Oe.error(`Failed to transcribe speech: ${r.message}`);return}finally{this.isTranscribing=!1}if(this.pendingBuffers=[],!o)return Oe.debug("Transcription complete, but no text was found");Oe.debug(`Transcription: ${o}`),this.onVoiceTranscription(o),this.dispatchEvent(new CustomEvent("transcription",{detail:{text:o}}))}onVoiceTranscription(e){}};var Ye=class extends WebSocket{constructor(e){super(e);this.pendingData=[];this.addEventListener("open",()=>this._onOpen())}send(e){this.readyState==WebSocket.OPEN?super.send(e):this.pendingData.push(e)}_onOpen(){for(let e of this.pendingData)super.send(e);this.pendingData=[]}};var W=new g("IntelliWeaveTranscriptionNode"),Ai="wss://speech.intelliweave.ai/api/v1/transcribe",Ue=class Ue extends F{constructor(e,t){super(e);this.apiAddress=Ai;this.apiKey="";this.isTranscribing=!1;this.apiKey=t}async onVoiceChunk(e){this.isTranscribing=!0,this.ws?this.ws.send(e):(W.debug("Opening WebSocket connection"),this.ws=new Ye(this.apiAddress),this.ws.send(JSON.stringify({type:"hello",sampleRate:16e3,channels:1,format:"float32",apiKey:this.apiKey})),this.ws.send(e.buffer),this.ws.onopen=()=>{W.debug("WebSocket connection opened")},this.ws.addEventListener("message",n=>{let o=JSON.parse(n.data);if(o.error)return W.warn("Error: "+o.error);if(o.type!="transcription")return W.warn("Invalid response type",o);if(o.streaming&&!o.final)return W.debug("Partial transcription: "+o.partialText);if(this.isTranscribing=!1,!o.text.trim())return W.warn(`Empty transcription (${o.processingTime}ms)`);W.debug(`Transcription: ${o.text} (${o.processingTime}ms)`),this.onVoiceTranscription(o.text),this.dispatchEvent(new CustomEvent("transcription",{detail:{text:o.text}}))}),this.ws.addEventListener("close",()=>this.onSocketClose()),this.ws.addEventListener("error",n=>W.warn("WebSocket error")));let t=1e3*60*1;this.shutdownTimer&&clearTimeout(this.shutdownTimer),this.shutdownTimer=setTimeout(()=>{W.debug("Shutting down WebSocket connection"),this.ws?.close(),this.ws=void 0},t)}async onVoiceEnd(e){if(this.ws?.send(JSON.stringify({type:"end"})),Ue.debugExportWav){let t=_e(this.sampleRate,e),n=document.createElement("a");n.href=URL.createObjectURL(t),n.download="recording.wav",n.click()}}onVoiceTranscription(e){}onSocketClose(){W.debug("WebSocket connection closed"),this.ws=void 0,this.isTranscribing=!1}};Ue.debugExportWav=!1;var Fe=Ue;var ue=new g("ElevenLabsTranscriptionNode"),Ke=class extends F{constructor(e,t){super(e);this.apiKey="";this.isTranscribing=!1;this.apiKey=t}async onVoiceChunk(e){this.isTranscribing=!0;let t=new Int16Array(e.length);for(let o=0;o<e.length;o++)t[o]=e[o]*32767;!this.connection||this.connection.isClosed?(this.connection?.close(),this.connection=void 0,ue.debug(`Opening connection. sampleRate: ${this.sampleRate} format=${this.format}`),this.connection=At(this.apiKey,"pcm_"+this.sampleRate,this.sampleRate,"manual"),this.startReading(this.connection),this.connection.sendAudio(t.buffer)):this.connection.sendAudio(t.buffer);let n=1e3*60*1;this.shutdownTimer&&clearTimeout(this.shutdownTimer),this.shutdownTimer=setTimeout(()=>{ue.debug("Shutting down WebSocket connection"),this.connection?.close(),this.connection=void 0},n)}async startReading(e){let t=e.stream.getReader();try{for(;;){let{value:n,done:o}=await t.read();if(o){ue.debug("Stream closed");break}if(!n?.trim()){ue.warn("Empty transcription received");continue}this.isTranscribing=!1,ue.debug(`Transcription: ${n}`),this.onVoiceTranscription(n),this.dispatchEvent(new CustomEvent("transcription",{detail:{text:n}}))}}catch(n){ue.error(`Failed to read transcription stream: ${n.message}`),this.connection==e&&(this.connection=void 0);return}}async onVoiceEnd(e){this.connection?.commit()}onVoiceTranscription(e){}};var dt=new g("SpeechRecognition"),He=class extends EventTarget{constructor(e){super();this.isRunning=!1;this._skipEvents=!1;this.maxVolumeHeard=0;this.ai=e}get isSupported(){if(!R.lib||!this.ai?.vadModel||!O().AudioWorkletNode)return!1;if(this.ai?.config?.transcription?.providerID!="intelliweave"){if(!(this.ai?.config?.transcription?.providerID=="openai"&&this.ai.config?.transcription?.apiKey)){if(!(this.ai?.config?.transcription?.providerID=="elevenlabs"&&this.ai.config?.transcription?.apiKey))return!1}}return!0}async start(){if(!this.isSupported)throw new Error("Speech recognition not supported in this persona and browser.");if(!this.isRunning){this.isRunning=!0;try{await this.ai.audio.beginAccess("speech-recognition"),this.micStream=await navigator.mediaDevices.getUserMedia({audio:{channelCount:1,echoCancellation:!0,autoGainControl:!0,noiseSuppression:!0}});let e=this.ai.audio.context.createMediaStreamSource(this.micStream);this.analyserNode=this.ai.audio.context.createAnalyser(),this.analyserNode.fftSize=32,e.connect(this.analyserNode),this.analyserBuffer=new Float32Array(this.analyserNode.fftSize),ce.vadModelURL=URL.createObjectURL(this.ai.vadModel),this.ai?.config?.transcription?.providerID=="openai"?(this.voiceDetection=new Ve(this.ai.audio.context,this.ai.config.transcription.apiKey),e.connect(this.voiceDetection)):this.ai?.config?.transcription?.providerID=="elevenlabs"?(this.voiceDetection=new Ke(this.ai.audio.context,this.ai.config.transcription.apiKey),e.connect(this.voiceDetection)):(this.voiceDetection=new Fe(this.ai.audio.context,this.ai.apiKey),this.voiceDetection.apiAddress=this.ai?.config?.transcription?.url||this.voiceDetection.apiAddress,e.connect(this.voiceDetection)),this.voiceDetection.addEventListener("speechstart",t=>{this.ai._voiceTracker=dt.timer("voice interaction","Speech started"),this.recordingStartTime=Date.now(),C(this.ai,{event_type:"voice_start",event_properties:{audio_provider:this.ai.config?.transcription?.providerID||"intelliweave",sample_rate:16e3}}),this.dispatchEvent(new CustomEvent(t.type,{detail:t.detail}))}),this.voiceDetection.addEventListener("speechend",t=>{this.ai._voiceTracker?.("Speech ended");let n=this.recordingStartTime?Date.now()-this.recordingStartTime:0;C(this.ai,{event_type:"voice_end",event_properties:{recording_duration_ms:n}}),this.dispatchEvent(new CustomEvent(t.type,{detail:t.detail}))}),this.voiceDetection.addEventListener("transcription",t=>{this.ai._voiceTracker?.(`Transcription: ${t.detail.text}`),C(this.ai,{event_type:"voice_submit",value_str:"",event_properties:{transcription_provider:this.ai.config?.transcription?.providerID||"intelliweave",confidence_score:t.detail.confidence||void 0}}),this.onTranscription(t)}),this._skipEvents||this.dispatchEvent(new CustomEvent("start",{detail:{speechRecognition:this}}))}catch(e){dt.error("Failed to start speech recognition:",e),this.stop()}}}stop(){this.isRunning&&(this.isRunning=!1,this.ai.audio.endAccess("speech-recognition"),this.voiceDetection?.disconnect(),this.voiceDetection=void 0,this.micStream?.getTracks().forEach(e=>e.stop()),this.micStream=void 0,this.analyserNode=void 0,this.analyserBuffer=void 0,this._skipEvents||this.dispatchEvent(new CustomEvent("end",{detail:{speechRecognition:this}})))}get volumeLevel(){if(!this.analyserNode||!this.analyserBuffer)return 0;this.analyserNode.getFloatTimeDomainData(this.analyserBuffer);let e=0;for(let n of this.analyserBuffer)e+=n*n;let t=Math.sqrt(e/this.analyserBuffer.length);return t>this.maxVolumeHeard&&(this.maxVolumeHeard=t),this.maxVolumeHeard*=.999,this.maxVolumeHeard<.01&&(this.maxVolumeHeard=.01),Math.min(1,Math.max(0,t/this.maxVolumeHeard))}get wordsCurrentlyBeingSpoken(){return!!this.voiceDetection?.isVoiceActive}get isTranscribing(){return!!this.voiceDetection?.isTranscribing}onTranscription(e){let t=e.detail.text;dt.debug("Heard:",t),this.dispatchEvent(new CustomEvent("speech",{detail:{transcript:t,isFinal:!0}}))}async reset(){if(this.isRunning){this._skipEvents=!0;try{this.stop(),await this.start(),this._skipEvents=!1}catch(e){throw this._skipEvents=!1,e}}}};var Je=new g("AudioSystem"),U=class a{constructor(i){this.locks=[];if(!i)throw new Error("AI reference is required. Please pass in the IntelliWeave instance to the constructor.");this.ai=i,this.ai.audio=this,this.speechRecognition=new He(this.ai),this.speechOutput=new je(this.ai)}static get isSupported(){return!(!R.lib||!O().AudioWorkletNode)}static async registerModules(i){await Promise.all([ae.registerModule(i),le.registerModule(i)])}async beginAccess(i){Je.debug(`Began access for: ${i}`),this.locks.includes(i)||this.locks.push(i),!this.context&&(Je.debug("Creating AudioContext"),this.context=new AudioContext({latencyHint:"interactive"}),this.context.resume(),await a.registerModules(this.context))}endAccess(i){Je.debug(`Ended access for: ${i}`),this.locks=this.locks.filter(e=>e!=i),!this.locks.length&&(Je.debug("Closing AudioContext"),this.context?.close(),this.context=void 0)}};var E=new g("Embed"),pe=class extends N{constructor(){super();this.config={};this.suggestions=[];this._previousOpenState=!1;this._handledEmbeddedActionBlocks=new Map;this._autoStartPromptHasRun=!1;this._returnToCollapsedOnSwipeClose=!1;this._suppressNextContainerClick=!1;this._previousFullscreenState=!1;this.html=()=>`
473
473
 
474
474
  <!-- Styling -->
475
475
  <style>
@@ -621,10 +621,12 @@ ${o}`,cannotRemove:i.isContext,sortOrder:101,disabled:typeof i.disabled=="functi
621
621
  background: var(--intelliweave-poweredby-bg, rgba(7, 11, 13, 0.38));
622
622
  border-top: 1px solid rgba(255, 255, 255, 0.08);
623
623
  color: rgba(230, 241, 245, 0.62);
624
+ height: 20px;
624
625
  width: 100%;
625
626
  max-width: none;
626
627
  margin: 0;
627
628
  border-radius: 0;
629
+ font-size: 13px;
628
630
  }
629
631
 
630
632
  #root.open #poweredby {
@@ -1278,6 +1280,7 @@ ${o}`,cannotRemove:i.isContext,sortOrder:101,disabled:typeof i.disabled=="functi
1278
1280
  flex-direction: unset;
1279
1281
  gap: 10px;
1280
1282
  }
1283
+
1281
1284
  #root.container-mode #web-weaver-embed-inner {
1282
1285
  flex: 1 1 auto;
1283
1286
  min-height: 0;
@@ -1549,6 +1552,21 @@ ${o}`,cannotRemove:i.isContext,sortOrder:101,disabled:typeof i.disabled=="functi
1549
1552
  overflow: hidden;
1550
1553
  text-overflow: ellipsis;
1551
1554
  }
1555
+ #root.layout-fullscreen:not(.container-mode) #web-weaver-embed-inner {
1556
+ flex: 1 1 auto;
1557
+ min-height: 0;
1558
+ max-height: none;
1559
+ height: auto;
1560
+ overflow-x: hidden;
1561
+ overflow-y: auto;
1562
+ width: 100%;
1563
+ max-width: none;
1564
+ margin: 2px;
1565
+ padding: 12px;
1566
+ align-content: start;
1567
+ flex-direction: unset;
1568
+ gap: 10px;
1569
+ }
1552
1570
  }
1553
1571
 
1554
1572
  </style>
@@ -1578,7 +1596,7 @@ ${o}`,cannotRemove:i.isContext,sortOrder:101,disabled:typeof i.disabled=="functi
1578
1596
  </div>
1579
1597
 
1580
1598
  <!-- Logo -->
1581
- ${be.add({id:"web-weaver-logo",logo:this.attr.logo})}
1599
+ ${we.add({id:"web-weaver-logo",logo:this.attr.logo})}
1582
1600
  <div id='pulseanim' class="circle pulse"></div>
1583
1601
 
1584
1602
 
@@ -1610,10 +1628,10 @@ ${o}`,cannotRemove:i.isContext,sortOrder:101,disabled:typeof i.disabled=="functi
1610
1628
  </div>
1611
1629
 
1612
1630
  <!-- LLM selector panel -->
1613
- ${ye.add({id:"llm-selector-panel"})}
1631
+ ${ve.add({id:"llm-selector-panel"})}
1614
1632
 
1615
1633
  <!-- Interaction panel -->
1616
- ${fe.add({id:"interaction-bar"})}
1634
+ ${ye.add({id:"interaction-bar"})}
1617
1635
 
1618
1636
 
1619
1637
  <!-- Powered by IW banner -->
@@ -1621,9 +1639,9 @@ ${o}`,cannotRemove:i.isContext,sortOrder:101,disabled:typeof i.disabled=="functi
1621
1639
 
1622
1640
  </div>
1623
1641
 
1624
- `;this._lastLogo="";this._lastBackground="";this._lastTextColor="";this._lastFontFamily="";this._lastDisplayMode="";this._lastLayout="";this._lastPersonaName="";this._lastHeaderLogo="";this._lastPositioningMode="";this._lastPositionX="";this._lastPositionY="";this._lastBrandName="";this._lastBrandNameColor="";this._isProcessing=!1;this.ai=new U,H.isSupported&&(this.ai.audio=new H(this.ai))}onCreate(){b().embed&&E.warn("Only one <web-weaver-embed> element should be on the page."),b().embed=this;let e=b();E.debug("[WebWeaverEmbed] Client config:",e),e.displayMode&&!this.attr.displayMode&&(E.debug("[WebWeaverEmbed] Setting displayMode from client config:",e.displayMode),this.attr.displayMode=e.displayMode),e.layout&&!this.attr.layout&&(E.debug("[WebWeaverEmbed] Setting layout from client config:",e.layout),this.attr.layout=e.layout),e.positioningMode&&!this.attr.positioningMode&&(E.debug("[WebWeaverEmbed] Setting positioningMode from client config:",e.positioningMode),this.attr.positioningMode=e.positioningMode),e.positionX&&!this.attr.positionX&&(E.debug("[WebWeaverEmbed] Setting positionX from client config:",e.positionX),this.attr.positionX=e.positionX),e.positionY&&!this.attr.positionY&&(E.debug("[WebWeaverEmbed] Setting positionY from client config:",e.positionY),this.attr.positionY=e.positionY),e.offsetX!==void 0&&!this.attr.offsetX&&(E.debug("[WebWeaverEmbed] Setting offsetX from client config:",e.offsetX),this.attr.offsetX=String(e.offsetX)),e.offsetY!==void 0&&!this.attr.offsetY&&(E.debug("[WebWeaverEmbed] Setting offsetY from client config:",e.offsetY),this.attr.offsetY=String(e.offsetY)),E.debug("[WebWeaverEmbed] Attributes after setting:",{displayMode:this.attr.displayMode,positionX:this.attr.positionX,positionY:this.attr.positionY,offsetX:this.attr.offsetX,offsetY:this.attr.offsetY}),this.applyConfigStylesAndAttributes(),this.child("root").addEventListener("click",o=>this.onContainerClick(o)),this.child("web-weaver-logo").addEventListener("click",o=>this.onLogoClick(o)),this.child("dock-main").addEventListener("click",o=>this.onDockOpenClick(o)),this.child("dock-collapse").addEventListener("click",o=>this.onDockCollapseClick(o)),this.child("collapsed-tab").addEventListener("click",o=>this.onCollapsedOpenClick(o)),this.child("panel-fullscreen").addEventListener("click",o=>this.onPanelFullscreenClick(o)),this.child("panel-close").addEventListener("click",o=>this.onPanelCloseClick(o)),this.child("collapsed-tab").addEventListener("pointerdown",o=>this.onSwipePointerDown(o)),this.child("collapsed-tab").addEventListener("pointerup",o=>this.onCollapsedSwipePointerUp(o)),this.child("dock-main").addEventListener("pointerdown",o=>this.onSwipePointerDown(o)),this.child("dock-main").addEventListener("pointerup",o=>this.onDockSwipePointerUp(o)),this.child("root").addEventListener("pointerdown",o=>this.onSwipePointerDown(o)),this.child("root").addEventListener("pointerup",o=>this.onPanelSwipePointerUp(o)),this.child("root").addEventListener("pointercancel",o=>this.onSwipePointerCancel()),this.child("interaction-bar").addEventListener("input-message",o=>this.processInput(o.detail)),this.child("interaction-bar").addEventListener("llm-button-click",o=>this.state.llmPanelOpen=!this.state.llmPanelOpen),this.child("llm-selector-panel").addEventListener("select",o=>this.onLLMModelSelect(o)),this.child("web-weaver-embed-inner").addEventListener("scroll",o=>this.onContentScroll(o)),this.child("interaction-bar").connectAI(this.ai),this.ai.onAIMessage=this.onAIMessage.bind(this),this.ai.knowledgeBase.addEntry({id:"_iw_image_instructions",type:"info",name:"Using Images",content:`
1642
+ `;this._lastLogo="";this._lastBackground="";this._lastTextColor="";this._lastFontFamily="";this._lastDisplayMode="";this._lastLayout="";this._lastPersonaName="";this._lastHeaderLogo="";this._lastPositioningMode="";this._lastPositionX="";this._lastPositionY="";this._lastBrandName="";this._lastBrandNameColor="";this._isProcessing=!1;this.ai=new Y,U.isSupported&&(this.ai.audio=new U(this.ai))}onCreate(){b().embed&&E.warn("Only one <web-weaver-embed> element should be on the page."),b().embed=this;let e=b();E.debug("[WebWeaverEmbed] Client config:",e),e.displayMode&&!this.attr.displayMode&&(E.debug("[WebWeaverEmbed] Setting displayMode from client config:",e.displayMode),this.attr.displayMode=e.displayMode),e.layout&&!this.attr.layout&&(E.debug("[WebWeaverEmbed] Setting layout from client config:",e.layout),this.attr.layout=e.layout),e.positioningMode&&!this.attr.positioningMode&&(E.debug("[WebWeaverEmbed] Setting positioningMode from client config:",e.positioningMode),this.attr.positioningMode=e.positioningMode),e.positionX&&!this.attr.positionX&&(E.debug("[WebWeaverEmbed] Setting positionX from client config:",e.positionX),this.attr.positionX=e.positionX),e.positionY&&!this.attr.positionY&&(E.debug("[WebWeaverEmbed] Setting positionY from client config:",e.positionY),this.attr.positionY=e.positionY),e.offsetX!==void 0&&!this.attr.offsetX&&(E.debug("[WebWeaverEmbed] Setting offsetX from client config:",e.offsetX),this.attr.offsetX=String(e.offsetX)),e.offsetY!==void 0&&!this.attr.offsetY&&(E.debug("[WebWeaverEmbed] Setting offsetY from client config:",e.offsetY),this.attr.offsetY=String(e.offsetY)),E.debug("[WebWeaverEmbed] Attributes after setting:",{displayMode:this.attr.displayMode,positionX:this.attr.positionX,positionY:this.attr.positionY,offsetX:this.attr.offsetX,offsetY:this.attr.offsetY}),this.applyConfigStylesAndAttributes(),this.child("root").addEventListener("click",o=>this.onContainerClick(o)),this.child("web-weaver-logo").addEventListener("click",o=>this.onLogoClick(o)),this.child("dock-main").addEventListener("click",o=>this.onDockOpenClick(o)),this.child("dock-collapse").addEventListener("click",o=>this.onDockCollapseClick(o)),this.child("collapsed-tab").addEventListener("click",o=>this.onCollapsedOpenClick(o)),this.child("panel-fullscreen").addEventListener("click",o=>this.onPanelFullscreenClick(o)),this.child("panel-close").addEventListener("click",o=>this.onPanelCloseClick(o)),this.child("collapsed-tab").addEventListener("pointerdown",o=>this.onSwipePointerDown(o)),this.child("collapsed-tab").addEventListener("pointerup",o=>this.onCollapsedSwipePointerUp(o)),this.child("dock-main").addEventListener("pointerdown",o=>this.onSwipePointerDown(o)),this.child("dock-main").addEventListener("pointerup",o=>this.onDockSwipePointerUp(o)),this.child("root").addEventListener("pointerdown",o=>this.onSwipePointerDown(o)),this.child("root").addEventListener("pointerup",o=>this.onPanelSwipePointerUp(o)),this.child("root").addEventListener("pointercancel",o=>this.onSwipePointerCancel()),this.child("interaction-bar").addEventListener("input-message",o=>this.processInput(o.detail)),this.child("interaction-bar").addEventListener("llm-button-click",o=>this.state.llmPanelOpen=!this.state.llmPanelOpen),this.child("llm-selector-panel").addEventListener("select",o=>this.onLLMModelSelect(o)),this.child("web-weaver-embed-inner").addEventListener("scroll",o=>this.onContentScroll(o)),this.child("interaction-bar").connectAI(this.ai),this.ai.onAIMessage=this.onAIMessage.bind(this),this.ai.knowledgeBase.addEntry({id:"_iw_image_instructions",type:"info",name:"Using Images",content:`
1625
1643
  You can display images in Markdown format, example: ![filename](url)
1626
- Image URLs must be absolute. When using an image URL from the knowledge base, include all parameters.`,isContext:!0});let i=this.attr.apiKey||b().apiKey;if(!i)return E.warn("No API key specified, some features may be unavailable.");this.state.loading=!0,this.attr.hubAPI&&(this.ai.hubAPI=this.attr.hubAPI),this.ai.load(i).then(o=>{this.config=o.config,b().introductionMessage=this.config.introductionMessage,b().analytics=this.config.analytics!==void 0?!!this.config.analytics:b().analytics,this.applyConfigStylesAndAttributes(),this.child("root").classList.remove("hidden"),this.state.loading=!1,this.updateBrandingFor(this.config.managedBy),this.ai.knowledgeBase.addEntry({id:"_iw_suggestion_action_instructions",type:"info",name:"Suggestion buttons",content:`
1644
+ Image URLs must be absolute. When using an image URL from the knowledge base, include all parameters.`,isContext:!0});let n=this.attr.apiKey||b().apiKey;if(!n)return E.warn("No API key specified, some features may be unavailable.");this.state.loading=!0,this.attr.hubAPI&&(this.ai.hubAPI=this.attr.hubAPI),this.ai.load(n).then(o=>{this.config=o.config,b().introductionMessage=this.config.introductionMessage,b().autoStartPrompt=this.config.autoStartPrompt,b().analytics=this.config.analytics!==void 0?!!this.config.analytics:b().analytics,this.applyConfigStylesAndAttributes(),this.child("root").classList.remove("hidden"),this.state.loading=!1,this.updateBrandingFor(this.config.managedBy),this.ai.knowledgeBase.addEntry({id:"_iw_suggestion_action_instructions",type:"info",name:"Suggestion buttons",content:`
1627
1645
  Suggest follow-up responses by embedding standalone action blocks: <[[ {"action":"suggestion","text":"Show me pricing"} ]]>
1628
1646
  The block is hidden from the user and will be displayed as clickable buttons.
1629
1647
  Use concise text that can be sent as the user's next message.
@@ -1633,9 +1651,11 @@ ${o}`,cannotRemove:i.isContext,sortOrder:101,disabled:typeof i.disabled=="functi
1633
1651
  The block is hidden from the user.
1634
1652
  Use this sparingly for celebration, confirmation, delight, or matching user emotion.
1635
1653
  Only use one emoji character or a short emoji sequence.
1636
- Continue writing normal visible text outside the block.`,isContext:!0,disabled:!this.ai.flags.allowEmojiActions}),this.resetConversation()}).catch(o=>{E.error("Failed to load AI configuration:",o),this.state.loading=!1;let r=this.child("web-weaver-embed-inner");if(r){let s=o?.message||o?.toString()||"Unknown error";r.innerHTML=`<div class="output" style="padding: 20px;"><span style="display: inline-block; background-color: #fee; color: #c00; padding: 8px 12px; border-radius: 6px; border: 1px solid #fcc;">${s}</span></div>`}})}applyPersonaColorVariants(e,t,i){let o=this.parseColorToRGB(i),r=this.parseColorToRGB(t);if(!r&&!o){e.style.removeProperty("--intelliweave-persona-bg-muted"),e.style.removeProperty("--intelliweave-assistant-bubble-bg"),e.style.removeProperty("--intelliweave-assistant-bubble-border"),e.style.removeProperty("--intelliweave-user-bubble-bg"),e.style.removeProperty("--intelliweave-user-bubble-border"),e.style.removeProperty("--intelliweave-suggestion-button-bg"),e.style.removeProperty("--intelliweave-suggestion-button-hover-bg"),e.style.removeProperty("--intelliweave-suggestion-button-border"),e.style.removeProperty("--intelliweave-suggestion-button-hover-border"),e.style.removeProperty("--intelliweave-suggestion-button-text"),e.style.removeProperty("--intelliweave-interaction-bg"),e.style.removeProperty("--intelliweave-fullscreen-header-bg"),e.style.removeProperty("--intelliweave-fullscreen-input-section-bg"),e.style.removeProperty("--intelliweave-input-field-bg"),e.style.removeProperty("--intelliweave-input-highlight-color"),e.style.removeProperty("--intelliweave-poweredby-bg");return}let s=r||{r:32,g:38,b:44},{r:l,g:u,b:c}=s,d=o?(.2126*o.r+.7152*o.g+.0722*o.b)/255:1,h=d<.45,p=0,m=o?.r??l,g=o?.g??u,y=o?.b??c,w=h?0:255,k=.46,J=.24,Z=.1,v=.22,W=.32,M=h?.07:.1,pe={r:Math.round(l+(p-l)*k),g:Math.round(u+(p-u)*k),b:Math.round(c+(p-c)*k)},xe={r:Math.round((l+(p-l)*J)*.86+m*.14),g:Math.round((u+(p-u)*J)*.86+g*.14),b:Math.round((c+(p-c)*J)*.86+y*.14)},G={r:Math.round((l+(p-l)*Z)*.78+m*.22),g:Math.round((u+(p-u)*Z)*.78+g*.22),b:Math.round((c+(p-c)*Z)*.78+y*.22)},lt=`rgba(${G.r}, ${G.g}, ${G.b}, 0.84)`,B={r:Math.round(l+(p-l)*v),g:Math.round(u+(p-u)*v),b:Math.round(c+(p-c)*v)},Me={r:Math.round(l+(p-l)*W),g:Math.round(u+(p-u)*W),b:Math.round(c+(p-c)*W)},N={r:Math.round(l+(w-l)*M),g:Math.round(u+(w-u)*M),b:Math.round(c+(w-c)*M)},j=o||{r:230,g:241,b:245},_=o?d:.9,Ie=S=>{let T=S/255;return T<=.03928?T/12.92:Math.pow((T+.055)/1.055,2.4)},q=S=>.2126*Ie(S.r)+.7152*Ie(S.g)+.0722*Ie(S.b),dt=(S,T)=>{let me=q(S),ct=q(T),jt=Math.max(me,ct),_t=Math.min(me,ct);return(jt+.05)/(_t+.05)},ee=(S,T)=>({r:Math.round(S.r*(1-T)),g:Math.round(S.g*(1-T)),b:Math.round(S.b*(1-T))}),ke=(S,T)=>{let me={r:Math.round(S.r*(1-T)+m*T),g:Math.round(S.g*(1-T)+g*T),b:Math.round(S.b*(1-T)+y*T)};return dt(me,j)>=4.5?me:S},$=ee(s,_<.5?.08:.14),te=s,he=ee(s,_<.5?.14:.22),x=s,R=ke(he,_<.5?.12:.08),z=_<.5?.22:.18;if(e.style.setProperty("--intelliweave-persona-bg-muted",`rgba(${l}, ${u}, ${c}, 0.65)`),e.style.setProperty("--intelliweave-assistant-bubble-bg",`linear-gradient(135deg, rgba(${$.r}, ${$.g}, ${$.b}, 0.98), rgba(${te.r}, ${te.g}, ${te.b}, 0.94))`),e.style.setProperty("--intelliweave-assistant-bubble-border",`rgba(${j.r}, ${j.g}, ${j.b}, ${z})`),e.style.setProperty("--intelliweave-user-bubble-bg",`linear-gradient(135deg, rgba(${R.r}, ${R.g}, ${R.b}, 0.98), rgba(${x.r}, ${x.g}, ${x.b}, 0.94))`),e.style.setProperty("--intelliweave-user-bubble-border",`rgba(${j.r}, ${j.g}, ${j.b}, ${z+.18})`),!r){e.style.removeProperty("--intelliweave-suggestion-button-bg"),e.style.removeProperty("--intelliweave-suggestion-button-hover-bg"),e.style.removeProperty("--intelliweave-suggestion-button-border"),e.style.removeProperty("--intelliweave-suggestion-button-hover-border"),e.style.removeProperty("--intelliweave-suggestion-button-text"),e.style.removeProperty("--intelliweave-interaction-bg"),e.style.removeProperty("--intelliweave-fullscreen-header-bg"),e.style.removeProperty("--intelliweave-fullscreen-input-section-bg"),e.style.removeProperty("--intelliweave-input-field-bg"),e.style.removeProperty("--intelliweave-poweredby-bg"),o?e.style.setProperty("--intelliweave-input-highlight-color",`rgb(${o.r}, ${o.g}, ${o.b})`):e.style.removeProperty("--intelliweave-input-highlight-color");return}e.style.setProperty("--intelliweave-fullscreen-header-bg",`linear-gradient(135deg, rgba(${pe.r}, ${pe.g}, ${pe.b}, 0.98), rgba(${xe.r}, ${xe.g}, ${xe.b}, 0.93) 54%, ${lt})`),e.style.setProperty("--intelliweave-suggestion-button-bg","var(--intelliweave-assistant-bubble-bg)"),e.style.setProperty("--intelliweave-suggestion-button-hover-bg","var(--intelliweave-assistant-bubble-bg)"),e.style.setProperty("--intelliweave-suggestion-button-border","var(--intelliweave-assistant-bubble-border)"),e.style.setProperty("--intelliweave-suggestion-button-hover-border","var(--intelliweave-assistant-bubble-border)"),o?e.style.setProperty("--intelliweave-suggestion-button-text",`rgb(${o.r}, ${o.g}, ${o.b})`):e.style.removeProperty("--intelliweave-suggestion-button-text"),e.style.setProperty("--intelliweave-fullscreen-input-section-bg",`linear-gradient(180deg, rgba(${B.r}, ${B.g}, ${B.b}, 0.76), rgba(${Me.r}, ${Me.g}, ${Me.b}, 0.84))`),e.style.setProperty("--intelliweave-input-field-bg",`linear-gradient(135deg, rgba(${N.r}, ${N.g}, ${N.b}, 0.46), rgba(${N.r}, ${N.g}, ${N.b}, 0.25))`),e.style.setProperty("--intelliweave-poweredby-bg",`linear-gradient(180deg, rgba(${Math.round(l*.34)}, ${Math.round(u*.34)}, ${Math.round(c*.34)}, 0.94), rgba(${Math.round(l*.22)}, ${Math.round(u*.22)}, ${Math.round(c*.22)}, 0.98))`),o?e.style.setProperty("--intelliweave-input-highlight-color",`rgb(${o.r}, ${o.g}, ${o.b})`):e.style.setProperty("--intelliweave-input-highlight-color",`rgb(${N.r}, ${N.g}, ${N.b})`),e.style.setProperty("--intelliweave-interaction-bg","var(--intelliweave-fullscreen-input-section-bg)")}parseColorToRGB(e){if(!e)return null;let t=e.trim();if(t.startsWith("#")){let i=t.slice(1);if(i.length===3){let o=parseInt(i[0]+i[0],16),r=parseInt(i[1]+i[1],16),s=parseInt(i[2]+i[2],16);return{r:o,g:r,b:s}}if(i.length===6){let o=parseInt(i.slice(0,2),16),r=parseInt(i.slice(2,4),16),s=parseInt(i.slice(4,6),16);return{r:o,g:r,b:s}}return null}if(t.startsWith("rgb")){let i=t.match(/rgba?\s*\(\s*([0-9.]+)\s*,\s*([0-9.]+)\s*,\s*([0-9.]+)/i);return i?{r:Math.max(0,Math.min(255,Math.round(Number(i[1])))),g:Math.max(0,Math.min(255,Math.round(Number(i[2])))),b:Math.max(0,Math.min(255,Math.round(Number(i[3]))))}:null}if(typeof document<"u"){let i=document.createElement("span");if(i.style.color=t,!i.style.color)return null;document.body?.appendChild(i);let o=getComputedStyle(i).color;i.remove();let r=o.match(/rgba?\s*\(\s*([0-9.]+)\s*,\s*([0-9.]+)\s*,\s*([0-9.]+)/i);return r?{r:Math.max(0,Math.min(255,Math.round(Number(r[1])))),g:Math.max(0,Math.min(255,Math.round(Number(r[2])))),b:Math.max(0,Math.min(255,Math.round(Number(r[3]))))}:null}return null}computeKickerColor(e){let t=this.parseColorToRGB(e);if(!t)return null;let i=t.r/255,o=t.g/255,r=t.b/255,s=Math.max(i,o,r),l=Math.min(i,o,r),u=(s+l)/2,c=0,d=0;if(s!==l){let v=s-l;switch(d=u>.5?v/(2-s-l):v/(s+l),s){case i:c=((o-r)/v+(o<r?6:0))/6;break;case o:c=((r-i)/v+2)/6;break;case r:c=((i-o)/v+4)/6;break}}let h=(c+1/3)%1,p=Math.min(1,Math.max(.5,d+.3)),m=u<.5?Math.min(.85,u+.45):Math.max(.55,u-.1),g=(v,W,M)=>(M<0&&(M+=1),M>1&&(M-=1),M<1/6?v+(W-v)*6*M:M<1/2?W:M<2/3?v+(W-v)*(2/3-M)*6:v),y=m<.5?m*(1+p):m+p-m*p,w=2*m-y,k=Math.round(g(w,y,h+1/3)*255),J=Math.round(g(w,y,h)*255),Z=Math.round(g(w,y,h-1/3)*255);return`rgb(${k}, ${J}, ${Z})`}adjustLogoPadding(e){let t=new Image;t.onload=()=>{let l=t.naturalWidth/t.naturalHeight,u=l>1?96/l:96,c=l<=1?10:0,h=(96+u)/2-48,p=Math.max(h+15+c,40+c);this.style.setProperty("--logo-top-margin",`${Math.round(c)}px`);let m=this.child("web-weaver-embed-inner");m&&m.style.setProperty("--logo-bottom-padding",`${Math.round(p)}px`)},t.src=e}applyConfigStylesAndAttributes(){let e=this.config,t=this.child("root");if(!t)return;let i=!1,r=this.attr.logo||e.logo||We;if(r&&r!==this._lastLogo){this._lastLogo=r,i=!0;let x=this.child("web-weaver-logo");x&&(x.setAttribute("logo",r),this.adjustLogoPadding(r));let R=this.root?.getElementById("dock-logo"),z=this.root?.getElementById("collapsed-logo");R&&(R.src=r),z&&(z.src=r)}let s=this.root?.getElementById("fullscreen-logo"),l=this.root?.getElementById("fullscreen-name"),u=e.name||"IntelliWeave";u!==this._lastPersonaName&&(this._lastPersonaName=u,l&&(l.textContent=u),i=!0),r!==this._lastHeaderLogo&&(this._lastHeaderLogo=r||"",s&&(r?(s.src=r,s.style.display=""):s.style.display="none"),i=!0);let c=this.root?.getElementById("fullscreen-header"),d=(this.attr.header||"").toLowerCase();if(c){let x=d==="hidden"||d==="none"||d==="false";c.style.display=!x&&(r||u)?"":"none"}let p=this.attr.background||e.background,g=this.attr.textColor||e.textColor,w=this.attr.brandNameColor||e.brandNameColor;p!==this._lastBackground&&(this._lastBackground=p,i=!0,p?(t.style.background=p,t.style.setProperty("--intelliweave-persona-bg",p),t.style.setProperty("--intelliweave-panel-bg",p),this.applyPersonaColorVariants(t,p,g)):(t.style.background="",t.style.removeProperty("--intelliweave-persona-bg"),t.style.removeProperty("--intelliweave-panel-bg"),this.applyPersonaColorVariants(t,void 0,g)));let k=this.attr.brandName,J=e.managedBy?.toLowerCase()==="chatterly"?"Chatterly":"IntelliWeave",Z=k||e.brandName||J;if(Z!==this._lastBrandName){this._lastBrandName=Z,i=!0;let x=this.root?.getElementById("brand-name");x&&(x.textContent=Z)}let v=w||(p?this.computeKickerColor(p):void 0);v!==this._lastBrandNameColor&&(this._lastBrandNameColor=v,i=!0,v?t.style.setProperty("--intelliweave-kicker-color",v):t.style.removeProperty("--intelliweave-kicker-color"));let W=this.child("interaction-bar");if(W){let x;e.managedBy?.toLowerCase()==="chatterly"?x=`linear-gradient(135deg, ${p||"#425570"}, 55%, #f3f1ee)`:p?x=`linear-gradient(135deg, ${p}, 55%, #f3f1ee)`:x="linear-gradient(135deg, #0b7aa1, 55%, #a34b0d)",W.style.setProperty("--iw-send-btn-gradient",x)}let M=this.child("interaction-bar");g!==this._lastTextColor&&(this._lastTextColor=g,i=!0,this.applyPersonaColorVariants(t,p,g),g?(t.style.color=g,t.style.setProperty("--intelliweave-user-bubble-text",g),t.style.setProperty("--intelliweave-assistant-bubble-text",g),t.style.setProperty("--intelliweave-fullscreen-input-text-color",g),M&&M.setAttribute("textColor",g)):(t.style.color="",t.style.removeProperty("--intelliweave-user-bubble-text"),t.style.removeProperty("--intelliweave-assistant-bubble-text"),t.style.removeProperty("--intelliweave-fullscreen-input-text-color"),M&&M.removeAttribute("textColor")));let pe={Inter:"Inter:wght@300;400;500;600;700",Roboto:"Roboto:wght@300;400;500;700","Open Sans":"Open+Sans:wght@300;400;500;600;700",Poppins:"Poppins:wght@300;400;500;600;700",Lato:"Lato:wght@300;400;700","DM Sans":"DM+Sans:wght@300;400;500;600;700",Nunito:"Nunito:wght@300;400;500;600;700","Plus Jakarta Sans":"Plus+Jakarta+Sans:wght@300;400;500;600;700",Montserrat:"Montserrat:wght@300;400;500;600;700"},G=this.attr.fontFamily||e.fontFamily;if(G!==this._lastFontFamily){this._lastFontFamily=G,i=!0,G?t.style.setProperty("--intelliweave-font-family",G):t.style.removeProperty("--intelliweave-font-family");let x=this.root?.getElementById("google-font-link");if(x){let R=(G||"Karla").replace(/['"]/g,"").split(",")[0].trim(),z=pe[R];z?x.href=`https://fonts.googleapis.com/css2?family=${z}&display=swap`:(!G||R==="Karla")&&(x.href="https://fonts.googleapis.com/css2?family=Karla:ital,wght@0,200..800;1,200..800&display=swap")}}let B=this.attr.displayMode||e.displayMode||"closed";B!==this._lastDisplayMode&&(this._lastDisplayMode=B,i=!0,B==="open"&&!this.attr.open&&(this.attr.open=!0));let N=this.attr.layout||e.layout||"widget";N!==this._lastLayout&&(this._lastLayout=N,i=!0);let _=this.attr.positioningMode||e.positioningMode||"fixed";_!==this._lastPositioningMode&&(this._lastPositioningMode=_,i=!0);let q=this.attr.positionX||e.positionX||"right";q!==this._lastPositionX&&(this._lastPositionX=q,i=!0);let ee=this.attr.positionY||e.positionY||"bottom";ee!==this._lastPositionY&&(this._lastPositionY=ee,i=!0);let ke=this.attr.offsetX?parseInt(this.attr.offsetX):void 0,$=ke!==void 0?ke:e.offsetX!==void 0?e.offsetX:20;$!==this._lastOffsetX&&(this._lastOffsetX=$,i=!0);let te=this.attr.offsetY?parseInt(this.attr.offsetY):void 0,he=te!==void 0?te:e.offsetY!==void 0?e.offsetY:20;he!==this._lastOffsetY&&(this._lastOffsetY=he,i=!0),i&&E.debug("[WebWeaverEmbed] Applied UI Styling:",{finalLogo:r,finalBackground:t.style.background,finalTextColor:t.style.color,finalDisplayMode:B,finalLayout:N,finalPositioningMode:_,finalPositionX:q,finalPositionY:ee,finalOffsetX:$,finalOffsetY:he})}onUpdate(){this.applyConfigStylesAndAttributes();let e=this.child("root"),t=this._lastLayout||"widget",i=this._lastPositioningMode||"fixed",o=this._lastPositionX||"right",r=this._lastPositionY||"bottom",s=this._lastOffsetX!==void 0?this._lastOffsetX:20,l=this._lastOffsetY!==void 0?this._lastOffsetY:20,c=(this._lastDisplayMode||"closed")==="open"||t==="fullscreen"||i==="container",d=t==="fullscreen"||i==="container";c&&!this.attr.open&&(this.attr.open=!0);let h=!!this.attr.open,p=!!this.attr.collapsed&&!h&&!c,m=h&&(d||!!this.state.panelFullscreen);if(this.child("web-weaver-embed-inner").style.display=h?"":"none",this.child("interaction-bar").style.display=h?"":"none",this.child("fullscreen-header").style.display=h?"":"none",this.child("llm-selector-panel").attr.open=this.state.llmPanelOpen,this.child("pulseanim").style.display="none",this.child("poweredby").style.display=h&&!this.shouldHidePoweredBy()?"flex":"none",this.child("interaction-bar").attr.layout=m?"fullscreen":"widget",this.child("panel-close").style.display=c?"none":"",this.child("panel-fullscreen").style.display=d?"none":"",h&&m!==this._previousFullscreenState&&this.refreshContentScrollability(),this._previousFullscreenState=m,h&&!this._previousOpenState)this._uiSessionStartTime=Date.now(),C(this.ai,{event_type:"ui_open",event_properties:{trigger:"button_click"}});else if(!h&&this._previousOpenState){let y=this._uiSessionStartTime?Date.now()-this._uiSessionStartTime:0;C(this.ai,{event_type:"ui_close",event_properties:{trigger:"button_click",session_duration_ms:y}})}this._previousOpenState=h,e.classList.toggle("open",h),e.classList.toggle("is-collapsed",p),e.classList.toggle("layout-fullscreen",m),e.classList.toggle("position-left",o==="left"),e.classList.toggle("position-top",r==="top");let g=(this.attr.header||"").toLowerCase();if(e.classList.toggle("header-hidden",g==="hidden"||g==="none"||g==="false"),i==="container"?(e.classList.add("container-mode"),this.attr.open||(this.attr.open=!0)):e.classList.remove("container-mode"),i!=="container"&&(e.style.left="",e.style.right="",e.style.top="",e.style.bottom="",!m)){let y=p?l+56:l;p?o==="left"?e.style.left="0px":e.style.right="0px":o==="left"?e.style.left=s+"px":e.style.right=s+"px",r==="top"?e.style.top=y+"px":e.style.bottom=y+"px"}this.child("interaction-bar").attr.loading=this.state.loading,this.child("interaction-bar").attr.llmName=this.ai.currentModel?.metadata?.name||this.ai.currentModel?.id||"None",this.child("interaction-bar").attr.llmButtonVisible=this.ai.models.length>1,this.child("llm-selector-panel").state.items=this.ai.models.sort((y,w)=>(w.priority||0)-(y.priority||0)),this.child("llm-selector-panel").state.selectedID=this.ai.currentModel?.id}isTruthyFeatureFlag(e){return e===!0||typeof e=="string"&&["true","1","yes"].includes(e.toLowerCase())}shouldHidePoweredBy(){return this.isTruthyFeatureFlag(this.config.hidePoweredBy)?!0:this.isTruthyFeatureFlag(this.attr.hidePoweredBy)}onDestroy(){b().embed==this&&(b().embed=void 0)}onContainerClick(e){if(this._suppressNextContainerClick){this._suppressNextContainerClick=!1,e.preventDefault(),e.stopPropagation();return}let t=this._lastDisplayMode||"closed";(this._lastLayout||"widget")!=="fullscreen"&&t!=="open"&&(this.attr.open||(e.preventDefault(),this.attr.collapsed="",this.attr.open=!0))}onDockOpenClick(e){e.preventDefault(),e.stopPropagation(),this.openFromDock()}onDockCollapseClick(e){e.preventDefault(),e.stopPropagation(),this.collapseDock()}onCollapsedOpenClick(e){e.preventDefault(),e.stopPropagation(),this.showDockFromCollapsed()}onPanelCollapseClick(e){e.preventDefault(),e.stopPropagation(),this.collapseDock()}onPanelFullscreenClick(e){e.preventDefault(),e.stopPropagation();let t=this._lastLayout||"widget",i=this._lastPositioningMode||"fixed";t==="fullscreen"||i==="container"||(this.state.panelFullscreen=!this.state.panelFullscreen)}onPanelCloseClick(e){e.preventDefault(),e.stopPropagation(),this.closePanel()}isForcedOpen(){let e=this._lastDisplayMode||"closed",t=this._lastLayout||"widget",i=this._lastPositioningMode||"fixed";return e==="open"||t==="fullscreen"||i==="container"}openFromDock(){this._returnToCollapsedOnSwipeClose=!1,this.attr.collapsed="",this.attr.open=!0}refreshContentScrollability(){let e=this.child("web-weaver-embed-inner");if(!e||typeof window>"u")return;let t=e.scrollTop;e.style.setProperty("-webkit-overflow-scrolling","auto"),e.style.overflowY="hidden",window.requestAnimationFrame(()=>{e.style.overflowY="auto",e.style.setProperty("-webkit-overflow-scrolling","touch"),e.scrollTop=Math.min(t,Math.max(0,e.scrollHeight-e.clientHeight))})}showDockFromCollapsed(){this._returnToCollapsedOnSwipeClose=!0,this.state.panelFullscreen=!1,this.attr.collapsed=""}openFromCollapsed(){this._returnToCollapsedOnSwipeClose=!0,this.state.panelFullscreen=!1,this.attr.collapsed="",this.attr.open=!0}closePanel(){if(this.isForcedOpen())return;let e=this._returnToCollapsedOnSwipeClose;this._returnToCollapsedOnSwipeClose=!1,this.state.panelFullscreen=!1,this.attr.open="",e&&(this.attr.collapsed=!0)}collapseDock(){this.isForcedOpen()||(this._returnToCollapsedOnSwipeClose=!1,this.state.panelFullscreen=!1,this.attr.open="",this.attr.collapsed=!0)}onSwipePointerDown(e){if(typeof window>"u"||window.innerWidth>768||e.pointerType==="mouse"&&e.button!==0)return;let t=e.currentTarget,i=e.target;if(!(!(t?.id==="collapsed-tab"||t?.id==="dock-main")&&i?.closest?.('input, textarea, select, [contenteditable="true"], button'))){this._swipeStart={x:e.clientX,y:e.clientY};try{t?.setPointerCapture?.(e.pointerId)}catch{}}}onSwipePointerCancel(){this._swipeStart=void 0}inwardSwipeDirection(){return(this._lastPositionX||"right")==="left"?"right":"left"}outwardSwipeDirection(){return this.inwardSwipeDirection()==="left"?"right":"left"}didSwipe(e,t){let i=this._swipeStart;if(this._swipeStart=void 0,!i||typeof window>"u"||window.innerWidth>768)return!1;let o=e.clientX-i.x,r=e.clientY-i.y;if(Math.abs(o)<48||Math.abs(r)>72||Math.abs(o)<Math.abs(r)*1.2||t==="left"&&o>=0||t==="right"&&o<=0)return!1;e.preventDefault();try{e.currentTarget.releasePointerCapture?.(e.pointerId)}catch{}return!0}onCollapsedSwipePointerUp(e){this.didSwipe(e,this.inwardSwipeDirection())&&this.openFromCollapsed()}onDockSwipePointerUp(e){this.didSwipe(e,this.inwardSwipeDirection())&&this.openFromDock()}onPanelSwipePointerUp(e){this.attr.open&&this.didSwipe(e,this.outwardSwipeDirection())&&(this._suppressNextContainerClick=!0,this.closePanel())}onLogoClick(e){if(e.preventDefault(),e.stopPropagation(),this.attr.focusID)this.attr.focusID="";else{let t=this._lastDisplayMode||"closed";if((this._lastLayout||"widget")==="fullscreen"||t==="open")return;this.attr.open?this.closePanel():this.openFromDock()}}open(){this.attr.collapsed="",this.attr.open=!0}close(){this.closePanel()}resetConversation(){let e=this.child("web-weaver-embed-inner");for(this.state.llmPanelOpen=!1;e.children.length>0;)e.children[0].remove();this.ai.resetConversation(),this.suggestions=[],this._handledEmbeddedActionBlocks.clear();let t=document.createElement("div");t.className="introduction-message",t.innerHTML=b().introductionMessage||`Welcome to <b>${document.title||"Web Weaver"}</b>. How can I help you?`,e.appendChild(t),this.ai.insertAssistantMessage(t.innerText);for(let i of b().introductionSuggestions||[]){let o=document.createElement("div");o.className="suggestion-button",o.innerText=i,o.addEventListener("click",r=>this.onSuggestionClick(r,i)),e.appendChild(o)}}async processInput(e){if(this._isProcessing)return;this._isProcessing=!0,this.state.loading=!0,this.state.llmPanelOpen=!1;let t=this.child("web-weaver-embed-inner");this.suggestions=[];try{for(let s of Array.from(t.querySelectorAll(".suggestion-button")))s.remove();this.attr.focusID="";let i=document.createElement("div");i.className="input",i.innerText=e,t.appendChild(i);let o=this.currentOutputElement;this.currentOutputElement=document.createElement("div"),this.currentOutputElement.className="output-container",t.appendChild(this.currentOutputElement);let r=Math.ceil(t.clientHeight-300);r<0&&(r=0),r>600&&(r=600),o&&(o.style.minHeight=""),this.currentOutputElement.style.minHeight=r+"px",this.currentOutputElement.offsetHeight,this.currentOutputElement.scrollIntoView({behavior:"smooth",block:"start"}),await this.ai.sendMessage(e);for(let s of this.suggestions){let l=document.createElement("div");l.className="suggestion-button",l.innerText=s,l.addEventListener("click",u=>this.onSuggestionClick(u,s)),this.currentOutputElement.appendChild(l)}}catch(i){E.error("Failed to process input:",i);let o=document.createElement("div");o.className="output",o.innerText="Sorry, there was a problem getting a response. "+i.message,t.appendChild(o);let r=document.createElement("div");r.className="suggestion-button",r.innerText="Reset conversation",r.addEventListener("click",s=>this.resetConversation()),t.appendChild(r)}this.state.loading=!1,this._isProcessing=!1}async onAIMessage(e,t){let i=[];for(let o of e)for(let r=0;r<(o.sections?.length||0);r++){let s=o.sections[r],l=`msgelem-${o.id||""}_${r}_${s.type||"unknown"}`;if(l=l.replace(/[^a-zA-Z0-9-_]/g,"_"),s.type=="thinking"){if(!s.text)continue;let u=s.text||"";u.includes(`
1654
+ Continue writing normal visible text outside the block.`,isContext:!0,disabled:!this.ai.flags.allowEmojiActions}),this.resetConversation(),this.maybeRunAutoStartPrompt()}).catch(o=>{E.error("Failed to load AI configuration:",o),this.state.loading=!1;let r=this.child("web-weaver-embed-inner");if(r){let s=o?.message||o?.toString()||"Unknown error";r.innerHTML=`<div class="output" style="padding: 20px;"><span style="display: inline-block; background-color: #fee; color: #c00; padding: 8px 12px; border-radius: 6px; border: 1px solid #fcc;">${s}</span></div>`}})}applyPersonaColorVariants(e,t,n){let o=this.parseColorToRGB(n),r=this.parseColorToRGB(t);if(!r&&!o){e.style.removeProperty("--intelliweave-persona-bg-muted"),e.style.removeProperty("--intelliweave-assistant-bubble-bg"),e.style.removeProperty("--intelliweave-assistant-bubble-border"),e.style.removeProperty("--intelliweave-user-bubble-bg"),e.style.removeProperty("--intelliweave-user-bubble-border"),e.style.removeProperty("--intelliweave-suggestion-button-bg"),e.style.removeProperty("--intelliweave-suggestion-button-hover-bg"),e.style.removeProperty("--intelliweave-suggestion-button-border"),e.style.removeProperty("--intelliweave-suggestion-button-hover-border"),e.style.removeProperty("--intelliweave-suggestion-button-text"),e.style.removeProperty("--intelliweave-interaction-bg"),e.style.removeProperty("--intelliweave-fullscreen-header-bg"),e.style.removeProperty("--intelliweave-fullscreen-input-section-bg"),e.style.removeProperty("--intelliweave-input-field-bg"),e.style.removeProperty("--intelliweave-input-highlight-color"),e.style.removeProperty("--intelliweave-poweredby-bg");return}let s=r||{r:32,g:38,b:44},{r:l,g:u,b:c}=s,d=o?(.2126*o.r+.7152*o.g+.0722*o.b)/255:1,h=d<.45,p=0,m=o?.r??l,f=o?.g??u,y=o?.b??c,w=h?0:255,k=.46,K=.24,G=.1,v=.22,D=.32,M=h?.07:.1,he={r:Math.round(l+(p-l)*k),g:Math.round(u+(p-u)*k),b:Math.round(c+(p-c)*k)},Ie={r:Math.round((l+(p-l)*K)*.86+m*.14),g:Math.round((u+(p-u)*K)*.86+f*.14),b:Math.round((c+(p-c)*K)*.86+y*.14)},P={r:Math.round((l+(p-l)*G)*.78+m*.22),g:Math.round((u+(p-u)*G)*.78+f*.22),b:Math.round((c+(p-c)*G)*.78+y*.22)},ut=`rgba(${P.r}, ${P.g}, ${P.b}, 0.84)`,X={r:Math.round(l+(p-l)*v),g:Math.round(u+(p-u)*v),b:Math.round(c+(p-c)*v)},ke={r:Math.round(l+(p-l)*D),g:Math.round(u+(p-u)*D),b:Math.round(c+(p-c)*D)},A={r:Math.round(l+(w-l)*M),g:Math.round(u+(w-u)*M),b:Math.round(c+(w-c)*M)},B=o||{r:230,g:241,b:245},j=o?d:.9,Se=S=>{let T=S/255;return T<=.03928?T/12.92:Math.pow((T+.055)/1.055,2.4)},H=S=>.2126*Se(S.r)+.7152*Se(S.g)+.0722*Se(S.b),pt=(S,T)=>{let ge=H(S),ht=H(T),Vt=Math.max(ge,ht),Yt=Math.min(ge,ht);return(Vt+.05)/(Yt+.05)},Q=(S,T)=>({r:Math.round(S.r*(1-T)),g:Math.round(S.g*(1-T)),b:Math.round(S.b*(1-T))}),Te=(S,T)=>{let ge={r:Math.round(S.r*(1-T)+m*T),g:Math.round(S.g*(1-T)+f*T),b:Math.round(S.b*(1-T)+y*T)};return pt(ge,B)>=4.5?ge:S},J=Q(s,j<.5?.08:.14),q=s,me=Q(s,j<.5?.14:.22),x=s,Z=Te(me,j<.5?.12:.08),_=j<.5?.22:.18;if(e.style.setProperty("--intelliweave-persona-bg-muted",`rgba(${l}, ${u}, ${c}, 0.65)`),e.style.setProperty("--intelliweave-assistant-bubble-bg",`linear-gradient(135deg, rgba(${J.r}, ${J.g}, ${J.b}, 0.98), rgba(${q.r}, ${q.g}, ${q.b}, 0.94))`),e.style.setProperty("--intelliweave-assistant-bubble-border",`rgba(${B.r}, ${B.g}, ${B.b}, ${_})`),e.style.setProperty("--intelliweave-user-bubble-bg",`linear-gradient(135deg, rgba(${Z.r}, ${Z.g}, ${Z.b}, 0.98), rgba(${x.r}, ${x.g}, ${x.b}, 0.94))`),e.style.setProperty("--intelliweave-user-bubble-border",`rgba(${B.r}, ${B.g}, ${B.b}, ${_+.18})`),!r){e.style.removeProperty("--intelliweave-suggestion-button-bg"),e.style.removeProperty("--intelliweave-suggestion-button-hover-bg"),e.style.removeProperty("--intelliweave-suggestion-button-border"),e.style.removeProperty("--intelliweave-suggestion-button-hover-border"),e.style.removeProperty("--intelliweave-suggestion-button-text"),e.style.removeProperty("--intelliweave-interaction-bg"),e.style.removeProperty("--intelliweave-fullscreen-header-bg"),e.style.removeProperty("--intelliweave-fullscreen-input-section-bg"),e.style.removeProperty("--intelliweave-input-field-bg"),e.style.removeProperty("--intelliweave-poweredby-bg"),o?e.style.setProperty("--intelliweave-input-highlight-color",`rgb(${o.r}, ${o.g}, ${o.b})`):e.style.removeProperty("--intelliweave-input-highlight-color");return}e.style.setProperty("--intelliweave-fullscreen-header-bg",`linear-gradient(135deg, rgba(${he.r}, ${he.g}, ${he.b}, 0.98), rgba(${Ie.r}, ${Ie.g}, ${Ie.b}, 0.93) 54%, ${ut})`),e.style.setProperty("--intelliweave-suggestion-button-bg","var(--intelliweave-assistant-bubble-bg)"),e.style.setProperty("--intelliweave-suggestion-button-hover-bg","var(--intelliweave-assistant-bubble-bg)"),e.style.setProperty("--intelliweave-suggestion-button-border","var(--intelliweave-assistant-bubble-border)"),e.style.setProperty("--intelliweave-suggestion-button-hover-border","var(--intelliweave-assistant-bubble-border)"),o?e.style.setProperty("--intelliweave-suggestion-button-text",`rgb(${o.r}, ${o.g}, ${o.b})`):e.style.removeProperty("--intelliweave-suggestion-button-text"),e.style.setProperty("--intelliweave-fullscreen-input-section-bg",`linear-gradient(180deg, rgba(${X.r}, ${X.g}, ${X.b}, 0.76), rgba(${ke.r}, ${ke.g}, ${ke.b}, 0.84))`),e.style.setProperty("--intelliweave-input-field-bg",`linear-gradient(135deg, rgba(${A.r}, ${A.g}, ${A.b}, 0.46), rgba(${A.r}, ${A.g}, ${A.b}, 0.25))`),e.style.setProperty("--intelliweave-poweredby-bg",`linear-gradient(180deg, rgba(${Math.round(l*.34)}, ${Math.round(u*.34)}, ${Math.round(c*.34)}, 0.94), rgba(${Math.round(l*.22)}, ${Math.round(u*.22)}, ${Math.round(c*.22)}, 0.98))`),o?e.style.setProperty("--intelliweave-input-highlight-color",`rgb(${o.r}, ${o.g}, ${o.b})`):e.style.setProperty("--intelliweave-input-highlight-color",`rgb(${A.r}, ${A.g}, ${A.b})`),e.style.setProperty("--intelliweave-interaction-bg","var(--intelliweave-fullscreen-input-section-bg)")}parseColorToRGB(e){if(!e)return null;let t=e.trim();if(t.startsWith("#")){let n=t.slice(1);if(n.length===3){let o=parseInt(n[0]+n[0],16),r=parseInt(n[1]+n[1],16),s=parseInt(n[2]+n[2],16);return{r:o,g:r,b:s}}if(n.length===6){let o=parseInt(n.slice(0,2),16),r=parseInt(n.slice(2,4),16),s=parseInt(n.slice(4,6),16);return{r:o,g:r,b:s}}return null}if(t.startsWith("rgb")){let n=t.match(/rgba?\s*\(\s*([0-9.]+)\s*,\s*([0-9.]+)\s*,\s*([0-9.]+)/i);return n?{r:Math.max(0,Math.min(255,Math.round(Number(n[1])))),g:Math.max(0,Math.min(255,Math.round(Number(n[2])))),b:Math.max(0,Math.min(255,Math.round(Number(n[3]))))}:null}if(typeof document<"u"){let n=document.createElement("span");if(n.style.color=t,!n.style.color)return null;document.body?.appendChild(n);let o=getComputedStyle(n).color;n.remove();let r=o.match(/rgba?\s*\(\s*([0-9.]+)\s*,\s*([0-9.]+)\s*,\s*([0-9.]+)/i);return r?{r:Math.max(0,Math.min(255,Math.round(Number(r[1])))),g:Math.max(0,Math.min(255,Math.round(Number(r[2])))),b:Math.max(0,Math.min(255,Math.round(Number(r[3]))))}:null}return null}computeKickerColor(e){let t=this.parseColorToRGB(e);if(!t)return null;let n=t.r/255,o=t.g/255,r=t.b/255,s=Math.max(n,o,r),l=Math.min(n,o,r),u=(s+l)/2,c=0,d=0;if(s!==l){let v=s-l;switch(d=u>.5?v/(2-s-l):v/(s+l),s){case n:c=((o-r)/v+(o<r?6:0))/6;break;case o:c=((r-n)/v+2)/6;break;case r:c=((n-o)/v+4)/6;break}}let h=(c+1/3)%1,p=Math.min(1,Math.max(.5,d+.3)),m=u<.5?Math.min(.85,u+.45):Math.max(.55,u-.1),f=(v,D,M)=>(M<0&&(M+=1),M>1&&(M-=1),M<1/6?v+(D-v)*6*M:M<1/2?D:M<2/3?v+(D-v)*(2/3-M)*6:v),y=m<.5?m*(1+p):m+p-m*p,w=2*m-y,k=Math.round(f(w,y,h+1/3)*255),K=Math.round(f(w,y,h)*255),G=Math.round(f(w,y,h-1/3)*255);return`rgb(${k}, ${K}, ${G})`}adjustLogoPadding(e){let t=new Image;t.onload=()=>{let l=t.naturalWidth/t.naturalHeight,u=l>1?96/l:96,c=l<=1?10:0,h=(96+u)/2-48,p=Math.max(h+15+c,40+c);this.style.setProperty("--logo-top-margin",`${Math.round(c)}px`);let m=this.child("web-weaver-embed-inner");m&&m.style.setProperty("--logo-bottom-padding",`${Math.round(p)}px`)},t.src=e}applyConfigStylesAndAttributes(){let e=this.config,t=this.child("root");if(!t)return;let n=!1,r=this.attr.logo||e.logo||Ge;if(r&&r!==this._lastLogo){this._lastLogo=r,n=!0;let x=this.child("web-weaver-logo");x&&(x.setAttribute("logo",r),this.adjustLogoPadding(r));let Z=this.root?.getElementById("dock-logo"),_=this.root?.getElementById("collapsed-logo");Z&&(Z.src=r),_&&(_.src=r)}let s=this.root?.getElementById("fullscreen-logo"),l=this.root?.getElementById("fullscreen-name"),u=e.name||"IntelliWeave";u!==this._lastPersonaName&&(this._lastPersonaName=u,l&&(l.textContent=u),n=!0),r!==this._lastHeaderLogo&&(this._lastHeaderLogo=r||"",s&&(r?(s.src=r,s.style.display=""):s.style.display="none"),n=!0);let c=this.root?.getElementById("fullscreen-header"),d=(this.attr.header||"").toLowerCase();if(c){let x=d==="hidden"||d==="none"||d==="false";c.style.display=!x&&(r||u)?"":"none"}let p=this.attr.background||e.background,f=this.attr.textColor||e.textColor,w=this.attr.brandNameColor||e.brandNameColor;p!==this._lastBackground&&(this._lastBackground=p,n=!0,p?(t.style.background=p,t.style.setProperty("--intelliweave-persona-bg",p),t.style.setProperty("--intelliweave-panel-bg",p),this.applyPersonaColorVariants(t,p,f)):(t.style.background="",t.style.removeProperty("--intelliweave-persona-bg"),t.style.removeProperty("--intelliweave-panel-bg"),this.applyPersonaColorVariants(t,void 0,f)));let k=this.attr.brandName,K=e.managedBy?.toLowerCase()==="chatterly"?"Chatterly":"IntelliWeave",G=k||e.brandName||K;if(G!==this._lastBrandName){this._lastBrandName=G,n=!0;let x=this.root?.getElementById("brand-name");x&&(x.textContent=G)}let v=w||(p?this.computeKickerColor(p):void 0);v!==this._lastBrandNameColor&&(this._lastBrandNameColor=v,n=!0,v?t.style.setProperty("--intelliweave-kicker-color",v):t.style.removeProperty("--intelliweave-kicker-color"));let D=this.child("interaction-bar");if(D){let x;e.managedBy?.toLowerCase()==="chatterly"?x=`linear-gradient(135deg, ${p||"#425570"}, 55%, #f3f1ee)`:p?x=`linear-gradient(135deg, ${p}, 55%, #f3f1ee)`:x="linear-gradient(135deg, #0b7aa1, 55%, #a34b0d)",D.style.setProperty("--iw-send-btn-gradient",x)}let M=this.child("interaction-bar");f!==this._lastTextColor&&(this._lastTextColor=f,n=!0,this.applyPersonaColorVariants(t,p,f),f?(t.style.color=f,t.style.setProperty("--intelliweave-user-bubble-text",f),t.style.setProperty("--intelliweave-assistant-bubble-text",f),t.style.setProperty("--intelliweave-fullscreen-input-text-color",f),M&&M.setAttribute("textColor",f)):(t.style.color="",t.style.removeProperty("--intelliweave-user-bubble-text"),t.style.removeProperty("--intelliweave-assistant-bubble-text"),t.style.removeProperty("--intelliweave-fullscreen-input-text-color"),M&&M.removeAttribute("textColor")));let he={Inter:"Inter:wght@300;400;500;600;700",Roboto:"Roboto:wght@300;400;500;700","Open Sans":"Open+Sans:wght@300;400;500;600;700",Poppins:"Poppins:wght@300;400;500;600;700",Lato:"Lato:wght@300;400;700","DM Sans":"DM+Sans:wght@300;400;500;600;700",Nunito:"Nunito:wght@300;400;500;600;700","Plus Jakarta Sans":"Plus+Jakarta+Sans:wght@300;400;500;600;700",Montserrat:"Montserrat:wght@300;400;500;600;700"},P=this.attr.fontFamily||e.fontFamily;if(P!==this._lastFontFamily){this._lastFontFamily=P,n=!0,P?t.style.setProperty("--intelliweave-font-family",P):t.style.removeProperty("--intelliweave-font-family");let x=this.root?.getElementById("google-font-link");if(x){let Z=(P||"Karla").replace(/['"]/g,"").split(",")[0].trim(),_=he[Z];_?x.href=`https://fonts.googleapis.com/css2?family=${_}&display=swap`:(!P||Z==="Karla")&&(x.href="https://fonts.googleapis.com/css2?family=Karla:ital,wght@0,200..800;1,200..800&display=swap")}}let X=this.attr.displayMode||e.displayMode||"closed";X!==this._lastDisplayMode&&(this._lastDisplayMode=X,n=!0,X==="open"&&!this.attr.open&&(this.attr.open=!0));let A=this.attr.layout||e.layout||"widget";A!==this._lastLayout&&(this._lastLayout=A,n=!0);let j=this.attr.positioningMode||e.positioningMode||"fixed";j!==this._lastPositioningMode&&(this._lastPositioningMode=j,n=!0);let H=this.attr.positionX||e.positionX||"right";H!==this._lastPositionX&&(this._lastPositionX=H,n=!0,this.child("dock-collapse")?.querySelector("svg")?.style.setProperty("transform",`rotate(${H==="left"?180:0}deg)`));let Q=this.attr.positionY||e.positionY||"bottom";Q!==this._lastPositionY&&(this._lastPositionY=Q,n=!0);let Te=this.attr.offsetX?parseInt(this.attr.offsetX):void 0,J=Te!==void 0?Te:e.offsetX!==void 0?e.offsetX:20;J!==this._lastOffsetX&&(this._lastOffsetX=J,n=!0);let q=this.attr.offsetY?parseInt(this.attr.offsetY):void 0,me=q!==void 0?q:e.offsetY!==void 0?e.offsetY:20;me!==this._lastOffsetY&&(this._lastOffsetY=me,n=!0),n&&E.debug("[WebWeaverEmbed] Applied UI Styling:",{finalLogo:r,finalBackground:t.style.background,finalTextColor:t.style.color,finalDisplayMode:X,finalLayout:A,finalPositioningMode:j,finalPositionX:H,finalPositionY:Q,finalOffsetX:J,finalOffsetY:me})}onUpdate(){this.applyConfigStylesAndAttributes();let e=this.child("root"),t=this._lastLayout||"widget",n=this._lastPositioningMode||"fixed",o=this._lastPositionX||"right",r=this._lastPositionY||"bottom",s=this._lastOffsetX!==void 0?this._lastOffsetX:20,l=this._lastOffsetY!==void 0?this._lastOffsetY:20,c=(this._lastDisplayMode||"closed")==="open"||t==="fullscreen"||n==="container",d=t==="fullscreen"||n==="container";c&&!this.attr.open&&(this.attr.open=!0);let h=!!this.attr.open,p=!!this.attr.collapsed&&!h&&!c,m=h&&(d||!!this.state.panelFullscreen);if(this.child("web-weaver-embed-inner").style.display=h?"":"none",this.child("interaction-bar").style.display=h?"":"none",this.child("fullscreen-header").style.display=h?"":"none",this.child("llm-selector-panel").attr.open=this.state.llmPanelOpen,this.child("pulseanim").style.display="none",this.child("poweredby").style.display=h?"flex":"none",this.child("interaction-bar").attr.layout=m?"fullscreen":"widget",this.child("panel-close").style.display=c?"none":"",this.child("panel-fullscreen").style.display=d?"none":"",h&&m!==this._previousFullscreenState&&this.refreshContentScrollability(),this._previousFullscreenState=m,h&&!this._previousOpenState)this._uiSessionStartTime=Date.now(),C(this.ai,{event_type:"ui_open",event_properties:{trigger:"button_click"}}),this.maybeRunAutoStartPrompt();else if(!h&&this._previousOpenState){let y=this._uiSessionStartTime?Date.now()-this._uiSessionStartTime:0;C(this.ai,{event_type:"ui_close",event_properties:{trigger:"button_click",session_duration_ms:y}})}this._previousOpenState=h,e.classList.toggle("open",h),e.classList.toggle("is-collapsed",p),e.classList.toggle("layout-fullscreen",m),e.classList.toggle("position-left",o==="left"),e.classList.toggle("position-top",r==="top");let f=(this.attr.header||"").toLowerCase();if(e.classList.toggle("header-hidden",f==="hidden"||f==="none"||f==="false"),n==="container"?(e.classList.add("container-mode"),this.attr.open||(this.attr.open=!0)):e.classList.remove("container-mode"),n!=="container"&&(e.style.left="",e.style.right="",e.style.top="",e.style.bottom="",!m)){let y=p?l+56:l;p?o==="left"?e.style.left="0px":e.style.right="0px":o==="left"?e.style.left=s+"px":e.style.right=s+"px",r==="top"?e.style.top=y+"px":e.style.bottom=y+"px"}this.child("interaction-bar").attr.loading=this.state.loading,this.child("interaction-bar").attr.llmName=this.ai.currentModel?.metadata?.name||this.ai.currentModel?.id||"None",this.child("interaction-bar").attr.llmButtonVisible=this.ai.models.length>1,this.child("llm-selector-panel").state.items=this.ai.models.sort((y,w)=>(w.priority||0)-(y.priority||0)),this.child("llm-selector-panel").state.selectedID=this.ai.currentModel?.id}getAutoStartPrompt(){let e=this.attr.autoStartPrompt||b().autoStartPrompt||this.config.autoStartPrompt||"";return typeof e=="string"?e.trim():""}buildAutoStartPromptMessage(e){return["The visitor has just opened the chat window. Generate a brief, engaging opening response now.","Do not mention that this was triggered by an automatic or hidden prompt.","Follow this auto-start instruction from the persona creator:",e].join(`
1655
+
1656
+ `)}maybeRunAutoStartPrompt(){let e=this.getAutoStartPrompt();!e||!this.attr.open||!this.ai.loaded||this._autoStartPromptHasRun||this._isProcessing||this.ai.isProcessing||(this._autoStartPromptHasRun=!0,this.processInput(this.buildAutoStartPromptMessage(e),!0))}isTruthyFeatureFlag(e){return e===!0||typeof e=="string"&&["true","1","yes"].includes(e.toLowerCase())}shouldHidePoweredBy(){return this.isTruthyFeatureFlag(this.config.hidePoweredBy)?!0:this.isTruthyFeatureFlag(this.attr.hidePoweredBy)}onDestroy(){b().embed==this&&(b().embed=void 0)}onContainerClick(e){if(this._suppressNextContainerClick){this._suppressNextContainerClick=!1,e.preventDefault(),e.stopPropagation();return}let t=this._lastDisplayMode||"closed";(this._lastLayout||"widget")!=="fullscreen"&&t!=="open"&&(this.attr.open||(e.preventDefault(),this.attr.collapsed="",this.attr.open=!0))}onDockOpenClick(e){e.preventDefault(),e.stopPropagation(),this.openFromDock()}onDockCollapseClick(e){e.preventDefault(),e.stopPropagation(),this.collapseDock()}onCollapsedOpenClick(e){e.preventDefault(),e.stopPropagation(),this.showDockFromCollapsed()}onPanelCollapseClick(e){e.preventDefault(),e.stopPropagation(),this.collapseDock()}onPanelFullscreenClick(e){e.preventDefault(),e.stopPropagation();let t=this._lastLayout||"widget",n=this._lastPositioningMode||"fixed";t==="fullscreen"||n==="container"||(this.state.panelFullscreen=!this.state.panelFullscreen)}onPanelCloseClick(e){e.preventDefault(),e.stopPropagation(),this.closePanel()}isForcedOpen(){let e=this._lastDisplayMode||"closed",t=this._lastLayout||"widget",n=this._lastPositioningMode||"fixed";return e==="open"||t==="fullscreen"||n==="container"}openFromDock(){this._returnToCollapsedOnSwipeClose=!1,this.attr.collapsed="",this.attr.open=!0}refreshContentScrollability(){let e=this.child("web-weaver-embed-inner");if(!e||typeof window>"u")return;let t=e.scrollTop;e.style.setProperty("-webkit-overflow-scrolling","auto"),e.style.overflowY="hidden",window.requestAnimationFrame(()=>{e.style.overflowY="auto",e.style.setProperty("-webkit-overflow-scrolling","touch"),e.scrollTop=Math.min(t,Math.max(0,e.scrollHeight-e.clientHeight))})}showDockFromCollapsed(){this._returnToCollapsedOnSwipeClose=!0,this.state.panelFullscreen=!1,this.attr.collapsed=""}openFromCollapsed(){this._returnToCollapsedOnSwipeClose=!0,this.state.panelFullscreen=!1,this.attr.collapsed="",this.attr.open=!0}closePanel(){if(this.isForcedOpen())return;let e=this._returnToCollapsedOnSwipeClose;this._returnToCollapsedOnSwipeClose=!1,this.state.panelFullscreen=!1,this.attr.open="",e&&(this.attr.collapsed=!0)}collapseDock(){this.isForcedOpen()||(this._returnToCollapsedOnSwipeClose=!1,this.state.panelFullscreen=!1,this.attr.open="",this.attr.collapsed=!0)}onSwipePointerDown(e){if(typeof window>"u"||window.innerWidth>768||e.pointerType==="mouse"&&e.button!==0)return;let t=e.currentTarget,n=e.target;if(!(!(t?.id==="collapsed-tab"||t?.id==="dock-main")&&n?.closest?.('input, textarea, select, [contenteditable="true"], button'))){this._swipeStart={x:e.clientX,y:e.clientY};try{t?.setPointerCapture?.(e.pointerId)}catch{}}}onSwipePointerCancel(){this._swipeStart=void 0}inwardSwipeDirection(){return(this._lastPositionX||"right")==="left"?"right":"left"}outwardSwipeDirection(){return this.inwardSwipeDirection()==="left"?"right":"left"}didSwipe(e,t){let n=this._swipeStart;if(this._swipeStart=void 0,!n||typeof window>"u"||window.innerWidth>768)return!1;let o=e.clientX-n.x,r=e.clientY-n.y;if(Math.abs(o)<48||Math.abs(r)>72||Math.abs(o)<Math.abs(r)*1.2||t==="left"&&o>=0||t==="right"&&o<=0)return!1;e.preventDefault();try{e.currentTarget.releasePointerCapture?.(e.pointerId)}catch{}return!0}onCollapsedSwipePointerUp(e){this.didSwipe(e,this.inwardSwipeDirection())&&this.openFromCollapsed()}onDockSwipePointerUp(e){this.didSwipe(e,this.inwardSwipeDirection())&&this.openFromDock()}onPanelSwipePointerUp(e){this.attr.open&&this.didSwipe(e,this.outwardSwipeDirection())&&(this._suppressNextContainerClick=!0,this.closePanel())}onLogoClick(e){if(e.preventDefault(),e.stopPropagation(),this.attr.focusID)this.attr.focusID="";else{let t=this._lastDisplayMode||"closed";if((this._lastLayout||"widget")==="fullscreen"||t==="open")return;this.attr.open?this.closePanel():this.openFromDock()}}open(){this.attr.collapsed="",this.attr.open=!0}close(){this.closePanel()}resetConversation(){let e=this.child("web-weaver-embed-inner");for(this.state.llmPanelOpen=!1;e.children.length>0;)e.children[0].remove();this.ai.resetConversation(),this.suggestions=[],this._handledEmbeddedActionBlocks.clear(),this._autoStartPromptHasRun=!1;let t=document.createElement("div");t.className="introduction-message",t.innerHTML=b().introductionMessage||`Welcome to <b>${document.title||"Web Weaver"}</b>. How can I help you?`,e.appendChild(t),this.ai.insertAssistantMessage(t.innerText);for(let n of b().introductionSuggestions||[]){let o=document.createElement("div");o.className="suggestion-button",o.innerText=n,o.addEventListener("click",r=>this.onSuggestionClick(r,n)),e.appendChild(o)}queueMicrotask(()=>this.maybeRunAutoStartPrompt())}async processInput(e,t=!1){if(this._isProcessing)return;this._isProcessing=!0,this.state.loading=!0,this.state.llmPanelOpen=!1;let n=this.child("web-weaver-embed-inner");this.suggestions=[];try{for(let s of Array.from(n.querySelectorAll(".suggestion-button")))s.remove();if(this.attr.focusID="",!t){let s=document.createElement("div");s.className="input",s.innerText=e,n.appendChild(s)}let o=this.currentOutputElement;this.currentOutputElement=document.createElement("div"),this.currentOutputElement.className="output-container",n.appendChild(this.currentOutputElement);let r=Math.ceil(n.clientHeight-300);r<0&&(r=0),r>600&&(r=600),o&&(o.style.minHeight=""),this.currentOutputElement.style.minHeight=r+"px",this.currentOutputElement.offsetHeight,this.currentOutputElement.scrollIntoView({behavior:"smooth",block:"start"}),await this.ai.sendMessage(e);for(let s of this.suggestions){let l=document.createElement("div");l.className="suggestion-button",l.innerText=s,l.addEventListener("click",u=>this.onSuggestionClick(u,s)),this.currentOutputElement.appendChild(l)}}catch(o){E.error("Failed to process input:",o);let r=o?.message||o?.toString()||"Unknown error",s=this.currentOutputElement||n;this.currentOutputElement&&(this.currentOutputElement.style.minHeight="");let l=document.createElement("div");l.className="output",l.innerText=r,s.appendChild(l);let u=document.createElement("div");u.className="suggestion-button",u.innerText="Reset conversation",u.addEventListener("click",c=>this.resetConversation()),s.appendChild(u)}this.state.loading=!1,this._isProcessing=!1}async onAIMessage(e,t){let n=[];for(let o of e)for(let r=0;r<(o.sections?.length||0);r++){let s=o.sections[r],l=`msgelem-${o.id||""}_${r}_${s.type||"unknown"}`;if(l=l.replace(/[^a-zA-Z0-9-_]/g,"_"),s.type=="thinking"){if(!s.text)continue;let u=s.text||"";u.includes(`
1637
1657
  `)&&(u=u.split(`
1638
- `)[0]),this.updateInfoElement(l,u,"thinking-icon"),i.push(l)}else if(s.type=="tool_call"){let c=new oe(e).toolResult(s.toolCallInstanceID||"");if(s.toolCallHiddenInUI!="always"){if(c?.toolErrorResponse)this.updateInfoElement(l,"**Error:** "+c.toolErrorResponse||"","tool-icon"),i.push(l);else if(!(s.toolCallHiddenInUI=="after-complete"&&c))if(s.toolKbID=="search"){let d=s.toolParameters?.query?`**Search:** ${s.toolParameters.query}`:"**Search**";this.updateInfoElement(l,d,"tool-icon"),i.push(l)}else if(s.toolKbID?.startsWith("ask:")&&s.toolParameters?.query){let d=s.toolKbID.substring(4),p=`**Ask ${this.ai.subAgents.subagents.find(m=>m.id===d)?.name||"agent"}:** ${s.toolParameters.query}`;this.updateInfoElement(l,p,"tool-icon"),i.push(l)}else this.updateInfoElement(l,s.toolKbName||"","tool-icon"),i.push(l)}}else if(s.type!="tool_result"){if(!s.text)continue;this.updateTextElement(l,s.text||"")&&i.push(l)}}for(let o of Array.from(this.currentOutputElement.children))i.includes(o.id)||o.remove()}updateTextElement(e,t){let i=qe(t||""),o=this._handledEmbeddedActionBlocks.get(e)||new Set;this._handledEmbeddedActionBlocks.set(e,o);for(let l of i.blocks)o.has(l.raw)||(o.add(l.raw),l.action&&this.runEmbeddedAction(l.action));let r=this.currentOutputElement.querySelector(`#${e}`);if(!i.visibleText.trim())return r?.remove(),!1;r||(r=document.createElement("div"),r.id=e,r.className="output",this.currentOutputElement.appendChild(r));let s=Pt().use(Wt).use(Dt).use(Gt).use(Zt).use(Nt,{target:"_blank",rel:["noopener","noreferrer"]}).use(At).use(Lt).processSync(i.visibleText||"");return r.innerHTML=s.toString("utf-8"),!0}runEmbeddedAction(e){if(e.action==="suggestion"){if(!this.ai.flags.allowSuggestionButtons)return;let r=this.normalizeSuggestionActionValue(e.text);if(!r)return;this.suggestions.includes(r)||this.suggestions.push(r);return}if(e.action!=="emoji"||!this.ai.flags.allowEmojiActions)return;let t=this.normalizeEmojiActionValue(e.emoji);if(!t)return;let i=this.clampNumber(e.count,1,24,14),o=this.clampNumber(e.duration,800,2200,1300);this.showEmojiBurst(t,i,o)}clampNumber(e,t,i,o){let r=typeof e=="number"?e:Number(e);return Number.isFinite(r)?Math.max(t,Math.min(i,Math.round(r))):o}normalizeEmojiActionValue(e){return typeof e!="string"?"":Array.from(e.trim()).slice(0,8).join("")}normalizeSuggestionActionValue(e){return typeof e!="string"?"":Array.from(e.trim().replace(/\s+/g," ")).slice(0,160).join("")}showEmojiBurst(e,t,i){let o=this.child("emoji-action-overlay");if(o)for(let r=0;r<t;r++){let s=document.createElement("span");s.className="emoji-action-particle",s.textContent=e;let l=Math.floor(Math.random()*220),u=i+Math.floor(Math.random()*360);s.style.setProperty("--emoji-x",`${12+Math.random()*76}%`),s.style.setProperty("--emoji-bottom",`${54+Math.random()*52}px`),s.style.setProperty("--emoji-size",`${26+Math.random()*20}px`),s.style.setProperty("--emoji-drift",`${Math.round((Math.random()-.5)*180)}px`),s.style.setProperty("--emoji-rise",`${Math.round(-130-Math.random()*170)}px`),s.style.setProperty("--emoji-scale",`${(.9+Math.random()*.7).toFixed(2)}`),s.style.setProperty("--emoji-rotate-start",`${Math.round((Math.random()-.5)*28)}deg`),s.style.setProperty("--emoji-rotate-end",`${Math.round((Math.random()-.5)*120)}deg`),s.style.setProperty("--emoji-duration",`${u}ms`),s.style.animationDelay=`${l}ms`,o.appendChild(s),window.setTimeout(()=>s.remove(),u+l+250)}}updateInfoElement(e,t,i){let o=this.currentOutputElement.querySelector(`#${e}`);o||(o=document.createElement("div"),o.id=e,o.className="info-block",o.innerHTML=`
1658
+ `)[0]),this.updateInfoElement(l,u,"thinking-icon"),n.push(l)}else if(s.type=="tool_call"){let c=new ie(e).toolResult(s.toolCallInstanceID||"");if(s.toolCallHiddenInUI!="always"){if(c?.toolErrorResponse)this.updateInfoElement(l,"**Error:** "+c.toolErrorResponse||"","tool-icon"),n.push(l);else if(!(s.toolCallHiddenInUI=="after-complete"&&c))if(s.toolKbID=="search"){let d=s.toolParameters?.query?`**Search:** ${s.toolParameters.query}`:"**Search**";this.updateInfoElement(l,d,"tool-icon"),n.push(l)}else if(s.toolKbID?.startsWith("ask:")&&s.toolParameters?.query){let d=s.toolKbID.substring(4),p=`**Ask ${this.ai.subAgents.subagents.find(m=>m.id===d)?.name||"agent"}:** ${s.toolParameters.query}`;this.updateInfoElement(l,p,"tool-icon"),n.push(l)}else this.updateInfoElement(l,s.toolKbName||"","tool-icon"),n.push(l)}}else if(s.type!="tool_result"){if(!s.text)continue;this.updateTextElement(l,s.text||"")&&n.push(l)}}for(let o of Array.from(this.currentOutputElement.children))n.includes(o.id)||o.remove()}updateTextElement(e,t){let n=it(t||""),o=this._handledEmbeddedActionBlocks.get(e)||new Set;this._handledEmbeddedActionBlocks.set(e,o);for(let l of n.blocks)o.has(l.raw)||(o.add(l.raw),l.action&&this.runEmbeddedAction(l.action));let r=this.currentOutputElement.querySelector(`#${e}`);if(!n.visibleText.trim())return r?.remove(),!1;r||(r=document.createElement("div"),r.id=e,r.className="output",this.currentOutputElement.appendChild(r));let s=Bt().use(Rt).use(Zt).use(Xt).use(jt).use(Pt,{target:"_blank",rel:["noopener","noreferrer"]}).use(Wt).use(Gt).processSync(n.visibleText||"");return r.innerHTML=s.toString("utf-8"),!0}runEmbeddedAction(e){if(e.action==="suggestion"){if(!this.ai.flags.allowSuggestionButtons)return;let r=this.normalizeSuggestionActionValue(e.text);if(!r)return;this.suggestions.includes(r)||this.suggestions.push(r);return}if(e.action!=="emoji"||!this.ai.flags.allowEmojiActions)return;let t=this.normalizeEmojiActionValue(e.emoji);if(!t)return;let n=this.clampNumber(e.count,1,24,14),o=this.clampNumber(e.duration,800,2200,1300);this.showEmojiBurst(t,n,o)}clampNumber(e,t,n,o){let r=typeof e=="number"?e:Number(e);return Number.isFinite(r)?Math.max(t,Math.min(n,Math.round(r))):o}normalizeEmojiActionValue(e){return typeof e!="string"?"":Array.from(e.trim()).slice(0,8).join("")}normalizeSuggestionActionValue(e){return typeof e!="string"?"":Array.from(e.trim().replace(/\s+/g," ")).slice(0,160).join("")}showEmojiBurst(e,t,n){let o=this.child("emoji-action-overlay");if(o)for(let r=0;r<t;r++){let s=document.createElement("span");s.className="emoji-action-particle",s.textContent=e;let l=Math.floor(Math.random()*220),u=n+Math.floor(Math.random()*360);s.style.setProperty("--emoji-x",`${12+Math.random()*76}%`),s.style.setProperty("--emoji-bottom",`${54+Math.random()*52}px`),s.style.setProperty("--emoji-size",`${26+Math.random()*20}px`),s.style.setProperty("--emoji-drift",`${Math.round((Math.random()-.5)*180)}px`),s.style.setProperty("--emoji-rise",`${Math.round(-130-Math.random()*170)}px`),s.style.setProperty("--emoji-scale",`${(.9+Math.random()*.7).toFixed(2)}`),s.style.setProperty("--emoji-rotate-start",`${Math.round((Math.random()-.5)*28)}deg`),s.style.setProperty("--emoji-rotate-end",`${Math.round((Math.random()-.5)*120)}deg`),s.style.setProperty("--emoji-duration",`${u}ms`),s.style.animationDelay=`${l}ms`,o.appendChild(s),window.setTimeout(()=>s.remove(),u+l+250)}}updateInfoElement(e,t,n){let o=this.currentOutputElement.querySelector(`#${e}`);o||(o=document.createElement("div"),o.id=e,o.className="info-block",o.innerHTML=`
1639
1659
  <div class='info-block-icon'></div>
1640
1660
  <div class='info-block-text'></div>
1641
- `,this.currentOutputElement.appendChild(o));let r=Pt().use(Wt).use(Dt).use(Gt).use(Zt).use(Nt,{target:"_blank",rel:["noopener","noreferrer"]}).use(At).use(Lt).processSync(t||"");o.querySelector(".info-block-icon").className="info-block-icon "+i,o.querySelector(".info-block-text").innerHTML=r.toString("utf-8")}onSuggestionClick(e,t){this.processInput(t)}onLLMModelSelect(e){e.preventDefault(),this.ai.setModel(e.detail),this.state.llmPanelOpen=!1}onContentScroll(e){}updateBrandingFor(e){this.updateBrandingText(e)}updateBrandingText(e){let t=this.root?.querySelector("#poweredby");if(!t){console.warn("Powered by element not found for branding update.");return}e?.toLowerCase()==="chatterly"?t.innerHTML="<span>powered by <strong><i class='green-accent'>Chatterly</i></strong></span>":t.innerHTML="<span>powered by <strong>IntelliWeave <i class='green-accent'>AI</i></strong></span>"}};ue.tagName="intelliweave-embed",ue.observedAttributes=["logo","focusID","open","collapsed","background","textColor","fontFamily","displayMode","layout","header","positioningMode","positionX","positionY","offsetX","offsetY","brandName","brandNameColor","hidePoweredBy"];function Zt(){return a=>{nt(a,"element",(n,e,t)=>{!t||e==null||n.tagName==="table"&&(t.children[e]={type:"element",tagName:"div",properties:{className:["table-scroll-wrapper"]},children:[n]})})}}var Xt=new f("React"),Es=a=>typeof window>"u"?null:(ue.register(),b().analytics=a.analytics??b().analytics,b().debug=a.debug??b().debug,a.context&&(b().pageSummary=a.context),a.introductionMessage&&(b().introductionMessage=a.introductionMessage),a.introductionSuggestions&&(b().introductionSuggestions=a.introductionSuggestions),a.userID&&(b().userID=a.userID),He(()=>{let n=e=>{for(let t of a.knowledgeBase||[])e.entries.push(t);for(let t of a.sources||[])e.sources.push(t)};return document.addEventListener("webweaver_kb_search",n),()=>document.removeEventListener("webweaver_kb_search",n)},[a.knowledgeBase]),Rt.createElement("intelliweave-embed",{logo:a.logo,background:a.background,textColor:a.textColor,apiKey:a.apiKey,offsetX:a.offsetX||20,offsetY:a.offsetY||20,hubAPI:a.hubAPI,displayMode:a.displayMode,layout:a.layout,header:a.header,positioningMode:a.positioningMode,positionX:a.positionX,positionY:a.positionY,brandName:a.brandName,brandNameColor:a.brandNameColor,hidePoweredBy:a.hidePoweredBy?"true":void 0})),Bt=xi(void 0);function Ns(a){function n(){Xt.debug("Creating new IntelliWeave instance for <IntelliWeaveProvider />");let t=new U;return H.isSupported&&(t.audio=new H(t)),t.load(a.apiKey),t}b().analytics=a.analytics??b().analytics,b().debug=a.debug??b().debug;let e=Ii(()=>a.ai||n(),[a.ai,a.apiKey]);return He(()=>{let t=i=>{let o=i;o.detail.isFinal&&e.sendMessage(o.detail.transcript)};return e.audio?.speechRecognition.addEventListener("speech",t),()=>{e.audio?.speechRecognition.removeEventListener("speech",t)}}),Rt.createElement(Bt.Provider,{value:e},a.children)}function As(){let[a,n]=at(0),e=Mi(Bt)||b().embed?.ai;e||Xt.warn("Couldn't find IntelliWeave instance. Make sure you have <IntelliWeaveProvider /> somewhere in your scene graph, or use the <WebWeaverUI /> component.");let[,t]=at(!!e?.loaded),[,i]=at(e?.error);return He(()=>{let o=l=>t(l.detail.ai.loaded),r=l=>i(l.detail.ai.error),s=()=>n(l=>l+1);return e?.addEventListener("load",o),e?.addEventListener("error",r),e?.addEventListener("input",s),e?.addEventListener("output",s),e?.addEventListener("toolstart",s),e?.addEventListener("tool",s),()=>{e?.removeEventListener("load",o),e?.removeEventListener("error",r),e?.removeEventListener("input",s),e?.removeEventListener("output",s),e?.removeEventListener("toolstart",s),e?.removeEventListener("tool",s)}},[e]),e}function Ls(a,n=[]){He(()=>{let e=t=>t.sources.push({query:a});return document.addEventListener("webweaver_kb_search",e),()=>document.removeEventListener("webweaver_kb_search",e)},n)}export{Ns as IntelliWeaveProvider,Es as WebWeaverUI,As as useIntelliWeave,Ls as useIntelliWeaveKnowledge};
1661
+ `,this.currentOutputElement.appendChild(o));let r=Bt().use(Rt).use(Zt).use(Xt).use(jt).use(Pt,{target:"_blank",rel:["noopener","noreferrer"]}).use(Wt).use(Gt).processSync(t||"");o.querySelector(".info-block-icon").className="info-block-icon "+n,o.querySelector(".info-block-text").innerHTML=r.toString("utf-8")}onSuggestionClick(e,t){this.processInput(t)}onLLMModelSelect(e){e.preventDefault(),this.ai.setModel(e.detail),this.state.llmPanelOpen=!1}onContentScroll(e){}updateBrandingFor(e){this.updateBrandingText(e)}updateBrandingText(e){let t=this.root?.querySelector("#poweredby");if(!t){E.warn("Powered by element not found for branding update.");return}e?.toLowerCase()==="chatterly"?t.innerHTML="<span>powered by <strong><i class='green-accent'>Chatterly</i></strong></span>":t.innerHTML="<span>powered by <strong>IntelliWeave <i class='green-accent'>AI</i></strong></span>",this.shouldHidePoweredBy()&&(t.innerHTML="<span> </span>")}};pe.tagName="intelliweave-embed",pe.observedAttributes=["logo","focusID","open","collapsed","background","textColor","fontFamily","displayMode","layout","header","positioningMode","positionX","positionY","offsetX","offsetY","brandName","brandNameColor","hidePoweredBy"];function jt(){return a=>{st(a,"element",(i,e,t)=>{!t||e==null||i.tagName==="table"&&(t.children[e]={type:"element",tagName:"div",properties:{className:["table-scroll-wrapper"]},children:[i]})})}}var zt=new g("React"),Os=a=>typeof window>"u"?null:(pe.register(),b().analytics=a.analytics??b().analytics,b().debug=a.debug??b().debug,a.context&&(b().pageSummary=a.context),a.introductionMessage&&(b().introductionMessage=a.introductionMessage),a.autoStartPrompt&&(b().autoStartPrompt=a.autoStartPrompt),a.introductionSuggestions&&(b().introductionSuggestions=a.introductionSuggestions),a.userID&&(b().userID=a.userID),$e(()=>{let i=e=>{for(let t of a.knowledgeBase||[])e.entries.push(t);for(let t of a.sources||[])e.sources.push(t)};return document.addEventListener("webweaver_kb_search",i),()=>document.removeEventListener("webweaver_kb_search",i)},[a.knowledgeBase]),_t.createElement("intelliweave-embed",{logo:a.logo,background:a.background,textColor:a.textColor,apiKey:a.apiKey,offsetX:a.offsetX||20,offsetY:a.offsetY||20,hubAPI:a.hubAPI,displayMode:a.displayMode,layout:a.layout,header:a.header,positioningMode:a.positioningMode,positionX:a.positionX,positionY:a.positionY,brandName:a.brandName,brandNameColor:a.brandNameColor,autoStartPrompt:a.autoStartPrompt,hidePoweredBy:a.hidePoweredBy?"true":void 0})),Ot=Ni(void 0);function Vs(a){function i(){zt.debug("Creating new IntelliWeave instance for <IntelliWeaveProvider />");let t=new Y;return U.isSupported&&(t.audio=new U(t)),t.load(a.apiKey),t}b().analytics=a.analytics??b().analytics,b().debug=a.debug??b().debug;let e=Di(()=>a.ai||i(),[a.ai,a.apiKey]);return $e(()=>{let t=n=>{let o=n;o.detail.isFinal&&e.sendMessage(o.detail.transcript)};return e.audio?.speechRecognition.addEventListener("speech",t),()=>{e.audio?.speechRecognition.removeEventListener("speech",t)}}),_t.createElement(Ot.Provider,{value:e},a.children)}function Ys(){let[a,i]=ct(0),e=Li(Ot)||b().embed?.ai;e||zt.warn("Couldn't find IntelliWeave instance. Make sure you have <IntelliWeaveProvider /> somewhere in your scene graph, or use the <WebWeaverUI /> component.");let[,t]=ct(!!e?.loaded),[,n]=ct(e?.error);return $e(()=>{let o=l=>t(l.detail.ai.loaded),r=l=>n(l.detail.ai.error),s=()=>i(l=>l+1);return e?.addEventListener("load",o),e?.addEventListener("error",r),e?.addEventListener("input",s),e?.addEventListener("output",s),e?.addEventListener("toolstart",s),e?.addEventListener("tool",s),()=>{e?.removeEventListener("load",o),e?.removeEventListener("error",r),e?.removeEventListener("input",s),e?.removeEventListener("output",s),e?.removeEventListener("toolstart",s),e?.removeEventListener("tool",s)}},[e]),e}function Fs(a,i=[]){$e(()=>{let e=t=>t.sources.push({query:a});return document.addEventListener("webweaver_kb_search",e),()=>document.removeEventListener("webweaver_kb_search",e)},i)}export{Vs as IntelliWeaveProvider,Os as WebWeaverUI,Ys as useIntelliWeave,Fs as useIntelliWeaveKnowledge};