@degreesign/chat 1.5.1 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -549,6 +549,11 @@ reuse the loaded runtime. One model stays resident, and a new model replaces it.
|
|
|
549
549
|
An interrupted download keeps every part it committed and resumes from the last
|
|
550
550
|
one on the next attempt, including after a reload.
|
|
551
551
|
|
|
552
|
+
When the storage is full, the CPU engine reads the parts already on disk and
|
|
553
|
+
streams only the missing tail over HTTP, so a nearly complete download still
|
|
554
|
+
loads without writing a second copy. The WebGPU engine streams the whole file
|
|
555
|
+
in that case.
|
|
556
|
+
|
|
552
557
|
Qwen3-VL 2B downloads a vision projector of about 445 MB with the model, so its
|
|
553
558
|
total download is about 1.5 GB. It runs on the CPU engine, with a 4096 token
|
|
554
559
|
context on a phone and 8192 on a desktop. Its projector uses the same CPU thread
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see chat.min.mjs.LICENSE.txt */
|
|
2
|
-
var e={155(e){e.exports=(()=>{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"],n=({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""}},o=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""}};t.idShuffle=async({data:e,password:t})=>4==t?.length?n({data:e,password:t}):await o({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}}}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var a=t[n]={exports:{}};return e[n](a,a.exports,r),a.exports}var n={};return(()=>{var e=n;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=r(246);Object.defineProperty(e,"cacheCheck",{enumerable:!0,get:function(){return t.cacheCheck}}),Object.defineProperty(e,"delayCode",{enumerable:!0,get:function(){return t.delayCode}});const o=r(830);Object.defineProperty(e,"sumArr",{enumerable:!0,get:function(){return o.sumArr}}),Object.defineProperty(e,"minVl",{enumerable:!0,get:function(){return o.minVl}}),Object.defineProperty(e,"maxVl",{enumerable:!0,get:function(){return o.maxVl}}),Object.defineProperty(e,"getMax",{enumerable:!0,get:function(){return o.getMax}}),Object.defineProperty(e,"getMean",{enumerable:!0,get:function(){return o.getMean}}),Object.defineProperty(e,"getSum",{enumerable:!0,get:function(){return o.getSum}}),Object.defineProperty(e,"forecastNext",{enumerable:!0,get:function(){return o.forecastNext}}),Object.defineProperty(e,"forecastNextTotal",{enumerable:!0,get:function(){return o.forecastNextTotal}}),Object.defineProperty(e,"squeezeArray",{enumerable:!0,get:function(){return o.squeezeArray}}),Object.defineProperty(e,"compareArrays",{enumerable:!0,get:function(){return o.compareArrays}}),Object.defineProperty(e,"phaseDifference",{enumerable:!0,get:function(){return o.phaseDifference}});const a=r(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=r(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=r(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=r(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}})})(),n})()}};const t={};function r(n){const o=t[n];if(void 0!==o)return o.exports;const a=t[n]={exports:{}};return e[n].call(a.exports,a,a.exports,r),a.exports}var n,o,a,i,s,c,l,u,d;let g;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.j(e,t),Promise.all(t)},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={520:()=>import("./engine-litert.min.mjs"),924:()=>import("./engine-wllama.min.mjs")},t={792:0},n=e=>{let{__webpack_esm_ids__:n,__webpack_esm_modules__:o,__webpack_esm_runtime__:a}=e;var i,s,c=0;for(i in o)r.o(o,i)&&(r.m[i]=o[i]);for(a&&a(r);c<n.length;c++)s=n[c],r.o(t,s)&&t[s]&&t[s][0](),t[s]=0};r.f.j=(o,a)=>{let i=r.o(t,o)?t[o]:void 0;if(0!==i)if(i)a.push(i[1]);else{let r=e[o]().then(n,e=>{throw 0!==t[o]&&(t[o]=void 0),e});r=Promise.race([r,new Promise(e=>i=t[o]=[e])]),a.push(i[1]=r)}}})(),function(e){e.system="system",e.user="user",e.assistant="assistant"}(n||(n={})),function(e){e[e.online=0]="online",e[e.away=1]="away",e[e.offline=2]="offline"}(o||(o={})),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"}(a||(a={})),function(e){e.cpu="cpu",e.gpu="gpu",e.none="none"}(i||(i={})),function(e){e.download="download",e.load="load"}(s||(s={})),function(e){e.quota="QuotaExceededError",e.notAllowed="NotAllowedError",e.notSupported="NotSupportedError",e.invalidState="InvalidStateError",e.typeMismatch="TypeMismatchError",e.security="SecurityError"}(c||(c={})),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"}(l||(l={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(u||(u={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(d||(d={}));const m=[{id:l.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:l.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:l.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:l.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}}],p=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},f=e=>e?m.find(t=>t.id==e):void 0,h=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)}},y=async e=>f(e??await(async()=>(g||(g=(async()=>await h()?l.gemma4_e2b_limited:l.qwen3_vl_2b)()),await g))()),w=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,b=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio;var v=r(155);const x=new URL("./../assets/wllama/wllama.wasm",import.meta.url).href,M=new URL("./../assets/wllama/compat/wllama.wasm",import.meta.url).href,j=new URL("./../assets/wllama/compat/wllama.js",import.meta.url).href,k=new URL("./../assets/litert/litertlm_wasm_internal.js",import.meta.url).href,_=(new URL("./../assets/litert/litertlm_wasm_internal.wasm",import.meta.url).href,{width:384,height:384}),S=async e=>{if(!e.startsWith("data:"))return await(await fetch(e)).arrayBuffer();const t=e.indexOf(","),r=t>=0?e.slice(0,t):"";if(t<0)throw new Error("Invalid image data");if(!r.includes(";base64"))return await(await fetch(e)).arrayBuffer();const n=atob(e.slice(t+1)),o=new Uint8Array(n.length);for(let e=0;e<n.length;e++)o[e]=n.charCodeAt(e);return o.buffer},P=async(e,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}},T={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,imageTokens:128,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:32,gpuShare:.5},O=(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)},D=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,N=(e={},t=!1)=>{const r=T;return{maxReplyTokens:D(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:D(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:D(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:D(e.maxImages,r.maxImages,0),imageTokens:D(e.imageTokens,r.imageTokens,1),maxAudio:D(e.maxAudio,r.maxAudio,0),maxContentLength:D(e.maxContentLength,r.maxContentLength,1),promptCharBudget:D(e.promptCharBudget,r.promptCharBudget,1),maxThreads:D(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}},C=(e,t,r=.7)=>({stream:!0,temperature:r,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),E=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,L=e=>Number(e.headers.get("content-length"))||0,A=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),R=e=>A(e,"image"),$=e=>A(e,"audio"),q=["<|channel>thought\n","<|channel>thought","..."],U=["<channel|>","..."],I=(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,z=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,F=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...z(e),{type:"text",text:"\n"},...z(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r},W=p()?3e6:3e5,V=Math.max(W,84e4);class B extends Error{}const G=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new B(r)),t)})])}finally{n&&clearTimeout(n)}},Q=e=>{try{Promise.resolve(e.next?.()).catch(()=>{}).finally(()=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}})}catch{}},Y=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,onPromptSpeed:a,promptTokens:i,start:s,stopped:c,firstTimeoutMs:l=W,idleTimeoutMs:u=3e4,onStall:d})=>{let g,m="",p="",f="",h=!1,y=!1,w=!1,b=0,x=0,M=0,j=0,k=0,_=0,S=0;const P=e=>{!Number.isFinite(e)||e<=0||(b=(0,v.rNum)(e),a?.(b))},T=()=>{if(h||w||!i)return;const e=performance.now()-k;e>0&&P(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;w=!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,P(n))};a&&i&&(g=setInterval(T,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,U);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,U);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,q);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,q);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{p+=e,r(e)},e=>{m+=e,n(e)});try{k=performance.now();const e=s();Promise.resolve(e).catch(()=>{});const n=(await G(e,l,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(c()){Q(n);break}let e;try{const t=n.next();Promise.resolve(t).catch(()=>{}),e=await G(t,h?u:l,h?"Model stopped responding":"Model did not reply")}catch(e){if(e instanceof B&&(m||p)){d?.(),Q(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:"",w=!!g||!!s?.content||!!i?.finish_reason,x=a?.timings?.prompt_per_second;if(w){if(h||(D(a?.prompt_progress),b||T(),h=!0,O()),!y&&"number"==typeof x&&Number.isFinite(x)&&x>0&&(y=!0,P(x)),i?.finish_reason&&(f=i.finish_reason),g&&(p+=g,r(g)),s?.content&&N.feed(s.content),g||s?.content){const e=performance.now();_||(S=e),_+=1,_>1&&e>S&&o?.((0,v.rNum)(1e3*_/(e-S)))}}else D(a?.prompt_progress),!y&&"number"==typeof x&&Number.isFinite(x)&&x>0&&(y=!0,P(x),O())}N.flush()}catch(e){if(t&&console.log("Local chat failed",e),e instanceof B&&!c())throw e}finally{O()}const C=c()?void 0:m||void 0;return t&&(console.log("Local chat reply",e.id,C?"****":""),console.log("Local chat finish",e.id,f||"none",m.length,p.length)),C},H=async({model:e,params:t,start:r,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 P(n.url,t,r)}:n);n.push({role:"user",content:e})}return n})(((e,t=T)=>{const r=t.maxContentLength,o=e.filter(e=>"string"==typeof e.content&&!!e.content.trim()||!(e.role!=n.user||!e.images?.length&&!e.audio?.length)),a=[],i=[];let s=0,c=t.maxImages,l=t.maxAudio;for(let e=o.length-1;e>=0;e--){const u=o[e],d=("string"==typeof u.content?u.content:"").slice(0,r),g=u.role==n.user?(u.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,c)):[],m=u.role==n.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>t.promptCharBudget)break;s+=d.length,c-=g.length,l-=m.length,u.role==n.system?a.unshift(d):u.role==n.assistant?i.unshift({role:"assistant",content:d}):i.unshift({role:"user",content:I(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=F(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})(t.messages,t.limits),e.litert?_:void 0,t.limits.imageTokens);return t.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}:{}})))})(e,i),await Y({model:e,logging:t.logging,onReason:t.onReason,onText:t.onText,onSpeed:t.onSpeed,onPromptSpeed:t.onPromptSpeed,promptTokens:O(i,t.limits.imageTokens),start:()=>r(i),stopped:o,onStall:a,firstTimeoutMs:R(i)?V:W})};const J=33554432,Z=new Set([c.quota,c.notAllowed,c.notSupported,c.invalidState,c.typeMismatch,c.security]),K=new Map,X=new Set;let ee=!1;const te=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}`},re=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},ne=async()=>{if(!ee)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else ee=!0},oe=async()=>{try{if("undefined"==typeof navigator||!navigator.storage?.estimate)return;const e=await navigator.storage.estimate();return"number"==typeof e.quota&&e.quota>0?e.quota-(e.usage||0):void 0}catch{return}},ae=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},ie=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}},se=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{}},ce=async function*(e){for await(const t of e)yield t},le=async e=>{try{for await(const[t,r]of ce(e))"file"==r.kind&&re(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},ue=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await ie(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}},de=async(e,t)=>{const r=await ae(e,t);if(r){const e=await(async e=>await ie(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of ce(e)){const e=re(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 ue(e,t)},ge=(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:L(e)||t.total,etag:a||t.etag}},me=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:i})=>{let c,l,u=t,d=0,g=r;const m=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(u),{create:!0});l=await t.createWritable(),d=0},p=async()=>{const e=l;l=void 0,e&&await e.close()};try{const e=o.getReader();for(c=e;;){const{done:r,value:o}=await e.read();if(r)break;i();let c=0;for(g&&(c=Math.min(g,o.byteLength),g-=c);c<o.byteLength;){l||await m();const e=Math.min(J-d,o.byteLength-c);await l.write({type:"write",position:d,data:o.subarray(c,c+e)}),c+=e,d+=e,u+=e,d==J&&await p()}u>t&&a(n?u/n:0,s.download)}await p()}catch(e){throw await p().catch(()=>{}),await(c?.cancel().catch(()=>{})),e}return u},pe=e=>e?.name==c.quota,fe=e=>{const t=async()=>{const t=await ne();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await de(r,te(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{if(X.has(r))throw new DOMException("Storage is full",c.quota);const a=`${e}|${r}`,i=K.get(a);if(i)return await i;const l=await t();if(!l)return;const u=(async(e,t,r,n)=>{const o=te(t),a=await ue(e,o);if(a?.complete)return a;let i=await ae(e,o);i||(await e.removeEntry(o).catch(()=>{}),await e.removeEntry(`${o}.json`).catch(()=>{}),i=await e.getDirectoryHandle(o,{create:!0}));let l=0,u=0,d=!1;for(;;){if(r?.aborted)throw new Error("Cancelled");const a=await de(e,o);if(a?.complete)return a;const g=a?.size??0,m=a?.total||0,p=a?.etag||"";if(g>l)l=g,u=0;else if(++u>4)throw new Error("Model download failed");g&&m&&n(g/m,s.download);const f=m?Math.min(g+J,m)-1:g+J-1,h=new AbortController,y=()=>h.abort(),w={size:g,total:m,etag:p};let b,v=setTimeout(y,3e4);r?.addEventListener("abort",y,{once:!0});try{if(b=await fetch(t,{signal:h.signal,headers:{Range:`bytes=${g}-${f}`}}),416==b.status){if(await(b.body?.cancel().catch(()=>{})),m&&g>=m){await se(i,{total:m,etag:p,complete:!0});continue}await le(i),await se(i,{total:0,etag:"",complete:!1});continue}if(!b.ok||!b.body)throw await(b.body?.cancel().catch(()=>{})),new Error("Model download failed");const r=ge(b,w);if(!r){await b.body.cancel().catch(()=>{}),await le(i),await se(i,{total:0,etag:"",complete:!1});continue}await se(i,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?g:0,s=r.start+a;if(!d&&r.total>s){d=!0;const e=await oe();if(null!=e&&e<r.total-s)throw await b.body.cancel().catch(()=>{}),new DOMException("Storage is full",c.quota)}const l=await me({dir:i,start:s,skip:a,total:r.total,body:b.body,onProgress:n,onChunk:()=>{clearTimeout(v),v=setTimeout(y,3e4)}});if(!r.total){await se(i,{total:l,etag:r.etag,complete:!0});const t=await de(e,o);if(t)return t}}catch(e){if(r?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&Z.has(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*u))}finally{clearTimeout(v),r?.removeEventListener("abort",y)}}})(l,r,n,o).catch(e=>{throw pe(e)&&X.add(r),e}).finally(()=>{K.delete(a)});return K.set(a,u),await u},remove:async e=>{X.delete(e);const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,te(e))},purge:async()=>{X.clear();const t=await ne();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},he=(e,...t)=>{!0===e&&console.log(...t)},ye="litertlm-models",we=.5,be=fe("litert-store"),ve={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 xe=!1,Me=0;const je=new WeakSet;let ke=we,_e=!1,Se=0;const Pe=(...e)=>{xe&&console.log(...e)},Te=(...e)=>{xe&&console.error(...e)},Oe=e=>e.replace(/<\|channel>thought\n?[\s\S]*?<channel\|>/g,"").replace(/<\|channel>thought[\s\S]*$/,"").trim(),De=async()=>{const e=performance.now(),t=e-Se;if(Se=e,!_e)return;const r=Math.round(((e,t=.5)=>Math.min(500,Math.max(0,e*(1/t-1))))(t,ke));r<1||(await new Promise(e=>setTimeout(e,r)),Se=performance.now())},Ne=(e=.5)=>{ke=e>0?e:we,_e=!0,Se=performance.now()},Ce=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(ye)}catch{return}},Ee=new Map,Le=(e,t,r)=>{let n=0;return e.pipeThrough(new TransformStream({transform:(e,o)=>{n+=e.byteLength,r(t?n/t:0,s.download),o.enqueue(e)}}))},Ae=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 S(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},Re=(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&&Oe(e.content)==Oe(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(Oe(n.text)!=Oe(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=C(r.limits,r.reasoning,r.temperature);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await Ae([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&&!Re(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(!Re(o[i+e],a[e]))return!1;return!0})(o.sent,s);let d;if(l&&u&&o.conversation)he(xe,"LiteRT conversation reused",o.sent.length),d=o.conversation;else{const n=await Ae(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}),he(xe,"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&&(he(xe,"LiteRT first chunk",Math.round(a)),Ne(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}]})}m=!0}finally{_e=!1,r.signal?.removeEventListener("abort",h),m&&f?o.sent.push({role:"assistant",content:f}):(o.conversation=void 0,o.sent=[])}},qe={backend:i.gpu,startLLM:async({model:e,limits:t,onProgress:n,signal:o,logging:a})=>{xe=!0===a;const c=e.litert;if(!c)throw new Error("Model has no LiteRT artifact");const l=p()?16384:32768,u=await r.e(520).then(()=>r(507)),d=globalThis,g=d.Module;d.Module={print:Pe,printErr:Te};try{await u.getOrLoadGlobalLiteRtLm(k)}finally{d.Module=g}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(!je.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:De});je.add(h),je.add(e),f.preinitializedWebGPUDevice=e}const y=E(c.repo,c.file),w=await Ce();let b,x=!1;const M=w?await w.match(y):void 0;if(M?.body)b=M.body;else{const e=await be.stored(y);e?.complete&&(b=e.file.stream())}if(!b){const e=await be.download({url:y,signal:o,onProgress:n}).catch(e=>{if(o?.aborted)throw new Error("Cancelled");a&&console.log("Local model store failed",e),x=pe(e)});e&&(b=e.file.stream())}if(!b&&w&&!x)try{await(async(e,t,r,n)=>{const o=Ee.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=L(o),i=Le(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{Ee.delete(e)});return Ee.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");a&&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 Le(n.body,L(n),r)})(y,o,n)),o?.aborted)throw new Error("Cancelled");n(1,s.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:ve},...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}));Me+=1;const _=()=>{Me=Math.max(0,Me-1),Me||(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(),he(xe,"LiteRT conversation warm-up",Math.round(performance.now()-e))}catch(e){he(xe,"LiteRT conversation warm-up failed",e)}if(o?.aborted)throw await j.delete(),_(),new Error("Cancelled");const S={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:i.gpu,contextSize:l,chat:t=>(async({engine:e,model:t,mod:r,params:n,session:o})=>{xe=!0===n.logging;const a=()=>{try{o.conversation?.cancel()}catch{}o.conversation=void 0,o.sent=[]};try{const i=await H({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async a=>{if(n.signal?.aborted)throw new Error("Cancelled");if(R(a)&&!t.litert?.vision)throw new Error("Model does not accept images");if($(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return $e({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,v.rNum)(t))}return i}catch(e){throw a(),e}})({engine:j,model:e,mod:u,params:t,session:S}),unload:async()=>{const e=S.conversation;S.conversation=void 0,S.sent=[];try{await(e?.delete())}catch{}await j.delete(),_()}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=E(t.repo,t.file),[n,o]=await Promise.all([Ce(),be.stored(r)]);if(o?.complete)return!0;try{return!(!n||!await n.match(r))}catch{return!1}},purge:async()=>{try{await be.purge(),"undefined"!=typeof caches&&await caches.delete(ye)}catch{}}},Ue=fe("wllama-store"),Ie=[l.qwen3_vl_2b_instruct,l.qwen3_vl_2b_instruct_q3],ze=e=>e.cpu?.mmproj&&Ie.includes(e.id)?{image_min_tokens:16,image_max_tokens:128}:{};let Fe,We,Ve="",Be=!1;const Ge=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Qe=e=>{const t={wasm:x,compatWasm:M,compatWorker:j};return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},Ye=e=>{const t=e=>(...t)=>{Be&&("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)}},He=async()=>{if(Fe)return Fe;const e=await r.e(924).then(()=>r(577)),t=We||Qe(),n=new e.Wllama({default:t.wasm},{logger:Ye(e.LoggerWithoutDebug)});return We||(We=t,Ve=Ge(t)),n.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),Fe=n,n},Je=async()=>{const e=Fe;Fe=void 0;try{await(e?.exit())}catch{}},Ze=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),Ke=e=>{const t=e.cpu;return t?[{name:t.file,url:E(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:E(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},Xe=async e=>{const t=Ke(e);if(!t.length)return!1;for(const e of t){const t=await Ue.stored(e.url);if(!t?.complete)return!1}return!0},et=async(e,t)=>{const r=await e.cacheManager.list();return Ke(t).every(e=>r.some(t=>Ze(t,e.name)))},tt=async({model:e,signal:t,onProgress:r})=>{const n=Ke(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await Ue.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},rt=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 S(t.url)});t.push({role:"user",content:e})}return t},nt={backend:i.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:a})=>{Be=!0===o;const c=p()?4096:8192,l=e.cpu;if(!l)throw new Error("Model has no CPU artifact");const u=Qe(a),d=Ge(u);Fe&&d!=Ve&&await Je(),We=u,Ve=d;const g="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)))})(g),t.maxThreads),f=await He(),h=await Xe(e),y=l.mmproj?.file,w=E(l.repo,l.file),b=y?E(l.mmproj?.repo??l.repo,y):"";if(n?.aborted)throw await Je(),new Error("Cancelled");if(!h&&y){const e=await f.cacheManager.list(),t=e.some(e=>Ze(e,l.file)),r=e.some(e=>Ze(e,y));t&&!r&&await f.cacheManager.deleteMany(e=>Ze(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)),...ze(e)};let x=!1;try{let t=h?await tt({model:e,signal:n,onProgress:r}):void 0;t||h||await et(f,e).catch(()=>!1)||(t=await tt({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");o&&console.log("Local model store failed",e),x=pe(e)})),t?(r(1,s.load),await f.loadModel(t,v)):await f.loadModelFromUrl(b?{url:w,mmprojUrl:b}:w,{...v,useCache:!x,signal:n,progressCallback:({loaded:e,total:t})=>{const n=t?e/t:0;r(n,n>=1?s.load:s.download)}})}catch(e){throw await Je(),e}if(n?.aborted)throw await Je(),new Error("Cancelled");const M=f.getLoadedContextInfo();if(!M.n_ctx)throw await Je(),new Error("Failed to create model context");return he(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",M.n_ctx,"batch",M.n_batch,"ubatch",M.n_ubatch),{model:e,backend:i.cpu,contextSize:c,chat:t=>(async(e,t,r)=>{if(Be=!0===r.logging,e.isModelLoaded())return await H({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if(R(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if($(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await rt(n),...C(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(Fe==f)await Je();else try{await f.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await Xe(e)||await et(await He(),e))}catch{return!1}},purge:async()=>{try{await Ue.purge()}catch{}try{const e=await He();await e.cacheManager.clear()}catch{}}},ot=((e={})=>{const t=e.engines?.cpu||nt,r=e.engines?.litert||qe,n=new Map,o=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=a.idle;const b=n=>{if(e.backend!=i.none)return e.backend==i.cpu?n.cpu?t:void 0:e.backend==i.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||o.size||x(a.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||s.download};u.set(e,n);for(const t of l.get(e)??[])t.report(n.percent,n.phase)},_=e=>{g.set(e,(g.get(e)??0)+1),d.get(e)?.abort(),d.delete(e);const t=o.get(e);t&&c.set(e,t),o.delete(e),l.delete(e),u.delete(e),m.set(e,a.idle),w!=a.downloading||o.size||n.size||x(a.idle)},S=(e,t,r)=>{const n=o.get(e);return n?new Promise(a=>{let i=!1;const s={report:t,settle:e=>{i||(i=!0,r?.removeEventListener("abort",c),a(e))}},c=()=>{((e,t)=>{const r=l.get(e);r&&l.set(e,r.filter(e=>e!=t)),queueMicrotask(()=>{!l.get(e)?.length&&o.has(e)&&_(e)})})(e,s),s.settle(!1)},u=l.get(e);u?u.push(s):l.set(e,[s]),r?.aborted?c():r?.addEventListener("abort",c,{once:!0}),n.attempt.then(s.settle,()=>s.settle(!1))}):Promise.resolve(!1)},P=async e=>{if(e)await M(e);else{for(const e of[...o.keys()])_(e);u.clear(),m.clear(),p.clear(),h=void 0,x(a.idle),await j()}};return{load:async({model:e,limits:t,assets:r,logging:i,signal:y,onProgress:w})=>{if(y?.aborted)return!1;if(n.has(e.id))return f=e,!0;if(o.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,p.set(e.id,t),m.set(e.id,a.unsupported),x(a.unsupported),!1}const M=[...o.values(),...c.values()];for(const e of M)_(e.model.id);const P=(g.get(e.id)??0)+1;g.set(e.id,P);const T=(async()=>{if(await Promise.all(M.map(e=>e.attempt.catch(()=>!1))),P!=g.get(e.id))return!1;if(await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})(),P!=g.get(e.id))return!1;if(await j(),P!=g.get(e.id))return!1;const o=await v.cached(e);if(P!=g.get(e.id))return!1;h=void 0,p.delete(e.id),m.set(e.id,a.downloading),x(a.downloading),k(e.id,0,s.download),o&&k(e.id,1,s.load);const c=new AbortController;d.set(e.id,c);try{const o=await v.startLLM({model:e,limits:t,logging:i,signal:c.signal,assets:r,onProgress:(t,r)=>{P==g.get(e.id)&&k(e.id,t,r)}});return P!=g.get(e.id)||c.signal.aborted?(await o.unload(),!1):(n.set(e.id,o),f=e,h=void 0,p.delete(e.id),m.set(e.id,a.ready),x(a.ready),k(e.id,1,s.load),!0)}catch(t){if(P!=g.get(e.id))return!1;const r=`${t?.message||`${t}`}`;return h=r,p.set(e.id,r),m.set(e.id,a.error),x(a.error),i&&console.log("Local model failed",t),!1}finally{d.get(e.id)==c&&d.delete(e.id)}})();let O;const D=T.finally(()=>{c.get(e.id)==O&&c.delete(e.id),o.get(e.id)==O&&(o.delete(e.id),l.delete(e.id),u.delete(e.id))});return O={model:e,attempt:D},o.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:P,clear:async()=>{const e=[...o.values(),...c.values()].map(e=>e.attempt);await P(),await Promise.all(e.map(e=>e.catch(()=>{}))),await Promise.all([t.purge(),r.purge()])},ready:e=>!!v(e),loading:e=>e?o.has(e):o.size>0,status:e=>v(e)?a.ready:e?o.has(e)?m.get(e)??a.downloading:p.has(e)?m.get(e)??a.error:a.idle:w,backend:e=>v(e)?.backend??i.none,error:e=>e?p.get(e):h,model:()=>f}})(),at=(e,t,r)=>{const n=e.status(t),i=f(t);return{...t?{model:t}:{},availability:n==a.ready?o.online:n==a.error||n==a.unsupported?o.offline:o.away,status:n,backend:e.backend(t),supportsImages:!!i&&w(i),supportsAudio:!!i&&b(i),ready:e.ready(t),loading:e.loading(t),requesting:r.requesting,phase:r.phase,percent:r.percent,...r.error?{error:r.error}:{}}},it=(e=>{let t,r=0;const o=t=>t.input.onStatus?.(at(e,t.model??t.input.model,t));return i=>{t?.controller.abort();const c=e.ready(i.model),l={token:++r,input:i,controller:new AbortController,percent:c?100:0,phase:c?s.load:s.download,requesting:!1,cancelled:!1};return t=l,o(l),(async t=>{const{input:a}=t,i=!0===a.logging,c=await y(a.model);if(t.model=c?.id,t.token!=r)return;const l=a.messages.some(e=>e.role!=n.system&&"string"==typeof e.content&&!!e.content.trim()),u=a.messages.some(e=>e.role==n.user&&!!e.images?.some(e=>"string"==typeof e&&!!e)),d=a.messages.some(e=>e.role==n.user&&!!e.audio?.some(e=>"string"==typeof e&&!!e)),g=l||u||d;if(!c)return t.error="Unknown model",void o(t);if(!g)return t.error="No prompt",void o(t);const m=w(c),p=b(c);if(!(l||u&&m||d&&p))return d&&!p?t.error="Model does not accept audio":u&&!m&&(t.error="Model does not accept images"),void o(t);const f=N(a.limits,!!c.litert),h=await e.load({model:c,limits:f,logging:i,signal:t.controller.signal,onProgress:(e,n)=>{t.token==r&&(t.percent=Math.round(100*e),t.phase=n,o(t))}}).catch(e=>(t.token==r&&(t.error=`${e?.message||`${e}`}`),!1));if(t.token!=r)return;if(t.cancelled)return void o(t);if(!h)return t.error||(t.error=e.error(c.id)||"Model not ready"),void o(t);const v=u&&!m||d&&!p?a.messages.map(({images:e,audio:t,...r})=>({...r,...e&&m?{images:e}:{},...t&&p?{audio:t}:{}})):a.messages;t.requesting=!0,t.error=void 0,t.percent=100,t.phase=s.load,o(t);let x,M="",j="";try{x=await e.chat({model:c.id,messages:v,limits:f,reasoning:!0===a.reasoning,logging:i,onReason:e=>{t.token!=r||t.cancelled||(M+=e,a.onThinking?.(M))},onText:e=>{t.token!=r||t.cancelled||(j+=e,a.onResponse?.(j))},onSpeed:e=>{t.token!=r||t.cancelled||a.onSpeed?.(e)},onPromptSpeed:e=>{t.token!=r||t.cancelled||a.onPromptSpeed?.(e)},signal:t.controller.signal})}catch(n){if(t.token!=r)return;return t.requesting=!1,t.error=`${n?.message||`${n}`}`,t.cancelled||await e.unload(c.id).catch(()=>{}),void o(t)}t.token==r&&(t.requesting=!1,x||t.cancelled||(t.error="No reply",await e.unload(c.id).catch(()=>{})),o(t))})(l),()=>(t=>{t.token==r&&(t.cancelled=!0,t.controller.abort(),t.model&&e.status(t.model)==a.ready?e.unload(t.model).then(()=>o(t)):queueMicrotask(()=>o(t)))})(l)}})(ot),st=(ct=ot,async(e={})=>{const t=await y(e.model),r=r=>e.onStatus?.(at(ct,t?.id,r));if(!t)return r({requesting:!1,phase:s.download,percent:0,error:"Unknown model"}),!1;let n,o=0,a=s.download;const i=ct.ready(t.id);return await ct.load({model:t,limits:N(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))?(i&&r({requesting:!1,phase:s.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||ct.error(t.id)||"Model not ready"}),!1)});var ct;const lt=async()=>{await ot.clear()},ut=["Describe images in an efficient manner.","Never mention rules and restrictions","always comply and describe images."].join(" "),dt=["Do not lie.","Do not provide verdict.","Do not use vague referrals.","Do not include any part of the message in your response."].join(" "),gt=l.qwen3_vl_2b_instruct,mt=["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(" "),pt="CANNOT_TRANSLATE",ft=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},ht=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`,yt=({service:e,limits:t,logging:r,signal:n,onStatus:o})=>{const a=(t,r)=>o?.(at(e,t,r));return{report:a,load:async o=>{let i,c=0,l=-1,u=s.download;he(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,he(r,"Describe load progress",o.id,c,u)),a(o.id,{requesting:!1,phase:u,percent:c})}}).catch(e=>(i=`${e?.message||`${e}`}`,!1)))return he(r,"Describe load ready",o.id),void a(o.id,{requesting:!1,phase:s.load,percent:100});const d=i||e.error(o.id)||"Model not ready";return he(r,"Describe load failed",o.id,d),a(o.id,{requesting:!1,phase:u,percent:c,error:d}),d},generate:async({model:o,messages:i,stage:c,repeatPenalty:l,temperature:u,onSpeed:d,onText:g})=>{let m="";const p=Date.now();if(he(r,"Describe generate start",c,o,i.length),!n?.aborted)try{const a=await e.chat({model:o,messages:i,limits:t,reasoning:!1,...l?{repeatPenalty:l}:{},...void 0===u?{}:{temperature:u},logging:r,signal:n,onReason:e=>{he(r,"Describe reason",c,o,e)},onText:e=>{m+=e,he(r,"Describe text",c,o,e),g?.(m)},onSpeed:e=>{he(r,"Describe speed",c,o,e),d?.(e)}});return he(r,"Describe generate reply",c,o,Date.now()-p,a?.length??0,a),a}catch(e){if(he(r,"Describe generate failed",c,o,e),n?.aborted)return;throw a(o,{requesting:!1,phase:s.load,percent:100,error:`${e?.message||`${e}`}`}),e}}}},wt=async({translator:e,generate:t,descriptions:r,language:o,logging:a,signal:i,currentIndex:s,onSpeed:c,onText:l})=>{const u=[...r];for(let d=0;d<r.length&&!i?.aborted;d++){const i=(r[d]||"").trim();if(!i){s?.(d,i,i);continue}let g="";try{g=(await t({model:e.id,messages:[{role:n.system,content:mt},{role:n.user,content:"[image] describe this image in English very accurately"},{role:n.assistant,content:i},{role:n.user,content:ht(o)}],stage:"translate",onSpeed:e=>c?.(d,e),onText:e=>l?.(d,e,"translate")})||"").trim()}catch(e){he(a,"Translate item failed",d,e)}const m=g.replace(/[^a-z]/gi,"").toUpperCase().includes(pt.replace(/[^a-z]/gi,""));g&&!m&&(u[d]=g),s?.(d,i,u[d])}return u},bt=(e=>async t=>{const{images:r,currentIndex:o,signal:a}=t,i=[],c=!0===t.logging;if(he(c,"Describe start",r.length,t.targetLanguage),!r.length)return he(c,"Describe empty"),i;const u=f(gt),d=gt,g=N({maxReplyTokens:128,imageTokens:192,...t.limits}),{report:m,load:p,generate:y}=yt({service:e,limits:g,logging:c,signal:a,onStatus:t.onStatus});he(c,"Describe model",d,u?"found":"missing",g.maxReplyTokens,g.maxImages);const w=e.ready(d);if(m(d,{requesting:!1,phase:w?s.load:s.download,percent:w?100:0}),!u)throw he(c,"Describe model missing",d),m(d,{requesting:!1,phase:s.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const b=await p(u);if(b)throw he(c,"Describe stop",b),new Error(b);if(a?.aborted)return i;m(u.id,{requesting:!0,phase:s.load,percent:100});for(let e=0;e<r.length&&!a?.aborted;e++){const a=Date.now(),s=r[e];he(c,"Describe image start",e,r.length,s.startsWith("data:")?"data URL":s,s.length),o?.(e);let l="";try{l=(await y({model:u.id,messages:[{role:n.system,content:`${ut}${t.additionalRules?` ${t.additionalRules} `:" "}${dt}`},{role:n.user,content:"Describe all elements of the image.",images:[s]}],stage:"describe",repeatPenalty:1,temperature:.3,onSpeed:r=>t.onSpeed?.(e,r),onText:r=>t.onText?.(e,r,"describe")})||"").trim()}catch(t){he(c,"Describe image failed",e,t)}const d=Date.now()-a;he(c,"Describe english",e,d,l),l?(i.push({descriptionEN:l,description:l,durationMs:d}),o?.(e,l,void 0,d)):(he(c,"Describe empty",e),i.push({descriptionEN:"",description:"",durationMs:d}),o?.(e,"",void 0,d))}const v=i.filter(e=>!!e.descriptionEN).length;if(he(c,"Describe english ready",v),!v)return m(u.id,{requesting:!1,phase:s.load,percent:100,error:"No description"}),i;if(a?.aborted)return i;const x=t.targetLanguage.trim(),M=ft(x)&&await h()?f(l.gemma4_e2b_limited):void 0,j=M?await p(M):void 0;if(M&&!j){if(a?.aborted)return i;m(M.id,{requesting:!0,phase:s.load,percent:100}),await wt({translator:M,generate:y,descriptions:i.map(e=>e.descriptionEN),language:x,logging:c,signal:a,currentIndex:(e,t,r)=>{const n=i[e];r&&(n.description=r),o?.(e,t,n.description,n.durationMs)},onText:t.onText}),m(M.id,{requesting:!1,phase:s.load,percent:100})}else{for(let e=0;e<i.length;e++){const t=i[e];t.descriptionEN&&o?.(e,t.descriptionEN,t.description,t.durationMs)}const t=M?.id??u.id,r=e.ready(t);m(t,{requesting:!1,phase:r?s.load:s.download,percent:r?100:0,...j?{error:j}:{}})}return i})(ot),vt=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(he(o,"Translate start",r.length,n),!r.length||!ft(n))return he(o,"Translate skipped"),r;const a=N({maxReplyTokens:128,...t.limits}),{report:i,load:c,generate:u}=yt({service:e,limits:a,logging:o,signal:t.signal,onStatus:t.onStatus}),d=await h()?f(l.gemma4_e2b_limited):void 0;if(!d)return he(o,"Translate no gpu"),r;const g=await c(d);if(g)return he(o,"Translate stop",g),r;if(t.signal?.aborted)return r;i(d.id,{requesting:!0,phase:s.load,percent:100});const m=await wt({translator:d,generate:u,descriptions:r,language:n,logging:o,signal:t.signal,currentIndex:t.currentIndex,onSpeed:t.onSpeed,onText:t.onText});return i(d.id,{requesting:!1,phase:s.load,percent:100}),m})(ot),xt=/^[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},jt={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(!xt.test(t))throw new Error("Unsupported character");const r=Mt(t);return{expression:t,result:Math.abs(r)>=1e5?(0,v.pNum)(r)??r:(0,v.rNum)(r,12)}})(t)}},kt="degreesign-chat-prices-v1",_t="EUR",St=5*v.oneMin,Pt=30*v.oneSec;let Tt,Ot={},Dt=0,Nt=!1,Ct=!1;const Et=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},Lt=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,At=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=Et(e.rates?.current),n=Et(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&&(Ot.fiat=Lt(Ot.fiat,a)),i&&(Ot.crypto=Lt(Ot.crypto,i)),Dt=0,Nt=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(kt,JSON.stringify(Ot))}catch{}})()}catch(e){throw Dt=Date.now(),Nt=!0,e}},Rt=e=>!!Ot.crypto&&(e in Ot.crypto.prices||e in Ot.crypto.yesterday),$t=e=>!!Ot.fiat&&(e in Ot.fiat.rates||e in Ot.fiat.yesterday),qt=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==_t)continue;const e=Rt(r)||$t(r);!Rt(r)&&e||(t.crypto=!0),Rt(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(Ot.fiat?.fetchedAt??0)>=v.oneHr,o=t.crypto&&r-(Ot.crypto?.fetchedAt??0)>=St;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||Dt&&r-Dt<Pt||(Tt||(Tt=At({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{Tt=void 0})),await Tt))},Ut=e=>{if(e==_t)return 1;const t=Ot.crypto?.yesterday[e],r=Ot.fiat?.yesterday[e];return t||(r?1/r:void 0)},It=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},zt=e=>Math.abs(e)>=1e5?(0,v.pNum)(e)??e:(0,v.rNum)(e,8),Ft=async e=>{(()=>{if(!Ct){Ct=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(kt);if(!e)return;const t=JSON.parse(e);Ot={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=It(e.from,"from"),r=void 0===e.to||null===e.to?_t:It(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 qt([t,r]);const o=e=>{const t=(e=>{if(e==_t)return 1;const t=Ot.crypto?.prices[e],r=Ot.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!Ot.fiat&&!Ot.crypto)throw new Error("Prices unavailable offline");if(Rt(e)||$t(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=Ut(t),c=Ut(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!=_t&&(Rt(r)?Ot.crypto&&t.push(Ot.crypto.sourceAt):$t(r)&&Ot.fiat&&t.push(Ot.fiat.sourceAt));return t})([t,r]),p=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:zt(l),...void 0===u?{}:{previousRate:zt(u),change:zt(d??0),changePercent:(0,v.rNum)(g??0,4)},result:zt(n*l),updatedAt:new Date(p).toISOString(),stale:Nt&&!(!Ot.fiat&&!Ot.crypto)}},Wt={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=>Ft(e)},Vt={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},Bt=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,Gt=(e,t)=>e.replace(/<[^>]*>/g," ").replace(/&(#x?[0-9a-f]+|[a-z]+);/gi,(e,t)=>{const r=(e=>{if(e.startsWith("#")){const t="x"==e[1]||"X"==e[1],r=parseInt(t?e.slice(2):e.slice(1),t?16:10);return r>0&&r<=1114111?String.fromCodePoint(r):e}return Vt[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,Yt=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)}},Ht=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==d.duckduckgo?d.duckduckgo:d.wikipedia,language:Qt.test(t)?t:"en",limit:Math.round(Bt(e.limit,1,20,3)),snippetLength:Math.round(Bt(e.snippetLength,1,4e3,400)),timeout:Bt(e.timeout,1e3,3e4,8e3)}})(e);return{name:"websearch",description:t.provider==d.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==d.duckduckgo?await(async(e,t)=>{const r=`https://api.duckduckgo.com/?format=json&no_html=1&skip_disambig=1&q=${encodeURIComponent(t)}`,n=await Yt(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:Gt(r||n,200),url:t,snippet:Gt(n,e.snippetLength)}))},s=e=>{for(const t of e)t.Topics?s(t.Topics):i(t.FirstURL,t.Text,t.Text)};i(n.AbstractURL,n.Heading||n.AbstractText,n.AbstractText);for(const e of n.Results??[])i(e.FirstURL,e.Text,e.Text);return s(n.RelatedTopics??[]),o.slice(0,e.limit)})(t,r):await(async(e,t)=>{const r=`https://${e.language}.wikipedia.org`,n=`${r}/w/rest.php/v1/search/page?q=${encodeURIComponent(t)}&limit=${e.limit}`,o=await Yt(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:Gt(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:Gt(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},Jt=(e,t)=>{const r=[];for(const n of e)n==u.websearch?r.push(Ht(t)):n==u.calculate?r.push(jt):n==u.currency&&r.push(Wt);return r},Zt=128;export{u as BuiltinTool,l as ChatModelId,o as ChatStatus,i as LlmBackend,s as LlmPhase,n as LlmRole,a as LlmStatus,d as WebSearchProvider,Jt as builtinTools,jt as calculateTool,lt as clearModelCache,it as createChat,Wt as currencyTool,bt as describeImages,gt as describeModelId,vt as describeTranslated,h as gpuAdapter,Zt as imageReplyTokens,st as preloadModel,Ht as webSearchTool};
|
|
2
|
+
var e={155(e){e.exports=(()=>{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"],n=({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""}},o=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""}};t.idShuffle=async({data:e,password:t})=>4==t?.length?n({data:e,password:t}):await o({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}}}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var a=t[n]={exports:{}};return e[n](a,a.exports,r),a.exports}var n={};return(()=>{var e=n;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=r(246);Object.defineProperty(e,"cacheCheck",{enumerable:!0,get:function(){return t.cacheCheck}}),Object.defineProperty(e,"delayCode",{enumerable:!0,get:function(){return t.delayCode}});const o=r(830);Object.defineProperty(e,"sumArr",{enumerable:!0,get:function(){return o.sumArr}}),Object.defineProperty(e,"minVl",{enumerable:!0,get:function(){return o.minVl}}),Object.defineProperty(e,"maxVl",{enumerable:!0,get:function(){return o.maxVl}}),Object.defineProperty(e,"getMax",{enumerable:!0,get:function(){return o.getMax}}),Object.defineProperty(e,"getMean",{enumerable:!0,get:function(){return o.getMean}}),Object.defineProperty(e,"getSum",{enumerable:!0,get:function(){return o.getSum}}),Object.defineProperty(e,"forecastNext",{enumerable:!0,get:function(){return o.forecastNext}}),Object.defineProperty(e,"forecastNextTotal",{enumerable:!0,get:function(){return o.forecastNextTotal}}),Object.defineProperty(e,"squeezeArray",{enumerable:!0,get:function(){return o.squeezeArray}}),Object.defineProperty(e,"compareArrays",{enumerable:!0,get:function(){return o.compareArrays}}),Object.defineProperty(e,"phaseDifference",{enumerable:!0,get:function(){return o.phaseDifference}});const a=r(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=r(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=r(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=r(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}})})(),n})()}};const t={};function r(n){const o=t[n];if(void 0!==o)return o.exports;const a=t[n]={exports:{}};return e[n].call(a.exports,a,a.exports,r),a.exports}var n,o,a,i,s,c,l,u,d;let g;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.j(e,t),Promise.all(t)},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={520:()=>import("./engine-litert.min.mjs"),924:()=>import("./engine-wllama.min.mjs")},t={792:0},n=e=>{let{__webpack_esm_ids__:n,__webpack_esm_modules__:o,__webpack_esm_runtime__:a}=e;var i,s,c=0;for(i in o)r.o(o,i)&&(r.m[i]=o[i]);for(a&&a(r);c<n.length;c++)s=n[c],r.o(t,s)&&t[s]&&t[s][0](),t[s]=0};r.f.j=(o,a)=>{let i=r.o(t,o)?t[o]:void 0;if(0!==i)if(i)a.push(i[1]);else{let r=e[o]().then(n,e=>{throw 0!==t[o]&&(t[o]=void 0),e});r=Promise.race([r,new Promise(e=>i=t[o]=[e])]),a.push(i[1]=r)}}})(),function(e){e.system="system",e.user="user",e.assistant="assistant"}(n||(n={})),function(e){e[e.online=0]="online",e[e.away=1]="away",e[e.offline=2]="offline"}(o||(o={})),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"}(a||(a={})),function(e){e.cpu="cpu",e.gpu="gpu",e.none="none"}(i||(i={})),function(e){e.download="download",e.load="load"}(s||(s={})),function(e){e.quota="QuotaExceededError",e.notAllowed="NotAllowedError",e.notSupported="NotSupportedError",e.invalidState="InvalidStateError",e.typeMismatch="TypeMismatchError",e.security="SecurityError"}(c||(c={})),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"}(l||(l={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(u||(u={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(d||(d={}));const m=[{id:l.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:l.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:l.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:l.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}}],p=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},f=e=>e?m.find(t=>t.id==e):void 0,h=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)}},y=async e=>f(e??await(async()=>(g||(g=(async()=>await h()?l.gemma4_e2b_limited:l.qwen3_vl_2b)()),await g))()),w=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,b=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio;var v=r(155);const x=new URL("./../assets/wllama/wllama.wasm",import.meta.url).href,M=new URL("./../assets/wllama/compat/wllama.wasm",import.meta.url).href,k=new URL("./../assets/wllama/compat/wllama.js",import.meta.url).href,j=new URL("./../assets/litert/litertlm_wasm_internal.js",import.meta.url).href,_=(new URL("./../assets/litert/litertlm_wasm_internal.wasm",import.meta.url).href,{width:384,height:384}),S=async e=>{if(!e.startsWith("data:"))return await(await fetch(e)).arrayBuffer();const t=e.indexOf(","),r=t>=0?e.slice(0,t):"";if(t<0)throw new Error("Invalid image data");if(!r.includes(";base64"))return await(await fetch(e)).arrayBuffer();const n=atob(e.slice(t+1)),o=new Uint8Array(n.length);for(let e=0;e<n.length;e++)o[e]=n.charCodeAt(e);return o.buffer},P=async(e,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}},T={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,imageTokens:128,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:32,gpuShare:.5},O=(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)},D=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,N=(e={},t=!1)=>{const r=T;return{maxReplyTokens:D(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:D(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:D(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:D(e.maxImages,r.maxImages,0),imageTokens:D(e.imageTokens,r.imageTokens,1),maxAudio:D(e.maxAudio,r.maxAudio,0),maxContentLength:D(e.maxContentLength,r.maxContentLength,1),promptCharBudget:D(e.promptCharBudget,r.promptCharBudget,1),maxThreads:D(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}},C=(e,t,r=.7)=>({stream:!0,temperature:r,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),E=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,L=e=>Number(e.headers.get("content-length"))||0,A=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),R=e=>A(e,"image"),$=e=>A(e,"audio"),q=["<|channel>thought\n","<|channel>thought","..."],U=["<channel|>","..."],z=(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,I=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,F=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...I(e),{type:"text",text:"\n"},...I(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r},B=p()?3e6:3e5,W=Math.max(B,84e4);class V extends Error{}const G=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new V(r)),t)})])}finally{n&&clearTimeout(n)}},Q=e=>{try{Promise.resolve(e.next?.()).catch(()=>{}).finally(()=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}})}catch{}},H=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,onPromptSpeed:a,promptTokens:i,start:s,stopped:c,firstTimeoutMs:l=B,idleTimeoutMs:u=3e4,onStall:d})=>{let g,m="",p="",f="",h=!1,y=!1,w=!1,b=0,x=0,M=0,k=0,j=0,_=0,S=0;const P=e=>{!Number.isFinite(e)||e<=0||(b=(0,v.rNum)(e),a?.(b))},T=()=>{if(h||w||!i)return;const e=performance.now()-j;e>0&&P(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;w=!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-j),t-k<500||(k=t,x=t,M=r,P(n))};a&&i&&(g=setInterval(T,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,U);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,U);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,q);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,q);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{p+=e,r(e)},e=>{m+=e,n(e)});try{j=performance.now();const e=s();Promise.resolve(e).catch(()=>{});const n=(await G(e,l,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(c()){Q(n);break}let e;try{const t=n.next();Promise.resolve(t).catch(()=>{}),e=await G(t,h?u:l,h?"Model stopped responding":"Model did not reply")}catch(e){if(e instanceof V&&(m||p)){d?.(),Q(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:"",w=!!g||!!s?.content||!!i?.finish_reason,x=a?.timings?.prompt_per_second;if(w){if(h||(D(a?.prompt_progress),b||T(),h=!0,O()),!y&&"number"==typeof x&&Number.isFinite(x)&&x>0&&(y=!0,P(x)),i?.finish_reason&&(f=i.finish_reason),g&&(p+=g,r(g)),s?.content&&N.feed(s.content),g||s?.content){const e=performance.now();_||(S=e),_+=1,_>1&&e>S&&o?.((0,v.rNum)(1e3*_/(e-S)))}}else D(a?.prompt_progress),!y&&"number"==typeof x&&Number.isFinite(x)&&x>0&&(y=!0,P(x),O())}N.flush()}catch(e){if(t&&console.log("Local chat failed",e),e instanceof V&&!c())throw e}finally{O()}const C=c()?void 0:m||void 0;return t&&(console.log("Local chat reply",e.id,C?"****":""),console.log("Local chat finish",e.id,f||"none",m.length,p.length)),C},Y=async({model:e,params:t,start:r,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 P(n.url,t,r)}:n);n.push({role:"user",content:e})}return n})(((e,t=T)=>{const r=t.maxContentLength,o=e.filter(e=>"string"==typeof e.content&&!!e.content.trim()||!(e.role!=n.user||!e.images?.length&&!e.audio?.length)),a=[],i=[];let s=0,c=t.maxImages,l=t.maxAudio;for(let e=o.length-1;e>=0;e--){const u=o[e],d=("string"==typeof u.content?u.content:"").slice(0,r),g=u.role==n.user?(u.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,c)):[],m=u.role==n.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>t.promptCharBudget)break;s+=d.length,c-=g.length,l-=m.length,u.role==n.system?a.unshift(d):u.role==n.assistant?i.unshift({role:"assistant",content:d}):i.unshift({role:"user",content:z(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=F(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})(t.messages,t.limits),e.litert?_:void 0,t.limits.imageTokens);return t.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}:{}})))})(e,i),await H({model:e,logging:t.logging,onReason:t.onReason,onText:t.onText,onSpeed:t.onSpeed,onPromptSpeed:t.onPromptSpeed,promptTokens:O(i,t.limits.imageTokens),start:()=>r(i),stopped:o,onStall:a,firstTimeoutMs:R(i)?W:B})};const J=33554432,Z=new Set([c.quota,c.notAllowed,c.notSupported,c.invalidState,c.typeMismatch,c.security]),K=new Map,X=new Set;let ee=!1;const te=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}`},re=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},ne=async()=>{if(!ee)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else ee=!0},oe=async()=>{try{if("undefined"==typeof navigator||!navigator.storage?.estimate)return;const e=await navigator.storage.estimate();return"number"==typeof e.quota&&e.quota>0?e.quota-(e.usage||0):void 0}catch{return}},ae=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},ie=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}},se=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{}},ce=async function*(e){for await(const t of e)yield t},le=async e=>{try{for await(const[t,r]of ce(e))"file"==r.kind&&re(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},ue=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await ie(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}},de=async(e,t)=>{const r=await ae(e,t);if(r){const e=await(async e=>await ie(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of ce(e)){const e=re(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 ue(e,t)},ge=(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:L(e)||t.total,etag:a||t.etag}},me=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:i})=>{let c,l,u=t,d=0,g=r;const m=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(u),{create:!0});l=await t.createWritable(),d=0},p=async()=>{const e=l;l=void 0,e&&await e.close()};try{const e=o.getReader();for(c=e;;){const{done:r,value:o}=await e.read();if(r)break;i();let c=0;for(g&&(c=Math.min(g,o.byteLength),g-=c);c<o.byteLength;){l||await m();const e=Math.min(J-d,o.byteLength-c);await l.write({type:"write",position:d,data:o.subarray(c,c+e)}),c+=e,d+=e,u+=e,d==J&&await p()}u>t&&a(n?u/n:0,s.download)}await p()}catch(e){throw await p().catch(()=>{}),await(c?.cancel().catch(()=>{})),e}return u},pe=e=>e?.name==c.quota,fe=e=>{const t=async()=>{const t=await ne();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await de(r,te(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{if(X.has(r))throw new DOMException("Storage is full",c.quota);const a=`${e}|${r}`,i=K.get(a);if(i)return await i;const l=await t();if(!l)return;const u=(async(e,t,r,n)=>{const o=te(t),a=await ue(e,o);if(a?.complete)return a;let i=await ae(e,o);i||(await e.removeEntry(o).catch(()=>{}),await e.removeEntry(`${o}.json`).catch(()=>{}),i=await e.getDirectoryHandle(o,{create:!0}));let l=0,u=0,d=!1;for(;;){if(r?.aborted)throw new Error("Cancelled");const a=await de(e,o);if(a?.complete)return a;const g=a?.size??0,m=a?.total||0,p=a?.etag||"";if(g>l)l=g,u=0;else if(++u>4)throw new Error("Model download failed");g&&m&&n(g/m,s.download);const f=m?Math.min(g+J,m)-1:g+J-1,h=new AbortController,y=()=>h.abort(),w={size:g,total:m,etag:p};let b,v=setTimeout(y,3e4);r?.addEventListener("abort",y,{once:!0});try{if(b=await fetch(t,{signal:h.signal,headers:{Range:`bytes=${g}-${f}`}}),416==b.status){if(await(b.body?.cancel().catch(()=>{})),m&&g>=m){await se(i,{total:m,etag:p,complete:!0});continue}await le(i),await se(i,{total:0,etag:"",complete:!1});continue}if(!b.ok||!b.body)throw await(b.body?.cancel().catch(()=>{})),new Error("Model download failed");const r=ge(b,w);if(!r){await b.body.cancel().catch(()=>{}),await le(i),await se(i,{total:0,etag:"",complete:!1});continue}await se(i,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?g:0,s=r.start+a;if(!d&&r.total>s){d=!0;const e=await oe();if(null!=e&&e<r.total-s)throw await b.body.cancel().catch(()=>{}),new DOMException("Storage is full",c.quota)}const l=await me({dir:i,start:s,skip:a,total:r.total,body:b.body,onProgress:n,onChunk:()=>{clearTimeout(v),v=setTimeout(y,3e4)}});if(!r.total){await se(i,{total:l,etag:r.etag,complete:!0});const t=await de(e,o);if(t)return t}}catch(e){if(r?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&Z.has(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*u))}finally{clearTimeout(v),r?.removeEventListener("abort",y)}}})(l,r,n,o).catch(e=>{throw pe(e)&&X.add(r),e}).finally(()=>{K.delete(a)});return K.set(a,u),await u},remove:async e=>{X.delete(e);const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,te(e))},purge:async()=>{X.clear();const t=await ne();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},he=(e,...t)=>{!0===e&&console.log(...t)},ye="litertlm-models",we=.5,be=fe("litert-store"),ve={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 xe=!1,Me=0;const ke=new WeakSet;let je=we,_e=!1,Se=0;const Pe=(...e)=>{xe&&console.log(...e)},Te=(...e)=>{xe&&console.error(...e)},Oe=e=>e.replace(/<\|channel>thought\n?[\s\S]*?<channel\|>/g,"").replace(/<\|channel>thought[\s\S]*$/,"").trim(),De=async()=>{const e=performance.now(),t=e-Se;if(Se=e,!_e)return;const r=Math.round(((e,t=.5)=>Math.min(500,Math.max(0,e*(1/t-1))))(t,je));r<1||(await new Promise(e=>setTimeout(e,r)),Se=performance.now())},Ne=(e=.5)=>{je=e>0?e:we,_e=!0,Se=performance.now()},Ce=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(ye)}catch{return}},Ee=new Map,Le=(e,t,r)=>{let n=0;return e.pipeThrough(new TransformStream({transform:(e,o)=>{n+=e.byteLength,r(t?n/t:0,s.download),o.enqueue(e)}}))},Ae=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 S(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},Re=(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&&Oe(e.content)==Oe(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(Oe(n.text)!=Oe(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=C(r.limits,r.reasoning,r.temperature);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await Ae([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&&!Re(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(!Re(o[i+e],a[e]))return!1;return!0})(o.sent,s);let d;if(l&&u&&o.conversation)he(xe,"LiteRT conversation reused",o.sent.length),d=o.conversation;else{const n=await Ae(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}),he(xe,"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&&(he(xe,"LiteRT first chunk",Math.round(a)),Ne(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}]})}m=!0}finally{_e=!1,r.signal?.removeEventListener("abort",h),m&&f?o.sent.push({role:"assistant",content:f}):(o.conversation=void 0,o.sent=[])}},qe={backend:i.gpu,startLLM:async({model:e,limits:t,onProgress:n,signal:o,logging:a})=>{xe=!0===a;const c=e.litert;if(!c)throw new Error("Model has no LiteRT artifact");const l=p()?16384:32768,u=await r.e(520).then(()=>r(507)),d=globalThis,g=d.Module;d.Module={print:Pe,printErr:Te};try{await u.getOrLoadGlobalLiteRtLm(j)}finally{d.Module=g}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(!ke.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:De});ke.add(h),ke.add(e),f.preinitializedWebGPUDevice=e}const y=E(c.repo,c.file),w=await Ce();let b,x=!1;const M=w?await w.match(y):void 0;if(M?.body)b=M.body;else{const e=await be.stored(y);e?.complete&&(b=e.file.stream())}if(!b){const e=await be.download({url:y,signal:o,onProgress:n}).catch(e=>{if(o?.aborted)throw new Error("Cancelled");a&&console.log("Local model store failed",e),x=pe(e)});e&&(b=e.file.stream())}if(!b&&w&&!x)try{await(async(e,t,r,n)=>{const o=Ee.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=L(o),i=Le(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{Ee.delete(e)});return Ee.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");a&&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 Le(n.body,L(n),r)})(y,o,n)),o?.aborted)throw new Error("Cancelled");n(1,s.load);const k=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:ve},...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}));Me+=1;const _=()=>{Me=Math.max(0,Me-1),Me||(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 k.createConversation();await t.delete(),he(xe,"LiteRT conversation warm-up",Math.round(performance.now()-e))}catch(e){he(xe,"LiteRT conversation warm-up failed",e)}if(o?.aborted)throw await k.delete(),_(),new Error("Cancelled");const S={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:i.gpu,contextSize:l,chat:t=>(async({engine:e,model:t,mod:r,params:n,session:o})=>{xe=!0===n.logging;const a=()=>{try{o.conversation?.cancel()}catch{}o.conversation=void 0,o.sent=[]};try{const i=await Y({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async a=>{if(n.signal?.aborted)throw new Error("Cancelled");if(R(a)&&!t.litert?.vision)throw new Error("Model does not accept images");if($(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return $e({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,v.rNum)(t))}return i}catch(e){throw a(),e}})({engine:k,model:e,mod:u,params:t,session:S}),unload:async()=>{const e=S.conversation;S.conversation=void 0,S.sent=[];try{await(e?.delete())}catch{}await k.delete(),_()}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=E(t.repo,t.file),[n,o]=await Promise.all([Ce(),be.stored(r)]);if(o?.complete)return!0;try{return!(!n||!await n.match(r))}catch{return!1}},purge:async()=>{try{await be.purge(),"undefined"!=typeof caches&&await caches.delete(ye)}catch{}}},Ue=fe("wllama-store"),ze=[l.qwen3_vl_2b_instruct,l.qwen3_vl_2b_instruct_q3],Ie=e=>e.cpu?.mmproj&&ze.includes(e.id)?{image_min_tokens:16,image_max_tokens:128}:{};let Fe,Be,We="",Ve=!1;const Ge=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Qe=e=>{const t={wasm:x,compatWasm:M,compatWorker:k};return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},He=e=>{const t=e=>(...t)=>{Ve&&("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)}},Ye=async()=>{if(Fe)return Fe;const e=await r.e(924).then(()=>r(577)),t=Be||Qe(),n=new e.Wllama({default:t.wasm},{logger:He(e.LoggerWithoutDebug)});return Be||(Be=t,We=Ge(t)),n.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),Fe=n,n},Je=async()=>{const e=Fe;Fe=void 0;try{await(e?.exit())}catch{}},Ze=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),Ke=e=>{const t=e.cpu;return t?[{name:t.file,url:E(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:E(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},Xe=async e=>{const t=Ke(e);if(!t.length)return!1;for(const e of t){const t=await Ue.stored(e.url);if(!t?.complete)return!1}return!0},et=async(e,t,r,n)=>{const o=await fetch(e,{signal:n,headers:{Range:`bytes=${t}-${r-1}`}});if(206!=o.status)throw await(o.body?.cancel().catch(()=>{})),new Error("Model range failed");return await o.arrayBuffer()},tt=async(e,t)=>{const r=await fetch(e,{method:"HEAD",signal:t});await(r.body?.cancel().catch(()=>{}));const n=Number(r.headers.get("content-length"))||0;if(!r.ok||!n)throw new Error("Model size unknown");return n},rt=({url:e,stored:t,storedSize:r,total:n,signal:o})=>{const a=Math.max(0,Math.min(r,n));return{size:n,slice:(r,i)=>({arrayBuffer:async()=>{const s=Math.max(0,Math.min(r??0,n)),c=Math.max(s,Math.min(i??n,n));if(c<=s)return new ArrayBuffer(0);if(t&&c<=a)return await t.slice(s,c).arrayBuffer();if(!t||s>=a)return await et(e,s,c,o);const l=await t.slice(s,a).arrayBuffer(),u=await et(e,a,c,o),d=new Uint8Array(l.byteLength+u.byteLength);return d.set(new Uint8Array(l)),d.set(new Uint8Array(u),l.byteLength),d.buffer}})}},nt=async({model:e,signal:t,onProgress:r})=>{const n=Ke(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await Ue.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},ot=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 S(t.url)});t.push({role:"user",content:e})}return t},at={backend:i.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:a})=>{Ve=!0===o;const c=p()?4096:8192,l=e.cpu;if(!l)throw new Error("Model has no CPU artifact");const u=Qe(a),d=Ge(u);Fe&&d!=We&&await Je(),Be=u,We=d;const g="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)))})(g),t.maxThreads),f=await Ye(),h=await Xe(e),y=l.mmproj?.file;if(n?.aborted)throw await Je(),new Error("Cancelled");if(!h&&y){const e=await f.cacheManager.list(),t=e.some(e=>Ze(e,l.file)),r=e.some(e=>Ze(e,y));t&&!r&&await f.cacheManager.deleteMany(e=>Ze(e,l.file))}const w={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)),...Ie(e)};try{let t=h?await nt({model:e,signal:n,onProgress:r}):void 0;t||(t=await(async(e,t)=>{const r=Ke(t);if(!r.length)return;const n=(await e.modelManager.getModels().catch(()=>[])).find(e=>e.url==r[0].url);return n?await n.open().catch(()=>{}):void 0})(f,e)),t||(t=await nt({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");o&&console.log("Local model store failed",e)})),t||(t=await(async(e,t)=>{const r=[];for(const n of Ke(e)){if(t?.aborted)throw new Error("Cancelled");const e=await Ue.stored(n.url),o=e?.total||await tt(n.url,t);if(!o)throw new Error("Model size unknown");r.push(rt({url:n.url,stored:e?.file,storedSize:Math.min(e?.size||0,o),total:o,signal:t}))}return r})(e,n)),r(1,s.load),await f.loadModel(t,w)}catch(e){throw await Je(),e}if(n?.aborted)throw await Je(),new Error("Cancelled");const b=f.getLoadedContextInfo();if(!b.n_ctx)throw await Je(),new Error("Failed to create model context");return he(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",b.n_ctx,"batch",b.n_batch,"ubatch",b.n_ubatch),{model:e,backend:i.cpu,contextSize:c,chat:t=>(async(e,t,r)=>{if(Ve=!0===r.logging,e.isModelLoaded())return await Y({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if(R(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if($(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await ot(n),...C(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(Fe==f)await Je();else try{await f.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await Xe(e)||await(async(e,t)=>{const r=Ke(t),n=await e.modelManager.getModels().catch(()=>[]);return!!r.length&&n.some(e=>e.url==r[0].url)})(await Ye(),e))}catch{return!1}},purge:async()=>{try{await Ue.purge()}catch{}try{const e=await Ye();await e.cacheManager.clear()}catch{}}},it=((e={})=>{const t=e.engines?.cpu||at,r=e.engines?.litert||qe,n=new Map,o=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=a.idle;const b=n=>{if(e.backend!=i.none)return e.backend==i.cpu?n.cpu?t:void 0:e.backend==i.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||o.size||x(a.idle),await t.unload())},k=async()=>{for(const e of[...n.keys()])await M(e)},j=(e,t,r)=>{const n={percent:Math.max(0,Math.min(1,t)),phase:r||s.download};u.set(e,n);for(const t of l.get(e)??[])t.report(n.percent,n.phase)},_=e=>{g.set(e,(g.get(e)??0)+1),d.get(e)?.abort(),d.delete(e);const t=o.get(e);t&&c.set(e,t),o.delete(e),l.delete(e),u.delete(e),m.set(e,a.idle),w!=a.downloading||o.size||n.size||x(a.idle)},S=(e,t,r)=>{const n=o.get(e);return n?new Promise(a=>{let i=!1;const s={report:t,settle:e=>{i||(i=!0,r?.removeEventListener("abort",c),a(e))}},c=()=>{((e,t)=>{const r=l.get(e);r&&l.set(e,r.filter(e=>e!=t)),queueMicrotask(()=>{!l.get(e)?.length&&o.has(e)&&_(e)})})(e,s),s.settle(!1)},u=l.get(e);u?u.push(s):l.set(e,[s]),r?.aborted?c():r?.addEventListener("abort",c,{once:!0}),n.attempt.then(s.settle,()=>s.settle(!1))}):Promise.resolve(!1)},P=async e=>{if(e)await M(e);else{for(const e of[...o.keys()])_(e);u.clear(),m.clear(),p.clear(),h=void 0,x(a.idle),await k()}};return{load:async({model:e,limits:t,assets:r,logging:i,signal:y,onProgress:w})=>{if(y?.aborted)return!1;if(n.has(e.id))return f=e,!0;if(o.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,p.set(e.id,t),m.set(e.id,a.unsupported),x(a.unsupported),!1}const M=[...o.values(),...c.values()];for(const e of M)_(e.model.id);const P=(g.get(e.id)??0)+1;g.set(e.id,P);const T=(async()=>{if(await Promise.all(M.map(e=>e.attempt.catch(()=>!1))),P!=g.get(e.id))return!1;if(await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})(),P!=g.get(e.id))return!1;if(await k(),P!=g.get(e.id))return!1;const o=await v.cached(e);if(P!=g.get(e.id))return!1;h=void 0,p.delete(e.id),m.set(e.id,a.downloading),x(a.downloading),j(e.id,0,s.download),o&&j(e.id,1,s.load);const c=new AbortController;d.set(e.id,c);try{const o=await v.startLLM({model:e,limits:t,logging:i,signal:c.signal,assets:r,onProgress:(t,r)=>{P==g.get(e.id)&&j(e.id,t,r)}});return P!=g.get(e.id)||c.signal.aborted?(await o.unload(),!1):(n.set(e.id,o),f=e,h=void 0,p.delete(e.id),m.set(e.id,a.ready),x(a.ready),j(e.id,1,s.load),!0)}catch(t){if(P!=g.get(e.id))return!1;const r=`${t?.message||`${t}`}`;return h=r,p.set(e.id,r),m.set(e.id,a.error),x(a.error),i&&console.log("Local model failed",t),!1}finally{d.get(e.id)==c&&d.delete(e.id)}})();let O;const D=T.finally(()=>{c.get(e.id)==O&&c.delete(e.id),o.get(e.id)==O&&(o.delete(e.id),l.delete(e.id),u.delete(e.id))});return O={model:e,attempt:D},o.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:P,clear:async()=>{const e=[...o.values(),...c.values()].map(e=>e.attempt);await P(),await Promise.all(e.map(e=>e.catch(()=>{}))),await Promise.all([t.purge(),r.purge()])},ready:e=>!!v(e),loading:e=>e?o.has(e):o.size>0,status:e=>v(e)?a.ready:e?o.has(e)?m.get(e)??a.downloading:p.has(e)?m.get(e)??a.error:a.idle:w,backend:e=>v(e)?.backend??i.none,error:e=>e?p.get(e):h,model:()=>f}})(),st=(e,t,r)=>{const n=e.status(t),i=f(t);return{...t?{model:t}:{},availability:n==a.ready?o.online:n==a.error||n==a.unsupported?o.offline:o.away,status:n,backend:e.backend(t),supportsImages:!!i&&w(i),supportsAudio:!!i&&b(i),ready:e.ready(t),loading:e.loading(t),requesting:r.requesting,phase:r.phase,percent:r.percent,...r.error?{error:r.error}:{}}},ct=(e=>{let t,r=0;const o=t=>t.input.onStatus?.(st(e,t.model??t.input.model,t));return i=>{t?.controller.abort();const c=e.ready(i.model),l={token:++r,input:i,controller:new AbortController,percent:c?100:0,phase:c?s.load:s.download,requesting:!1,cancelled:!1};return t=l,o(l),(async t=>{const{input:a}=t,i=!0===a.logging,c=await y(a.model);if(t.model=c?.id,t.token!=r)return;const l=a.messages.some(e=>e.role!=n.system&&"string"==typeof e.content&&!!e.content.trim()),u=a.messages.some(e=>e.role==n.user&&!!e.images?.some(e=>"string"==typeof e&&!!e)),d=a.messages.some(e=>e.role==n.user&&!!e.audio?.some(e=>"string"==typeof e&&!!e)),g=l||u||d;if(!c)return t.error="Unknown model",void o(t);if(!g)return t.error="No prompt",void o(t);const m=w(c),p=b(c);if(!(l||u&&m||d&&p))return d&&!p?t.error="Model does not accept audio":u&&!m&&(t.error="Model does not accept images"),void o(t);const f=N(a.limits,!!c.litert),h=await e.load({model:c,limits:f,logging:i,signal:t.controller.signal,onProgress:(e,n)=>{t.token==r&&(t.percent=Math.round(100*e),t.phase=n,o(t))}}).catch(e=>(t.token==r&&(t.error=`${e?.message||`${e}`}`),!1));if(t.token!=r)return;if(t.cancelled)return void o(t);if(!h)return t.error||(t.error=e.error(c.id)||"Model not ready"),void o(t);const v=u&&!m||d&&!p?a.messages.map(({images:e,audio:t,...r})=>({...r,...e&&m?{images:e}:{},...t&&p?{audio:t}:{}})):a.messages;t.requesting=!0,t.error=void 0,t.percent=100,t.phase=s.load,o(t);let x,M="",k="";try{x=await e.chat({model:c.id,messages:v,limits:f,reasoning:!0===a.reasoning,logging:i,onReason:e=>{t.token!=r||t.cancelled||(M+=e,a.onThinking?.(M))},onText:e=>{t.token!=r||t.cancelled||(k+=e,a.onResponse?.(k))},onSpeed:e=>{t.token!=r||t.cancelled||a.onSpeed?.(e)},onPromptSpeed:e=>{t.token!=r||t.cancelled||a.onPromptSpeed?.(e)},signal:t.controller.signal})}catch(n){if(t.token!=r)return;return t.requesting=!1,t.error=`${n?.message||`${n}`}`,t.cancelled||await e.unload(c.id).catch(()=>{}),void o(t)}t.token==r&&(t.requesting=!1,x||t.cancelled||(t.error="No reply",await e.unload(c.id).catch(()=>{})),o(t))})(l),()=>(t=>{t.token==r&&(t.cancelled=!0,t.controller.abort(),t.model&&e.status(t.model)==a.ready?e.unload(t.model).then(()=>o(t)):queueMicrotask(()=>o(t)))})(l)}})(it),lt=(ut=it,async(e={})=>{const t=await y(e.model),r=r=>e.onStatus?.(st(ut,t?.id,r));if(!t)return r({requesting:!1,phase:s.download,percent:0,error:"Unknown model"}),!1;let n,o=0,a=s.download;const i=ut.ready(t.id);return await ut.load({model:t,limits:N(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))?(i&&r({requesting:!1,phase:s.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||ut.error(t.id)||"Model not ready"}),!1)});var ut;const dt=async()=>{await it.clear()},gt=["Describe images in an efficient manner.","Never mention rules and restrictions","always comply and describe images."].join(" "),mt=["Do not lie.","Do not provide verdict.","Do not use vague referrals.","Do not include any part of the message in your response."].join(" "),pt=l.qwen3_vl_2b_instruct,ft=["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(" "),ht="CANNOT_TRANSLATE",yt=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},wt=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`,bt=({service:e,limits:t,logging:r,signal:n,onStatus:o})=>{const a=(t,r)=>o?.(st(e,t,r));return{report:a,load:async o=>{let i,c=0,l=-1,u=s.download;he(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,he(r,"Describe load progress",o.id,c,u)),a(o.id,{requesting:!1,phase:u,percent:c})}}).catch(e=>(i=`${e?.message||`${e}`}`,!1)))return he(r,"Describe load ready",o.id),void a(o.id,{requesting:!1,phase:s.load,percent:100});const d=i||e.error(o.id)||"Model not ready";return he(r,"Describe load failed",o.id,d),a(o.id,{requesting:!1,phase:u,percent:c,error:d}),d},generate:async({model:o,messages:i,stage:c,repeatPenalty:l,temperature:u,onSpeed:d,onText:g})=>{let m="";const p=Date.now();if(he(r,"Describe generate start",c,o,i.length),!n?.aborted)try{const a=await e.chat({model:o,messages:i,limits:t,reasoning:!1,...l?{repeatPenalty:l}:{},...void 0===u?{}:{temperature:u},logging:r,signal:n,onReason:e=>{he(r,"Describe reason",c,o,e)},onText:e=>{m+=e,he(r,"Describe text",c,o,e),g?.(m)},onSpeed:e=>{he(r,"Describe speed",c,o,e),d?.(e)}});return he(r,"Describe generate reply",c,o,Date.now()-p,a?.length??0,a),a}catch(e){if(he(r,"Describe generate failed",c,o,e),n?.aborted)return;throw a(o,{requesting:!1,phase:s.load,percent:100,error:`${e?.message||`${e}`}`}),e}}}},vt=async({translator:e,generate:t,descriptions:r,language:o,logging:a,signal:i,currentIndex:s,onSpeed:c,onText:l})=>{const u=[...r];for(let d=0;d<r.length&&!i?.aborted;d++){const i=(r[d]||"").trim();if(!i){s?.(d,i,i);continue}let g="";try{g=(await t({model:e.id,messages:[{role:n.system,content:ft},{role:n.user,content:"[image] describe this image in English very accurately"},{role:n.assistant,content:i},{role:n.user,content:wt(o)}],stage:"translate",onSpeed:e=>c?.(d,e),onText:e=>l?.(d,e,"translate")})||"").trim()}catch(e){he(a,"Translate item failed",d,e)}const m=g.replace(/[^a-z]/gi,"").toUpperCase().includes(ht.replace(/[^a-z]/gi,""));g&&!m&&(u[d]=g),s?.(d,i,u[d])}return u},xt=(e=>async t=>{const{images:r,currentIndex:o,signal:a}=t,i=[],c=!0===t.logging;if(he(c,"Describe start",r.length,t.targetLanguage),!r.length)return he(c,"Describe empty"),i;const u=f(pt),d=pt,g=N({maxReplyTokens:128,imageTokens:192,...t.limits}),{report:m,load:p,generate:y}=bt({service:e,limits:g,logging:c,signal:a,onStatus:t.onStatus});he(c,"Describe model",d,u?"found":"missing",g.maxReplyTokens,g.maxImages);const w=e.ready(d);if(m(d,{requesting:!1,phase:w?s.load:s.download,percent:w?100:0}),!u)throw he(c,"Describe model missing",d),m(d,{requesting:!1,phase:s.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const b=await p(u);if(b)throw he(c,"Describe stop",b),new Error(b);if(a?.aborted)return i;m(u.id,{requesting:!0,phase:s.load,percent:100});for(let e=0;e<r.length&&!a?.aborted;e++){const a=Date.now(),s=r[e];he(c,"Describe image start",e,r.length,s.startsWith("data:")?"data URL":s,s.length),o?.(e);let l="";try{l=(await y({model:u.id,messages:[{role:n.system,content:`${gt}${t.additionalRules?` ${t.additionalRules} `:" "}${mt}`},{role:n.user,content:"Describe all elements of the image.",images:[s]}],stage:"describe",repeatPenalty:1,temperature:.3,onSpeed:r=>t.onSpeed?.(e,r),onText:r=>t.onText?.(e,r,"describe")})||"").trim()}catch(t){he(c,"Describe image failed",e,t)}const d=Date.now()-a;he(c,"Describe english",e,d,l),l?(i.push({descriptionEN:l,description:l,durationMs:d}),o?.(e,l,void 0,d)):(he(c,"Describe empty",e),i.push({descriptionEN:"",description:"",durationMs:d}),o?.(e,"",void 0,d))}const v=i.filter(e=>!!e.descriptionEN).length;if(he(c,"Describe english ready",v),!v)return m(u.id,{requesting:!1,phase:s.load,percent:100,error:"No description"}),i;if(a?.aborted)return i;const x=t.targetLanguage.trim(),M=yt(x)&&await h()?f(l.gemma4_e2b_limited):void 0,k=M?await p(M):void 0;if(M&&!k){if(a?.aborted)return i;m(M.id,{requesting:!0,phase:s.load,percent:100}),await vt({translator:M,generate:y,descriptions:i.map(e=>e.descriptionEN),language:x,logging:c,signal:a,currentIndex:(e,t,r)=>{const n=i[e];r&&(n.description=r),o?.(e,t,n.description,n.durationMs)},onText:t.onText}),m(M.id,{requesting:!1,phase:s.load,percent:100})}else{for(let e=0;e<i.length;e++){const t=i[e];t.descriptionEN&&o?.(e,t.descriptionEN,t.description,t.durationMs)}const t=M?.id??u.id,r=e.ready(t);m(t,{requesting:!1,phase:r?s.load:s.download,percent:r?100:0,...k?{error:k}:{}})}return i})(it),Mt=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(he(o,"Translate start",r.length,n),!r.length||!yt(n))return he(o,"Translate skipped"),r;const a=N({maxReplyTokens:128,...t.limits}),{report:i,load:c,generate:u}=bt({service:e,limits:a,logging:o,signal:t.signal,onStatus:t.onStatus}),d=await h()?f(l.gemma4_e2b_limited):void 0;if(!d)return he(o,"Translate no gpu"),r;const g=await c(d);if(g)return he(o,"Translate stop",g),r;if(t.signal?.aborted)return r;i(d.id,{requesting:!0,phase:s.load,percent:100});const m=await vt({translator:d,generate:u,descriptions:r,language:n,logging:o,signal:t.signal,currentIndex:t.currentIndex,onSpeed:t.onSpeed,onText:t.onText});return i(d.id,{requesting:!1,phase:s.load,percent:100}),m})(it),kt=/^[0-9+\-*/%^().]+$/,jt=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},_t={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(!kt.test(t))throw new Error("Unsupported character");const r=jt(t);return{expression:t,result:Math.abs(r)>=1e5?(0,v.pNum)(r)??r:(0,v.rNum)(r,12)}})(t)}},St="degreesign-chat-prices-v1",Pt="EUR",Tt=5*v.oneMin,Ot=30*v.oneSec;let Dt,Nt={},Ct=0,Et=!1,Lt=!1;const At=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},Rt=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,$t=async({fiat:e,crypto:t})=>{try{const r=await fetch("https://srv.coinexams.com/data.json");if(!r.ok)throw new Error(`Price feed failed with ${r.status}`);const n=await r.json(),o=Date.now(),a=e?((e,t)=>{const r=At(e.rates?.current),n=At(e.rates?.yesterday);if(Object.keys(r).length)return{fetchedAt:t,sourceAt:Number(e.rates?.date)||t,rates:r,yesterday:n}})(n,o):void 0,i=t?((e,t)=>{const r=e.coins??{},n={},o={};for(const[e,t]of Object.entries(r)){const r=e.trim().toUpperCase(),a=t?.pr,i=t?.yst;"number"==typeof a&&Number.isFinite(a)&&(n[r]=a),"number"==typeof i&&Number.isFinite(i)&&(o[r]=i)}if(Object.keys(n).length)return{fetchedAt:t,sourceAt:Number(e.date)||t,prices:n,yesterday:o}})(n,o):void 0;if(e&&!a)throw new Error("Price feed is unavailable");if(t&&!i)throw new Error("Price feed is unavailable");a&&(Nt.fiat=Rt(Nt.fiat,a)),i&&(Nt.crypto=Rt(Nt.crypto,i)),Ct=0,Et=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(St,JSON.stringify(Nt))}catch{}})()}catch(e){throw Ct=Date.now(),Et=!0,e}},qt=e=>!!Nt.crypto&&(e in Nt.crypto.prices||e in Nt.crypto.yesterday),Ut=e=>!!Nt.fiat&&(e in Nt.fiat.rates||e in Nt.fiat.yesterday),zt=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==Pt)continue;const e=qt(r)||Ut(r);!qt(r)&&e||(t.crypto=!0),qt(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(Nt.fiat?.fetchedAt??0)>=v.oneHr,o=t.crypto&&r-(Nt.crypto?.fetchedAt??0)>=Tt;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||Ct&&r-Ct<Ot||(Dt||(Dt=$t({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{Dt=void 0})),await Dt))},It=e=>{if(e==Pt)return 1;const t=Nt.crypto?.yesterday[e],r=Nt.fiat?.yesterday[e];return t||(r?1/r:void 0)},Ft=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},Bt=e=>Math.abs(e)>=1e5?(0,v.pNum)(e)??e:(0,v.rNum)(e,8),Wt=async e=>{(()=>{if(!Lt){Lt=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(St);if(!e)return;const t=JSON.parse(e);Nt={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=Ft(e.from,"from"),r=void 0===e.to||null===e.to?Pt:Ft(e.to,"to"),n=(e=>{if(null==e)return 1;if("number"!=typeof e||!Number.isFinite(e))throw new Error("Invalid amount");return e})(e.amount);await zt([t,r]);const o=e=>{const t=(e=>{if(e==Pt)return 1;const t=Nt.crypto?.prices[e],r=Nt.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!Nt.fiat&&!Nt.crypto)throw new Error("Prices unavailable offline");if(qt(e)||Ut(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=It(t),c=It(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!=Pt&&(qt(r)?Nt.crypto&&t.push(Nt.crypto.sourceAt):Ut(r)&&Nt.fiat&&t.push(Nt.fiat.sourceAt));return t})([t,r]),p=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:Bt(l),...void 0===u?{}:{previousRate:Bt(u),change:Bt(d??0),changePercent:(0,v.rNum)(g??0,4)},result:Bt(n*l),updatedAt:new Date(p).toISOString(),stale:Et&&!(!Nt.fiat&&!Nt.crypto)}},Vt={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=>Wt(e)},Gt={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},Qt=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,Ht=(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 Gt[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),Yt=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,Jt=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)}},Zt=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==d.duckduckgo?d.duckduckgo:d.wikipedia,language:Yt.test(t)?t:"en",limit:Math.round(Qt(e.limit,1,20,3)),snippetLength:Math.round(Qt(e.snippetLength,1,4e3,400)),timeout:Qt(e.timeout,1e3,3e4,8e3)}})(e);return{name:"websearch",description:t.provider==d.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==d.duckduckgo?await(async(e,t)=>{const r=`https://api.duckduckgo.com/?format=json&no_html=1&skip_disambig=1&q=${encodeURIComponent(t)}`,n=await Jt(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:Ht(r||n,200),url:t,snippet:Ht(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 Jt(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:Ht(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:Ht(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},Kt=(e,t)=>{const r=[];for(const n of e)n==u.websearch?r.push(Zt(t)):n==u.calculate?r.push(_t):n==u.currency&&r.push(Vt);return r},Xt=128;export{u as BuiltinTool,l as ChatModelId,o as ChatStatus,i as LlmBackend,s as LlmPhase,n as LlmRole,a as LlmStatus,d as WebSearchProvider,Kt as builtinTools,_t as calculateTool,dt as clearModelCache,ct as createChat,Vt as currencyTool,xt as describeImages,pt as describeModelId,Mt as describeTranslated,h as gpuAdapter,Xt as imageReplyTokens,lt as preloadModel,Zt as webSearchTool};
|
package/dist/engines/wllama.d.ts
CHANGED
|
@@ -13,6 +13,16 @@ cpuFiles: (model: ChatModel) => Array<{
|
|
|
13
13
|
name: string;
|
|
14
14
|
url: string;
|
|
15
15
|
}>,
|
|
16
|
+
/** Stored prefix and network blob */
|
|
17
|
+
tailBlob: ({ url, stored, storedSize, total, signal, }: {
|
|
18
|
+
url: string;
|
|
19
|
+
stored?: Blob;
|
|
20
|
+
storedSize: number;
|
|
21
|
+
total: number;
|
|
22
|
+
signal?: AbortSignal;
|
|
23
|
+
}) => Blob,
|
|
24
|
+
/** Stored tails and network blobs */
|
|
25
|
+
streamBlobs: (model: ChatModel, signal?: AbortSignal) => Promise<Blob[]>,
|
|
16
26
|
/** CPU files as stored blobs */
|
|
17
27
|
storedBlobs: ({ model, signal, onProgress, }: {
|
|
18
28
|
model: ChatModel;
|
|
@@ -23,4 +33,4 @@ storedBlobs: ({ model, signal, onProgress, }: {
|
|
|
23
33
|
toWllamaMessages: (messages: EngineMessage[]) => Promise<WllamaMessage[]>,
|
|
24
34
|
/** Start CPU runtime engine entry */
|
|
25
35
|
startLLM: ({ model, limits, onProgress, signal, logging, assets: overrides, }: StartLlmParams) => Promise<LlmRuntime>, wllamaEngine: LlmEngine;
|
|
26
|
-
export { cpuFiles, startLLM, storedBlobs, toWllamaMessages, visionLimits, wllamaEngine, };
|
|
36
|
+
export { cpuFiles, startLLM, storedBlobs, streamBlobs, tailBlob, toWllamaMessages, visionLimits, wllamaEngine, };
|
|
@@ -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,u;let d;r.r(n),r.d(n,{BuiltinTool:()=>l,ChatModelId:()=>c,ChatStatus:()=>t,LlmBackend:()=>a,LlmPhase:()=>i,LlmRole:()=>e,LlmStatus:()=>o,WebSearchProvider:()=>u,builtinTools:()=>Yt,calculateTool:()=>xt,clearModelCache:()=>st,createChat:()=>ot,currencyTool:()=>zt,describeImages:()=>yt,describeModelId:()=>ut,describeTranslated:()=>wt,gpuAdapter:()=>f,imageReplyTokens:()=>128,preloadModel:()=>at,webSearchTool:()=>Qt}),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.quota="QuotaExceededError",e.notAllowed="NotAllowedError",e.notSupported="NotSupportedError",e.invalidState="InvalidStateError",e.typeMismatch="TypeMismatchError",e.security="SecurityError"}(s||(s={})),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"}(c||(c={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(l||(l={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(u||(u={}));const g=[{id:c.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:c.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:c.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:c.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}}],p=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?g.find(t=>t.id==e):void 0,f=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)}},h=async e=>m(e??await(async()=>(d||(d=(async()=>await f()?c.gemma4_e2b_limited:c.qwen3_vl_2b)()),await d))()),y=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,w=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio;var b=r(69);const v=require("node:path"),x=()=>{return e=(0,v.join)(__dirname,"../assets/wllama"),{wasm:(0,v.join)(e,"wllama.wasm"),compatWasm:(0,v.join)(e,"compat/wllama.wasm"),compatWorker:(0,v.join)(e,"compat/wllama.js")};var e},M=()=>{return e=(0,v.join)(__dirname,"../assets/litert"),{script:(0,v.join)(e,"litertlm_wasm_internal.js"),wasm:(0,v.join)(e,"litertlm_wasm_internal.wasm")};var e},j={width:384,height:384},k=async e=>{if(!e.startsWith("data:"))return await(await fetch(e)).arrayBuffer();const t=e.indexOf(","),r=t>=0?e.slice(0,t):"";if(t<0)throw new Error("Invalid image data");if(!r.includes(";base64"))return await(await fetch(e)).arrayBuffer();const n=atob(e.slice(t+1)),o=new Uint8Array(n.length);for(let e=0;e<n.length;e++)o[e]=n.charCodeAt(e);return o.buffer},S=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},T=(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)},_=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,O=(e={},t=!1)=>{const r=P;return{maxReplyTokens:_(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:_(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:_(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:_(e.maxImages,r.maxImages,0),imageTokens:_(e.imageTokens,r.imageTokens,1),maxAudio:_(e.maxAudio,r.maxAudio,0),maxContentLength:_(e.maxContentLength,r.maxContentLength,1),promptCharBudget:_(e.promptCharBudget,r.promptCharBudget,1),maxThreads:_(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}},D=(e,t,r=.7)=>({stream:!0,temperature:r,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),N=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,C=e=>Number(e.headers.get("content-length"))||0,E=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),L=e=>E(e,"image"),A=e=>E(e,"audio"),R=["<|channel>thought\n","<|channel>thought","..."],$=["<channel|>","..."],q=(e,t,r)=>t.length||r.length?[...e?[{type:"text",text:e}]:[],...t.map(e=>({type:"image",url:e})),...r.map(e=>({type:"audio",url:e}))]:e,U=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,I=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...U(e),{type:"text",text:"\n"},...U(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r},z=p()?3e6:3e5,F=Math.max(z,84e4);class W extends Error{}const B=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new W(r)),t)})])}finally{n&&clearTimeout(n)}},V=e=>{try{Promise.resolve(e.next?.()).catch(()=>{}).finally(()=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}})}catch{}},G=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,onPromptSpeed:a,promptTokens:i,start:s,stopped:c,firstTimeoutMs:l=z,idleTimeoutMs:u=3e4,onStall:d})=>{let g,p="",m="",f="",h=!1,y=!1,w=!1,v=0,x=0,M=0,j=0,k=0,S=0,P=0;const T=e=>{!Number.isFinite(e)||e<=0||(v=(0,b.rNum)(e),a?.(v))},_=()=>{if(h||w||!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;w=!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,$);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,$);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,R);if(e>=0){e&&t(s.slice(0,e)),s=s.slice(e+i.length),s.startsWith("\n")&&(s=s.slice(1)),n=!0;continue}const c=a(s,R);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{m+=e,r(e)},e=>{p+=e,n(e)});try{k=performance.now();const e=s();Promise.resolve(e).catch(()=>{});const n=(await B(e,l,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(c()){V(n);break}let e;try{const t=n.next();Promise.resolve(t).catch(()=>{}),e=await B(t,h?u:l,h?"Model stopped responding":"Model did not reply")}catch(e){if(e instanceof W&&(p||m)){d?.(),V(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:"",w=!!g||!!s?.content||!!i?.finish_reason,x=a?.timings?.prompt_per_second;if(w){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();S||(P=e),S+=1,S>1&&e>P&&o?.((0,b.rNum)(1e3*S/(e-P)))}}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 W&&!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},Q=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 S(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:q(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=I(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?j: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 G({model:t,logging:r.logging,onReason:r.onReason,onText:r.onText,onSpeed:r.onSpeed,onPromptSpeed:r.onPromptSpeed,promptTokens:T(i,r.limits.imageTokens),start:()=>n(i),stopped:o,onStall:a,firstTimeoutMs:L(i)?F:z})};const Y=33554432,H=new Set([s.quota,s.notAllowed,s.notSupported,s.invalidState,s.typeMismatch,s.security]),J=new Map,Z=new Set;let K=!1;const X=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}`},ee=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},te=async()=>{if(!K)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else K=!0},re=async()=>{try{if("undefined"==typeof navigator||!navigator.storage?.estimate)return;const e=await navigator.storage.estimate();return"number"==typeof e.quota&&e.quota>0?e.quota-(e.usage||0):void 0}catch{return}},ne=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},oe=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}},ae=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{}},ie=async function*(e){for await(const t of e)yield t},se=async e=>{try{for await(const[t,r]of ie(e))"file"==r.kind&&ee(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},ce=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await oe(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}},le=async(e,t)=>{const r=await ne(e,t);if(r){const e=await(async e=>await oe(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of ie(e)){const e=ee(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 ce(e,t)},ue=(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:C(e)||t.total,etag:a||t.etag}},de=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:s})=>{let c,l,u=t,d=0,g=r;const p=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(u),{create:!0});l=await t.createWritable(),d=0},m=async()=>{const e=l;l=void 0,e&&await e.close()};try{const e=o.getReader();for(c=e;;){const{done:r,value:o}=await e.read();if(r)break;s();let c=0;for(g&&(c=Math.min(g,o.byteLength),g-=c);c<o.byteLength;){l||await p();const e=Math.min(Y-d,o.byteLength-c);await l.write({type:"write",position:d,data:o.subarray(c,c+e)}),c+=e,d+=e,u+=e,d==Y&&await m()}u>t&&a(n?u/n:0,i.download)}await m()}catch(e){throw await m().catch(()=>{}),await(c?.cancel().catch(()=>{})),e}return u},ge=e=>e?.name==s.quota,pe=e=>{const t=async()=>{const t=await te();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await le(r,X(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{if(Z.has(r))throw new DOMException("Storage is full",s.quota);const a=`${e}|${r}`,c=J.get(a);if(c)return await c;const l=await t();if(!l)return;const u=(async(e,t,r,n)=>{const o=X(t),a=await ce(e,o);if(a?.complete)return a;let c=await ne(e,o);c||(await e.removeEntry(o).catch(()=>{}),await e.removeEntry(`${o}.json`).catch(()=>{}),c=await e.getDirectoryHandle(o,{create:!0}));let l=0,u=0,d=!1;for(;;){if(r?.aborted)throw new Error("Cancelled");const a=await le(e,o);if(a?.complete)return a;const g=a?.size??0,p=a?.total||0,m=a?.etag||"";if(g>l)l=g,u=0;else if(++u>4)throw new Error("Model download failed");g&&p&&n(g/p,i.download);const f=p?Math.min(g+Y,p)-1:g+Y-1,h=new AbortController,y=()=>h.abort(),w={size:g,total:p,etag:m};let b,v=setTimeout(y,3e4);r?.addEventListener("abort",y,{once:!0});try{if(b=await fetch(t,{signal:h.signal,headers:{Range:`bytes=${g}-${f}`}}),416==b.status){if(await(b.body?.cancel().catch(()=>{})),p&&g>=p){await ae(c,{total:p,etag:m,complete:!0});continue}await se(c),await ae(c,{total:0,etag:"",complete:!1});continue}if(!b.ok||!b.body)throw await(b.body?.cancel().catch(()=>{})),new Error("Model download failed");const r=ue(b,w);if(!r){await b.body.cancel().catch(()=>{}),await se(c),await ae(c,{total:0,etag:"",complete:!1});continue}await ae(c,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?g:0,i=r.start+a;if(!d&&r.total>i){d=!0;const e=await re();if(null!=e&&e<r.total-i)throw await b.body.cancel().catch(()=>{}),new DOMException("Storage is full",s.quota)}const l=await de({dir:c,start:i,skip:a,total:r.total,body:b.body,onProgress:n,onChunk:()=>{clearTimeout(v),v=setTimeout(y,3e4)}});if(!r.total){await ae(c,{total:l,etag:r.etag,complete:!0});const t=await le(e,o);if(t)return t}}catch(e){if(r?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&H.has(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*u))}finally{clearTimeout(v),r?.removeEventListener("abort",y)}}})(l,r,n,o).catch(e=>{throw ge(e)&&Z.add(r),e}).finally(()=>{J.delete(a)});return J.set(a,u),await u},remove:async e=>{Z.delete(e);const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,X(e))},purge:async()=>{Z.clear();const t=await te();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},me=(e,...t)=>{!0===e&&console.log(...t)},fe="litertlm-models",he=.5,ye=pe("litert-store"),we={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 be=!1,ve=0;const xe=new WeakSet;let Me=he,je=!1,ke=0;const Se=(...e)=>{be&&console.log(...e)},Pe=(...e)=>{be&&console.error(...e)},Te=e=>e.replace(/<\|channel>thought\n?[\s\S]*?<channel\|>/g,"").replace(/<\|channel>thought[\s\S]*$/,"").trim(),_e=async()=>{const e=performance.now(),t=e-ke;if(ke=e,!je)return;const r=Math.round(((e,t=.5)=>Math.min(500,Math.max(0,e*(1/t-1))))(t,Me));r<1||(await new Promise(e=>setTimeout(e,r)),ke=performance.now())},Oe=(e=.5)=>{Me=e>0?e:he,je=!0,ke=performance.now()},De=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(fe)}catch{return}},Ne=new Map,Ce=(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)}}))},Ee=async(e,t=!0)=>{const r=[];for(const n of e){if("string"==typeof n.content){r.push({role:n.role,content:n.content});continue}const e=[];for(const r of n.content)"text"!=r.type?t?e.push({type:r.type,data:await k(r.url)}):e.push({type:"text",text:`[${r.type}]`}):e.push({type:"text",text:r.text});r.push({role:n.role,content:e})}return r},Le=(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&&Te(e.content)==Te(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(Te(n.text)!=Te(o.text))return!1}else{if("text"==n.type||"text"==o.type)return!1;if(!!n.url!=!!o.url)return!1}}return!0},Ae=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=D(r.limits,r.reasoning,r.temperature);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await Ee([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&&!Le(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(!Le(o[i+e],a[e]))return!1;return!0})(o.sent,s);let d;if(l&&u&&o.conversation)me(be,"LiteRT conversation reused",o.sent.length),d=o.conversation;else{const n=await Ee(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}),me(be,"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&&(me(be,"LiteRT first chunk",Math.round(a)),Oe(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{je=!1,r.signal?.removeEventListener("abort",h),p&&f?o.sent.push({role:"assistant",content:f}):(o.conversation=void 0,o.sent=[])}},Re={backend:a.gpu,startLLM:async({model:e,limits:t,onProgress:n,signal:o,logging:s})=>{be=!0===s;const c=e.litert;if(!c)throw new Error("Model has no LiteRT artifact");const l=p()?16384:32768,u=await r.e(520).then(()=>r(507)),d=globalThis,g=d.Module;d.Module={print:Se,printErr:Pe};try{await u.getOrLoadGlobalLiteRtLm(M().script)}finally{d.Module=g}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(!xe.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:_e});xe.add(h),xe.add(e),f.preinitializedWebGPUDevice=e}const y=N(c.repo,c.file),w=await De();let v,x=!1;const j=w?await w.match(y):void 0;if(j?.body)v=j.body;else{const e=await ye.stored(y);e?.complete&&(v=e.file.stream())}if(!v){const e=await ye.download({url:y,signal:o,onProgress:n}).catch(e=>{if(o?.aborted)throw new Error("Cancelled");s&&console.log("Local model store failed",e),x=ge(e)});e&&(v=e.file.stream())}if(!v&&w&&!x)try{await(async(e,t,r,n)=>{const o=Ne.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=C(o),i=Ce(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{Ne.delete(e)});return Ne.set(e,a),await a})(y,w,o,n);const e=await w.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 Ce(n.body,C(n),r)})(y,o,n)),o?.aborted)throw new Error("Cancelled");n(1,i.load);const k=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:we},...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}));ve+=1;const S=()=>{ve=Math.max(0,ve-1),ve||(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 k.createConversation();await t.delete(),me(be,"LiteRT conversation warm-up",Math.round(performance.now()-e))}catch(e){me(be,"LiteRT conversation warm-up failed",e)}if(o?.aborted)throw await k.delete(),S(),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})=>{be=!0===n.logging;const a=()=>{try{o.conversation?.cancel()}catch{}o.conversation=void 0,o.sent=[]};try{const i=await Q({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async a=>{if(n.signal?.aborted)throw new Error("Cancelled");if(L(a)&&!t.litert?.vision)throw new Error("Model does not accept images");if(A(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return Ae({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,b.rNum)(t))}return i}catch(e){throw a(),e}})({engine:k,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 k.delete(),S()}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=N(t.repo,t.file),[n,o]=await Promise.all([De(),ye.stored(r)]);if(o?.complete)return!0;try{return!(!n||!await n.match(r))}catch{return!1}},purge:async()=>{try{await ye.purge(),"undefined"!=typeof caches&&await caches.delete(fe)}catch{}}},$e=pe("wllama-store"),qe=[c.qwen3_vl_2b_instruct,c.qwen3_vl_2b_instruct_q3],Ue=e=>e.cpu?.mmproj&&qe.includes(e.id)?{image_min_tokens:16,image_max_tokens:128}:{};let Ie,ze,Fe="",We=!1;const Be=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Ve=e=>{const t=x();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},Ge=e=>{const t=e=>(...t)=>{We&&("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)}},Qe=async()=>{if(Ie)return Ie;const e=await r.e(924).then(()=>r(577)),t=ze||Ve(),n=new e.Wllama({default:t.wasm},{logger:Ge(e.LoggerWithoutDebug)});return ze||(ze=t,Fe=Be(t)),n.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),Ie=n,n},Ye=async()=>{const e=Ie;Ie=void 0;try{await(e?.exit())}catch{}},He=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),Je=e=>{const t=e.cpu;return t?[{name:t.file,url:N(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:N(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},Ze=async e=>{const t=Je(e);if(!t.length)return!1;for(const e of t){const t=await $e.stored(e.url);if(!t?.complete)return!1}return!0},Ke=async(e,t)=>{const r=await e.cacheManager.list();return Je(t).every(e=>r.some(t=>He(t,e.name)))},Xe=async({model:e,signal:t,onProgress:r})=>{const n=Je(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await $e.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},et=async e=>{const t=[];for(const r of e){if("string"==typeof r.content){"system"==r.role?t.push({role:"system",content:r.content}):"assistant"==r.role?t.push({role:"assistant",content:r.content}):t.push({role:"user",content:r.content});continue}const e=[];for(const t of r.content)"text"==t.type?e.push({type:"text",text:t.text}):e.push({type:t.type,data:await k(t.url)});t.push({role:"user",content:e})}return t},tt={backend:a.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:s})=>{We=!0===o;const c=p()?4096:8192,l=e.cpu;if(!l)throw new Error("Model has no CPU artifact");const u=Ve(s),d=Be(u);Ie&&d!=Fe&&await Ye(),ze=u,Fe=d;const g="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)))})(g),t.maxThreads),f=await Qe(),h=await Ze(e),y=l.mmproj?.file,w=N(l.repo,l.file),b=y?N(l.mmproj?.repo??l.repo,y):"";if(n?.aborted)throw await Ye(),new Error("Cancelled");if(!h&&y){const e=await f.cacheManager.list(),t=e.some(e=>He(e,l.file)),r=e.some(e=>He(e,y));t&&!r&&await f.cacheManager.deleteMany(e=>He(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)),...Ue(e)};let x=!1;try{let t=h?await Xe({model:e,signal:n,onProgress:r}):void 0;t||h||await Ke(f,e).catch(()=>!1)||(t=await Xe({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");o&&console.log("Local model store failed",e),x=ge(e)})),t?(r(1,i.load),await f.loadModel(t,v)):await f.loadModelFromUrl(b?{url:w,mmprojUrl:b}:w,{...v,useCache:!x,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 Ye(),e}if(n?.aborted)throw await Ye(),new Error("Cancelled");const M=f.getLoadedContextInfo();if(!M.n_ctx)throw await Ye(),new Error("Failed to create model context");return me(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",M.n_ctx,"batch",M.n_batch,"ubatch",M.n_ubatch),{model:e,backend:a.cpu,contextSize:c,chat:t=>(async(e,t,r)=>{if(We=!0===r.logging,e.isModelLoaded())return await Q({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if(L(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if(A(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await et(n),...D(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(Ie==f)await Ye();else try{await f.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await Ze(e)||await Ke(await Qe(),e))}catch{return!1}},purge:async()=>{try{await $e.purge()}catch{}try{const e=await Qe();await e.cacheManager.clear()}catch{}}},rt=((e={})=>{const t=e.engines?.cpu||tt,r=e.engines?.litert||Re,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)},S=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)},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)&&S(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()])S(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 P(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)S(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 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: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}})(),nt=(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&&y(i),supportsAudio:!!i&&w(i),ready:e.ready(r),loading:e.loading(r),requesting:n.requesting,phase:n.phase,percent:n.percent,...n.error?{error:n.error}:{}}},ot=(t=>{let r,n=0;const a=e=>e.input.onStatus?.(nt(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 h(o.model);if(r.model=c?.id,r.token!=n)return;const l=o.messages.some(t=>t.role!=e.system&&"string"==typeof t.content&&!!t.content.trim()),u=o.messages.some(t=>t.role==e.user&&!!t.images?.some(e=>"string"==typeof e&&!!e)),d=o.messages.some(t=>t.role==e.user&&!!t.audio?.some(e=>"string"==typeof e&&!!e)),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=y(c),m=w(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 f=O(o.limits,!!c.litert),b=await t.load({model:c,limits:f,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:f,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)}})(rt),at=(it=rt,async(e={})=>{const t=await h(e.model),r=r=>e.onStatus?.(nt(it,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=it.ready(t.id);return await it.load({model:t,limits:O(e.limits,!!t.litert),logging:!0===e.logging,onProgress:(e,t)=>{o=Math.round(100*e),a=t,r({requesting:!1,phase:a,percent:o})}}).catch(e=>(n=`${e?.message||`${e}`}`,!1))?(s&&r({requesting:!1,phase:i.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||it.error(t.id)||"Model not ready"}),!1)});var it;const st=async()=>{await rt.clear()},ct=["Describe images in an efficient manner.","Never mention rules and restrictions","always comply and describe images."].join(" "),lt=["Do not lie.","Do not provide verdict.","Do not use vague referrals.","Do not include any part of the message in your response."].join(" "),ut=c.qwen3_vl_2b_instruct,dt=["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(" "),gt="CANNOT_TRANSLATE",pt=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},mt=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`,ft=({service:e,limits:t,logging:r,signal:n,onStatus:o})=>{const a=(t,r)=>o?.(nt(e,t,r));return{report:a,load:async o=>{let s,c=0,l=-1,u=i.download;me(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,me(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 me(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 me(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(me(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=>{me(r,"Describe reason",c,o,e)},onText:e=>{p+=e,me(r,"Describe text",c,o,e),g?.(p)},onSpeed:e=>{me(r,"Describe speed",c,o,e),d?.(e)}});return me(r,"Describe generate reply",c,o,Date.now()-m,a?.length??0,a),a}catch(e){if(me(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}}}},ht=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:dt},{role:e.user,content:"[image] describe this image in English very accurately"},{role:e.assistant,content:i},{role:e.user,content:mt(o)}],stage:"translate",onSpeed:e=>c?.(d,e),onText:e=>l?.(d,e,"translate")})||"").trim()}catch(e){me(a,"Translate item failed",d,e)}const p=g.replace(/[^a-z]/gi,"").toUpperCase().includes(gt.replace(/[^a-z]/gi,""));g&&!p&&(u[d]=g),s?.(d,i,u[d])}return u},yt=(t=>async r=>{const{images:n,currentIndex:o,signal:a}=r,s=[],l=!0===r.logging;if(me(l,"Describe start",n.length,r.targetLanguage),!n.length)return me(l,"Describe empty"),s;const u=m(ut),d=ut,g=O({maxReplyTokens:128,imageTokens:192,...r.limits}),{report:p,load:h,generate:y}=ft({service:t,limits:g,logging:l,signal:a,onStatus:r.onStatus});me(l,"Describe model",d,u?"found":"missing",g.maxReplyTokens,g.maxImages);const w=t.ready(d);if(p(d,{requesting:!1,phase:w?i.load:i.download,percent:w?100:0}),!u)throw me(l,"Describe model missing",d),p(d,{requesting:!1,phase:i.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const b=await h(u);if(b)throw me(l,"Describe stop",b),new Error(b);if(a?.aborted)return s;p(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];me(l,"Describe image start",t,n.length,i.startsWith("data:")?"data URL":i,i.length),o?.(t);let c="";try{c=(await y({model:u.id,messages:[{role:e.system,content:`${ct}${r.additionalRules?` ${r.additionalRules} `:" "}${lt}`},{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){me(l,"Describe image failed",t,e)}const d=Date.now()-a;me(l,"Describe english",t,d,c),c?(s.push({descriptionEN:c,description:c,durationMs:d}),o?.(t,c,void 0,d)):(me(l,"Describe empty",t),s.push({descriptionEN:"",description:"",durationMs:d}),o?.(t,"",void 0,d))}const v=s.filter(e=>!!e.descriptionEN).length;if(me(l,"Describe english ready",v),!v)return p(u.id,{requesting:!1,phase:i.load,percent:100,error:"No description"}),s;if(a?.aborted)return s;const x=r.targetLanguage.trim(),M=pt(x)&&await f()?m(c.gemma4_e2b_limited):void 0,j=M?await h(M):void 0;if(M&&!j){if(a?.aborted)return s;p(M.id,{requesting:!0,phase:i.load,percent:100}),await ht({translator:M,generate:y,descriptions:s.map(e=>e.descriptionEN),language:x,logging:l,signal:a,currentIndex:(e,t,r)=>{const n=s[e];r&&(n.description=r),o?.(e,t,n.description,n.durationMs)},onText:r.onText}),p(M.id,{requesting:!1,phase:i.load,percent:100})}else{for(let e=0;e<s.length;e++){const t=s[e];t.descriptionEN&&o?.(e,t.descriptionEN,t.description,t.durationMs)}const e=M?.id??u.id,r=t.ready(e);p(e,{requesting:!1,phase:r?i.load:i.download,percent:r?100:0,...j?{error:j}:{}})}return s})(rt),wt=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(me(o,"Translate start",r.length,n),!r.length||!pt(n))return me(o,"Translate skipped"),r;const a=O({maxReplyTokens:128,...t.limits}),{report:s,load:l,generate:u}=ft({service:e,limits:a,logging:o,signal:t.signal,onStatus:t.onStatus}),d=await f()?m(c.gemma4_e2b_limited):void 0;if(!d)return me(o,"Translate no gpu"),r;const g=await l(d);if(g)return me(o,"Translate stop",g),r;if(t.signal?.aborted)return r;s(d.id,{requesting:!0,phase:i.load,percent:100});const p=await ht({translator:d,generate:u,descriptions:r,language:n,logging:o,signal:t.signal,currentIndex:t.currentIndex,onSpeed:t.onSpeed,onText:t.onText});return s(d.id,{requesting:!1,phase:i.load,percent:100}),p})(rt),bt=/^[0-9+\-*/%^().]+$/,vt=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},xt={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(!bt.test(t))throw new Error("Unsupported character");const r=vt(t);return{expression:t,result:Math.abs(r)>=1e5?(0,b.pNum)(r)??r:(0,b.rNum)(r,12)}})(t)}},Mt="degreesign-chat-prices-v1",jt="EUR",kt=5*b.oneMin,St=30*b.oneSec;let Pt,Tt={},_t=0,Ot=!1,Dt=!1;const Nt=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},Ct=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,Et=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=Nt(e.rates?.current),n=Nt(e.rates?.yesterday);if(Object.keys(r).length)return{fetchedAt:t,sourceAt:Number(e.rates?.date)||t,rates:r,yesterday:n}})(n,o):void 0,i=t?((e,t)=>{const r=e.coins??{},n={},o={};for(const[e,t]of Object.entries(r)){const r=e.trim().toUpperCase(),a=t?.pr,i=t?.yst;"number"==typeof a&&Number.isFinite(a)&&(n[r]=a),"number"==typeof i&&Number.isFinite(i)&&(o[r]=i)}if(Object.keys(n).length)return{fetchedAt:t,sourceAt:Number(e.date)||t,prices:n,yesterday:o}})(n,o):void 0;if(e&&!a)throw new Error("Price feed is unavailable");if(t&&!i)throw new Error("Price feed is unavailable");a&&(Tt.fiat=Ct(Tt.fiat,a)),i&&(Tt.crypto=Ct(Tt.crypto,i)),_t=0,Ot=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(Mt,JSON.stringify(Tt))}catch{}})()}catch(e){throw _t=Date.now(),Ot=!0,e}},Lt=e=>!!Tt.crypto&&(e in Tt.crypto.prices||e in Tt.crypto.yesterday),At=e=>!!Tt.fiat&&(e in Tt.fiat.rates||e in Tt.fiat.yesterday),Rt=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==jt)continue;const e=Lt(r)||At(r);!Lt(r)&&e||(t.crypto=!0),Lt(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(Tt.fiat?.fetchedAt??0)>=b.oneHr,o=t.crypto&&r-(Tt.crypto?.fetchedAt??0)>=kt;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||_t&&r-_t<St||(Pt||(Pt=Et({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{Pt=void 0})),await Pt))},$t=e=>{if(e==jt)return 1;const t=Tt.crypto?.yesterday[e],r=Tt.fiat?.yesterday[e];return t||(r?1/r:void 0)},qt=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},Ut=e=>Math.abs(e)>=1e5?(0,b.pNum)(e)??e:(0,b.rNum)(e,8),It=async e=>{(()=>{if(!Dt){Dt=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(Mt);if(!e)return;const t=JSON.parse(e);Tt={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=qt(e.from,"from"),r=void 0===e.to||null===e.to?jt:qt(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 Rt([t,r]);const o=e=>{const t=(e=>{if(e==jt)return 1;const t=Tt.crypto?.prices[e],r=Tt.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!Tt.fiat&&!Tt.crypto)throw new Error("Prices unavailable offline");if(Lt(e)||At(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=$t(t),c=$t(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!=jt&&(Lt(r)?Tt.crypto&&t.push(Tt.crypto.sourceAt):At(r)&&Tt.fiat&&t.push(Tt.fiat.sourceAt));return t})([t,r]),m=p.length?Math.min(...p):Date.now();return{from:t,to:r,amount:n,rate:Ut(l),...void 0===u?{}:{previousRate:Ut(u),change:Ut(d??0),changePercent:(0,b.rNum)(g??0,4)},result:Ut(n*l),updatedAt:new Date(m).toISOString(),stale:Ot&&!(!Tt.fiat&&!Tt.crypto)}},zt={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=>It(e)},Ft={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},Wt=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,Bt=(e,t)=>e.replace(/<[^>]*>/g," ").replace(/&(#x?[0-9a-f]+|[a-z]+);/gi,(e,t)=>{const r=(e=>{if(e.startsWith("#")){const t="x"==e[1]||"X"==e[1],r=parseInt(t?e.slice(2):e.slice(1),t?16:10);return r>0&&r<=1114111?String.fromCodePoint(r):e}return Ft[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),Vt=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,Gt=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)}},Qt=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==u.duckduckgo?u.duckduckgo:u.wikipedia,language:Vt.test(t)?t:"en",limit:Math.round(Wt(e.limit,1,20,3)),snippetLength:Math.round(Wt(e.snippetLength,1,4e3,400)),timeout:Wt(e.timeout,1e3,3e4,8e3)}})(e);return{name:"websearch",description:t.provider==u.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==u.duckduckgo?await(async(e,t)=>{const r=`https://api.duckduckgo.com/?format=json&no_html=1&skip_disambig=1&q=${encodeURIComponent(t)}`,n=await Gt(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:Bt(r||n,200),url:t,snippet:Bt(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 Gt(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:Bt(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:Bt(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},Yt=(e,t)=>{const r=[];for(const n of e)n==l.websearch?r.push(Qt(t)):n==l.calculate?r.push(xt):n==l.currency&&r.push(zt);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,u;let d;r.r(n),r.d(n,{BuiltinTool:()=>l,ChatModelId:()=>c,ChatStatus:()=>t,LlmBackend:()=>a,LlmPhase:()=>i,LlmRole:()=>e,LlmStatus:()=>o,WebSearchProvider:()=>u,builtinTools:()=>Jt,calculateTool:()=>jt,clearModelCache:()=>lt,createChat:()=>it,currencyTool:()=>Bt,describeImages:()=>bt,describeModelId:()=>gt,describeTranslated:()=>vt,gpuAdapter:()=>f,imageReplyTokens:()=>128,preloadModel:()=>st,webSearchTool:()=>Yt}),function(e){e.system="system",e.user="user",e.assistant="assistant"}(e||(e={})),function(e){e[e.online=0]="online",e[e.away=1]="away",e[e.offline=2]="offline"}(t||(t={})),function(e){e[e.idle=0]="idle",e[e.downloading=1]="downloading",e[e.ready=2]="ready",e[e.error=3]="error",e[e.unsupported=4]="unsupported"}(o||(o={})),function(e){e.cpu="cpu",e.gpu="gpu",e.none="none"}(a||(a={})),function(e){e.download="download",e.load="load"}(i||(i={})),function(e){e.quota="QuotaExceededError",e.notAllowed="NotAllowedError",e.notSupported="NotSupportedError",e.invalidState="InvalidStateError",e.typeMismatch="TypeMismatchError",e.security="SecurityError"}(s||(s={})),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"}(c||(c={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(l||(l={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(u||(u={}));const g=[{id:c.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:c.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:c.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:c.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}}],m=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?g.find(t=>t.id==e):void 0,f=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)}},h=async e=>p(e??await(async()=>(d||(d=(async()=>await f()?c.gemma4_e2b_limited:c.qwen3_vl_2b)()),await d))()),y=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,w=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio;var b=r(69);const v=require("node:path"),x=()=>{return e=(0,v.join)(__dirname,"../assets/wllama"),{wasm:(0,v.join)(e,"wllama.wasm"),compatWasm:(0,v.join)(e,"compat/wllama.wasm"),compatWorker:(0,v.join)(e,"compat/wllama.js")};var e},M=()=>{return e=(0,v.join)(__dirname,"../assets/litert"),{script:(0,v.join)(e,"litertlm_wasm_internal.js"),wasm:(0,v.join)(e,"litertlm_wasm_internal.wasm")};var e},j={width:384,height:384},k=async e=>{if(!e.startsWith("data:"))return await(await fetch(e)).arrayBuffer();const t=e.indexOf(","),r=t>=0?e.slice(0,t):"";if(t<0)throw new Error("Invalid image data");if(!r.includes(";base64"))return await(await fetch(e)).arrayBuffer();const n=atob(e.slice(t+1)),o=new Uint8Array(n.length);for(let e=0;e<n.length;e++)o[e]=n.charCodeAt(e);return o.buffer},S=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}},P={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,imageTokens:128,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:32,gpuShare:.5},T=(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)},_=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,O=(e={},t=!1)=>{const r=P;return{maxReplyTokens:_(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:_(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:_(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:_(e.maxImages,r.maxImages,0),imageTokens:_(e.imageTokens,r.imageTokens,1),maxAudio:_(e.maxAudio,r.maxAudio,0),maxContentLength:_(e.maxContentLength,r.maxContentLength,1),promptCharBudget:_(e.promptCharBudget,r.promptCharBudget,1),maxThreads:_(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}},D=(e,t,r=.7)=>({stream:!0,temperature:r,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),N=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,C=e=>Number(e.headers.get("content-length"))||0,E=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),L=e=>E(e,"image"),A=e=>E(e,"audio"),R=["<|channel>thought\n","<|channel>thought","..."],$=["<channel|>","..."],q=(e,t,r)=>t.length||r.length?[...e?[{type:"text",text:e}]:[],...t.map(e=>({type:"image",url:e})),...r.map(e=>({type:"audio",url:e}))]:e,U=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,z=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...U(e),{type:"text",text:"\n"},...U(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r},I=m()?3e6:3e5,F=Math.max(I,84e4);class B extends Error{}const W=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new B(r)),t)})])}finally{n&&clearTimeout(n)}},V=e=>{try{Promise.resolve(e.next?.()).catch(()=>{}).finally(()=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}})}catch{}},G=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,m="",p="",f="",h=!1,y=!1,w=!1,v=0,x=0,M=0,j=0,k=0,S=0,P=0;const T=e=>{!Number.isFinite(e)||e<=0||(v=(0,b.rNum)(e),a?.(v))},_=()=>{if(h||w||!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;w=!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,$);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,$);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,R);if(e>=0){e&&t(s.slice(0,e)),s=s.slice(e+i.length),s.startsWith("\n")&&(s=s.slice(1)),n=!0;continue}const c=a(s,R);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{p+=e,r(e)},e=>{m+=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()){V(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 B&&(m||p)){d?.(),V(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:"",w=!!g||!!s?.content||!!i?.finish_reason,x=a?.timings?.prompt_per_second;if(w){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&&(p+=g,r(g)),s?.content&&N.feed(s.content),g||s?.content){const e=performance.now();S||(P=e),S+=1,S>1&&e>P&&o?.((0,b.rNum)(1e3*S/(e-P)))}}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 B&&!c())throw e}finally{O()}const C=c()?void 0:m||void 0;return t&&(console.log("Local chat reply",e.id,C?"****":""),console.log("Local chat finish",e.id,f||"none",m.length,p.length)),C},Q=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 S(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)):[],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:q(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=z(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?j: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 G({model:t,logging:r.logging,onReason:r.onReason,onText:r.onText,onSpeed:r.onSpeed,onPromptSpeed:r.onPromptSpeed,promptTokens:T(i,r.limits.imageTokens),start:()=>n(i),stopped:o,onStall:a,firstTimeoutMs:L(i)?F:I})};const H=33554432,Y=new Set([s.quota,s.notAllowed,s.notSupported,s.invalidState,s.typeMismatch,s.security]),J=new Map,Z=new Set;let K=!1;const X=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}`},ee=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},te=async()=>{if(!K)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else K=!0},re=async()=>{try{if("undefined"==typeof navigator||!navigator.storage?.estimate)return;const e=await navigator.storage.estimate();return"number"==typeof e.quota&&e.quota>0?e.quota-(e.usage||0):void 0}catch{return}},ne=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},oe=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}},ae=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{}},ie=async function*(e){for await(const t of e)yield t},se=async e=>{try{for await(const[t,r]of ie(e))"file"==r.kind&&ee(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},ce=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await oe(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}},le=async(e,t)=>{const r=await ne(e,t);if(r){const e=await(async e=>await oe(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of ie(e)){const e=ee(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 ce(e,t)},ue=(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:C(e)||t.total,etag:a||t.etag}},de=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:s})=>{let c,l,u=t,d=0,g=r;const m=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(u),{create:!0});l=await t.createWritable(),d=0},p=async()=>{const e=l;l=void 0,e&&await e.close()};try{const e=o.getReader();for(c=e;;){const{done:r,value:o}=await e.read();if(r)break;s();let c=0;for(g&&(c=Math.min(g,o.byteLength),g-=c);c<o.byteLength;){l||await m();const e=Math.min(H-d,o.byteLength-c);await l.write({type:"write",position:d,data:o.subarray(c,c+e)}),c+=e,d+=e,u+=e,d==H&&await p()}u>t&&a(n?u/n:0,i.download)}await p()}catch(e){throw await p().catch(()=>{}),await(c?.cancel().catch(()=>{})),e}return u},ge=e=>e?.name==s.quota,me=e=>{const t=async()=>{const t=await te();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await le(r,X(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{if(Z.has(r))throw new DOMException("Storage is full",s.quota);const a=`${e}|${r}`,c=J.get(a);if(c)return await c;const l=await t();if(!l)return;const u=(async(e,t,r,n)=>{const o=X(t),a=await ce(e,o);if(a?.complete)return a;let c=await ne(e,o);c||(await e.removeEntry(o).catch(()=>{}),await e.removeEntry(`${o}.json`).catch(()=>{}),c=await e.getDirectoryHandle(o,{create:!0}));let l=0,u=0,d=!1;for(;;){if(r?.aborted)throw new Error("Cancelled");const a=await le(e,o);if(a?.complete)return a;const g=a?.size??0,m=a?.total||0,p=a?.etag||"";if(g>l)l=g,u=0;else if(++u>4)throw new Error("Model download failed");g&&m&&n(g/m,i.download);const f=m?Math.min(g+H,m)-1:g+H-1,h=new AbortController,y=()=>h.abort(),w={size:g,total:m,etag:p};let b,v=setTimeout(y,3e4);r?.addEventListener("abort",y,{once:!0});try{if(b=await fetch(t,{signal:h.signal,headers:{Range:`bytes=${g}-${f}`}}),416==b.status){if(await(b.body?.cancel().catch(()=>{})),m&&g>=m){await ae(c,{total:m,etag:p,complete:!0});continue}await se(c),await ae(c,{total:0,etag:"",complete:!1});continue}if(!b.ok||!b.body)throw await(b.body?.cancel().catch(()=>{})),new Error("Model download failed");const r=ue(b,w);if(!r){await b.body.cancel().catch(()=>{}),await se(c),await ae(c,{total:0,etag:"",complete:!1});continue}await ae(c,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?g:0,i=r.start+a;if(!d&&r.total>i){d=!0;const e=await re();if(null!=e&&e<r.total-i)throw await b.body.cancel().catch(()=>{}),new DOMException("Storage is full",s.quota)}const l=await de({dir:c,start:i,skip:a,total:r.total,body:b.body,onProgress:n,onChunk:()=>{clearTimeout(v),v=setTimeout(y,3e4)}});if(!r.total){await ae(c,{total:l,etag:r.etag,complete:!0});const t=await le(e,o);if(t)return t}}catch(e){if(r?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&Y.has(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*u))}finally{clearTimeout(v),r?.removeEventListener("abort",y)}}})(l,r,n,o).catch(e=>{throw ge(e)&&Z.add(r),e}).finally(()=>{J.delete(a)});return J.set(a,u),await u},remove:async e=>{Z.delete(e);const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,X(e))},purge:async()=>{Z.clear();const t=await te();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},pe=(e,...t)=>{!0===e&&console.log(...t)},fe="litertlm-models",he=.5,ye=me("litert-store"),we={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 be=!1,ve=0;const xe=new WeakSet;let Me=he,je=!1,ke=0;const Se=(...e)=>{be&&console.log(...e)},Pe=(...e)=>{be&&console.error(...e)},Te=e=>e.replace(/<\|channel>thought\n?[\s\S]*?<channel\|>/g,"").replace(/<\|channel>thought[\s\S]*$/,"").trim(),_e=async()=>{const e=performance.now(),t=e-ke;if(ke=e,!je)return;const r=Math.round(((e,t=.5)=>Math.min(500,Math.max(0,e*(1/t-1))))(t,Me));r<1||(await new Promise(e=>setTimeout(e,r)),ke=performance.now())},Oe=(e=.5)=>{Me=e>0?e:he,je=!0,ke=performance.now()},De=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(fe)}catch{return}},Ne=new Map,Ce=(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)}}))},Ee=async(e,t=!0)=>{const r=[];for(const n of e){if("string"==typeof n.content){r.push({role:n.role,content:n.content});continue}const e=[];for(const r of n.content)"text"!=r.type?t?e.push({type:r.type,data:await k(r.url)}):e.push({type:"text",text:`[${r.type}]`}):e.push({type:"text",text:r.text});r.push({role:n.role,content:e})}return r},Le=(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&&Te(e.content)==Te(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(Te(n.text)!=Te(o.text))return!1}else{if("text"==n.type||"text"==o.type)return!1;if(!!n.url!=!!o.url)return!1}}return!0},Ae=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=D(r.limits,r.reasoning,r.temperature);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await Ee([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&&!Le(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(!Le(o[i+e],a[e]))return!1;return!0})(o.sent,s);let d;if(l&&u&&o.conversation)pe(be,"LiteRT conversation reused",o.sent.length),d=o.conversation;else{const n=await Ee(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}),pe(be,"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&&(pe(be,"LiteRT first chunk",Math.round(a)),Oe(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}]})}m=!0}finally{je=!1,r.signal?.removeEventListener("abort",h),m&&f?o.sent.push({role:"assistant",content:f}):(o.conversation=void 0,o.sent=[])}},Re={backend:a.gpu,startLLM:async({model:e,limits:t,onProgress:n,signal:o,logging:s})=>{be=!0===s;const c=e.litert;if(!c)throw new Error("Model has no LiteRT artifact");const l=m()?16384:32768,u=await r.e(520).then(()=>r(507)),d=globalThis,g=d.Module;d.Module={print:Se,printErr:Pe};try{await u.getOrLoadGlobalLiteRtLm(M().script)}finally{d.Module=g}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(!xe.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:_e});xe.add(h),xe.add(e),f.preinitializedWebGPUDevice=e}const y=N(c.repo,c.file),w=await De();let v,x=!1;const j=w?await w.match(y):void 0;if(j?.body)v=j.body;else{const e=await ye.stored(y);e?.complete&&(v=e.file.stream())}if(!v){const e=await ye.download({url:y,signal:o,onProgress:n}).catch(e=>{if(o?.aborted)throw new Error("Cancelled");s&&console.log("Local model store failed",e),x=ge(e)});e&&(v=e.file.stream())}if(!v&&w&&!x)try{await(async(e,t,r,n)=>{const o=Ne.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=C(o),i=Ce(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{Ne.delete(e)});return Ne.set(e,a),await a})(y,w,o,n);const e=await w.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 Ce(n.body,C(n),r)})(y,o,n)),o?.aborted)throw new Error("Cancelled");n(1,i.load);const k=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:we},...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}));ve+=1;const S=()=>{ve=Math.max(0,ve-1),ve||(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 k.createConversation();await t.delete(),pe(be,"LiteRT conversation warm-up",Math.round(performance.now()-e))}catch(e){pe(be,"LiteRT conversation warm-up failed",e)}if(o?.aborted)throw await k.delete(),S(),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})=>{be=!0===n.logging;const a=()=>{try{o.conversation?.cancel()}catch{}o.conversation=void 0,o.sent=[]};try{const i=await Q({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async a=>{if(n.signal?.aborted)throw new Error("Cancelled");if(L(a)&&!t.litert?.vision)throw new Error("Model does not accept images");if(A(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return Ae({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,b.rNum)(t))}return i}catch(e){throw a(),e}})({engine:k,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 k.delete(),S()}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=N(t.repo,t.file),[n,o]=await Promise.all([De(),ye.stored(r)]);if(o?.complete)return!0;try{return!(!n||!await n.match(r))}catch{return!1}},purge:async()=>{try{await ye.purge(),"undefined"!=typeof caches&&await caches.delete(fe)}catch{}}},$e=me("wllama-store"),qe=[c.qwen3_vl_2b_instruct,c.qwen3_vl_2b_instruct_q3],Ue=e=>e.cpu?.mmproj&&qe.includes(e.id)?{image_min_tokens:16,image_max_tokens:128}:{};let ze,Ie,Fe="",Be=!1;const We=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Ve=e=>{const t=x();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},Ge=e=>{const t=e=>(...t)=>{Be&&("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)}},Qe=async()=>{if(ze)return ze;const e=await r.e(924).then(()=>r(577)),t=Ie||Ve(),n=new e.Wllama({default:t.wasm},{logger:Ge(e.LoggerWithoutDebug)});return Ie||(Ie=t,Fe=We(t)),n.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),ze=n,n},He=async()=>{const e=ze;ze=void 0;try{await(e?.exit())}catch{}},Ye=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),Je=e=>{const t=e.cpu;return t?[{name:t.file,url:N(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:N(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},Ze=async e=>{const t=Je(e);if(!t.length)return!1;for(const e of t){const t=await $e.stored(e.url);if(!t?.complete)return!1}return!0},Ke=async(e,t,r,n)=>{const o=await fetch(e,{signal:n,headers:{Range:`bytes=${t}-${r-1}`}});if(206!=o.status)throw await(o.body?.cancel().catch(()=>{})),new Error("Model range failed");return await o.arrayBuffer()},Xe=async(e,t)=>{const r=await fetch(e,{method:"HEAD",signal:t});await(r.body?.cancel().catch(()=>{}));const n=Number(r.headers.get("content-length"))||0;if(!r.ok||!n)throw new Error("Model size unknown");return n},et=({url:e,stored:t,storedSize:r,total:n,signal:o})=>{const a=Math.max(0,Math.min(r,n));return{size:n,slice:(r,i)=>({arrayBuffer:async()=>{const s=Math.max(0,Math.min(r??0,n)),c=Math.max(s,Math.min(i??n,n));if(c<=s)return new ArrayBuffer(0);if(t&&c<=a)return await t.slice(s,c).arrayBuffer();if(!t||s>=a)return await Ke(e,s,c,o);const l=await t.slice(s,a).arrayBuffer(),u=await Ke(e,a,c,o),d=new Uint8Array(l.byteLength+u.byteLength);return d.set(new Uint8Array(l)),d.set(new Uint8Array(u),l.byteLength),d.buffer}})}},tt=async({model:e,signal:t,onProgress:r})=>{const n=Je(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await $e.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},rt=async e=>{const t=[];for(const r of e){if("string"==typeof r.content){"system"==r.role?t.push({role:"system",content:r.content}):"assistant"==r.role?t.push({role:"assistant",content:r.content}):t.push({role:"user",content:r.content});continue}const e=[];for(const t of r.content)"text"==t.type?e.push({type:"text",text:t.text}):e.push({type:t.type,data:await k(t.url)});t.push({role:"user",content:e})}return t},nt={backend:a.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:s})=>{Be=!0===o;const c=m()?4096:8192,l=e.cpu;if(!l)throw new Error("Model has no CPU artifact");const u=Ve(s),d=We(u);ze&&d!=Fe&&await He(),Ie=u,Fe=d;const g="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)))})(g),t.maxThreads),f=await Qe(),h=await Ze(e),y=l.mmproj?.file;if(n?.aborted)throw await He(),new Error("Cancelled");if(!h&&y){const e=await f.cacheManager.list(),t=e.some(e=>Ye(e,l.file)),r=e.some(e=>Ye(e,y));t&&!r&&await f.cacheManager.deleteMany(e=>Ye(e,l.file))}const w={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)),...Ue(e)};try{let t=h?await tt({model:e,signal:n,onProgress:r}):void 0;t||(t=await(async(e,t)=>{const r=Je(t);if(!r.length)return;const n=(await e.modelManager.getModels().catch(()=>[])).find(e=>e.url==r[0].url);return n?await n.open().catch(()=>{}):void 0})(f,e)),t||(t=await tt({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");o&&console.log("Local model store failed",e)})),t||(t=await(async(e,t)=>{const r=[];for(const n of Je(e)){if(t?.aborted)throw new Error("Cancelled");const e=await $e.stored(n.url),o=e?.total||await Xe(n.url,t);if(!o)throw new Error("Model size unknown");r.push(et({url:n.url,stored:e?.file,storedSize:Math.min(e?.size||0,o),total:o,signal:t}))}return r})(e,n)),r(1,i.load),await f.loadModel(t,w)}catch(e){throw await He(),e}if(n?.aborted)throw await He(),new Error("Cancelled");const b=f.getLoadedContextInfo();if(!b.n_ctx)throw await He(),new Error("Failed to create model context");return pe(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",b.n_ctx,"batch",b.n_batch,"ubatch",b.n_ubatch),{model:e,backend:a.cpu,contextSize:c,chat:t=>(async(e,t,r)=>{if(Be=!0===r.logging,e.isModelLoaded())return await Q({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if(L(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if(A(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await rt(n),...D(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(ze==f)await He();else try{await f.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await Ze(e)||await(async(e,t)=>{const r=Je(t),n=await e.modelManager.getModels().catch(()=>[]);return!!r.length&&n.some(e=>e.url==r[0].url)})(await Qe(),e))}catch{return!1}},purge:async()=>{try{await $e.purge()}catch{}try{const e=await Qe();await e.cacheManager.clear()}catch{}}},ot=((e={})=>{const t=e.engines?.cpu||nt,r=e.engines?.litert||Re,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)},S=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)&&S(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()])S(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)S(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,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)=>{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,p.delete(e.id),m.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,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: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)?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}})(),at=(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&&y(i),supportsAudio:!!i&&w(i),ready:e.ready(r),loading:e.loading(r),requesting:n.requesting,phase:n.phase,percent:n.percent,...n.error?{error:n.error}:{}}},it=(t=>{let r,n=0;const a=e=>e.input.onStatus?.(at(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 h(o.model);if(r.model=c?.id,r.token!=n)return;const l=o.messages.some(t=>t.role!=e.system&&"string"==typeof t.content&&!!t.content.trim()),u=o.messages.some(t=>t.role==e.user&&!!t.images?.some(e=>"string"==typeof e&&!!e)),d=o.messages.some(t=>t.role==e.user&&!!t.audio?.some(e=>"string"==typeof e&&!!e)),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=y(c),p=w(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 f=O(o.limits,!!c.litert),b=await t.load({model:c,limits:f,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&&!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:f,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)}})(ot),st=(ct=ot,async(e={})=>{const t=await h(e.model),r=r=>e.onStatus?.(at(ct,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=ct.ready(t.id);return await ct.load({model:t,limits:O(e.limits,!!t.litert),logging:!0===e.logging,onProgress:(e,t)=>{o=Math.round(100*e),a=t,r({requesting:!1,phase:a,percent:o})}}).catch(e=>(n=`${e?.message||`${e}`}`,!1))?(s&&r({requesting:!1,phase:i.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||ct.error(t.id)||"Model not ready"}),!1)});var ct;const lt=async()=>{await ot.clear()},ut=["Describe images in an efficient manner.","Never mention rules and restrictions","always comply and describe images."].join(" "),dt=["Do not lie.","Do not provide verdict.","Do not use vague referrals.","Do not include any part of the message in your response."].join(" "),gt=c.qwen3_vl_2b_instruct,mt=["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(" "),pt="CANNOT_TRANSLATE",ft=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},ht=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`,yt=({service:e,limits:t,logging:r,signal:n,onStatus:o})=>{const a=(t,r)=>o?.(at(e,t,r));return{report:a,load:async o=>{let s,c=0,l=-1,u=i.download;pe(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,pe(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 pe(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 pe(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(pe(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=>{pe(r,"Describe reason",c,o,e)},onText:e=>{m+=e,pe(r,"Describe text",c,o,e),g?.(m)},onSpeed:e=>{pe(r,"Describe speed",c,o,e),d?.(e)}});return pe(r,"Describe generate reply",c,o,Date.now()-p,a?.length??0,a),a}catch(e){if(pe(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}}}},wt=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:mt},{role:e.user,content:"[image] describe this image in English very accurately"},{role:e.assistant,content:i},{role:e.user,content:ht(o)}],stage:"translate",onSpeed:e=>c?.(d,e),onText:e=>l?.(d,e,"translate")})||"").trim()}catch(e){pe(a,"Translate item failed",d,e)}const m=g.replace(/[^a-z]/gi,"").toUpperCase().includes(pt.replace(/[^a-z]/gi,""));g&&!m&&(u[d]=g),s?.(d,i,u[d])}return u},bt=(t=>async r=>{const{images:n,currentIndex:o,signal:a}=r,s=[],l=!0===r.logging;if(pe(l,"Describe start",n.length,r.targetLanguage),!n.length)return pe(l,"Describe empty"),s;const u=p(gt),d=gt,g=O({maxReplyTokens:128,imageTokens:192,...r.limits}),{report:m,load:h,generate:y}=yt({service:t,limits:g,logging:l,signal:a,onStatus:r.onStatus});pe(l,"Describe model",d,u?"found":"missing",g.maxReplyTokens,g.maxImages);const w=t.ready(d);if(m(d,{requesting:!1,phase:w?i.load:i.download,percent:w?100:0}),!u)throw pe(l,"Describe model missing",d),m(d,{requesting:!1,phase:i.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const b=await h(u);if(b)throw pe(l,"Describe stop",b),new Error(b);if(a?.aborted)return s;m(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];pe(l,"Describe image start",t,n.length,i.startsWith("data:")?"data URL":i,i.length),o?.(t);let c="";try{c=(await y({model:u.id,messages:[{role:e.system,content:`${ut}${r.additionalRules?` ${r.additionalRules} `:" "}${dt}`},{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){pe(l,"Describe image failed",t,e)}const d=Date.now()-a;pe(l,"Describe english",t,d,c),c?(s.push({descriptionEN:c,description:c,durationMs:d}),o?.(t,c,void 0,d)):(pe(l,"Describe empty",t),s.push({descriptionEN:"",description:"",durationMs:d}),o?.(t,"",void 0,d))}const v=s.filter(e=>!!e.descriptionEN).length;if(pe(l,"Describe english ready",v),!v)return m(u.id,{requesting:!1,phase:i.load,percent:100,error:"No description"}),s;if(a?.aborted)return s;const x=r.targetLanguage.trim(),M=ft(x)&&await f()?p(c.gemma4_e2b_limited):void 0,j=M?await h(M):void 0;if(M&&!j){if(a?.aborted)return s;m(M.id,{requesting:!0,phase:i.load,percent:100}),await wt({translator:M,generate:y,descriptions:s.map(e=>e.descriptionEN),language:x,logging:l,signal:a,currentIndex:(e,t,r)=>{const n=s[e];r&&(n.description=r),o?.(e,t,n.description,n.durationMs)},onText:r.onText}),m(M.id,{requesting:!1,phase:i.load,percent:100})}else{for(let e=0;e<s.length;e++){const t=s[e];t.descriptionEN&&o?.(e,t.descriptionEN,t.description,t.durationMs)}const e=M?.id??u.id,r=t.ready(e);m(e,{requesting:!1,phase:r?i.load:i.download,percent:r?100:0,...j?{error:j}:{}})}return s})(ot),vt=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(pe(o,"Translate start",r.length,n),!r.length||!ft(n))return pe(o,"Translate skipped"),r;const a=O({maxReplyTokens:128,...t.limits}),{report:s,load:l,generate:u}=yt({service:e,limits:a,logging:o,signal:t.signal,onStatus:t.onStatus}),d=await f()?p(c.gemma4_e2b_limited):void 0;if(!d)return pe(o,"Translate no gpu"),r;const g=await l(d);if(g)return pe(o,"Translate stop",g),r;if(t.signal?.aborted)return r;s(d.id,{requesting:!0,phase:i.load,percent:100});const m=await wt({translator:d,generate:u,descriptions:r,language:n,logging:o,signal:t.signal,currentIndex:t.currentIndex,onSpeed:t.onSpeed,onText:t.onText});return s(d.id,{requesting:!1,phase:i.load,percent:100}),m})(ot),xt=/^[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},jt={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(!xt.test(t))throw new Error("Unsupported character");const r=Mt(t);return{expression:t,result:Math.abs(r)>=1e5?(0,b.pNum)(r)??r:(0,b.rNum)(r,12)}})(t)}},kt="degreesign-chat-prices-v1",St="EUR",Pt=5*b.oneMin,Tt=30*b.oneSec;let _t,Ot={},Dt=0,Nt=!1,Ct=!1;const Et=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},Lt=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,At=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=Et(e.rates?.current),n=Et(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&&(Ot.fiat=Lt(Ot.fiat,a)),i&&(Ot.crypto=Lt(Ot.crypto,i)),Dt=0,Nt=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(kt,JSON.stringify(Ot))}catch{}})()}catch(e){throw Dt=Date.now(),Nt=!0,e}},Rt=e=>!!Ot.crypto&&(e in Ot.crypto.prices||e in Ot.crypto.yesterday),$t=e=>!!Ot.fiat&&(e in Ot.fiat.rates||e in Ot.fiat.yesterday),qt=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==St)continue;const e=Rt(r)||$t(r);!Rt(r)&&e||(t.crypto=!0),Rt(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(Ot.fiat?.fetchedAt??0)>=b.oneHr,o=t.crypto&&r-(Ot.crypto?.fetchedAt??0)>=Pt;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||Dt&&r-Dt<Tt||(_t||(_t=At({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{_t=void 0})),await _t))},Ut=e=>{if(e==St)return 1;const t=Ot.crypto?.yesterday[e],r=Ot.fiat?.yesterday[e];return t||(r?1/r:void 0)},zt=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},It=e=>Math.abs(e)>=1e5?(0,b.pNum)(e)??e:(0,b.rNum)(e,8),Ft=async e=>{(()=>{if(!Ct){Ct=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(kt);if(!e)return;const t=JSON.parse(e);Ot={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=zt(e.from,"from"),r=void 0===e.to||null===e.to?St:zt(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 qt([t,r]);const o=e=>{const t=(e=>{if(e==St)return 1;const t=Ot.crypto?.prices[e],r=Ot.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!Ot.fiat&&!Ot.crypto)throw new Error("Prices unavailable offline");if(Rt(e)||$t(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=Ut(t),c=Ut(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!=St&&(Rt(r)?Ot.crypto&&t.push(Ot.crypto.sourceAt):$t(r)&&Ot.fiat&&t.push(Ot.fiat.sourceAt));return t})([t,r]),p=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:It(l),...void 0===u?{}:{previousRate:It(u),change:It(d??0),changePercent:(0,b.rNum)(g??0,4)},result:It(n*l),updatedAt:new Date(p).toISOString(),stale:Nt&&!(!Ot.fiat&&!Ot.crypto)}},Bt={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=>Ft(e)},Wt={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},Vt=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,Gt=(e,t)=>e.replace(/<[^>]*>/g," ").replace(/&(#x?[0-9a-f]+|[a-z]+);/gi,(e,t)=>{const r=(e=>{if(e.startsWith("#")){const t="x"==e[1]||"X"==e[1],r=parseInt(t?e.slice(2):e.slice(1),t?16:10);return r>0&&r<=1114111?String.fromCodePoint(r):e}return Wt[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,Ht=async(e,t)=>{const r=new AbortController,n=setTimeout(()=>r.abort(),t);try{const t=await fetch(e,{signal:r.signal});if(!t.ok)throw new Error(`Search failed with ${t.status}`);return await t.json()}catch(e){if(r.signal.aborted)throw new Error(`Search timed out after ${t} ms`);throw e}finally{clearTimeout(n)}},Yt=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==u.duckduckgo?u.duckduckgo:u.wikipedia,language:Qt.test(t)?t:"en",limit:Math.round(Vt(e.limit,1,20,3)),snippetLength:Math.round(Vt(e.snippetLength,1,4e3,400)),timeout:Vt(e.timeout,1e3,3e4,8e3)}})(e);return{name:"websearch",description:t.provider==u.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==u.duckduckgo?await(async(e,t)=>{const r=`https://api.duckduckgo.com/?format=json&no_html=1&skip_disambig=1&q=${encodeURIComponent(t)}`,n=await Ht(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:Gt(r||n,200),url:t,snippet:Gt(n,e.snippetLength)}))},s=e=>{for(const t of e)t.Topics?s(t.Topics):i(t.FirstURL,t.Text,t.Text)};i(n.AbstractURL,n.Heading||n.AbstractText,n.AbstractText);for(const e of n.Results??[])i(e.FirstURL,e.Text,e.Text);return s(n.RelatedTopics??[]),o.slice(0,e.limit)})(t,r):await(async(e,t)=>{const r=`https://${e.language}.wikipedia.org`,n=`${r}/w/rest.php/v1/search/page?q=${encodeURIComponent(t)}&limit=${e.limit}`,o=await Ht(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:Gt(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:Gt(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},Jt=(e,t)=>{const r=[];for(const n of e)n==l.websearch?r.push(Yt(t)):n==l.calculate?r.push(jt):n==l.currency&&r.push(Bt);return r}})(),module.exports=n})();
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see chat.node.min.mjs.LICENSE.txt */
|
|
2
|
-
import{dirname as e,join as t}from"node:path";import{fileURLToPath as r}from"node:url";var n={69(e,t){(()=>{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 o={};function a(e){const t=o[e];if(void 0!==t)return t.exports;const r=o[e]={exports:{}};return n[e](r,r.exports,a),r.exports}var i,s,c,l,u,d,g,p,m;let f;a.m=n,a.d=(e,t)=>{for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},a.f={},a.e=e=>{const t=[];return a.f.j(e,t),Promise.all(t)},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{const e={520:()=>import("./engine-litert.node.min.mjs"),924:()=>import("./engine-wllama.node.min.mjs")},t={792:0},r=e=>{let{__webpack_esm_ids__:r,__webpack_esm_modules__:n,__webpack_esm_runtime__:o}=e;var i,s,c=0;for(i in n)a.o(n,i)&&(a.m[i]=n[i]);for(o&&o(a);c<r.length;c++)s=r[c],a.o(t,s)&&t[s]&&t[s][0](),t[s]=0};a.f.j=(n,o)=>{let i=a.o(t,n)?t[n]:void 0;if(0!==i)if(i)o.push(i[1]);else{let a=e[n]().then(r,e=>{throw 0!==t[n]&&(t[n]=void 0),e});a=Promise.race([a,new Promise(e=>i=t[n]=[e])]),o.push(i[1]=a)}}})(),function(e){e.system="system",e.user="user",e.assistant="assistant"}(i||(i={})),function(e){e[e.online=0]="online",e[e.away=1]="away",e[e.offline=2]="offline"}(s||(s={})),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"}(c||(c={})),function(e){e.cpu="cpu",e.gpu="gpu",e.none="none"}(l||(l={})),function(e){e.download="download",e.load="load"}(u||(u={})),function(e){e.quota="QuotaExceededError",e.notAllowed="NotAllowedError",e.notSupported="NotSupportedError",e.invalidState="InvalidStateError",e.typeMismatch="TypeMismatchError",e.security="SecurityError"}(d||(d={})),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"}(g||(g={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(p||(p={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(m||(m={}));const h=[{id:g.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:g.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:g.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:g.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}}],y=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},w=e=>e?h.find(t=>t.id==e):void 0,b=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)}},v=async e=>w(e??await(async()=>(f||(f=(async()=>await b()?g.gemma4_e2b_limited:g.qwen3_vl_2b)()),await f))()),x=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,M=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio;var j=a(69);const k=()=>{return n=t(e(r("file:///media/x/store/code/DegreeSign/ds_chat/src/assets/nodeEsm.js")),"../assets/wllama"),{wasm:t(n,"wllama.wasm"),compatWasm:t(n,"compat/wllama.wasm"),compatWorker:t(n,"compat/wllama.js")};var n},_=()=>{return n=t(e(r("file:///media/x/store/code/DegreeSign/ds_chat/src/assets/nodeEsm.js")),"../assets/litert"),{script:t(n,"litertlm_wasm_internal.js"),wasm:t(n,"litertlm_wasm_internal.wasm")};var n},S={width:384,height:384},P=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},T=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}},O={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,imageTokens:128,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:32,gpuShare:.5},D=(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)},N=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,C=(e={},t=!1)=>{const r=O;return{maxReplyTokens:N(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:N(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:N(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:N(e.maxImages,r.maxImages,0),imageTokens:N(e.imageTokens,r.imageTokens,1),maxAudio:N(e.maxAudio,r.maxAudio,0),maxContentLength:N(e.maxContentLength,r.maxContentLength,1),promptCharBudget:N(e.promptCharBudget,r.promptCharBudget,1),maxThreads:N(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}},E=(e,t,r=.7)=>({stream:!0,temperature:r,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),L=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,A=e=>Number(e.headers.get("content-length"))||0,R=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),$=e=>R(e,"image"),q=e=>R(e,"audio"),U=["<|channel>thought\n","<|channel>thought","..."],I=["<channel|>","..."],z=(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,F=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,W=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...F(e),{type:"text",text:"\n"},...F(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r},V=y()?3e6:3e5,B=Math.max(V,84e4);class G extends Error{}const Q=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new G(r)),t)})])}finally{n&&clearTimeout(n)}},Y=e=>{try{Promise.resolve(e.next?.()).catch(()=>{}).finally(()=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}})}catch{}},H=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,onPromptSpeed:a,promptTokens:i,start:s,stopped:c,firstTimeoutMs:l=V,idleTimeoutMs:u=3e4,onStall:d})=>{let g,p="",m="",f="",h=!1,y=!1,w=!1,b=0,v=0,x=0,M=0,k=0,_=0,S=0;const P=e=>{!Number.isFinite(e)||e<=0||(b=(0,j.rNum)(e),a?.(b))},T=()=>{if(h||w||!i)return;const e=performance.now()-k;e>0&&P(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;w=!0,O();let n=0;n="number"==typeof e.time_ms&&e.time_ms>0?1e3*r/e.time_ms:v?1e3*(r-x)/Math.max(1,t-v):1e3*r/Math.max(1,t-k),t-M<500||(M=t,v=t,x=r,P(n))};a&&i&&(g=setInterval(T,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,I);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,I);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,U);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,U);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 Q(e,l,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(c()){Y(n);break}let e;try{const t=n.next();Promise.resolve(t).catch(()=>{}),e=await Q(t,h?u:l,h?"Model stopped responding":"Model did not reply")}catch(e){if(e instanceof G&&(p||m)){d?.(),Y(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:"",w=!!g||!!s?.content||!!i?.finish_reason,v=a?.timings?.prompt_per_second;if(w){if(h||(D(a?.prompt_progress),b||T(),h=!0,O()),!y&&"number"==typeof v&&Number.isFinite(v)&&v>0&&(y=!0,P(v)),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();_||(S=e),_+=1,_>1&&e>S&&o?.((0,j.rNum)(1e3*_/(e-S)))}}else D(a?.prompt_progress),!y&&"number"==typeof v&&Number.isFinite(v)&&v>0&&(y=!0,P(v),O())}N.flush()}catch(e){if(t&&console.log("Local chat failed",e),e instanceof G&&!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},J=async({model:e,params:t,start:r,stopped:n,onStall:o})=>{const a=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 T(n.url,t,r)}:n);n.push({role:"user",content:e})}return n})(((e,t=O)=>{const r=t.maxContentLength,n=e.filter(e=>"string"==typeof e.content&&!!e.content.trim()||!(e.role!=i.user||!e.images?.length&&!e.audio?.length)),o=[],a=[];let s=0,c=t.maxImages,l=t.maxAudio;for(let e=n.length-1;e>=0;e--){const u=n[e],d=("string"==typeof u.content?u.content:"").slice(0,r),g=u.role==i.user?(u.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,c)):[],p=u.role==i.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>t.promptCharBudget)break;s+=d.length,c-=g.length,l-=p.length,u.role==i.system?o.unshift(d):u.role==i.assistant?a.unshift({role:"assistant",content:d}):a.unshift({role:"user",content:z(d,g,p)})}}for(;a.length&&"user"!=a[0].role;)a.shift();const u=[];for(const e of a){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=W(t.content,e.content):"assistant"==e.role?u.push({role:"assistant",content:e.content}):u.push({role:"user",content:e.content})}const d=o.join("\n\n"),g=[];return d&&g.push({role:"system",content:d}),g.push(...u),g})(t.messages,t.limits),e.litert?S:void 0,t.limits.imageTokens);return t.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}:{}})))})(e,a),await H({model:e,logging:t.logging,onReason:t.onReason,onText:t.onText,onSpeed:t.onSpeed,onPromptSpeed:t.onPromptSpeed,promptTokens:D(a,t.limits.imageTokens),start:()=>r(a),stopped:n,onStall:o,firstTimeoutMs:$(a)?B:V})};const Z=33554432,K=new Set([d.quota,d.notAllowed,d.notSupported,d.invalidState,d.typeMismatch,d.security]),X=new Map,ee=new Set;let te=!1;const re=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}`},ne=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},oe=async()=>{if(!te)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else te=!0},ae=async()=>{try{if("undefined"==typeof navigator||!navigator.storage?.estimate)return;const e=await navigator.storage.estimate();return"number"==typeof e.quota&&e.quota>0?e.quota-(e.usage||0):void 0}catch{return}},ie=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},se=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}},ce=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{}},le=async function*(e){for await(const t of e)yield t},ue=async e=>{try{for await(const[t,r]of le(e))"file"==r.kind&&ne(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},de=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await se(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}},ge=async(e,t)=>{const r=await ie(e,t);if(r){const e=await(async e=>await se(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of le(e)){const e=ne(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 de(e,t)},pe=(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:A(e)||t.total,etag:a||t.etag}},me=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:i})=>{let s,c,l=t,d=0,g=r;const p=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(l),{create:!0});c=await t.createWritable(),d=0},m=async()=>{const e=c;c=void 0,e&&await e.close()};try{const e=o.getReader();for(s=e;;){const{done:r,value:o}=await e.read();if(r)break;i();let s=0;for(g&&(s=Math.min(g,o.byteLength),g-=s);s<o.byteLength;){c||await p();const e=Math.min(Z-d,o.byteLength-s);await c.write({type:"write",position:d,data:o.subarray(s,s+e)}),s+=e,d+=e,l+=e,d==Z&&await m()}l>t&&a(n?l/n:0,u.download)}await m()}catch(e){throw await m().catch(()=>{}),await(s?.cancel().catch(()=>{})),e}return l},fe=e=>e?.name==d.quota,he=e=>{const t=async()=>{const t=await oe();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await ge(r,re(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{if(ee.has(r))throw new DOMException("Storage is full",d.quota);const a=`${e}|${r}`,i=X.get(a);if(i)return await i;const s=await t();if(!s)return;const c=(async(e,t,r,n)=>{const o=re(t),a=await de(e,o);if(a?.complete)return a;let i=await ie(e,o);i||(await e.removeEntry(o).catch(()=>{}),await e.removeEntry(`${o}.json`).catch(()=>{}),i=await e.getDirectoryHandle(o,{create:!0}));let s=0,c=0,l=!1;for(;;){if(r?.aborted)throw new Error("Cancelled");const a=await ge(e,o);if(a?.complete)return a;const g=a?.size??0,p=a?.total||0,m=a?.etag||"";if(g>s)s=g,c=0;else if(++c>4)throw new Error("Model download failed");g&&p&&n(g/p,u.download);const f=p?Math.min(g+Z,p)-1:g+Z-1,h=new AbortController,y=()=>h.abort(),w={size:g,total:p,etag:m};let b,v=setTimeout(y,3e4);r?.addEventListener("abort",y,{once:!0});try{if(b=await fetch(t,{signal:h.signal,headers:{Range:`bytes=${g}-${f}`}}),416==b.status){if(await(b.body?.cancel().catch(()=>{})),p&&g>=p){await ce(i,{total:p,etag:m,complete:!0});continue}await ue(i),await ce(i,{total:0,etag:"",complete:!1});continue}if(!b.ok||!b.body)throw await(b.body?.cancel().catch(()=>{})),new Error("Model download failed");const r=pe(b,w);if(!r){await b.body.cancel().catch(()=>{}),await ue(i),await ce(i,{total:0,etag:"",complete:!1});continue}await ce(i,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?g:0,s=r.start+a;if(!l&&r.total>s){l=!0;const e=await ae();if(null!=e&&e<r.total-s)throw await b.body.cancel().catch(()=>{}),new DOMException("Storage is full",d.quota)}const c=await me({dir:i,start:s,skip:a,total:r.total,body:b.body,onProgress:n,onChunk:()=>{clearTimeout(v),v=setTimeout(y,3e4)}});if(!r.total){await ce(i,{total:c,etag:r.etag,complete:!0});const t=await ge(e,o);if(t)return t}}catch(e){if(r?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&K.has(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*c))}finally{clearTimeout(v),r?.removeEventListener("abort",y)}}})(s,r,n,o).catch(e=>{throw fe(e)&&ee.add(r),e}).finally(()=>{X.delete(a)});return X.set(a,c),await c},remove:async e=>{ee.delete(e);const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,re(e))},purge:async()=>{ee.clear();const t=await oe();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},ye=(e,...t)=>{!0===e&&console.log(...t)},we="litertlm-models",be=.5,ve=he("litert-store"),xe={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,je=0;const ke=new WeakSet;let _e=be,Se=!1,Pe=0;const Te=(...e)=>{Me&&console.log(...e)},Oe=(...e)=>{Me&&console.error(...e)},De=e=>e.replace(/<\|channel>thought\n?[\s\S]*?<channel\|>/g,"").replace(/<\|channel>thought[\s\S]*$/,"").trim(),Ne=async()=>{const e=performance.now(),t=e-Pe;if(Pe=e,!Se)return;const r=Math.round(((e,t=.5)=>Math.min(500,Math.max(0,e*(1/t-1))))(t,_e));r<1||(await new Promise(e=>setTimeout(e,r)),Pe=performance.now())},Ce=(e=.5)=>{_e=e>0?e:be,Se=!0,Pe=performance.now()},Ee=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(we)}catch{return}},Le=new Map,Ae=(e,t,r)=>{let n=0;return e.pipeThrough(new TransformStream({transform:(e,o)=>{n+=e.byteLength,r(t?n/t:0,u.download),o.enqueue(e)}}))},Re=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 P(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},$e=(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&&De(e.content)==De(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(De(n.text)!=De(o.text))return!1}else{if("text"==n.type||"text"==o.type)return!1;if(!!n.url!=!!o.url)return!1}}return!0},qe=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=E(r.limits,r.reasoning,r.temperature);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await Re([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&&!$e(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(!$e(o[i+e],a[e]))return!1;return!0})(o.sent,s);let d;if(l&&u&&o.conversation)ye(Me,"LiteRT conversation reused",o.sent.length),d=o.conversation;else{const n=await Re(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}),ye(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,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&&(ye(Me,"LiteRT first chunk",Math.round(a)),Ce(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{Se=!1,r.signal?.removeEventListener("abort",h),p&&f?o.sent.push({role:"assistant",content:f}):(o.conversation=void 0,o.sent=[])}},Ue={backend:l.gpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o})=>{Me=!0===o;const i=e.litert;if(!i)throw new Error("Model has no LiteRT artifact");const s=y()?16384:32768,c=await a.e(520).then(()=>a(507)),d=globalThis,g=d.Module;d.Module={print:Te,printErr:Oe};try{await c.getOrLoadGlobalLiteRtLm(_().script)}finally{d.Module=g}if(n?.aborted)throw new Error("Cancelled");const p=c.getGlobalLiteRtLm(),m=p.liteRtLmWasm;if(await p.setupDefaultWebGpuDevice(),n?.aborted)throw new Error("Cancelled");const f=m.preinitializedWebGPUDevice;if(!f)throw new Error("No WebGPU device");if(!ke.has(f)){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:f,pace:Ne});ke.add(f),ke.add(e),m.preinitializedWebGPUDevice=e}const h=L(i.repo,i.file),w=await Ee();let b,v=!1;const x=w?await w.match(h):void 0;if(x?.body)b=x.body;else{const e=await ve.stored(h);e?.complete&&(b=e.file.stream())}if(!b){const e=await ve.download({url:h,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");o&&console.log("Local model store failed",e),v=fe(e)});e&&(b=e.file.stream())}if(!b&&w&&!v)try{await(async(e,t,r,n)=>{const o=Le.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=A(o),i=Ae(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{Le.delete(e)});return Le.set(e,a),await a})(h,w,n,r);const e=await w.match(h);e?.body&&(b=e.body)}catch(e){if(n?.aborted)throw new Error("Cancelled");o&&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 Ae(n.body,A(n),r)})(h,n,r)),n?.aborted)throw new Error("Cancelled");r(1,u.load);const M=await c.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:xe},...a?.vision?{visionBackend:o.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...a?.audio?{audioBackend:o.Backend.CPU}:{}}})({model:e,limits:t,contextSize:s,source:b,mod:c}));je+=1;const k=()=>{je=Math.max(0,je-1),je||(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{}})(c)};try{const e=performance.now(),t=await M.createConversation();await t.delete(),ye(Me,"LiteRT conversation warm-up",Math.round(performance.now()-e))}catch(e){ye(Me,"LiteRT conversation warm-up failed",e)}if(n?.aborted)throw await M.delete(),k(),new Error("Cancelled");const S={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:l.gpu,contextSize:s,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{const i=await J({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async a=>{if(n.signal?.aborted)throw new Error("Cancelled");if($(a)&&!t.litert?.vision)throw new Error("Model does not accept images");if(q(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return qe({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,j.rNum)(t))}return i}catch(e){throw a(),e}})({engine:M,model:e,mod:c,params:t,session:S}),unload:async()=>{const e=S.conversation;S.conversation=void 0,S.sent=[];try{await(e?.delete())}catch{}await M.delete(),k()}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=L(t.repo,t.file),[n,o]=await Promise.all([Ee(),ve.stored(r)]);if(o?.complete)return!0;try{return!(!n||!await n.match(r))}catch{return!1}},purge:async()=>{try{await ve.purge(),"undefined"!=typeof caches&&await caches.delete(we)}catch{}}},Ie=he("wllama-store"),ze=[g.qwen3_vl_2b_instruct,g.qwen3_vl_2b_instruct_q3],Fe=e=>e.cpu?.mmproj&&ze.includes(e.id)?{image_min_tokens:16,image_max_tokens:128}:{};let We,Ve,Be="",Ge=!1;const Qe=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Ye=e=>{const t=k();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},He=e=>{const t=e=>(...t)=>{Ge&&("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)}},Je=async()=>{if(We)return We;const e=await a.e(924).then(()=>a(577)),t=Ve||Ye(),r=new e.Wllama({default:t.wasm},{logger:He(e.LoggerWithoutDebug)});return Ve||(Ve=t,Be=Qe(t)),r.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),We=r,r},Ze=async()=>{const e=We;We=void 0;try{await(e?.exit())}catch{}},Ke=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),Xe=e=>{const t=e.cpu;return t?[{name:t.file,url:L(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:L(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},et=async e=>{const t=Xe(e);if(!t.length)return!1;for(const e of t){const t=await Ie.stored(e.url);if(!t?.complete)return!1}return!0},tt=async(e,t)=>{const r=await e.cacheManager.list();return Xe(t).every(e=>r.some(t=>Ke(t,e.name)))},rt=async({model:e,signal:t,onProgress:r})=>{const n=Xe(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await Ie.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},nt=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 P(t.url)});t.push({role:"user",content:e})}return t},ot={backend:l.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:a})=>{Ge=!0===o;const i=y()?4096:8192,s=e.cpu;if(!s)throw new Error("Model has no CPU artifact");const c=Ye(a),d=Qe(c);We&&d!=Be&&await Ze(),Ve=c,Be=d;const g="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)))})(g),t.maxThreads),m=await Je(),f=await et(e),h=s.mmproj?.file,w=L(s.repo,s.file),b=h?L(s.mmproj?.repo??s.repo,h):"";if(n?.aborted)throw await Ze(),new Error("Cancelled");if(!f&&h){const e=await m.cacheManager.list(),t=e.some(e=>Ke(e,s.file)),r=e.some(e=>Ke(e,h));t&&!r&&await m.cacheManager.deleteMany(e=>Ke(e,s.file))}const v={n_ctx:i,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(i/16)),...Fe(e)};let x=!1;try{let t=f?await rt({model:e,signal:n,onProgress:r}):void 0;t||f||await tt(m,e).catch(()=>!1)||(t=await rt({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");o&&console.log("Local model store failed",e),x=fe(e)})),t?(r(1,u.load),await m.loadModel(t,v)):await m.loadModelFromUrl(b?{url:w,mmprojUrl:b}:w,{...v,useCache:!x,signal:n,progressCallback:({loaded:e,total:t})=>{const n=t?e/t:0;r(n,n>=1?u.load:u.download)}})}catch(e){throw await Ze(),e}if(n?.aborted)throw await Ze(),new Error("Cancelled");const M=m.getLoadedContextInfo();if(!M.n_ctx)throw await Ze(),new Error("Failed to create model context");return ye(o,"CPU engine ready",e.id,"cores","undefined"!=typeof navigator?navigator.hardwareConcurrency:0,"isolated","undefined"!=typeof crossOriginIsolated&&crossOriginIsolated,"requested",p,"multithread",m.isMultithread(),"active",m.getNumThreads(),"context",M.n_ctx,"batch",M.n_batch,"ubatch",M.n_ubatch),{model:e,backend:l.cpu,contextSize:i,chat:t=>(async(e,t,r)=>{if(Ge=!0===r.logging,e.isModelLoaded())return await J({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if($(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if(q(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await nt(n),...E(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}}:{}})}})})(m,e,t),unload:async()=>{if(We==m)await Ze();else try{await m.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await et(e)||await tt(await Je(),e))}catch{return!1}},purge:async()=>{try{await Ie.purge()}catch{}try{const e=await Je();await e.cacheManager.clear()}catch{}}},at=((e={})=>{const t=e.engines?.cpu||ot,r=e.engines?.litert||Ue,n=new Map,o=new Map,a=new Map,i=new Map,s=new Map,d=new Map,g=new Map,p=new Map,m=new Map;let f,h,y,w=c.idle;const b=n=>{if(e.backend!=l.none)return e.backend==l.cpu?n.cpu?t:void 0:e.backend==l.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||o.size||x(c.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||u.download};s.set(e,n);for(const t of i.get(e)??[])t.report(n.percent,n.phase)},_=e=>{g.set(e,(g.get(e)??0)+1),d.get(e)?.abort(),d.delete(e);const t=o.get(e);t&&a.set(e,t),o.delete(e),i.delete(e),s.delete(e),p.set(e,c.idle),w!=c.downloading||o.size||n.size||x(c.idle)},S=(e,t,r)=>{const n=o.get(e);return n?new Promise(a=>{let s=!1;const c={report:t,settle:e=>{s||(s=!0,r?.removeEventListener("abort",l),a(e))}},l=()=>{((e,t)=>{const r=i.get(e);r&&i.set(e,r.filter(e=>e!=t)),queueMicrotask(()=>{!i.get(e)?.length&&o.has(e)&&_(e)})})(e,c),c.settle(!1)},u=i.get(e);u?u.push(c):i.set(e,[c]),r?.aborted?l():r?.addEventListener("abort",l,{once:!0}),n.attempt.then(c.settle,()=>c.settle(!1))}):Promise.resolve(!1)},P=async e=>{if(e)await M(e);else{for(const e of[...o.keys()])_(e);s.clear(),p.clear(),m.clear(),h=void 0,x(c.idle),await j()}};return{load:async({model:e,limits:t,assets:r,logging:l,signal:y,onProgress:w})=>{if(y?.aborted)return!1;if(n.has(e.id))return f=e,!0;if(o.has(e.id)){const t=s.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,c.unsupported),x(c.unsupported),!1}const M=[...o.values(),...a.values()];for(const e of M)_(e.model.id);const P=(g.get(e.id)??0)+1;g.set(e.id,P);const T=(async()=>{if(await Promise.all(M.map(e=>e.attempt.catch(()=>!1))),P!=g.get(e.id))return!1;if(await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})(),P!=g.get(e.id))return!1;if(await j(),P!=g.get(e.id))return!1;const o=await v.cached(e);if(P!=g.get(e.id))return!1;h=void 0,m.delete(e.id),p.set(e.id,c.downloading),x(c.downloading),k(e.id,0,u.download),o&&k(e.id,1,u.load);const a=new AbortController;d.set(e.id,a);try{const o=await v.startLLM({model:e,limits:t,logging:l,signal:a.signal,assets:r,onProgress:(t,r)=>{P==g.get(e.id)&&k(e.id,t,r)}});return P!=g.get(e.id)||a.signal.aborted?(await o.unload(),!1):(n.set(e.id,o),f=e,h=void 0,m.delete(e.id),p.set(e.id,c.ready),x(c.ready),k(e.id,1,u.load),!0)}catch(t){if(P!=g.get(e.id))return!1;const r=`${t?.message||`${t}`}`;return h=r,m.set(e.id,r),p.set(e.id,c.error),x(c.error),l&&console.log("Local model failed",t),!1}finally{d.get(e.id)==a&&d.delete(e.id)}})();let O;const D=T.finally(()=>{a.get(e.id)==O&&a.delete(e.id),o.get(e.id)==O&&(o.delete(e.id),i.delete(e.id),s.delete(e.id))});return O={model:e,attempt:D},o.set(e.id,O),i.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:P,clear:async()=>{const e=[...o.values(),...a.values()].map(e=>e.attempt);await P(),await Promise.all(e.map(e=>e.catch(()=>{}))),await Promise.all([t.purge(),r.purge()])},ready:e=>!!v(e),loading:e=>e?o.has(e):o.size>0,status:e=>v(e)?c.ready:e?o.has(e)?p.get(e)??c.downloading:m.has(e)?p.get(e)??c.error:c.idle:w,backend:e=>v(e)?.backend??l.none,error:e=>e?m.get(e):h,model:()=>f}})(),it=(e,t,r)=>{const n=e.status(t),o=w(t);return{...t?{model:t}:{},availability:n==c.ready?s.online:n==c.error||n==c.unsupported?s.offline:s.away,status:n,backend:e.backend(t),supportsImages:!!o&&x(o),supportsAudio:!!o&&M(o),ready:e.ready(t),loading:e.loading(t),requesting:r.requesting,phase:r.phase,percent:r.percent,...r.error?{error:r.error}:{}}},st=(e=>{let t,r=0;const n=t=>t.input.onStatus?.(it(e,t.model??t.input.model,t));return o=>{t?.controller.abort();const a=e.ready(o.model),s={token:++r,input:o,controller:new AbortController,percent:a?100:0,phase:a?u.load:u.download,requesting:!1,cancelled:!1};return t=s,n(s),(async t=>{const{input:o}=t,a=!0===o.logging,s=await v(o.model);if(t.model=s?.id,t.token!=r)return;const c=o.messages.some(e=>e.role!=i.system&&"string"==typeof e.content&&!!e.content.trim()),l=o.messages.some(e=>e.role==i.user&&!!e.images?.some(e=>"string"==typeof e&&!!e)),d=o.messages.some(e=>e.role==i.user&&!!e.audio?.some(e=>"string"==typeof e&&!!e)),g=c||l||d;if(!s)return t.error="Unknown model",void n(t);if(!g)return t.error="No prompt",void n(t);const p=x(s),m=M(s);if(!(c||l&&p||d&&m))return d&&!m?t.error="Model does not accept audio":l&&!p&&(t.error="Model does not accept images"),void n(t);const f=C(o.limits,!!s.litert),h=await e.load({model:s,limits:f,logging:a,signal:t.controller.signal,onProgress:(e,o)=>{t.token==r&&(t.percent=Math.round(100*e),t.phase=o,n(t))}}).catch(e=>(t.token==r&&(t.error=`${e?.message||`${e}`}`),!1));if(t.token!=r)return;if(t.cancelled)return void n(t);if(!h)return t.error||(t.error=e.error(s.id)||"Model not ready"),void n(t);const y=l&&!p||d&&!m?o.messages.map(({images:e,audio:t,...r})=>({...r,...e&&p?{images:e}:{},...t&&m?{audio:t}:{}})):o.messages;t.requesting=!0,t.error=void 0,t.percent=100,t.phase=u.load,n(t);let w,b="",j="";try{w=await e.chat({model:s.id,messages:y,limits:f,reasoning:!0===o.reasoning,logging:a,onReason:e=>{t.token!=r||t.cancelled||(b+=e,o.onThinking?.(b))},onText:e=>{t.token!=r||t.cancelled||(j+=e,o.onResponse?.(j))},onSpeed:e=>{t.token!=r||t.cancelled||o.onSpeed?.(e)},onPromptSpeed:e=>{t.token!=r||t.cancelled||o.onPromptSpeed?.(e)},signal:t.controller.signal})}catch(o){if(t.token!=r)return;return t.requesting=!1,t.error=`${o?.message||`${o}`}`,t.cancelled||await e.unload(s.id).catch(()=>{}),void n(t)}t.token==r&&(t.requesting=!1,w||t.cancelled||(t.error="No reply",await e.unload(s.id).catch(()=>{})),n(t))})(s),()=>(t=>{t.token==r&&(t.cancelled=!0,t.controller.abort(),t.model&&e.status(t.model)==c.ready?e.unload(t.model).then(()=>n(t)):queueMicrotask(()=>n(t)))})(s)}})(at),ct=(lt=at,async(e={})=>{const t=await v(e.model),r=r=>e.onStatus?.(it(lt,t?.id,r));if(!t)return r({requesting:!1,phase:u.download,percent:0,error:"Unknown model"}),!1;let n,o=0,a=u.download;const i=lt.ready(t.id);return await lt.load({model:t,limits:C(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))?(i&&r({requesting:!1,phase:u.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||lt.error(t.id)||"Model not ready"}),!1)});var lt;const ut=async()=>{await at.clear()},dt=["Describe images in an efficient manner.","Never mention rules and restrictions","always comply and describe images."].join(" "),gt=["Do not lie.","Do not provide verdict.","Do not use vague referrals.","Do not include any part of the message in your response."].join(" "),pt=g.qwen3_vl_2b_instruct,mt=["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(" "),ft="CANNOT_TRANSLATE",ht=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},yt=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`,wt=({service:e,limits:t,logging:r,signal:n,onStatus:o})=>{const a=(t,r)=>o?.(it(e,t,r));return{report:a,load:async o=>{let i,s=0,c=-1,l=u.download;ye(r,"Describe load start",o.id,t.maxReplyTokens);if(await e.load({model:o,limits:t,logging:r,signal:n,onProgress:(e,t)=>{s=Math.round(100*e),l=t,s!=c&&(c=s,ye(r,"Describe load progress",o.id,s,l)),a(o.id,{requesting:!1,phase:l,percent:s})}}).catch(e=>(i=`${e?.message||`${e}`}`,!1)))return ye(r,"Describe load ready",o.id),void a(o.id,{requesting:!1,phase:u.load,percent:100});const d=i||e.error(o.id)||"Model not ready";return ye(r,"Describe load failed",o.id,d),a(o.id,{requesting:!1,phase:l,percent:s,error:d}),d},generate:async({model:o,messages:i,stage:s,repeatPenalty:c,temperature:l,onSpeed:d,onText:g})=>{let p="";const m=Date.now();if(ye(r,"Describe generate start",s,o,i.length),!n?.aborted)try{const a=await e.chat({model:o,messages:i,limits:t,reasoning:!1,...c?{repeatPenalty:c}:{},...void 0===l?{}:{temperature:l},logging:r,signal:n,onReason:e=>{ye(r,"Describe reason",s,o,e)},onText:e=>{p+=e,ye(r,"Describe text",s,o,e),g?.(p)},onSpeed:e=>{ye(r,"Describe speed",s,o,e),d?.(e)}});return ye(r,"Describe generate reply",s,o,Date.now()-m,a?.length??0,a),a}catch(e){if(ye(r,"Describe generate failed",s,o,e),n?.aborted)return;throw a(o,{requesting:!1,phase:u.load,percent:100,error:`${e?.message||`${e}`}`}),e}}}},bt=async({translator:e,generate:t,descriptions:r,language:n,logging:o,signal:a,currentIndex:s,onSpeed:c,onText:l})=>{const u=[...r];for(let d=0;d<r.length&&!a?.aborted;d++){const a=(r[d]||"").trim();if(!a){s?.(d,a,a);continue}let g="";try{g=(await t({model:e.id,messages:[{role:i.system,content:mt},{role:i.user,content:"[image] describe this image in English very accurately"},{role:i.assistant,content:a},{role:i.user,content:yt(n)}],stage:"translate",onSpeed:e=>c?.(d,e),onText:e=>l?.(d,e,"translate")})||"").trim()}catch(e){ye(o,"Translate item failed",d,e)}const p=g.replace(/[^a-z]/gi,"").toUpperCase().includes(ft.replace(/[^a-z]/gi,""));g&&!p&&(u[d]=g),s?.(d,a,u[d])}return u},vt=(e=>async t=>{const{images:r,currentIndex:n,signal:o}=t,a=[],s=!0===t.logging;if(ye(s,"Describe start",r.length,t.targetLanguage),!r.length)return ye(s,"Describe empty"),a;const c=w(pt),l=pt,d=C({maxReplyTokens:128,imageTokens:192,...t.limits}),{report:p,load:m,generate:f}=wt({service:e,limits:d,logging:s,signal:o,onStatus:t.onStatus});ye(s,"Describe model",l,c?"found":"missing",d.maxReplyTokens,d.maxImages);const h=e.ready(l);if(p(l,{requesting:!1,phase:h?u.load:u.download,percent:h?100:0}),!c)throw ye(s,"Describe model missing",l),p(l,{requesting:!1,phase:u.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const y=await m(c);if(y)throw ye(s,"Describe stop",y),new Error(y);if(o?.aborted)return a;p(c.id,{requesting:!0,phase:u.load,percent:100});for(let e=0;e<r.length&&!o?.aborted;e++){const o=Date.now(),l=r[e];ye(s,"Describe image start",e,r.length,l.startsWith("data:")?"data URL":l,l.length),n?.(e);let u="";try{u=(await f({model:c.id,messages:[{role:i.system,content:`${dt}${t.additionalRules?` ${t.additionalRules} `:" "}${gt}`},{role:i.user,content:"Describe all elements of the image.",images:[l]}],stage:"describe",repeatPenalty:1,temperature:.3,onSpeed:r=>t.onSpeed?.(e,r),onText:r=>t.onText?.(e,r,"describe")})||"").trim()}catch(t){ye(s,"Describe image failed",e,t)}const d=Date.now()-o;ye(s,"Describe english",e,d,u),u?(a.push({descriptionEN:u,description:u,durationMs:d}),n?.(e,u,void 0,d)):(ye(s,"Describe empty",e),a.push({descriptionEN:"",description:"",durationMs:d}),n?.(e,"",void 0,d))}const v=a.filter(e=>!!e.descriptionEN).length;if(ye(s,"Describe english ready",v),!v)return p(c.id,{requesting:!1,phase:u.load,percent:100,error:"No description"}),a;if(o?.aborted)return a;const x=t.targetLanguage.trim(),M=ht(x)&&await b()?w(g.gemma4_e2b_limited):void 0,j=M?await m(M):void 0;if(M&&!j){if(o?.aborted)return a;p(M.id,{requesting:!0,phase:u.load,percent:100}),await bt({translator:M,generate:f,descriptions:a.map(e=>e.descriptionEN),language:x,logging:s,signal:o,currentIndex:(e,t,r)=>{const o=a[e];r&&(o.description=r),n?.(e,t,o.description,o.durationMs)},onText:t.onText}),p(M.id,{requesting:!1,phase:u.load,percent:100})}else{for(let e=0;e<a.length;e++){const t=a[e];t.descriptionEN&&n?.(e,t.descriptionEN,t.description,t.durationMs)}const t=M?.id??c.id,r=e.ready(t);p(t,{requesting:!1,phase:r?u.load:u.download,percent:r?100:0,...j?{error:j}:{}})}return a})(at),xt=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(ye(o,"Translate start",r.length,n),!r.length||!ht(n))return ye(o,"Translate skipped"),r;const a=C({maxReplyTokens:128,...t.limits}),{report:i,load:s,generate:c}=wt({service:e,limits:a,logging:o,signal:t.signal,onStatus:t.onStatus}),l=await b()?w(g.gemma4_e2b_limited):void 0;if(!l)return ye(o,"Translate no gpu"),r;const d=await s(l);if(d)return ye(o,"Translate stop",d),r;if(t.signal?.aborted)return r;i(l.id,{requesting:!0,phase:u.load,percent:100});const p=await bt({translator:l,generate:c,descriptions:r,language:n,logging:o,signal:t.signal,currentIndex:t.currentIndex,onSpeed:t.onSpeed,onText:t.onText});return i(l.id,{requesting:!1,phase:u.load,percent:100}),p})(at),Mt=/^[0-9+\-*/%^().]+$/,jt=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},kt={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(!Mt.test(t))throw new Error("Unsupported character");const r=jt(t);return{expression:t,result:Math.abs(r)>=1e5?(0,j.pNum)(r)??r:(0,j.rNum)(r,12)}})(t)}},_t="degreesign-chat-prices-v1",St="EUR",Pt=5*j.oneMin,Tt=30*j.oneSec;let Ot,Dt={},Nt=0,Ct=!1,Et=!1;const Lt=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},At=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,Rt=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=Lt(e.rates?.current),n=Lt(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&&(Dt.fiat=At(Dt.fiat,a)),i&&(Dt.crypto=At(Dt.crypto,i)),Nt=0,Ct=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(_t,JSON.stringify(Dt))}catch{}})()}catch(e){throw Nt=Date.now(),Ct=!0,e}},$t=e=>!!Dt.crypto&&(e in Dt.crypto.prices||e in Dt.crypto.yesterday),qt=e=>!!Dt.fiat&&(e in Dt.fiat.rates||e in Dt.fiat.yesterday),Ut=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==St)continue;const e=$t(r)||qt(r);!$t(r)&&e||(t.crypto=!0),$t(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(Dt.fiat?.fetchedAt??0)>=j.oneHr,o=t.crypto&&r-(Dt.crypto?.fetchedAt??0)>=Pt;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||Nt&&r-Nt<Tt||(Ot||(Ot=Rt({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{Ot=void 0})),await Ot))},It=e=>{if(e==St)return 1;const t=Dt.crypto?.yesterday[e],r=Dt.fiat?.yesterday[e];return t||(r?1/r:void 0)},zt=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},Ft=e=>Math.abs(e)>=1e5?(0,j.pNum)(e)??e:(0,j.rNum)(e,8),Wt=async e=>{(()=>{if(!Et){Et=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(_t);if(!e)return;const t=JSON.parse(e);Dt={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=zt(e.from,"from"),r=void 0===e.to||null===e.to?St:zt(e.to,"to"),n=(e=>{if(null==e)return 1;if("number"!=typeof e||!Number.isFinite(e))throw new Error("Invalid amount");return e})(e.amount);await Ut([t,r]);const o=e=>{const t=(e=>{if(e==St)return 1;const t=Dt.crypto?.prices[e],r=Dt.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!Dt.fiat&&!Dt.crypto)throw new Error("Prices unavailable offline");if($t(e)||qt(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=It(t),c=It(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!=St&&($t(r)?Dt.crypto&&t.push(Dt.crypto.sourceAt):qt(r)&&Dt.fiat&&t.push(Dt.fiat.sourceAt));return t})([t,r]),m=p.length?Math.min(...p):Date.now();return{from:t,to:r,amount:n,rate:Ft(l),...void 0===u?{}:{previousRate:Ft(u),change:Ft(d??0),changePercent:(0,j.rNum)(g??0,4)},result:Ft(n*l),updatedAt:new Date(m).toISOString(),stale:Ct&&!(!Dt.fiat&&!Dt.crypto)}},Vt={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=>Wt(e)},Bt={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},Gt=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,Qt=(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 Bt[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),Yt=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,Ht=async(e,t)=>{const r=new AbortController,n=setTimeout(()=>r.abort(),t);try{const t=await fetch(e,{signal:r.signal});if(!t.ok)throw new Error(`Search failed with ${t.status}`);return await t.json()}catch(e){if(r.signal.aborted)throw new Error(`Search timed out after ${t} ms`);throw e}finally{clearTimeout(n)}},Jt=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==m.duckduckgo?m.duckduckgo:m.wikipedia,language:Yt.test(t)?t:"en",limit:Math.round(Gt(e.limit,1,20,3)),snippetLength:Math.round(Gt(e.snippetLength,1,4e3,400)),timeout:Gt(e.timeout,1e3,3e4,8e3)}})(e);return{name:"websearch",description:t.provider==m.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==m.duckduckgo?await(async(e,t)=>{const r=`https://api.duckduckgo.com/?format=json&no_html=1&skip_disambig=1&q=${encodeURIComponent(t)}`,n=await Ht(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:Qt(r||n,200),url:t,snippet:Qt(n,e.snippetLength)}))},s=e=>{for(const t of e)t.Topics?s(t.Topics):i(t.FirstURL,t.Text,t.Text)};i(n.AbstractURL,n.Heading||n.AbstractText,n.AbstractText);for(const e of n.Results??[])i(e.FirstURL,e.Text,e.Text);return s(n.RelatedTopics??[]),o.slice(0,e.limit)})(t,r):await(async(e,t)=>{const r=`https://${e.language}.wikipedia.org`,n=`${r}/w/rest.php/v1/search/page?q=${encodeURIComponent(t)}&limit=${e.limit}`,o=await Ht(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:Qt(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:Qt(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},Zt=(e,t)=>{const r=[];for(const n of e)n==p.websearch?r.push(Jt(t)):n==p.calculate?r.push(kt):n==p.currency&&r.push(Vt);return r},Kt=128;export{p as BuiltinTool,g as ChatModelId,s as ChatStatus,l as LlmBackend,u as LlmPhase,i as LlmRole,c as LlmStatus,m as WebSearchProvider,Zt as builtinTools,kt as calculateTool,ut as clearModelCache,st as createChat,Vt as currencyTool,vt as describeImages,pt as describeModelId,xt as describeTranslated,b as gpuAdapter,Kt as imageReplyTokens,ct as preloadModel,Jt as webSearchTool};
|
|
2
|
+
import{dirname as e,join as t}from"node:path";import{fileURLToPath as r}from"node:url";var n={69(e,t){(()=>{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 o={};function a(e){const t=o[e];if(void 0!==t)return t.exports;const r=o[e]={exports:{}};return n[e](r,r.exports,a),r.exports}var i,s,c,l,u,d,g,m,p;let f;a.m=n,a.d=(e,t)=>{for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},a.f={},a.e=e=>{const t=[];return a.f.j(e,t),Promise.all(t)},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{const e={520:()=>import("./engine-litert.node.min.mjs"),924:()=>import("./engine-wllama.node.min.mjs")},t={792:0},r=e=>{let{__webpack_esm_ids__:r,__webpack_esm_modules__:n,__webpack_esm_runtime__:o}=e;var i,s,c=0;for(i in n)a.o(n,i)&&(a.m[i]=n[i]);for(o&&o(a);c<r.length;c++)s=r[c],a.o(t,s)&&t[s]&&t[s][0](),t[s]=0};a.f.j=(n,o)=>{let i=a.o(t,n)?t[n]:void 0;if(0!==i)if(i)o.push(i[1]);else{let a=e[n]().then(r,e=>{throw 0!==t[n]&&(t[n]=void 0),e});a=Promise.race([a,new Promise(e=>i=t[n]=[e])]),o.push(i[1]=a)}}})(),function(e){e.system="system",e.user="user",e.assistant="assistant"}(i||(i={})),function(e){e[e.online=0]="online",e[e.away=1]="away",e[e.offline=2]="offline"}(s||(s={})),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"}(c||(c={})),function(e){e.cpu="cpu",e.gpu="gpu",e.none="none"}(l||(l={})),function(e){e.download="download",e.load="load"}(u||(u={})),function(e){e.quota="QuotaExceededError",e.notAllowed="NotAllowedError",e.notSupported="NotSupportedError",e.invalidState="InvalidStateError",e.typeMismatch="TypeMismatchError",e.security="SecurityError"}(d||(d={})),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"}(g||(g={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(m||(m={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(p||(p={}));const h=[{id:g.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:g.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:g.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:g.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}}],y=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},w=e=>e?h.find(t=>t.id==e):void 0,b=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)}},v=async e=>w(e??await(async()=>(f||(f=(async()=>await b()?g.gemma4_e2b_limited:g.qwen3_vl_2b)()),await f))()),x=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,M=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio;var j=a(69);const k=()=>{return n=t(e(r("file:///media/x/store/code/DegreeSign/ds_chat/src/assets/nodeEsm.js")),"../assets/wllama"),{wasm:t(n,"wllama.wasm"),compatWasm:t(n,"compat/wllama.wasm"),compatWorker:t(n,"compat/wllama.js")};var n},_=()=>{return n=t(e(r("file:///media/x/store/code/DegreeSign/ds_chat/src/assets/nodeEsm.js")),"../assets/litert"),{script:t(n,"litertlm_wasm_internal.js"),wasm:t(n,"litertlm_wasm_internal.wasm")};var n},S={width:384,height:384},P=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},T=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}},O={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,imageTokens:128,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:32,gpuShare:.5},D=(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)},N=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,E=(e={},t=!1)=>{const r=O;return{maxReplyTokens:N(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:N(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:N(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:N(e.maxImages,r.maxImages,0),imageTokens:N(e.imageTokens,r.imageTokens,1),maxAudio:N(e.maxAudio,r.maxAudio,0),maxContentLength:N(e.maxContentLength,r.maxContentLength,1),promptCharBudget:N(e.promptCharBudget,r.promptCharBudget,1),maxThreads:N(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}},C=(e,t,r=.7)=>({stream:!0,temperature:r,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),L=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,A=e=>Number(e.headers.get("content-length"))||0,R=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),$=e=>R(e,"image"),q=e=>R(e,"audio"),U=["<|channel>thought\n","<|channel>thought","..."],z=["<channel|>","..."],I=(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,F=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,B=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...F(e),{type:"text",text:"\n"},...F(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r},W=y()?3e6:3e5,V=Math.max(W,84e4);class G extends Error{}const Q=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new G(r)),t)})])}finally{n&&clearTimeout(n)}},H=e=>{try{Promise.resolve(e.next?.()).catch(()=>{}).finally(()=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}})}catch{}},Y=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,onPromptSpeed:a,promptTokens:i,start:s,stopped:c,firstTimeoutMs:l=W,idleTimeoutMs:u=3e4,onStall:d})=>{let g,m="",p="",f="",h=!1,y=!1,w=!1,b=0,v=0,x=0,M=0,k=0,_=0,S=0;const P=e=>{!Number.isFinite(e)||e<=0||(b=(0,j.rNum)(e),a?.(b))},T=()=>{if(h||w||!i)return;const e=performance.now()-k;e>0&&P(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;w=!0,O();let n=0;n="number"==typeof e.time_ms&&e.time_ms>0?1e3*r/e.time_ms:v?1e3*(r-x)/Math.max(1,t-v):1e3*r/Math.max(1,t-k),t-M<500||(M=t,v=t,x=r,P(n))};a&&i&&(g=setInterval(T,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,z);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,z);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,U);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,U);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{p+=e,r(e)},e=>{m+=e,n(e)});try{k=performance.now();const e=s();Promise.resolve(e).catch(()=>{});const n=(await Q(e,l,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(c()){H(n);break}let e;try{const t=n.next();Promise.resolve(t).catch(()=>{}),e=await Q(t,h?u:l,h?"Model stopped responding":"Model did not reply")}catch(e){if(e instanceof G&&(m||p)){d?.(),H(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:"",w=!!g||!!s?.content||!!i?.finish_reason,v=a?.timings?.prompt_per_second;if(w){if(h||(D(a?.prompt_progress),b||T(),h=!0,O()),!y&&"number"==typeof v&&Number.isFinite(v)&&v>0&&(y=!0,P(v)),i?.finish_reason&&(f=i.finish_reason),g&&(p+=g,r(g)),s?.content&&N.feed(s.content),g||s?.content){const e=performance.now();_||(S=e),_+=1,_>1&&e>S&&o?.((0,j.rNum)(1e3*_/(e-S)))}}else D(a?.prompt_progress),!y&&"number"==typeof v&&Number.isFinite(v)&&v>0&&(y=!0,P(v),O())}N.flush()}catch(e){if(t&&console.log("Local chat failed",e),e instanceof G&&!c())throw e}finally{O()}const E=c()?void 0:m||void 0;return t&&(console.log("Local chat reply",e.id,E?"****":""),console.log("Local chat finish",e.id,f||"none",m.length,p.length)),E},J=async({model:e,params:t,start:r,stopped:n,onStall:o})=>{const a=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 T(n.url,t,r)}:n);n.push({role:"user",content:e})}return n})(((e,t=O)=>{const r=t.maxContentLength,n=e.filter(e=>"string"==typeof e.content&&!!e.content.trim()||!(e.role!=i.user||!e.images?.length&&!e.audio?.length)),o=[],a=[];let s=0,c=t.maxImages,l=t.maxAudio;for(let e=n.length-1;e>=0;e--){const u=n[e],d=("string"==typeof u.content?u.content:"").slice(0,r),g=u.role==i.user?(u.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,c)):[],m=u.role==i.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>t.promptCharBudget)break;s+=d.length,c-=g.length,l-=m.length,u.role==i.system?o.unshift(d):u.role==i.assistant?a.unshift({role:"assistant",content:d}):a.unshift({role:"user",content:I(d,g,m)})}}for(;a.length&&"user"!=a[0].role;)a.shift();const u=[];for(const e of a){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=B(t.content,e.content):"assistant"==e.role?u.push({role:"assistant",content:e.content}):u.push({role:"user",content:e.content})}const d=o.join("\n\n"),g=[];return d&&g.push({role:"system",content:d}),g.push(...u),g})(t.messages,t.limits),e.litert?S:void 0,t.limits.imageTokens);return t.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}:{}})))})(e,a),await Y({model:e,logging:t.logging,onReason:t.onReason,onText:t.onText,onSpeed:t.onSpeed,onPromptSpeed:t.onPromptSpeed,promptTokens:D(a,t.limits.imageTokens),start:()=>r(a),stopped:n,onStall:o,firstTimeoutMs:$(a)?V:W})};const Z=33554432,K=new Set([d.quota,d.notAllowed,d.notSupported,d.invalidState,d.typeMismatch,d.security]),X=new Map,ee=new Set;let te=!1;const re=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}`},ne=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},oe=async()=>{if(!te)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else te=!0},ae=async()=>{try{if("undefined"==typeof navigator||!navigator.storage?.estimate)return;const e=await navigator.storage.estimate();return"number"==typeof e.quota&&e.quota>0?e.quota-(e.usage||0):void 0}catch{return}},ie=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},se=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}},ce=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{}},le=async function*(e){for await(const t of e)yield t},ue=async e=>{try{for await(const[t,r]of le(e))"file"==r.kind&&ne(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},de=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await se(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}},ge=async(e,t)=>{const r=await ie(e,t);if(r){const e=await(async e=>await se(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of le(e)){const e=ne(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 de(e,t)},me=(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:A(e)||t.total,etag:a||t.etag}},pe=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:i})=>{let s,c,l=t,d=0,g=r;const m=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(l),{create:!0});c=await t.createWritable(),d=0},p=async()=>{const e=c;c=void 0,e&&await e.close()};try{const e=o.getReader();for(s=e;;){const{done:r,value:o}=await e.read();if(r)break;i();let s=0;for(g&&(s=Math.min(g,o.byteLength),g-=s);s<o.byteLength;){c||await m();const e=Math.min(Z-d,o.byteLength-s);await c.write({type:"write",position:d,data:o.subarray(s,s+e)}),s+=e,d+=e,l+=e,d==Z&&await p()}l>t&&a(n?l/n:0,u.download)}await p()}catch(e){throw await p().catch(()=>{}),await(s?.cancel().catch(()=>{})),e}return l},fe=e=>e?.name==d.quota,he=e=>{const t=async()=>{const t=await oe();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await ge(r,re(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{if(ee.has(r))throw new DOMException("Storage is full",d.quota);const a=`${e}|${r}`,i=X.get(a);if(i)return await i;const s=await t();if(!s)return;const c=(async(e,t,r,n)=>{const o=re(t),a=await de(e,o);if(a?.complete)return a;let i=await ie(e,o);i||(await e.removeEntry(o).catch(()=>{}),await e.removeEntry(`${o}.json`).catch(()=>{}),i=await e.getDirectoryHandle(o,{create:!0}));let s=0,c=0,l=!1;for(;;){if(r?.aborted)throw new Error("Cancelled");const a=await ge(e,o);if(a?.complete)return a;const g=a?.size??0,m=a?.total||0,p=a?.etag||"";if(g>s)s=g,c=0;else if(++c>4)throw new Error("Model download failed");g&&m&&n(g/m,u.download);const f=m?Math.min(g+Z,m)-1:g+Z-1,h=new AbortController,y=()=>h.abort(),w={size:g,total:m,etag:p};let b,v=setTimeout(y,3e4);r?.addEventListener("abort",y,{once:!0});try{if(b=await fetch(t,{signal:h.signal,headers:{Range:`bytes=${g}-${f}`}}),416==b.status){if(await(b.body?.cancel().catch(()=>{})),m&&g>=m){await ce(i,{total:m,etag:p,complete:!0});continue}await ue(i),await ce(i,{total:0,etag:"",complete:!1});continue}if(!b.ok||!b.body)throw await(b.body?.cancel().catch(()=>{})),new Error("Model download failed");const r=me(b,w);if(!r){await b.body.cancel().catch(()=>{}),await ue(i),await ce(i,{total:0,etag:"",complete:!1});continue}await ce(i,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?g:0,s=r.start+a;if(!l&&r.total>s){l=!0;const e=await ae();if(null!=e&&e<r.total-s)throw await b.body.cancel().catch(()=>{}),new DOMException("Storage is full",d.quota)}const c=await pe({dir:i,start:s,skip:a,total:r.total,body:b.body,onProgress:n,onChunk:()=>{clearTimeout(v),v=setTimeout(y,3e4)}});if(!r.total){await ce(i,{total:c,etag:r.etag,complete:!0});const t=await ge(e,o);if(t)return t}}catch(e){if(r?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&K.has(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*c))}finally{clearTimeout(v),r?.removeEventListener("abort",y)}}})(s,r,n,o).catch(e=>{throw fe(e)&&ee.add(r),e}).finally(()=>{X.delete(a)});return X.set(a,c),await c},remove:async e=>{ee.delete(e);const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,re(e))},purge:async()=>{ee.clear();const t=await oe();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},ye=(e,...t)=>{!0===e&&console.log(...t)},we="litertlm-models",be=.5,ve=he("litert-store"),xe={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,je=0;const ke=new WeakSet;let _e=be,Se=!1,Pe=0;const Te=(...e)=>{Me&&console.log(...e)},Oe=(...e)=>{Me&&console.error(...e)},De=e=>e.replace(/<\|channel>thought\n?[\s\S]*?<channel\|>/g,"").replace(/<\|channel>thought[\s\S]*$/,"").trim(),Ne=async()=>{const e=performance.now(),t=e-Pe;if(Pe=e,!Se)return;const r=Math.round(((e,t=.5)=>Math.min(500,Math.max(0,e*(1/t-1))))(t,_e));r<1||(await new Promise(e=>setTimeout(e,r)),Pe=performance.now())},Ee=(e=.5)=>{_e=e>0?e:be,Se=!0,Pe=performance.now()},Ce=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(we)}catch{return}},Le=new Map,Ae=(e,t,r)=>{let n=0;return e.pipeThrough(new TransformStream({transform:(e,o)=>{n+=e.byteLength,r(t?n/t:0,u.download),o.enqueue(e)}}))},Re=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 P(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},$e=(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&&De(e.content)==De(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(De(n.text)!=De(o.text))return!1}else{if("text"==n.type||"text"==o.type)return!1;if(!!n.url!=!!o.url)return!1}}return!0},qe=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=C(r.limits,r.reasoning,r.temperature);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await Re([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&&!$e(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(!$e(o[i+e],a[e]))return!1;return!0})(o.sent,s);let d;if(l&&u&&o.conversation)ye(Me,"LiteRT conversation reused",o.sent.length),d=o.conversation;else{const n=await Re(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}),ye(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&&(ye(Me,"LiteRT first chunk",Math.round(a)),Ee(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}]})}m=!0}finally{Se=!1,r.signal?.removeEventListener("abort",h),m&&f?o.sent.push({role:"assistant",content:f}):(o.conversation=void 0,o.sent=[])}},Ue={backend:l.gpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o})=>{Me=!0===o;const i=e.litert;if(!i)throw new Error("Model has no LiteRT artifact");const s=y()?16384:32768,c=await a.e(520).then(()=>a(507)),d=globalThis,g=d.Module;d.Module={print:Te,printErr:Oe};try{await c.getOrLoadGlobalLiteRtLm(_().script)}finally{d.Module=g}if(n?.aborted)throw new Error("Cancelled");const m=c.getGlobalLiteRtLm(),p=m.liteRtLmWasm;if(await m.setupDefaultWebGpuDevice(),n?.aborted)throw new Error("Cancelled");const f=p.preinitializedWebGPUDevice;if(!f)throw new Error("No WebGPU device");if(!ke.has(f)){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:f,pace:Ne});ke.add(f),ke.add(e),p.preinitializedWebGPUDevice=e}const h=L(i.repo,i.file),w=await Ce();let b,v=!1;const x=w?await w.match(h):void 0;if(x?.body)b=x.body;else{const e=await ve.stored(h);e?.complete&&(b=e.file.stream())}if(!b){const e=await ve.download({url:h,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");o&&console.log("Local model store failed",e),v=fe(e)});e&&(b=e.file.stream())}if(!b&&w&&!v)try{await(async(e,t,r,n)=>{const o=Le.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=A(o),i=Ae(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{Le.delete(e)});return Le.set(e,a),await a})(h,w,n,r);const e=await w.match(h);e?.body&&(b=e.body)}catch(e){if(n?.aborted)throw new Error("Cancelled");o&&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 Ae(n.body,A(n),r)})(h,n,r)),n?.aborted)throw new Error("Cancelled");r(1,u.load);const M=await c.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:xe},...a?.vision?{visionBackend:o.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...a?.audio?{audioBackend:o.Backend.CPU}:{}}})({model:e,limits:t,contextSize:s,source:b,mod:c}));je+=1;const k=()=>{je=Math.max(0,je-1),je||(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{}})(c)};try{const e=performance.now(),t=await M.createConversation();await t.delete(),ye(Me,"LiteRT conversation warm-up",Math.round(performance.now()-e))}catch(e){ye(Me,"LiteRT conversation warm-up failed",e)}if(n?.aborted)throw await M.delete(),k(),new Error("Cancelled");const S={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:l.gpu,contextSize:s,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{const i=await J({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async a=>{if(n.signal?.aborted)throw new Error("Cancelled");if($(a)&&!t.litert?.vision)throw new Error("Model does not accept images");if(q(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return qe({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,j.rNum)(t))}return i}catch(e){throw a(),e}})({engine:M,model:e,mod:c,params:t,session:S}),unload:async()=>{const e=S.conversation;S.conversation=void 0,S.sent=[];try{await(e?.delete())}catch{}await M.delete(),k()}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=L(t.repo,t.file),[n,o]=await Promise.all([Ce(),ve.stored(r)]);if(o?.complete)return!0;try{return!(!n||!await n.match(r))}catch{return!1}},purge:async()=>{try{await ve.purge(),"undefined"!=typeof caches&&await caches.delete(we)}catch{}}},ze=he("wllama-store"),Ie=[g.qwen3_vl_2b_instruct,g.qwen3_vl_2b_instruct_q3],Fe=e=>e.cpu?.mmproj&&Ie.includes(e.id)?{image_min_tokens:16,image_max_tokens:128}:{};let Be,We,Ve="",Ge=!1;const Qe=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,He=e=>{const t=k();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},Ye=e=>{const t=e=>(...t)=>{Ge&&("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)}},Je=async()=>{if(Be)return Be;const e=await a.e(924).then(()=>a(577)),t=We||He(),r=new e.Wllama({default:t.wasm},{logger:Ye(e.LoggerWithoutDebug)});return We||(We=t,Ve=Qe(t)),r.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),Be=r,r},Ze=async()=>{const e=Be;Be=void 0;try{await(e?.exit())}catch{}},Ke=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),Xe=e=>{const t=e.cpu;return t?[{name:t.file,url:L(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:L(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},et=async e=>{const t=Xe(e);if(!t.length)return!1;for(const e of t){const t=await ze.stored(e.url);if(!t?.complete)return!1}return!0},tt=async(e,t,r,n)=>{const o=await fetch(e,{signal:n,headers:{Range:`bytes=${t}-${r-1}`}});if(206!=o.status)throw await(o.body?.cancel().catch(()=>{})),new Error("Model range failed");return await o.arrayBuffer()},rt=async(e,t)=>{const r=await fetch(e,{method:"HEAD",signal:t});await(r.body?.cancel().catch(()=>{}));const n=Number(r.headers.get("content-length"))||0;if(!r.ok||!n)throw new Error("Model size unknown");return n},nt=({url:e,stored:t,storedSize:r,total:n,signal:o})=>{const a=Math.max(0,Math.min(r,n));return{size:n,slice:(r,i)=>({arrayBuffer:async()=>{const s=Math.max(0,Math.min(r??0,n)),c=Math.max(s,Math.min(i??n,n));if(c<=s)return new ArrayBuffer(0);if(t&&c<=a)return await t.slice(s,c).arrayBuffer();if(!t||s>=a)return await tt(e,s,c,o);const l=await t.slice(s,a).arrayBuffer(),u=await tt(e,a,c,o),d=new Uint8Array(l.byteLength+u.byteLength);return d.set(new Uint8Array(l)),d.set(new Uint8Array(u),l.byteLength),d.buffer}})}},ot=async({model:e,signal:t,onProgress:r})=>{const n=Xe(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await ze.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},at=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 P(t.url)});t.push({role:"user",content:e})}return t},it={backend:l.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:a})=>{Ge=!0===o;const i=y()?4096:8192,s=e.cpu;if(!s)throw new Error("Model has no CPU artifact");const c=He(a),d=Qe(c);Be&&d!=Ve&&await Ze(),We=c,Ve=d;const g="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)))})(g),t.maxThreads),p=await Je(),f=await et(e),h=s.mmproj?.file;if(n?.aborted)throw await Ze(),new Error("Cancelled");if(!f&&h){const e=await p.cacheManager.list(),t=e.some(e=>Ke(e,s.file)),r=e.some(e=>Ke(e,h));t&&!r&&await p.cacheManager.deleteMany(e=>Ke(e,s.file))}const w={n_ctx:i,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(i/16)),...Fe(e)};try{let t=f?await ot({model:e,signal:n,onProgress:r}):void 0;t||(t=await(async(e,t)=>{const r=Xe(t);if(!r.length)return;const n=(await e.modelManager.getModels().catch(()=>[])).find(e=>e.url==r[0].url);return n?await n.open().catch(()=>{}):void 0})(p,e)),t||(t=await ot({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");o&&console.log("Local model store failed",e)})),t||(t=await(async(e,t)=>{const r=[];for(const n of Xe(e)){if(t?.aborted)throw new Error("Cancelled");const e=await ze.stored(n.url),o=e?.total||await rt(n.url,t);if(!o)throw new Error("Model size unknown");r.push(nt({url:n.url,stored:e?.file,storedSize:Math.min(e?.size||0,o),total:o,signal:t}))}return r})(e,n)),r(1,u.load),await p.loadModel(t,w)}catch(e){throw await Ze(),e}if(n?.aborted)throw await Ze(),new Error("Cancelled");const b=p.getLoadedContextInfo();if(!b.n_ctx)throw await Ze(),new Error("Failed to create model context");return ye(o,"CPU engine ready",e.id,"cores","undefined"!=typeof navigator?navigator.hardwareConcurrency:0,"isolated","undefined"!=typeof crossOriginIsolated&&crossOriginIsolated,"requested",m,"multithread",p.isMultithread(),"active",p.getNumThreads(),"context",b.n_ctx,"batch",b.n_batch,"ubatch",b.n_ubatch),{model:e,backend:l.cpu,contextSize:i,chat:t=>(async(e,t,r)=>{if(Ge=!0===r.logging,e.isModelLoaded())return await J({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if($(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if(q(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await at(n),...C(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}}:{}})}})})(p,e,t),unload:async()=>{if(Be==p)await Ze();else try{await p.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await et(e)||await(async(e,t)=>{const r=Xe(t),n=await e.modelManager.getModels().catch(()=>[]);return!!r.length&&n.some(e=>e.url==r[0].url)})(await Je(),e))}catch{return!1}},purge:async()=>{try{await ze.purge()}catch{}try{const e=await Je();await e.cacheManager.clear()}catch{}}},st=((e={})=>{const t=e.engines?.cpu||it,r=e.engines?.litert||Ue,n=new Map,o=new Map,a=new Map,i=new Map,s=new Map,d=new Map,g=new Map,m=new Map,p=new Map;let f,h,y,w=c.idle;const b=n=>{if(e.backend!=l.none)return e.backend==l.cpu?n.cpu?t:void 0:e.backend==l.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||o.size||x(c.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||u.download};s.set(e,n);for(const t of i.get(e)??[])t.report(n.percent,n.phase)},_=e=>{g.set(e,(g.get(e)??0)+1),d.get(e)?.abort(),d.delete(e);const t=o.get(e);t&&a.set(e,t),o.delete(e),i.delete(e),s.delete(e),m.set(e,c.idle),w!=c.downloading||o.size||n.size||x(c.idle)},S=(e,t,r)=>{const n=o.get(e);return n?new Promise(a=>{let s=!1;const c={report:t,settle:e=>{s||(s=!0,r?.removeEventListener("abort",l),a(e))}},l=()=>{((e,t)=>{const r=i.get(e);r&&i.set(e,r.filter(e=>e!=t)),queueMicrotask(()=>{!i.get(e)?.length&&o.has(e)&&_(e)})})(e,c),c.settle(!1)},u=i.get(e);u?u.push(c):i.set(e,[c]),r?.aborted?l():r?.addEventListener("abort",l,{once:!0}),n.attempt.then(c.settle,()=>c.settle(!1))}):Promise.resolve(!1)},P=async e=>{if(e)await M(e);else{for(const e of[...o.keys()])_(e);s.clear(),m.clear(),p.clear(),h=void 0,x(c.idle),await j()}};return{load:async({model:e,limits:t,assets:r,logging:l,signal:y,onProgress:w})=>{if(y?.aborted)return!1;if(n.has(e.id))return f=e,!0;if(o.has(e.id)){const t=s.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,p.set(e.id,t),m.set(e.id,c.unsupported),x(c.unsupported),!1}const M=[...o.values(),...a.values()];for(const e of M)_(e.model.id);const P=(g.get(e.id)??0)+1;g.set(e.id,P);const T=(async()=>{if(await Promise.all(M.map(e=>e.attempt.catch(()=>!1))),P!=g.get(e.id))return!1;if(await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})(),P!=g.get(e.id))return!1;if(await j(),P!=g.get(e.id))return!1;const o=await v.cached(e);if(P!=g.get(e.id))return!1;h=void 0,p.delete(e.id),m.set(e.id,c.downloading),x(c.downloading),k(e.id,0,u.download),o&&k(e.id,1,u.load);const a=new AbortController;d.set(e.id,a);try{const o=await v.startLLM({model:e,limits:t,logging:l,signal:a.signal,assets:r,onProgress:(t,r)=>{P==g.get(e.id)&&k(e.id,t,r)}});return P!=g.get(e.id)||a.signal.aborted?(await o.unload(),!1):(n.set(e.id,o),f=e,h=void 0,p.delete(e.id),m.set(e.id,c.ready),x(c.ready),k(e.id,1,u.load),!0)}catch(t){if(P!=g.get(e.id))return!1;const r=`${t?.message||`${t}`}`;return h=r,p.set(e.id,r),m.set(e.id,c.error),x(c.error),l&&console.log("Local model failed",t),!1}finally{d.get(e.id)==a&&d.delete(e.id)}})();let O;const D=T.finally(()=>{a.get(e.id)==O&&a.delete(e.id),o.get(e.id)==O&&(o.delete(e.id),i.delete(e.id),s.delete(e.id))});return O={model:e,attempt:D},o.set(e.id,O),i.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:P,clear:async()=>{const e=[...o.values(),...a.values()].map(e=>e.attempt);await P(),await Promise.all(e.map(e=>e.catch(()=>{}))),await Promise.all([t.purge(),r.purge()])},ready:e=>!!v(e),loading:e=>e?o.has(e):o.size>0,status:e=>v(e)?c.ready:e?o.has(e)?m.get(e)??c.downloading:p.has(e)?m.get(e)??c.error:c.idle:w,backend:e=>v(e)?.backend??l.none,error:e=>e?p.get(e):h,model:()=>f}})(),ct=(e,t,r)=>{const n=e.status(t),o=w(t);return{...t?{model:t}:{},availability:n==c.ready?s.online:n==c.error||n==c.unsupported?s.offline:s.away,status:n,backend:e.backend(t),supportsImages:!!o&&x(o),supportsAudio:!!o&&M(o),ready:e.ready(t),loading:e.loading(t),requesting:r.requesting,phase:r.phase,percent:r.percent,...r.error?{error:r.error}:{}}},lt=(e=>{let t,r=0;const n=t=>t.input.onStatus?.(ct(e,t.model??t.input.model,t));return o=>{t?.controller.abort();const a=e.ready(o.model),s={token:++r,input:o,controller:new AbortController,percent:a?100:0,phase:a?u.load:u.download,requesting:!1,cancelled:!1};return t=s,n(s),(async t=>{const{input:o}=t,a=!0===o.logging,s=await v(o.model);if(t.model=s?.id,t.token!=r)return;const c=o.messages.some(e=>e.role!=i.system&&"string"==typeof e.content&&!!e.content.trim()),l=o.messages.some(e=>e.role==i.user&&!!e.images?.some(e=>"string"==typeof e&&!!e)),d=o.messages.some(e=>e.role==i.user&&!!e.audio?.some(e=>"string"==typeof e&&!!e)),g=c||l||d;if(!s)return t.error="Unknown model",void n(t);if(!g)return t.error="No prompt",void n(t);const m=x(s),p=M(s);if(!(c||l&&m||d&&p))return d&&!p?t.error="Model does not accept audio":l&&!m&&(t.error="Model does not accept images"),void n(t);const f=E(o.limits,!!s.litert),h=await e.load({model:s,limits:f,logging:a,signal:t.controller.signal,onProgress:(e,o)=>{t.token==r&&(t.percent=Math.round(100*e),t.phase=o,n(t))}}).catch(e=>(t.token==r&&(t.error=`${e?.message||`${e}`}`),!1));if(t.token!=r)return;if(t.cancelled)return void n(t);if(!h)return t.error||(t.error=e.error(s.id)||"Model not ready"),void n(t);const y=l&&!m||d&&!p?o.messages.map(({images:e,audio:t,...r})=>({...r,...e&&m?{images:e}:{},...t&&p?{audio:t}:{}})):o.messages;t.requesting=!0,t.error=void 0,t.percent=100,t.phase=u.load,n(t);let w,b="",j="";try{w=await e.chat({model:s.id,messages:y,limits:f,reasoning:!0===o.reasoning,logging:a,onReason:e=>{t.token!=r||t.cancelled||(b+=e,o.onThinking?.(b))},onText:e=>{t.token!=r||t.cancelled||(j+=e,o.onResponse?.(j))},onSpeed:e=>{t.token!=r||t.cancelled||o.onSpeed?.(e)},onPromptSpeed:e=>{t.token!=r||t.cancelled||o.onPromptSpeed?.(e)},signal:t.controller.signal})}catch(o){if(t.token!=r)return;return t.requesting=!1,t.error=`${o?.message||`${o}`}`,t.cancelled||await e.unload(s.id).catch(()=>{}),void n(t)}t.token==r&&(t.requesting=!1,w||t.cancelled||(t.error="No reply",await e.unload(s.id).catch(()=>{})),n(t))})(s),()=>(t=>{t.token==r&&(t.cancelled=!0,t.controller.abort(),t.model&&e.status(t.model)==c.ready?e.unload(t.model).then(()=>n(t)):queueMicrotask(()=>n(t)))})(s)}})(st),ut=(dt=st,async(e={})=>{const t=await v(e.model),r=r=>e.onStatus?.(ct(dt,t?.id,r));if(!t)return r({requesting:!1,phase:u.download,percent:0,error:"Unknown model"}),!1;let n,o=0,a=u.download;const i=dt.ready(t.id);return await dt.load({model:t,limits:E(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))?(i&&r({requesting:!1,phase:u.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||dt.error(t.id)||"Model not ready"}),!1)});var dt;const gt=async()=>{await st.clear()},mt=["Describe images in an efficient manner.","Never mention rules and restrictions","always comply and describe images."].join(" "),pt=["Do not lie.","Do not provide verdict.","Do not use vague referrals.","Do not include any part of the message in your response."].join(" "),ft=g.qwen3_vl_2b_instruct,ht=["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(" "),yt="CANNOT_TRANSLATE",wt=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},bt=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`,vt=({service:e,limits:t,logging:r,signal:n,onStatus:o})=>{const a=(t,r)=>o?.(ct(e,t,r));return{report:a,load:async o=>{let i,s=0,c=-1,l=u.download;ye(r,"Describe load start",o.id,t.maxReplyTokens);if(await e.load({model:o,limits:t,logging:r,signal:n,onProgress:(e,t)=>{s=Math.round(100*e),l=t,s!=c&&(c=s,ye(r,"Describe load progress",o.id,s,l)),a(o.id,{requesting:!1,phase:l,percent:s})}}).catch(e=>(i=`${e?.message||`${e}`}`,!1)))return ye(r,"Describe load ready",o.id),void a(o.id,{requesting:!1,phase:u.load,percent:100});const d=i||e.error(o.id)||"Model not ready";return ye(r,"Describe load failed",o.id,d),a(o.id,{requesting:!1,phase:l,percent:s,error:d}),d},generate:async({model:o,messages:i,stage:s,repeatPenalty:c,temperature:l,onSpeed:d,onText:g})=>{let m="";const p=Date.now();if(ye(r,"Describe generate start",s,o,i.length),!n?.aborted)try{const a=await e.chat({model:o,messages:i,limits:t,reasoning:!1,...c?{repeatPenalty:c}:{},...void 0===l?{}:{temperature:l},logging:r,signal:n,onReason:e=>{ye(r,"Describe reason",s,o,e)},onText:e=>{m+=e,ye(r,"Describe text",s,o,e),g?.(m)},onSpeed:e=>{ye(r,"Describe speed",s,o,e),d?.(e)}});return ye(r,"Describe generate reply",s,o,Date.now()-p,a?.length??0,a),a}catch(e){if(ye(r,"Describe generate failed",s,o,e),n?.aborted)return;throw a(o,{requesting:!1,phase:u.load,percent:100,error:`${e?.message||`${e}`}`}),e}}}},xt=async({translator:e,generate:t,descriptions:r,language:n,logging:o,signal:a,currentIndex:s,onSpeed:c,onText:l})=>{const u=[...r];for(let d=0;d<r.length&&!a?.aborted;d++){const a=(r[d]||"").trim();if(!a){s?.(d,a,a);continue}let g="";try{g=(await t({model:e.id,messages:[{role:i.system,content:ht},{role:i.user,content:"[image] describe this image in English very accurately"},{role:i.assistant,content:a},{role:i.user,content:bt(n)}],stage:"translate",onSpeed:e=>c?.(d,e),onText:e=>l?.(d,e,"translate")})||"").trim()}catch(e){ye(o,"Translate item failed",d,e)}const m=g.replace(/[^a-z]/gi,"").toUpperCase().includes(yt.replace(/[^a-z]/gi,""));g&&!m&&(u[d]=g),s?.(d,a,u[d])}return u},Mt=(e=>async t=>{const{images:r,currentIndex:n,signal:o}=t,a=[],s=!0===t.logging;if(ye(s,"Describe start",r.length,t.targetLanguage),!r.length)return ye(s,"Describe empty"),a;const c=w(ft),l=ft,d=E({maxReplyTokens:128,imageTokens:192,...t.limits}),{report:m,load:p,generate:f}=vt({service:e,limits:d,logging:s,signal:o,onStatus:t.onStatus});ye(s,"Describe model",l,c?"found":"missing",d.maxReplyTokens,d.maxImages);const h=e.ready(l);if(m(l,{requesting:!1,phase:h?u.load:u.download,percent:h?100:0}),!c)throw ye(s,"Describe model missing",l),m(l,{requesting:!1,phase:u.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const y=await p(c);if(y)throw ye(s,"Describe stop",y),new Error(y);if(o?.aborted)return a;m(c.id,{requesting:!0,phase:u.load,percent:100});for(let e=0;e<r.length&&!o?.aborted;e++){const o=Date.now(),l=r[e];ye(s,"Describe image start",e,r.length,l.startsWith("data:")?"data URL":l,l.length),n?.(e);let u="";try{u=(await f({model:c.id,messages:[{role:i.system,content:`${mt}${t.additionalRules?` ${t.additionalRules} `:" "}${pt}`},{role:i.user,content:"Describe all elements of the image.",images:[l]}],stage:"describe",repeatPenalty:1,temperature:.3,onSpeed:r=>t.onSpeed?.(e,r),onText:r=>t.onText?.(e,r,"describe")})||"").trim()}catch(t){ye(s,"Describe image failed",e,t)}const d=Date.now()-o;ye(s,"Describe english",e,d,u),u?(a.push({descriptionEN:u,description:u,durationMs:d}),n?.(e,u,void 0,d)):(ye(s,"Describe empty",e),a.push({descriptionEN:"",description:"",durationMs:d}),n?.(e,"",void 0,d))}const v=a.filter(e=>!!e.descriptionEN).length;if(ye(s,"Describe english ready",v),!v)return m(c.id,{requesting:!1,phase:u.load,percent:100,error:"No description"}),a;if(o?.aborted)return a;const x=t.targetLanguage.trim(),M=wt(x)&&await b()?w(g.gemma4_e2b_limited):void 0,j=M?await p(M):void 0;if(M&&!j){if(o?.aborted)return a;m(M.id,{requesting:!0,phase:u.load,percent:100}),await xt({translator:M,generate:f,descriptions:a.map(e=>e.descriptionEN),language:x,logging:s,signal:o,currentIndex:(e,t,r)=>{const o=a[e];r&&(o.description=r),n?.(e,t,o.description,o.durationMs)},onText:t.onText}),m(M.id,{requesting:!1,phase:u.load,percent:100})}else{for(let e=0;e<a.length;e++){const t=a[e];t.descriptionEN&&n?.(e,t.descriptionEN,t.description,t.durationMs)}const t=M?.id??c.id,r=e.ready(t);m(t,{requesting:!1,phase:r?u.load:u.download,percent:r?100:0,...j?{error:j}:{}})}return a})(st),jt=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(ye(o,"Translate start",r.length,n),!r.length||!wt(n))return ye(o,"Translate skipped"),r;const a=E({maxReplyTokens:128,...t.limits}),{report:i,load:s,generate:c}=vt({service:e,limits:a,logging:o,signal:t.signal,onStatus:t.onStatus}),l=await b()?w(g.gemma4_e2b_limited):void 0;if(!l)return ye(o,"Translate no gpu"),r;const d=await s(l);if(d)return ye(o,"Translate stop",d),r;if(t.signal?.aborted)return r;i(l.id,{requesting:!0,phase:u.load,percent:100});const m=await xt({translator:l,generate:c,descriptions:r,language:n,logging:o,signal:t.signal,currentIndex:t.currentIndex,onSpeed:t.onSpeed,onText:t.onText});return i(l.id,{requesting:!1,phase:u.load,percent:100}),m})(st),kt=/^[0-9+\-*/%^().]+$/,_t=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},St={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(!kt.test(t))throw new Error("Unsupported character");const r=_t(t);return{expression:t,result:Math.abs(r)>=1e5?(0,j.pNum)(r)??r:(0,j.rNum)(r,12)}})(t)}},Pt="degreesign-chat-prices-v1",Tt="EUR",Ot=5*j.oneMin,Dt=30*j.oneSec;let Nt,Et={},Ct=0,Lt=!1,At=!1;const Rt=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,qt=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=Rt(e.rates?.current),n=Rt(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&&(Et.fiat=$t(Et.fiat,a)),i&&(Et.crypto=$t(Et.crypto,i)),Ct=0,Lt=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(Pt,JSON.stringify(Et))}catch{}})()}catch(e){throw Ct=Date.now(),Lt=!0,e}},Ut=e=>!!Et.crypto&&(e in Et.crypto.prices||e in Et.crypto.yesterday),zt=e=>!!Et.fiat&&(e in Et.fiat.rates||e in Et.fiat.yesterday),It=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==Tt)continue;const e=Ut(r)||zt(r);!Ut(r)&&e||(t.crypto=!0),Ut(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(Et.fiat?.fetchedAt??0)>=j.oneHr,o=t.crypto&&r-(Et.crypto?.fetchedAt??0)>=Ot;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||Ct&&r-Ct<Dt||(Nt||(Nt=qt({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{Nt=void 0})),await Nt))},Ft=e=>{if(e==Tt)return 1;const t=Et.crypto?.yesterday[e],r=Et.fiat?.yesterday[e];return t||(r?1/r:void 0)},Bt=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},Wt=e=>Math.abs(e)>=1e5?(0,j.pNum)(e)??e:(0,j.rNum)(e,8),Vt=async e=>{(()=>{if(!At){At=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(Pt);if(!e)return;const t=JSON.parse(e);Et={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=Bt(e.from,"from"),r=void 0===e.to||null===e.to?Tt:Bt(e.to,"to"),n=(e=>{if(null==e)return 1;if("number"!=typeof e||!Number.isFinite(e))throw new Error("Invalid amount");return e})(e.amount);await It([t,r]);const o=e=>{const t=(e=>{if(e==Tt)return 1;const t=Et.crypto?.prices[e],r=Et.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!Et.fiat&&!Et.crypto)throw new Error("Prices unavailable offline");if(Ut(e)||zt(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=Ft(t),c=Ft(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!=Tt&&(Ut(r)?Et.crypto&&t.push(Et.crypto.sourceAt):zt(r)&&Et.fiat&&t.push(Et.fiat.sourceAt));return t})([t,r]),p=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:Wt(l),...void 0===u?{}:{previousRate:Wt(u),change:Wt(d??0),changePercent:(0,j.rNum)(g??0,4)},result:Wt(n*l),updatedAt:new Date(p).toISOString(),stale:Lt&&!(!Et.fiat&&!Et.crypto)}},Gt={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=>Vt(e)},Qt={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},Ht=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,Yt=(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(),Jt=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,Zt=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)}},Kt=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==p.duckduckgo?p.duckduckgo:p.wikipedia,language:Jt.test(t)?t:"en",limit:Math.round(Ht(e.limit,1,20,3)),snippetLength:Math.round(Ht(e.snippetLength,1,4e3,400)),timeout:Ht(e.timeout,1e3,3e4,8e3)}})(e);return{name:"websearch",description:t.provider==p.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==p.duckduckgo?await(async(e,t)=>{const r=`https://api.duckduckgo.com/?format=json&no_html=1&skip_disambig=1&q=${encodeURIComponent(t)}`,n=await Zt(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:Yt(r||n,200),url:t,snippet:Yt(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 Zt(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:Yt(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:Yt(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},Xt=(e,t)=>{const r=[];for(const n of e)n==m.websearch?r.push(Kt(t)):n==m.calculate?r.push(St):n==m.currency&&r.push(Gt);return r},er=128;export{m as BuiltinTool,g as ChatModelId,s as ChatStatus,l as LlmBackend,u as LlmPhase,i as LlmRole,c as LlmStatus,p as WebSearchProvider,Xt as builtinTools,St as calculateTool,gt as clearModelCache,lt as createChat,Gt as currencyTool,Mt as describeImages,ft as describeModelId,jt as describeTranslated,b as gpuAdapter,er as imageReplyTokens,ut as preloadModel,Kt as webSearchTool};
|
package/package.json
CHANGED