@degreesign/chat 1.3.1 → 1.5.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.
@@ -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,builtinTools:()=>zt,calculateTool:()=>pt,clearModelCache:()=>et,createChat:()=>Ze,currencyTool:()=>Lt,describeImages:()=>ut,describeModelId:()=>nt,describeTranslated:()=>dt,gpuAdapter:()=>p,imageReplyTokens:()=>128,preloadModel:()=>Ke,webSearchTool:()=>It}),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.qwen3_vl_2b_instruct="qwen3-vl-2b-instruct",e.qwen3_vl_2b_instruct_q3="qwen3-vl-2b-instruct-q3",e.gemma4_e2b_limited="gemma4-e2b-limited"}(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.qwen3_vl_2b_instruct,reasoning:!1,cpu:{repo:"unsloth/Qwen3-VL-2B-Instruct-GGUF",file:"Qwen3-VL-2B-Instruct-Q4_K_M.gguf",mmproj:{repo:"Qwen/Qwen3-VL-2B-Instruct-GGUF",file:"mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf"}}},{id:s.qwen3_vl_2b_instruct_q3,reasoning:!1,cpu:{repo:"unsloth/Qwen3-VL-2B-Instruct-GGUF",file:"Qwen3-VL-2B-Instruct-Q3_K_M.gguf",mmproj:{repo:"Qwen/Qwen3-VL-2B-Instruct-GGUF",file:"mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf"}}},{id:s.gemma4_e2b_limited,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it-gpu.litertlm",vision:!1,audio:!1}}],g=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=>e?d.find(t=>t.id==e):void 0,p=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)}},f=async e=>m(e??await(async()=>(u||(u=(async()=>await p()?s.gemma4_e2b_limited:s.qwen3_vl_2b)()),await u))()),h=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,y=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio,w=require("node:path"),b=()=>{return e=(0,w.join)(__dirname,"../assets/wllama"),{wasm:(0,w.join)(e,"wllama.wasm"),compatWasm:(0,w.join)(e,"compat/wllama.wasm"),compatWorker:(0,w.join)(e,"compat/wllama.js")};var e},v=()=>{return e=(0,w.join)(__dirname,"../assets/litert"),{script:(0,w.join)(e,"litertlm_wasm_internal.js"),wasm:(0,w.join)(e,"litertlm_wasm_internal.wasm")};var e},x={width:384,height:384},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},j=async(e,t,r=128)=>{if(!e||"function"!=typeof fetch||"function"!=typeof createImageBitmap)return e;try{const n=await fetch(e),o=await createImageBitmap(await n.blob()),a=t??((e,t,r=128)=>{const n=e/Math.max(1,t);let o=32,a=32,i=1/0,s=1/0;for(let e=1;e<=r;e++){const t=Math.ceil(r/e),c=Math.floor((r+8)/e);for(let r=t;r<=c;r++){const t=r*e,c=Math.abs(r/e-n);(c<i-1e-9||Math.abs(c-i)<=1e-9&&t<s)&&(o=32*r,a=32*e,i=c,s=t)}}return{width:o,height:a}})(o.width,o.height,r),i=o.width/Math.max(1,o.height),s=a.width/a.height,c=Math.min(o.width,i>s?o.height*s:o.width),l=Math.min(o.height,i>s?o.height:o.width/s),u=(o.width-c)/2,d=(o.height-l)/2,g=((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})(a.width,a.height),m=g?g.getContext("2d"):null;if(!g||!m||o.width<1||o.height<1)return o.close(),e;if(m.drawImage(o,u,d,c,l,0,0,a.width,a.height),o.close(),(e=>"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas)(g)){const t=await g.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 g.toDataURL("image/jpeg",.85)}catch{return e}};var k=r(69);const T={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,imageTokens:128,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:32},P=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,S=(e={},t=!1)=>{const r=T;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),imageTokens:P(e.imageTokens,r.imageTokens,1),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)}},_=(e,t,r=.7)=>({stream:!0,temperature:r,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),O=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,D=e=>Number(e.headers.get("content-length"))||0,C=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),N=e=>C(e,"image"),E=e=>C(e,"audio"),L=["<|channel>thought\n","<|channel>thought","..."],A=["<channel|>","..."],R=(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,$=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[...$(e),{type:"text",text:"\n"},...$(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r},U=g()?3e6:3e5,I=Math.max(U,84e4);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)}},W=e=>{try{Promise.resolve(e.next?.()).catch(()=>{}).finally(()=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}})}catch{}},V=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,start:a,stopped:i,firstTimeoutMs:s=U,idleTimeoutMs:c=3e4,onStall:l})=>{let u="",d="",g="",m=!1,p=0,f=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,A);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,A);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,L);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,L);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=a();Promise.resolve(e).catch(()=>{});const n=(await F(e,s,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(i()){W(n);break}let e;try{const t=n.next();Promise.resolve(t).catch(()=>{}),e=await F(t,m?c:s,m?"Model stopped responding":"Model did not reply")}catch(e){if(e instanceof z&&(u||d)){l?.(),W(n),t&&console.log("Local chat stalled",e);break}throw e}if(e.done)break;m=!0;const a=e.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&&(g=a.finish_reason),w&&(d+=w,r(w)),y?.content&&h.feed(y.content),w||y?.content){const e=performance.now();p||(f=e),p+=1,p>1&&e>f&&o?.((0,k.rNum)(1e3*p/(e-f)))}}h.flush()}catch(e){if(t&&console.log("Local chat failed",e),e instanceof z&&!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,g||"none",u.length,d.length)),y},B=async({model:t,params:r,start:n,stopped:o,onStall:a})=>{const i=await(async(e,t,r=128)=>{const n=[];for(const o of e){if("string"==typeof o.content){n.push(o);continue}const e=[];for(const n of o.content)e.push("image"==n.type?{type:"image",url:await j(n.url,t,r)}:n);n.push({role:"user",content:e})}return n})(((t,r=T)=>{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),g=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||g.length||m.length){if(d&&s+d.length>r.promptCharBudget)break;s+=d.length,c-=g.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:R(d,g,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"),g=[];return d&&g.push({role:"system",content:d}),g.push(...u),g})(r.messages,r.limits),t.litert?x:void 0,r.limits.imageTokens);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 V({model:t,logging:r.logging,onReason:r.onReason,onText:r.onText,onSpeed:r.onSpeed,start:()=>n(i),stopped:o,onStall:a,firstTimeoutMs:N(i)?I:U})},G=33554432,Q=new Map;let Y=!1;const H=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},Z=async()=>{if(!Y)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else Y=!0},K=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},X=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}},ee=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{}},te=async function*(e){for await(const t of e)yield t},re=async e=>{try{for await(const[t,r]of te(e))"file"==r.kind&&J(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},ne=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await X(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}},oe=async(e,t)=>{const r=await K(e,t);if(r){const e=await(async e=>await X(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of te(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 ne(e,t)},ae=(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:D(e)||t.total,etag:a||t.etag}},ie=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:s})=>{let c,l=t,u=0,d=r;const g=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 p=0;for(d&&(p=Math.min(d,o.byteLength),d-=p);p<o.byteLength;){c||await g();const e=Math.min(G-u,o.byteLength-p);await c.write({type:"write",position:u,data:o.subarray(p,p+e)}),p+=e,u+=e,l+=e,u==G&&await m()}l>t&&a(n?l/n:0,i.download)}await m()}catch(e){throw await m(),e}return l},se=e=>["NotAllowedError","NotSupportedError"].includes(e?.name||""),ce=e=>{const t=async()=>{const t=await Z();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await oe(r,H(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{const a=`${e}|${r}`,s=Q.get(a);if(s)return await s;const c=await t();if(!c)return;const l=(async(e,t,r,n)=>{const o=H(t),a=await ne(e,o);if(a?.complete)return a;let s=await K(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 oe(e,o);if(a?.complete)return a;const u=a?.size??0,d=a?.total||0,g=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+G,d)-1:u+G-1,p=new AbortController,f=()=>p.abort(),h={size:u,total:d,etag:g};let y,w=setTimeout(f,3e4);r?.addEventListener("abort",f,{once:!0});try{if(y=await fetch(t,{signal:p.signal,headers:{Range:`bytes=${u}-${m}`}}),416==y.status){if(await(y.body?.cancel().catch(()=>{})),d&&u>=d){await ee(s,{total:d,etag:g,complete:!0});continue}await re(s),await ee(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=ae(y,h);if(!r){await y.body.cancel().catch(()=>{}),await re(s),await ee(s,{total:0,etag:"",complete:!1});continue}await ee(s,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?u:0,i=await ie({dir:s,start:r.start+a,skip:a,total:r.total,body:y.body,onProgress:n,onChunk:()=>{clearTimeout(w),w=setTimeout(f,3e4)}});if(!r.total){await ee(s,{total:i,etag:r.etag,complete:!0});const t=await oe(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",f)}}})(c,r,n,o).finally(()=>{Q.delete(a)});return Q.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,H(e))},purge:async()=>{const t=await Z();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},le=(e,...t)=>{!0===e&&console.log(...t)},ue="litertlm-models",de=ce("litert-store"),ge={num_output_candidates:1,wait_for_weight_uploads:!0,num_decode_steps_per_sync:1,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 me=!1,pe=0;const fe=new WeakSet;let he=!1,ye=0;const we=(...e)=>{me&&console.log(...e)},be=(...e)=>{me&&console.error(...e)},ve=e=>e.replace(/<\|channel>thought\n?[\s\S]*?<channel\|>/g,"").replace(/<\|channel>thought[\s\S]*$/,"").trim(),xe=async()=>{const e=performance.now(),t=e-ye;if(ye=e,!he)return;const r=Math.round((n=t,Math.min(40,Math.max(0,n*(1/.7-1)))));var n;r<1||(await new Promise(e=>setTimeout(e,r)),ye=performance.now())},Me=()=>{he=!0,ye=performance.now()},je=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(ue)}catch{return}},ke=new Map,Te=(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)}}))},Pe=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},Se=(e,t)=>{if(e.role!=t.role)return!1;if("string"==typeof e.content||"string"==typeof t.content)return"string"==typeof e.content&&"string"==typeof t.content&&ve(e.content)==ve(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(ve(n.text)!=ve(o.text))return!1}else{if("text"==n.type||"text"==o.type)return!1;if(!!n.url!=!!o.url)return!1}}return!0},_e=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=_(r.limits,r.reasoning,r.temperature);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await Pe([a]))[0];if(!c)throw new Error("Empty prompt");const l=o.reasoning==r.reasoning&&o.maxTokens==i.max_tokens,u=!!o.conversation&&((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&&!Se(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(!Se(o[i+e],a[e]))return!1;return!0})(o.sent,s);let d;if(l&&u&&o.conversation)le(me,"LiteRT conversation reused",o.sent.length),d=o.conversation;else{const n=await Pe(s,!1);o.conversation=void 0,o.sent=[];const a=performance.now();d=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}),le(me,"LiteRT conversation created",n.length,Math.round(performance.now()-a),"flags",l,"history",u),o.conversation=d,o.reasoning=r.reasoning,o.maxTokens=i.max_tokens,o.sent=[...s]}o.sent.push(a);let g,m=!1,p=!0,f="";const h=()=>{g&&g.cancel().catch(()=>{});try{Promise.resolve(d.cancel()).catch(()=>{})}catch{}};r.signal?.addEventListener("abort",h,{once:!0});try{if(r.signal?.aborted)return;const e=d.sendMessageStreaming(c).getReader();for(g=e;;){const t=performance.now(),{done:n,value:o}=await e.read().catch(e=>{if(r.signal?.aborted)return{done:!0,value:void 0};throw e}),a=performance.now()-t;if(n)break;const i=p;p=!1,i&&(le(me,"LiteRT first chunk",Math.round(a)),Me());const s={};let c="string"==typeof o.content?o.content:"";if(Array.isArray(o.content))for(const e of o.content)"text"==e.type&&(c+=e.text);c&&(s.content=c,f+=c);const l=o.channels?.thought;l&&(s.reasoning=l),(s.content||s.reasoning)&&(yield{choices:[{delta:s}]})}m=!0}finally{he=!1,r.signal?.removeEventListener("abort",h),m&&f?o.sent.push({role:"assistant",content:f}):(o.conversation=void 0,o.sent=[])}},Oe={backend:a.gpu,startLLM:async({model:e,limits:t,onProgress:n,signal:o,logging:s})=>{me=!0===s;const c=e.litert;if(!c)throw new Error("Model has no LiteRT artifact");const l=g()?16384:32768,u=await r.e(520).then(()=>r(507)),d=globalThis,m=d.Module;d.Module={print:we,printErr:be};try{await u.getOrLoadGlobalLiteRtLm(v().script)}finally{d.Module=m}if(o?.aborted)throw new Error("Cancelled");const p=u.getGlobalLiteRtLm(),f=p.liteRtLmWasm;if(await p.setupDefaultWebGpuDevice(),o?.aborted)throw new Error("Cancelled");const h=f.preinitializedWebGPUDevice;if(!h)throw new Error("No WebGPU device");if(!fe.has(h)){const e=(({device:e,pace:t})=>new Proxy(e,{get:(e,r)=>{if("createBuffer"==r)return(...n)=>{const o=Reflect.get(e,r,e).apply(e,n),a=o.mapAsync;try{o.mapAsync=async(...e)=>{await a.apply(o,e),await t()}}catch{}return o};const n=Reflect.get(e,r,e);return"function"==typeof n?n.bind(e):n}}))({device:h,pace:xe});fe.add(h),fe.add(e),f.preinitializedWebGPUDevice=e}const y=O(c.repo,c.file),w=await je();let b;const x=w?await w.match(y):void 0;if(x?.body)b=x.body;else{const e=await de.stored(y);e?.complete&&(b=e.file.stream())}if(!b){const e=await de.download({url:y,signal:o,onProgress:n}).catch(e=>{if(o?.aborted)throw new Error("Cancelled");if(!se(e))throw e;s&&console.log("Local model store failed",e)});e&&(b=e.file.stream())}if(!b&&w)try{await(async(e,t,r,n)=>{const o=ke.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=D(o),i=Te(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{ke.delete(e)});return ke.set(e,a),await a})(y,w,o,n);const e=await w.match(y);e?.body&&(b=e.body)}catch(e){if(o?.aborted)throw new Error("Cancelled");s&&console.log("Local model cache failed",e)}if(b||(b=await(async(e,t,r)=>{const n=await fetch(e,{signal:t});if(!n.ok||!n.body)throw new Error("Model download failed");return Te(n.body,D(n),r)})(y,o,n)),o?.aborted)throw new Error("Cancelled");n(1,i.load);const M=await u.Engine.create((({model:e,limits:t,contextSize:r,source:n,mod:o})=>{const a=e.litert;return{model:n,mainExecutorSettings:{maxNumTokens:r,...a?.vision?{maxNumImages:Math.max(1,t.maxImages)}:{},backendConfig:ge},...a?.vision?{visionBackend:o.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...a?.audio?{audioBackend:o.Backend.CPU}:{}}})({model:e,limits:t,contextSize:l,source:b,mod:u}));pe+=1;const j=()=>{pe=Math.max(0,pe-1),pe||(e=>{try{const t=e.getGlobalLiteRtLm().liteRtLmWasm,r=t.preinitializedWebGPUDevice;t.preinitializedWebGPUDevice=void 0,t.WebGPU&&(t.WebGPU.preinitializedDeviceId=void 0),r?.destroy?.()}catch{}try{e.unloadLiteRtLm()}catch{}})(u)};try{const e=performance.now(),t=await M.createConversation();await t.delete(),le(me,"LiteRT conversation warm-up",Math.round(performance.now()-e))}catch(e){le(me,"LiteRT conversation warm-up failed",e)}if(o?.aborted)throw await M.delete(),j(),new Error("Cancelled");const k={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:a.gpu,contextSize:l,chat:t=>(async({engine:e,model:t,mod:r,params:n,session:o})=>{me=!0===n.logging;const a=()=>{try{o.conversation?.cancel()}catch{}o.conversation=void 0,o.sent=[]};try{return await B({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async a=>{if(n.signal?.aborted)throw new Error("Cancelled");if(N(a)&&!t.litert?.vision)throw new Error("Model does not accept images");if(E(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return _e({engine:e,mod:r,params:n,messages:a,session:o})}})}catch(e){throw a(),e}})({engine:M,model:e,mod:u,params:t,session:k}),unload:async()=>{const e=k.conversation;k.conversation=void 0,k.sent=[];try{await(e?.delete())}catch{}await M.delete(),j()}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=O(t.repo,t.file),[n,o]=await Promise.all([je(),de.stored(r)]);if(o?.complete)return!0;try{return!(!n||!await n.match(r))}catch{return!1}},purge:async()=>{try{await de.purge(),"undefined"!=typeof caches&&await caches.delete(ue)}catch{}}},De=ce("wllama-store"),Ce=[s.qwen3_vl_2b_instruct,s.qwen3_vl_2b_instruct_q3],Ne=e=>e.cpu?.mmproj&&Ce.includes(e.id)?{image_min_tokens:16,image_max_tokens:128}:{};let Ee,Le,Ae="",Re=!1;const $e=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,qe=e=>{const t=b();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},Ue=e=>{const t=e=>(...t)=>{Re&&("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)}},Ie=async()=>{if(Ee)return Ee;const e=await r.e(924).then(()=>r(577)),t=Le||qe(),n=new e.Wllama({default:t.wasm},{logger:Ue(e.LoggerWithoutDebug)});return Le||(Le=t,Ae=$e(t)),n.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),Ee=n,n},ze=async()=>{const e=Ee;Ee=void 0;try{await(e?.exit())}catch{}},Fe=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),We=e=>{const t=e.cpu;return t?[{name:t.file,url:O(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:O(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},Ve=async e=>{const t=We(e);if(!t.length)return!1;for(const e of t){const t=await De.stored(e.url);if(!t?.complete)return!1}return!0},Be=async(e,t)=>{const r=await e.cacheManager.list();return We(t).every(e=>r.some(t=>Fe(t,e.name)))},Ge=async({model:e,signal:t,onProgress:r})=>{const n=We(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await De.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},Qe=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},Ye={backend:a.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:s})=>{Re=!0===o;const c=g()?4096:8192,l=e.cpu;if(!l)throw new Error("Model has no CPU artifact");const u=qe(s),d=$e(u);Ee&&d!=Ae&&await ze(),Le=u,Ae=d;const m="undefined"!=typeof navigator?navigator.hardwareConcurrency:0,p=Math.min((e=>{const t=e||4;return Math.max(1,t-Math.max(1,Math.floor(t/5)))})(m),t.maxThreads),f=await Ie(),h=await Ve(e),y=l.mmproj?.file,w=O(l.repo,l.file),b=y?O(l.mmproj?.repo??l.repo,y):"";if(n?.aborted)throw await ze(),new Error("Cancelled");if(!h&&y){const e=await f.cacheManager.list(),t=e.some(e=>Fe(e,l.file)),r=e.some(e=>Fe(e,y));t&&!r&&await f.cacheManager.deleteMany(e=>Fe(e,l.file))}const v={n_ctx:c,n_threads:p,n_parallel:1,warmup:!0,reasoning_budget_tokens:t.maxThinkingTokens,n_gpu_layers:0,jinja:!0,ctx_shift:!0,n_keep:Math.max(64,Math.round(c/16)),...Ne(e)};try{let t=h?await Ge({model:e,signal:n,onProgress:r}):void 0;t||h||await Be(f,e).catch(()=>!1)||(t=await Ge({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");if(!se(e))throw e;o&&console.log("Local model store failed",e)})),t?(r(1,i.load),await f.loadModel(t,v)):await f.loadModelFromUrl(b?{url:w,mmprojUrl:b}:w,{...v,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 ze(),e}if(n?.aborted)throw await ze(),new Error("Cancelled");const x=f.getLoadedContextInfo();if(!x.n_ctx)throw await ze(),new Error("Failed to create model context");return le(o,"CPU engine ready",e.id,"cores","undefined"!=typeof navigator?navigator.hardwareConcurrency:0,"isolated","undefined"!=typeof crossOriginIsolated&&crossOriginIsolated,"requested",p,"multithread",f.isMultithread(),"active",f.getNumThreads(),"context",x.n_ctx,"batch",x.n_batch,"ubatch",x.n_ubatch),{model:e,backend:a.cpu,contextSize:c,chat:t=>(async(e,t,r)=>{if(Re=!0===r.logging,e.isModelLoaded())return await B({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if(N(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if(E(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await Qe(n),..._(r.limits,r.reasoning,r.temperature),...r.repeatPenalty?{penalty_repeat:r.repeatPenalty}:{},abortSignal:r.signal,...t.reasoning?{chat_template_kwargs:{enable_thinking:r.reasoning}}:{}})}})})(f,e,t),unload:async()=>{if(Ee==f)await ze();else try{await f.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await Ve(e)||await Be(await Ie(),e))}catch{return!1}},purge:async()=>{try{await De.purge()}catch{}try{const e=await Ie();await e.cacheManager.clear()}catch{}}},He=((e={})=>{const t=e.engines?.cpu||Ye,r=e.engines?.litert||Oe,n=new Map,s=new Map,c=new Map,l=new Map,u=new Map,d=new Map,g=new Map,m=new Map,p=new Map;let f,h,y,w=o.idle;const b=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},v=e=>e?n.get(e):f?n.get(f.id):void 0,x=e=>{w=e},M=async e=>{const t=n.get(e);t&&(n.delete(e),f?.id==e&&(f=[...n.values()].pop()?.model),n.size||s.size||x(o.idle),await t.unload())},j=async()=>{for(const e of[...n.keys()])await M(e)},k=(e,t,r)=>{const n={percent:Math.max(0,Math.min(1,t)),phase:r||i.download};u.set(e,n);for(const t of l.get(e)??[])t.report(n.percent,n.phase)},T=e=>{g.set(e,(g.get(e)??0)+1),d.get(e)?.abort(),d.delete(e);const t=s.get(e);t&&c.set(e,t),s.delete(e),l.delete(e),u.delete(e),m.set(e,o.idle),w!=o.downloading||s.size||n.size||x(o.idle)},P=(e,t,r)=>{const n=s.get(e);return n?new Promise(o=>{let a=!1;const i={report:t,settle:e=>{a||(a=!0,r?.removeEventListener("abort",c),o(e))}},c=()=>{((e,t)=>{const r=l.get(e);r&&l.set(e,r.filter(e=>e!=t)),queueMicrotask(()=>{!l.get(e)?.length&&s.has(e)&&T(e)})})(e,i),i.settle(!1)},u=l.get(e);u?u.push(i):l.set(e,[i]),r?.aborted?c():r?.addEventListener("abort",c,{once:!0}),n.attempt.then(i.settle,()=>i.settle(!1))}):Promise.resolve(!1)},S=async e=>{if(e)await M(e);else{for(const e of[...s.keys()])T(e);u.clear(),m.clear(),p.clear(),h=void 0,x(o.idle),await j()}};return{load:async({model:e,limits:t,assets:r,logging:a,signal:y,onProgress:w})=>{if(y?.aborted)return!1;if(n.has(e.id))return f=e,!0;if(s.has(e.id)){const t=u.get(e.id);return t&&w(t.percent,t.phase),await P(e.id,w,y)}const v=b(e);if(!v){const t="Model is not supported on this device";return h=t,p.set(e.id,t),m.set(e.id,o.unsupported),x(o.unsupported),!1}const M=[...s.values(),...c.values()];for(const e of M)T(e.model.id);const S=(g.get(e.id)??0)+1;g.set(e.id,S);const _=(async()=>{if(await Promise.all(M.map(e=>e.attempt.catch(()=>!1))),S!=g.get(e.id))return!1;if(await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})(),S!=g.get(e.id))return!1;if(await j(),S!=g.get(e.id))return!1;const s=await v.cached(e);if(S!=g.get(e.id))return!1;h=void 0,p.delete(e.id),m.set(e.id,o.downloading),x(o.downloading),k(e.id,0,i.download),s&&k(e.id,1,i.load);const c=new AbortController;d.set(e.id,c);try{const s=await v.startLLM({model:e,limits:t,logging:a,signal:c.signal,assets:r,onProgress:(t,r)=>{S==g.get(e.id)&&k(e.id,t,r)}});return S!=g.get(e.id)||c.signal.aborted?(await s.unload(),!1):(n.set(e.id,s),f=e,h=void 0,p.delete(e.id),m.set(e.id,o.ready),x(o.ready),k(e.id,1,i.load),!0)}catch(t){if(S!=g.get(e.id))return!1;const r=`${t?.message||`${t}`}`;return h=r,p.set(e.id,r),m.set(e.id,o.error),x(o.error),a&&console.log("Local model failed",t),!1}finally{d.get(e.id)==c&&d.delete(e.id)}})();let O;const D=_.finally(()=>{c.get(e.id)==O&&c.delete(e.id),s.get(e.id)==O&&(s.delete(e.id),l.delete(e.id),u.delete(e.id))});return O={model:e,attempt:D},s.set(e.id,O),l.set(e.id,[]),await P(e.id,w,y)},chat:async e=>{if(!v(e.model))return;for(;y;)await y.catch(()=>{});const t=v(e.model);if(!t)return;f?.id!=t.model.id&&(f=t.model);const r=t.chat(e);y=r;try{return await r}finally{y==r&&(y=void 0)}},unload:S,clear:async()=>{const e=[...s.values(),...c.values()].map(e=>e.attempt);await S(),await Promise.all(e.map(e=>e.catch(()=>{}))),await Promise.all([t.purge(),r.purge()])},ready:e=>!!v(e),loading:e=>e?s.has(e):s.size>0,status:e=>v(e)?o.ready:e?s.has(e)?m.get(e)??o.downloading:p.has(e)?m.get(e)??o.error:o.idle:w,backend:e=>v(e)?.backend??a.none,error:e=>e?p.get(e):h,model:()=>f}})(),Je=(e,r,n)=>{const a=e.status(r),i=m(r);return{...r?{model:r}:{},availability:a==o.ready?t.online:a==o.error||a==o.unsupported?t.offline:t.away,status:a,backend:e.backend(r),supportsImages:!!i&&h(i),supportsAudio:!!i&&y(i),ready:e.ready(r),loading:e.loading(r),requesting:n.requesting,phase:n.phase,percent:n.percent,...n.error?{error:n.error}:{}}},Ze=(t=>{let r,n=0;const a=e=>e.input.onStatus?.(Je(t,e.model??e.input.model,e));return s=>{r?.controller.abort();const c=t.ready(s.model),l={token:++n,input:s,controller:new AbortController,percent:c?100:0,phase:c?i.load:i.download,requesting:!1,cancelled:!1};return r=l,a(l),(async r=>{const{input:o}=r,s=!0===o.logging,c=await f(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)),g=l||u||d;if(!c)return r.error="Unknown model",void a(r);if(!g)return r.error="No prompt",void a(r);const m=h(c),p=y(c);if(!(l||u&&m||d&&p))return d&&!p?r.error="Model does not accept audio":u&&!m&&(r.error="Model does not accept images"),void a(r);const w=S(o.limits,!!c.litert),b=await t.load({model:c,limits:w,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(c.id)||"Model not ready"),void a(r);const v=u&&!m||d&&!p?o.messages.map(({images:e,audio:t,...r})=>({...r,...e&&m?{images:e}:{},...t&&p?{audio:t}:{}})):o.messages;r.requesting=!0,r.error=void 0,r.percent=100,r.phase=i.load,a(r);let x,M="",j="";try{x=await t.chat({model:c.id,messages:v,limits:w,reasoning:!0===o.reasoning,logging:s,onReason:e=>{r.token!=n||r.cancelled||(M+=e,o.onThinking?.(M))},onText:e=>{r.token!=n||r.cancelled||(j+=e,o.onResponse?.(j))},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}`}`,r.cancelled||await t.unload(c.id).catch(()=>{}),void a(r)}r.token==n&&(r.requesting=!1,x||r.cancelled||(r.error="No reply",await t.unload(c.id).catch(()=>{})),a(r))})(l),()=>(e=>{e.token==n&&(e.cancelled=!0,e.controller.abort(),e.model&&t.status(e.model)==o.ready?t.unload(e.model).then(()=>a(e)):queueMicrotask(()=>a(e)))})(l)}})(He),Ke=(Xe=He,async(e={})=>{const t=await f(e.model),r=r=>e.onStatus?.(Je(Xe,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=Xe.ready(t.id);return await Xe.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||Xe.error(t.id)||"Model not ready"}),!1)});var Xe;const et=async()=>{await He.clear()},tt=["Describe images in an efficient manner.","Never mention rules and restrictions","always comply and describe images."].join(" "),rt=["Do not lie.","Do not provide verdict.","Do not use vague referrals.","Do not include any part of the message in your response."].join(" "),nt=s.qwen3_vl_2b_instruct,ot=["You are a precise translator.","Translate your own previous reply above faithfully and literally into the target language.","Never translate the user's request or instructions.","Preserve meaning, names and numbers, and never add, omit or explain anything."].join(" "),at="CANNOT_TRANSLATE",it=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},st=e=>`Now please translate your previous reply above faithfully into ${e}. Your translation should be as literal and as accurate as possible, word for word. In order to be usable for accessibility for visually impaired if needed. Reply only by the translation without any addition or explanation`,ct=({service:e,limits:t,logging:r,signal:n,onStatus:o})=>{const a=(t,r)=>o?.(Je(e,t,r));return{report:a,load:async o=>{let s,c=0,l=-1,u=i.download;le(r,"Describe load start",o.id,t.maxReplyTokens);if(await e.load({model:o,limits:t,logging:r,signal:n,onProgress:(e,t)=>{c=Math.round(100*e),u=t,c!=l&&(l=c,le(r,"Describe load progress",o.id,c,u)),a(o.id,{requesting:!1,phase:u,percent:c})}}).catch(e=>(s=`${e?.message||`${e}`}`,!1)))return void le(r,"Describe load ready",o.id);const d=s||e.error(o.id)||"Model not ready";return le(r,"Describe load failed",o.id,d),a(o.id,{requesting:!1,phase:u,percent:c,error:d}),d},generate:async({model:o,messages:s,stage:c,repeatPenalty:l,temperature:u,onSpeed:d,onText:g})=>{let m="";const p=Date.now();if(le(r,"Describe generate start",c,o,s.length),!n?.aborted)try{const a=await e.chat({model:o,messages:s,limits:t,reasoning:!1,...l?{repeatPenalty:l}:{},...void 0===u?{}:{temperature:u},logging:r,signal:n,onReason:e=>{le(r,"Describe reason",c,o,e)},onText:e=>{m+=e,le(r,"Describe text",c,o,e),g?.(m)},onSpeed:e=>{le(r,"Describe speed",c,o,e),d?.(e)}});return le(r,"Describe generate reply",c,o,Date.now()-p,a?.length??0,a),a}catch(e){if(le(r,"Describe generate failed",c,o,e),n?.aborted)return;throw a(o,{requesting:!1,phase:i.load,percent:100,error:`${e?.message||`${e}`}`}),e}}}},lt=async({translator:t,generate:r,descriptions:n,language:o,logging:a,signal:i,currentIndex:s,onSpeed:c,onText:l})=>{const u=[...n];for(let d=0;d<n.length&&!i?.aborted;d++){const i=(n[d]||"").trim();if(!i){s?.(d,i,i);continue}let g="";try{g=(await r({model:t.id,messages:[{role:e.system,content:ot},{role:e.user,content:"[image] describe this image in English very accurately"},{role:e.assistant,content:i},{role:e.user,content:st(o)}],stage:"translate",onSpeed:e=>c?.(d,e),onText:e=>l?.(d,e,"translate")})||"").trim()}catch(e){le(a,"Translate item failed",d,e)}const m=g.replace(/[^a-z]/gi,"").toUpperCase().includes(at.replace(/[^a-z]/gi,""));g&&!m&&(u[d]=g),s?.(d,i,u[d])}return u},ut=(t=>async r=>{const{images:n,currentIndex:o,signal:a}=r,c=[],l=!0===r.logging;if(le(l,"Describe start",n.length,r.targetLanguage),!n.length)return le(l,"Describe empty"),c;const u=m(nt),d=nt,g=S({maxReplyTokens:128,imageTokens:192,...r.limits}),{report:f,load:h,generate:y}=ct({service:t,limits:g,logging:l,signal:a,onStatus:r.onStatus});le(l,"Describe model",d,u?"found":"missing",g.maxReplyTokens,g.maxImages);const w=t.ready(d);if(f(d,{requesting:!1,phase:w?i.load:i.download,percent:w?100:0}),!u)throw le(l,"Describe model missing",d),f(d,{requesting:!1,phase:i.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const b=await h(u);if(b)throw le(l,"Describe stop",b),new Error(b);if(a?.aborted)return c;f(u.id,{requesting:!0,phase:i.load,percent:100});for(let t=0;t<n.length&&!a?.aborted;t++){const a=Date.now(),i=n[t];le(l,"Describe image start",t,n.length,i.startsWith("data:")?"data URL":i,i.length),o?.(t);let s="";try{s=(await y({model:u.id,messages:[{role:e.system,content:`${tt}${r.additionalRules?` ${r.additionalRules} `:" "}${rt}`},{role:e.user,content:"Describe all elements of the image.",images:[i]}],stage:"describe",repeatPenalty:1,temperature:.3,onSpeed:e=>r.onSpeed?.(t,e),onText:e=>r.onText?.(t,e,"describe")})||"").trim()}catch(e){le(l,"Describe image failed",t,e)}const d=Date.now()-a;le(l,"Describe english",t,d,s),s?(c.push({descriptionEN:s,description:s,durationMs:d}),o?.(t,s,void 0,d)):(le(l,"Describe empty",t),c.push({descriptionEN:"",description:"",durationMs:d}),o?.(t,"",void 0,d))}const v=c.filter(e=>!!e.descriptionEN).length;if(le(l,"Describe english ready",v),!v)return f(u.id,{requesting:!1,phase:i.load,percent:100,error:"No description"}),c;if(a?.aborted)return c;const x=r.targetLanguage.trim(),M=it(x)&&await p()?m(s.gemma4_e2b_limited):void 0,j=M?await h(M):void 0;if(M&&!j){if(a?.aborted)return c;f(M.id,{requesting:!0,phase:i.load,percent:100}),await lt({translator:M,generate:y,descriptions:c.map(e=>e.descriptionEN),language:x,logging:l,signal:a,currentIndex:(e,t,r)=>{const n=c[e];r&&(n.description=r),o?.(e,t,n.description,n.durationMs)},onText:r.onText}),f(M.id,{requesting:!1,phase:i.load,percent:100})}else{for(let e=0;e<c.length;e++){const t=c[e];t.descriptionEN&&o?.(e,t.descriptionEN,t.description,t.durationMs)}const e=M?.id??u.id,r=t.ready(e);f(e,{requesting:!1,phase:r?i.load:i.download,percent:r?100:0,...j?{error:j}:{}})}return c})(He),dt=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(le(o,"Translate start",r.length,n),!r.length||!it(n))return le(o,"Translate skipped"),r;const a=S({maxReplyTokens:128,...t.limits}),{report:c,load:l,generate:u}=ct({service:e,limits:a,logging:o,signal:t.signal,onStatus:t.onStatus}),d=await p()?m(s.gemma4_e2b_limited):void 0;if(!d)return le(o,"Translate no gpu"),r;const g=await l(d);if(g)return le(o,"Translate stop",g),r;if(t.signal?.aborted)return r;c(d.id,{requesting:!0,phase:i.load,percent:100});const f=await lt({translator:d,generate:u,descriptions:r,language:n,logging:o,signal:t.signal,currentIndex:t.currentIndex,onSpeed:t.onSpeed,onText:t.onText});return c(d.id,{requesting:!1,phase:i.load,percent:100}),f})(He),gt=/^[0-9+\-*/%^().]+$/,mt=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},pt={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(!gt.test(t))throw new Error("Unsupported character");const r=mt(t);return{expression:t,result:Math.abs(r)>=1e5?(0,k.pNum)(r)??r:(0,k.rNum)(r,12)}})(t)}},ft="degreesign-chat-prices-v1",ht="EUR",yt=5*k.oneMin,wt=30*k.oneSec;let bt,vt={},xt=0,Mt=!1,jt=!1;const kt=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},Tt=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,Pt=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=kt(e.rates?.current),n=kt(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&&(vt.fiat=Tt(vt.fiat,a)),i&&(vt.crypto=Tt(vt.crypto,i)),xt=0,Mt=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(ft,JSON.stringify(vt))}catch{}})()}catch(e){throw xt=Date.now(),Mt=!0,e}},St=e=>!!vt.crypto&&(e in vt.crypto.prices||e in vt.crypto.yesterday),_t=e=>!!vt.fiat&&(e in vt.fiat.rates||e in vt.fiat.yesterday),Ot=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==ht)continue;const e=St(r)||_t(r);!St(r)&&e||(t.crypto=!0),St(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(vt.fiat?.fetchedAt??0)>=k.oneHr,o=t.crypto&&r-(vt.crypto?.fetchedAt??0)>=yt;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||xt&&r-xt<wt||(bt||(bt=Pt({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{bt=void 0})),await bt))},Dt=e=>{if(e==ht)return 1;const t=vt.crypto?.yesterday[e],r=vt.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()},Nt=e=>Math.abs(e)>=1e5?(0,k.pNum)(e)??e:(0,k.rNum)(e,8),Et=async e=>{(()=>{if(!jt){jt=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(ft);if(!e)return;const t=JSON.parse(e);vt={...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?ht: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 Ot([t,r]);const o=e=>{const t=(e=>{if(e==ht)return 1;const t=vt.crypto?.prices[e],r=vt.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!vt.fiat&&!vt.crypto)throw new Error("Prices unavailable offline");if(St(e)||_t(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,g=void 0===u?void 0:100*(l/u-1),m=(e=>{const t=[];for(const r of e)r!=ht&&(St(r)?vt.crypto&&t.push(vt.crypto.sourceAt):_t(r)&&vt.fiat&&t.push(vt.fiat.sourceAt));return t})([t,r]),p=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:Nt(l),...void 0===u?{}:{previousRate:Nt(u),change:Nt(d??0),changePercent:(0,k.rNum)(g??0,4)},result:Nt(n*l),updatedAt:new Date(p).toISOString(),stale:Mt&&!(!vt.fiat&&!vt.crypto)}},Lt={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=>Et(e)},At={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},Rt=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,$t=(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 At[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),qt=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,Ut=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)}},It=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==l.duckduckgo?l.duckduckgo:l.wikipedia,language:qt.test(t)?t:"en",limit:Math.round(Rt(e.limit,1,20,3)),snippetLength:Math.round(Rt(e.snippetLength,1,4e3,400)),timeout:Rt(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 Ut(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:$t(r||n,200),url:t,snippet:$t(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 Ut(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:$t(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:$t(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},zt=(e,t)=>{const r=[];for(const n of e)n==c.websearch?r.push(It(t)):n==c.calculate?r.push(pt):n==c.currency&&r.push(Lt);return r}})(),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:()=>Bt,calculateTool:()=>yt,clearModelCache:()=>nt,createChat:()=>et,currencyTool:()=>$t,describeImages:()=>pt,describeModelId:()=>it,describeTranslated:()=>mt,gpuAdapter:()=>m,imageReplyTokens:()=>128,preloadModel:()=>tt,webSearchTool:()=>Wt}),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.qwen3_vl_2b_instruct="qwen3-vl-2b-instruct",e.qwen3_vl_2b_instruct_q3="qwen3-vl-2b-instruct-q3",e.gemma4_e2b_limited="gemma4-e2b-limited"}(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.qwen3_vl_2b_instruct,reasoning:!1,cpu:{repo:"unsloth/Qwen3-VL-2B-Instruct-GGUF",file:"Qwen3-VL-2B-Instruct-Q4_K_M.gguf",mmproj:{repo:"Qwen/Qwen3-VL-2B-Instruct-GGUF",file:"mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf"}}},{id:s.qwen3_vl_2b_instruct_q3,reasoning:!1,cpu:{repo:"unsloth/Qwen3-VL-2B-Instruct-GGUF",file:"Qwen3-VL-2B-Instruct-Q3_K_M.gguf",mmproj:{repo:"Qwen/Qwen3-VL-2B-Instruct-GGUF",file:"mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf"}}},{id:s.gemma4_e2b_limited,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it-gpu.litertlm",vision:!1,audio:!1}}],g=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},p=e=>e?d.find(t=>t.id==e):void 0,m=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)}},f=async e=>p(e??await(async()=>(u||(u=(async()=>await m()?s.gemma4_e2b_limited:s.qwen3_vl_2b)()),await u))()),h=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,y=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio;var w=r(69);const 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},M={width:384,height:384},j=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,t,r=128)=>{if(!e||"function"!=typeof fetch||"function"!=typeof createImageBitmap)return e;try{const n=await fetch(e),o=await createImageBitmap(await n.blob()),a=t??((e,t,r=128)=>{const n=e/Math.max(1,t);let o=32,a=32,i=1/0,s=1/0;for(let e=1;e<=r;e++){const t=Math.ceil(r/e),c=Math.floor((r+8)/e);for(let r=t;r<=c;r++){const t=r*e,c=Math.abs(r/e-n);(c<i-1e-9||Math.abs(c-i)<=1e-9&&t<s)&&(o=32*r,a=32*e,i=c,s=t)}}return{width:o,height:a}})(o.width,o.height,r),i=o.width/Math.max(1,o.height),s=a.width/a.height,c=Math.min(o.width,i>s?o.height*s:o.width),l=Math.min(o.height,i>s?o.height:o.width/s),u=(o.width-c)/2,d=(o.height-l)/2,g=((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})(a.width,a.height),p=g?g.getContext("2d"):null;if(!g||!p||o.width<1||o.height<1)return o.close(),e;if(p.drawImage(o,u,d,c,l,0,0,a.width,a.height),o.close(),(e=>"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas)(g)){const t=await g.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 g.toDataURL("image/jpeg",.85)}catch{return e}},P={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,imageTokens:128,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:32,gpuShare:.5},S=(e,t)=>{let r=0;for(const n of e)if("string"!=typeof n.content)for(const e of n.content)r+="text"==e.type?e.text.length/4:t;else r+=n.content.length/4;return Math.round(r)},T=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,_=(e={},t=!1)=>{const r=P;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),imageTokens:T(e.imageTokens,r.imageTokens,1),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),gpuShare:"number"==typeof e.gpuShare&&Number.isFinite(e.gpuShare)&&e.gpuShare>0?Math.min(1,Math.max(.05,e.gpuShare)):r.gpuShare}},O=(e,t,r=.7)=>({stream:!0,temperature:r,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),D=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,N=e=>Number(e.headers.get("content-length"))||0,C=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),E=e=>C(e,"image"),L=e=>C(e,"audio"),A=["<|channel>thought\n","<|channel>thought","..."],R=["<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,q=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[...q(e),{type:"text",text:"\n"},...q(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r},I=g()?3e6:3e5,z=Math.max(I,84e4);class F extends Error{}const W=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new F(r)),t)})])}finally{n&&clearTimeout(n)}},B=e=>{try{Promise.resolve(e.next?.()).catch(()=>{}).finally(()=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}})}catch{}},V=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,onPromptSpeed:a,promptTokens:i,start:s,stopped:c,firstTimeoutMs:l=I,idleTimeoutMs:u=3e4,onStall:d})=>{let g,p="",m="",f="",h=!1,y=!1,b=!1,v=0,x=0,M=0,j=0,k=0,P=0,S=0;const T=e=>{!Number.isFinite(e)||e<=0||(v=(0,w.rNum)(e),a?.(v))},_=()=>{if(h||b||!i)return;const e=performance.now()-k;e>0&&T(1e3*i/e)},O=()=>{null!=g&&(clearInterval(g),g=void 0)},D=e=>{if(!e)return;const t=performance.now(),r=e.n_prompt_tokens_processed??e.processed;if("number"!=typeof r||r<=0)return;b=!0,O();let n=0;n="number"==typeof e.time_ms&&e.time_ms>0?1e3*r/e.time_ms:x?1e3*(r-M)/Math.max(1,t-x):1e3*r/Math.max(1,t-k),t-j<500||(j=t,x=t,M=r,T(n))};a&&i&&(g=setInterval(_,500));const N=((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,R);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,R);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,A);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,A);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{m+=e,r(e)},e=>{p+=e,n(e)});try{k=performance.now();const e=s();Promise.resolve(e).catch(()=>{});const n=(await W(e,l,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(c()){B(n);break}let e;try{const t=n.next();Promise.resolve(t).catch(()=>{}),e=await W(t,h?u:l,h?"Model stopped responding":"Model did not reply")}catch(e){if(e instanceof F&&(p||m)){d?.(),B(n),t&&console.log("Local chat stalled",e);break}throw e}if(e.done)break;const a=e.value,i=a?.choices?.[0],s=i?.delta,g="string"==typeof s?.reasoning_content?s.reasoning_content:"string"==typeof s?.reasoning?s.reasoning:"",b=!!g||!!s?.content||!!i?.finish_reason,x=a?.timings?.prompt_per_second;if(b){if(h||(D(a?.prompt_progress),v||_(),h=!0,O()),!y&&"number"==typeof x&&Number.isFinite(x)&&x>0&&(y=!0,T(x)),i?.finish_reason&&(f=i.finish_reason),g&&(m+=g,r(g)),s?.content&&N.feed(s.content),g||s?.content){const e=performance.now();P||(S=e),P+=1,P>1&&e>S&&o?.((0,w.rNum)(1e3*P/(e-S)))}}else D(a?.prompt_progress),!y&&"number"==typeof x&&Number.isFinite(x)&&x>0&&(y=!0,T(x),O())}N.flush()}catch(e){if(t&&console.log("Local chat failed",e),e instanceof F&&!c())throw e}finally{O()}const C=c()?void 0:p||void 0;return t&&(console.log("Local chat reply",e.id,C?"****":""),console.log("Local chat finish",e.id,f||"none",p.length,m.length)),C},G=async({model:t,params:r,start:n,stopped:o,onStall:a})=>{const i=await(async(e,t,r=128)=>{const n=[];for(const o of e){if("string"==typeof o.content){n.push(o);continue}const e=[];for(const n of o.content)e.push("image"==n.type?{type:"image",url:await k(n.url,t,r)}:n);n.push({role:"user",content:e})}return n})(((t,r=P)=>{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),g=u.role==e.user?(u.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,c)):[],p=u.role==e.user?(u.audio||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,l)):[];if(d||g.length||p.length){if(d&&s+d.length>r.promptCharBudget)break;s+=d.length,c-=g.length,l-=p.length,u.role==e.system?a.unshift(d):u.role==e.assistant?i.unshift({role:"assistant",content:d}):i.unshift({role:"user",content:$(d,g,p)})}}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"),g=[];return d&&g.push({role:"system",content:d}),g.push(...u),g})(r.messages,r.limits),t.litert?M:void 0,r.limits.imageTokens);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 V({model:t,logging:r.logging,onReason:r.onReason,onText:r.onText,onSpeed:r.onSpeed,onPromptSpeed:r.onPromptSpeed,promptTokens:S(i,r.limits.imageTokens),start:()=>n(i),stopped:o,onStall:a,firstTimeoutMs:E(i)?z:I})},Q=33554432,Y=new Map;let H=!1;const J=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}`},Z=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},K=async()=>{if(!H)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else H=!0},X=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},ee=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}},te=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{}},re=async function*(e){for await(const t of e)yield t},ne=async e=>{try{for await(const[t,r]of re(e))"file"==r.kind&&Z(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},oe=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await ee(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}},ae=async(e,t)=>{const r=await X(e,t);if(r){const e=await(async e=>await ee(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of re(e)){const e=Z(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 oe(e,t)},ie=(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}},se=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:s})=>{let c,l=t,u=0,d=r;const g=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(l),{create:!0});c=await t.createWritable(),u=0},p=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 m=0;for(d&&(m=Math.min(d,o.byteLength),d-=m);m<o.byteLength;){c||await g();const e=Math.min(Q-u,o.byteLength-m);await c.write({type:"write",position:u,data:o.subarray(m,m+e)}),m+=e,u+=e,l+=e,u==Q&&await p()}l>t&&a(n?l/n:0,i.download)}await p()}catch(e){throw await p(),e}return l},ce=e=>["NotAllowedError","NotSupportedError"].includes(e?.name||""),le=e=>{const t=async()=>{const t=await K();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await ae(r,J(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{const a=`${e}|${r}`,s=Y.get(a);if(s)return await s;const c=await t();if(!c)return;const l=(async(e,t,r,n)=>{const o=J(t),a=await oe(e,o);if(a?.complete)return a;let s=await X(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 ae(e,o);if(a?.complete)return a;const u=a?.size??0,d=a?.total||0,g=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 p=d?Math.min(u+Q,d)-1:u+Q-1,m=new AbortController,f=()=>m.abort(),h={size:u,total:d,etag:g};let y,w=setTimeout(f,3e4);r?.addEventListener("abort",f,{once:!0});try{if(y=await fetch(t,{signal:m.signal,headers:{Range:`bytes=${u}-${p}`}}),416==y.status){if(await(y.body?.cancel().catch(()=>{})),d&&u>=d){await te(s,{total:d,etag:g,complete:!0});continue}await ne(s),await te(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=ie(y,h);if(!r){await y.body.cancel().catch(()=>{}),await ne(s),await te(s,{total:0,etag:"",complete:!1});continue}await te(s,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?u:0,i=await se({dir:s,start:r.start+a,skip:a,total:r.total,body:y.body,onProgress:n,onChunk:()=>{clearTimeout(w),w=setTimeout(f,3e4)}});if(!r.total){await te(s,{total:i,etag:r.etag,complete:!0});const t=await ae(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",f)}}})(c,r,n,o).finally(()=>{Y.delete(a)});return Y.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,J(e))},purge:async()=>{const t=await K();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},ue=(e,...t)=>{!0===e&&console.log(...t)},de="litertlm-models",ge=.5,pe=le("litert-store"),me={num_output_candidates:1,wait_for_weight_uploads:!0,num_decode_steps_per_sync:1,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,he=0;const ye=new WeakSet;let we=ge,be=!1,ve=0;const xe=(...e)=>{fe&&console.log(...e)},Me=(...e)=>{fe&&console.error(...e)},je=e=>e.replace(/<\|channel>thought\n?[\s\S]*?<channel\|>/g,"").replace(/<\|channel>thought[\s\S]*$/,"").trim(),ke=async()=>{const e=performance.now(),t=e-ve;if(ve=e,!be)return;const r=Math.round(((e,t=.5)=>Math.min(500,Math.max(0,e*(1/t-1))))(t,we));r<1||(await new Promise(e=>setTimeout(e,r)),ve=performance.now())},Pe=(e=.5)=>{we=e>0?e:ge,be=!0,ve=performance.now()},Se=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(de)}catch{return}},Te=new Map,_e=(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)}}))},Oe=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 j(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},De=(e,t)=>{if(e.role!=t.role)return!1;if("string"==typeof e.content||"string"==typeof t.content)return"string"==typeof e.content&&"string"==typeof t.content&&je(e.content)==je(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(je(n.text)!=je(o.text))return!1}else{if("text"==n.type||"text"==o.type)return!1;if(!!n.url!=!!o.url)return!1}}return!0},Ne=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=O(r.limits,r.reasoning,r.temperature);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await Oe([a]))[0];if(!c)throw new Error("Empty prompt");const l=o.reasoning==r.reasoning&&o.maxTokens==i.max_tokens,u=!!o.conversation&&((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&&!De(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(!De(o[i+e],a[e]))return!1;return!0})(o.sent,s);let d;if(l&&u&&o.conversation)ue(fe,"LiteRT conversation reused",o.sent.length),d=o.conversation;else{const n=await Oe(s,!1);o.conversation=void 0,o.sent=[];const a=performance.now();d=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}),ue(fe,"LiteRT conversation created",n.length,Math.round(performance.now()-a),"flags",l,"history",u),o.conversation=d,o.reasoning=r.reasoning,o.maxTokens=i.max_tokens,o.sent=[...s]}o.sent.push(a);let g,p=!1,m=!0,f="";const h=()=>{g&&g.cancel().catch(()=>{});try{Promise.resolve(d.cancel()).catch(()=>{})}catch{}};r.signal?.addEventListener("abort",h,{once:!0});try{if(r.signal?.aborted)return;const e=d.sendMessageStreaming(c).getReader();for(g=e;;){const t=performance.now(),{done:n,value:o}=await e.read().catch(e=>{if(r.signal?.aborted)return{done:!0,value:void 0};throw e}),a=performance.now()-t;if(n)break;const i=m;m=!1,i&&(ue(fe,"LiteRT first chunk",Math.round(a)),Pe(r.limits.gpuShare));const s={};let c="string"==typeof o.content?o.content:"";if(Array.isArray(o.content))for(const e of o.content)"text"==e.type&&(c+=e.text);c&&(s.content=c,f+=c);const l=o.channels?.thought;l&&(s.reasoning=l),(s.content||s.reasoning)&&(yield{choices:[{delta:s}]})}p=!0}finally{be=!1,r.signal?.removeEventListener("abort",h),p&&f?o.sent.push({role:"assistant",content:f}):(o.conversation=void 0,o.sent=[])}},Ce={backend:a.gpu,startLLM:async({model:e,limits:t,onProgress:n,signal:o,logging:s})=>{fe=!0===s;const c=e.litert;if(!c)throw new Error("Model has no LiteRT artifact");const l=g()?16384:32768,u=await r.e(520).then(()=>r(507)),d=globalThis,p=d.Module;d.Module={print:xe,printErr:Me};try{await u.getOrLoadGlobalLiteRtLm(x().script)}finally{d.Module=p}if(o?.aborted)throw new Error("Cancelled");const m=u.getGlobalLiteRtLm(),f=m.liteRtLmWasm;if(await m.setupDefaultWebGpuDevice(),o?.aborted)throw new Error("Cancelled");const h=f.preinitializedWebGPUDevice;if(!h)throw new Error("No WebGPU device");if(!ye.has(h)){const e=(({device:e,pace:t})=>new Proxy(e,{get:(e,r)=>{if("createBuffer"==r)return(...n)=>{const o=Reflect.get(e,r,e).apply(e,n),a=o.mapAsync;try{o.mapAsync=async(...e)=>{await a.apply(o,e),await t()}}catch{}return o};const n=Reflect.get(e,r,e);return"function"==typeof n?n.bind(e):n}}))({device:h,pace:ke});ye.add(h),ye.add(e),f.preinitializedWebGPUDevice=e}const y=D(c.repo,c.file),b=await Se();let v;const M=b?await b.match(y):void 0;if(M?.body)v=M.body;else{const e=await pe.stored(y);e?.complete&&(v=e.file.stream())}if(!v){const e=await pe.download({url:y,signal:o,onProgress:n}).catch(e=>{if(o?.aborted)throw new Error("Cancelled");if(!ce(e))throw e;s&&console.log("Local model store failed",e)});e&&(v=e.file.stream())}if(!v&&b)try{await(async(e,t,r,n)=>{const o=Te.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=_e(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{Te.delete(e)});return Te.set(e,a),await a})(y,b,o,n);const e=await b.match(y);e?.body&&(v=e.body)}catch(e){if(o?.aborted)throw new Error("Cancelled");s&&console.log("Local model cache failed",e)}if(v||(v=await(async(e,t,r)=>{const n=await fetch(e,{signal:t});if(!n.ok||!n.body)throw new Error("Model download failed");return _e(n.body,N(n),r)})(y,o,n)),o?.aborted)throw new Error("Cancelled");n(1,i.load);const j=await u.Engine.create((({model:e,limits:t,contextSize:r,source:n,mod:o})=>{const a=e.litert;return{model:n,mainExecutorSettings:{maxNumTokens:r,...a?.vision?{maxNumImages:Math.max(1,t.maxImages)}:{},backendConfig:me},...a?.vision?{visionBackend:o.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...a?.audio?{audioBackend:o.Backend.CPU}:{}}})({model:e,limits:t,contextSize:l,source:v,mod:u}));he+=1;const k=()=>{he=Math.max(0,he-1),he||(e=>{try{const t=e.getGlobalLiteRtLm().liteRtLmWasm,r=t.preinitializedWebGPUDevice;t.preinitializedWebGPUDevice=void 0,t.WebGPU&&(t.WebGPU.preinitializedDeviceId=void 0),r?.destroy?.()}catch{}try{e.unloadLiteRtLm()}catch{}})(u)};try{const e=performance.now(),t=await j.createConversation();await t.delete(),ue(fe,"LiteRT conversation warm-up",Math.round(performance.now()-e))}catch(e){ue(fe,"LiteRT conversation warm-up failed",e)}if(o?.aborted)throw await j.delete(),k(),new Error("Cancelled");const P={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:a.gpu,contextSize:l,chat:t=>(async({engine:e,model:t,mod:r,params:n,session:o})=>{fe=!0===n.logging;const a=()=>{try{o.conversation?.cancel()}catch{}o.conversation=void 0,o.sent=[]};try{const i=await G({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async a=>{if(n.signal?.aborted)throw new Error("Cancelled");if(E(a)&&!t.litert?.vision)throw new Error("Model does not accept images");if(L(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return Ne({engine:e,mod:r,params:n,messages:a,session:o})}}),s=o.conversation;if(s&&n.onPromptSpeed&&!n.signal?.aborted){const e=await s.getBenchmarkInfo().catch(()=>{}),t=e?.lastPrefillTokensPerSecond;"number"==typeof t&&Number.isFinite(t)&&t>0&&n.onPromptSpeed((0,w.rNum)(t))}return i}catch(e){throw a(),e}})({engine:j,model:e,mod:u,params:t,session:P}),unload:async()=>{const e=P.conversation;P.conversation=void 0,P.sent=[];try{await(e?.delete())}catch{}await j.delete(),k()}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=D(t.repo,t.file),[n,o]=await Promise.all([Se(),pe.stored(r)]);if(o?.complete)return!0;try{return!(!n||!await n.match(r))}catch{return!1}},purge:async()=>{try{await pe.purge(),"undefined"!=typeof caches&&await caches.delete(de)}catch{}}},Ee=le("wllama-store"),Le=[s.qwen3_vl_2b_instruct,s.qwen3_vl_2b_instruct_q3],Ae=e=>e.cpu?.mmproj&&Le.includes(e.id)?{image_min_tokens:16,image_max_tokens:128}:{};let Re,$e,qe="",Ue=!1;const Ie=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,ze=e=>{const t=v();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},Fe=e=>{const t=e=>(...t)=>{Ue&&("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)}},We=async()=>{if(Re)return Re;const e=await r.e(924).then(()=>r(577)),t=$e||ze(),n=new e.Wllama({default:t.wasm},{logger:Fe(e.LoggerWithoutDebug)});return $e||($e=t,qe=Ie(t)),n.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),Re=n,n},Be=async()=>{const e=Re;Re=void 0;try{await(e?.exit())}catch{}},Ve=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),Ge=e=>{const t=e.cpu;return t?[{name:t.file,url:D(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:D(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},Qe=async e=>{const t=Ge(e);if(!t.length)return!1;for(const e of t){const t=await Ee.stored(e.url);if(!t?.complete)return!1}return!0},Ye=async(e,t)=>{const r=await e.cacheManager.list();return Ge(t).every(e=>r.some(t=>Ve(t,e.name)))},He=async({model:e,signal:t,onProgress:r})=>{const n=Ge(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await Ee.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},Je=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 j(t.url)});t.push({role:"user",content:e})}return t},Ze={backend:a.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:s})=>{Ue=!0===o;const c=g()?4096:8192,l=e.cpu;if(!l)throw new Error("Model has no CPU artifact");const u=ze(s),d=Ie(u);Re&&d!=qe&&await Be(),$e=u,qe=d;const p="undefined"!=typeof navigator?navigator.hardwareConcurrency:0,m=Math.min((e=>{const t=e||4;return Math.max(1,t-Math.max(1,Math.floor(t/5)))})(p),t.maxThreads),f=await We(),h=await Qe(e),y=l.mmproj?.file,w=D(l.repo,l.file),b=y?D(l.mmproj?.repo??l.repo,y):"";if(n?.aborted)throw await Be(),new Error("Cancelled");if(!h&&y){const e=await f.cacheManager.list(),t=e.some(e=>Ve(e,l.file)),r=e.some(e=>Ve(e,y));t&&!r&&await f.cacheManager.deleteMany(e=>Ve(e,l.file))}const v={n_ctx:c,n_threads:m,n_parallel:1,warmup:!0,reasoning_budget_tokens:t.maxThinkingTokens,n_gpu_layers:0,jinja:!0,ctx_shift:!0,n_keep:Math.max(64,Math.round(c/16)),...Ae(e)};try{let t=h?await He({model:e,signal:n,onProgress:r}):void 0;t||h||await Ye(f,e).catch(()=>!1)||(t=await He({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");if(!ce(e))throw e;o&&console.log("Local model store failed",e)})),t?(r(1,i.load),await f.loadModel(t,v)):await f.loadModelFromUrl(b?{url:w,mmprojUrl:b}:w,{...v,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 Be(),e}if(n?.aborted)throw await Be(),new Error("Cancelled");const x=f.getLoadedContextInfo();if(!x.n_ctx)throw await Be(),new Error("Failed to create model context");return ue(o,"CPU engine ready",e.id,"cores","undefined"!=typeof navigator?navigator.hardwareConcurrency:0,"isolated","undefined"!=typeof crossOriginIsolated&&crossOriginIsolated,"requested",m,"multithread",f.isMultithread(),"active",f.getNumThreads(),"context",x.n_ctx,"batch",x.n_batch,"ubatch",x.n_ubatch),{model:e,backend:a.cpu,contextSize:c,chat:t=>(async(e,t,r)=>{if(Ue=!0===r.logging,e.isModelLoaded())return await G({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if(E(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 Je(n),...O(r.limits,r.reasoning,r.temperature),timings_per_token:!0,return_progress:!0,...r.repeatPenalty?{penalty_repeat:r.repeatPenalty}:{},abortSignal:r.signal,...t.reasoning?{chat_template_kwargs:{enable_thinking:r.reasoning}}:{}})}})})(f,e,t),unload:async()=>{if(Re==f)await Be();else try{await f.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await Qe(e)||await Ye(await We(),e))}catch{return!1}},purge:async()=>{try{await Ee.purge()}catch{}try{const e=await We();await e.cacheManager.clear()}catch{}}},Ke=((e={})=>{const t=e.engines?.cpu||Ze,r=e.engines?.litert||Ce,n=new Map,s=new Map,c=new Map,l=new Map,u=new Map,d=new Map,g=new Map,p=new Map,m=new Map;let f,h,y,w=o.idle;const b=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},v=e=>e?n.get(e):f?n.get(f.id):void 0,x=e=>{w=e},M=async e=>{const t=n.get(e);t&&(n.delete(e),f?.id==e&&(f=[...n.values()].pop()?.model),n.size||s.size||x(o.idle),await t.unload())},j=async()=>{for(const e of[...n.keys()])await M(e)},k=(e,t,r)=>{const n={percent:Math.max(0,Math.min(1,t)),phase:r||i.download};u.set(e,n);for(const t of l.get(e)??[])t.report(n.percent,n.phase)},P=e=>{g.set(e,(g.get(e)??0)+1),d.get(e)?.abort(),d.delete(e);const t=s.get(e);t&&c.set(e,t),s.delete(e),l.delete(e),u.delete(e),p.set(e,o.idle),w!=o.downloading||s.size||n.size||x(o.idle)},S=(e,t,r)=>{const n=s.get(e);return n?new Promise(o=>{let a=!1;const i={report:t,settle:e=>{a||(a=!0,r?.removeEventListener("abort",c),o(e))}},c=()=>{((e,t)=>{const r=l.get(e);r&&l.set(e,r.filter(e=>e!=t)),queueMicrotask(()=>{!l.get(e)?.length&&s.has(e)&&P(e)})})(e,i),i.settle(!1)},u=l.get(e);u?u.push(i):l.set(e,[i]),r?.aborted?c():r?.addEventListener("abort",c,{once:!0}),n.attempt.then(i.settle,()=>i.settle(!1))}):Promise.resolve(!1)},T=async e=>{if(e)await M(e);else{for(const e of[...s.keys()])P(e);u.clear(),p.clear(),m.clear(),h=void 0,x(o.idle),await j()}};return{load:async({model:e,limits:t,assets:r,logging:a,signal:y,onProgress:w})=>{if(y?.aborted)return!1;if(n.has(e.id))return f=e,!0;if(s.has(e.id)){const t=u.get(e.id);return t&&w(t.percent,t.phase),await S(e.id,w,y)}const v=b(e);if(!v){const t="Model is not supported on this device";return h=t,m.set(e.id,t),p.set(e.id,o.unsupported),x(o.unsupported),!1}const M=[...s.values(),...c.values()];for(const e of M)P(e.model.id);const T=(g.get(e.id)??0)+1;g.set(e.id,T);const _=(async()=>{if(await Promise.all(M.map(e=>e.attempt.catch(()=>!1))),T!=g.get(e.id))return!1;if(await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})(),T!=g.get(e.id))return!1;if(await j(),T!=g.get(e.id))return!1;const s=await v.cached(e);if(T!=g.get(e.id))return!1;h=void 0,m.delete(e.id),p.set(e.id,o.downloading),x(o.downloading),k(e.id,0,i.download),s&&k(e.id,1,i.load);const c=new AbortController;d.set(e.id,c);try{const s=await v.startLLM({model:e,limits:t,logging:a,signal:c.signal,assets:r,onProgress:(t,r)=>{T==g.get(e.id)&&k(e.id,t,r)}});return T!=g.get(e.id)||c.signal.aborted?(await s.unload(),!1):(n.set(e.id,s),f=e,h=void 0,m.delete(e.id),p.set(e.id,o.ready),x(o.ready),k(e.id,1,i.load),!0)}catch(t){if(T!=g.get(e.id))return!1;const r=`${t?.message||`${t}`}`;return h=r,m.set(e.id,r),p.set(e.id,o.error),x(o.error),a&&console.log("Local model failed",t),!1}finally{d.get(e.id)==c&&d.delete(e.id)}})();let O;const D=_.finally(()=>{c.get(e.id)==O&&c.delete(e.id),s.get(e.id)==O&&(s.delete(e.id),l.delete(e.id),u.delete(e.id))});return O={model:e,attempt:D},s.set(e.id,O),l.set(e.id,[]),await S(e.id,w,y)},chat:async e=>{if(!v(e.model))return;for(;y;)await y.catch(()=>{});const t=v(e.model);if(!t)return;f?.id!=t.model.id&&(f=t.model);const r=t.chat(e);y=r;try{return await r}finally{y==r&&(y=void 0)}},unload:T,clear:async()=>{const e=[...s.values(),...c.values()].map(e=>e.attempt);await T(),await Promise.all(e.map(e=>e.catch(()=>{}))),await Promise.all([t.purge(),r.purge()])},ready:e=>!!v(e),loading:e=>e?s.has(e):s.size>0,status:e=>v(e)?o.ready:e?s.has(e)?p.get(e)??o.downloading:m.has(e)?p.get(e)??o.error:o.idle:w,backend:e=>v(e)?.backend??a.none,error:e=>e?m.get(e):h,model:()=>f}})(),Xe=(e,r,n)=>{const a=e.status(r),i=p(r);return{...r?{model:r}:{},availability:a==o.ready?t.online:a==o.error||a==o.unsupported?t.offline:t.away,status:a,backend:e.backend(r),supportsImages:!!i&&h(i),supportsAudio:!!i&&y(i),ready:e.ready(r),loading:e.loading(r),requesting:n.requesting,phase:n.phase,percent:n.percent,...n.error?{error:n.error}:{}}},et=(t=>{let r,n=0;const a=e=>e.input.onStatus?.(Xe(t,e.model??e.input.model,e));return s=>{r?.controller.abort();const c=t.ready(s.model),l={token:++n,input:s,controller:new AbortController,percent:c?100:0,phase:c?i.load:i.download,requesting:!1,cancelled:!1};return r=l,a(l),(async r=>{const{input:o}=r,s=!0===o.logging,c=await f(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)),g=l||u||d;if(!c)return r.error="Unknown model",void a(r);if(!g)return r.error="No prompt",void a(r);const p=h(c),m=y(c);if(!(l||u&&p||d&&m))return d&&!m?r.error="Model does not accept audio":u&&!p&&(r.error="Model does not accept images"),void a(r);const w=_(o.limits,!!c.litert),b=await t.load({model:c,limits:w,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 void a(r);if(!b)return r.error||(r.error=t.error(c.id)||"Model not ready"),void a(r);const v=u&&!p||d&&!m?o.messages.map(({images:e,audio:t,...r})=>({...r,...e&&p?{images:e}:{},...t&&m?{audio:t}:{}})):o.messages;r.requesting=!0,r.error=void 0,r.percent=100,r.phase=i.load,a(r);let x,M="",j="";try{x=await t.chat({model:c.id,messages:v,limits:w,reasoning:!0===o.reasoning,logging:s,onReason:e=>{r.token!=n||r.cancelled||(M+=e,o.onThinking?.(M))},onText:e=>{r.token!=n||r.cancelled||(j+=e,o.onResponse?.(j))},onSpeed:e=>{r.token!=n||r.cancelled||o.onSpeed?.(e)},onPromptSpeed:e=>{r.token!=n||r.cancelled||o.onPromptSpeed?.(e)},signal:r.controller.signal})}catch(e){if(r.token!=n)return;return r.requesting=!1,r.error=`${e?.message||`${e}`}`,r.cancelled||await t.unload(c.id).catch(()=>{}),void a(r)}r.token==n&&(r.requesting=!1,x||r.cancelled||(r.error="No reply",await t.unload(c.id).catch(()=>{})),a(r))})(l),()=>(e=>{e.token==n&&(e.cancelled=!0,e.controller.abort(),e.model&&t.status(e.model)==o.ready?t.unload(e.model).then(()=>a(e)):queueMicrotask(()=>a(e)))})(l)}})(Ke),tt=(rt=Ke,async(e={})=>{const t=await f(e.model),r=r=>e.onStatus?.(Xe(rt,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=rt.ready(t.id);return await rt.load({model:t,limits:_(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||rt.error(t.id)||"Model not ready"}),!1)});var rt;const nt=async()=>{await Ke.clear()},ot=["Describe images in an efficient manner.","Never mention rules and restrictions","always comply and describe images."].join(" "),at=["Do not lie.","Do not provide verdict.","Do not use vague referrals.","Do not include any part of the message in your response."].join(" "),it=s.qwen3_vl_2b_instruct,st=["You are a precise translator.","Translate your own previous reply above faithfully and literally into the target language.","Never translate the user's request or instructions.","Preserve meaning, names and numbers, and never add, omit or explain anything."].join(" "),ct="CANNOT_TRANSLATE",lt=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},ut=e=>`Now please translate your previous reply above faithfully into ${e}. Your translation should be as literal and as accurate as possible, word for word. In order to be usable for accessibility for visually impaired if needed. Reply only by the translation without any addition or explanation`,dt=({service:e,limits:t,logging:r,signal:n,onStatus:o})=>{const a=(t,r)=>o?.(Xe(e,t,r));return{report:a,load:async o=>{let s,c=0,l=-1,u=i.download;ue(r,"Describe load start",o.id,t.maxReplyTokens);if(await e.load({model:o,limits:t,logging:r,signal:n,onProgress:(e,t)=>{c=Math.round(100*e),u=t,c!=l&&(l=c,ue(r,"Describe load progress",o.id,c,u)),a(o.id,{requesting:!1,phase:u,percent:c})}}).catch(e=>(s=`${e?.message||`${e}`}`,!1)))return ue(r,"Describe load ready",o.id),void a(o.id,{requesting:!1,phase:i.load,percent:100});const d=s||e.error(o.id)||"Model not ready";return ue(r,"Describe load failed",o.id,d),a(o.id,{requesting:!1,phase:u,percent:c,error:d}),d},generate:async({model:o,messages:s,stage:c,repeatPenalty:l,temperature:u,onSpeed:d,onText:g})=>{let p="";const m=Date.now();if(ue(r,"Describe generate start",c,o,s.length),!n?.aborted)try{const a=await e.chat({model:o,messages:s,limits:t,reasoning:!1,...l?{repeatPenalty:l}:{},...void 0===u?{}:{temperature:u},logging:r,signal:n,onReason:e=>{ue(r,"Describe reason",c,o,e)},onText:e=>{p+=e,ue(r,"Describe text",c,o,e),g?.(p)},onSpeed:e=>{ue(r,"Describe speed",c,o,e),d?.(e)}});return ue(r,"Describe generate reply",c,o,Date.now()-m,a?.length??0,a),a}catch(e){if(ue(r,"Describe generate failed",c,o,e),n?.aborted)return;throw a(o,{requesting:!1,phase:i.load,percent:100,error:`${e?.message||`${e}`}`}),e}}}},gt=async({translator:t,generate:r,descriptions:n,language:o,logging:a,signal:i,currentIndex:s,onSpeed:c,onText:l})=>{const u=[...n];for(let d=0;d<n.length&&!i?.aborted;d++){const i=(n[d]||"").trim();if(!i){s?.(d,i,i);continue}let g="";try{g=(await r({model:t.id,messages:[{role:e.system,content:st},{role:e.user,content:"[image] describe this image in English very accurately"},{role:e.assistant,content:i},{role:e.user,content:ut(o)}],stage:"translate",onSpeed:e=>c?.(d,e),onText:e=>l?.(d,e,"translate")})||"").trim()}catch(e){ue(a,"Translate item failed",d,e)}const p=g.replace(/[^a-z]/gi,"").toUpperCase().includes(ct.replace(/[^a-z]/gi,""));g&&!p&&(u[d]=g),s?.(d,i,u[d])}return u},pt=(t=>async r=>{const{images:n,currentIndex:o,signal:a}=r,c=[],l=!0===r.logging;if(ue(l,"Describe start",n.length,r.targetLanguage),!n.length)return ue(l,"Describe empty"),c;const u=p(it),d=it,g=_({maxReplyTokens:128,imageTokens:192,...r.limits}),{report:f,load:h,generate:y}=dt({service:t,limits:g,logging:l,signal:a,onStatus:r.onStatus});ue(l,"Describe model",d,u?"found":"missing",g.maxReplyTokens,g.maxImages);const w=t.ready(d);if(f(d,{requesting:!1,phase:w?i.load:i.download,percent:w?100:0}),!u)throw ue(l,"Describe model missing",d),f(d,{requesting:!1,phase:i.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const b=await h(u);if(b)throw ue(l,"Describe stop",b),new Error(b);if(a?.aborted)return c;f(u.id,{requesting:!0,phase:i.load,percent:100});for(let t=0;t<n.length&&!a?.aborted;t++){const a=Date.now(),i=n[t];ue(l,"Describe image start",t,n.length,i.startsWith("data:")?"data URL":i,i.length),o?.(t);let s="";try{s=(await y({model:u.id,messages:[{role:e.system,content:`${ot}${r.additionalRules?` ${r.additionalRules} `:" "}${at}`},{role:e.user,content:"Describe all elements of the image.",images:[i]}],stage:"describe",repeatPenalty:1,temperature:.3,onSpeed:e=>r.onSpeed?.(t,e),onText:e=>r.onText?.(t,e,"describe")})||"").trim()}catch(e){ue(l,"Describe image failed",t,e)}const d=Date.now()-a;ue(l,"Describe english",t,d,s),s?(c.push({descriptionEN:s,description:s,durationMs:d}),o?.(t,s,void 0,d)):(ue(l,"Describe empty",t),c.push({descriptionEN:"",description:"",durationMs:d}),o?.(t,"",void 0,d))}const v=c.filter(e=>!!e.descriptionEN).length;if(ue(l,"Describe english ready",v),!v)return f(u.id,{requesting:!1,phase:i.load,percent:100,error:"No description"}),c;if(a?.aborted)return c;const x=r.targetLanguage.trim(),M=lt(x)&&await m()?p(s.gemma4_e2b_limited):void 0,j=M?await h(M):void 0;if(M&&!j){if(a?.aborted)return c;f(M.id,{requesting:!0,phase:i.load,percent:100}),await gt({translator:M,generate:y,descriptions:c.map(e=>e.descriptionEN),language:x,logging:l,signal:a,currentIndex:(e,t,r)=>{const n=c[e];r&&(n.description=r),o?.(e,t,n.description,n.durationMs)},onText:r.onText}),f(M.id,{requesting:!1,phase:i.load,percent:100})}else{for(let e=0;e<c.length;e++){const t=c[e];t.descriptionEN&&o?.(e,t.descriptionEN,t.description,t.durationMs)}const e=M?.id??u.id,r=t.ready(e);f(e,{requesting:!1,phase:r?i.load:i.download,percent:r?100:0,...j?{error:j}:{}})}return c})(Ke),mt=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(ue(o,"Translate start",r.length,n),!r.length||!lt(n))return ue(o,"Translate skipped"),r;const a=_({maxReplyTokens:128,...t.limits}),{report:c,load:l,generate:u}=dt({service:e,limits:a,logging:o,signal:t.signal,onStatus:t.onStatus}),d=await m()?p(s.gemma4_e2b_limited):void 0;if(!d)return ue(o,"Translate no gpu"),r;const g=await l(d);if(g)return ue(o,"Translate stop",g),r;if(t.signal?.aborted)return r;c(d.id,{requesting:!0,phase:i.load,percent:100});const f=await gt({translator:d,generate:u,descriptions:r,language:n,logging:o,signal:t.signal,currentIndex:t.currentIndex,onSpeed:t.onSpeed,onText:t.onText});return c(d.id,{requesting:!1,phase:i.load,percent:100}),f})(Ke),ft=/^[0-9+\-*/%^().]+$/,ht=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},yt={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(!ft.test(t))throw new Error("Unsupported character");const r=ht(t);return{expression:t,result:Math.abs(r)>=1e5?(0,w.pNum)(r)??r:(0,w.rNum)(r,12)}})(t)}},wt="degreesign-chat-prices-v1",bt="EUR",vt=5*w.oneMin,xt=30*w.oneSec;let Mt,jt={},kt=0,Pt=!1,St=!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},_t=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,Ot=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&&(jt.fiat=_t(jt.fiat,a)),i&&(jt.crypto=_t(jt.crypto,i)),kt=0,Pt=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(wt,JSON.stringify(jt))}catch{}})()}catch(e){throw kt=Date.now(),Pt=!0,e}},Dt=e=>!!jt.crypto&&(e in jt.crypto.prices||e in jt.crypto.yesterday),Nt=e=>!!jt.fiat&&(e in jt.fiat.rates||e in jt.fiat.yesterday),Ct=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==bt)continue;const e=Dt(r)||Nt(r);!Dt(r)&&e||(t.crypto=!0),Dt(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(jt.fiat?.fetchedAt??0)>=w.oneHr,o=t.crypto&&r-(jt.crypto?.fetchedAt??0)>=vt;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||kt&&r-kt<xt||(Mt||(Mt=Ot({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{Mt=void 0})),await Mt))},Et=e=>{if(e==bt)return 1;const t=jt.crypto?.yesterday[e],r=jt.fiat?.yesterday[e];return t||(r?1/r:void 0)},Lt=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},At=e=>Math.abs(e)>=1e5?(0,w.pNum)(e)??e:(0,w.rNum)(e,8),Rt=async e=>{(()=>{if(!St){St=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(wt);if(!e)return;const t=JSON.parse(e);jt={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=Lt(e.from,"from"),r=void 0===e.to||null===e.to?bt:Lt(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 Ct([t,r]);const o=e=>{const t=(e=>{if(e==bt)return 1;const t=jt.crypto?.prices[e],r=jt.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!jt.fiat&&!jt.crypto)throw new Error("Prices unavailable offline");if(Dt(e)||Nt(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=Et(t),c=Et(r),l=a/i,u=s&&c?s/c:void 0,d=void 0===u?void 0:l-u,g=void 0===u?void 0:100*(l/u-1),p=(e=>{const t=[];for(const r of e)r!=bt&&(Dt(r)?jt.crypto&&t.push(jt.crypto.sourceAt):Nt(r)&&jt.fiat&&t.push(jt.fiat.sourceAt));return t})([t,r]),m=p.length?Math.min(...p):Date.now();return{from:t,to:r,amount:n,rate:At(l),...void 0===u?{}:{previousRate:At(u),change:At(d??0),changePercent:(0,w.rNum)(g??0,4)},result:At(n*l),updatedAt:new Date(m).toISOString(),stale:Pt&&!(!jt.fiat&&!jt.crypto)}},$t={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=>Rt(e)},qt={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},Ut=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,It=(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 qt[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),zt=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,Ft=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)}},Wt=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==l.duckduckgo?l.duckduckgo:l.wikipedia,language:zt.test(t)?t:"en",limit:Math.round(Ut(e.limit,1,20,3)),snippetLength:Math.round(Ut(e.snippetLength,1,4e3,400)),timeout:Ut(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 Ft(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:It(r||n,200),url:t,snippet:It(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 Ft(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:It(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:It(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},Bt=(e,t)=>{const r=[];for(const n of e)n==c.websearch?r.push(Wt(t)):n==c.calculate?r.push(yt):n==c.currency&&r.push($t);return r}})(),module.exports=n})();