@intelliweave/embedded 2.1.78 → 2.2.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +12 -0
- package/dist/component/component.d.ts +72 -1
- package/dist/component/component.js +825 -97
- package/dist/intelliweave-wordpress.zip +0 -0
- package/dist/node/node.d.ts +72 -1
- package/dist/node/node.js +23 -23
- package/dist/react/react.d.ts +4 -0
- package/dist/react/react.js +781 -53
- package/dist/script-tag/script-tag.js +825 -97
- package/dist/webpack/index.d.ts +72 -1
- package/dist/webpack/index.js +777 -49
- package/package.json +1 -1
|
Binary file
|
package/dist/node/node.d.ts
CHANGED
|
@@ -1358,6 +1358,8 @@ interface BuiltInActionFlags {
|
|
|
1358
1358
|
allowChangeRoute?: boolean;
|
|
1359
1359
|
/** Allows the AI to craft an email and use mailto: link */
|
|
1360
1360
|
allowSendEmail?: boolean;
|
|
1361
|
+
/** Allows the AI to trigger hidden embedded emoji effects in the built-in UI */
|
|
1362
|
+
allowEmojiActions?: boolean;
|
|
1361
1363
|
/** Makes the AI only use information from knowledge bases, not general knowledge */
|
|
1362
1364
|
onlyUseKnowledgeBase?: boolean;
|
|
1363
1365
|
}
|
|
@@ -1397,6 +1399,8 @@ interface WebWeaverGPTConfig {
|
|
|
1397
1399
|
offsetX?: number;
|
|
1398
1400
|
/** Vertical offset from edge in pixels (default: 20) - only used when positioningMode is 'fixed' */
|
|
1399
1401
|
offsetY?: number;
|
|
1402
|
+
/** Custom brand name displayed in the panel header kicker (replaces "IntelliWeave"). */
|
|
1403
|
+
brandName?: string;
|
|
1400
1404
|
/** Identifier of an external app or service which manages this persona, if any. (eg. "chatterly") */
|
|
1401
1405
|
managedBy?: string;
|
|
1402
1406
|
/** Voice information */
|
|
@@ -1792,6 +1796,16 @@ declare class WebWeaverEmbed extends BaseComponent {
|
|
|
1792
1796
|
private _previousOpenState;
|
|
1793
1797
|
/** Session start time for tracking UI session duration */
|
|
1794
1798
|
private _uiSessionStartTime?;
|
|
1799
|
+
/** Embedded action blocks already handled for each streamed message section */
|
|
1800
|
+
private _handledEmbeddedActionBlocks;
|
|
1801
|
+
/** If opened by mobile swipe from the collapsed tab, swipe-close should return to collapsed tab */
|
|
1802
|
+
private _returnToCollapsedOnSwipeClose;
|
|
1803
|
+
/** Suppress the next container click event (used after a swipe-close to prevent re-opening) */
|
|
1804
|
+
private _suppressNextContainerClick;
|
|
1805
|
+
/** Mobile swipe start point */
|
|
1806
|
+
private _swipeStart?;
|
|
1807
|
+
/** Previous fullscreen state for refreshing mobile scroll containment */
|
|
1808
|
+
private _previousFullscreenState;
|
|
1795
1809
|
/** Constructor */
|
|
1796
1810
|
constructor();
|
|
1797
1811
|
/** Content */
|
|
@@ -1811,10 +1825,14 @@ declare class WebWeaverEmbed extends BaseComponent {
|
|
|
1811
1825
|
private _lastPositionY?;
|
|
1812
1826
|
private _lastOffsetX?;
|
|
1813
1827
|
private _lastOffsetY?;
|
|
1828
|
+
private _lastBrandName?;
|
|
1814
1829
|
/** Apply persona-based color variants as CSS variables */
|
|
1815
1830
|
private applyPersonaColorVariants;
|
|
1816
1831
|
/** Parse a color string to RGB (supports hex and rgb/rgba) */
|
|
1817
1832
|
private parseColorToRGB;
|
|
1833
|
+
/** Compute a complementary kicker color via hue-shift (+120°) from a given background color.
|
|
1834
|
+
* Returns null if the color cannot be parsed (so the CSS default is used). */
|
|
1835
|
+
private computeKickerColor;
|
|
1818
1836
|
/** Adjust inner container spacing based on logo aspect ratio */
|
|
1819
1837
|
private adjustLogoPadding;
|
|
1820
1838
|
/** Apply UI styles from config and attributes, prioritizing attributes */
|
|
@@ -1825,6 +1843,48 @@ declare class WebWeaverEmbed extends BaseComponent {
|
|
|
1825
1843
|
onDestroy(): void;
|
|
1826
1844
|
/** Called when the container is clicked */
|
|
1827
1845
|
onContainerClick(e: Event): void;
|
|
1846
|
+
/** Open from the floating dock button */
|
|
1847
|
+
onDockOpenClick(e: Event): void;
|
|
1848
|
+
/** Collapse the floating dock into a side tab */
|
|
1849
|
+
onDockCollapseClick(e: Event): void;
|
|
1850
|
+
/** Open from the collapsed side tab — show the dock/circle view first, not the full chat */
|
|
1851
|
+
onCollapsedOpenClick(e: Event): void;
|
|
1852
|
+
/** Collapse from the panel header */
|
|
1853
|
+
onPanelCollapseClick(e: Event): void;
|
|
1854
|
+
/** Toggle fullscreen state for widget layout */
|
|
1855
|
+
onPanelFullscreenClick(e: Event): void;
|
|
1856
|
+
/** Close the panel */
|
|
1857
|
+
onPanelCloseClick(e: Event): void;
|
|
1858
|
+
/** True if the UI cannot be manually closed/collapsed */
|
|
1859
|
+
private isForcedOpen;
|
|
1860
|
+
/** Open the normal panel from the dock button */
|
|
1861
|
+
private openFromDock;
|
|
1862
|
+
/** Refresh the chat scroller after fullscreen transitions, especially for iOS momentum scroll. */
|
|
1863
|
+
private refreshContentScrollability;
|
|
1864
|
+
/** Show the dock/circle view from the collapsed tab (without opening chat) */
|
|
1865
|
+
private showDockFromCollapsed;
|
|
1866
|
+
/** Open the panel from the collapsed tab */
|
|
1867
|
+
private openFromCollapsed;
|
|
1868
|
+
/** Close the panel, returning to the side tab when opened from the tab by swipe */
|
|
1869
|
+
private closePanel;
|
|
1870
|
+
/** Collapse the whole dock into the side tab */
|
|
1871
|
+
private collapseDock;
|
|
1872
|
+
/** Track pointer start for mobile horizontal swipe gestures */
|
|
1873
|
+
onSwipePointerDown(e: PointerEvent): void;
|
|
1874
|
+
/** Reset swipe tracking */
|
|
1875
|
+
onSwipePointerCancel(): void;
|
|
1876
|
+
/** Direction that moves into the viewport from the dock side. */
|
|
1877
|
+
private inwardSwipeDirection;
|
|
1878
|
+
/** Direction that moves back out toward the dock side. */
|
|
1879
|
+
private outwardSwipeDirection;
|
|
1880
|
+
/** True when a pointer release was a horizontal swipe in the requested direction */
|
|
1881
|
+
private didSwipe;
|
|
1882
|
+
/** Open the collapsed tab on mobile inward-swipe */
|
|
1883
|
+
onCollapsedSwipePointerUp(e: PointerEvent): void;
|
|
1884
|
+
/** Open the dock on mobile inward-swipe */
|
|
1885
|
+
onDockSwipePointerUp(e: PointerEvent): void;
|
|
1886
|
+
/** Close the panel on mobile outward-swipe */
|
|
1887
|
+
onPanelSwipePointerUp(e: PointerEvent): void;
|
|
1828
1888
|
/** Called when the logo is clicked */
|
|
1829
1889
|
onLogoClick(e: Event): void;
|
|
1830
1890
|
/** Open the interaction panel */
|
|
@@ -1842,7 +1902,17 @@ declare class WebWeaverEmbed extends BaseComponent {
|
|
|
1842
1902
|
/** Called when the AI responds with some text */
|
|
1843
1903
|
onAIMessage(messages: TokenWindowGroupItemParams<unknown>[], isPartial: boolean): Promise<void>;
|
|
1844
1904
|
/** Updates a text element */
|
|
1845
|
-
updateTextElement(elementID: string, text: string):
|
|
1905
|
+
updateTextElement(elementID: string, text: string): boolean;
|
|
1906
|
+
/** Execute supported hidden embedded actions from assistant text. */
|
|
1907
|
+
private runEmbeddedAction;
|
|
1908
|
+
/** Clamp unknown AI-provided numeric values before using them in the DOM. */
|
|
1909
|
+
private clampNumber;
|
|
1910
|
+
/** Keep AI-provided emoji text short enough to render safely as a visual effect. */
|
|
1911
|
+
private normalizeEmojiActionValue;
|
|
1912
|
+
/** Keep AI-provided suggestion text short enough to render safely as a button. */
|
|
1913
|
+
private normalizeSuggestionActionValue;
|
|
1914
|
+
/** Render a bounded burst of emoji particles in the embed overlay. */
|
|
1915
|
+
private showEmojiBurst;
|
|
1846
1916
|
/** Updates an info block element */
|
|
1847
1917
|
updateInfoElement(elementID: string, text: string, iconType: string): void;
|
|
1848
1918
|
/** Called when a suggestion button is clicked */
|
|
@@ -1853,6 +1923,7 @@ declare class WebWeaverEmbed extends BaseComponent {
|
|
|
1853
1923
|
onContentScroll(e: Event): void;
|
|
1854
1924
|
/** Displays whitelabeled branding for known apps */
|
|
1855
1925
|
private updateBrandingFor;
|
|
1926
|
+
private updateBrandingText;
|
|
1856
1927
|
}
|
|
1857
1928
|
|
|
1858
1929
|
/** Utility to trim whitespace from blocks of text */
|
package/dist/node/node.js
CHANGED
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
import{v4 as j}from"uuid";function A(
|
|
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
|
|
3
|
-
`)}var se={};function B(){return typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:se}function y(){return B().intelliweave=B().intelliweave||B().webWeaver||{},B().intelliweave}async function*
|
|
1
|
+
import{v4 as j}from"uuid";function A(u){let e=(u||"").split(`
|
|
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 y(){return B().intelliweave=B().intelliweave||B().webWeaver||{},B().intelliweave}async function*ke(u){let e="",t=function*(){for(;;){let o=e.indexOf(`
|
|
4
4
|
|
|
5
|
-
`);if(o==-1)break;let r=e.slice(0,o);e=e.slice(o+2);let c={},
|
|
6
|
-
`);for(let
|
|
7
|
-
`+
|
|
5
|
+
`);if(o==-1)break;let r=e.slice(0,o);e=e.slice(o+2);let c={},l=r.split(`
|
|
6
|
+
`);for(let d of l){o=d.indexOf(": ");let a=d.slice(0,o),i=d.slice(o+2);o==-1&&(a=d,i=""),a&&(c[a]!==void 0?c[a]+=`
|
|
7
|
+
`+i:c[a]=i)}yield c}},n=new TextDecoder,s=u.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(y().userID)return y().userID||"";if(typeof localStorage<"u"&&localStorage.getItem&&localStorage.setItem){let
|
|
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=
|
|
9
|
+
`,yield*t()}function F(){if(y().userID)return y().userID||"";if(typeof localStorage<"u"&&localStorage.getItem&&localStorage.setItem){let u=localStorage.getItem("intelliweave.uid")||"";return u||(u=j(),localStorage.setItem("intelliweave.uid",u),u)}else return j()}function q(u){let e=u;if(e?.type=="object"&&e.properties)return u;let t={type:"object",properties:{},required:[]};if(u&&Array.isArray(u)){let n=u;for(let s of n)t.properties[s.name]={type:s.type||"string",description:s.description||""}}return t}var M=class M{constructor(e){this.module="IntelliWeave";this.module=e}get debugEnabled(){return M.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)}};M.debug=!1;var g=M;var x=new g("ONNXModel"),J=class u{constructor(e){this.stateTensors={};this.constantTensors={};this._runActive=!1;this.ignoreIfBusy=!1;this.session=e,x.debug(`Model input parameters: ${e.inputNames.join(", ")}`),x.debug(`Model output parameters: ${e.outputNames.join(", ")}`)}static isSupported(){return!!u.lib}static async load(e){if(!u.lib)throw new Error("ONNX runtime not loaded, please set the runtime loader. Example: ONNXModel.lib = () => import('onnxruntime-web')");this.onnx||(x.debug("Loading ONNX runtime"),this.onnx=await u.lib()),x.debug(`Loading model: ${e}`);let t=await this.onnx.InferenceSession.create(e);return new u(t)}makeTensor(e,t,n=0){let s=1;for(let r of t)s*=r;let o;if(e=="float32")o=new u.onnx.Tensor(new Float32Array(s),t);else if(e=="int8")o=new u.onnx.Tensor(new Int8Array(s),t);else if(e=="int16")o=new u.onnx.Tensor(new Int16Array(s),t);else if(e=="int32")o=new u.onnx.Tensor(new Int32Array(s),t);else if(e=="int64")o=new u.onnx.Tensor(new BigInt64Array(s),t);else if(e=="uint8")o=new u.onnx.Tensor(new Uint8Array(s),t);else if(e=="uint16")o=new u.onnx.Tensor(new Uint16Array(s),t);else if(e=="uint32")o=new u.onnx.Tensor(new Uint32Array(s),t);else if(e=="uint64")o=new u.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 x.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(){x.debug("Resetting state tensors");for(let e in this.stateTensors)this.stateTensors[e].tensor.data.fill(0)}};function Ee(u,e){let t=e.reduce((l,d)=>l+d.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=u*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,u,!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,l,d,a,i,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,l=0,d=0,a=0,i=this.outputBuffer;r<1;r+=o)for(l=r%1,c=1-l,this.lastWeight=r%1,p=0;p<this.channels;++p)i[a++]=this.lastOutput[p]*c+e[p]*l;for(r-=1,t-=n,d=Math.floor(r)*n;a<s&&d<t;){for(l=r%1,c=1-l,p=0;p<this.channels;++p)i[a++]=e[d+(p>0?p:0)]*c+e[d+(n+p)]*l;r+=o,d=Math.floor(r)*n}for(p=0;p<n;++p)this.lastOutput[p]=e[d++];return this.bufferSlice(a)}}multiTap(){this.resampler=e=>{let t=e.length,n,s,o=this.channels,r,c,l,d,a,i,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,d=0,a=0,i=!this.tailExists,this.tailExists=!1,p=this.outputBuffer,h=0,f=0,l=0;l<o;++l)s[l]=0;do{if(i)for(c=r,l=0;l<o;++l)s[l]=0;else{for(c=this.lastWeight,l=0;l<o;++l)s[l]=this.lastOutput[l];i=!0}for(;c>0&&d<t;)if(a=1+d-f,c>=a){for(l=0;l<o;++l)s[l]+=e[d++]*a;f=d,c-=a}else{for(l=0;l<o;++l)s[l]+=e[d+(l>0?l:0)]*c;f+=c,c=0;break}if(c===0)for(l=0;l<o;++l)p[h++]=s[l]/r;else{for(this.lastWeight=c,l=0;l<o;++l)this.lastOutput[l]=s[l];this.tailExists=!0;break}}while(d<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 Pe(u){let e=u.length,t=new Int16Array(e);for(;e--;){let n=Math.max(-1,Math.min(1,u[e]));t[e]=n<0?n*32768:n*32767}return t}function De(u){let e=u.length,t=new BigInt64Array(e);for(;e--;){let n=Math.max(-1,Math.min(1,u[e]));t[e]=BigInt(Math.floor(n<0?n*32768:n*32767))*0x100000000000n}return t}function We(u){let e=u.length,t=new Float32Array(e);for(;e--;){let n=u[e];t[e]=n>=32768?-(65536-n)/32768:n/32767}return t}import re from"openai";import{v4 as oe}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),l=Math.floor(r.weight/t*this.size),d=o.tokenCount-c;return r.tokenCount-l-d}),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=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(`
|
|
11
11
|
|
|
12
|
-
`)||"";let
|
|
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}remove(e){let t=this.items.findIndex(n=>n.id===e);return t===-1?!1:(this.tokenCount-=this.items[t].tokenCount||0,this.items.splice(t,1),!0)}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}},C=(o=>(o.Text="text",o.ToolCall="tool_call",o.ToolResult="tool_result",o.Thinking="thinking",o.Other="other",o))(C||{});import{v4 as ie}from"uuid";var X=new g("ChatBase"),_=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,
|
|
15
|
-
`)||"- (none)",r=
|
|
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"),P=class extends _{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 r="msg-"+ae();s=!1,await this.config.onBeforeMessageProcessing?.(),await this.trimMessages(),$.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 c=this.toolGroup.getAll().filter(i=>!!i?.data).map(i=>({type:"function",function:{name:i.data.name,description:i.data.description||"",parameters:{type:"object",...i.data?.params}}})),l,d;if(this.config.stream){let i=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 i){let h=i.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])}l=await i.finalMessage(),d=await i.totalUsage()}else{let i=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});l=i.choices[0].message,d=i.usage}l.role=="assistant"&&!l.content&&!l.tool_calls?.length&&(l.content=""),$.debug("Message received",l);let a=this.messageGroup.add(this.parseMessageBlock(r,l,d,!1));o.push(a),await Promise.all((l.tool_calls||[]).map(async i=>{if(i.type!="function")return;let p=this.findToolBySafeName(i.function.name);try{let h=null;try{h=i.function.arguments?JSON.parse(i.function.arguments):null}catch(ne){throw new Error(`The AI provided invalid JSON arguments for tool call ${i.function.name}: ${ne.message}`)}let f=await this.executeTool(p,h),S=this.messageGroup.add({source:"user",sections:[{type:"tool_result",toolName:i.function.name,toolKbID:p?.kbItem?.id,toolKbName:p?.kbItem?.name,toolSuccessResponse:f,toolCallInstanceID:i.id,toolCallHiddenInUI:p?.kbItem?.hideActionInUI}],data:{role:"tool",tool_call_id:i.id,content:f}});o.push(S)}catch(h){let f=h?.message||"An unknown error occurred",S=this.messageGroup.add({source:"user",sections:[{type:"tool_result",toolName:i.function.name,toolKbID:p?.kbItem?.id,toolKbName:p?.kbItem?.name,toolErrorResponse:f,toolCallInstanceID:i.id,toolCallHiddenInUI:p?.kbItem?.hideActionInUI}],data:{role:"tool",tool_call_id:i.id,content:`Error performing tool call ${i.function.name}: ${f}`}});o.push(S)}s=!0,this.config.onAIMessage?.(o,!0),t?.(o)})),this.stats.tokensUsed+=d?.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),l=null;if(r.function.arguments)try{l=JSON.parse(r.function.arguments)}catch(d){s||$.error(`Failed to parse tool parameters for tool call ${r.function.name}:`,d)}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:l})}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 le from"@anthropic-ai/sdk";import{v4 as ce}from"uuid";var Y=new g("AnthropicChat"),D=class extends _{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(a=>a.data),tools:this.toolGroup.getAll().map(a=>a.data),context:this.contextGroup.getAll().map(a=>a.text)});let r=this.toolGroup.getAll().map(a=>({name:a.data?.name||"",description:a.data?.description||"",input_schema:{...a.data?.params,type:"object"}})),c;if(this.config.stream){let a=n.messages.stream({model:this.config.model,max_tokens:16e3,system:this.contextGroup.getAllAsString(),messages:this.messageGroup.getAll().map(i=>i.data),tools:r,stream:!0});a.on("streamEvent",(i,p)=>{let h=this.parseMessageBlock(p,!0);this.config.onAIMessage?.([...o,h],!0),t?.([...o,h])});try{c=await a.finalMessage()}catch(i){throw i?.error?.error?.message?i.error.error:i}}else try{c=await n.messages.create({model:this.config.model,max_tokens:16e3,system:this.contextGroup.getAllAsString(),messages:this.messageGroup.items.map(a=>a.data),tools:r})}catch(a){throw a?.error?.error?.message?a.error.error:a}if(Y.debug("Message received",c),c.content?.length){let a=this.messageGroup.add(this.parseMessageBlock(c,!1));o.push(a)}let l=[],d=[];if(await Promise.all(c.content.map(async a=>{if(a.type!="tool_use")return;let i=this.findToolBySafeName(a.name);try{let p=await this.executeTool(i,a.input);d.push({type:"tool_result",tool_use_id:a.id,content:p}),l.push({type:"tool_result",toolKbID:i?.kbItem?.id,toolKbName:i?.kbItem?.name,toolName:a.name,toolSuccessResponse:p,toolCallInstanceID:a.id,toolCallHiddenInUI:i?.kbItem?.hideActionInUI})}catch(p){let h=p?.message||"An unknown error occurred";d.push({type:"tool_result",tool_use_id:a.id,content:`Error performing tool call ${a.name}: ${h}`}),l.push({type:"tool_result",toolKbID:i?.kbItem?.id,toolKbName:i?.kbItem?.name,toolName:a.name,toolErrorResponse:h,toolCallInstanceID:a.id,toolCallHiddenInUI:i?.kbItem?.hideActionInUI})}})),d.length>0){let a=this.messageGroup.add({id:"msg-"+ce(),sections:l,data:{role:"user",content:d}});o.push(a),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 ye from"minisearch";var Q=u=>[{id:"search",type:"action",name:"Search the knowledge base.",content:"Search the knowledge base for information, actions, tools, tours, UI elements, etc. Use this on EVERY request if you don't have information. If the user asks for personal information, use this. If the user asks you to do something, use this to find the tool you need.",isContext:!0,hideActionInUI:"after-complete",disabled:!u?.knowledgeBase?.allowRagSearch,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
|
-
${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 s=new URL(e.path,window.location.origin).pathname;return window.location.href=s,`Changed route to: ${s}`}},{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 s=encodeURIComponent(e.email_address),n=encodeURIComponent(e.subject),o=encodeURIComponent(e.body),r=`mailto:${s}?subject=${n}&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.1.78",description:"Integrate IntelliWeave into your app or website.",main:"./dist/webpack/index.js",types:"./dist/webpack/index.d.ts",type:"module",exports:{".":"./dist/webpack/index.js","./component":"./dist/component/component.js","./node":"./dist/node/node.js","./react":"./dist/react/react.js","./webpack":"./dist/webpack/index.js"},scripts:{build:"npm run build:lib && npm run build:docs","build:lib":"tsx build.ts","build:dev":"cross-env DEVELOPMENT=1 npm run build","build:docs":"typedoc src/index.mts --out dist/docs/",deploy:'npm run build && gsutil cp ./dist/web-weaver.min.js gs://metapress-cdn/web-weaver.min.js && gcloud compute url-maps invalidate-cdn-cache mp-cdn-loadbalancer --project="mp-backend-api" --path "/web-weaver.min.js" --async',"start:server":"cd server && npm run start","deploy:server":"cd server && npm run deploy","llm:build":"cd llm-server && docker build -t web-weaver-llm .","llm:start":"npm run llm:build && docker run -it --rm -p 8000:80 --gpus=all web-weaver-llm","llm:deploy.docker":"npm run llm:build && gcloud auth configure-docker us-central1-docker.pkg.dev && docker tag web-weaver-llm us-central1-docker.pkg.dev/ydangle-web-companion/docker-artifacts/web-weaver-llm && docker push us-central1-docker.pkg.dev/ydangle-web-companion/docker-artifacts/web-weaver-llm","llm:deploy":'npm run llm:deploy.docker && gcloud run deploy web-weaver-llm --project=ydangle-web-companion --image=us-central1-docker.pkg.dev/ydangle-web-companion/docker-artifacts/web-weaver-llm --allow-unauthenticated --region=us-central1 --description="Web Weaver LLM" --concurrency=2 --min-instances=0 --timeout=5m --memory=16Gi --cpu=8',prepack:"npm run build",test:"npm run build && vitest run","test:local":"IW_API_URL=http://localhost:3000/api npm run test"},keywords:["web","weaver","ai","assistant","chat"],author:"jjv360",license:"UNLICENSED",devDependencies:{"@types/audioworklet":"^0.0.97","@types/lodash":"^4.17.24","@types/react":"^19.2.14",bestzip:"^2.2.2","cross-env":"^10.1.0","find-cache-dir":"^6.0.0",lodash:"^4.17.23","onnxruntime-web":"^1.24.3",react:"^19.2.4","replace-in-file":"^8.4.0",tsup:"^8.5.1",tsx:"^4.21.0",typedoc:"^0.28.18",vitest:"^4.1.0"},peerDependencies:{"onnxruntime-web":"^1.20.0",react:"^18 || ^19"},dependencies:{"@anthropic-ai/sdk":"^0.80.0","@modelcontextprotocol/sdk":"^1.27.1","@types/json-schema":"^7.0.15",minisearch:"^7.2.0",openai:"^6.32.0","rehype-document":"^7.0.3","rehype-external-links":"^3.0.0","rehype-format":"^5.0.1","rehype-stringify":"^10.0.1","remark-gfm":"^4.0.1","remark-parse":"^11.0.0","remark-rehype":"^11.1.2",unified:"^11.0.5","utility-types":"^3.11.0",uuid:"^13.0.0"}};import{LoggingMessageNotificationSchema as 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),s={};this.config.headers&&(s={...s,...this.config.headers}),this.config.proxy?.enabled&&(s["Mcp-Target-Url"]=t.toString(),s["IntelliWeave-Api-Key"]=this.config.proxy.apiKey||"",t=new URL(this.config.proxy.url||ge));let n=new ce({name:v.name,version:v.version}),o=new de(t,{requestInit:{headers:s}});return await n.connect(o),m.debug("Connected with HTTP streaming mode"),n});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 n=await this.client.listTools({cursor:t});t=n.nextCursor;for(let o of n.tools||[])e.push(o);if(!n?.tools?.length||!t)break}let s=[];for(let n of e){let o=!!(this.config.searchToolName&&n.name==this.config.searchToolName&&!this.config.searchToolVisible);s.push({id:n.name,name:n.name,content:n.description||"",type:"action",isContext:!0,parameters:n.inputSchema,action:r=>this.performToolCall(n.name,r),disabled:o})}m.debug(`Fetched ${e.length} tools from MCP server.`),this.tools=e,this.iwActions=s}async search(e){if(e==this.lastSearchQuery)return this.lastSearchResults;await this.connect();let t=this.iwActions.slice(),s=await this.performSearchCall(e);return t=t.concat(s),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 s=this.tools.find(o=>o.name==this.config.searchToolName);if(!s)return m.warn(`Search function ${this.config.searchToolName} not found on the MCP server.`),t;let n;if(s.inputSchema.required?.length==1){let o=s.inputSchema.required[0];n=await this.performToolCall(this.config.searchToolName,{[o]:e})}else if(s.inputSchema.properties&&Object.keys(s.inputSchema.properties).length==1){let o=Object.keys(s.inputSchema.properties)[0];n=await this.performToolCall(this.config.searchToolName,{[o]:e})}else n=await this.performToolCall(this.config.searchToolName,{});if(Array.isArray(n))for(let o=0;o<n.length;o++){let r=n[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 n=="string"?n:JSON.stringify(n)});return t}async performToolCall(e,t){await this.connect(),m.debug(`Performing tool call for ${e} with params:`,t),this.stats.toolsCalled+=1;let s=await this.client.callTool({name:e,arguments:t});if(s.isError){let n=s.content?.[0]?.text||"Unknown error";throw m.error(`Error calling tool ${e}: ${n}`),new Error(`Error calling tool ${e}: ${n}`)}if(Array.isArray(s.content)&&s.content.length==1&&s.content[0].type=="text")try{return JSON.parse(s.content[0].text)}catch{}return s.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(n=>setTimeout(n,5e3)),_.length===0))return;let s=_.slice();_.length=0;try{let n=await fetch(d.hubAPI+"/analytics/stats",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({events:s})});if(!n.ok)throw new Error(`Analytics submission failed: ${n.status} ${n.statusText}`)}catch(n){fe.warn("Failed to submit analytics event:",n),_.push(...s);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.allowRagSearch=!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 s=e;return typeof e=="function"&&(t=e,s=`source.${L++}`),this._sources.push({id:s,query:t}),s}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(),s=new Event("webweaver_kb_search",{bubbles:!0,cancelable:!0});s.query=e,s.entries=[],s.sources=[],this.allowWindowSources&&typeof document<"u"?(document.dispatchEvent(s),this._windowSources=s.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(s.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 s=[],n=[],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=s.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}s.push({...u,action:l=>r(u,l)})}};this.registerSource(t,async a=>{if(o&&n.includes(a))return s;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,n.includes(a)||n.push(a),c(l.items),s})}clone(e){let t=new d(e);return t._sources=this._sources.slice(),t._windowSources=this._windowSources.slice(),t.manualEntries=this.manualEntries.slice(),t.allowGlobalConfigSources=this.allowGlobalConfigSources,t.allowWindowSources=this.allowWindowSources,t.allowRagSearch=this.allowRagSearch,t.ensureInternalKnowledge(),t}registerMCPSource(e){e.id||(e.id=`external.${L++}`);let t=new W(e);return this.registerSource(e.id,s=>t.search(s)),t}};var R=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"||!u?.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"||!u?.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"||!u?.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 de}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as pe}from"@modelcontextprotocol/sdk/client/streamableHttp.js";var v={name:"@intelliweave/embedded",version:"2.2.80",description:"Integrate IntelliWeave into your app or website.",main:"./dist/webpack/index.js",types:"./dist/webpack/index.d.ts",type:"module",exports:{".":"./dist/webpack/index.js","./component":"./dist/component/component.js","./node":"./dist/node/node.js","./react":"./dist/react/react.js","./webpack":"./dist/webpack/index.js"},scripts:{build:"npm run build:lib && npm run build:docs","build:lib":"tsx build.ts","build:dev":"cross-env DEVELOPMENT=1 npm run build","build:docs":"typedoc src/index.mts --out dist/docs/",deploy:'npm run build && gsutil cp ./dist/web-weaver.min.js gs://metapress-cdn/web-weaver.min.js && gcloud compute url-maps invalidate-cdn-cache mp-cdn-loadbalancer --project="mp-backend-api" --path "/web-weaver.min.js" --async',"start:server":"cd server && npm run start","deploy:server":"cd server && npm run deploy","llm:build":"cd llm-server && docker build -t web-weaver-llm .","llm:start":"npm run llm:build && docker run -it --rm -p 8000:80 --gpus=all web-weaver-llm","llm:deploy.docker":"npm run llm:build && gcloud auth configure-docker us-central1-docker.pkg.dev && docker tag web-weaver-llm us-central1-docker.pkg.dev/ydangle-web-companion/docker-artifacts/web-weaver-llm && docker push us-central1-docker.pkg.dev/ydangle-web-companion/docker-artifacts/web-weaver-llm","llm:deploy":'npm run llm:deploy.docker && gcloud run deploy web-weaver-llm --project=ydangle-web-companion --image=us-central1-docker.pkg.dev/ydangle-web-companion/docker-artifacts/web-weaver-llm --allow-unauthenticated --region=us-central1 --description="Web Weaver LLM" --concurrency=2 --min-instances=0 --timeout=5m --memory=16Gi --cpu=8',prepack:"npm run build",test:"npm run build && vitest run","test:local":"IW_API_URL=http://localhost:3000/api npm run test"},keywords:["web","weaver","ai","assistant","chat"],author:"jjv360",license:"UNLICENSED",devDependencies:{"@types/audioworklet":"^0.0.97","@types/lodash":"^4.17.24","@types/react":"^19.2.14",bestzip:"^2.2.2","cross-env":"^10.1.0","find-cache-dir":"^6.0.0",lodash:"^4.17.23","onnxruntime-web":"^1.24.3",react:"^19.2.4","replace-in-file":"^8.4.0",tsup:"^8.5.1",tsx:"^4.21.0",typedoc:"^0.28.18",vitest:"^4.1.0"},peerDependencies:{"onnxruntime-web":"^1.20.0",react:"^18 || ^19"},dependencies:{"@anthropic-ai/sdk":"^0.80.0","@modelcontextprotocol/sdk":"^1.27.1","@types/json-schema":"^7.0.15",minisearch:"^7.2.0",openai:"^6.32.0","rehype-document":"^7.0.3","rehype-external-links":"^3.0.0","rehype-format":"^5.0.1","rehype-stringify":"^10.0.1","remark-gfm":"^4.0.1","remark-parse":"^11.0.0","remark-rehype":"^11.1.2",unified:"^11.0.5","utility-types":"^3.11.0",uuid:"^13.0.0"}};import{LoggingMessageNotificationSchema as he,ToolListChangedNotificationSchema as ge}from"@modelcontextprotocol/sdk/types.js";var m=new g("MCPKnowledgeClient"),me="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||me));let s=new de({name:v.name,version:v.version}),o=new pe(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(he,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(ge,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 o=await this.client.listTools({cursor:t});t=o.nextCursor;for(let r of o.tools||[])e.push(r);if(!o?.tools?.length||!t)break}let n=[],s=this.config.id||"mcp";for(let o of e){let r=!!(this.config.searchToolName&&o.name==this.config.searchToolName&&!this.config.searchToolVisible),c=`${s}_${o.name}`;n.push({id:c,name:o.name,content:o.description||"",type:"action",isContext:!0,parameters:o.inputSchema,action:l=>this.performToolCall(o.name,l),disabled:r})}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 fe}from"uuid";var we=new g("Statistics"),E=[];async function I(u,e){let t={...e,event_id:fe(),event_date:new Date().toISOString(),sdk_version:v.version,conversation_id:u?.conversationID||"",api_key:u?.apiKey||"",user_id:u?.userID||""};if(E.push(t),!u||(await new Promise(s=>setTimeout(s,5e3)),E.length===0))return;let n=E.slice();E.length=0;try{let s=await fetch(u.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){we.warn("Failed to submit analytics event:",s),E.push(...n);return}}var k=new g("KnowledgeBase"),be=8*1024,L=1,O=class u{constructor(e){this._sources=[];this._windowSources=[];this.lastResults=[];this.manualEntries=[];this.allowWindowSources=!0;this.allowGlobalConfigSources=!0;this.allowRagSearch=!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 i=>{try{let p=Date.now(),h=await i.query(e);return k.debug(`Source '${i.id}' took ${Date.now()-p}ms`),h||[]}catch(p){return k.warn(`Knowledge source '${i.id}' failed:`,p),[]}}))).flat();o=o.concat(n.entries),o=o.concat(this.manualEntries),this.allowGlobalConfigSources&&y().knowledgeBase&&(o=o.concat(y().knowledgeBase)),o=o.filter(i=>i&&!i.disabled);let r=new Map;for(let i of o)i.id&&r.set(i.id,(r.get(i.id)||0)+1);for(let[i,p]of r)if(p>1){k.warn(`Duplicate knowledge base item ID detected: '${i}' appears ${p} times. Adding suffixes to make them unique.`);let h=1,f=!0;for(let S of o)if(S.id===i){if(f){f=!1;continue}S.id=`${i}(${h})`,h++}}for(let i=0;i<o.length;i++){let p=o[i];p.id=p.id||`temp.${i}`,p._functionID=p.id.replaceAll(/[^a-zA-Z0-9_]/g,"_")}let c=new ye({fields:["id","type","name","content","tags"],storeFields:[],searchOptions:{boost:{name:3,tags:2},fuzzy:.2}});c.addAll(o);let d=c.search(e).map(i=>o.find(p=>p.id==i.id)).filter(Boolean),a=0;d=d.filter(i=>{if(i.isContext)return!0;let p=(i.content||"").length;return a+p>be?!1:(a+=p,!0)});for(let i of o)i.isContext&&(d.find(p=>p.id===i.id)||d.push(i));return this.lastResults=d,I(this.ai,{event_type:"kb_search",value:d.length,value_str:"",event_properties:{search_time_ms:Date.now()-t,sources_searched:this.sources.length}}),k.debug("Found results:",d),d}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(l,d)=>{k.debug(`Calling remote knowledge base action: ${l.id}`);let a={type:"action",userID:this.ai.userID,actionID:l.id,parameters:d},i=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!i.ok)throw new Error(`HTTP Error ${i.status} ${i.statusText}`);let p=await i.json();return c(p.updateItems||[]),p.response},c=l=>{for(let d of l){if(!d.id){k.warn("KB item skipped since it has no ID.",d);continue}let a=n.find(i=>i.id==d.id);if(a){a.name=d.name||a.name||"",a.content=d.content||a.content||"",a.disabled=d.disabled??a.disabled,a.isContext=d.isContext??a.isContext,a.parameters=d.parameters||a.parameters||[],a.tags=d.tags||a.tags,a.type=d.type||a.type;continue}n.push({...d,action:i=>r(d,i)})}};this.registerSource(t,async l=>{if(o&&s.includes(l))return n;let d={type:"search",userID:this.ai?.userID||"",query:l},a=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)});if(!a.ok)throw new Error(`HTTP Error ${a.status} ${a.statusText}`);let i=await a.json();return o=!i.noCache,s.includes(l)||s.push(l),c(i.items),n})}clone(e){let t=new u(e);return t._sources=this._sources.slice(),t._windowSources=this._windowSources.slice(),t.manualEntries=this.manualEntries.slice(),t.allowGlobalConfigSources=this.allowGlobalConfigSources,t.allowWindowSources=this.allowWindowSources,t.allowRagSearch=this.allowRagSearch,t.ensureInternalKnowledge(),t}registerMCPSource(e){e.id||(e.id=`external.${L++}`);let t=new W(e);return this.registerSource(e.id,n=>t.search(n)),t}};function ve(u){let e="",t=[],n=0;for(;n<u.length;){let s=u.indexOf("<[[",n);if(s===-1){e+=u.slice(n);break}e+=u.slice(n,s);let o=u.indexOf("]]>",s+3);if(o===-1)break;let r=u.slice(s,o+3),c=u.slice(s+3,o).trim(),l={raw:r,content:c};try{let d=JSON.parse(c);d&&typeof d=="object"&&!Array.isArray(d)&&(l.action=d)}catch{}t.push(l),n=o+3}return{visibleText:e,actions:t.flatMap(s=>s.action?[s.action]:[]),blocks:t}}function Z(u){return ve(u).visibleText}var R=class{constructor(e){this.messages=e}text(){return this.messages?.flatMap(e=>e.sections)?.filter(e=>e?.type=="text")?.map(e=>Z(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(
|
|
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 K=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
|
|
|
27
27
|
Reply only with one of the following options:
|
|
28
|
-
${e.options.map(
|
|
28
|
+
${e.options.map(n=>`- "${n}"`).join(`
|
|
29
29
|
`)}
|
|
30
30
|
|
|
31
|
-
Do not include any additional text or explanations.`});return e.options.includes(t)?t:e.options.find(
|
|
31
|
+
Do not include any additional text or explanations.`});return e.options.includes(t)?t:e.options.find(n=>t.toLowerCase().includes(n.toLowerCase()))}async extract(e){let t=`
|
|
32
32
|
You will receive some data. Extraction instructions: ${e.instruction}
|
|
33
33
|
|
|
34
34
|
${e.allowMultiple?"Return a JSONL string only, one JSON object on each line.":"Return a valid JSON object only."}
|
|
35
35
|
|
|
36
36
|
Objects should have the following keys:
|
|
37
|
-
${e.extractions.map(
|
|
37
|
+
${e.extractions.map(s=>`- ${s.name} (${s.type}): ${s.description||"No description provided."}`).join(`
|
|
38
38
|
`)}
|
|
39
|
-
`,
|
|
40
|
-
`).map(r=>r.trim()).filter(r=>!!r.trim()),o=[];for(let r of
|
|
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(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 N=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 U,s.userID=this.ai.userID,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(),s.knowledgeBase.allowRagSearch=!e.disableRagSearch,e.knowledge&&s.knowledgeBase.registerSource(e.knowledge),e.onAgentLoaded&&await e.onAgentLoaded(s),(await s.sendMessage(t)).text()}};var w=new g("Main"),te=new Set,T=class T extends EventTarget{constructor(){super(...arguments);this.conversationID=ee();this.knowledgeBase=new O(this);this.subAgents=new N(this);this._lastKBsearch="";this.models=[];this.audio=null;this.apiKey="";this.logic=new K(this);this.userID=F();this.hubAPI="https://intelliweave.ai/api";this._lastSystemMsg="";this.lastKBItems=[];this.isProcessing=!1;this.activeAnalyticsPromises=[]}get loaded(){return!!(this.config&&this.currentModel)}get flags(){return this.config?.flags||{}}getBuiltInActionsInfo(){return{version:T.builtInActionsVersion,availableActions:["ui.openURL - Open URLs in new tabs","ui.changeRoute - Change page routes","ui.sendEmail - Send emails via mailto links","embedded.suggestion - Add hidden follow-up suggestion buttons in the built-in UI","embedded.emoji - Trigger hidden emoji effects in the built-in UI","search - Search knowledge base"],enabledFlags:this.flags}}async load(t,n){if(this.apiKey=t,!t)throw new Error("API key is required to load the AI.");n?.userID&&(this.userID=n.userID),n?.hubAPI&&(this.hubAPI=n.hubAPI);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,userID:this.userID})});if(!s.ok){let o=`${s.status} ${s.statusText}`;try{let r=await s.json();r.error?o=r.error:r.message&&(o=r.message)}catch(r){w.debug("Could not parse error response body:",r)}throw new Error(`Failed to load configuration: ${o}`)}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 D(s):this.currentModel=new P(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,disabled:!this.knowledgeBase.allowRagSearch,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(n=>`- ${n.name} (${n.type}): ${n.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
|
|
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
52
|
`,r=!1),o+=`- name: "${c.name||""}"
|
|
53
53
|
mimetype: "${c.mimeType||""}"
|
|
54
54
|
url: "${c.url}"
|
|
55
|
-
`);r||(o+="```\n"),this.currentModel.contextGroup.add({id:
|
|
56
|
-
${o}`,cannotRemove:
|
|
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;for(let s of this.lastKBItems)!s.isContext||!s.id||t.find(r=>r.id==s.id)||(this.currentModel.contextGroup.remove(s.id),s._functionID&&this.currentModel.toolGroup.remove(s._functionID));this.lastKBItems=t}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(),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=Date.now(),o=await this.currentModel.sendMessage(t),r=new R(o);(this._voiceTracker||w.debug.bind(w))(`LLM response took ${Date.now()-s}ms`);let l=this.currentModel.contextGroup.getAllAsString();l+=`
|
|
57
57
|
|
|
58
58
|
=== TOOLS ===
|
|
59
59
|
|
|
60
|
-
`+this.currentModel.toolGroup.getAll().map(
|
|
61
|
-
`),this._lastSystemMsg!=
|
|
60
|
+
`+this.currentModel.toolGroup.getAll().map(d=>"- "+d.data?.name).join(`
|
|
61
|
+
`),this._lastSystemMsg!=l&&(this._lastSystemMsg=l,this.submitAnalyticsEvent({type:"system-msg",txt:l}));for(let d of o)for(let a of d.sections||[])if(a.type=="text")this.submitAnalyticsEvent({type:"message",role:"assistant",message:a.text||""});else if(a.type=="thinking")this.submitAnalyticsEvent({type:"thinking",role:"assistant",message:a.text||""});else if(a.type=="tool_call"){let i=r.toolResult(a.toolCallInstanceID);this.submitAnalyticsEvent({type:"action",role:"assistant",action:a.toolKbID||"",actionName:a.toolKbName||"",value:a.toolParameters,result:i?.toolErrorResponse||i?.toolSuccessResponse,isError:!!i?.toolErrorResponse})}else a.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=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),t}get messages(){return this.currentModel?.messageGroup.items||[]}};T.version=v.version,T.builtInActionsVersion="1.2.0",w.debug(`Loaded: version=${v.version} builtInActionsVersion=${T.builtInActionsVersion}`);var U=T;export{D as AnthropicChat,z as BufferedWebSocket,_ as ChatBase,P as ChatGPT,V as FixedBufferStream,U as IntelliWeave,R as IntelliWeaveMessageParser,O as KnowledgeBase,g as Logging,W as MCPKnowledgeClient,J as ONNXModel,H as Resampler,b as TokenWindow,G as TokenWindowGroup,C as TokenWindowGroupItemSectionType,Ee as audioToWav,q as convertParamsToJSONSchema,Pe as floatTo16BitPCM,De as floatTo64BitPCM,F as getDefaultUserID,We as int16ToFloat32BitPCM,y as intelliweaveConfig,B as intelliweaveGlobalThis,ke as sseEvents,A as trimWhitespaceInText};
|
package/dist/react/react.d.ts
CHANGED
|
@@ -972,6 +972,8 @@ interface BuiltInActionFlags {
|
|
|
972
972
|
allowChangeRoute?: boolean;
|
|
973
973
|
/** Allows the AI to craft an email and use mailto: link */
|
|
974
974
|
allowSendEmail?: boolean;
|
|
975
|
+
/** Allows the AI to trigger hidden embedded emoji effects in the built-in UI */
|
|
976
|
+
allowEmojiActions?: boolean;
|
|
975
977
|
/** Makes the AI only use information from knowledge bases, not general knowledge */
|
|
976
978
|
onlyUseKnowledgeBase?: boolean;
|
|
977
979
|
}
|
|
@@ -1011,6 +1013,8 @@ interface WebWeaverGPTConfig {
|
|
|
1011
1013
|
offsetX?: number;
|
|
1012
1014
|
/** Vertical offset from edge in pixels (default: 20) - only used when positioningMode is 'fixed' */
|
|
1013
1015
|
offsetY?: number;
|
|
1016
|
+
/** Custom brand name displayed in the panel header kicker (replaces "IntelliWeave"). */
|
|
1017
|
+
brandName?: string;
|
|
1014
1018
|
/** Identifier of an external app or service which manages this persona, if any. (eg. "chatterly") */
|
|
1015
1019
|
managedBy?: string;
|
|
1016
1020
|
/** Voice information */
|