@intelliweave/embedded 2.0.72-beta.7 → 2.0.72-beta.9

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.
Binary file
@@ -505,6 +505,8 @@ interface TokenWindowGroupItem<DataType> {
505
505
  /** Total token usage */
506
506
  totalTokens: number;
507
507
  };
508
+ /** True if this item is still being streamed */
509
+ streamingInProgress?: boolean;
508
510
  }
509
511
  /** A section of a message returned by the AI */
510
512
  interface TokenWindowGroupItemSection {
@@ -542,10 +544,16 @@ type TokenWindowGroupItemParams<DataType> = Omit<Optional<TokenWindowGroupItem<D
542
544
  declare class WebWeaverSpeechOutput extends EventTarget {
543
545
  /** Reference to the AI */
544
546
  private ai?;
547
+ /** Automatically speak output from the AI */
548
+ autoSpeak: boolean;
549
+ /** If enabled, connections will be pre-emptively opened to speed up text-to-speech response times, if possible */
550
+ preemptiveConnection: boolean;
545
551
  /** Constructor */
546
552
  constructor(ai: IntelliWeave);
547
- /** Called when the AI speaks */
548
- onTextOutputFromAI(e: CustomEvent): void;
553
+ /** Message IDs we've processed */
554
+ private processedMessages;
555
+ /** Called when the AI responds */
556
+ onOutputFromAI(e: CustomEvent): void;
549
557
  /** Current player vars */
550
558
  private currentPlayerVolume?;
551
559
  private currentPlayer?;
@@ -557,8 +565,15 @@ declare class WebWeaverSpeechOutput extends EventTarget {
557
565
  private maxVolumeHeard;
558
566
  /** Get current (realtime) audio output volume level, from 0 to 1 */
559
567
  get volumeLevel(): number;
568
+ /** Queued messages to speak next */
569
+ private _queuedText;
560
570
  /** Speak the text */
561
571
  speak(text: string): Promise<void>;
572
+ private _queueActive;
573
+ _runQueue(): Promise<void>;
574
+ /** ElevenLabs connection pre-cache */
575
+ private _elevenLabsPrecachedConnection?;
576
+ private _getElevenLabsConnection;
562
577
  private _speakWithLock;
563
578
  /** True if currently playing audio */
564
579
  get isSpeaking(): boolean;
@@ -879,6 +894,17 @@ declare class MCPKnowledgeClient {
879
894
  searchToolName?: string;
880
895
  /** Keep search function available for the AI to use. */
881
896
  searchToolVisible?: boolean;
897
+ /** Use the IntelliWeave proxy */
898
+ proxy?: {
899
+ /** If true, will send requests via the IntelliWeave MCP proxy */
900
+ enabled?: boolean;
901
+ /** The URL of the proxy server, defaults to the standard IntelliWeave proxy */
902
+ url?: string;
903
+ /** IntelliWeave API key */
904
+ apiKey?: string;
905
+ };
906
+ /** Pass extra headers to the MCP server */
907
+ headers?: Record<string, string>;
882
908
  };
883
909
  /** Constructor */
884
910
  constructor(config: MCPKnowledgeClient['config']);
@@ -889,16 +915,10 @@ declare class MCPKnowledgeClient {
889
915
  method: string;
890
916
  params?: {
891
917
  [x: string]: unknown;
892
- task?: {
893
- [x: string]: unknown;
894
- ttl?: number | null | undefined;
895
- pollInterval?: number | undefined;
896
- } | undefined;
897
918
  _meta?: {
898
919
  [x: string]: unknown;
899
920
  progressToken?: string | number | undefined;
900
921
  "io.modelcontextprotocol/related-task"?: {
901
- [x: string]: unknown;
902
922
  taskId: string;
903
923
  } | undefined;
904
924
  } | undefined;
@@ -909,8 +929,8 @@ declare class MCPKnowledgeClient {
909
929
  [x: string]: unknown;
910
930
  _meta?: {
911
931
  [x: string]: unknown;
932
+ progressToken?: string | number | undefined;
912
933
  "io.modelcontextprotocol/related-task"?: {
913
- [x: string]: unknown;
914
934
  taskId: string;
915
935
  } | undefined;
916
936
  } | undefined;
@@ -919,8 +939,8 @@ declare class MCPKnowledgeClient {
919
939
  [x: string]: unknown;
920
940
  _meta?: {
921
941
  [x: string]: unknown;
942
+ progressToken?: string | number | undefined;
922
943
  "io.modelcontextprotocol/related-task"?: {
923
- [x: string]: unknown;
924
944
  taskId: string;
925
945
  } | undefined;
926
946
  } | undefined;
@@ -929,16 +949,10 @@ declare class MCPKnowledgeClient {
929
949
  method: string;
930
950
  params?: {
931
951
  [x: string]: unknown;
932
- task?: {
933
- [x: string]: unknown;
934
- ttl?: number | null | undefined;
935
- pollInterval?: number | undefined;
936
- } | undefined;
937
952
  _meta?: {
938
953
  [x: string]: unknown;
939
954
  progressToken?: string | number | undefined;
940
955
  "io.modelcontextprotocol/related-task"?: {
941
- [x: string]: unknown;
942
956
  taskId: string;
943
957
  } | undefined;
944
958
  } | undefined;
@@ -949,8 +963,8 @@ declare class MCPKnowledgeClient {
949
963
  [x: string]: unknown;
950
964
  _meta?: {
951
965
  [x: string]: unknown;
966
+ progressToken?: string | number | undefined;
952
967
  "io.modelcontextprotocol/related-task"?: {
953
- [x: string]: unknown;
954
968
  taskId: string;
955
969
  } | undefined;
956
970
  } | undefined;
@@ -959,8 +973,8 @@ declare class MCPKnowledgeClient {
959
973
  [x: string]: unknown;
960
974
  _meta?: {
961
975
  [x: string]: unknown;
976
+ progressToken?: string | number | undefined;
962
977
  "io.modelcontextprotocol/related-task"?: {
963
- [x: string]: unknown;
964
978
  taskId: string;
965
979
  } | undefined;
966
980
  } | undefined;
@@ -1881,7 +1895,7 @@ declare class AnthropicChat extends ChatBase<DataType> {
1881
1895
  /** Send a message, and get the response string. */
1882
1896
  sendMessage(message: string, onPartial?: (items: TokenWindowGroupItemParams<DataType>[]) => void): Promise<TokenWindowGroupItemParams<any>[]>;
1883
1897
  /** Parse a message block into our format */
1884
- protected parseMessageBlock(message: Anthropic.Messages.Message): TokenWindowGroupItemParams<DataType>;
1898
+ protected parseMessageBlock(message: Anthropic.Messages.Message, isPartial: boolean): TokenWindowGroupItemParams<DataType>;
1885
1899
  /** Trim message list */
1886
1900
  trimMessages(): Promise<void>;
1887
1901
  }
package/dist/node/node.js CHANGED
@@ -1,26 +1,26 @@
1
- import{v4 as L}from"uuid";function A(d){let e=(d||"").split(`
1
+ import{v4 as j}from"uuid";function A(d){let e=(d||"").split(`
2
2
  `);for(;e.length>0&&e[0].trim()=="";)e.shift();for(;e.length>0&&e[e.length-1].trim()=="";)e.pop();let t=1/0;for(let n of e){let s=n.match(/^\s*/)?.[0].length||0;t=Math.min(t,s)}return t>0&&t<1/0&&(e=e.map(n=>n.substring(t))),e.join(`
3
- `)}var se={};function B(){return typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:se}function w(){return B().intelliweave=B().intelliweave||B().webWeaver||{},B().intelliweave}async function*be(d){let e="",t=function*(){for(;;){let o=e.indexOf(`
3
+ `)}var ne={};function B(){return typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:ne}function y(){return B().intelliweave=B().intelliweave||B().webWeaver||{},B().intelliweave}async function*be(d){let e="",t=function*(){for(;;){let o=e.indexOf(`
4
4
 
5
- `);if(o==-1)break;let a=e.slice(0,o);e=e.slice(o+2);let u={},i=a.split(`
6
- `);for(let l of i){o=l.indexOf(": ");let r=l.slice(0,o),c=l.slice(o+2);o==-1&&(r=l,c=""),r&&(u[r]!==void 0?u[r]+=`
7
- `+c:u[r]=c)}yield u}},n=new TextDecoder,s=d.getReader();for(;;){let{done:o,value:a}=await s.read();if(o)break;e+=n.decode(a,{stream:!0}),yield*t()}e+=n.decode()+`
5
+ `);if(o==-1)break;let r=e.slice(0,o);e=e.slice(o+2);let c={},a=r.split(`
6
+ `);for(let u of a){o=u.indexOf(": ");let i=u.slice(0,o),l=u.slice(o+2);o==-1&&(i=u,l=""),i&&(c[i]!==void 0?c[i]+=`
7
+ `+l:c[i]=l)}yield c}},n=new TextDecoder,s=d.getReader();for(;;){let{done:o,value:r}=await s.read();if(o)break;e+=n.decode(r,{stream:!0}),yield*t()}e+=n.decode()+`
8
8
 
9
- `,yield*t()}function F(){if(w().userID)return w().userID||"";if(typeof localStorage<"u"&&localStorage.getItem&&localStorage.setItem){let d=localStorage.getItem("intelliweave.uid")||"";return d||(d=L(),localStorage.setItem("intelliweave.uid",d),d)}else return L()}function q(d){let e=d;if(e?.type=="object"&&e.properties)return d;let t={type:"object",properties:{},required:[]};if(d&&Array.isArray(d)){let n=d;for(let s of n)t.properties[s.name]={type:s.type||"string",description:s.description||""}}return t}var E=class E{constructor(e){this.module="IntelliWeave";this.module=e}get debugEnabled(){return E.debug?!0:typeof window<"u"&&w().debug}log(...e){this.debugEnabled&&console.log(`[IntelliWeave > ${this.module}]`,...e)}debug(...e){this.debugEnabled&&console.debug(`[IntelliWeave > ${this.module}]`,...e)}info(...e){this.debugEnabled&&console.info(`[IntelliWeave > ${this.module}]`,...e)}warn(...e){console.warn(`[IntelliWeave > ${this.module}]`,...e)}error(...e){console.error(`[IntelliWeave > ${this.module}]`,...e)}timer(e,...t){let n=Date.now();return this.debug(`[${e} 0ms] Started`,...t),(...s)=>this.debug(`[${e} ${Math.floor(Date.now()-n)}ms]`,...s)}};E.debug=!1;var g=E;var S=new g("ONNXModel"),J=class d{constructor(e){this.stateTensors={};this.constantTensors={};this._runActive=!1;this.ignoreIfBusy=!1;this.session=e,S.debug(`Model input parameters: ${e.inputNames.join(", ")}`),S.debug(`Model output parameters: ${e.outputNames.join(", ")}`)}static isSupported(){return!!d.lib}static async load(e){if(!d.lib)throw new Error("ONNX runtime not loaded, please set the runtime loader. Example: ONNXModel.lib = () => import('onnxruntime-web')");this.onnx||(S.debug("Loading ONNX runtime"),this.onnx=await d.lib()),S.debug(`Loading model: ${e}`);let t=await this.onnx.InferenceSession.create(e);return new d(t)}makeTensor(e,t,n=0){let s=1;for(let a of t)s*=a;let o;if(e=="float32")o=new d.onnx.Tensor(new Float32Array(s),t);else if(e=="int8")o=new d.onnx.Tensor(new Int8Array(s),t);else if(e=="int16")o=new d.onnx.Tensor(new Int16Array(s),t);else if(e=="int32")o=new d.onnx.Tensor(new Int32Array(s),t);else if(e=="int64")o=new d.onnx.Tensor(new BigInt64Array(s),t);else if(e=="uint8")o=new d.onnx.Tensor(new Uint8Array(s),t);else if(e=="uint16")o=new d.onnx.Tensor(new Uint16Array(s),t);else if(e=="uint32")o=new d.onnx.Tensor(new Uint32Array(s),t);else if(e=="uint64")o=new d.onnx.Tensor(new BigUint64Array(s),t);else throw new Error(`Invalid type: ${e}`);return n!==0&&(e=="int64"||e=="uint64")?o.data.fill(BigInt(n)):n!==0&&o.data.fill(n),o}registerConstant(e,t){if(!this.session.inputNames.includes(e))throw new Error(`Model does not have an input named: ${e}`);return this.constantTensors[e]=t,t}makeConstant(e,t,n,s=0){return this.registerConstant(e,this.makeTensor(t,n,s))}registerState(e,t,n){if(t||(t=e),!this.session.inputNames.includes(e))throw new Error(`Model does not have an input named: ${e}`);if(!this.session.outputNames.includes(t))throw new Error(`Model does not have an output named: ${t}`);return this.stateTensors[e]={outputName:t,tensor:n},n}makeState(e,t,n,s,o=0){return this.registerState(e,t,this.makeTensor(n,s,o))}async run(e={}){if(this._runActive&&this.ignoreIfBusy)return S.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 t in this.stateTensors)e[t]=this.stateTensors[t].tensor;for(let t in this.constantTensors)e[t]=this.constantTensors[t];try{let t=await this.session.run(e);for(let n in this.stateTensors){let s=t[this.stateTensors[n].outputName];this.stateTensors[n].tensor=s}return t}finally{this._runActive=!1}}resetState(){S.debug("Resetting state tensors");for(let e in this.stateTensors)this.stateTensors[e].tensor.data.fill(0)}};function xe(d,e){let t=e.reduce((i,l)=>i+l.byteLength,0),n=new DataView(new ArrayBuffer(44));n.setUint8(0,82),n.setUint8(1,73),n.setUint8(2,70),n.setUint8(3,70),n.setUint32(4,44+t,!0),n.setUint8(8,87),n.setUint8(9,65),n.setUint8(10,86),n.setUint8(11,69);let s=1,o=32,a=s*o/8,u=d*a;return n.setUint8(12,102),n.setUint8(13,109),n.setUint8(14,116),n.setUint8(15,32),n.setUint32(16,16,!0),n.setUint16(20,3,!0),n.setUint16(22,s,!0),n.setUint32(24,d,!0),n.setUint32(28,u,!0),n.setUint16(32,a,!0),n.setUint16(34,o,!0),n.setUint8(36,100),n.setUint8(37,97),n.setUint8(38,116),n.setUint8(39,97),n.setUint32(40,t,!0),new File([n,...e],"audio.wav",{type:"audio/wav"})}var z=class extends WebSocket{constructor(t){super(t);this.pendingData=[];this.addEventListener("open",()=>this._onOpen())}send(t){this.readyState==WebSocket.OPEN?super.send(t):this.pendingData.push(t)}_onOpen(){for(let t of this.pendingData)super.send(t);this.pendingData=[]}};var V=class{constructor(e,t){this.outputBufferSize=0;this.partialBuffers=[];this.partialBufferOffset=0;if(!e)throw new Error(`Invalid array class: ${e}`);if(!t||t<=0)throw new Error(`Invalid output buffer size: ${t}`);this.ArrayClass=e,this.outputBufferSize=t}get queuedSize(){return this.partialBuffers.reduce((e,t)=>e+t.length,0)}feed(e){this.partialBuffers.push(e)}get canDrain(){return this.partialBuffers.reduce((t,n)=>t+n.length,0)-this.partialBufferOffset>=this.outputBufferSize}drain(){if(!this.canDrain)return null;let e=this.ArrayClass,t=new e(this.outputBufferSize),n=0;for(;n!=t.length;){if(n>t.length)throw new Error(`Buffer overflow: ${n} > ${t.length}`);let s=t.length-n,o=this.partialBuffers[0],a=o.length-this.partialBufferOffset;a<s?(t.set(o.subarray(this.partialBufferOffset),n),n+=a,this.partialBuffers.shift(),this.partialBufferOffset=0):(t.set(o.subarray(this.partialBufferOffset,this.partialBufferOffset+s),n),n+=s,this.partialBufferOffset+=s)}return t}pad(){let e=this.queuedSize%this.outputBufferSize;if(e==0)return;let t=this.ArrayClass,n=new t(e);this.feed(n)}};var H=class{constructor(e,t,n,s){if(!e||!t||!n)throw new Error("Invalid settings specified for the resampler.");this.resampler=null,this.fromSampleRate=e,this.toSampleRate=t,this.channels=n||0,this.inputBufferSize=s,this.initialize()}initialize(){this.fromSampleRate==this.toSampleRate?(this.resampler=e=>e,this.ratioWeight=1):(this.fromSampleRate<this.toSampleRate?(this.linearInterpolation(),this.lastWeight=1):(this.multiTap(),this.tailExists=!1,this.lastWeight=0),this.initializeBuffers(),this.ratioWeight=this.fromSampleRate/this.toSampleRate)}bufferSlice(e){try{return this.outputBuffer.subarray(0,e)}catch{try{return this.outputBuffer.length=e,this.outputBuffer}catch{return this.outputBuffer.slice(0,e)}}}initializeBuffers(){this.outputBufferSize=Math.ceil(this.inputBufferSize*this.toSampleRate/this.fromSampleRate/this.channels*1.0000004768371582)+this.channels+this.channels;try{this.outputBuffer=new Float32Array(this.outputBufferSize),this.lastOutput=new Float32Array(this.channels)}catch{this.outputBuffer=[],this.lastOutput=[]}}linearInterpolation(){this.resampler=e=>{let t=e.length,n=this.channels,s,o,a,u,i,l,r,c,p;if(t%n!==0)throw new Error("Buffer was of incorrect sample length.");if(t<=0)return[];for(s=this.outputBufferSize,o=this.ratioWeight,a=this.lastWeight,u=0,i=0,l=0,r=0,c=this.outputBuffer;a<1;a+=o)for(i=a%1,u=1-i,this.lastWeight=a%1,p=0;p<this.channels;++p)c[r++]=this.lastOutput[p]*u+e[p]*i;for(a-=1,t-=n,l=Math.floor(a)*n;r<s&&l<t;){for(i=a%1,u=1-i,p=0;p<this.channels;++p)c[r++]=e[l+(p>0?p:0)]*u+e[l+(n+p)]*i;a+=o,l=Math.floor(a)*n}for(p=0;p<n;++p)this.lastOutput[p]=e[l++];return this.bufferSlice(r)}}multiTap(){this.resampler=e=>{let t=e.length,n,s,o=this.channels,a,u,i,l,r,c,p,m,f;if(t%o!==0)throw new Error("Buffer was of incorrect sample length.");if(t<=0)return[];for(n=this.outputBufferSize,s=[],a=this.ratioWeight,u=0,l=0,r=0,c=!this.tailExists,this.tailExists=!1,p=this.outputBuffer,m=0,f=0,i=0;i<o;++i)s[i]=0;do{if(c)for(u=a,i=0;i<o;++i)s[i]=0;else{for(u=this.lastWeight,i=0;i<o;++i)s[i]=this.lastOutput[i];c=!0}for(;u>0&&l<t;)if(r=1+l-f,u>=r){for(i=0;i<o;++i)s[i]+=e[l++]*r;f=l,u-=r}else{for(i=0;i<o;++i)s[i]+=e[l+(i>0?i:0)]*u;f+=u,u=0;break}if(u===0)for(i=0;i<o;++i)p[m++]=s[i]/a;else{for(this.lastWeight=u,i=0;i<o;++i)this.lastOutput[i]=s[i];this.tailExists=!0;break}}while(l<t&&m<n);return this.bufferSlice(m)}}resample(e){return this.fromSampleRate==this.toSampleRate?this.ratioWeight=1:(this.fromSampleRate<this.toSampleRate?this.lastWeight=1:(this.tailExists=!1,this.lastWeight=0),this.initializeBuffers(),this.ratioWeight=this.fromSampleRate/this.toSampleRate),this.resampler(e)}};function Ae(d){let e=d.length,t=new Int16Array(e);for(;e--;){let n=Math.max(-1,Math.min(1,d[e]));t[e]=n<0?n*32768:n*32767}return t}function Ee(d){let e=d.length,t=new BigInt64Array(e);for(;e--;){let n=Math.max(-1,Math.min(1,d[e]));t[e]=BigInt(Math.floor(n<0?n*32768:n*32767))*0x100000000000n}return t}function Me(d){let e=d.length,t=new Float32Array(e);for(;e--;){let n=d[e];t[e]=n>=32768?-(65536-n)/32768:n/32767}return t}import re from"openai";import{v4 as oe}from"uuid";var v=class{constructor(){this.size=4096;this.groups=[]}createGroup(e){let t=new U;return t.id=e,this.groups.push(t),t}group(e){return this.groups.find(t=>t.id===e)}static countTokensInText(e){return e==null?e="":typeof e=="number"?e=e+"":typeof e!="string"&&(e=JSON.stringify(e)),Math.ceil(e.length/3)}countTokens(){return this.groups.reduce((e,t)=>e+t.tokenCount,0)}removeOverflow(){let e=this.countTokens(),t=this.groups.reduce((n,s)=>n+s.weight,0);for(;e>this.size;){let n=this.groups.slice().sort((o,a)=>{let u=Math.floor(o.weight/t*this.size),i=Math.floor(a.weight/t*this.size),l=o.tokenCount-u;return a.tokenCount-i-l}),s=this.removeOneItem(n);if(!s)throw new Error("Too many items in the token window that cannot be removed.");e-=s.tokenCount}}removeOneItem(e){for(let t of e){let n=t.items.findIndex(o=>!o.cannotRemove);if(n===-1)continue;let s=t.items[n];return t.items.splice(n,1),t.tokenCount-=s.tokenCount,s}return null}},U=class{constructor(){this.id="";this.items=[];this.weight=1;this.tokenCount=0;this.separator=`
10
- `;this.itemPadding=0;this.sortFunction=(e,t)=>e.sortOrder!==t.sortOrder?e.sortOrder-t.sortOrder:e.dateAdded!==t.dateAdded?e.dateAdded-t.dateAdded:0}setItemPadding(e){return this.itemPadding=e,this.recalculateTokens(),this}sortBy(e){return this.sortFunction=e,this.items.sort(this.sortFunction),this}setSeparator(e){return this.separator==e?this:(this.separator=e,this.recalculateTokens(),this)}setWeight(e){return this.weight=e,this}recalculateTokens(){this.tokenCount=this.items.reduce((e,t)=>(t.tokenCount=v.countTokensInText(typeof t.data=="string"?t.data:JSON.stringify(t.data))+v.countTokensInText(this.separator)+this.itemPadding,e+t.tokenCount),0)}add(e){typeof e=="string"&&(e={source:"user",data:e});let t=e;t.id===void 0&&(t.id=oe()),!t.sections?.length&&typeof t.data=="string"?t.text=t.data:t.text=t.sections?.map(s=>{if(s.type==="text")return s.text||"";if(s.type==="tool_call")return`[Tool Call: ${s.toolKbName||s.toolName}] `;if(s.type==="tool_result"&&s.toolErrorResponse)return`[Tool Error: ${s.toolErrorResponse}] `}).filter(s=>!!s).join(`
9
+ `,yield*t()}function F(){if(y().userID)return y().userID||"";if(typeof localStorage<"u"&&localStorage.getItem&&localStorage.setItem){let d=localStorage.getItem("intelliweave.uid")||"";return d||(d=j(),localStorage.setItem("intelliweave.uid",d),d)}else return j()}function q(d){let e=d;if(e?.type=="object"&&e.properties)return d;let t={type:"object",properties:{},required:[]};if(d&&Array.isArray(d)){let n=d;for(let s of n)t.properties[s.name]={type:s.type||"string",description:s.description||""}}return t}var E=class E{constructor(e){this.module="IntelliWeave";this.module=e}get debugEnabled(){return E.debug?!0:typeof window<"u"&&y().debug}log(...e){this.debugEnabled&&console.log(`[IntelliWeave > ${this.module}]`,...e)}debug(...e){this.debugEnabled&&console.debug(`[IntelliWeave > ${this.module}]`,...e)}info(...e){this.debugEnabled&&console.info(`[IntelliWeave > ${this.module}]`,...e)}warn(...e){console.warn(`[IntelliWeave > ${this.module}]`,...e)}error(...e){console.error(`[IntelliWeave > ${this.module}]`,...e)}timer(e,...t){let n=Date.now();return this.debug(`[${e} 0ms] Started`,...t),(...s)=>this.debug(`[${e} ${Math.floor(Date.now()-n)}ms]`,...s)}};E.debug=!1;var g=E;var S=new g("ONNXModel"),J=class d{constructor(e){this.stateTensors={};this.constantTensors={};this._runActive=!1;this.ignoreIfBusy=!1;this.session=e,S.debug(`Model input parameters: ${e.inputNames.join(", ")}`),S.debug(`Model output parameters: ${e.outputNames.join(", ")}`)}static isSupported(){return!!d.lib}static async load(e){if(!d.lib)throw new Error("ONNX runtime not loaded, please set the runtime loader. Example: ONNXModel.lib = () => import('onnxruntime-web')");this.onnx||(S.debug("Loading ONNX runtime"),this.onnx=await d.lib()),S.debug(`Loading model: ${e}`);let t=await this.onnx.InferenceSession.create(e);return new d(t)}makeTensor(e,t,n=0){let s=1;for(let r of t)s*=r;let o;if(e=="float32")o=new d.onnx.Tensor(new Float32Array(s),t);else if(e=="int8")o=new d.onnx.Tensor(new Int8Array(s),t);else if(e=="int16")o=new d.onnx.Tensor(new Int16Array(s),t);else if(e=="int32")o=new d.onnx.Tensor(new Int32Array(s),t);else if(e=="int64")o=new d.onnx.Tensor(new BigInt64Array(s),t);else if(e=="uint8")o=new d.onnx.Tensor(new Uint8Array(s),t);else if(e=="uint16")o=new d.onnx.Tensor(new Uint16Array(s),t);else if(e=="uint32")o=new d.onnx.Tensor(new Uint32Array(s),t);else if(e=="uint64")o=new d.onnx.Tensor(new BigUint64Array(s),t);else throw new Error(`Invalid type: ${e}`);return n!==0&&(e=="int64"||e=="uint64")?o.data.fill(BigInt(n)):n!==0&&o.data.fill(n),o}registerConstant(e,t){if(!this.session.inputNames.includes(e))throw new Error(`Model does not have an input named: ${e}`);return this.constantTensors[e]=t,t}makeConstant(e,t,n,s=0){return this.registerConstant(e,this.makeTensor(t,n,s))}registerState(e,t,n){if(t||(t=e),!this.session.inputNames.includes(e))throw new Error(`Model does not have an input named: ${e}`);if(!this.session.outputNames.includes(t))throw new Error(`Model does not have an output named: ${t}`);return this.stateTensors[e]={outputName:t,tensor:n},n}makeState(e,t,n,s,o=0){return this.registerState(e,t,this.makeTensor(n,s,o))}async run(e={}){if(this._runActive&&this.ignoreIfBusy)return S.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 t in this.stateTensors)e[t]=this.stateTensors[t].tensor;for(let t in this.constantTensors)e[t]=this.constantTensors[t];try{let t=await this.session.run(e);for(let n in this.stateTensors){let s=t[this.stateTensors[n].outputName];this.stateTensors[n].tensor=s}return t}finally{this._runActive=!1}}resetState(){S.debug("Resetting state tensors");for(let e in this.stateTensors)this.stateTensors[e].tensor.data.fill(0)}};function xe(d,e){let t=e.reduce((a,u)=>a+u.byteLength,0),n=new DataView(new ArrayBuffer(44));n.setUint8(0,82),n.setUint8(1,73),n.setUint8(2,70),n.setUint8(3,70),n.setUint32(4,44+t,!0),n.setUint8(8,87),n.setUint8(9,65),n.setUint8(10,86),n.setUint8(11,69);let s=1,o=32,r=s*o/8,c=d*r;return n.setUint8(12,102),n.setUint8(13,109),n.setUint8(14,116),n.setUint8(15,32),n.setUint32(16,16,!0),n.setUint16(20,3,!0),n.setUint16(22,s,!0),n.setUint32(24,d,!0),n.setUint32(28,c,!0),n.setUint16(32,r,!0),n.setUint16(34,o,!0),n.setUint8(36,100),n.setUint8(37,97),n.setUint8(38,116),n.setUint8(39,97),n.setUint32(40,t,!0),new File([n,...e],"audio.wav",{type:"audio/wav"})}var z=class extends WebSocket{constructor(t){super(t);this.pendingData=[];this.addEventListener("open",()=>this._onOpen())}send(t){this.readyState==WebSocket.OPEN?super.send(t):this.pendingData.push(t)}_onOpen(){for(let t of this.pendingData)super.send(t);this.pendingData=[]}};var V=class{constructor(e,t){this.outputBufferSize=0;this.partialBuffers=[];this.partialBufferOffset=0;if(!e)throw new Error(`Invalid array class: ${e}`);if(!t||t<=0)throw new Error(`Invalid output buffer size: ${t}`);this.ArrayClass=e,this.outputBufferSize=t}get queuedSize(){return this.partialBuffers.reduce((e,t)=>e+t.length,0)}feed(e){this.partialBuffers.push(e)}get canDrain(){return this.partialBuffers.reduce((t,n)=>t+n.length,0)-this.partialBufferOffset>=this.outputBufferSize}drain(){if(!this.canDrain)return null;let e=this.ArrayClass,t=new e(this.outputBufferSize),n=0;for(;n!=t.length;){if(n>t.length)throw new Error(`Buffer overflow: ${n} > ${t.length}`);let s=t.length-n,o=this.partialBuffers[0],r=o.length-this.partialBufferOffset;r<s?(t.set(o.subarray(this.partialBufferOffset),n),n+=r,this.partialBuffers.shift(),this.partialBufferOffset=0):(t.set(o.subarray(this.partialBufferOffset,this.partialBufferOffset+s),n),n+=s,this.partialBufferOffset+=s)}return t}pad(){let e=this.queuedSize%this.outputBufferSize;if(e==0)return;let t=this.ArrayClass,n=new t(e);this.feed(n)}};var H=class{constructor(e,t,n,s){if(!e||!t||!n)throw new Error("Invalid settings specified for the resampler.");this.resampler=null,this.fromSampleRate=e,this.toSampleRate=t,this.channels=n||0,this.inputBufferSize=s,this.initialize()}initialize(){this.fromSampleRate==this.toSampleRate?(this.resampler=e=>e,this.ratioWeight=1):(this.fromSampleRate<this.toSampleRate?(this.linearInterpolation(),this.lastWeight=1):(this.multiTap(),this.tailExists=!1,this.lastWeight=0),this.initializeBuffers(),this.ratioWeight=this.fromSampleRate/this.toSampleRate)}bufferSlice(e){try{return this.outputBuffer.subarray(0,e)}catch{try{return this.outputBuffer.length=e,this.outputBuffer}catch{return this.outputBuffer.slice(0,e)}}}initializeBuffers(){this.outputBufferSize=Math.ceil(this.inputBufferSize*this.toSampleRate/this.fromSampleRate/this.channels*1.0000004768371582)+this.channels+this.channels;try{this.outputBuffer=new Float32Array(this.outputBufferSize),this.lastOutput=new Float32Array(this.channels)}catch{this.outputBuffer=[],this.lastOutput=[]}}linearInterpolation(){this.resampler=e=>{let t=e.length,n=this.channels,s,o,r,c,a,u,i,l,p;if(t%n!==0)throw new Error("Buffer was of incorrect sample length.");if(t<=0)return[];for(s=this.outputBufferSize,o=this.ratioWeight,r=this.lastWeight,c=0,a=0,u=0,i=0,l=this.outputBuffer;r<1;r+=o)for(a=r%1,c=1-a,this.lastWeight=r%1,p=0;p<this.channels;++p)l[i++]=this.lastOutput[p]*c+e[p]*a;for(r-=1,t-=n,u=Math.floor(r)*n;i<s&&u<t;){for(a=r%1,c=1-a,p=0;p<this.channels;++p)l[i++]=e[u+(p>0?p:0)]*c+e[u+(n+p)]*a;r+=o,u=Math.floor(r)*n}for(p=0;p<n;++p)this.lastOutput[p]=e[u++];return this.bufferSlice(i)}}multiTap(){this.resampler=e=>{let t=e.length,n,s,o=this.channels,r,c,a,u,i,l,p,h,f;if(t%o!==0)throw new Error("Buffer was of incorrect sample length.");if(t<=0)return[];for(n=this.outputBufferSize,s=[],r=this.ratioWeight,c=0,u=0,i=0,l=!this.tailExists,this.tailExists=!1,p=this.outputBuffer,h=0,f=0,a=0;a<o;++a)s[a]=0;do{if(l)for(c=r,a=0;a<o;++a)s[a]=0;else{for(c=this.lastWeight,a=0;a<o;++a)s[a]=this.lastOutput[a];l=!0}for(;c>0&&u<t;)if(i=1+u-f,c>=i){for(a=0;a<o;++a)s[a]+=e[u++]*i;f=u,c-=i}else{for(a=0;a<o;++a)s[a]+=e[u+(a>0?a:0)]*c;f+=c,c=0;break}if(c===0)for(a=0;a<o;++a)p[h++]=s[a]/r;else{for(this.lastWeight=c,a=0;a<o;++a)this.lastOutput[a]=s[a];this.tailExists=!0;break}}while(u<t&&h<n);return this.bufferSlice(h)}}resample(e){return this.fromSampleRate==this.toSampleRate?this.ratioWeight=1:(this.fromSampleRate<this.toSampleRate?this.lastWeight=1:(this.tailExists=!1,this.lastWeight=0),this.initializeBuffers(),this.ratioWeight=this.fromSampleRate/this.toSampleRate),this.resampler(e)}};function Ae(d){let e=d.length,t=new Int16Array(e);for(;e--;){let n=Math.max(-1,Math.min(1,d[e]));t[e]=n<0?n*32768:n*32767}return t}function Ee(d){let e=d.length,t=new BigInt64Array(e);for(;e--;){let n=Math.max(-1,Math.min(1,d[e]));t[e]=BigInt(Math.floor(n<0?n*32768:n*32767))*0x100000000000n}return t}function Me(d){let e=d.length,t=new Float32Array(e);for(;e--;){let n=d[e];t[e]=n>=32768?-(65536-n)/32768:n/32767}return t}import ie from"openai";import{v4 as se}from"uuid";var b=class{constructor(){this.size=4096;this.groups=[]}createGroup(e){let t=new G;return t.id=e,this.groups.push(t),t}group(e){return this.groups.find(t=>t.id===e)}static countTokensInText(e){return e==null?e="":typeof e=="number"?e=e+"":typeof e!="string"&&(e=JSON.stringify(e)),Math.ceil(e.length/3)}countTokens(){return this.groups.reduce((e,t)=>e+t.tokenCount,0)}removeOverflow(){let e=this.countTokens(),t=this.groups.reduce((n,s)=>n+s.weight,0);for(;e>this.size;){let n=this.groups.slice().sort((o,r)=>{let c=Math.floor(o.weight/t*this.size),a=Math.floor(r.weight/t*this.size),u=o.tokenCount-c;return r.tokenCount-a-u}),s=this.removeOneItem(n);if(!s)throw new Error("Too many items in the token window that cannot be removed.");e-=s.tokenCount}}removeOneItem(e){for(let t of e){let n=t.items.findIndex(o=>!o.cannotRemove);if(n===-1)continue;let s=t.items[n];return t.items.splice(n,1),t.tokenCount-=s.tokenCount,s}return null}},G=class{constructor(){this.id="";this.items=[];this.weight=1;this.tokenCount=0;this.separator=`
10
+ `;this.itemPadding=0;this.sortFunction=(e,t)=>e.sortOrder!==t.sortOrder?e.sortOrder-t.sortOrder:e.dateAdded!==t.dateAdded?e.dateAdded-t.dateAdded:0}setItemPadding(e){return this.itemPadding=e,this.recalculateTokens(),this}sortBy(e){return this.sortFunction=e,this.items.sort(this.sortFunction),this}setSeparator(e){return this.separator==e?this:(this.separator=e,this.recalculateTokens(),this)}setWeight(e){return this.weight=e,this}recalculateTokens(){this.tokenCount=this.items.reduce((e,t)=>(t.tokenCount=b.countTokensInText(typeof t.data=="string"?t.data:JSON.stringify(t.data))+b.countTokensInText(this.separator)+this.itemPadding,e+t.tokenCount),0)}add(e){typeof e=="string"&&(e={source:"user",data:e});let t=e;t.id===void 0&&(t.id=se()),!t.sections?.length&&typeof t.data=="string"?t.text=t.data:t.text=t.sections?.map(s=>{if(s.type==="text")return s.text||"";if(s.type==="tool_call")return`[Tool Call: ${s.toolKbName||s.toolName}] `;if(s.type==="tool_result"&&s.toolErrorResponse)return`[Tool Error: ${s.toolErrorResponse}] `}).filter(s=>!!s).join(`
11
11
 
12
- `)||"";let n=this.items.find(s=>s.id===t.id);return n?(this.tokenCount-=n.tokenCount,Object.assign(n,t),t=n):this.items.push(t),t.dateAdded===void 0&&(t.dateAdded=Date.now()),t.sortOrder===void 0&&(t.sortOrder=0),t.disabled===void 0&&(t.disabled=!1),t.source===void 0&&(t.source="user"),t.sections===void 0&&(t.sections=[]),t.tokenCount=t.disabled?0:v.countTokensInText(typeof e.data=="string"?e.data:JSON.stringify(e.data))+v.countTokensInText(this.separator)+this.itemPadding,this.tokenCount+=t.tokenCount,this.items.sort(this.sortFunction),t}getAllAsString(){return this.getAll().map(e=>e.text).join(this.separator)}getAll(){return this.items.filter(e=>!e.disabled)}empty(){this.items=[],this.tokenCount=0}},x=(o=>(o.Text="text",o.ToolCall="tool_call",o.ToolResult="tool_result",o.Thinking="thinking",o.Other="other",o))(x||{});import{v4 as ie}from"uuid";var X=new g("ChatBase"),C=class{constructor(e){this.id="";this.metadata={};this.maxToolCallsPerMessage=10;this.stats={tokensUsed:0};this.tokenWindow=(()=>{let e=new v;return e.createGroup("context").setSeparator(`
12
+ `)||"";let n=this.items.find(s=>s.id===t.id);return n?(this.tokenCount-=n.tokenCount,Object.assign(n,t),t=n):this.items.push(t),t.dateAdded===void 0&&(t.dateAdded=Date.now()),t.sortOrder===void 0&&(t.sortOrder=0),t.disabled===void 0&&(t.disabled=!1),t.source===void 0&&(t.source="user"),t.sections===void 0&&(t.sections=[]),t.tokenCount=t.disabled?0:b.countTokensInText(typeof e.data=="string"?e.data:JSON.stringify(e.data))+b.countTokensInText(this.separator)+this.itemPadding,this.tokenCount+=t.tokenCount,this.items.sort(this.sortFunction),t}getAllAsString(){return this.getAll().map(e=>e.text).join(this.separator)}getAll(){return this.items.filter(e=>!e.disabled)}empty(){this.items=[],this.tokenCount=0}},x=(o=>(o.Text="text",o.ToolCall="tool_call",o.ToolResult="tool_result",o.Thinking="thinking",o.Other="other",o))(x||{});import{v4 as oe}from"uuid";var X=new g("ChatBase"),C=class{constructor(e){this.id="";this.metadata={};this.maxToolCallsPerMessage=10;this.stats={tokensUsed:0};this.tokenWindow=(()=>{let e=new b;return e.createGroup("context").setSeparator(`
13
13
 
14
- `),e.createGroup("actions").setItemPadding(25),e.createGroup("messages").setItemPadding(10),e})();this.config=e,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 e=this.config.endpoint;return e.endsWith("/chat/completions")&&(e=e.substring(0,e.length-17)),e}async sendMessage(e,t){throw new Error("Not implemented")}addUserMessage(e){throw new Error("Not implemented")}addAssistantMessage(e){throw new Error("Not implemented")}addTextMessage(e,t,n){this.messageGroup.add({id:"msg-"+ie(),source:t,data:n,sections:[{type:"text",text:e}]})}onBeforeIncomingMessage(e){}resetConversation(){this.messageGroup.empty(),this.toolGroup.empty(),this.contextGroup.empty()}async trimMessages(){this.tokenWindow.removeOverflow()}registerTool(e){return this.toolGroup.add({id:e.name,data:e,cannotRemove:!e.canRemove,sortOrder:101,disabled:!!e.kbItem?.disabled})}findToolBySafeName(e){return this.toolGroup.getAll().find(t=>t.id==e||t.data?.kbItem?.name==e)?.data}async executeTool(e,t){if(!e)throw new Error("Tool not found");X.debug(`Executing tool '${e.name}'`,t,e),this.config.onAIToolStart?.(e.kbItem?.name||e.name,t);let n;try{n=await e.callback(t)}catch(s){throw X.error(`Error executing tool '${e.name}'`,s),s}return typeof n!="string"&&(n=JSON.stringify(n)||""),(n===""||n==="undefined")&&(n="success"),n}};import{v4 as ae}from"uuid";var $=new g("ChatGPT"),M=class extends C{addUserMessage(e){this.addTextMessage(e,"user",{role:"user",content:e||""})}addAssistantMessage(e){this.addTextMessage(e,"assistant",{role:"assistant",content:e||""})}createOpenAIClient(){return new re({apiKey:this.config.apiKey,baseURL:this.getBaseURL(),dangerouslyAllowBrowser:!0})}async sendMessage(e,t){this.addUserMessage(e);let n=this.createOpenAIClient(),s=!0,o=[];for(;s;){let a="msg-"+ae();s=!1,await this.config.onBeforeMessageProcessing?.(),await this.trimMessages(),$.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 u=this.toolGroup.getAll().filter(c=>!!c?.data).map(c=>({type:"function",function:{name:c.data.name,description:c.data.description||"",parameters:{type:"object",...c.data?.params}}})),i,l;if(this.config.stream){let c=n.chat.completions.stream({model:this.config.model,messages:[{role:"system",content:this.contextGroup.getAllAsString()},...this.messageGroup.getAll().map(p=>p.data)],tools:u,stream:!0,parallel_tool_calls:!0,stream_options:{include_usage:!0}});for await(let p of c){let m=c.currentChatCompletionSnapshot?.choices?.[0]?.message;if(!m)continue;let f=this.parseMessageBlock(a,m,void 0,!0);this.config.onAIMessage?.([...o,f],!0),t?.([...o,f])}i=await c.finalMessage(),l=await c.totalUsage()}else{let c=await n.chat.completions.create({model:this.config.model,messages:[{role:"system",content:this.contextGroup.getAllAsString()},...this.messageGroup.getAll().map(p=>p.data)],tools:u,parallel_tool_calls:!0});i=c.choices[0].message,l=c.usage}i.role=="assistant"&&!i.content&&!i.tool_calls?.length&&(i.content=""),$.debug("Message received",i);let r=this.messageGroup.add(this.parseMessageBlock(a,i,l,!1));o.push(r),await Promise.all((i.tool_calls||[]).map(async c=>{if(c.type!="function")return;let p=this.findToolBySafeName(c.function.name);try{let m=null;try{m=c.function.arguments?JSON.parse(c.function.arguments):null}catch(ne){throw new Error(`The AI provided invalid JSON arguments for tool call ${c.function.name}: ${ne.message}`)}let f=await this.executeTool(p,m),G=this.messageGroup.add({source:"user",sections:[{type:"tool_result",toolName:c.function.name,toolKbID:p?.kbItem?.id,toolKbName:p?.kbItem?.name,toolSuccessResponse:f,toolCallInstanceID:c.id,toolCallHiddenInUI:p?.kbItem?.hideActionInUI}],data:{role:"tool",tool_call_id:c.id,content:f}});o.push(G)}catch(m){let f=m?.message||"An unknown error occurred",G=this.messageGroup.add({source:"user",sections:[{type:"tool_result",toolName:c.function.name,toolKbID:p?.kbItem?.id,toolKbName:p?.kbItem?.name,toolErrorResponse:f,toolCallInstanceID:c.id,toolCallHiddenInUI:p?.kbItem?.hideActionInUI}],data:{role:"tool",tool_call_id:c.id,content:`Error performing tool call ${c.function.name}: ${f}`}});o.push(G)}s=!0,this.config.onAIMessage?.(o,!0),t?.(o)})),this.stats.tokensUsed+=l?.total_tokens||0}return this.config.onAIMessage?.(o,!1),t?.(o),o}parseMessageBlock(e,t,n,s){let o=[];t.reasoning&&o.push({type:"thinking",text:t.reasoning});for(let a of t.tool_calls||[]){if(a.type!="function")continue;let u=this.findToolBySafeName(a.function.name),i=null;if(a.function.arguments)try{i=JSON.parse(a.function.arguments)}catch(l){s||$.error(`Failed to parse tool parameters for tool call ${a.function.name}:`,l)}o.push({type:"tool_call",toolName:a.function.name,toolKbID:u?.kbItem?.id,toolKbName:u?.kbItem?.name,toolCallInstanceID:a.id,toolCallHiddenInUI:u?.kbItem?.hideActionInUI,toolParameters:i})}return typeof t.content=="string"&&o.push({type:"text",text:t.content||""}),{id:e,data:t,sections:o,source:"assistant",usage:{inputTokens:n?.prompt_tokens||0,outputTokens:n?.completion_tokens||0,cachedInputTokens:0,totalTokens:(n?.prompt_tokens||0)+(n?.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 le from"@anthropic-ai/sdk";import{v4 as ue}from"uuid";var Y=new g("AnthropicChat"),P=class extends C{addUserMessage(e){this.addTextMessage(e,"user",{role:"user",content:e||""})}addAssistantMessage(e){this.addTextMessage(e,"assistant",{role:"assistant",content:e||""})}async sendMessage(e,t){this.addUserMessage(e);let n=new le({apiKey:this.config.apiKey,baseURL:this.getBaseURL(),dangerouslyAllowBrowser:!0}),s=!0,o=[];for(;s;){s=!1,await this.config.onBeforeMessageProcessing?.(),await this.trimMessages(),Y.debug("Before processing state",{messages:this.messageGroup.getAll().map(r=>r.data),tools:this.toolGroup.getAll().map(r=>r.data),context:this.contextGroup.getAll().map(r=>r.text)});let a=this.toolGroup.getAll().map(r=>({name:r.data?.name||"",description:r.data?.description||"",input_schema:{...r.data?.params,type:"object"}})),u;if(this.config.stream){let r=n.messages.stream({model:this.config.model,max_tokens:16e3,system:this.contextGroup.getAllAsString(),messages:this.messageGroup.getAll().map(c=>c.data),tools:a,stream:!0});r.on("streamEvent",(c,p)=>{let m=this.parseMessageBlock(p);this.config.onAIMessage?.([...o,m],!0),t?.([...o,m])});try{u=await r.finalMessage()}catch(c){throw c?.error?.error?.message?c.error.error:c}}else try{u=await n.messages.create({model:this.config.model,max_tokens:16e3,system:this.contextGroup.getAllAsString(),messages:this.messageGroup.items.map(r=>r.data),tools:a})}catch(r){throw r?.error?.error?.message?r.error.error:r}if(Y.debug("Message received",u),u.content?.length){let r=this.messageGroup.add(this.parseMessageBlock(u));o.push(r)}let i=[],l=[];if(await Promise.all(u.content.map(async r=>{if(r.type!="tool_use")return;let c=this.findToolBySafeName(r.name);try{let p=await this.executeTool(c,r.input);l.push({type:"tool_result",tool_use_id:r.id,content:p}),i.push({type:"tool_result",toolKbID:c?.kbItem?.id,toolKbName:c?.kbItem?.name,toolName:r.name,toolSuccessResponse:p,toolCallInstanceID:r.id,toolCallHiddenInUI:c?.kbItem?.hideActionInUI})}catch(p){let m=p?.message||"An unknown error occurred";l.push({type:"tool_result",tool_use_id:r.id,content:`Error performing tool call ${r.name}: ${m}`}),i.push({type:"tool_result",toolKbID:c?.kbItem?.id,toolKbName:c?.kbItem?.name,toolName:r.name,toolErrorResponse:m,toolCallInstanceID:r.id,toolCallHiddenInUI:c?.kbItem?.hideActionInUI})}})),l.length>0){let r=this.messageGroup.add({id:"msg-"+ue(),sections:i,data:{role:"user",content:l}});o.push(r),s=!0,this.config.onAIMessage?.(o,!0),t?.(o)}this.stats.tokensUsed+=u.usage.input_tokens+u.usage.output_tokens}return this.config.onAIMessage?.(o,!1),t?.(o),o}parseMessageBlock(e){let t=[];for(let n of e.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 s=this.findToolBySafeName(n.name);t.push({type:"tool_call",toolName:n.name,toolKbID:s?.kbItem?.id,toolKbName:s?.kbItem?.name,toolParameters:n.input,toolCallInstanceID:n.id,toolCallHiddenInUI:s?.kbItem?.hideActionInUI})}return{id:e.id,data:{role:e.role,content:e.content},sections:t,source:"assistant",usage:{inputTokens:e.usage?.input_tokens||0,outputTokens:e.usage?.output_tokens||0,cachedInputTokens:e.usage?.cache_read_input_tokens||0,totalTokens:(e.usage?.input_tokens||0)+(e.usage?.output_tokens||0)}}}async trimMessages(){for(await super.trimMessages();this.messageGroup.items[0]?.data?.content?.type=="tool_result";)this.messageGroup.items.shift()}};import we from"minisearch";var Q=d=>[{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",parameters:[{name:"query",type:"string",description:"The search query"}],action:async(e,t)=>{let n=await t.knowledgeBase.search(e.query),s=t;s._lastKBsearch=e.query,s._nextRequestUseKBitems=n;let o=n.filter(u=>u.type!="action").map(u=>"- "+u.name).join(`
15
- `)||"- (none)",a=n.filter(u=>u.type=="action").map(u=>"- "+u._functionID).join(`
14
+ `),e.createGroup("actions").setItemPadding(25),e.createGroup("messages").setItemPadding(10),e})();this.config=e,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 e=this.config.endpoint;return e.endsWith("/chat/completions")&&(e=e.substring(0,e.length-17)),e}async sendMessage(e,t){throw new Error("Not implemented")}addUserMessage(e){throw new Error("Not implemented")}addAssistantMessage(e){throw new Error("Not implemented")}addTextMessage(e,t,n){this.messageGroup.add({id:"msg-"+oe(),source:t,data:n,sections:[{type:"text",text:e}]})}onBeforeIncomingMessage(e){}resetConversation(){this.messageGroup.empty(),this.toolGroup.empty(),this.contextGroup.empty()}async trimMessages(){this.tokenWindow.removeOverflow()}registerTool(e){return this.toolGroup.add({id:e.name,data:e,cannotRemove:!e.canRemove,sortOrder:101,disabled:!!e.kbItem?.disabled})}findToolBySafeName(e){return this.toolGroup.getAll().find(t=>t.id==e||t.data?.kbItem?.name==e)?.data}async executeTool(e,t){if(!e)throw new Error("Tool not found");X.debug(`Executing tool '${e.name}'`,t,e),this.config.onAIToolStart?.(e.kbItem?.name||e.name,t);let n;try{n=await e.callback(t)}catch(s){throw X.error(`Error executing tool '${e.name}'`,s),s}return typeof n!="string"&&(n=JSON.stringify(n)||""),(n===""||n==="undefined")&&(n="success"),n}};import{v4 as re}from"uuid";var $=new g("ChatGPT"),M=class extends C{addUserMessage(e){this.addTextMessage(e,"user",{role:"user",content:e||""})}addAssistantMessage(e){this.addTextMessage(e,"assistant",{role:"assistant",content:e||""})}createOpenAIClient(){return new ie({apiKey:this.config.apiKey,baseURL:this.getBaseURL(),dangerouslyAllowBrowser:!0})}async sendMessage(e,t){this.addUserMessage(e);let n=this.createOpenAIClient(),s=!0,o=[];for(;s;){let r="msg-"+re();s=!1,await this.config.onBeforeMessageProcessing?.(),await this.trimMessages(),$.debug("Before processing state",{messages:this.messageGroup.getAll().map(l=>l.data),tools:this.toolGroup.getAll().map(l=>l.data),context:this.contextGroup.getAll().map(l=>l.text)});let c=this.toolGroup.getAll().filter(l=>!!l?.data).map(l=>({type:"function",function:{name:l.data.name,description:l.data.description||"",parameters:{type:"object",...l.data?.params}}})),a,u;if(this.config.stream){let l=n.chat.completions.stream({model:this.config.model,messages:[{role:"system",content:this.contextGroup.getAllAsString()},...this.messageGroup.getAll().map(p=>p.data)],tools:c,stream:!0,parallel_tool_calls:!0,stream_options:{include_usage:!0}});for await(let p of l){let h=l.currentChatCompletionSnapshot?.choices?.[0]?.message;if(!h)continue;let f=this.parseMessageBlock(r,h,void 0,!0);this.config.onAIMessage?.([...o,f],!0),t?.([...o,f])}a=await l.finalMessage(),u=await l.totalUsage()}else{let l=await n.chat.completions.create({model:this.config.model,messages:[{role:"system",content:this.contextGroup.getAllAsString()},...this.messageGroup.getAll().map(p=>p.data)],tools:c,parallel_tool_calls:!0});a=l.choices[0].message,u=l.usage}a.role=="assistant"&&!a.content&&!a.tool_calls?.length&&(a.content=""),$.debug("Message received",a);let i=this.messageGroup.add(this.parseMessageBlock(r,a,u,!1));o.push(i),await Promise.all((a.tool_calls||[]).map(async l=>{if(l.type!="function")return;let p=this.findToolBySafeName(l.function.name);try{let h=null;try{h=l.function.arguments?JSON.parse(l.function.arguments):null}catch(te){throw new Error(`The AI provided invalid JSON arguments for tool call ${l.function.name}: ${te.message}`)}let f=await this.executeTool(p,h),U=this.messageGroup.add({source:"user",sections:[{type:"tool_result",toolName:l.function.name,toolKbID:p?.kbItem?.id,toolKbName:p?.kbItem?.name,toolSuccessResponse:f,toolCallInstanceID:l.id,toolCallHiddenInUI:p?.kbItem?.hideActionInUI}],data:{role:"tool",tool_call_id:l.id,content:f}});o.push(U)}catch(h){let f=h?.message||"An unknown error occurred",U=this.messageGroup.add({source:"user",sections:[{type:"tool_result",toolName:l.function.name,toolKbID:p?.kbItem?.id,toolKbName:p?.kbItem?.name,toolErrorResponse:f,toolCallInstanceID:l.id,toolCallHiddenInUI:p?.kbItem?.hideActionInUI}],data:{role:"tool",tool_call_id:l.id,content:`Error performing tool call ${l.function.name}: ${f}`}});o.push(U)}s=!0,this.config.onAIMessage?.(o,!0),t?.(o)})),this.stats.tokensUsed+=u?.total_tokens||0}return this.config.onAIMessage?.(o,!1),t?.(o),o}parseMessageBlock(e,t,n,s){let o=[];t.reasoning&&o.push({type:"thinking",text:t.reasoning});for(let r of t.tool_calls||[]){if(r.type!="function")continue;let c=this.findToolBySafeName(r.function.name),a=null;if(r.function.arguments)try{a=JSON.parse(r.function.arguments)}catch(u){s||$.error(`Failed to parse tool parameters for tool call ${r.function.name}:`,u)}o.push({type:"tool_call",toolName:r.function.name,toolKbID:c?.kbItem?.id,toolKbName:c?.kbItem?.name,toolCallInstanceID:r.id,toolCallHiddenInUI:c?.kbItem?.hideActionInUI,toolParameters:a})}return typeof t.content=="string"&&o.push({type:"text",text:t.content||""}),{id:e,data:t,sections:o,source:"assistant",streamingInProgress:s,usage:{inputTokens:n?.prompt_tokens||0,outputTokens:n?.completion_tokens||0,cachedInputTokens:0,totalTokens:(n?.prompt_tokens||0)+(n?.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 ae from"@anthropic-ai/sdk";import{v4 as le}from"uuid";var Y=new g("AnthropicChat"),P=class extends C{addUserMessage(e){this.addTextMessage(e,"user",{role:"user",content:e||""})}addAssistantMessage(e){this.addTextMessage(e,"assistant",{role:"assistant",content:e||""})}async sendMessage(e,t){this.addUserMessage(e);let n=new ae({apiKey:this.config.apiKey,baseURL:this.getBaseURL(),dangerouslyAllowBrowser:!0}),s=!0,o=[];for(;s;){s=!1,await this.config.onBeforeMessageProcessing?.(),await this.trimMessages(),Y.debug("Before processing state",{messages:this.messageGroup.getAll().map(i=>i.data),tools:this.toolGroup.getAll().map(i=>i.data),context:this.contextGroup.getAll().map(i=>i.text)});let r=this.toolGroup.getAll().map(i=>({name:i.data?.name||"",description:i.data?.description||"",input_schema:{...i.data?.params,type:"object"}})),c;if(this.config.stream){let i=n.messages.stream({model:this.config.model,max_tokens:16e3,system:this.contextGroup.getAllAsString(),messages:this.messageGroup.getAll().map(l=>l.data),tools:r,stream:!0});i.on("streamEvent",(l,p)=>{let h=this.parseMessageBlock(p,!0);this.config.onAIMessage?.([...o,h],!0),t?.([...o,h])});try{c=await i.finalMessage()}catch(l){throw l?.error?.error?.message?l.error.error:l}}else try{c=await n.messages.create({model:this.config.model,max_tokens:16e3,system:this.contextGroup.getAllAsString(),messages:this.messageGroup.items.map(i=>i.data),tools:r})}catch(i){throw i?.error?.error?.message?i.error.error:i}if(Y.debug("Message received",c),c.content?.length){let i=this.messageGroup.add(this.parseMessageBlock(c,!1));o.push(i)}let a=[],u=[];if(await Promise.all(c.content.map(async i=>{if(i.type!="tool_use")return;let l=this.findToolBySafeName(i.name);try{let p=await this.executeTool(l,i.input);u.push({type:"tool_result",tool_use_id:i.id,content:p}),a.push({type:"tool_result",toolKbID:l?.kbItem?.id,toolKbName:l?.kbItem?.name,toolName:i.name,toolSuccessResponse:p,toolCallInstanceID:i.id,toolCallHiddenInUI:l?.kbItem?.hideActionInUI})}catch(p){let h=p?.message||"An unknown error occurred";u.push({type:"tool_result",tool_use_id:i.id,content:`Error performing tool call ${i.name}: ${h}`}),a.push({type:"tool_result",toolKbID:l?.kbItem?.id,toolKbName:l?.kbItem?.name,toolName:i.name,toolErrorResponse:h,toolCallInstanceID:i.id,toolCallHiddenInUI:l?.kbItem?.hideActionInUI})}})),u.length>0){let i=this.messageGroup.add({id:"msg-"+le(),sections:a,data:{role:"user",content:u}});o.push(i),s=!0,this.config.onAIMessage?.(o,!0),t?.(o)}this.stats.tokensUsed+=c.usage.input_tokens+c.usage.output_tokens}return this.config.onAIMessage?.(o,!1),t?.(o),o}parseMessageBlock(e,t){let n=[];for(let s of e.content)if(s.type=="thinking")n.push({type:"thinking",text:s.thinking||""});else if(s.type=="text")n.push({type:"text",text:s.text||""});else if(s.type=="tool_use"){let o=this.findToolBySafeName(s.name);n.push({type:"tool_call",toolName:s.name,toolKbID:o?.kbItem?.id,toolKbName:o?.kbItem?.name,toolParameters:s.input,toolCallInstanceID:s.id,toolCallHiddenInUI:o?.kbItem?.hideActionInUI})}return{id:e.id,data:{role:e.role,content:e.content},sections:n,source:"assistant",streamingInProgress:t,usage:{inputTokens:e.usage?.input_tokens||0,outputTokens:e.usage?.output_tokens||0,cachedInputTokens:e.usage?.cache_read_input_tokens||0,totalTokens:(e.usage?.input_tokens||0)+(e.usage?.output_tokens||0)}}}async trimMessages(){for(await super.trimMessages();this.messageGroup.items[0]?.data?.content?.type=="tool_result";)this.messageGroup.items.shift()}};import we from"minisearch";var Q=d=>[{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",parameters:[{name:"query",type:"string",description:"The search query"}],action:async(e,t)=>{let n=await t.knowledgeBase.search(e.query),s=t;s._lastKBsearch=e.query,s._nextRequestUseKBitems=n;let o=n.filter(c=>c.type!="action").map(c=>"- "+c.name).join(`
15
+ `)||"- (none)",r=n.filter(c=>c.type=="action").map(c=>"- "+c._functionID).join(`
16
16
  `)||"- (none)";return`Search complete, context has been updated.
17
17
  New information found:
18
18
  ${o}
19
19
 
20
20
  New tools available:
21
- ${a}`}},{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"||!d?.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:(e,t)=>{if(typeof window>"u")throw new Error("This action is only available in browser environments.");if(!t.flags.allowOpenNewTab)throw new Error("Open New Tab action is not enabled for this persona.");if(!e.url||typeof e.url!="string")throw new Error("URL parameter is required and must be a string.");if(!window.open(e.url,"_blank"))throw new Error("Window blocked by popup blocker. Please allow popups for this site.");return`Opened URL: ${e.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"||!d?.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:(e,t)=>{if(typeof window>"u")throw new Error("This action is only available in browser environments.");if(!t.flags.allowChangeRoute)throw new Error("Change Route action is not enabled for this persona.");if(!e.path||typeof e.path!="string")throw new Error("Path parameter is required and must be a string.");let n=new URL(e.path,window.location.origin).pathname;return window.location.href=n,`Changed route to: ${n}`}},{id:"ui.sendEmail",type:"action",name:"Send an email",tags:"email, send, mail, compose, message, contact, mailto",isContext:!0,disabled:typeof window>"u"||!d?.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:(e,t)=>{if(typeof window>"u")throw new Error("This action is only available in browser environments.");if(!t.flags.allowSendEmail)throw new Error("Send Email action is not enabled for this persona.");if(!e.email_address||typeof e.email_address!="string")throw new Error("Email address parameter is required and must be a string.");if(!e.subject||typeof e.subject!="string")throw new Error("Subject parameter is required and must be a string.");if(!e.body||typeof e.body!="string")throw new Error("Body parameter is required and must be a string.");let n=encodeURIComponent(e.email_address),s=encodeURIComponent(e.subject),o=encodeURIComponent(e.body),a=`mailto:${n}?subject=${s}&body=${o}`;try{window.location.href=a}catch(u){throw new Error(`Failed to open email client: ${u instanceof Error?u.message:String(u)}`)}return`Email opened in default mail client. Recipient: ${e.email_address}, Subject: ${e.subject}`}}];import{Client as Z}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as de}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{SSEClientTransport as pe}from"@modelcontextprotocol/sdk/client/sse.js";var b={name:"@intelliweave/embedded",version:"2.0.72-beta.7",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.64","@types/lodash":"^4.17.13","@types/react":"^18.3.12","@types/uuid":"^10.0.0",bestzip:"^2.2.1","cross-env":"^7.0.3","find-cache-dir":"^5.0.0",lodash:"^4.17.21","onnxruntime-web":"^1.20.0",react:"^18.3.1","replace-in-file":"^8.2.0",tsup:"^8.3.5",tsx:"^4.19.2",typedoc:"^0.27.6",vitest:"^3.2.4"},peerDependencies:{"onnxruntime-web":"^1.20.0",react:"^18 || ^19"},dependencies:{"@anthropic-ai/sdk":"^0.60.0","@modelcontextprotocol/sdk":"^1.24.1","@types/json-schema":"^7.0.15",minisearch:"^6.3.0",openai:"^6.10.0","rehype-document":"^7.0.3","rehype-external-links":"^3.0.0","rehype-format":"^5.0.0","rehype-stringify":"^10.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.0",unified:"^11.0.4","utility-types":"^3.11.0",uuid:"^10.0.0"}};import{LoggingMessageNotificationSchema as he,ToolListChangedNotificationSchema as me}from"@modelcontextprotocol/sdk/types.js";var h=new g("MCPKnowledgeClient"),W=class{constructor(e){this.tools=[];this.iwActions=[];this.stats={toolsCalled:0};this.lastSearchQuery="";this.lastSearchResults=[];this.config=e}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(){h.debug("Connecting to MCP client");let e=this.config.connect?await this.config.connect():await Promise.resolve().then(async()=>{let t=new Z({name:b.name,version:b.version}),n=new de(new URL(this.config.baseURL));return await t.connect(n),h.debug("Connected with HTTP streaming mode"),t}).catch(async t=>{let n=new Z({name:b.name,version:b.version}),s=new pe(new URL(this.config.baseURL));return await n.connect(s),h.debug("Connected with SSE mode"),n});return await this.disconnect(),this.client=e,e.onerror=t=>{h.error(`MCP client error: ${t.message}`)},e.onclose=()=>{h.debug("MCP client connection closed"),this.client=void 0},e.setNotificationHandler(he,t=>{t.params.level=="critical"?h.error(`[Server] ${t.params.data}`):t.params.level=="emergency"?h.error(`[Server] ${t.params.data}`):t.params.level=="error"?h.error(`[Server] ${t.params.data}`):t.params.level=="warning"?h.warn(`[Server] ${t.params.data}`):t.params.level=="info"?h.info(`[Server] ${t.params.data}`):t.params.level=="debug"?h.debug(`[Server] ${t.params.data}`):h.log(`[Server] ${t.params.data}`)}),e.setNotificationHandler(me,t=>{h.debug("Tool list changed",t),this.fetchTools()}),h.debug("Fetching tools from MCP server..."),await this.fetchTools(),e}async disconnect(){await this.client?.close(),this.client=void 0,this.tools=[],this.iwActions=[]}async fetchTools(){let e=[],t;for(;;){let s=await this.client.listTools({cursor:t});t=s.nextCursor;for(let o of s.tools||[])e.push(o);if(!s?.tools?.length||!t)break}let n=[];for(let s of e){let o=!!(this.config.searchToolName&&s.name==this.config.searchToolName&&!this.config.searchToolVisible);n.push({id:s.name,name:s.name,content:s.description||"",type:"action",isContext:!0,parameters:s.inputSchema,action:a=>this.performToolCall(s.name,a),disabled:o})}h.debug(`Fetched ${e.length} tools from MCP server.`),this.tools=e,this.iwActions=n}async search(e){if(e==this.lastSearchQuery)return this.lastSearchResults;await this.connect();let t=this.iwActions.slice(),n=await this.performSearchCall(e);return t=t.concat(n),this.lastSearchQuery=e,this.lastSearchResults=t,h.debug(`Search completed, found ${t.length} items.`),t}async performSearchCall(e){let t=[];if(!this.config.searchToolName)return t;let n=this.tools.find(o=>o.name==this.config.searchToolName);if(!n)return h.warn(`Search function ${this.config.searchToolName} not found on the MCP server.`),t;let s;if(n.inputSchema.required?.length==1){let o=n.inputSchema.required[0];s=await this.performToolCall(this.config.searchToolName,{[o]:e})}else if(n.inputSchema.properties&&Object.keys(n.inputSchema.properties).length==1){let o=Object.keys(n.inputSchema.properties)[0];s=await this.performToolCall(this.config.searchToolName,{[o]:e})}else s=await this.performToolCall(this.config.searchToolName,{});if(Array.isArray(s))for(let o=0;o<s.length;o++){let a=s[o];t.push({id:this.config.id+":"+this.config.searchToolName+":"+o,name:`Search result ${o+1} in ${this.config.searchToolName}`,type:"info",content:typeof a=="string"?a:JSON.stringify(a)})}else t.push({id:this.config.id+":"+this.config.searchToolName+":result",name:`Search result in ${this.config.searchToolName}`,type:"info",content:typeof s=="string"?s:JSON.stringify(s)});return t}async performToolCall(e,t){await this.connect(),h.debug(`Performing tool call for ${e} with params:`,t),this.stats.toolsCalled+=1;let n=await this.client.callTool({name:e,arguments:t});if(n.isError){let s=n.content?.[0]?.text||"Unknown error";throw h.error(`Error calling tool ${e}: ${s}`),new Error(`Error calling tool ${e}: ${s}`)}if(Array.isArray(n.content)&&n.content.length==1&&n.content[0].type=="text")try{return JSON.parse(n.content[0].text)}catch{}return n.content||[]}};import{v4 as ge}from"uuid";var fe=new g("Statistics"),_=[];async function I(d,e){let t={...e,event_id:ge(),event_date:new Date().toISOString(),sdk_version:b.version,conversation_id:d?.conversationID||"",api_key:d?.apiKey||"",user_id:d?.userID||""};if(_.push(t),!d||(await new Promise(s=>setTimeout(s,5e3)),_.length===0))return;let n=_.slice();_.length=0;try{let s=await fetch(d.hubAPI+"/analytics/stats",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({events:n})});if(!s.ok)throw new Error(`Analytics submission failed: ${s.status} ${s.statusText}`)}catch(s){fe.warn("Failed to submit analytics event:",s),_.push(...n);return}}var k=new g("KnowledgeBase"),j=1,D=class d{constructor(e){this._sources=[];this._windowSources=[];this.lastResults=[];this.manualEntries=[];this.allowWindowSources=!0;this.allowGlobalConfigSources=!0;this.ai=e,this.ensureInternalKnowledge()}ensureInternalKnowledge(){this._sources=this._sources.filter(e=>e.id!=="core.internal"),this._sources.push({id:"core.internal",query:async()=>Q(this.ai)})}reset(){this._windowSources=[],this.manualEntries=[],this.lastResults=[],this._sources=[],this.ensureInternalKnowledge()}registerSource(e,t){let n=e;return typeof e=="function"&&(t=e,n=`source.${j++}`),this._sources.push({id:n,query:t}),n}removeSource(e){this._sources=this.sources.filter(t=>t.id!==e&&t.query!==e)}addEntry(e){this.manualEntries.push(e)}removeEntry(e){this.manualEntries=this.manualEntries.filter(t=>t.id!==e)}get sources(){let e=this._sources;return this.allowGlobalConfigSources&&w().knowledgeBaseSources&&(e=e.concat(w().knowledgeBaseSources)),this.allowWindowSources&&typeof document<"u"&&(e=e.concat(this._windowSources)),e=e.filter(t=>!t.disabled),e}async search(e){k.debug(`Searching knowledge base for: ${e}`);let t=Date.now(),n=new Event("webweaver_kb_search",{bubbles:!0,cancelable:!0});n.query=e,n.entries=[],n.sources=[],this.allowWindowSources&&typeof document<"u"?(document.dispatchEvent(n),this._windowSources=n.sources):this._windowSources=[];let o=(await Promise.all(this.sources.map(async l=>{try{let r=Date.now(),c=await l.query(e);return k.debug(`Source '${l.id}' took ${Date.now()-r}ms`),c||[]}catch(r){return k.warn(`Knowledge source '${l.id}' failed:`,r),[]}}))).flat();o=o.concat(n.entries),o=o.concat(this.manualEntries),this.allowGlobalConfigSources&&w().knowledgeBase&&(o=o.concat(w().knowledgeBase)),o=o.filter(l=>l&&!l.disabled);for(let l=0;l<o.length;l++){let r=o[l];r.id=r.id||`temp.${l}`,r._functionID=r.id.replaceAll(/[^a-zA-Z0-9_]/g,"_")}let a=new we({fields:["id","type","name","content","tags"],storeFields:[],searchOptions:{boost:{name:3,tags:2},fuzzy:.2}});a.addAll(o);let i=a.search(e).map(l=>o.find(r=>r.id==l.id));for(let l of o)l.isContext&&(i.find(r=>r.id===l.id)||i.push(l));return this.lastResults=i,I(this.ai,{event_type:"kb_search",value:i.length,value_str:"",event_properties:{search_time_ms:Date.now()-t,sources_searched:this.sources.length}}),k.debug("Found results:",i),i}getCachedEntry(e){return this.lastResults.find(t=>t.id==e||t._functionID==e)}registerSourceFromURL(e,t){t||(t=`external.${j++}`),k.debug(`Registering remote knowledge base source: ${e}`);let n=[],s=[],o=!0,a=async(i,l)=>{k.debug(`Calling remote knowledge base action: ${i.id}`);let r={type:"action",userID:this.ai.userID,actionID:i.id,parameters:l},c=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});if(!c.ok)throw new Error(`HTTP Error ${c.status} ${c.statusText}`);let p=await c.json();return u(p.updateItems||[]),p.response},u=i=>{for(let l of i){if(!l.id){k.warn("KB item skipped since it has no ID.",l);continue}let r=n.find(c=>c.id==l.id);if(r){r.name=l.name||r.name||"",r.content=l.content||r.content||"",r.disabled=l.disabled??r.disabled,r.isContext=l.isContext??r.isContext,r.parameters=l.parameters||r.parameters||[],r.tags=l.tags||r.tags,r.type=l.type||r.type;continue}n.push({...l,action:c=>a(l,c)})}};this.registerSource(t,async i=>{if(o&&s.includes(i))return n;let l={type:"search",userID:this.ai?.userID||"",query:i},r=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)});if(!r.ok)throw new Error(`HTTP Error ${r.status} ${r.statusText}`);let c=await r.json();return o=!c.noCache,s.includes(i)||s.push(i),u(c.items),n})}clone(){let e=new d(this.ai);return e._sources=this._sources,e._windowSources=this._windowSources,e.manualEntries=this.manualEntries,e.ensureInternalKnowledge(),e}registerMCPSource(e){e.id||(e.id=`external.${j++}`);let t=new W(e);return this.registerSource(e.id,n=>t.search(n)),t}};var O=class{constructor(e){this.messages=e}text(){return this.messages?.flatMap(e=>e.sections)?.filter(e=>e?.type=="text")?.map(e=>e?.text||"")?.filter(e=>!!e)?.join(`
21
+ ${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"||!d?.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:(e,t)=>{if(typeof window>"u")throw new Error("This action is only available in browser environments.");if(!t.flags.allowOpenNewTab)throw new Error("Open New Tab action is not enabled for this persona.");if(!e.url||typeof e.url!="string")throw new Error("URL parameter is required and must be a string.");if(!window.open(e.url,"_blank"))throw new Error("Window blocked by popup blocker. Please allow popups for this site.");return`Opened URL: ${e.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"||!d?.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:(e,t)=>{if(typeof window>"u")throw new Error("This action is only available in browser environments.");if(!t.flags.allowChangeRoute)throw new Error("Change Route action is not enabled for this persona.");if(!e.path||typeof e.path!="string")throw new Error("Path parameter is required and must be a string.");let n=new URL(e.path,window.location.origin).pathname;return window.location.href=n,`Changed route to: ${n}`}},{id:"ui.sendEmail",type:"action",name:"Send an email",tags:"email, send, mail, compose, message, contact, mailto",isContext:!0,disabled:typeof window>"u"||!d?.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:(e,t)=>{if(typeof window>"u")throw new Error("This action is only available in browser environments.");if(!t.flags.allowSendEmail)throw new Error("Send Email action is not enabled for this persona.");if(!e.email_address||typeof e.email_address!="string")throw new Error("Email address parameter is required and must be a string.");if(!e.subject||typeof e.subject!="string")throw new Error("Subject parameter is required and must be a string.");if(!e.body||typeof e.body!="string")throw new Error("Body parameter is required and must be a string.");let n=encodeURIComponent(e.email_address),s=encodeURIComponent(e.subject),o=encodeURIComponent(e.body),r=`mailto:${n}?subject=${s}&body=${o}`;try{window.location.href=r}catch(c){throw new Error(`Failed to open email client: ${c instanceof Error?c.message:String(c)}`)}return`Email opened in default mail client. Recipient: ${e.email_address}, Subject: ${e.subject}`}}];import{Client as ce}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as de}from"@modelcontextprotocol/sdk/client/streamableHttp.js";var v={name:"@intelliweave/embedded",version:"2.0.72-beta.9",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.95","@types/lodash":"^4.17.23","@types/react":"^18.3.12",bestzip:"^2.2.1","cross-env":"^10.1.0","find-cache-dir":"^6.0.0",lodash:"^4.17.23","onnxruntime-web":"^1.20.0",react:"^18.3.1","replace-in-file":"^8.4.0",tsup:"^8.5.1",tsx:"^4.21.0",typedoc:"^0.28.17",vitest:"^4.0.18"},peerDependencies:{"onnxruntime-web":"^1.20.0",react:"^18 || ^19"},dependencies:{"@anthropic-ai/sdk":"^0.74.0","@modelcontextprotocol/sdk":"^1.26.0","@types/json-schema":"^7.0.15",minisearch:"^7.2.0",openai:"^6.22.0","rehype-document":"^7.0.3","rehype-external-links":"^3.0.0","rehype-format":"^5.0.1","rehype-stringify":"^10.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 pe,ToolListChangedNotificationSchema as he}from"@modelcontextprotocol/sdk/types.js";var m=new g("MCPKnowledgeClient"),ge="https://intelliweave-mcp-proxy-828827766277.us-central1.run.app",W=class{constructor(e){this.tools=[];this.iwActions=[];this.stats={toolsCalled:0};this.lastSearchQuery="";this.lastSearchResults=[];this.config=e}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(){m.debug("Connecting to MCP client");let e=this.config.connect?await this.config.connect():await Promise.resolve().then(async()=>{let t=new URL(this.config.baseURL),n={};this.config.headers&&(n={...n,...this.config.headers}),this.config.proxy?.enabled&&(n["Mcp-Target-Url"]=t.toString(),n["IntelliWeave-Api-Key"]=this.config.proxy.apiKey||"",t=new URL(this.config.proxy.url||ge));let s=new ce({name:v.name,version:v.version}),o=new de(t,{requestInit:{headers:n}});return await s.connect(o),m.debug("Connected with HTTP streaming mode"),s});return await this.disconnect(),this.client=e,e.onerror=t=>{m.error(`MCP client error: ${t.message}`)},e.onclose=()=>{m.debug("MCP client connection closed"),this.client=void 0},e.setNotificationHandler(pe,t=>{t.params.level=="critical"?m.error(`[Server] ${t.params.data}`):t.params.level=="emergency"?m.error(`[Server] ${t.params.data}`):t.params.level=="error"?m.error(`[Server] ${t.params.data}`):t.params.level=="warning"?m.warn(`[Server] ${t.params.data}`):t.params.level=="info"?m.info(`[Server] ${t.params.data}`):t.params.level=="debug"?m.debug(`[Server] ${t.params.data}`):m.log(`[Server] ${t.params.data}`)}),e.setNotificationHandler(he,t=>{m.debug("Tool list changed",t),this.fetchTools()}),m.debug("Fetching tools from MCP server..."),await this.fetchTools(),e}async disconnect(){await this.client?.close(),this.client=void 0,this.tools=[],this.iwActions=[]}async fetchTools(){let e=[],t;for(;;){let s=await this.client.listTools({cursor:t});t=s.nextCursor;for(let o of s.tools||[])e.push(o);if(!s?.tools?.length||!t)break}let n=[];for(let s of e){let o=!!(this.config.searchToolName&&s.name==this.config.searchToolName&&!this.config.searchToolVisible);n.push({id:s.name,name:s.name,content:s.description||"",type:"action",isContext:!0,parameters:s.inputSchema,action:r=>this.performToolCall(s.name,r),disabled:o})}m.debug(`Fetched ${e.length} tools from MCP server.`),this.tools=e,this.iwActions=n}async search(e){if(e==this.lastSearchQuery)return this.lastSearchResults;await this.connect();let t=this.iwActions.slice(),n=await this.performSearchCall(e);return t=t.concat(n),this.lastSearchQuery=e,this.lastSearchResults=t,m.debug(`Search completed, found ${t.length} items.`),t}async performSearchCall(e){let t=[];if(!this.config.searchToolName)return t;let n=this.tools.find(o=>o.name==this.config.searchToolName);if(!n)return m.warn(`Search function ${this.config.searchToolName} not found on the MCP server.`),t;let s;if(n.inputSchema.required?.length==1){let o=n.inputSchema.required[0];s=await this.performToolCall(this.config.searchToolName,{[o]:e})}else if(n.inputSchema.properties&&Object.keys(n.inputSchema.properties).length==1){let o=Object.keys(n.inputSchema.properties)[0];s=await this.performToolCall(this.config.searchToolName,{[o]:e})}else s=await this.performToolCall(this.config.searchToolName,{});if(Array.isArray(s))for(let o=0;o<s.length;o++){let r=s[o];t.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 t.push({id:this.config.id+":"+this.config.searchToolName+":result",name:`Search result in ${this.config.searchToolName}`,type:"info",content:typeof s=="string"?s:JSON.stringify(s)});return t}async performToolCall(e,t){await this.connect(),m.debug(`Performing tool call for ${e} with params:`,t),this.stats.toolsCalled+=1;let n=await this.client.callTool({name:e,arguments:t});if(n.isError){let s=n.content?.[0]?.text||"Unknown error";throw m.error(`Error calling tool ${e}: ${s}`),new Error(`Error calling tool ${e}: ${s}`)}if(Array.isArray(n.content)&&n.content.length==1&&n.content[0].type=="text")try{return JSON.parse(n.content[0].text)}catch{}return n.content||[]}};import{v4 as me}from"uuid";var fe=new g("Statistics"),_=[];async function I(d,e){let t={...e,event_id:me(),event_date:new Date().toISOString(),sdk_version:v.version,conversation_id:d?.conversationID||"",api_key:d?.apiKey||"",user_id:d?.userID||""};if(_.push(t),!d||(await new Promise(s=>setTimeout(s,5e3)),_.length===0))return;let n=_.slice();_.length=0;try{let s=await fetch(d.hubAPI+"/analytics/stats",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({events:n})});if(!s.ok)throw new Error(`Analytics submission failed: ${s.status} ${s.statusText}`)}catch(s){fe.warn("Failed to submit analytics event:",s),_.push(...n);return}}var k=new g("KnowledgeBase"),L=1,D=class d{constructor(e){this._sources=[];this._windowSources=[];this.lastResults=[];this.manualEntries=[];this.allowWindowSources=!0;this.allowGlobalConfigSources=!0;this.ai=e,this.ensureInternalKnowledge()}ensureInternalKnowledge(){this._sources=this._sources.filter(e=>e.id!=="core.internal"),this._sources.push({id:"core.internal",query:async()=>Q(this.ai)})}reset(){this._windowSources=[],this.manualEntries=[],this.lastResults=[],this._sources=[],this.ensureInternalKnowledge()}registerSource(e,t){let n=e;return typeof e=="function"&&(t=e,n=`source.${L++}`),this._sources.push({id:n,query:t}),n}removeSource(e){this._sources=this.sources.filter(t=>t.id!==e&&t.query!==e)}addEntry(e){this.manualEntries.push(e)}removeEntry(e){this.manualEntries=this.manualEntries.filter(t=>t.id!==e)}get sources(){let e=this._sources;return this.allowGlobalConfigSources&&y().knowledgeBaseSources&&(e=e.concat(y().knowledgeBaseSources)),this.allowWindowSources&&typeof document<"u"&&(e=e.concat(this._windowSources)),e=e.filter(t=>!t.disabled),e}async search(e){k.debug(`Searching knowledge base for: ${e}`);let t=Date.now(),n=new Event("webweaver_kb_search",{bubbles:!0,cancelable:!0});n.query=e,n.entries=[],n.sources=[],this.allowWindowSources&&typeof document<"u"?(document.dispatchEvent(n),this._windowSources=n.sources):this._windowSources=[];let o=(await Promise.all(this.sources.map(async u=>{try{let i=Date.now(),l=await u.query(e);return k.debug(`Source '${u.id}' took ${Date.now()-i}ms`),l||[]}catch(i){return k.warn(`Knowledge source '${u.id}' failed:`,i),[]}}))).flat();o=o.concat(n.entries),o=o.concat(this.manualEntries),this.allowGlobalConfigSources&&y().knowledgeBase&&(o=o.concat(y().knowledgeBase)),o=o.filter(u=>u&&!u.disabled);for(let u=0;u<o.length;u++){let i=o[u];i.id=i.id||`temp.${u}`,i._functionID=i.id.replaceAll(/[^a-zA-Z0-9_]/g,"_")}let r=new we({fields:["id","type","name","content","tags"],storeFields:[],searchOptions:{boost:{name:3,tags:2},fuzzy:.2}});r.addAll(o);let a=r.search(e).map(u=>o.find(i=>i.id==u.id));for(let u of o)u.isContext&&(a.find(i=>i.id===u.id)||a.push(u));return this.lastResults=a,I(this.ai,{event_type:"kb_search",value:a.length,value_str:"",event_properties:{search_time_ms:Date.now()-t,sources_searched:this.sources.length}}),k.debug("Found results:",a),a}getCachedEntry(e){return this.lastResults.find(t=>t.id==e||t._functionID==e)}registerSourceFromURL(e,t){t||(t=`external.${L++}`),k.debug(`Registering remote knowledge base source: ${e}`);let n=[],s=[],o=!0,r=async(a,u)=>{k.debug(`Calling remote knowledge base action: ${a.id}`);let i={type:"action",userID:this.ai.userID,actionID:a.id,parameters:u},l=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!l.ok)throw new Error(`HTTP Error ${l.status} ${l.statusText}`);let p=await l.json();return c(p.updateItems||[]),p.response},c=a=>{for(let u of a){if(!u.id){k.warn("KB item skipped since it has no ID.",u);continue}let i=n.find(l=>l.id==u.id);if(i){i.name=u.name||i.name||"",i.content=u.content||i.content||"",i.disabled=u.disabled??i.disabled,i.isContext=u.isContext??i.isContext,i.parameters=u.parameters||i.parameters||[],i.tags=u.tags||i.tags,i.type=u.type||i.type;continue}n.push({...u,action:l=>r(u,l)})}};this.registerSource(t,async a=>{if(o&&s.includes(a))return n;let u={type:"search",userID:this.ai?.userID||"",query:a},i=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)});if(!i.ok)throw new Error(`HTTP Error ${i.status} ${i.statusText}`);let l=await i.json();return o=!l.noCache,s.includes(a)||s.push(a),c(l.items),n})}clone(){let e=new d(this.ai);return e._sources=this._sources,e._windowSources=this._windowSources,e.manualEntries=this.manualEntries,e.ensureInternalKnowledge(),e}registerMCPSource(e){e.id||(e.id=`external.${L++}`);let t=new W(e);return this.registerSource(e.id,n=>t.search(n)),t}};var O=class{constructor(e){this.messages=e}text(){return this.messages?.flatMap(e=>e.sections)?.filter(e=>e?.type=="text")?.map(e=>e?.text||"")?.filter(e=>!!e)?.join(`
22
22
 
23
- `)?.trim()||""}tokenUsage(){return{cachedInputTokens:this.messages?.reduce((e,t)=>e+(t.usage?.cachedInputTokens||0),0)||0,inputTokens:this.messages?.reduce((e,t)=>e+(t.usage?.inputTokens||0),0)||0,outputTokens:this.messages?.reduce((e,t)=>e+(t.usage?.outputTokens||0),0)||0,totalTokens:this.messages?.reduce((e,t)=>e+(t.usage?.totalTokens||0),0)||0}}sections(){return this.messages?.flatMap(e=>e.sections||[])||[]}toolCalls(){return this.messages?.flatMap(e=>e.sections?.filter(t=>t.type=="tool_call")||[])||[]}toolResult(e){return this.messages?.map(t=>t.sections?.find(n=>n.type=="tool_result"&&n.toolCallInstanceID==e)).filter(t=>!!t)[0]||null}};import{v4 as ee}from"uuid";var R=class{constructor(e){this.ai=e}async boolean(e){let t=await this.instruct({...e,instruction:`${e.instruction}
23
+ `)?.trim()||""}tokenUsage(){return{cachedInputTokens:this.messages?.reduce((e,t)=>e+(t.usage?.cachedInputTokens||0),0)||0,inputTokens:this.messages?.reduce((e,t)=>e+(t.usage?.inputTokens||0),0)||0,outputTokens:this.messages?.reduce((e,t)=>e+(t.usage?.outputTokens||0),0)||0,totalTokens:this.messages?.reduce((e,t)=>e+(t.usage?.totalTokens||0),0)||0}}sections(){return this.messages?.flatMap(e=>e.sections||[])||[]}toolCalls(){return this.messages?.flatMap(e=>e.sections?.filter(t=>t.type=="tool_call")||[])||[]}toolResult(e){return this.messages?.map(t=>t.sections?.find(n=>n.type=="tool_result"&&n.toolCallInstanceID==e)).filter(t=>!!t)[0]||null}};import{v4 as Z}from"uuid";var R=class{constructor(e){this.ai=e}async boolean(e){let t=await this.instruct({...e,instruction:`${e.instruction}
24
24
 
25
25
  Return only the text "true" or "false" to indicate the answer to the question. Do not include any additional text or explanations.`});if(t.toLowerCase().includes("true"))return!0;if(t.toLowerCase().includes("false"))return!1;throw new Error("The AI did not give a boolean answer: "+t)}async choose(e){let t=await this.instruct({...e,instruction:`${e.instruction}
26
26
 
@@ -37,7 +37,7 @@ Objects should have the following keys:
37
37
  ${e.extractions.map(s=>`- ${s.name} (${s.type}): ${s.description||"No description provided."}`).join(`
38
38
  `)}
39
39
  `,n=await this.instruct({...e,instruction:t});if(n=n.replace(/```jsonl/g,"").replace(/```json/g,"").replace(/```/g,""),e.allowMultiple){let s=n.split(`
40
- `).map(a=>a.trim()).filter(a=>!!a.trim()),o=[];for(let a of s)try{o.push(JSON.parse(a))}catch(u){console.error("Failed to parse line as JSON:",a,u.message)}return o}else return[JSON.parse(n.trim())]}async generateMarkdown(e){return this.instruct({...e,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(e){let t=this.ai.clone();return t.resetConversation(),t.getContextPrefix=async()=>e.instruction,e.callback&&t.addEventListener("output",n=>{e.callback(n.detail.message)}),e.allowKB||(t.knowledgeBase._sources=[]),await t.sendMessage(typeof e.data=="string"?e.data:JSON.stringify(e.data)).then(n=>n.text())}};var K=class{constructor(e){this.subagents=[];this.cachedSubagents={};this.ai=e}register(e){if(this.subagents.find(t=>t.id==e.id))throw new Error(`Sub-agent with ID ${e.id} already exists`);this.subagents.push(e),this.ai.knowledgeBase.registerSource("subagent:"+e.id,t=>[{type:"action",id:"ask:"+e.id,name:`Ask ${e.name||"subagent"}`,content:e.usageInstructions||`Use this tool to ask ${e.name||"subagent"} a question.`,isContext:!0,parameters:[{type:"string",name:"query",description:"The question to ask the subagent"}],action:async(n,s)=>await this.runQuery(e,n.query)}])}remove(e){this.subagents=this.subagents.filter(t=>t.id!=e),this.ai.knowledgeBase.removeSource("subagent:"+e)}async runQuery(e,t){let n=e.apiKey||this.ai.apiKey,s=this.cachedSubagents[n];return s||(s=new N,await s.load(n,e.config),this.cachedSubagents[n]=s),s=s.clone(),s.knowledgeBase.allowGlobalConfigSources=!1,s.knowledgeBase.allowWindowSources=!1,e.clearExistingKnowledge&&s.knowledgeBase.reset(),e.knowledge&&s.knowledgeBase.registerSource(e.knowledge),e.onAgentLoaded&&await e.onAgentLoaded(s),(await s.sendMessage(t)).text()}};var y=new g("Main"),te=new Set,T=class T extends EventTarget{constructor(){super(...arguments);this.conversationID=ee();this.knowledgeBase=new D(this);this.subAgents=new K(this);this._lastKBsearch="";this.models=[];this.audio=null;this.apiKey="";this.logic=new R(this);this.userID=F();this.hubAPI="https://intelliweave.ai/api";this._lastSystemMsg="";this.isProcessing=!1;this.activeAnalyticsPromises=[]}get loaded(){return!!(this.config&&this.currentModel)}get flags(){return this.config?.flags||{}}getBuiltInActionsInfo(){return{version:T.builtInActionsVersion,availableActions:["ui.openURL - Open URLs in new tabs","ui.changeRoute - Change page routes","ui.sendEmail - Send emails via mailto links","search - Search knowledge base"],enabledFlags:this.flags}}async load(t,n){if(this.apiKey=t,!t)throw new Error("API key is required to load the AI.");try{await Promise.all([(async()=>{y.debug("Loading configuration...");let s=await fetch(this.hubAPI+"/config/get",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:t})});if(!s.ok)throw new Error(`Failed to load configuration: ${s.status} ${s.statusText}`);try{this.config=await s.json(),y.debug("Config loaded successfully:",this.config),n&&(this.config={...this.config,...n}),this.config&&y.debug("UI Properties - logo:",this.config.logo,"background:",this.config.background,"textColor:",this.config.textColor)}catch(o){y.error("Failed to parse JSON response:",o);try{let a=await s.clone().text();y.error("Raw response that failed parsing:",a)}catch{y.error("Could not get raw response text either")}throw new Error(`Failed to parse configuration: ${o}`)}})(),(async()=>{try{let s=await fetch("https://cdn.intelliweave.ai/models/silero_vad_3.onnx");if(!s.ok)throw new Error(`Failed to load VAD model: ${s.status} ${s.statusText}`);this.vadModel=await s.blob()}catch(s){y.warn(`Failed to load VAD model, some features will be unavailable. ${s.message}`)}})()]),this.models=[{id:this.config.id,config:this.config.model}],this.setModel(this.config.id);for(let s of this.config.knowledge||[])s.url&&s.backendType=="mcp"?this.knowledgeBase.registerMCPSource({id:s.id,searchToolName:s.mcpSearchToolName,baseURL:s.url}):s.url&&this.knowledgeBase.registerSourceFromURL(s.url);for(let s of this.config.knowledge||[])s.entries?.length&&this.knowledgeBase.registerSource(s.id,()=>s.entries||[]);if(this.config.mcpServers)for(let s of this.config.mcpServers)this.knowledgeBase.registerMCPSource(s);for(let s of this.config.subagents||[])this.subAgents.register(s);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(s){throw y.warn("Failed to load:",s),this.error=s,this.dispatchEvent(new CustomEvent("error",{detail:{ai:this,error:s}})),typeof window<"u"&&window.dispatchEvent(new CustomEvent("webweaver_error",{detail:{ai:this,error:s}})),s}}setModel(t){let n=this.models.find(o=>o.id==t);if(!n)throw new Error(`Model with ID "${t}" not found.`);let s={...n.config,stream:!0,systemMessage:"",onBeforeMessageProcessing:this.onBeforeMessageProcessing.bind(this),onAIMessage:this.processIncomingMessage.bind(this),onAIToolStart:(o,a)=>{let u=this.knowledgeBase.getCachedEntry(o);this.onAIToolStart?.(u?.id||o,a)}};this.config?.onCreateProvider?this.currentModel=this.config.onCreateProvider(s):n.config.providerID==="anthropic"?this.currentModel=new P(s):this.currentModel=new M(s),this.currentModel.id=n.id,this.currentModel.metadata=n}async getContextPrefix(){let t=w().pageSummary||`You are ${this.config?.name||"IntelliWeave"}. ${this.config?.instructions||"Speak in short sentences."}`;return typeof t=="function"&&(t=await t()),t}async onBeforeMessageProcessing(){this._lastKBsearch||(this._lastKBsearch="__intelliweaveblanksearchforcontextitems__");let t=this._nextRequestUseKBitems||await this.knowledgeBase.search(this._lastKBsearch);this._nextRequestUseKBitems=void 0;let n=await this.getContextPrefix();this.currentModel.contextGroup.add({id:"_iw_main",sortOrder:1,cannotRemove:!0,data:n}),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,data:A(`
40
+ `).map(r=>r.trim()).filter(r=>!!r.trim()),o=[];for(let r of s)try{o.push(JSON.parse(r))}catch(c){console.error("Failed to parse line as JSON:",r,c.message)}return o}else return[JSON.parse(n.trim())]}async generateMarkdown(e){return this.instruct({...e,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(e){let t=this.ai.clone();return t.resetConversation(),t.getContextPrefix=async()=>e.instruction,e.callback&&t.addEventListener("output",n=>{e.callback(n.detail.message)}),e.allowKB||(t.knowledgeBase._sources=[]),await t.sendMessage(typeof e.data=="string"?e.data:JSON.stringify(e.data)).then(n=>n.text())}};var K=class{constructor(e){this.subagents=[];this.cachedSubagents={};this.ai=e}register(e){if(this.subagents.find(t=>t.id==e.id))throw new Error(`Sub-agent with ID ${e.id} already exists`);this.subagents.push(e),this.ai.knowledgeBase.registerSource("subagent:"+e.id,t=>[{type:"action",id:"ask:"+e.id,name:`Ask ${e.name||"subagent"}`,content:e.usageInstructions||`Use this tool to ask ${e.name||"subagent"} a question.`,isContext:!0,parameters:[{type:"string",name:"query",description:"The question to ask the subagent"}],action:async(n,s)=>await this.runQuery(e,n.query)}])}remove(e){this.subagents=this.subagents.filter(t=>t.id!=e),this.ai.knowledgeBase.removeSource("subagent:"+e)}async runQuery(e,t){let n=e.apiKey||this.ai.apiKey,s=this.cachedSubagents[n];return s||(s=new N,await s.load(n,e.config),this.cachedSubagents[n]=s),s=s.clone(),s.knowledgeBase.allowGlobalConfigSources=!1,s.knowledgeBase.allowWindowSources=!1,e.clearExistingKnowledge&&s.knowledgeBase.reset(),e.knowledge&&s.knowledgeBase.registerSource(e.knowledge),e.onAgentLoaded&&await e.onAgentLoaded(s),(await s.sendMessage(t)).text()}};var w=new g("Main"),ee=new Set,T=class T extends EventTarget{constructor(){super(...arguments);this.conversationID=Z();this.knowledgeBase=new D(this);this.subAgents=new K(this);this._lastKBsearch="";this.models=[];this.audio=null;this.apiKey="";this.logic=new R(this);this.userID=F();this.hubAPI="https://intelliweave.ai/api";this._lastSystemMsg="";this.isProcessing=!1;this.activeAnalyticsPromises=[]}get loaded(){return!!(this.config&&this.currentModel)}get flags(){return this.config?.flags||{}}getBuiltInActionsInfo(){return{version:T.builtInActionsVersion,availableActions:["ui.openURL - Open URLs in new tabs","ui.changeRoute - Change page routes","ui.sendEmail - Send emails via mailto links","search - Search knowledge base"],enabledFlags:this.flags}}async load(t,n){if(this.apiKey=t,!t)throw new Error("API key is required to load the AI.");try{await Promise.all([(async()=>{w.debug("Loading configuration...");let s=await fetch(this.hubAPI+"/config/get",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:t})});if(!s.ok)throw new Error(`Failed to load configuration: ${s.status} ${s.statusText}`);try{this.config=await s.json(),w.debug("Config loaded successfully:",this.config),n&&(this.config={...this.config,...n}),this.config&&w.debug("UI Properties - logo:",this.config.logo,"background:",this.config.background,"textColor:",this.config.textColor)}catch(o){w.error("Failed to parse JSON response:",o);try{let r=await s.clone().text();w.error("Raw response that failed parsing:",r)}catch{w.error("Could not get raw response text either")}throw new Error(`Failed to parse configuration: ${o}`)}})(),(async()=>{try{let s=await fetch("https://cdn.intelliweave.ai/models/silero_vad_3.onnx");if(!s.ok)throw new Error(`Failed to load VAD model: ${s.status} ${s.statusText}`);this.vadModel=await s.blob()}catch(s){w.warn(`Failed to load VAD model, some features will be unavailable. ${s.message}`)}})()]),this.models=[{id:this.config.id,config:this.config.model}],this.setModel(this.config.id);for(let s of this.config.knowledge||[])s.url&&s.backendType=="mcp"?this.knowledgeBase.registerMCPSource({id:s.id,searchToolName:s.mcpSearchToolName,baseURL:s.url}):s.url&&this.knowledgeBase.registerSourceFromURL(s.url);for(let s of this.config.knowledge||[])s.entries?.length&&this.knowledgeBase.registerSource(s.id,()=>s.entries||[]);if(this.config.mcpServers)for(let s of this.config.mcpServers)this.knowledgeBase.registerMCPSource(s);for(let s of this.config.subagents||[])this.subAgents.register(s);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(s){throw w.warn("Failed to load:",s),this.error=s,this.dispatchEvent(new CustomEvent("error",{detail:{ai:this,error:s}})),typeof window<"u"&&window.dispatchEvent(new CustomEvent("webweaver_error",{detail:{ai:this,error:s}})),s}}setModel(t){let n=this.models.find(o=>o.id==t);if(!n)throw new Error(`Model with ID "${t}" not found.`);let s={...n.config,stream:!0,systemMessage:"",onBeforeMessageProcessing:this.onBeforeMessageProcessing.bind(this),onAIMessage:this.processIncomingMessage.bind(this),onAIToolStart:(o,r)=>{let c=this.knowledgeBase.getCachedEntry(o);this.onAIToolStart?.(c?.id||o,r)}};this.config?.onCreateProvider?this.currentModel=this.config.onCreateProvider(s):n.config.providerID==="anthropic"?this.currentModel=new P(s):this.currentModel=new M(s),this.currentModel.id=n.id,this.currentModel.metadata=n}async getContextPrefix(){let t=y().pageSummary||`You are ${this.config?.name||"IntelliWeave"}. ${this.config?.instructions||"Speak in short sentences."}`;return typeof t=="function"&&(t=await t()),t}async onBeforeMessageProcessing(){this._lastKBsearch||(this._lastKBsearch="__intelliweaveblanksearchforcontextitems__");let t=this._nextRequestUseKBitems||await this.knowledgeBase.search(this._lastKBsearch);this._nextRequestUseKBitems=void 0;let n=await this.getContextPrefix();this.currentModel.contextGroup.add({id:"_iw_main",sortOrder:1,cannotRemove:!0,data:n}),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,data:A(`
41
41
  # RAG search
42
42
  Use the \`search\` tool proactively as much as possible to find missing information or tools.
43
43
  Use the \`search\` tool when you are unsure about specific details or actions to take.
@@ -45,17 +45,17 @@ ${e.extractions.map(s=>`- ${s.name} (${s.type}): ${s.description||"No descriptio
45
45
  If you're about to say "I don't have access..." or "I can't..." use the \`search\` tool first.
46
46
  `)}),this.currentModel.contextGroup.add({id:"_iw_kb_description",sortOrder:100,cannotRemove:!0,data:`# Knowledge Database${t.length==0?`
47
47
 
48
- (no items found)`:""}`});for(let s of t)if(s.type=="info"||s.type=="tour"||s.type=="input-event"){let o=A(s.content),a=!0;if(s.attachments?.length)for(let u of s.attachments)u.url&&(a&&(o+=`
48
+ (no items found)`:""}`});for(let s of t)if(s.type=="info"||s.type=="tour"||s.type=="input-event"){let o=A(s.content),r=!0;if(s.attachments?.length)for(let c of s.attachments)c.url&&(r&&(o+=`
49
49
 
50
50
  \`\`\`yaml
51
51
  attachments:
52
- `,a=!1),o+=`- name: "${u.name||""}"
53
- mimetype: "${u.mimeType||""}"
54
- url: "${u.url}"
55
- `);a||(o+="```\n"),this.currentModel.contextGroup.add({id:s.id,data:`## ${s.type}: ${s.name}
56
- ${o}`,cannotRemove:s.isContext,sortOrder:101,disabled:typeof s.disabled=="function"?s.disabled(this):s.disabled})}else if(s.type=="action"){let o={name:s._functionID,description:A(s.content),params:q(s.parameters||[{name:"value",type:"string",description:"Input"}]),callback:a=>this.toolRunKBAction(s,a),canRemove:!s.isContext,kbItem:s};this.currentModel.registerTool(o)}else continue}processIncomingMessage(t,n){if(!n){let s=this.currentModel?.stats?.tokensUsed||0,o=t.reduce((a,u)=>a+(u.usage?.totalTokens||0),0);I(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:s}})}this.dispatchEvent(new CustomEvent("output",{detail:{ai:this,isPartial:n,messages:t}})),this.onAIMessage?.(t,!!n)}async sendMessage(t,n){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(),te.has(this.conversationID)||(te.add(this.conversationID),I(this,{event_type:"session_start"})),I(this,{event_type:"message_send",value_str:"",event_properties:{message_length:t.length,is_voice_input:!!this.audio?.speechRecognition?.isRunning}}),this.dispatchEvent(new CustomEvent("input",{detail:{ai:this,message:t}})),this.submitAnalyticsEvent({type:"message",role:"user",message:t});let s=await this.currentModel.sendMessage(t),o=new O(s),a=this.currentModel.contextGroup.getAllAsString();a+=`
52
+ `,r=!1),o+=`- name: "${c.name||""}"
53
+ mimetype: "${c.mimeType||""}"
54
+ url: "${c.url}"
55
+ `);r||(o+="```\n"),this.currentModel.contextGroup.add({id:s.id,data:`## ${s.type}: ${s.name}
56
+ ${o}`,cannotRemove:s.isContext,sortOrder:101,disabled:typeof s.disabled=="function"?s.disabled(this):s.disabled})}else if(s.type=="action"){let o={name:s._functionID,description:A(s.content),params:q(s.parameters||[{name:"value",type:"string",description:"Input"}]),callback:r=>this.toolRunKBAction(s,r),canRemove:!s.isContext,kbItem:s};this.currentModel.registerTool(o)}else continue}processIncomingMessage(t,n){if(!n){let s=this.currentModel?.stats?.tokensUsed||0,o=t.reduce((r,c)=>r+(c.usage?.totalTokens||0),0);I(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:s}})}this.dispatchEvent(new CustomEvent("output",{detail:{ai:this,isPartial:n,messages:t}})),this.onAIMessage?.(t,!!n)}async sendMessage(t,n){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(),ee.has(this.conversationID)||(ee.add(this.conversationID),I(this,{event_type:"session_start"})),I(this,{event_type:"message_send",value_str:"",event_properties:{message_length:t.length,is_voice_input:!!this.audio?.speechRecognition?.isRunning}}),this.dispatchEvent(new CustomEvent("input",{detail:{ai:this,message:t}})),this.submitAnalyticsEvent({type:"message",role:"user",message:t});let s=Date.now(),o=await this.currentModel.sendMessage(t),r=new O(o);(this._voiceTracker||w.debug.bind(w))(`LLM response took ${Date.now()-s}ms`);let a=this.currentModel.contextGroup.getAllAsString();a+=`
57
57
 
58
58
  === TOOLS ===
59
59
 
60
60
  `+this.currentModel.toolGroup.getAll().map(u=>"- "+u.data?.name).join(`
61
- `),this._lastSystemMsg!=a&&(this._lastSystemMsg=a,this.submitAnalyticsEvent({type:"system-msg",txt:a}));for(let u of s)for(let i of u.sections||[])if(i.type=="text")this.submitAnalyticsEvent({type:"message",role:"assistant",message:i.text||""});else if(i.type=="thinking")this.submitAnalyticsEvent({type:"thinking",role:"assistant",message:i.text||""});else if(i.type=="tool_call"){let l=o.toolResult(i.toolCallInstanceID);this.submitAnalyticsEvent({type:"action",role:"assistant",action:i.toolKbID||"",actionName:i.toolKbName||"",value:i.toolParameters,result:l?.toolErrorResponse||l?.toolSuccessResponse,isError:!!l?.toolErrorResponse})}else i.type=="tool_result"||this.submitAnalyticsEvent({type:"other",role:"assistant"});return o}finally{this.isProcessing=!1}}async toolRunKBAction(t,n){let s=Date.now();try{this.dispatchEvent(new CustomEvent("toolstart",{detail:{knowledgeBaseEntry:t,input:n,ai:this}}));let o=await t.action(n,this),a=Date.now()-s;return I(this,{event_type:"tool_call",value_str:t.id||"",event_properties:{tool_args:n,execution_time_ms:a,success:!0}}),this.dispatchEvent(new CustomEvent("tool",{detail:{knowledgeBaseEntry:t,input:n,ai:this,result:o}})),o}catch(o){let a=Date.now()-s;throw I(this,{event_type:"tool_call",value_str:t.id||"",event_properties:{tool_args:n,execution_time_ms:a,success:!1,error_message:o.message}}),this.dispatchEvent(new CustomEvent("tool",{detail:{knowledgeBaseEntry:t,input:n,ai:this,error:o}})),o}}submitAnalyticsEvent(t){if(w().analytics===!1||this.config?.analytics===!1)return;let n=fetch(this.hubAPI+"/analytics/post",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,apiKey:this.apiKey,time:Date.now(),conversationID:this.conversationID,personaID:this.config?.id})}).catch(s=>{process.env.NODE_ENV==="development"?y.warn(`Failed to submit analytics event to ${this.hubAPI+"/analytics/post"}:`,s):y.debug("Failed to submit analytics event:",s)});this.activeAnalyticsPromises.push(n),n.finally(()=>{this.activeAnalyticsPromises=this.activeAnalyticsPromises.filter(s=>s!==n)})}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=ee(),this._lastSystemMsg="")}insertAssistantMessage(t){if(!this.currentModel)throw new Error("No model selected. Please call load() first.");this.currentModel.addAssistantMessage(t)}exportState(){return{type:"intelliweave/state/v2",conversationID:this.conversationID,messages:this.currentModel?.messageGroup.getAll()}}importState(t){if(!this.currentModel)throw new Error("No model selected. Please call load() first.");if(t?.type!="intelliweave/state/v2")throw new Error(`Invalid state type: ${t.type}`);this.conversationID=t.conversationID;for(let n of t.messages)this.currentModel.messageGroup.add(n)}clone(){let t=new T;return t.apiKey=this.apiKey,t.config=this.config,t.models=this.models,this.config?.id&&t.setModel(this.config.id),t.audio=this.audio,t.vadModel=this.vadModel,t.userID=this.userID,t.knowledgeBase=this.knowledgeBase.clone(),t}get messages(){return this.currentModel?.messageGroup.items||[]}};T.version=b.version,T.builtInActionsVersion="1.0.0",y.debug(`Loaded: version=${b.version} builtInActionsVersion=${T.builtInActionsVersion}`);var N=T;export{P as AnthropicChat,z as BufferedWebSocket,C as ChatBase,M as ChatGPT,V as FixedBufferStream,N as IntelliWeave,O as IntelliWeaveMessageParser,D as KnowledgeBase,g as Logging,W as MCPKnowledgeClient,J as ONNXModel,H as Resampler,v as TokenWindow,U as TokenWindowGroup,x as TokenWindowGroupItemSectionType,xe as audioToWav,q as convertParamsToJSONSchema,Ae as floatTo16BitPCM,Ee as floatTo64BitPCM,F as getDefaultUserID,Me as int16ToFloat32BitPCM,w as intelliweaveConfig,B as intelliweaveGlobalThis,be as sseEvents,A as trimWhitespaceInText};
61
+ `),this._lastSystemMsg!=a&&(this._lastSystemMsg=a,this.submitAnalyticsEvent({type:"system-msg",txt:a}));for(let u of o)for(let i of u.sections||[])if(i.type=="text")this.submitAnalyticsEvent({type:"message",role:"assistant",message:i.text||""});else if(i.type=="thinking")this.submitAnalyticsEvent({type:"thinking",role:"assistant",message:i.text||""});else if(i.type=="tool_call"){let l=r.toolResult(i.toolCallInstanceID);this.submitAnalyticsEvent({type:"action",role:"assistant",action:i.toolKbID||"",actionName:i.toolKbName||"",value:i.toolParameters,result:l?.toolErrorResponse||l?.toolSuccessResponse,isError:!!l?.toolErrorResponse})}else i.type=="tool_result"||this.submitAnalyticsEvent({type:"other",role:"assistant"});return r}finally{this.isProcessing=!1}}async toolRunKBAction(t,n){let s=Date.now();try{this.dispatchEvent(new CustomEvent("toolstart",{detail:{knowledgeBaseEntry:t,input:n,ai:this}}));let o=await t.action(n,this),r=Date.now()-s;return I(this,{event_type:"tool_call",value_str:t.id||"",event_properties:{tool_args:n,execution_time_ms:r,success:!0}}),this.dispatchEvent(new CustomEvent("tool",{detail:{knowledgeBaseEntry:t,input:n,ai:this,result:o}})),o}catch(o){let r=Date.now()-s;throw I(this,{event_type:"tool_call",value_str:t.id||"",event_properties:{tool_args:n,execution_time_ms:r,success:!1,error_message:o.message}}),this.dispatchEvent(new CustomEvent("tool",{detail:{knowledgeBaseEntry:t,input:n,ai:this,error:o}})),o}}submitAnalyticsEvent(t){if(y().analytics===!1||this.config?.analytics===!1)return;let n=fetch(this.hubAPI+"/analytics/post",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,apiKey:this.apiKey,time:Date.now(),conversationID:this.conversationID,personaID:this.config?.id})}).catch(s=>{process.env.NODE_ENV==="development"?w.warn(`Failed to submit analytics event to ${this.hubAPI+"/analytics/post"}:`,s):w.debug("Failed to submit analytics event:",s)});this.activeAnalyticsPromises.push(n),n.finally(()=>{this.activeAnalyticsPromises=this.activeAnalyticsPromises.filter(s=>s!==n)})}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=Z(),this._lastSystemMsg="")}insertAssistantMessage(t){if(!this.currentModel)throw new Error("No model selected. Please call load() first.");this.currentModel.addAssistantMessage(t)}exportState(){return{type:"intelliweave/state/v2",conversationID:this.conversationID,messages:this.currentModel?.messageGroup.getAll()}}importState(t){if(!this.currentModel)throw new Error("No model selected. Please call load() first.");if(t?.type!="intelliweave/state/v2")throw new Error(`Invalid state type: ${t.type}`);this.conversationID=t.conversationID;for(let n of t.messages)this.currentModel.messageGroup.add(n)}clone(){let t=new T;return t.apiKey=this.apiKey,t.config=this.config,t.models=this.models,this.config?.id&&t.setModel(this.config.id),t.audio=this.audio,t.vadModel=this.vadModel,t.userID=this.userID,t.knowledgeBase=this.knowledgeBase.clone(),t}get messages(){return this.currentModel?.messageGroup.items||[]}};T.version=v.version,T.builtInActionsVersion="1.0.0",w.debug(`Loaded: version=${v.version} builtInActionsVersion=${T.builtInActionsVersion}`);var N=T;export{P as AnthropicChat,z as BufferedWebSocket,C as ChatBase,M as ChatGPT,V as FixedBufferStream,N as IntelliWeave,O as IntelliWeaveMessageParser,D as KnowledgeBase,g as Logging,W as MCPKnowledgeClient,J as ONNXModel,H as Resampler,b as TokenWindow,G as TokenWindowGroup,x as TokenWindowGroupItemSectionType,xe as audioToWav,q as convertParamsToJSONSchema,Ae as floatTo16BitPCM,Ee as floatTo64BitPCM,F as getDefaultUserID,Me as int16ToFloat32BitPCM,y as intelliweaveConfig,B as intelliweaveGlobalThis,be as sseEvents,A as trimWhitespaceInText};
@@ -119,6 +119,8 @@ interface TokenWindowGroupItem<DataType> {
119
119
  /** Total token usage */
120
120
  totalTokens: number;
121
121
  };
122
+ /** True if this item is still being streamed */
123
+ streamingInProgress?: boolean;
122
124
  }
123
125
  /** A section of a message returned by the AI */
124
126
  interface TokenWindowGroupItemSection {
@@ -156,10 +158,16 @@ type TokenWindowGroupItemParams<DataType> = Omit<Optional<TokenWindowGroupItem<D
156
158
  declare class WebWeaverSpeechOutput extends EventTarget {
157
159
  /** Reference to the AI */
158
160
  private ai?;
161
+ /** Automatically speak output from the AI */
162
+ autoSpeak: boolean;
163
+ /** If enabled, connections will be pre-emptively opened to speed up text-to-speech response times, if possible */
164
+ preemptiveConnection: boolean;
159
165
  /** Constructor */
160
166
  constructor(ai: IntelliWeave);
161
- /** Called when the AI speaks */
162
- onTextOutputFromAI(e: CustomEvent): void;
167
+ /** Message IDs we've processed */
168
+ private processedMessages;
169
+ /** Called when the AI responds */
170
+ onOutputFromAI(e: CustomEvent): void;
163
171
  /** Current player vars */
164
172
  private currentPlayerVolume?;
165
173
  private currentPlayer?;
@@ -171,8 +179,15 @@ declare class WebWeaverSpeechOutput extends EventTarget {
171
179
  private maxVolumeHeard;
172
180
  /** Get current (realtime) audio output volume level, from 0 to 1 */
173
181
  get volumeLevel(): number;
182
+ /** Queued messages to speak next */
183
+ private _queuedText;
174
184
  /** Speak the text */
175
185
  speak(text: string): Promise<void>;
186
+ private _queueActive;
187
+ _runQueue(): Promise<void>;
188
+ /** ElevenLabs connection pre-cache */
189
+ private _elevenLabsPrecachedConnection?;
190
+ private _getElevenLabsConnection;
176
191
  private _speakWithLock;
177
192
  /** True if currently playing audio */
178
193
  get isSpeaking(): boolean;
@@ -493,6 +508,17 @@ declare class MCPKnowledgeClient {
493
508
  searchToolName?: string;
494
509
  /** Keep search function available for the AI to use. */
495
510
  searchToolVisible?: boolean;
511
+ /** Use the IntelliWeave proxy */
512
+ proxy?: {
513
+ /** If true, will send requests via the IntelliWeave MCP proxy */
514
+ enabled?: boolean;
515
+ /** The URL of the proxy server, defaults to the standard IntelliWeave proxy */
516
+ url?: string;
517
+ /** IntelliWeave API key */
518
+ apiKey?: string;
519
+ };
520
+ /** Pass extra headers to the MCP server */
521
+ headers?: Record<string, string>;
496
522
  };
497
523
  /** Constructor */
498
524
  constructor(config: MCPKnowledgeClient['config']);
@@ -503,16 +529,10 @@ declare class MCPKnowledgeClient {
503
529
  method: string;
504
530
  params?: {
505
531
  [x: string]: unknown;
506
- task?: {
507
- [x: string]: unknown;
508
- ttl?: number | null | undefined;
509
- pollInterval?: number | undefined;
510
- } | undefined;
511
532
  _meta?: {
512
533
  [x: string]: unknown;
513
534
  progressToken?: string | number | undefined;
514
535
  "io.modelcontextprotocol/related-task"?: {
515
- [x: string]: unknown;
516
536
  taskId: string;
517
537
  } | undefined;
518
538
  } | undefined;
@@ -523,8 +543,8 @@ declare class MCPKnowledgeClient {
523
543
  [x: string]: unknown;
524
544
  _meta?: {
525
545
  [x: string]: unknown;
546
+ progressToken?: string | number | undefined;
526
547
  "io.modelcontextprotocol/related-task"?: {
527
- [x: string]: unknown;
528
548
  taskId: string;
529
549
  } | undefined;
530
550
  } | undefined;
@@ -533,8 +553,8 @@ declare class MCPKnowledgeClient {
533
553
  [x: string]: unknown;
534
554
  _meta?: {
535
555
  [x: string]: unknown;
556
+ progressToken?: string | number | undefined;
536
557
  "io.modelcontextprotocol/related-task"?: {
537
- [x: string]: unknown;
538
558
  taskId: string;
539
559
  } | undefined;
540
560
  } | undefined;
@@ -543,16 +563,10 @@ declare class MCPKnowledgeClient {
543
563
  method: string;
544
564
  params?: {
545
565
  [x: string]: unknown;
546
- task?: {
547
- [x: string]: unknown;
548
- ttl?: number | null | undefined;
549
- pollInterval?: number | undefined;
550
- } | undefined;
551
566
  _meta?: {
552
567
  [x: string]: unknown;
553
568
  progressToken?: string | number | undefined;
554
569
  "io.modelcontextprotocol/related-task"?: {
555
- [x: string]: unknown;
556
570
  taskId: string;
557
571
  } | undefined;
558
572
  } | undefined;
@@ -563,8 +577,8 @@ declare class MCPKnowledgeClient {
563
577
  [x: string]: unknown;
564
578
  _meta?: {
565
579
  [x: string]: unknown;
580
+ progressToken?: string | number | undefined;
566
581
  "io.modelcontextprotocol/related-task"?: {
567
- [x: string]: unknown;
568
582
  taskId: string;
569
583
  } | undefined;
570
584
  } | undefined;
@@ -573,8 +587,8 @@ declare class MCPKnowledgeClient {
573
587
  [x: string]: unknown;
574
588
  _meta?: {
575
589
  [x: string]: unknown;
590
+ progressToken?: string | number | undefined;
576
591
  "io.modelcontextprotocol/related-task"?: {
577
- [x: string]: unknown;
578
592
  taskId: string;
579
593
  } | undefined;
580
594
  } | undefined;