@degreesign/chat 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export { createChat, preloadModel } from './chat';
2
+ export { builtinTools, calculateTool, currencyTool, webSearchTool, } from './tools';
2
3
  export { LlmRole, ChatStatus, LlmStatus, LlmBackend, LlmPhase, ChatModelId, BuiltinTool, WebSearchProvider, } from './enums';
3
4
  export type { ChatMessage, LlmLimits, ChatStatusSnapshot, ChatInput, ChatPreloadInput, CancelChat, WllamaAssets, ChatTool, ChatToolCall, ChatToolResult, ChatToolSchema, ChatToolValue, WebSearchConfig, WebSearchResult, } from './types';
package/dist/models.d.ts CHANGED
@@ -22,7 +22,5 @@ resolveLlmModel: (id?: ChatModelId) => Promise<ChatModel | undefined>,
22
22
  /** Whether a model accepts images */
23
23
  supportsImages: (model: ChatModel, mobile?: boolean) => boolean,
24
24
  /** Whether a model accepts audio */
25
- supportsAudio: (model: ChatModel, mobile?: boolean) => boolean,
26
- /** Whether a model accepts tool declarations */
27
- supportsTools: (model: ChatModel, mobile?: boolean) => boolean;
28
- export { llmModels, cpuContextWindow, mobileCpuContextWindow, litertContextWindow, mobileDevice, litertArtifact, findLlmModel, gpuAdapter, defaultLlmModel, resolveLlmModel, supportsImages, supportsAudio, supportsTools, };
25
+ supportsAudio: (model: ChatModel, mobile?: boolean) => boolean;
26
+ export { llmModels, cpuContextWindow, mobileCpuContextWindow, litertContextWindow, mobileDevice, litertArtifact, findLlmModel, gpuAdapter, defaultLlmModel, resolveLlmModel, supportsImages, supportsAudio, };
@@ -1,2 +1,2 @@
1
1
  /*! For license information please see chat.node.min.js.LICENSE.txt */
2
- (()=>{var e={69(e,t){(()=>{"use strict";var e={125:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addZ=t.tN=t.monNm=t.tmUTC=t.tmAP=t.moYrDt=t.shortDt=t.fullLong=t.fullDate=t.fullDt=t.invDt=t.dayRes=t.timeStandard=t.dateStandard=t.seoDt=t.thisYear=t.oneMon=t.oneMin=t.oneHr=t.oneDay=t.oneSec=void 0;const r=()=>Date.now(),n=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],a=["st","nd","rd","th"],i=e=>0==+e?"00":+e<10&&+e>=1?`0${e}`:`${e}`,s=e=>{const t=new Date(e);return`${t.getUTCFullYear()}-${i(t.getUTCMonth()+1)}-${i(t.getUTCDate())}`},c=e=>i(e.getUTCHours())+`:${i(e.getUTCMinutes())}`+`:${i(e.getUTCSeconds())}`;t.tN=r,t.monNm=n,t.dayRes=90,t.oneSec=1e3,t.oneMin=6e4,t.oneHr=36e5,t.oneDay=864e5,t.oneMon=27e8,t.addZ=i,t.tmUTC=e=>{const t=new Date(e);return i(t.getUTCHours())+`:${i(t.getUTCMinutes())} UTC`},t.tmAP=e=>{const t=new Date(e),r=t.getHours();return i(r>12?r-12:r)+`:${i(t.getMinutes())}`+(r>=12?"pm":"am")},t.shortDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]}`},t.moYrDt=e=>{const t=new Date(e);return`${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDate=e=>{const t=new Date(e);return`${t.getDate()} ${n[t.getMonth()]} ${t.getFullYear()}`},t.fullLong=e=>`${(e=>{const t=new Date(e),r=t.getDate();return r+a[r<5?r-1:r>4&&r<21?3:r>20&&r<25?r-21:r>24&&r<31?3:0]+` of ${n[t.getMonth()]}`})(e)} ${new Date(e).getFullYear()}`,t.thisYear=e=>(e?new Date(e):new Date)?.getUTCFullYear(),t.dateStandard=s,t.timeStandard=c,t.seoDt=e=>{!e&&(e=r());const t=new Date(e);return`${s(t)}T${c(t)}Z`},t.invDt=e=>{const t=new Date(e);return`${t.getUTCFullYear()}`.split("20")[1]+i(t.getUTCMonth()+1)+i(t.getUTCDate())+`${e}`.slice(10)}},240:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.idRandLong=t.idRandShort=t.idShuffle=void 0;const r=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","@",".","_","0","1","2","3","4","5","6","7","8","9"];t.idShuffle=async({data:e,password:t})=>4==t?.length?(({data:e,password:t})=>{try{const n=(e,t)=>r.includes(e.toLowerCase())?r[(r.indexOf(e.toLowerCase())+Math.pow(t,3))%r.length]:e;return[...e].map(e=>n(e,Number(t))).join("")}catch{return""}})({data:e,password:t}):await(async({data:e,password:t})=>{if(!e||!t)return"";try{crypto.subtle;const r=new TextEncoder,n=r.encode(e),o=r.encode(t),a=await crypto.subtle.digest("SHA-256",o),i=new Uint8Array(a),s=i.slice(0,32),c=i.slice(0,12),l=await crypto.subtle.importKey("raw",s,{name:"AES-GCM"},!1,["encrypt"]),u=await crypto.subtle.encrypt({name:"AES-GCM",iv:c},l,n);return btoa(String.fromCharCode(...new Uint8Array(u))).replace(/\+/g,"a").replace(/\//g,"b").replace(/=/g,"c").toLowerCase()}catch{return""}})({data:e,password:t}),t.idRandShort=(e=10)=>{try{return crypto.randomUUID()?.replaceAll("-","")?.slice(0,e)}catch(e){return console.log("idRandShort failed",e),""}},t.idRandLong=(e=10)=>{try{const t="abcdefghijklmnopqrstuvwxyz",r=new Uint8Array(e);return crypto.getRandomValues(r),Array.from(r).map(e=>t[e%26]).join("")}catch(e){return console.log("idRandLong failed",e),""}}},246:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.cacheCheck=t.delayCode=void 0;const n=r(125);t.delayCode=async(e=0)=>await new Promise(t=>setTimeout(t,e)),t.cacheCheck=({analysisCacheLimit:e,lastUpdated:t,forceRefresh:r})=>{const o=Date.now();if(t&&(!r&&t>o-e||r&&t>o-n.oneDay))return!0}},792:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isEven=t.pNum=t.sharpeRatio=t.priceVariations=t.nTxtAr=t.zNum=t.addCom=t.adjNum=t.rNum=void 0;const r=[1,.1,.01,.001,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10,1e-11,1e-12,1e-13,1e-14,1e-15,1e-16,1e-17,1e-18,1e-19],n=(e,t=6)=>{const n=+e,o=n?Math.abs(n):0,a=o>1&&t?t-`${Math.round(o)}`.length:0;return n?(n<0?-1:1)*(Number.isInteger(o)||o<1e-16?o:o>1e5?Math.round(o):o>1?Number(o.toFixed(a<0?0:a)):((e,t)=>{let n=0;for(const o of r){if(o<e)return Number(e.toFixed(t+n-1));n++}return e})(o,t)):e},o=(e,t)=>{const r=(n(e,t)+"").split(".");return r[0]=r[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),r.join(".")},a=(e,t=3)=>{const r=Number(e);if(!e||!r)return e+"";const a=Math.abs(r);return(r<0?"-":"")+(a>1e9?o(a/1e9,t)+"b":a>1e6?o(a/1e6,t)+"m":a<1e-6&&a>1e-16?(1+n(a,t)+"").replace(/1./g,"0."):o(a,t))};t.nTxtAr=["zero","one","two","three","four","five","six","seven","eight","nine","ten"],t.rNum=n,t.addCom=o,t.adjNum=a,t.zNum=e=>{const t=Number(e);let r=t?Math.abs(t):0,n=1e10;for(;n>1;)r>n&&(r=Math.round(r/(n/10))*(n/10)),n/=10;return t?(t<0?"-":"")+a(r,2):e},t.pNum=e=>+e||0==+e?Math.round(1e6*+e)/1e6:null,t.priceVariations=e=>{try{let t=0;const r=[...e].sort((e,t)=>e[0]-t[0]),n=e.reduce((e,[,t])=>e+t,0),o=r.find(([,e])=>(t+=e,t>=n/2))[0];return e.filter(([e])=>Math.abs(e-o)/o<.05).map(([e])=>e)}catch{return[]}},t.sharpeRatio=({assetPrices:e,minExpectedReturn:t=.05})=>{if(!e?.length||e?.length<2)return 0;const r=e.slice(1).map((t,r)=>(t-e[r])/e[r]),n=r.reduce((e,t)=>e+t,0)/r.length,o=Math.sqrt(r.reduce((e,t)=>e+Math.pow(t-n,2),0)/r.length);return(n-t)/o},t.isEven=e=>e%2==0},794:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restoreObj=t.restoreObjStr=t.storeObj=t.storeObjStr=t.objNestValueCount=t.objLen=t.objSortSimple=t.objSort=void 0;const n=r(125),o=e=>{try{return Object.keys(e||{})?.length||0}catch(e){return console.log(e),0}},a=e=>{try{return e?.replace(/"/g,"'")}catch(e){return console.log((0,n.tN)(),"storeObjStr failed",e),""}},i=e=>{try{return e?.toString()?.replace(/'/g,'"')}catch(e){console.log((0,n.tN)(),"restoreObjStr failed",e)}};t.objLen=o,t.objNestValueCount=e=>{let t=0;if(o(e))for(const r in e)t+=o(e[r])?1:0;return t},t.objSort=(e={},t,r=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,n])=>null===e[t]||void 0===e[t]?1:null===n[t]||void 0===n[t]?-1:e[t]>n[t]?1*r:-1*r)),t.objSortSimple=(e={},t=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,r])=>null==e?1:null==r?-1:e>r?1*t:-1*t)),t.storeObjStr=a,t.storeObj=e=>{try{return a(JSON.stringify(e))}catch(e){return console.log((0,n.tN)(),"storeObj failed",e),""}},t.restoreObjStr=i,t.restoreObj=e=>{try{if(!e)return;const t=i(e);return t?JSON.parse(t):void 0}catch(e){console.log((0,n.tN)(),"restoreObj failed",e)}}},830:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.phaseDifference=t.compareArrays=t.squeezeArray=t.forecastNextTotal=t.forecastNext=t.getMax=t.getMean=t.getSum=t.maxVl=t.minVl=t.sumArr=void 0;const r=e=>{try{return e?.length?e.reduce((e,t)=>e+t):0}catch(e){return console.log("sumArr failed",e),0}},n=e=>{try{return e?.length?e.reduce((e,t)=>e+t,0):0}catch(e){return console.log("getSum failed",e),0}},o=e=>{try{return e?.length?n(e)/e.length:0}catch(e){return console.log("getMean failed",e),0}},a=e=>{try{return e?.length?Math.max(...e):0}catch(e){return console.log("getMax failed",e),0}},i=e=>{try{if(!e?.length)return 0;const t=[...e].sort((e,t)=>e-t),r=Math.floor(t.length/2);return t.length%2?t[r]:(t[r-1]+t[r])/2}catch(e){return console.log("median failed",e),0}},s=({currentPeriod:e,steps:t=1})=>{try{const r=(Array.isArray(e)?e:[]).filter(Number.isFinite);if(!r.length||t<=0)return[];if(r.length<2){const e=Math.max(0,o(r));return Array.from({length:t},()=>e)}const n=r.length,{slope:s,intercept:c}=(e=>{try{const t=e.length,r=[];for(let n=0;n<t-1;n++)for(let o=n+1;o<t;o++)r.push((e[o]-e[n])/(o-n));const n=i(r);return{slope:n,intercept:i(e.map((e,t)=>e-n*t))}}catch(e){return console.log("theilSen failed",e),{slope:0,intercept:0}}})(r),l=c+s*(n-1),u=a(r),d=u>0?3*u:1/0;return Array.from({length:t},(e,t)=>{const r=t+1,o=l+s*n*Math.log1p(r/n);return Math.max(0,Math.min(o,d))})}catch(e){return console.log("forecastNext failed",e),[]}};t.sumArr=r,t.maxVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]>r&&(r=o[t])}return r},t.minVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]<r&&(r=o[t])}return r},t.getSum=n,t.getMean=o,t.getMax=a,t.forecastNext=s,t.forecastNextTotal=e=>{try{const t=s({currentPeriod:e,steps:e?.length});return n(t)}catch(e){return console.log("forecastNextTotal failed",e),0}},t.squeezeArray=({arr:e,targetLength:t})=>{try{if(!e||0===e.length||t<=0)throw new Error("Invalid input");const n=Math.ceil(e.length/t);return Array.from({length:t},(t,o)=>{const a=o*n,i=Math.min(a+n,e.length),s=e.slice(a,i);return r(s)}).slice(0,t)}catch(e){return console.log("squeezeArray failed",e),[]}},t.compareArrays=({arrays:e})=>{try{const t=[...e],n=Math.min(...t.map(e=>e.length));for(let e=0;e<t.length;e++)t.splice(n);const o=t.map(e=>r(e)),a=[],i=Math.min(...o),s=o.indexOf(i),c=i/Math.max(...o);for(let e=0;e<t.length;e++){const r=t[e];if(a[e]=[],e==s)a[e]=r;else for(let t=0;t<r.length;t++)a[e].push(c*r[t])}return a}catch(t){return console.log("compareArrays failed",t),e}},t.phaseDifference=({array1:e,array2:t})=>{try{let r=e.length,n=e.reduce((e,t)=>e+t)/r,o=t.reduce((e,t)=>e+t)/r,a=e.map(e=>e-n),i=t.map(e=>e-o),s=Math.floor(r/2),c=-1/0,l=0;for(let e=-s;e<=s;e++){let t=0,n=0,o=0,s=0;for(let c=0;c<r;c++){let l=c+e;l>=0&&l<r&&(t+=a[c]*i[l],n+=a[c]*a[c],o+=i[l]*i[l],s++)}if(n>0&&o>0&&s>=.8*r){let r=t/Math.sqrt(n*o);r>c&&(c=r,l=e)}}return l}catch(e){return console.log("phaseDifference failed",e),0}}}},r={};function n(t){var o=r[t];if(void 0!==o)return o.exports;var a=r[t]={exports:{}};return e[t](a,a.exports,n),a.exports}var o={};(()=>{var e=o;Object.defineProperty(e,"__esModule",{value:!0}),e.idShuffle=e.isEven=e.pNum=e.nTxtAr=e.zNum=e.addCom=e.adjNum=e.rNum=e.sharpeRatio=e.priceVariations=e.timeStandard=e.dateStandard=e.addZ=e.tN=e.monNm=e.tmUTC=e.tmAP=e.moYrDt=e.shortDt=e.fullLong=e.fullDate=e.fullDt=e.invDt=e.dayRes=e.thisYear=e.seoDt=e.oneMon=e.oneMin=e.oneHr=e.oneDay=e.oneSec=e.restoreObj=e.restoreObjStr=e.storeObj=e.storeObjStr=e.objSortSimple=e.objSort=e.objNestValueCount=e.objLen=e.phaseDifference=e.compareArrays=e.squeezeArray=e.forecastNextTotal=e.forecastNext=e.getMax=e.getMean=e.getSum=e.maxVl=e.minVl=e.sumArr=void 0,e.cacheCheck=e.delayCode=e.idRandLong=e.idRandShort=void 0;const t=n(246);Object.defineProperty(e,"cacheCheck",{enumerable:!0,get:function(){return t.cacheCheck}}),Object.defineProperty(e,"delayCode",{enumerable:!0,get:function(){return t.delayCode}});const r=n(830);Object.defineProperty(e,"sumArr",{enumerable:!0,get:function(){return r.sumArr}}),Object.defineProperty(e,"minVl",{enumerable:!0,get:function(){return r.minVl}}),Object.defineProperty(e,"maxVl",{enumerable:!0,get:function(){return r.maxVl}}),Object.defineProperty(e,"getMax",{enumerable:!0,get:function(){return r.getMax}}),Object.defineProperty(e,"getMean",{enumerable:!0,get:function(){return r.getMean}}),Object.defineProperty(e,"getSum",{enumerable:!0,get:function(){return r.getSum}}),Object.defineProperty(e,"forecastNext",{enumerable:!0,get:function(){return r.forecastNext}}),Object.defineProperty(e,"forecastNextTotal",{enumerable:!0,get:function(){return r.forecastNextTotal}}),Object.defineProperty(e,"squeezeArray",{enumerable:!0,get:function(){return r.squeezeArray}}),Object.defineProperty(e,"compareArrays",{enumerable:!0,get:function(){return r.compareArrays}}),Object.defineProperty(e,"phaseDifference",{enumerable:!0,get:function(){return r.phaseDifference}});const a=n(240);Object.defineProperty(e,"idRandLong",{enumerable:!0,get:function(){return a.idRandLong}}),Object.defineProperty(e,"idRandShort",{enumerable:!0,get:function(){return a.idRandShort}}),Object.defineProperty(e,"idShuffle",{enumerable:!0,get:function(){return a.idShuffle}});const i=n(792);Object.defineProperty(e,"addCom",{enumerable:!0,get:function(){return i.addCom}}),Object.defineProperty(e,"adjNum",{enumerable:!0,get:function(){return i.adjNum}}),Object.defineProperty(e,"priceVariations",{enumerable:!0,get:function(){return i.priceVariations}}),Object.defineProperty(e,"nTxtAr",{enumerable:!0,get:function(){return i.nTxtAr}}),Object.defineProperty(e,"rNum",{enumerable:!0,get:function(){return i.rNum}}),Object.defineProperty(e,"zNum",{enumerable:!0,get:function(){return i.zNum}}),Object.defineProperty(e,"sharpeRatio",{enumerable:!0,get:function(){return i.sharpeRatio}}),Object.defineProperty(e,"pNum",{enumerable:!0,get:function(){return i.pNum}}),Object.defineProperty(e,"isEven",{enumerable:!0,get:function(){return i.isEven}});const s=n(125);Object.defineProperty(e,"oneSec",{enumerable:!0,get:function(){return s.oneSec}}),Object.defineProperty(e,"oneDay",{enumerable:!0,get:function(){return s.oneDay}}),Object.defineProperty(e,"oneHr",{enumerable:!0,get:function(){return s.oneHr}}),Object.defineProperty(e,"oneMin",{enumerable:!0,get:function(){return s.oneMin}}),Object.defineProperty(e,"oneMon",{enumerable:!0,get:function(){return s.oneMon}}),Object.defineProperty(e,"seoDt",{enumerable:!0,get:function(){return s.seoDt}}),Object.defineProperty(e,"dayRes",{enumerable:!0,get:function(){return s.dayRes}}),Object.defineProperty(e,"invDt",{enumerable:!0,get:function(){return s.invDt}}),Object.defineProperty(e,"fullDt",{enumerable:!0,get:function(){return s.fullDt}}),Object.defineProperty(e,"fullDate",{enumerable:!0,get:function(){return s.fullDate}}),Object.defineProperty(e,"fullLong",{enumerable:!0,get:function(){return s.fullLong}}),Object.defineProperty(e,"shortDt",{enumerable:!0,get:function(){return s.shortDt}}),Object.defineProperty(e,"moYrDt",{enumerable:!0,get:function(){return s.moYrDt}}),Object.defineProperty(e,"tmAP",{enumerable:!0,get:function(){return s.tmAP}}),Object.defineProperty(e,"tmUTC",{enumerable:!0,get:function(){return s.tmUTC}}),Object.defineProperty(e,"monNm",{enumerable:!0,get:function(){return s.monNm}}),Object.defineProperty(e,"tN",{enumerable:!0,get:function(){return s.tN}}),Object.defineProperty(e,"addZ",{enumerable:!0,get:function(){return s.addZ}}),Object.defineProperty(e,"timeStandard",{enumerable:!0,get:function(){return s.timeStandard}}),Object.defineProperty(e,"dateStandard",{enumerable:!0,get:function(){return s.dateStandard}}),Object.defineProperty(e,"thisYear",{enumerable:!0,get:function(){return s.thisYear}});const c=n(794);Object.defineProperty(e,"objSort",{enumerable:!0,get:function(){return c.objSort}}),Object.defineProperty(e,"objLen",{enumerable:!0,get:function(){return c.objLen}}),Object.defineProperty(e,"objNestValueCount",{enumerable:!0,get:function(){return c.objNestValueCount}}),Object.defineProperty(e,"restoreObj",{enumerable:!0,get:function(){return c.restoreObj}}),Object.defineProperty(e,"restoreObjStr",{enumerable:!0,get:function(){return c.restoreObjStr}}),Object.defineProperty(e,"storeObj",{enumerable:!0,get:function(){return c.storeObj}}),Object.defineProperty(e,"storeObjStr",{enumerable:!0,get:function(){return c.storeObjStr}}),Object.defineProperty(e,"objSortSimple",{enumerable:!0,get:function(){return c.objSortSimple}})})();var a=t;for(var i in o)a[i]=o[i];o.__esModule&&Object.defineProperty(a,"__esModule",{value:!0})})()}};const t={};function r(n){const o=t[n];if(void 0!==o)return o.exports;const a=t[n]={exports:{}};return e[n](a,a.exports,r),a.exports}r.m=e,r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.f={},r.e=e=>{const t=[];return r.f.require(e,t),Promise.all(t)},r.u=e=>({520:"engine-litert",924:"engine-wllama"}[e]+".node.min.js"),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{const e={792:1};r.f.require=(t,n)=>{if(!e[t]){const n=require("./"+r.u(t));e[t]||(t=>{const n=t.modules,o=t.ids,a=t.runtime;for(var i in n)r.o(n,i)&&(r.m[i]=n[i]);a&&a(r);for(var s=0;s<o.length;s++)e[o[s]]=1})(n)}}})();let n={};(()=>{"use strict";var e,t,o,a,i,s,c,l;let u;r.r(n),r.d(n,{BuiltinTool:()=>c,ChatModelId:()=>s,ChatStatus:()=>t,LlmBackend:()=>a,LlmPhase:()=>i,LlmRole:()=>e,LlmStatus:()=>o,WebSearchProvider:()=>l,createChat:()=>Pt,preloadModel:()=>St}),function(e){e.system="system",e.user="user",e.assistant="assistant"}(e||(e={})),function(e){e[e.online=0]="online",e[e.away=1]="away",e[e.offline=2]="offline"}(t||(t={})),function(e){e[e.idle=0]="idle",e[e.downloading=1]="downloading",e[e.ready=2]="ready",e[e.error=3]="error",e[e.unsupported=4]="unsupported"}(o||(o={})),function(e){e.cpu="cpu",e.gpu="gpu",e.none="none"}(a||(a={})),function(e){e.download="download",e.load="load"}(i||(i={})),function(e){e.qwen3_vl_2b="qwen3-vl-2b",e.gemma4_e2b="gemma4-e2b"}(s||(s={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(c||(c={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(l||(l={}));const d=[{id:s.qwen3_vl_2b,reasoning:!0,cpu:{repo:"Qwen/Qwen3-VL-2B-Thinking-GGUF",file:"Qwen3VL-2B-Thinking-Q4_K_M.gguf",mmproj:{file:"mmproj-Qwen3VL-2B-Thinking-Q8_0.gguf"}}},{id:s.gemma4_e2b,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it.litertlm",vision:!0,audio:!0,tools:!0,web:{file:"gemma-4-E2B-it-gpu.litertlm",vision:!1,audio:!1,tools:!0}}}],f=e=>{const t=e??("undefined"==typeof navigator?void 0:navigator);if(!t)return!1;if("boolean"==typeof t.userAgentData?.mobile)return t.userAgentData.mobile;const r=t.userAgent||"";return/Android|iPhone|iPad|iPod|Mobile/i.test(r)||/Macintosh/.test(r)&&t.maxTouchPoints>1},m=(e,t=f())=>{const r=e.litert;if(r)return t&&r.web?r.web:{file:r.file,vision:r.vision,audio:r.audio,tools:r.tools}},g=e=>e?d.find(t=>t.id==e):void 0,p=async()=>(u||(u=(async()=>(await(async()=>{const e="undefined"==typeof navigator?void 0:navigator.gpu;if(!e)return!1;let t;try{return!!await Promise.race([e.requestAdapter({powerPreference:"high-performance"}),new Promise(e=>{t=setTimeout(()=>e(void 0),1500)})])}catch{return!1}finally{t&&clearTimeout(t)}})()?d.find(e=>!!e.litert):d.find(e=>!!e.cpu))?.id)()),await u),h=async e=>g(e||await p()),y=(e,t=f())=>!!e.cpu?.mmproj||!0===m(e,t)?.vision,w=(e,t=f())=>!!e.cpu?.mmproj?.audio||!0===m(e,t)?.audio,b=(e,t=f())=>!0===m(e,t)?.tools,v=require("node:path"),x=()=>{return e=(0,v.join)(__dirname,"../assets/wllama"),{wasm:(0,v.join)(e,"wllama.wasm"),compatWasm:(0,v.join)(e,"compat/wllama.wasm"),compatWorker:(0,v.join)(e,"compat/wllama.js")};var e},j=()=>{return e=(0,v.join)(__dirname,"../assets/litert"),{script:(0,v.join)(e,"litertlm_wasm_internal.js"),wasm:(0,v.join)(e,"litertlm_wasm_internal.wasm")};var e},M=288,k=async e=>{if(!e.startsWith("data:"))return await(await fetch(e)).arrayBuffer();const t=e.indexOf(","),r=t>=0?e.slice(0,t):"";if(t<0)throw new Error("Invalid image data");if(!r.includes(";base64"))return await(await fetch(e)).arrayBuffer();const n=atob(e.slice(t+1)),o=new Uint8Array(n.length);for(let e=0;e<n.length;e++)o[e]=n.charCodeAt(e);return o.buffer},P=async e=>{if(!e||"function"!=typeof fetch||"function"!=typeof createImageBitmap)return e;try{const t=await fetch(e),r=await createImageBitmap(await t.blob()),n=Math.min(r.width,r.height),o=Math.floor((r.width-n)/2),a=Math.floor((r.height-n)/2),i=((e,t)=>{if("undefined"!=typeof OffscreenCanvas)return new OffscreenCanvas(e,t);if("undefined"==typeof document)return;const r=document.createElement("canvas");return r.width=e,r.height=t,r})(M,M),s=i?i.getContext("2d"):null;if(!i||!s||n<1)return r.close(),e;if(s.drawImage(r,o,a,n,n,0,0,M,M),r.close(),(e=>"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas)(i)){const t=await i.convertToBlob({type:"image/jpeg",quality:.85});return await(e=>new Promise(t=>{if("undefined"==typeof FileReader)return void t("");const r=new FileReader;r.onerror=()=>t(""),r.onload=()=>t(`${r.result}`),r.readAsDataURL(e)}))(t)||e}return i.toDataURL("image/jpeg",.85)}catch{return e}},S={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:6},T=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,O=(e={},t=!1)=>{const r=S;return{maxReplyTokens:T(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:T(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:T(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:T(e.maxImages,r.maxImages,0),maxAudio:T(e.maxAudio,r.maxAudio,0),maxContentLength:T(e.maxContentLength,r.maxContentLength,1),promptCharBudget:T(e.promptCharBudget,r.promptCharBudget,1),maxThreads:T(e.maxThreads,r.maxThreads,1)}},C=(e,t)=>({stream:!0,temperature:.7,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),N=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,E=e=>Number(e.headers.get("content-length"))||0,A=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),D=e=>A(e,"image"),L=e=>A(e,"audio"),R=["<|channel>thought\n","<|channel>thought","..."],$=["<channel|>","..."],_=(e,t,r)=>t.length||r.length?[...e?[{type:"text",text:e}]:[],...t.map(e=>({type:"image",url:e})),...r.map(e=>({type:"audio",url:e}))]:e,U=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,q=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...U(e),{type:"text",text:"\n"},...U(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r};class z extends Error{}const F=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new z(r)),t)})])}finally{n&&clearTimeout(n)}},I=e=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}},W=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,start:a,stopped:i,firstTimeoutMs:s=18e4,idleTimeoutMs:c=3e4,onStall:l})=>{let u="",d="",f="",m=!1,g=0,p=0;const h=((e,t)=>{let r="",n=!1;const o=(e,t)=>{let r=-1,n="";for(const o of t){const t=e.indexOf(o);t>=0&&(r<0||t<r)&&(r=t,n=o)}return{at:r,tag:n}},a=(e,t)=>{let r="";for(const n of t)for(let t=Math.min(e.length,n.length-1);t>r.length;t--)if(e.endsWith(n.slice(0,t))){r=e.slice(e.length-t);break}return r};return{feed:i=>{let s=r+i;for(r="";s;){if(n){const{at:t,tag:i}=o(s,$);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,$);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,R);if(e>=0){e&&t(s.slice(0,e)),s=s.slice(e+i.length),s.startsWith("\n")&&(s=s.slice(1)),n=!0;continue}const c=a(s,R);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{d+=e,r(e)},e=>{u+=e,n(e)});try{const e=(await F(a(),s,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(i()){I(e);break}let n;try{n=await F(e.next(),m?c:s,m?"Model stopped responding":"Model did not reply")}catch(r){if(r instanceof z&&(u||d)){l?.(),I(e),t&&console.log("Local chat stalled",r);break}throw r}if(n.done)break;m=!0;const a=n.value?.choices?.[0],y=a?.delta,w="string"==typeof y?.reasoning_content?y.reasoning_content:"string"==typeof y?.reasoning?y.reasoning:"";if(a?.finish_reason&&(f=a.finish_reason),w&&(d+=w,r(w)),y?.content&&h.feed(y.content),w||y?.content){const e=performance.now();g||(p=e),g+=1,g>1&&e>p&&o?.(1e3*g/(e-p))}}h.flush()}catch(e){if(t&&console.log("Local chat failed",e),!i())throw e}const y=i()?void 0:u||void 0;return t&&(console.log("Local chat reply",e.id,y?"****":""),console.log("Local chat finish",e.id,f||"none",u.length,d.length)),y},V=async({model:t,params:r,start:n,stopped:o,onStall:a})=>{const i=await(async e=>{const t=[];for(const r of e){if("string"==typeof r.content){t.push(r);continue}const e=[];for(const t of r.content)e.push("image"==t.type?{type:"image",url:await P(t.url)}:t);t.push({role:"user",content:e})}return t})(((t,r=S)=>{const n=r.maxContentLength,o=t.filter(t=>"string"==typeof t.content&&!!t.content.trim()||!(t.role!=e.user||!t.images?.length&&!t.audio?.length)),a=[],i=[];let s=0,c=r.maxImages,l=r.maxAudio;for(let t=o.length-1;t>=0;t--){const u=o[t],d=("string"==typeof u.content?u.content:"").slice(0,n),f=u.role==e.user?(u.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,c)):[],m=u.role==e.user?(u.audio||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,l)):[];if(d||f.length||m.length){if(d&&s+d.length>r.promptCharBudget)break;s+=d.length,c-=f.length,l-=m.length,u.role==e.system?a.unshift(d):u.role==e.assistant?i.unshift({role:"assistant",content:d}):i.unshift({role:"user",content:_(d,f,m)})}}for(;i.length&&"user"!=i[0].role;)i.shift();const u=[];for(const e of i){const t=u[u.length-1];"assistant"==t?.role&&"assistant"==e.role?t.content=`${t.content}\n${e.content}`:"user"==t?.role&&"user"==e.role?t.content=q(t.content,e.content):"assistant"==e.role?u.push({role:"assistant",content:e.content}):u.push({role:"user",content:e.content})}const d=a.join("\n\n"),f=[];return d&&f.push({role:"system",content:d}),f.push(...u),f})(r.messages,r.limits));return r.logging&&((e,t)=>{console.log("Local chat call",e.id,t.map(({role:e,content:t})=>({role:e,content:"****",...Array.isArray(t)?{images:t.filter(e=>"image"==e.type).length,audio:t.filter(e=>"audio"==e.type).length}:{}})))})(t,i),await W({model:t,logging:r.logging,onReason:r.onReason,onText:r.onText,onSpeed:r.onSpeed,start:()=>n(i),stopped:o,onStall:a})},B=33554432,H=new Map;let Y=!1;const G=e=>{const t=(e.split("/").pop()||"model").replace(/[^\w.-]+/g,"_");let r=0;for(let t=0;t<e.length;t++)r=31*r+e.charCodeAt(t)>>>0;return`${r.toString(16)}-${t}`},J=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},Q=async()=>{if(!Y)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else Y=!0},Z=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},K=async e=>{if(e)try{const t=await e.getFile(),r=JSON.parse(await t.text());return{total:Number(r.total)||0,etag:`${r.etag||""}`,complete:!0===r.complete}}catch{return}},X=async(e,t)=>{try{const r=await e.getFileHandle("meta.json",{create:!0}),n=await r.createWritable();await n.write(JSON.stringify(t)),await n.close()}catch{}},ee=async function*(e){for await(const t of e)yield t},te=async e=>{try{for await(const[t,r]of ee(e))"file"==r.kind&&J(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},re=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await K(await e.getFileHandle(`${t}.json`).catch(()=>{}));if(!n)return;return{file:r,size:r.size,total:n.total,etag:n.etag,complete:n.total?r.size>=n.total:!0===n.complete}}catch{return}},ne=async(e,t)=>{const r=await Z(e,t);if(r){const e=await(async e=>await K(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of ee(e)){const e=J(r);if("file"!=n.kind||e<0)continue;const o=await n.getFile();t.push({part:{start:e,size:o.size},file:o})}}catch{return}const r=(e=>{const t=[];let r=0;for(const n of[...e].sort((e,t)=>e.start-t.start))if(n.size){if(n.start!=r)break;t.push(n),r+=n.size}return t})(t.map(e=>e.part)),n=new Set(r.map(e=>e.start)),o=t.filter(e=>n.has(e.part.start)).sort((e,t)=>e.part.start-t.part.start).map(e=>e.file);if(o.length)return{file:1==o.length?o[0]:new Blob(o),size:r.reduce((e,t)=>e+t.size,0)}})(r),n=e?.total||0,o=t?.size??0,a=t?.file??new Blob;return{file:n&&o>n?a.slice(0,n):a,size:o,total:n,etag:e?.etag||"",complete:n?o>=n:!0===e?.complete}}return await re(e,t)},oe=(e,t)=>{const r=e.headers.get("content-range"),n=/bytes (\d+)-/.exec(r||""),o=/\/(\d+)\s*$/.exec(r||""),a=e.headers.get("etag")||"";if(206==e.status){const e=n?Number(n[1]):t.size,r=o?Number(o[1]):t.total;if(e!=t.size)return;if(t.total&&r&&t.total!=r)return;if(t.etag&&a&&t.etag!=a)return;return{start:e,total:r||t.total,etag:a||t.etag}}if(!t.etag||!a||t.etag==a)return{start:0,total:E(e)||t.total,etag:a||t.etag}},ae=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:s})=>{let c,l=t,u=0,d=r;const f=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(l),{create:!0});c=await t.createWritable(),u=0},m=async()=>{const e=c;c=void 0,e&&await e.close().catch(()=>{})};try{const e=o.getReader();for(;;){const{done:r,value:o}=await e.read();if(r)break;s();let g=0;for(d&&(g=Math.min(d,o.byteLength),d-=g);g<o.byteLength;){c||await f();const e=Math.min(B-u,o.byteLength-g);await c.write({type:"write",position:u,data:o.subarray(g,g+e)}),g+=e,u+=e,l+=e,u==B&&await m()}l>t&&a(n?l/n:0,i.download)}await m()}catch(e){throw await m(),e}return l},ie=e=>["NotAllowedError","NotSupportedError"].includes(e?.name||""),se=e=>{const t=async()=>{const t=await Q();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await ne(r,G(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{const a=`${e}|${r}`,s=H.get(a);if(s)return await s;const c=await t();if(!c)return;const l=(async(e,t,r,n)=>{const o=G(t),a=await re(e,o);if(a?.complete)return a;let s=await Z(e,o);s||(await e.removeEntry(o).catch(()=>{}),await e.removeEntry(`${o}.json`).catch(()=>{}),s=await e.getDirectoryHandle(o,{create:!0}));let c=0,l=0;for(;;){if(r?.aborted)throw new Error("Cancelled");const a=await ne(e,o);if(a?.complete)return a;const u=a?.size??0,d=a?.total||0,f=a?.etag||"";if(u>c)c=u,l=0;else if(++l>4)throw new Error("Model download failed");u&&d&&n(u/d,i.download);const m=d?Math.min(u+B,d)-1:u+B-1,g=new AbortController,p=()=>g.abort(),h={size:u,total:d,etag:f};let y,w=setTimeout(p,3e4);r?.addEventListener("abort",p,{once:!0});try{if(y=await fetch(t,{signal:g.signal,headers:{Range:`bytes=${u}-${m}`}}),416==y.status){if(await(y.body?.cancel().catch(()=>{})),d&&u>=d){await X(s,{total:d,etag:f,complete:!0});continue}await te(s),await X(s,{total:0,etag:"",complete:!1});continue}if(!y.ok||!y.body)throw await(y.body?.cancel().catch(()=>{})),new Error("Model download failed");const r=oe(y,h);if(!r){await y.body.cancel().catch(()=>{}),await te(s),await X(s,{total:0,etag:"",complete:!1});continue}await X(s,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?u:0,i=await ae({dir:s,start:r.start+a,skip:a,total:r.total,body:y.body,onProgress:n,onChunk:()=>{clearTimeout(w),w=setTimeout(p,3e4)}});if(!r.total){await X(s,{total:i,etag:r.etag,complete:!0});const t=await ne(e,o);if(t)return t}}catch(e){if(r?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&["QuotaExceededError","NotAllowedError","NotSupportedError","InvalidStateError","TypeMismatchError","SecurityError"].includes(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*l))}finally{clearTimeout(w),r?.removeEventListener("abort",p)}}})(c,r,n,o).finally(()=>{H.delete(a)});return H.set(a,l),await l},remove:async e=>{const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,G(e))},purge:async()=>{const t=await Q();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},ce="litertlm-models",le=[4096,2048,1024],ue=se("litert-store"),de={num_output_candidates:1,wait_for_weight_uploads:!0,num_decode_steps_per_sync:3,sequence_batch_size:0,supported_lora_ranks:[],max_top_k:40,enable_decode_logits:!1,enable_external_embeddings:!1,use_submodel:!1,use_autosized_ringbuffers:!0};let fe=!1;const me=(...e)=>{fe&&console.log(...e)},ge=(...e)=>{fe&&console.error(...e)},pe=e=>{const t=e.mod.getGlobalLiteRtLm().liteRtLmWasm.preinitializedWebGPUDevice;e.device=t,e.lost=!1,t&&t.lost.then(()=>{e.device==t&&(e.lost=!0)})},he=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(ce)}catch{return}},ye=async e=>{const t=globalThis,r=t.Module;t.Module={print:me,printErr:ge};try{await e.getOrLoadGlobalLiteRtLm(j().script)}finally{t.Module=r}},we=new Map,be=(e,t,r)=>{let n=0;return e.pipeThrough(new TransformStream({transform:(e,o)=>{n+=e.byteLength,r(t?n/t:0,i.download),o.enqueue(e)}}))},ve=async({url:e,signal:t,onProgress:r})=>{const n=await he();let o;const a=n?await n.match(e):void 0;if(a?.body)o=a.body;else{const t=await ue.stored(e);t?.complete&&(o=t.file.stream())}if(!o){const n=await ue.download({url:e,signal:t,onProgress:r}).catch(e=>{if(t?.aborted)throw new Error("Cancelled");if(!ie(e))throw e;fe&&console.log("Local model store failed",e)});n&&(o=n.file.stream())}if(!o&&n)try{await(async(e,t,r,n)=>{const o=we.get(e);if(o)return await o;const a=(async()=>{const o=await fetch(e,{signal:r});if(!o.ok||!o.body)throw new Error("Model download failed");const a=E(o),i=be(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{we.delete(e)});return we.set(e,a),await a})(e,n,t,r);const a=await n.match(e);a?.body&&(o=a.body)}catch(e){if(t?.aborted)throw new Error("Cancelled");fe&&console.log("Local model cache failed",e)}return o||(o=await(async(e,t,r)=>{const n=await fetch(e,{signal:t});if(!n.ok||!n.body)throw new Error("Model download failed");return be(n.body,E(n),r)})(e,t,r)),o},xe=async(e,t=!0)=>{const r=[];for(const n of e){if("string"==typeof n.content){r.push({role:n.role,content:n.content});continue}const e=[];for(const r of n.content)"text"!=r.type?t?e.push({type:r.type,data:await k(r.url)}):e.push({type:"text",text:`[${r.type}]`}):e.push({type:"text",text:r.text});r.push({role:n.role,content:e})}return r},je=(e,t)=>{if(e.role!=t.role)return!1;if("string"==typeof e.content||"string"==typeof t.content)return e.content==t.content;if(e.content.length!=t.content.length)return!1;for(let r=0;r<e.content.length;r++){const n=e.content[r],o=t.content[r];if(n.type!=o.type)return!1;if("text"==n.type&&"text"==o.type){if(n.text!=o.text)return!1}else if(("image"==n.type&&"image"==o.type||"audio"==n.type&&"audio"==o.type)&&n.url!=o.url)return!1}return!0},Me=e=>({type:"function",function:{name:e.name,...void 0===e.description?{}:{description:e.description},...void 0===e.parameters?{}:{parameters:e.parameters}},execute:e.execute}),ke=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=C(r.limits,r.reasoning),s=r.tools??[];if("user"!=a?.role)throw new Error("No user turn");const c=n.slice(0,-1),l=(await xe([a]))[0];if(!l)throw new Error("Empty prompt");const u=!!o.conversation&&o.reasoning==r.reasoning&&o.maxTokens==i.max_tokens&&((e=[],t=[])=>{if(e.length!=t.length)return!1;for(let r=0;r<e.length;r++){const n=e[r],o=t[r];if(n.name!=o.name)return!1;if(n.description!=o.description)return!1;if(n.execute!==o.execute)return!1;if(JSON.stringify(n.parameters)!=JSON.stringify(o.parameters))return!1}return!0})(o.tools,s)&&((e,t)=>{const r="system"==e[0]?.role?e[0]:void 0,n="system"==t[0]?.role?t[0]:void 0;if(!r!=!n)return!1;if(r&&n&&!je(r,n))return!1;const o=r?e.slice(1):e,a=n?t.slice(1):t;if(!a.length||a.length>o.length)return!1;const i=o.length-a.length;for(let e=0;e<a.length;e++)if(!je(o[i+e],a[e]))return!1;return!0})(o.sent,c);let d;if(u&&o.conversation)d=o.conversation;else{const n=await xe(c,!1);o.conversation=void 0,o.sent=[];const a={sessionConfig:{maxOutputTokens:i.max_tokens,samplerParams:{type:t.SamplerType.TOP_K,temperature:i.temperature,k:40,p:.95}},preface:{...n.length?{messages:n}:{},extra_context:{enable_thinking:r.reasoning}},prefillPrefaceOnInit:n.length>0};d=s.length?new t.AutoToolChat({engine:e,config:a,tools:s.map(Me),recurringToolCallLimit:(f=r.maxToolRounds,"number"==typeof f&&Number.isFinite(f)?Math.min(25,Math.max(1,Math.floor(f))):4),onToolProgress:e=>((e,t)=>{const r={id:t.id,name:t.name,arguments:t.arguments};"started"!=t.status?"completed"==t.status?e.onToolResult?.({...r,result:t.result}):e.onToolResult?.({...r,error:t.error||"Tool failed"}):e.onToolCall?.(r)})(r,e)}):await e.createConversation(a),o.conversation=d,o.reasoning=r.reasoning,o.maxTokens=i.max_tokens,o.tools=[...s],o.sent=[...c]}var f;o.sent.push(a);let m,g=!1,p="";const h=()=>{m&&m.cancel().catch(()=>{});try{d.cancel()}catch{}};r.signal?.addEventListener("abort",h,{once:!0});try{if(r.signal?.aborted)return;const e=d.sendMessageStreaming(l).getReader();for(m=e;;){const{done:t,value:r}=await e.read();if(t)break;const n={};let o="string"==typeof r.content?r.content:"";if(Array.isArray(r.content))for(const e of r.content)"text"==e.type&&(o+=e.text);o&&(n.content=o,p+=o);const a=r.channels?.thought;a&&(n.reasoning=a),(n.content||n.reasoning)&&(yield{choices:[{delta:n}]})}g=!0}finally{r.signal?.removeEventListener("abort",h),g&&p?o.sent.push({role:"assistant",content:p}):(o.conversation=void 0,o.sent=[])}},Pe=({model:e,limits:t,source:r,mod:n,contextTokens:o=4096})=>{const a=m(e);return{model:r,mainExecutorSettings:{maxNumTokens:o,...a?.vision?{maxNumImages:Math.max(1,t.maxImages)}:{},backendConfig:de},...a?.vision?{visionBackend:n.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...a?.audio?{audioBackend:n.Backend.CPU}:{}}},Se=async(e,t,r)=>{if(e.contextStep>=le.length-1)throw new Error("The graphics device was lost");try{await e.engine.delete()}catch{}e.mod.unloadLiteRtLm(),await ye(e.mod),await e.mod.getGlobalLiteRtLm().setupDefaultWebGpuDevice(),e.contextStep+=1,e.engine=await e.mod.Engine.create(Pe({model:t,limits:r,source:await e.reopen(),mod:e.mod,contextTokens:le[e.contextStep]})),pe(e)},Te={backend:a.gpu,startLLM:async({model:e,limits:t,onProgress:n,signal:o,logging:s})=>{fe=!0===s;const c=e.litert,l=m(e);if(!c||!l)throw new Error("Model has no LiteRT artifact");const u=await r.e(520).then(()=>r(507));if(await ye(u),o?.aborted)throw new Error("Cancelled");const d=N(c.repo,l.file),f=await ve({url:d,signal:o,onProgress:n});if(o?.aborted)throw new Error("Cancelled");n(1,i.load);const g=u.getGlobalLiteRtLm();g.liteRtLmWasm.preinitializedWebGPUDevice||await g.setupDefaultWebGpuDevice();const p={engine:await u.Engine.create(Pe({model:e,limits:t,source:f,mod:u})),mod:u,lost:!1,contextStep:0,reopen:()=>ve({url:d,onProgress:()=>{}})};if(pe(p),o?.aborted)throw await p.engine.delete(),new Error("Cancelled");const h={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:a.gpu,contextSize:le[p.contextStep],chat:t=>(async({gpu:e,model:t,params:r,session:n})=>{fe=!0===r.logging;const o=()=>!!r.signal?.aborted,a=()=>{try{n.conversation?.cancel()}catch{}n.conversation=void 0,n.sent=[],n.tools=void 0},i=async()=>{try{return await V({model:t,params:r,stopped:o,onStall:a,start:async a=>{if(o())throw new Error("Cancelled");const i=m(t);if(D(a)&&!i?.vision)throw new Error("Model does not accept images");if(L(a)&&!i?.audio)throw new Error("Model does not accept audio");if(r.tools?.length&&!i?.tools)throw new Error("Model does not accept tools");return ke({engine:e.engine,mod:e.mod,params:r,messages:a,session:n})}})}catch(e){throw a(),e}};let s;try{s=await i()}catch(t){if(!e.lost&&!(e=>/device.*lost|lost.*device|vkQueueSubmit|device.*destroyed|aborted/i.test(`${e?.message||e}`))(t))throw t;e.lost=!0}return!e.lost||o()?s:(r.onRestart?.(),a(),await Se(e,t,r.limits),await i())})({gpu:p,model:e,params:t,session:h}),fatal:()=>p.lost,unload:async()=>{h.conversation=void 0,h.sent=[],h.tools=void 0;try{await p.engine.delete()}catch{}}}},cached:async e=>{const t=e.litert,r=m(e);if(!t||!r)return!1;const n=N(t.repo,r.file),[o,a]=await Promise.all([he(),ue.stored(n)]);if(a?.complete)return!0;try{return!(!o||!await o.match(n))}catch{return!1}},hasCache:async()=>{try{for(const e of d){const t=e.litert,r=m(e);if(!t||!r)continue;if(await ue.stored(N(t.repo,r.file)))return!0}const e=await he();return!!e&&(await e.keys()).length>0}catch{return!1}},remove:async e=>{try{const t=e.litert,r=m(e);if(!t||!r)return;const n=N(t.repo,r.file),o=await he();await ue.remove(n),o&&await o.delete(n)}catch{}},purge:async()=>{try{await ue.purge(),"undefined"!=typeof caches&&await caches.delete(ce)}catch{}}},Oe=se("wllama-store");let Ce,Ne,Ee="",Ae=!1;const De=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Le=e=>{const t=x();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},Re=e=>{const t=e=>(...t)=>{Ae&&("string"==typeof t[0]&&t[0].includes("ggml_webgpu: Failed to get an adapter")||e(...t))};return{...e,log:t(e.log),warn:t(e.warn),error:t(e.error)}},$e=async()=>{if(Ce)return Ce;const e=await r.e(924).then(()=>r(577)),t=Ne||Le(),n=new e.Wllama({default:t.wasm},{logger:Re(e.LoggerWithoutDebug)});return Ne||(Ne=t,Ee=De(t)),n.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),Ce=n,n},_e=async()=>{const e=Ce;Ce=void 0;try{await(e?.exit())}catch{}},Ue=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),qe=e=>{const t=e.cpu;return t?[{name:t.file,url:N(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:N(t.repo,t.mmproj.file)}]:[]]:[]},ze=async e=>{const t=qe(e);if(!t.length)return!1;for(const e of t){const t=await Oe.stored(e.url);if(!t?.complete)return!1}return!0},Fe=async(e,t)=>{const r=await e.cacheManager.list();return qe(t).every(e=>r.some(t=>Ue(t,e.name)))},Ie=async({model:e,signal:t,onProgress:r})=>{const n=qe(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await Oe.download({url:n[e].url,signal:t,onProgress:(t,o)=>r((e+t)/n.length,o)});if(!a)return;o.push(a.file)}return o.length?o:void 0},We=async e=>{const t=[];for(const r of e){if("string"==typeof r.content){"system"==r.role?t.push({role:"system",content:r.content}):"assistant"==r.role?t.push({role:"assistant",content:r.content}):t.push({role:"user",content:r.content});continue}const e=[];for(const t of r.content)"text"==t.type?e.push({type:"text",text:t.text}):e.push({type:t.type,data:await k(t.url)});t.push({role:"user",content:e})}return t},Ve={backend:a.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:s})=>{Ae=!0===o;const c=f()?4096:8192,l=e.cpu;if(!l)throw new Error("Model has no CPU artifact");const u=Le(s),d=De(u);Ce&&d!=Ee&&await _e(),Ne=u,Ee=d;const m=(g="undefined"!=typeof navigator&&navigator.hardwareConcurrency||4,p=l.mmproj?Math.min(t.maxThreads,2):t.maxThreads,Math.max(1,Math.min(Math.max(2,Math.min(8,(g||4)-1)),p)));var g,p;const h=await $e(),y=await ze(e),w=l.mmproj?.file,b=N(l.repo,l.file),v=w?N(l.repo,w):"";if(n?.aborted)throw await _e(),new Error("Cancelled");if(!y&&w){const e=await h.cacheManager.list(),t=e.some(e=>Ue(e,l.file)),r=e.some(e=>Ue(e,w));t&&!r&&await h.cacheManager.deleteMany(e=>Ue(e,l.file))}const x={n_ctx:c,n_threads:m,reasoning_budget_tokens:t.maxThinkingTokens,n_gpu_layers:0,jinja:!0};try{let t=y?await Ie({model:e,signal:n,onProgress:r}):void 0;t||y||await Fe(h,e).catch(()=>!1)||(t=await Ie({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");if(!ie(e))throw e;o&&console.log("Local model store failed",e)})),t?(r(1,i.load),await h.loadModel(t,x)):await h.loadModelFromUrl(v?{url:b,mmprojUrl:v}:b,{...x,useCache:!0,signal:n,progressCallback:({loaded:e,total:t})=>{const n=t?e/t:0;r(n,n>=1?i.load:i.download)}})}catch(e){throw await _e(),e}if(n?.aborted)throw await _e(),new Error("Cancelled");if(!h.getLoadedContextInfo().n_ctx)throw await _e(),new Error("Failed to create model context");return{model:e,backend:a.cpu,contextSize:c,chat:t=>(async(e,t,r)=>{if(Ae=!0===r.logging,e.isModelLoaded())return await V({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if(D(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if(L(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await We(n),...C(r.limits,r.reasoning),abortSignal:r.signal,...t.reasoning?{chat_template_kwargs:{enable_thinking:r.reasoning}}:{}})}})})(h,e,t),unload:async()=>{if(Ce==h)await _e();else try{await h.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await ze(e)||await Fe(await $e(),e))}catch{return!1}},hasCache:async()=>{try{for(const e of d.flatMap(e=>qe(e)))if(await Oe.stored(e.url))return!0;const e=await $e();return(await e.cacheManager.list()).length>0}catch{return!1}},remove:async e=>{const t=qe(e);try{for(const e of t)await Oe.remove(e.url)}catch{}try{const e=await $e();await e.cacheManager.deleteMany(e=>t.some(t=>Ue(e,t.name)))}catch{}},purge:async()=>{try{await Oe.purge()}catch{}try{const e=await $e();await e.cacheManager.clear()}catch{}}},Be=((e={})=>{const t=e.engines?.cpu||Ve,r=e.engines?.litert||Te;let n,s,c,l,u,f,m,g,p=a.none,h=o.idle,y=[],w=0,b={percent:0,phase:i.download};const v=n=>{if(e.backend!=a.none)return e.backend==a.cpu?n.cpu?t:void 0:e.backend==a.gpu?n.litert?r:void 0:n.litert&&"undefined"!=typeof navigator&&navigator.gpu&&"undefined"!=typeof WebAssembly?r:!n.cpu||"undefined"==typeof window&&"undefined"==typeof self&&"undefined"==typeof Worker||"undefined"==typeof WebAssembly?void 0:t},x=(e,t)=>{b={percent:Math.max(0,Math.min(1,e)),phase:t||i.download};for(const e of[...y])e.report(b.percent,b.phase)},j=e=>{h=e},M=()=>{w++,f?.abort(),f=void 0,u=void 0,h==o.downloading&&j(o.idle)},k=(e,t)=>{const r=l;return r?new Promise(n=>{let o=!1;const a={report:e,settle:e=>{o||(o=!0,t?.removeEventListener("abort",i),n(e))}},i=()=>{(e=>{y=y.filter(t=>t!=e),queueMicrotask(()=>{!y.length&&l&&M()})})(a),a.settle(!1)};y.push(a),t?.aborted?i():t?.addEventListener("abort",i,{once:!0}),r.then(a.settle,()=>a.settle(!1))}):Promise.resolve(!1)},P=()=>h==o.ready&&!!n&&!!s,S=async()=>{const e=n;M(),n=void 0,s=void 0,c=void 0,j(o.idle),await(e?.unload())};return{load:async({model:e,limits:t,assets:r,logging:a,signal:g,onProgress:h})=>{if(g?.aborted)return!1;if(P()&&s?.id==e.id)return!0;if(l&&u==e.id)return h(b.percent,b.phase),await k(h,g);l&&(M(),y=[],await l.catch(()=>!1));const S=++w,T=(async()=>{await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})();const l=v(e);if(S!=w)return!1;if(!l)return m="Model is not supported on this device",j(o.unsupported),!1;if(await(async(e,t)=>{if(s&&s.id!=e.id){const e=s,t=c,r=n;n=void 0,s=void 0,c=void 0,await(r?.unload()),await(t?.remove(e))}if(await t.hasCache())for(const r of d)r.id!=e.id&&v(r)==t&&await t.remove(r)})(e,l),S!=w)return!1;const u=await l.cached(e);if(S!=w)return!1;m=void 0,j(o.downloading),x(0,i.download),u&&x(1,i.load);const g=new AbortController;f=g;try{const u=await l.startLLM({model:e,limits:t,logging:a,signal:g.signal,assets:r,onProgress:(e,t)=>{S==w&&x(e,t)}});return S!=w||g.signal.aborted?(await u.unload(),!1):(n=u,s=e,c=l,p=l.backend,m=void 0,j(o.ready),x(1,i.load),!0)}catch(e){return S!=w||(n=void 0,s=void 0,c=void 0,m=`${e?.message||`${e}`}`,a&&console.log("Local model failed",e),j(o.error)),!1}finally{f==g&&(f=void 0)}})().finally(()=>{l==T&&(l=void 0,u=void 0,y=[])});return l=T,u=e.id,await k(h,g)},chat:async e=>{if(!P()||!n)return;for(;g;)await g.catch(()=>{});if(!P()||!n)return;const t=n,r=t.chat(e);g=r;try{return await r}catch(e){throw t.fatal?.()&&n==t&&(await S(),p=a.none,m=`${e?.message||`${e}`}`,j(o.error)),e}finally{g==r&&(g=void 0)}},unload:S,ready:P,loading:()=>!P()&&h==o.downloading,status:()=>h,backend:()=>p,error:()=>m,model:()=>s}})();var He=r(69);const Ye=/^[0-9+\-*/%^().]+$/,Ge=e=>{let t=0;const r=e=>!!e&&e>="0"&&e<="9",n=e=>{throw new Error(e)},o=()=>{let o;for("("==e[t]?(t++,o=s(),")"!=e[t]&&n("Unbalanced parentheses"),t++):o=(()=>{const o=t;for(;r(e[t]);)t++;const a=e.slice(o,t);let i="";if("."==e[t]){t++;const n=t;for(;r(e[t]);)t++;i=e.slice(n,t)}return a||i?Number(`${a||"0"}.${i||"0"}`):n("Expected a number")})();"%"==e[t];)t++,o/=100;return o},a=()=>"+"==e[t]?(t++,a()):"-"==e[t]?(t++,-a()):(()=>{const r=o();return"^"!=e[t]?r:(t++,r**a())})(),i=()=>{let r=a();for(;"*"==e[t]||"/"==e[t];){const o=e[t];t++;const i=a();"*"==o?r*=i:(i||n("Division by zero"),r/=i)}return r},s=()=>{let r=i();for(;"+"==e[t]||"-"==e[t];){const n=e[t];t++;const o=i();r="+"==n?r+o:r-o}return r},c=s();return t<e.length&&n("Unexpected character"),Number.isFinite(c)||n("Result is not a finite number"),c},Je={name:"calculate",description:"Evaluate an arithmetic expression. Supports + - * / % ^ and parentheses; % divides by 100.",parameters:{type:"object",properties:{expression:{type:"string",description:"Arithmetic expression, for example 2*(3+4)"}},required:["expression"]},execute:e=>{const t=e.expression;if("string"!=typeof t)throw new Error("Missing expression");return(e=>{if(e.trim().length>200)throw new Error("Expression is too long");const t=(e=>e.replace(/×/g,"*").replace(/÷/g,"/").replace(/−/g,"-").replace(/,/g,"").replace(/\s+/g,""))(e);if(!t)throw new Error("Expression is empty");if(!Ye.test(t))throw new Error("Unsupported character");const r=Ge(t);return{expression:t,result:Math.abs(r)>=1e5?(0,He.pNum)(r)??r:(0,He.rNum)(r,12)}})(t)}},Qe="degreesign-chat-prices-v1",Ze="EUR",Ke=5*He.oneMin,Xe=30*He.oneSec;let et,tt={},rt=0,nt=!1,ot=!1;const at=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},it=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,st=async({fiat:e,crypto:t})=>{try{const r=await fetch("https://srv.coinexams.com/data.json");if(!r.ok)throw new Error(`Price feed failed with ${r.status}`);const n=await r.json(),o=Date.now(),a=e?((e,t)=>{const r=at(e.rates?.current),n=at(e.rates?.yesterday);if(Object.keys(r).length)return{fetchedAt:t,sourceAt:Number(e.rates?.date)||t,rates:r,yesterday:n}})(n,o):void 0,i=t?((e,t)=>{const r=e.coins??{},n={},o={};for(const[e,t]of Object.entries(r)){const r=e.trim().toUpperCase(),a=t?.pr,i=t?.yst;"number"==typeof a&&Number.isFinite(a)&&(n[r]=a),"number"==typeof i&&Number.isFinite(i)&&(o[r]=i)}if(Object.keys(n).length)return{fetchedAt:t,sourceAt:Number(e.date)||t,prices:n,yesterday:o}})(n,o):void 0;if(e&&!a)throw new Error("Price feed is unavailable");if(t&&!i)throw new Error("Price feed is unavailable");a&&(tt.fiat=it(tt.fiat,a)),i&&(tt.crypto=it(tt.crypto,i)),rt=0,nt=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(Qe,JSON.stringify(tt))}catch{}})()}catch(e){throw rt=Date.now(),nt=!0,e}},ct=e=>!!tt.crypto&&(e in tt.crypto.prices||e in tt.crypto.yesterday),lt=e=>!!tt.fiat&&(e in tt.fiat.rates||e in tt.fiat.yesterday),ut=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==Ze)continue;const e=ct(r)||lt(r);!ct(r)&&e||(t.crypto=!0),ct(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(tt.fiat?.fetchedAt??0)>=He.oneHr,o=t.crypto&&r-(tt.crypto?.fetchedAt??0)>=Ke;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||rt&&r-rt<Xe||(et||(et=st({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{et=void 0})),await et))},dt=e=>{if(e==Ze)return 1;const t=tt.crypto?.yesterday[e],r=tt.fiat?.yesterday[e];return t||(r?1/r:void 0)},ft=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},mt=e=>Math.abs(e)>=1e5?(0,He.pNum)(e)??e:(0,He.rNum)(e,8),gt=async e=>{(()=>{if(!ot){ot=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(Qe);if(!e)return;const t=JSON.parse(e);tt={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=ft(e.from,"from"),r=void 0===e.to||null===e.to?Ze:ft(e.to,"to"),n=(e=>{if(null==e)return 1;if("number"!=typeof e||!Number.isFinite(e))throw new Error("Invalid amount");return e})(e.amount);await ut([t,r]);const o=e=>{const t=(e=>{if(e==Ze)return 1;const t=tt.crypto?.prices[e],r=tt.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!tt.fiat&&!tt.crypto)throw new Error("Prices unavailable offline");if(ct(e)||lt(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=dt(t),c=dt(r),l=a/i,u=s&&c?s/c:void 0,d=void 0===u?void 0:l-u,f=void 0===u?void 0:100*(l/u-1),m=(e=>{const t=[];for(const r of e)r!=Ze&&(ct(r)?tt.crypto&&t.push(tt.crypto.sourceAt):lt(r)&&tt.fiat&&t.push(tt.fiat.sourceAt));return t})([t,r]),g=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:mt(l),...void 0===u?{}:{previousRate:mt(u),change:mt(d??0),changePercent:(0,He.rNum)(f??0,4)},result:mt(n*l),updatedAt:new Date(g).toISOString(),stale:nt&&!(!tt.fiat&&!tt.crypto)}},pt={name:"currency",description:"Get the EUR price of a fiat currency, crypto coin or metal, or convert an amount. Returns the 24-hour change.",parameters:{type:"object",properties:{from:{type:"string",description:"Currency, coin or metal to convert from"},to:{type:"string",description:"Currency, coin or metal to convert to, EUR by default"},amount:{type:"number",description:"Amount to convert, 1 by default"}},required:["from"]},execute:e=>gt(e)},ht={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},yt=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,wt=(e,t)=>e.replace(/<[^>]*>/g," ").replace(/&(#x?[0-9a-f]+|[a-z]+);/gi,(e,t)=>{const r=(e=>{if(e.startsWith("#")){const t="x"==e[1]||"X"==e[1],r=parseInt(t?e.slice(2):e.slice(1),t?16:10);return r>0&&r<=1114111?String.fromCodePoint(r):e}return ht[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),bt=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,vt=async(e,t)=>{const r=new AbortController,n=setTimeout(()=>r.abort(),t);try{const t=await fetch(e,{signal:r.signal});if(!t.ok)throw new Error(`Search failed with ${t.status}`);return await t.json()}catch(e){if(r.signal.aborted)throw new Error(`Search timed out after ${t} ms`);throw e}finally{clearTimeout(n)}},xt=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==l.duckduckgo?l.duckduckgo:l.wikipedia,language:bt.test(t)?t:"en",limit:Math.round(yt(e.limit,1,20,3)),snippetLength:Math.round(yt(e.snippetLength,1,4e3,400)),timeout:yt(e.timeout,1e3,3e4,8e3)}})(e);return{name:"websearch",description:t.provider==l.duckduckgo?"Search DuckDuckGo for an instant answer and related topics.":"Search Wikipedia and return a few matching articles.",parameters:{type:"object",properties:{query:{type:"string",description:"What to search for"}},required:["query"]},execute:async e=>{const r="string"==typeof e.query?e.query.trim():"";if(!r)throw new Error("Missing query");const n=t.provider==l.duckduckgo?await(async(e,t)=>{const r=`https://api.duckduckgo.com/?format=json&no_html=1&skip_disambig=1&q=${encodeURIComponent(t)}`,n=await vt(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:wt(r||n,200),url:t,snippet:wt(n,e.snippetLength)}))},s=e=>{for(const t of e)t.Topics?s(t.Topics):i(t.FirstURL,t.Text,t.Text)};i(n.AbstractURL,n.Heading||n.AbstractText,n.AbstractText);for(const e of n.Results??[])i(e.FirstURL,e.Text,e.Text);return s(n.RelatedTopics??[]),o.slice(0,e.limit)})(t,r):await(async(e,t)=>{const r=`https://${e.language}.wikipedia.org`,n=`${r}/w/rest.php/v1/search/page?q=${encodeURIComponent(t)}&limit=${e.limit}`,o=await vt(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:wt(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:wt(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},jt=[c.websearch,c.calculate,c.currency],Mt=e=>{const t=e.tools??[],r=!1===e.builtins?[]:e.builtins??jt,n=new Set,o=[];for(const e of t){if(n.has(e.name))throw new Error(`Duplicate tool name ${e.name}`);n.add(e.name)}for(const t of((e,t)=>{const r=[];for(const n of e)n==c.websearch?r.push(xt(t)):n==c.calculate?r.push(Je):n==c.currency&&r.push(pt);return r})(r,e.websearch))n.has(t.name)||o.push(t);return o.push(...t),{tools:o,explicit:t.length>0}},kt=(e,r,n)=>{const a=e.status(),i=g(r);return{availability:a==o.ready?t.online:a==o.error||a==o.unsupported?t.offline:t.away,status:a,backend:e.backend(),supportsImages:!!i&&y(i),supportsAudio:!!i&&w(i),supportsTools:!!i&&b(i),ready:e.ready(),loading:e.loading(),requesting:n.requesting,phase:n.phase,percent:n.percent,...n.error?{error:n.error}:{}}},Pt=(t=>{let r,n=0;const a=e=>e.input.onStatus?.(kt(t,e.model??e.input.model,e));return s=>{r?.controller.abort();const c={token:++n,input:s,controller:new AbortController,percent:t.ready()?100:0,phase:t.ready()?i.load:i.download,requesting:!1,cancelled:!1};return r=c,a(c),(async r=>{const{input:o}=r,s=!0===o.logging,c=await h(o.model);if(r.model=c?.id,r.token!=n)return;const l=o.messages.some(t=>t.role!=e.system&&"string"==typeof t.content&&!!t.content.trim()),u=o.messages.some(t=>t.role==e.user&&!!t.images?.some(e=>"string"==typeof e&&!!e)),d=o.messages.some(t=>t.role==e.user&&!!t.audio?.some(e=>"string"==typeof e&&!!e)),f=l||u||d;if(!c)return r.error="Unknown model",void a(r);if(!f)return r.error="No prompt",void a(r);const m=y(c),g=w(c);if(!(l||u&&m||d&&g))return d&&!g?r.error="Model does not accept audio":u&&!m&&(r.error="Model does not accept images"),void a(r);let p;try{p=Mt(o)}catch(e){return r.error=`${e?.message||`${e}`}`,void a(r)}const v=b(c);if(!v&&p.explicit)return r.error="Model does not accept tools",void a(r);const x=v?p.tools:[],j=O(o.limits,!!c.litert),M=await t.load({model:c,limits:j,logging:s,signal:r.controller.signal,onProgress:(e,t)=>{r.token==n&&(r.percent=Math.round(100*e),r.phase=t,a(r))}}).catch(e=>(r.token==n&&(r.error=`${e?.message||`${e}`}`),!1));if(r.token!=n)return;if(r.cancelled)return;if(!M)return r.error||(r.error=t.error()||"Model not ready"),void a(r);const k=u&&!m||d&&!g?o.messages.map(({images:e,audio:t,...r})=>({...r,...e&&m?{images:e}:{},...t&&g?{audio:t}:{}})):o.messages;r.requesting=!0,r.error=void 0,r.percent=100,r.phase=i.load,a(r);let P,S="",T="";try{P=await t.chat({messages:k,limits:j,reasoning:!0===o.reasoning,logging:s,...x.length?{tools:x}:{},...void 0===o.maxToolRounds?{}:{maxToolRounds:o.maxToolRounds},onToolCall:e=>{r.token!=n||r.cancelled||o.onToolCall?.(e)},onToolResult:e=>{r.token!=n||r.cancelled||o.onToolResult?.(e)},onReason:e=>{r.token!=n||r.cancelled||(S+=e,o.onThinking?.(S))},onText:e=>{r.token!=n||r.cancelled||(T+=e,o.onResponse?.(T))},onRestart:()=>{S="",T="",o.onThinking?.(S),o.onResponse?.(T)},onSpeed:e=>{r.token!=n||r.cancelled||o.onSpeed?.(e)},signal:r.controller.signal})}catch(e){if(r.token!=n)return;return r.requesting=!1,r.error=`${e?.message||`${e}`}`,void a(r)}r.token==n&&(r.requesting=!1,P||r.cancelled||(r.error="No reply"),a(r))})(c),()=>(e=>{e.token==n&&(e.cancelled=!0,e.controller.abort(),t.status()!=o.ready?queueMicrotask(()=>a(e)):t.unload().then(()=>a(e)))})(c)}})(Be),St=(Tt=Be,async(e={})=>{const t=await h(e.model),r=r=>e.onStatus?.(kt(Tt,t?.id,r));if(!t)return r({requesting:!1,phase:i.download,percent:0,error:"Unknown model"}),!1;let n,o=0,a=i.download;const s=Tt.ready()&&Tt.model()?.id==t.id;return await Tt.load({model:t,limits:O(e.limits,!!t.litert),logging:!0===e.logging,onProgress:(e,t)=>{o=Math.round(100*e),a=t,r({requesting:!1,phase:a,percent:o})}}).catch(e=>(n=`${e?.message||`${e}`}`,!1))?(s&&r({requesting:!1,phase:i.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||Tt.error()||"Model not ready"}),!1)});var Tt})(),module.exports=n})();
2
+ (()=>{var e={69(e,t){(()=>{"use strict";var e={125:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addZ=t.tN=t.monNm=t.tmUTC=t.tmAP=t.moYrDt=t.shortDt=t.fullLong=t.fullDate=t.fullDt=t.invDt=t.dayRes=t.timeStandard=t.dateStandard=t.seoDt=t.thisYear=t.oneMon=t.oneMin=t.oneHr=t.oneDay=t.oneSec=void 0;const r=()=>Date.now(),n=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],a=["st","nd","rd","th"],i=e=>0==+e?"00":+e<10&&+e>=1?`0${e}`:`${e}`,s=e=>{const t=new Date(e);return`${t.getUTCFullYear()}-${i(t.getUTCMonth()+1)}-${i(t.getUTCDate())}`},c=e=>i(e.getUTCHours())+`:${i(e.getUTCMinutes())}`+`:${i(e.getUTCSeconds())}`;t.tN=r,t.monNm=n,t.dayRes=90,t.oneSec=1e3,t.oneMin=6e4,t.oneHr=36e5,t.oneDay=864e5,t.oneMon=27e8,t.addZ=i,t.tmUTC=e=>{const t=new Date(e);return i(t.getUTCHours())+`:${i(t.getUTCMinutes())} UTC`},t.tmAP=e=>{const t=new Date(e),r=t.getHours();return i(r>12?r-12:r)+`:${i(t.getMinutes())}`+(r>=12?"pm":"am")},t.shortDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]}`},t.moYrDt=e=>{const t=new Date(e);return`${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDate=e=>{const t=new Date(e);return`${t.getDate()} ${n[t.getMonth()]} ${t.getFullYear()}`},t.fullLong=e=>`${(e=>{const t=new Date(e),r=t.getDate();return r+a[r<5?r-1:r>4&&r<21?3:r>20&&r<25?r-21:r>24&&r<31?3:0]+` of ${n[t.getMonth()]}`})(e)} ${new Date(e).getFullYear()}`,t.thisYear=e=>(e?new Date(e):new Date)?.getUTCFullYear(),t.dateStandard=s,t.timeStandard=c,t.seoDt=e=>{!e&&(e=r());const t=new Date(e);return`${s(t)}T${c(t)}Z`},t.invDt=e=>{const t=new Date(e);return`${t.getUTCFullYear()}`.split("20")[1]+i(t.getUTCMonth()+1)+i(t.getUTCDate())+`${e}`.slice(10)}},240:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.idRandLong=t.idRandShort=t.idShuffle=void 0;const r=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","@",".","_","0","1","2","3","4","5","6","7","8","9"];t.idShuffle=async({data:e,password:t})=>4==t?.length?(({data:e,password:t})=>{try{const n=(e,t)=>r.includes(e.toLowerCase())?r[(r.indexOf(e.toLowerCase())+Math.pow(t,3))%r.length]:e;return[...e].map(e=>n(e,Number(t))).join("")}catch{return""}})({data:e,password:t}):await(async({data:e,password:t})=>{if(!e||!t)return"";try{crypto.subtle;const r=new TextEncoder,n=r.encode(e),o=r.encode(t),a=await crypto.subtle.digest("SHA-256",o),i=new Uint8Array(a),s=i.slice(0,32),c=i.slice(0,12),l=await crypto.subtle.importKey("raw",s,{name:"AES-GCM"},!1,["encrypt"]),u=await crypto.subtle.encrypt({name:"AES-GCM",iv:c},l,n);return btoa(String.fromCharCode(...new Uint8Array(u))).replace(/\+/g,"a").replace(/\//g,"b").replace(/=/g,"c").toLowerCase()}catch{return""}})({data:e,password:t}),t.idRandShort=(e=10)=>{try{return crypto.randomUUID()?.replaceAll("-","")?.slice(0,e)}catch(e){return console.log("idRandShort failed",e),""}},t.idRandLong=(e=10)=>{try{const t="abcdefghijklmnopqrstuvwxyz",r=new Uint8Array(e);return crypto.getRandomValues(r),Array.from(r).map(e=>t[e%26]).join("")}catch(e){return console.log("idRandLong failed",e),""}}},246:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.cacheCheck=t.delayCode=void 0;const n=r(125);t.delayCode=async(e=0)=>await new Promise(t=>setTimeout(t,e)),t.cacheCheck=({analysisCacheLimit:e,lastUpdated:t,forceRefresh:r})=>{const o=Date.now();if(t&&(!r&&t>o-e||r&&t>o-n.oneDay))return!0}},792:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isEven=t.pNum=t.sharpeRatio=t.priceVariations=t.nTxtAr=t.zNum=t.addCom=t.adjNum=t.rNum=void 0;const r=[1,.1,.01,.001,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10,1e-11,1e-12,1e-13,1e-14,1e-15,1e-16,1e-17,1e-18,1e-19],n=(e,t=6)=>{const n=+e,o=n?Math.abs(n):0,a=o>1&&t?t-`${Math.round(o)}`.length:0;return n?(n<0?-1:1)*(Number.isInteger(o)||o<1e-16?o:o>1e5?Math.round(o):o>1?Number(o.toFixed(a<0?0:a)):((e,t)=>{let n=0;for(const o of r){if(o<e)return Number(e.toFixed(t+n-1));n++}return e})(o,t)):e},o=(e,t)=>{const r=(n(e,t)+"").split(".");return r[0]=r[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),r.join(".")},a=(e,t=3)=>{const r=Number(e);if(!e||!r)return e+"";const a=Math.abs(r);return(r<0?"-":"")+(a>1e9?o(a/1e9,t)+"b":a>1e6?o(a/1e6,t)+"m":a<1e-6&&a>1e-16?(1+n(a,t)+"").replace(/1./g,"0."):o(a,t))};t.nTxtAr=["zero","one","two","three","four","five","six","seven","eight","nine","ten"],t.rNum=n,t.addCom=o,t.adjNum=a,t.zNum=e=>{const t=Number(e);let r=t?Math.abs(t):0,n=1e10;for(;n>1;)r>n&&(r=Math.round(r/(n/10))*(n/10)),n/=10;return t?(t<0?"-":"")+a(r,2):e},t.pNum=e=>+e||0==+e?Math.round(1e6*+e)/1e6:null,t.priceVariations=e=>{try{let t=0;const r=[...e].sort((e,t)=>e[0]-t[0]),n=e.reduce((e,[,t])=>e+t,0),o=r.find(([,e])=>(t+=e,t>=n/2))[0];return e.filter(([e])=>Math.abs(e-o)/o<.05).map(([e])=>e)}catch{return[]}},t.sharpeRatio=({assetPrices:e,minExpectedReturn:t=.05})=>{if(!e?.length||e?.length<2)return 0;const r=e.slice(1).map((t,r)=>(t-e[r])/e[r]),n=r.reduce((e,t)=>e+t,0)/r.length,o=Math.sqrt(r.reduce((e,t)=>e+Math.pow(t-n,2),0)/r.length);return(n-t)/o},t.isEven=e=>e%2==0},794:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restoreObj=t.restoreObjStr=t.storeObj=t.storeObjStr=t.objNestValueCount=t.objLen=t.objSortSimple=t.objSort=void 0;const n=r(125),o=e=>{try{return Object.keys(e||{})?.length||0}catch(e){return console.log(e),0}},a=e=>{try{return e?.replace(/"/g,"'")}catch(e){return console.log((0,n.tN)(),"storeObjStr failed",e),""}},i=e=>{try{return e?.toString()?.replace(/'/g,'"')}catch(e){console.log((0,n.tN)(),"restoreObjStr failed",e)}};t.objLen=o,t.objNestValueCount=e=>{let t=0;if(o(e))for(const r in e)t+=o(e[r])?1:0;return t},t.objSort=(e={},t,r=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,n])=>null===e[t]||void 0===e[t]?1:null===n[t]||void 0===n[t]?-1:e[t]>n[t]?1*r:-1*r)),t.objSortSimple=(e={},t=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,r])=>null==e?1:null==r?-1:e>r?1*t:-1*t)),t.storeObjStr=a,t.storeObj=e=>{try{return a(JSON.stringify(e))}catch(e){return console.log((0,n.tN)(),"storeObj failed",e),""}},t.restoreObjStr=i,t.restoreObj=e=>{try{if(!e)return;const t=i(e);return t?JSON.parse(t):void 0}catch(e){console.log((0,n.tN)(),"restoreObj failed",e)}}},830:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.phaseDifference=t.compareArrays=t.squeezeArray=t.forecastNextTotal=t.forecastNext=t.getMax=t.getMean=t.getSum=t.maxVl=t.minVl=t.sumArr=void 0;const r=e=>{try{return e?.length?e.reduce((e,t)=>e+t):0}catch(e){return console.log("sumArr failed",e),0}},n=e=>{try{return e?.length?e.reduce((e,t)=>e+t,0):0}catch(e){return console.log("getSum failed",e),0}},o=e=>{try{return e?.length?n(e)/e.length:0}catch(e){return console.log("getMean failed",e),0}},a=e=>{try{return e?.length?Math.max(...e):0}catch(e){return console.log("getMax failed",e),0}},i=e=>{try{if(!e?.length)return 0;const t=[...e].sort((e,t)=>e-t),r=Math.floor(t.length/2);return t.length%2?t[r]:(t[r-1]+t[r])/2}catch(e){return console.log("median failed",e),0}},s=({currentPeriod:e,steps:t=1})=>{try{const r=(Array.isArray(e)?e:[]).filter(Number.isFinite);if(!r.length||t<=0)return[];if(r.length<2){const e=Math.max(0,o(r));return Array.from({length:t},()=>e)}const n=r.length,{slope:s,intercept:c}=(e=>{try{const t=e.length,r=[];for(let n=0;n<t-1;n++)for(let o=n+1;o<t;o++)r.push((e[o]-e[n])/(o-n));const n=i(r);return{slope:n,intercept:i(e.map((e,t)=>e-n*t))}}catch(e){return console.log("theilSen failed",e),{slope:0,intercept:0}}})(r),l=c+s*(n-1),u=a(r),d=u>0?3*u:1/0;return Array.from({length:t},(e,t)=>{const r=t+1,o=l+s*n*Math.log1p(r/n);return Math.max(0,Math.min(o,d))})}catch(e){return console.log("forecastNext failed",e),[]}};t.sumArr=r,t.maxVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]>r&&(r=o[t])}return r},t.minVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]<r&&(r=o[t])}return r},t.getSum=n,t.getMean=o,t.getMax=a,t.forecastNext=s,t.forecastNextTotal=e=>{try{const t=s({currentPeriod:e,steps:e?.length});return n(t)}catch(e){return console.log("forecastNextTotal failed",e),0}},t.squeezeArray=({arr:e,targetLength:t})=>{try{if(!e||0===e.length||t<=0)throw new Error("Invalid input");const n=Math.ceil(e.length/t);return Array.from({length:t},(t,o)=>{const a=o*n,i=Math.min(a+n,e.length),s=e.slice(a,i);return r(s)}).slice(0,t)}catch(e){return console.log("squeezeArray failed",e),[]}},t.compareArrays=({arrays:e})=>{try{const t=[...e],n=Math.min(...t.map(e=>e.length));for(let e=0;e<t.length;e++)t.splice(n);const o=t.map(e=>r(e)),a=[],i=Math.min(...o),s=o.indexOf(i),c=i/Math.max(...o);for(let e=0;e<t.length;e++){const r=t[e];if(a[e]=[],e==s)a[e]=r;else for(let t=0;t<r.length;t++)a[e].push(c*r[t])}return a}catch(t){return console.log("compareArrays failed",t),e}},t.phaseDifference=({array1:e,array2:t})=>{try{let r=e.length,n=e.reduce((e,t)=>e+t)/r,o=t.reduce((e,t)=>e+t)/r,a=e.map(e=>e-n),i=t.map(e=>e-o),s=Math.floor(r/2),c=-1/0,l=0;for(let e=-s;e<=s;e++){let t=0,n=0,o=0,s=0;for(let c=0;c<r;c++){let l=c+e;l>=0&&l<r&&(t+=a[c]*i[l],n+=a[c]*a[c],o+=i[l]*i[l],s++)}if(n>0&&o>0&&s>=.8*r){let r=t/Math.sqrt(n*o);r>c&&(c=r,l=e)}}return l}catch(e){return console.log("phaseDifference failed",e),0}}}},r={};function n(t){var o=r[t];if(void 0!==o)return o.exports;var a=r[t]={exports:{}};return e[t](a,a.exports,n),a.exports}var o={};(()=>{var e=o;Object.defineProperty(e,"__esModule",{value:!0}),e.idShuffle=e.isEven=e.pNum=e.nTxtAr=e.zNum=e.addCom=e.adjNum=e.rNum=e.sharpeRatio=e.priceVariations=e.timeStandard=e.dateStandard=e.addZ=e.tN=e.monNm=e.tmUTC=e.tmAP=e.moYrDt=e.shortDt=e.fullLong=e.fullDate=e.fullDt=e.invDt=e.dayRes=e.thisYear=e.seoDt=e.oneMon=e.oneMin=e.oneHr=e.oneDay=e.oneSec=e.restoreObj=e.restoreObjStr=e.storeObj=e.storeObjStr=e.objSortSimple=e.objSort=e.objNestValueCount=e.objLen=e.phaseDifference=e.compareArrays=e.squeezeArray=e.forecastNextTotal=e.forecastNext=e.getMax=e.getMean=e.getSum=e.maxVl=e.minVl=e.sumArr=void 0,e.cacheCheck=e.delayCode=e.idRandLong=e.idRandShort=void 0;const t=n(246);Object.defineProperty(e,"cacheCheck",{enumerable:!0,get:function(){return t.cacheCheck}}),Object.defineProperty(e,"delayCode",{enumerable:!0,get:function(){return t.delayCode}});const r=n(830);Object.defineProperty(e,"sumArr",{enumerable:!0,get:function(){return r.sumArr}}),Object.defineProperty(e,"minVl",{enumerable:!0,get:function(){return r.minVl}}),Object.defineProperty(e,"maxVl",{enumerable:!0,get:function(){return r.maxVl}}),Object.defineProperty(e,"getMax",{enumerable:!0,get:function(){return r.getMax}}),Object.defineProperty(e,"getMean",{enumerable:!0,get:function(){return r.getMean}}),Object.defineProperty(e,"getSum",{enumerable:!0,get:function(){return r.getSum}}),Object.defineProperty(e,"forecastNext",{enumerable:!0,get:function(){return r.forecastNext}}),Object.defineProperty(e,"forecastNextTotal",{enumerable:!0,get:function(){return r.forecastNextTotal}}),Object.defineProperty(e,"squeezeArray",{enumerable:!0,get:function(){return r.squeezeArray}}),Object.defineProperty(e,"compareArrays",{enumerable:!0,get:function(){return r.compareArrays}}),Object.defineProperty(e,"phaseDifference",{enumerable:!0,get:function(){return r.phaseDifference}});const a=n(240);Object.defineProperty(e,"idRandLong",{enumerable:!0,get:function(){return a.idRandLong}}),Object.defineProperty(e,"idRandShort",{enumerable:!0,get:function(){return a.idRandShort}}),Object.defineProperty(e,"idShuffle",{enumerable:!0,get:function(){return a.idShuffle}});const i=n(792);Object.defineProperty(e,"addCom",{enumerable:!0,get:function(){return i.addCom}}),Object.defineProperty(e,"adjNum",{enumerable:!0,get:function(){return i.adjNum}}),Object.defineProperty(e,"priceVariations",{enumerable:!0,get:function(){return i.priceVariations}}),Object.defineProperty(e,"nTxtAr",{enumerable:!0,get:function(){return i.nTxtAr}}),Object.defineProperty(e,"rNum",{enumerable:!0,get:function(){return i.rNum}}),Object.defineProperty(e,"zNum",{enumerable:!0,get:function(){return i.zNum}}),Object.defineProperty(e,"sharpeRatio",{enumerable:!0,get:function(){return i.sharpeRatio}}),Object.defineProperty(e,"pNum",{enumerable:!0,get:function(){return i.pNum}}),Object.defineProperty(e,"isEven",{enumerable:!0,get:function(){return i.isEven}});const s=n(125);Object.defineProperty(e,"oneSec",{enumerable:!0,get:function(){return s.oneSec}}),Object.defineProperty(e,"oneDay",{enumerable:!0,get:function(){return s.oneDay}}),Object.defineProperty(e,"oneHr",{enumerable:!0,get:function(){return s.oneHr}}),Object.defineProperty(e,"oneMin",{enumerable:!0,get:function(){return s.oneMin}}),Object.defineProperty(e,"oneMon",{enumerable:!0,get:function(){return s.oneMon}}),Object.defineProperty(e,"seoDt",{enumerable:!0,get:function(){return s.seoDt}}),Object.defineProperty(e,"dayRes",{enumerable:!0,get:function(){return s.dayRes}}),Object.defineProperty(e,"invDt",{enumerable:!0,get:function(){return s.invDt}}),Object.defineProperty(e,"fullDt",{enumerable:!0,get:function(){return s.fullDt}}),Object.defineProperty(e,"fullDate",{enumerable:!0,get:function(){return s.fullDate}}),Object.defineProperty(e,"fullLong",{enumerable:!0,get:function(){return s.fullLong}}),Object.defineProperty(e,"shortDt",{enumerable:!0,get:function(){return s.shortDt}}),Object.defineProperty(e,"moYrDt",{enumerable:!0,get:function(){return s.moYrDt}}),Object.defineProperty(e,"tmAP",{enumerable:!0,get:function(){return s.tmAP}}),Object.defineProperty(e,"tmUTC",{enumerable:!0,get:function(){return s.tmUTC}}),Object.defineProperty(e,"monNm",{enumerable:!0,get:function(){return s.monNm}}),Object.defineProperty(e,"tN",{enumerable:!0,get:function(){return s.tN}}),Object.defineProperty(e,"addZ",{enumerable:!0,get:function(){return s.addZ}}),Object.defineProperty(e,"timeStandard",{enumerable:!0,get:function(){return s.timeStandard}}),Object.defineProperty(e,"dateStandard",{enumerable:!0,get:function(){return s.dateStandard}}),Object.defineProperty(e,"thisYear",{enumerable:!0,get:function(){return s.thisYear}});const c=n(794);Object.defineProperty(e,"objSort",{enumerable:!0,get:function(){return c.objSort}}),Object.defineProperty(e,"objLen",{enumerable:!0,get:function(){return c.objLen}}),Object.defineProperty(e,"objNestValueCount",{enumerable:!0,get:function(){return c.objNestValueCount}}),Object.defineProperty(e,"restoreObj",{enumerable:!0,get:function(){return c.restoreObj}}),Object.defineProperty(e,"restoreObjStr",{enumerable:!0,get:function(){return c.restoreObjStr}}),Object.defineProperty(e,"storeObj",{enumerable:!0,get:function(){return c.storeObj}}),Object.defineProperty(e,"storeObjStr",{enumerable:!0,get:function(){return c.storeObjStr}}),Object.defineProperty(e,"objSortSimple",{enumerable:!0,get:function(){return c.objSortSimple}})})();var a=t;for(var i in o)a[i]=o[i];o.__esModule&&Object.defineProperty(a,"__esModule",{value:!0})})()}};const t={};function r(n){const o=t[n];if(void 0!==o)return o.exports;const a=t[n]={exports:{}};return e[n](a,a.exports,r),a.exports}r.m=e,r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.f={},r.e=e=>{const t=[];return r.f.require(e,t),Promise.all(t)},r.u=e=>({520:"engine-litert",924:"engine-wllama"}[e]+".node.min.js"),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{const e={792:1};r.f.require=(t,n)=>{if(!e[t]){const n=require("./"+r.u(t));e[t]||(t=>{const n=t.modules,o=t.ids,a=t.runtime;for(var i in n)r.o(n,i)&&(r.m[i]=n[i]);a&&a(r);for(var s=0;s<o.length;s++)e[o[s]]=1})(n)}}})();let n={};(()=>{"use strict";var e,t,o,a,i,s,c,l;let u;r.r(n),r.d(n,{BuiltinTool:()=>c,ChatModelId:()=>s,ChatStatus:()=>t,LlmBackend:()=>a,LlmPhase:()=>i,LlmRole:()=>e,LlmStatus:()=>o,WebSearchProvider:()=>l,builtinTools:()=>wt,calculateTool:()=>We,createChat:()=>qe,currencyTool:()=>dt,preloadModel:()=>ze,webSearchTool:()=>yt}),function(e){e.system="system",e.user="user",e.assistant="assistant"}(e||(e={})),function(e){e[e.online=0]="online",e[e.away=1]="away",e[e.offline=2]="offline"}(t||(t={})),function(e){e[e.idle=0]="idle",e[e.downloading=1]="downloading",e[e.ready=2]="ready",e[e.error=3]="error",e[e.unsupported=4]="unsupported"}(o||(o={})),function(e){e.cpu="cpu",e.gpu="gpu",e.none="none"}(a||(a={})),function(e){e.download="download",e.load="load"}(i||(i={})),function(e){e.qwen3_vl_2b="qwen3-vl-2b",e.gemma4_e2b="gemma4-e2b"}(s||(s={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(c||(c={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(l||(l={}));const d=[{id:s.qwen3_vl_2b,reasoning:!0,cpu:{repo:"Qwen/Qwen3-VL-2B-Thinking-GGUF",file:"Qwen3VL-2B-Thinking-Q4_K_M.gguf",mmproj:{file:"mmproj-Qwen3VL-2B-Thinking-Q8_0.gguf"}}},{id:s.gemma4_e2b,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it.litertlm",vision:!0,audio:!0,web:{file:"gemma-4-E2B-it-gpu.litertlm",vision:!1,audio:!1}}}],f=e=>{const t=e??("undefined"==typeof navigator?void 0:navigator);if(!t)return!1;if("boolean"==typeof t.userAgentData?.mobile)return t.userAgentData.mobile;const r=t.userAgent||"";return/Android|iPhone|iPad|iPod|Mobile/i.test(r)||/Macintosh/.test(r)&&t.maxTouchPoints>1},m=(e,t=f())=>{const r=e.litert;if(r)return t&&r.web?r.web:{file:r.file,vision:r.vision,audio:r.audio}},g=e=>e?d.find(t=>t.id==e):void 0,p=async()=>(u||(u=(async()=>(await(async()=>{const e="undefined"==typeof navigator?void 0:navigator.gpu;if(!e)return!1;let t;try{return!!await Promise.race([e.requestAdapter({powerPreference:"high-performance"}),new Promise(e=>{t=setTimeout(()=>e(void 0),1500)})])}catch{return!1}finally{t&&clearTimeout(t)}})()?d.find(e=>!!e.litert):d.find(e=>!!e.cpu))?.id)()),await u),h=async e=>g(e||await p()),y=(e,t=f())=>!!e.cpu?.mmproj||!0===m(e,t)?.vision,w=(e,t=f())=>!!e.cpu?.mmproj?.audio||!0===m(e,t)?.audio,b=require("node:path"),v=()=>{return e=(0,b.join)(__dirname,"../assets/wllama"),{wasm:(0,b.join)(e,"wllama.wasm"),compatWasm:(0,b.join)(e,"compat/wllama.wasm"),compatWorker:(0,b.join)(e,"compat/wllama.js")};var e},x=()=>{return e=(0,b.join)(__dirname,"../assets/litert"),{script:(0,b.join)(e,"litertlm_wasm_internal.js"),wasm:(0,b.join)(e,"litertlm_wasm_internal.wasm")};var e},j=288,M=async e=>{if(!e.startsWith("data:"))return await(await fetch(e)).arrayBuffer();const t=e.indexOf(","),r=t>=0?e.slice(0,t):"";if(t<0)throw new Error("Invalid image data");if(!r.includes(";base64"))return await(await fetch(e)).arrayBuffer();const n=atob(e.slice(t+1)),o=new Uint8Array(n.length);for(let e=0;e<n.length;e++)o[e]=n.charCodeAt(e);return o.buffer},k=async e=>{if(!e||"function"!=typeof fetch||"function"!=typeof createImageBitmap)return e;try{const t=await fetch(e),r=await createImageBitmap(await t.blob()),n=Math.min(r.width,r.height),o=Math.floor((r.width-n)/2),a=Math.floor((r.height-n)/2),i=((e,t)=>{if("undefined"!=typeof OffscreenCanvas)return new OffscreenCanvas(e,t);if("undefined"==typeof document)return;const r=document.createElement("canvas");return r.width=e,r.height=t,r})(j,j),s=i?i.getContext("2d"):null;if(!i||!s||n<1)return r.close(),e;if(s.drawImage(r,o,a,n,n,0,0,j,j),r.close(),(e=>"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas)(i)){const t=await i.convertToBlob({type:"image/jpeg",quality:.85});return await(e=>new Promise(t=>{if("undefined"==typeof FileReader)return void t("");const r=new FileReader;r.onerror=()=>t(""),r.onload=()=>t(`${r.result}`),r.readAsDataURL(e)}))(t)||e}return i.toDataURL("image/jpeg",.85)}catch{return e}},O={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:6},P=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,S=(e={},t=!1)=>{const r=O;return{maxReplyTokens:P(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:P(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:P(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:P(e.maxImages,r.maxImages,0),maxAudio:P(e.maxAudio,r.maxAudio,0),maxContentLength:P(e.maxContentLength,r.maxContentLength,1),promptCharBudget:P(e.promptCharBudget,r.promptCharBudget,1),maxThreads:P(e.maxThreads,r.maxThreads,1)}},C=(e,t)=>({stream:!0,temperature:.7,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),T=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,N=e=>Number(e.headers.get("content-length"))||0,E=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),A=e=>E(e,"image"),D=e=>E(e,"audio"),_=["<|channel>thought\n","<|channel>thought","..."],$=["<channel|>","..."],L=(e,t,r)=>t.length||r.length?[...e?[{type:"text",text:e}]:[],...t.map(e=>({type:"image",url:e})),...r.map(e=>({type:"audio",url:e}))]:e,R=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,U=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...R(e),{type:"text",text:"\n"},...R(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r};class q extends Error{}const z=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new q(r)),t)})])}finally{n&&clearTimeout(n)}},F=e=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}},I=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,start:a,stopped:i,firstTimeoutMs:s=18e4,idleTimeoutMs:c=3e4,onStall:l})=>{let u="",d="",f="",m=!1,g=0,p=0;const h=((e,t)=>{let r="",n=!1;const o=(e,t)=>{let r=-1,n="";for(const o of t){const t=e.indexOf(o);t>=0&&(r<0||t<r)&&(r=t,n=o)}return{at:r,tag:n}},a=(e,t)=>{let r="";for(const n of t)for(let t=Math.min(e.length,n.length-1);t>r.length;t--)if(e.endsWith(n.slice(0,t))){r=e.slice(e.length-t);break}return r};return{feed:i=>{let s=r+i;for(r="";s;){if(n){const{at:t,tag:i}=o(s,$);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,$);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,_);if(e>=0){e&&t(s.slice(0,e)),s=s.slice(e+i.length),s.startsWith("\n")&&(s=s.slice(1)),n=!0;continue}const c=a(s,_);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{d+=e,r(e)},e=>{u+=e,n(e)});try{const e=(await z(a(),s,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(i()){F(e);break}let n;try{n=await z(e.next(),m?c:s,m?"Model stopped responding":"Model did not reply")}catch(r){if(r instanceof q&&(u||d)){l?.(),F(e),t&&console.log("Local chat stalled",r);break}throw r}if(n.done)break;m=!0;const a=n.value?.choices?.[0],y=a?.delta,w="string"==typeof y?.reasoning_content?y.reasoning_content:"string"==typeof y?.reasoning?y.reasoning:"";if(a?.finish_reason&&(f=a.finish_reason),w&&(d+=w,r(w)),y?.content&&h.feed(y.content),w||y?.content){const e=performance.now();g||(p=e),g+=1,g>1&&e>p&&o?.(1e3*g/(e-p))}}h.flush()}catch(e){if(t&&console.log("Local chat failed",e),e instanceof q&&!i())throw e}const y=i()?void 0:u||void 0;return t&&(console.log("Local chat reply",e.id,y?"****":""),console.log("Local chat finish",e.id,f||"none",u.length,d.length)),y},V=async({model:t,params:r,start:n,stopped:o,onStall:a})=>{const i=await(async e=>{const t=[];for(const r of e){if("string"==typeof r.content){t.push(r);continue}const e=[];for(const t of r.content)e.push("image"==t.type?{type:"image",url:await k(t.url)}:t);t.push({role:"user",content:e})}return t})(((t,r=O)=>{const n=r.maxContentLength,o=t.filter(t=>"string"==typeof t.content&&!!t.content.trim()||!(t.role!=e.user||!t.images?.length&&!t.audio?.length)),a=[],i=[];let s=0,c=r.maxImages,l=r.maxAudio;for(let t=o.length-1;t>=0;t--){const u=o[t],d=("string"==typeof u.content?u.content:"").slice(0,n),f=u.role==e.user?(u.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,c)):[],m=u.role==e.user?(u.audio||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,l)):[];if(d||f.length||m.length){if(d&&s+d.length>r.promptCharBudget)break;s+=d.length,c-=f.length,l-=m.length,u.role==e.system?a.unshift(d):u.role==e.assistant?i.unshift({role:"assistant",content:d}):i.unshift({role:"user",content:L(d,f,m)})}}for(;i.length&&"user"!=i[0].role;)i.shift();const u=[];for(const e of i){const t=u[u.length-1];"assistant"==t?.role&&"assistant"==e.role?t.content=`${t.content}\n${e.content}`:"user"==t?.role&&"user"==e.role?t.content=U(t.content,e.content):"assistant"==e.role?u.push({role:"assistant",content:e.content}):u.push({role:"user",content:e.content})}const d=a.join("\n\n"),f=[];return d&&f.push({role:"system",content:d}),f.push(...u),f})(r.messages,r.limits));return r.logging&&((e,t)=>{console.log("Local chat call",e.id,t.map(({role:e,content:t})=>({role:e,content:"****",...Array.isArray(t)?{images:t.filter(e=>"image"==e.type).length,audio:t.filter(e=>"audio"==e.type).length}:{}})))})(t,i),await I({model:t,logging:r.logging,onReason:r.onReason,onText:r.onText,onSpeed:r.onSpeed,start:()=>n(i),stopped:o,onStall:a})},B=33554432,W=new Map;let H=!1;const Y=e=>{const t=(e.split("/").pop()||"model").replace(/[^\w.-]+/g,"_");let r=0;for(let t=0;t<e.length;t++)r=31*r+e.charCodeAt(t)>>>0;return`${r.toString(16)}-${t}`},J=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},G=async()=>{if(!H)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else H=!0},Q=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},Z=async e=>{if(e)try{const t=await e.getFile(),r=JSON.parse(await t.text());return{total:Number(r.total)||0,etag:`${r.etag||""}`,complete:!0===r.complete}}catch{return}},K=async(e,t)=>{try{const r=await e.getFileHandle("meta.json",{create:!0}),n=await r.createWritable();await n.write(JSON.stringify(t)),await n.close()}catch{}},X=async function*(e){for await(const t of e)yield t},ee=async e=>{try{for await(const[t,r]of X(e))"file"==r.kind&&J(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},te=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await Z(await e.getFileHandle(`${t}.json`).catch(()=>{}));if(!n)return;return{file:r,size:r.size,total:n.total,etag:n.etag,complete:n.total?r.size>=n.total:!0===n.complete}}catch{return}},re=async(e,t)=>{const r=await Q(e,t);if(r){const e=await(async e=>await Z(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of X(e)){const e=J(r);if("file"!=n.kind||e<0)continue;const o=await n.getFile();t.push({part:{start:e,size:o.size},file:o})}}catch{return}const r=(e=>{const t=[];let r=0;for(const n of[...e].sort((e,t)=>e.start-t.start))if(n.size){if(n.start!=r)break;t.push(n),r+=n.size}return t})(t.map(e=>e.part)),n=new Set(r.map(e=>e.start)),o=t.filter(e=>n.has(e.part.start)).sort((e,t)=>e.part.start-t.part.start).map(e=>e.file);if(o.length)return{file:1==o.length?o[0]:new Blob(o),size:r.reduce((e,t)=>e+t.size,0)}})(r),n=e?.total||0,o=t?.size??0,a=t?.file??new Blob;return{file:n&&o>n?a.slice(0,n):a,size:o,total:n,etag:e?.etag||"",complete:n?o>=n:!0===e?.complete}}return await te(e,t)},ne=(e,t)=>{const r=e.headers.get("content-range"),n=/bytes (\d+)-/.exec(r||""),o=/\/(\d+)\s*$/.exec(r||""),a=e.headers.get("etag")||"";if(206==e.status){const e=n?Number(n[1]):t.size,r=o?Number(o[1]):t.total;if(e!=t.size)return;if(t.total&&r&&t.total!=r)return;if(t.etag&&a&&t.etag!=a)return;return{start:e,total:r||t.total,etag:a||t.etag}}if(!t.etag||!a||t.etag==a)return{start:0,total:N(e)||t.total,etag:a||t.etag}},oe=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:s})=>{let c,l=t,u=0,d=r;const f=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(l),{create:!0});c=await t.createWritable(),u=0},m=async()=>{const e=c;c=void 0,e&&await e.close().catch(()=>{})};try{const e=o.getReader();for(;;){const{done:r,value:o}=await e.read();if(r)break;s();let g=0;for(d&&(g=Math.min(d,o.byteLength),d-=g);g<o.byteLength;){c||await f();const e=Math.min(B-u,o.byteLength-g);await c.write({type:"write",position:u,data:o.subarray(g,g+e)}),g+=e,u+=e,l+=e,u==B&&await m()}l>t&&a(n?l/n:0,i.download)}await m()}catch(e){throw await m(),e}return l},ae=e=>["NotAllowedError","NotSupportedError"].includes(e?.name||""),ie=e=>{const t=async()=>{const t=await G();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await re(r,Y(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{const a=`${e}|${r}`,s=W.get(a);if(s)return await s;const c=await t();if(!c)return;const l=(async(e,t,r,n)=>{const o=Y(t),a=await te(e,o);if(a?.complete)return a;let s=await Q(e,o);s||(await e.removeEntry(o).catch(()=>{}),await e.removeEntry(`${o}.json`).catch(()=>{}),s=await e.getDirectoryHandle(o,{create:!0}));let c=0,l=0;for(;;){if(r?.aborted)throw new Error("Cancelled");const a=await re(e,o);if(a?.complete)return a;const u=a?.size??0,d=a?.total||0,f=a?.etag||"";if(u>c)c=u,l=0;else if(++l>4)throw new Error("Model download failed");u&&d&&n(u/d,i.download);const m=d?Math.min(u+B,d)-1:u+B-1,g=new AbortController,p=()=>g.abort(),h={size:u,total:d,etag:f};let y,w=setTimeout(p,3e4);r?.addEventListener("abort",p,{once:!0});try{if(y=await fetch(t,{signal:g.signal,headers:{Range:`bytes=${u}-${m}`}}),416==y.status){if(await(y.body?.cancel().catch(()=>{})),d&&u>=d){await K(s,{total:d,etag:f,complete:!0});continue}await ee(s),await K(s,{total:0,etag:"",complete:!1});continue}if(!y.ok||!y.body)throw await(y.body?.cancel().catch(()=>{})),new Error("Model download failed");const r=ne(y,h);if(!r){await y.body.cancel().catch(()=>{}),await ee(s),await K(s,{total:0,etag:"",complete:!1});continue}await K(s,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?u:0,i=await oe({dir:s,start:r.start+a,skip:a,total:r.total,body:y.body,onProgress:n,onChunk:()=>{clearTimeout(w),w=setTimeout(p,3e4)}});if(!r.total){await K(s,{total:i,etag:r.etag,complete:!0});const t=await re(e,o);if(t)return t}}catch(e){if(r?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&["QuotaExceededError","NotAllowedError","NotSupportedError","InvalidStateError","TypeMismatchError","SecurityError"].includes(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*l))}finally{clearTimeout(w),r?.removeEventListener("abort",p)}}})(c,r,n,o).finally(()=>{W.delete(a)});return W.set(a,l),await l},remove:async e=>{const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,Y(e))},purge:async()=>{const t=await G();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},se="litertlm-models",ce=ie("litert-store"),le={num_output_candidates:1,wait_for_weight_uploads:!0,num_decode_steps_per_sync:3,sequence_batch_size:0,supported_lora_ranks:[],max_top_k:40,enable_decode_logits:!1,enable_external_embeddings:!1,use_submodel:!1,use_autosized_ringbuffers:!0};let ue=!1;const de=(...e)=>{ue&&console.log(...e)},fe=(...e)=>{ue&&console.error(...e)},me=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(se)}catch{return}},ge=new Map,pe=(e,t,r)=>{let n=0;return e.pipeThrough(new TransformStream({transform:(e,o)=>{n+=e.byteLength,r(t?n/t:0,i.download),o.enqueue(e)}}))},he=async(e,t=!0)=>{const r=[];for(const n of e){if("string"==typeof n.content){r.push({role:n.role,content:n.content});continue}const e=[];for(const r of n.content)"text"!=r.type?t?e.push({type:r.type,data:await M(r.url)}):e.push({type:"text",text:`[${r.type}]`}):e.push({type:"text",text:r.text});r.push({role:n.role,content:e})}return r},ye=(e,t)=>{if(e.role!=t.role)return!1;if("string"==typeof e.content||"string"==typeof t.content)return e.content==t.content;if(e.content.length!=t.content.length)return!1;for(let r=0;r<e.content.length;r++){const n=e.content[r],o=t.content[r];if(n.type!=o.type)return!1;if("text"==n.type&&"text"==o.type){if(n.text!=o.text)return!1}else if(("image"==n.type&&"image"==o.type||"audio"==n.type&&"audio"==o.type)&&n.url!=o.url)return!1}return!0},we=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=C(r.limits,r.reasoning);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await he([a]))[0];if(!c)throw new Error("Empty prompt");const l=!!o.conversation&&o.reasoning==r.reasoning&&o.maxTokens==i.max_tokens&&((e,t)=>{const r="system"==e[0]?.role?e[0]:void 0,n="system"==t[0]?.role?t[0]:void 0;if(!r!=!n)return!1;if(r&&n&&!ye(r,n))return!1;const o=r?e.slice(1):e,a=n?t.slice(1):t;if(!a.length||a.length>o.length)return!1;const i=o.length-a.length;for(let e=0;e<a.length;e++)if(!ye(o[i+e],a[e]))return!1;return!0})(o.sent,s);let u;if(l&&o.conversation)u=o.conversation;else{const n=await he(s,!1);o.conversation=void 0,o.sent=[],u=await e.createConversation({sessionConfig:{maxOutputTokens:i.max_tokens,samplerParams:{type:t.SamplerType.TOP_K,temperature:i.temperature,k:40,p:.95}},preface:{...n.length?{messages:n}:{},extra_context:{enable_thinking:r.reasoning}},prefillPrefaceOnInit:n.length>0}),o.conversation=u,o.reasoning=r.reasoning,o.maxTokens=i.max_tokens,o.sent=[...s]}o.sent.push(a);let d,f=!1,m="";const g=()=>{d&&d.cancel().catch(()=>{});try{u.cancel()}catch{}};r.signal?.addEventListener("abort",g,{once:!0});try{if(r.signal?.aborted)return;const e=u.sendMessageStreaming(c).getReader();for(d=e;;){const{done:t,value:r}=await e.read();if(t)break;const n={};let o="string"==typeof r.content?r.content:"";if(Array.isArray(r.content))for(const e of r.content)"text"==e.type&&(o+=e.text);o&&(n.content=o,m+=o);const a=r.channels?.thought;a&&(n.reasoning=a),(n.content||n.reasoning)&&(yield{choices:[{delta:n}]})}f=!0}finally{r.signal?.removeEventListener("abort",g),f&&m?o.sent.push({role:"assistant",content:m}):(o.conversation=void 0,o.sent=[])}},be={backend:a.gpu,startLLM:async({model:e,limits:t,onProgress:n,signal:o,logging:s})=>{ue=!0===s;const c=e.litert,l=m(e);if(!c||!l)throw new Error("Model has no LiteRT artifact");const u=await r.e(520).then(()=>r(507)),d=globalThis,f=d.Module;d.Module={print:de,printErr:fe};try{await u.getOrLoadGlobalLiteRtLm(x().script)}finally{d.Module=f}if(o?.aborted)throw new Error("Cancelled");const g=T(c.repo,l.file),p=await me();let h;const y=p?await p.match(g):void 0;if(y?.body)h=y.body;else{const e=await ce.stored(g);e?.complete&&(h=e.file.stream())}if(!h){const e=await ce.download({url:g,signal:o,onProgress:n}).catch(e=>{if(o?.aborted)throw new Error("Cancelled");if(!ae(e))throw e;s&&console.log("Local model store failed",e)});e&&(h=e.file.stream())}if(!h&&p)try{await(async(e,t,r,n)=>{const o=ge.get(e);if(o)return await o;const a=(async()=>{const o=await fetch(e,{signal:r});if(!o.ok||!o.body)throw new Error("Model download failed");const a=N(o),i=pe(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{ge.delete(e)});return ge.set(e,a),await a})(g,p,o,n);const e=await p.match(g);e?.body&&(h=e.body)}catch(e){if(o?.aborted)throw new Error("Cancelled");s&&console.log("Local model cache failed",e)}if(h||(h=await(async(e,t,r)=>{const n=await fetch(e,{signal:t});if(!n.ok||!n.body)throw new Error("Model download failed");return pe(n.body,N(n),r)})(g,o,n)),o?.aborted)throw new Error("Cancelled");n(1,i.load);const w=await u.Engine.create((({model:e,limits:t,source:r,mod:n})=>{const o=m(e);return{model:r,mainExecutorSettings:{maxNumTokens:4096,...o?.vision?{maxNumImages:Math.max(1,t.maxImages)}:{},backendConfig:le},...o?.vision?{visionBackend:n.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...o?.audio?{audioBackend:n.Backend.CPU}:{}}})({model:e,limits:t,source:h,mod:u}));if(o?.aborted)throw await w.delete(),new Error("Cancelled");const b={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:a.gpu,contextSize:4096,chat:t=>(async({engine:e,model:t,mod:r,params:n,session:o})=>{ue=!0===n.logging;const a=()=>{try{o.conversation?.cancel()}catch{}o.conversation=void 0,o.sent=[]};try{return await V({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async a=>{if(n.signal?.aborted)throw new Error("Cancelled");const i=m(t);if(A(a)&&!i?.vision)throw new Error("Model does not accept images");if(D(a)&&!i?.audio)throw new Error("Model does not accept audio");return we({engine:e,mod:r,params:n,messages:a,session:o})}})}catch(e){throw a(),e}})({engine:w,model:e,mod:u,params:t,session:b}),unload:async()=>{b.conversation=void 0,b.sent=[],await w.delete()}}},cached:async e=>{const t=e.litert,r=m(e);if(!t||!r)return!1;const n=T(t.repo,r.file),[o,a]=await Promise.all([me(),ce.stored(n)]);if(a?.complete)return!0;try{return!(!o||!await o.match(n))}catch{return!1}},hasCache:async()=>{try{for(const e of d){const t=e.litert,r=m(e);if(!t||!r)continue;if(await ce.stored(T(t.repo,r.file)))return!0}const e=await me();return!!e&&(await e.keys()).length>0}catch{return!1}},remove:async e=>{try{const t=e.litert,r=m(e);if(!t||!r)return;const n=T(t.repo,r.file),o=await me();await ce.remove(n),o&&await o.delete(n)}catch{}},purge:async()=>{try{await ce.purge(),"undefined"!=typeof caches&&await caches.delete(se)}catch{}}},ve=ie("wllama-store");let xe,je,Me="",ke=!1;const Oe=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Pe=e=>{const t=v();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},Se=e=>{const t=e=>(...t)=>{ke&&("string"==typeof t[0]&&t[0].includes("ggml_webgpu: Failed to get an adapter")||e(...t))};return{...e,log:t(e.log),warn:t(e.warn),error:t(e.error)}},Ce=async()=>{if(xe)return xe;const e=await r.e(924).then(()=>r(577)),t=je||Pe(),n=new e.Wllama({default:t.wasm},{logger:Se(e.LoggerWithoutDebug)});return je||(je=t,Me=Oe(t)),n.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),xe=n,n},Te=async()=>{const e=xe;xe=void 0;try{await(e?.exit())}catch{}},Ne=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),Ee=e=>{const t=e.cpu;return t?[{name:t.file,url:T(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:T(t.repo,t.mmproj.file)}]:[]]:[]},Ae=async e=>{const t=Ee(e);if(!t.length)return!1;for(const e of t){const t=await ve.stored(e.url);if(!t?.complete)return!1}return!0},De=async(e,t)=>{const r=await e.cacheManager.list();return Ee(t).every(e=>r.some(t=>Ne(t,e.name)))},_e=async({model:e,signal:t,onProgress:r})=>{const n=Ee(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await ve.download({url:n[e].url,signal:t,onProgress:(t,o)=>r((e+t)/n.length,o)});if(!a)return;o.push(a.file)}return o.length?o:void 0},$e=async e=>{const t=[];for(const r of e){if("string"==typeof r.content){"system"==r.role?t.push({role:"system",content:r.content}):"assistant"==r.role?t.push({role:"assistant",content:r.content}):t.push({role:"user",content:r.content});continue}const e=[];for(const t of r.content)"text"==t.type?e.push({type:"text",text:t.text}):e.push({type:t.type,data:await M(t.url)});t.push({role:"user",content:e})}return t},Le={backend:a.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:s})=>{ke=!0===o;const c=f()?4096:8192,l=e.cpu;if(!l)throw new Error("Model has no CPU artifact");const u=Pe(s),d=Oe(u);xe&&d!=Me&&await Te(),je=u,Me=d;const m=(g="undefined"!=typeof navigator&&navigator.hardwareConcurrency||4,p=l.mmproj?Math.min(t.maxThreads,2):t.maxThreads,Math.max(1,Math.min(Math.max(2,Math.min(8,(g||4)-1)),p)));var g,p;const h=await Ce(),y=await Ae(e),w=l.mmproj?.file,b=T(l.repo,l.file),v=w?T(l.repo,w):"";if(n?.aborted)throw await Te(),new Error("Cancelled");if(!y&&w){const e=await h.cacheManager.list(),t=e.some(e=>Ne(e,l.file)),r=e.some(e=>Ne(e,w));t&&!r&&await h.cacheManager.deleteMany(e=>Ne(e,l.file))}const x={n_ctx:c,n_threads:m,reasoning_budget_tokens:t.maxThinkingTokens,n_gpu_layers:0,jinja:!0};try{let t=y?await _e({model:e,signal:n,onProgress:r}):void 0;t||y||await De(h,e).catch(()=>!1)||(t=await _e({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");if(!ae(e))throw e;o&&console.log("Local model store failed",e)})),t?(r(1,i.load),await h.loadModel(t,x)):await h.loadModelFromUrl(v?{url:b,mmprojUrl:v}:b,{...x,useCache:!0,signal:n,progressCallback:({loaded:e,total:t})=>{const n=t?e/t:0;r(n,n>=1?i.load:i.download)}})}catch(e){throw await Te(),e}if(n?.aborted)throw await Te(),new Error("Cancelled");if(!h.getLoadedContextInfo().n_ctx)throw await Te(),new Error("Failed to create model context");return{model:e,backend:a.cpu,contextSize:c,chat:t=>(async(e,t,r)=>{if(ke=!0===r.logging,e.isModelLoaded())return await V({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if(A(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if(D(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await $e(n),...C(r.limits,r.reasoning),abortSignal:r.signal,...t.reasoning?{chat_template_kwargs:{enable_thinking:r.reasoning}}:{}})}})})(h,e,t),unload:async()=>{if(xe==h)await Te();else try{await h.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await Ae(e)||await De(await Ce(),e))}catch{return!1}},hasCache:async()=>{try{for(const e of d.flatMap(e=>Ee(e)))if(await ve.stored(e.url))return!0;const e=await Ce();return(await e.cacheManager.list()).length>0}catch{return!1}},remove:async e=>{const t=Ee(e);try{for(const e of t)await ve.remove(e.url)}catch{}try{const e=await Ce();await e.cacheManager.deleteMany(e=>t.some(t=>Ne(e,t.name)))}catch{}},purge:async()=>{try{await ve.purge()}catch{}try{const e=await Ce();await e.cacheManager.clear()}catch{}}},Re=((e={})=>{const t=e.engines?.cpu||Le,r=e.engines?.litert||be;let n,s,c,l,u,f,m,g,p=a.none,h=o.idle,y=[],w=0,b={percent:0,phase:i.download};const v=n=>{if(e.backend!=a.none)return e.backend==a.cpu?n.cpu?t:void 0:e.backend==a.gpu?n.litert?r:void 0:n.litert&&"undefined"!=typeof navigator&&navigator.gpu&&"undefined"!=typeof WebAssembly?r:!n.cpu||"undefined"==typeof window&&"undefined"==typeof self&&"undefined"==typeof Worker||"undefined"==typeof WebAssembly?void 0:t},x=(e,t)=>{b={percent:Math.max(0,Math.min(1,e)),phase:t||i.download};for(const e of[...y])e.report(b.percent,b.phase)},j=e=>{h=e},M=()=>{w++,f?.abort(),f=void 0,u=void 0,h==o.downloading&&j(o.idle)},k=(e,t)=>{const r=l;return r?new Promise(n=>{let o=!1;const a={report:e,settle:e=>{o||(o=!0,t?.removeEventListener("abort",i),n(e))}},i=()=>{(e=>{y=y.filter(t=>t!=e),queueMicrotask(()=>{!y.length&&l&&M()})})(a),a.settle(!1)};y.push(a),t?.aborted?i():t?.addEventListener("abort",i,{once:!0}),r.then(a.settle,()=>a.settle(!1))}):Promise.resolve(!1)},O=()=>h==o.ready&&!!n&&!!s;return{load:async({model:e,limits:t,assets:r,logging:a,signal:g,onProgress:h})=>{if(g?.aborted)return!1;if(O()&&s?.id==e.id)return!0;if(l&&u==e.id)return h(b.percent,b.phase),await k(h,g);l&&(M(),y=[],await l.catch(()=>!1));const P=++w,S=(async()=>{await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})();const l=v(e);if(P!=w)return!1;if(!l)return m="Model is not supported on this device",j(o.unsupported),!1;if(await(async(e,t)=>{if(s&&s.id!=e.id){const e=s,t=c,r=n;n=void 0,s=void 0,c=void 0,await(r?.unload()),await(t?.remove(e))}if(await t.hasCache())for(const r of d)r.id!=e.id&&v(r)==t&&await t.remove(r)})(e,l),P!=w)return!1;const u=await l.cached(e);if(P!=w)return!1;m=void 0,j(o.downloading),x(0,i.download),u&&x(1,i.load);const g=new AbortController;f=g;try{const u=await l.startLLM({model:e,limits:t,logging:a,signal:g.signal,assets:r,onProgress:(e,t)=>{P==w&&x(e,t)}});return P!=w||g.signal.aborted?(await u.unload(),!1):(n=u,s=e,c=l,p=l.backend,m=void 0,j(o.ready),x(1,i.load),!0)}catch(e){return P!=w||(n=void 0,s=void 0,c=void 0,m=`${e?.message||`${e}`}`,a&&console.log("Local model failed",e),j(o.error)),!1}finally{f==g&&(f=void 0)}})().finally(()=>{l==S&&(l=void 0,u=void 0,y=[])});return l=S,u=e.id,await k(h,g)},chat:async e=>{if(!O()||!n)return;for(;g;)await g.catch(()=>{});if(!O()||!n)return;const t=n.chat(e);g=t;try{return await t}finally{g==t&&(g=void 0)}},unload:async()=>{const e=n;M(),n=void 0,s=void 0,c=void 0,j(o.idle),await(e?.unload())},ready:O,loading:()=>!O()&&h==o.downloading,status:()=>h,backend:()=>p,error:()=>m,model:()=>s}})(),Ue=(e,r,n)=>{const a=e.status(),i=g(r);return{availability:a==o.ready?t.online:a==o.error||a==o.unsupported?t.offline:t.away,status:a,backend:e.backend(),supportsImages:!!i&&y(i),supportsAudio:!!i&&w(i),ready:e.ready(),loading:e.loading(),requesting:n.requesting,phase:n.phase,percent:n.percent,...n.error?{error:n.error}:{}}},qe=(t=>{let r,n=0;const a=e=>e.input.onStatus?.(Ue(t,e.model??e.input.model,e));return s=>{r?.controller.abort();const c={token:++n,input:s,controller:new AbortController,percent:t.ready()?100:0,phase:t.ready()?i.load:i.download,requesting:!1,cancelled:!1};return r=c,a(c),(async r=>{const{input:o}=r,s=!0===o.logging,c=await h(o.model);if(r.model=c?.id,r.token!=n)return;const l=o.messages.some(t=>t.role!=e.system&&"string"==typeof t.content&&!!t.content.trim()),u=o.messages.some(t=>t.role==e.user&&!!t.images?.some(e=>"string"==typeof e&&!!e)),d=o.messages.some(t=>t.role==e.user&&!!t.audio?.some(e=>"string"==typeof e&&!!e)),f=l||u||d;if(!c)return r.error="Unknown model",void a(r);if(!f)return r.error="No prompt",void a(r);const m=y(c),g=w(c);if(!(l||u&&m||d&&g))return d&&!g?r.error="Model does not accept audio":u&&!m&&(r.error="Model does not accept images"),void a(r);const p=S(o.limits,!!c.litert),b=await t.load({model:c,limits:p,logging:s,signal:r.controller.signal,onProgress:(e,t)=>{r.token==n&&(r.percent=Math.round(100*e),r.phase=t,a(r))}}).catch(e=>(r.token==n&&(r.error=`${e?.message||`${e}`}`),!1));if(r.token!=n)return;if(r.cancelled)return;if(!b)return r.error||(r.error=t.error()||"Model not ready"),void a(r);const v=u&&!m||d&&!g?o.messages.map(({images:e,audio:t,...r})=>({...r,...e&&m?{images:e}:{},...t&&g?{audio:t}:{}})):o.messages;r.requesting=!0,r.error=void 0,r.percent=100,r.phase=i.load,a(r);let x,j="",M="";try{x=await t.chat({messages:v,limits:p,reasoning:!0===o.reasoning,logging:s,onReason:e=>{r.token!=n||r.cancelled||(j+=e,o.onThinking?.(j))},onText:e=>{r.token!=n||r.cancelled||(M+=e,o.onResponse?.(M))},onSpeed:e=>{r.token!=n||r.cancelled||o.onSpeed?.(e)},signal:r.controller.signal})}catch(e){if(r.token!=n)return;return r.requesting=!1,r.error=`${e?.message||`${e}`}`,void a(r)}r.token==n&&(r.requesting=!1,x||r.cancelled||(r.error="No reply"),a(r))})(c),()=>(e=>{e.token==n&&(e.cancelled=!0,e.controller.abort(),t.status()!=o.ready?queueMicrotask(()=>a(e)):t.unload().then(()=>a(e)))})(c)}})(Re),ze=(Fe=Re,async(e={})=>{const t=await h(e.model),r=r=>e.onStatus?.(Ue(Fe,t?.id,r));if(!t)return r({requesting:!1,phase:i.download,percent:0,error:"Unknown model"}),!1;let n,o=0,a=i.download;const s=Fe.ready()&&Fe.model()?.id==t.id;return await Fe.load({model:t,limits:S(e.limits,!!t.litert),logging:!0===e.logging,onProgress:(e,t)=>{o=Math.round(100*e),a=t,r({requesting:!1,phase:a,percent:o})}}).catch(e=>(n=`${e?.message||`${e}`}`,!1))?(s&&r({requesting:!1,phase:i.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||Fe.error()||"Model not ready"}),!1)});var Fe,Ie=r(69);const Ve=/^[0-9+\-*/%^().]+$/,Be=e=>{let t=0;const r=e=>!!e&&e>="0"&&e<="9",n=e=>{throw new Error(e)},o=()=>{let o;for("("==e[t]?(t++,o=s(),")"!=e[t]&&n("Unbalanced parentheses"),t++):o=(()=>{const o=t;for(;r(e[t]);)t++;const a=e.slice(o,t);let i="";if("."==e[t]){t++;const n=t;for(;r(e[t]);)t++;i=e.slice(n,t)}return a||i?Number(`${a||"0"}.${i||"0"}`):n("Expected a number")})();"%"==e[t];)t++,o/=100;return o},a=()=>"+"==e[t]?(t++,a()):"-"==e[t]?(t++,-a()):(()=>{const r=o();return"^"!=e[t]?r:(t++,r**a())})(),i=()=>{let r=a();for(;"*"==e[t]||"/"==e[t];){const o=e[t];t++;const i=a();"*"==o?r*=i:(i||n("Division by zero"),r/=i)}return r},s=()=>{let r=i();for(;"+"==e[t]||"-"==e[t];){const n=e[t];t++;const o=i();r="+"==n?r+o:r-o}return r},c=s();return t<e.length&&n("Unexpected character"),Number.isFinite(c)||n("Result is not a finite number"),c},We={name:"calculate",description:"Evaluate an arithmetic expression. Supports + - * / % ^ and parentheses; % divides by 100.",parameters:{type:"object",properties:{expression:{type:"string",description:"Arithmetic expression, for example 2*(3+4)"}},required:["expression"]},execute:e=>{const t=e.expression;if("string"!=typeof t)throw new Error("Missing expression");return(e=>{if(e.trim().length>200)throw new Error("Expression is too long");const t=(e=>e.replace(/×/g,"*").replace(/÷/g,"/").replace(/−/g,"-").replace(/,/g,"").replace(/\s+/g,""))(e);if(!t)throw new Error("Expression is empty");if(!Ve.test(t))throw new Error("Unsupported character");const r=Be(t);return{expression:t,result:Math.abs(r)>=1e5?(0,Ie.pNum)(r)??r:(0,Ie.rNum)(r,12)}})(t)}},He="degreesign-chat-prices-v1",Ye="EUR",Je=5*Ie.oneMin,Ge=30*Ie.oneSec;let Qe,Ze={},Ke=0,Xe=!1,et=!1;const tt=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},rt=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,nt=async({fiat:e,crypto:t})=>{try{const r=await fetch("https://srv.coinexams.com/data.json");if(!r.ok)throw new Error(`Price feed failed with ${r.status}`);const n=await r.json(),o=Date.now(),a=e?((e,t)=>{const r=tt(e.rates?.current),n=tt(e.rates?.yesterday);if(Object.keys(r).length)return{fetchedAt:t,sourceAt:Number(e.rates?.date)||t,rates:r,yesterday:n}})(n,o):void 0,i=t?((e,t)=>{const r=e.coins??{},n={},o={};for(const[e,t]of Object.entries(r)){const r=e.trim().toUpperCase(),a=t?.pr,i=t?.yst;"number"==typeof a&&Number.isFinite(a)&&(n[r]=a),"number"==typeof i&&Number.isFinite(i)&&(o[r]=i)}if(Object.keys(n).length)return{fetchedAt:t,sourceAt:Number(e.date)||t,prices:n,yesterday:o}})(n,o):void 0;if(e&&!a)throw new Error("Price feed is unavailable");if(t&&!i)throw new Error("Price feed is unavailable");a&&(Ze.fiat=rt(Ze.fiat,a)),i&&(Ze.crypto=rt(Ze.crypto,i)),Ke=0,Xe=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(He,JSON.stringify(Ze))}catch{}})()}catch(e){throw Ke=Date.now(),Xe=!0,e}},ot=e=>!!Ze.crypto&&(e in Ze.crypto.prices||e in Ze.crypto.yesterday),at=e=>!!Ze.fiat&&(e in Ze.fiat.rates||e in Ze.fiat.yesterday),it=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==Ye)continue;const e=ot(r)||at(r);!ot(r)&&e||(t.crypto=!0),ot(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(Ze.fiat?.fetchedAt??0)>=Ie.oneHr,o=t.crypto&&r-(Ze.crypto?.fetchedAt??0)>=Je;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||Ke&&r-Ke<Ge||(Qe||(Qe=nt({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{Qe=void 0})),await Qe))},st=e=>{if(e==Ye)return 1;const t=Ze.crypto?.yesterday[e],r=Ze.fiat?.yesterday[e];return t||(r?1/r:void 0)},ct=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},lt=e=>Math.abs(e)>=1e5?(0,Ie.pNum)(e)??e:(0,Ie.rNum)(e,8),ut=async e=>{(()=>{if(!et){et=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(He);if(!e)return;const t=JSON.parse(e);Ze={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=ct(e.from,"from"),r=void 0===e.to||null===e.to?Ye:ct(e.to,"to"),n=(e=>{if(null==e)return 1;if("number"!=typeof e||!Number.isFinite(e))throw new Error("Invalid amount");return e})(e.amount);await it([t,r]);const o=e=>{const t=(e=>{if(e==Ye)return 1;const t=Ze.crypto?.prices[e],r=Ze.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!Ze.fiat&&!Ze.crypto)throw new Error("Prices unavailable offline");if(ot(e)||at(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=st(t),c=st(r),l=a/i,u=s&&c?s/c:void 0,d=void 0===u?void 0:l-u,f=void 0===u?void 0:100*(l/u-1),m=(e=>{const t=[];for(const r of e)r!=Ye&&(ot(r)?Ze.crypto&&t.push(Ze.crypto.sourceAt):at(r)&&Ze.fiat&&t.push(Ze.fiat.sourceAt));return t})([t,r]),g=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:lt(l),...void 0===u?{}:{previousRate:lt(u),change:lt(d??0),changePercent:(0,Ie.rNum)(f??0,4)},result:lt(n*l),updatedAt:new Date(g).toISOString(),stale:Xe&&!(!Ze.fiat&&!Ze.crypto)}},dt={name:"currency",description:"Get the EUR price of a fiat currency, crypto coin or metal, or convert an amount. Returns the 24-hour change.",parameters:{type:"object",properties:{from:{type:"string",description:"Currency, coin or metal to convert from"},to:{type:"string",description:"Currency, coin or metal to convert to, EUR by default"},amount:{type:"number",description:"Amount to convert, 1 by default"}},required:["from"]},execute:e=>ut(e)},ft={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},mt=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,gt=(e,t)=>e.replace(/<[^>]*>/g," ").replace(/&(#x?[0-9a-f]+|[a-z]+);/gi,(e,t)=>{const r=(e=>{if(e.startsWith("#")){const t="x"==e[1]||"X"==e[1],r=parseInt(t?e.slice(2):e.slice(1),t?16:10);return r>0&&r<=1114111?String.fromCodePoint(r):e}return ft[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),pt=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,ht=async(e,t)=>{const r=new AbortController,n=setTimeout(()=>r.abort(),t);try{const t=await fetch(e,{signal:r.signal});if(!t.ok)throw new Error(`Search failed with ${t.status}`);return await t.json()}catch(e){if(r.signal.aborted)throw new Error(`Search timed out after ${t} ms`);throw e}finally{clearTimeout(n)}},yt=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==l.duckduckgo?l.duckduckgo:l.wikipedia,language:pt.test(t)?t:"en",limit:Math.round(mt(e.limit,1,20,3)),snippetLength:Math.round(mt(e.snippetLength,1,4e3,400)),timeout:mt(e.timeout,1e3,3e4,8e3)}})(e);return{name:"websearch",description:t.provider==l.duckduckgo?"Search DuckDuckGo for an instant answer and related topics.":"Search Wikipedia and return a few matching articles.",parameters:{type:"object",properties:{query:{type:"string",description:"What to search for"}},required:["query"]},execute:async e=>{const r="string"==typeof e.query?e.query.trim():"";if(!r)throw new Error("Missing query");const n=t.provider==l.duckduckgo?await(async(e,t)=>{const r=`https://api.duckduckgo.com/?format=json&no_html=1&skip_disambig=1&q=${encodeURIComponent(t)}`,n=await ht(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:gt(r||n,200),url:t,snippet:gt(n,e.snippetLength)}))},s=e=>{for(const t of e)t.Topics?s(t.Topics):i(t.FirstURL,t.Text,t.Text)};i(n.AbstractURL,n.Heading||n.AbstractText,n.AbstractText);for(const e of n.Results??[])i(e.FirstURL,e.Text,e.Text);return s(n.RelatedTopics??[]),o.slice(0,e.limit)})(t,r):await(async(e,t)=>{const r=`https://${e.language}.wikipedia.org`,n=`${r}/w/rest.php/v1/search/page?q=${encodeURIComponent(t)}&limit=${e.limit}`,o=await ht(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:gt(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:gt(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},wt=(e,t)=>{const r=[];for(const n of e)n==c.websearch?r.push(yt(t)):n==c.calculate?r.push(We):n==c.currency&&r.push(dt);return r}})(),module.exports=n})();