@degreesign/chat 1.4.0 → 1.5.1
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 +10 -3
- package/dist/browser/chat.min.mjs +1 -1
- package/dist/engines/engine.d.ts +1 -1
- package/dist/engines/store.d.ts +4 -2
- package/dist/enums.d.ts +10 -1
- package/dist/node/chat.node.min.js +1 -1
- package/dist/node/chat.node.min.mjs +1 -1
- package/dist/types.d.ts +33 -1
- package/package.json +1 -1
|
@@ -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,m;let p;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.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"}(d||(d={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(g||(g={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(m||(m={}));const f=[{id:d.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:d.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:d.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:d.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}}],h=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},y=e=>e?f.find(t=>t.id==e):void 0,w=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)}},b=async e=>y(e??await(async()=>(p||(p=(async()=>await w()?d.gemma4_e2b_limited:d.qwen3_vl_2b)()),await p))()),v=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,x=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio,M=()=>{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},j=()=>{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},k={width:384,height:384},_=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}};var S=a(69);const T={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,imageTokens:128,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:32,gpuShare:.5},O=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,D=(e={},t=!1)=>{const r=T;return{maxReplyTokens:O(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:O(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:O(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:O(e.maxImages,r.maxImages,0),imageTokens:O(e.imageTokens,r.imageTokens,1),maxAudio:O(e.maxAudio,r.maxAudio,0),maxContentLength:O(e.maxContentLength,r.maxContentLength,1),promptCharBudget:O(e.promptCharBudget,r.promptCharBudget,1),maxThreads:O(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}},N=(e,t,r=.7)=>({stream:!0,temperature:r,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),C=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,E=e=>Number(e.headers.get("content-length"))||0,L=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),A=e=>L(e,"image"),R=e=>L(e,"audio"),$=["<|channel>thought\n","<|channel>thought","..."],q=["<channel|>","..."],U=(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,I=(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},F=h()?3e6:3e5,W=Math.max(F,84e4);class V extends Error{}const B=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)}},G=e=>{try{Promise.resolve(e.next?.()).catch(()=>{}).finally(()=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}})}catch{}},Q=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,start:a,stopped:i,firstTimeoutMs:s=F,idleTimeoutMs:c=3e4,onStall:l})=>{let u="",d="",g="",m=!1,p=0,f=0;const h=((e,t)=>{let r="",n=!1;const o=(e,t)=>{let r=-1,n="";for(const o of t){const t=e.indexOf(o);t>=0&&(r<0||t<r)&&(r=t,n=o)}return{at:r,tag:n}},a=(e,t)=>{let r="";for(const n of t)for(let t=Math.min(e.length,n.length-1);t>r.length;t--)if(e.endsWith(n.slice(0,t))){r=e.slice(e.length-t);break}return r};return{feed:i=>{let s=r+i;for(r="";s;){if(n){const{at:t,tag:i}=o(s,q);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,q);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,$);if(e>=0){e&&t(s.slice(0,e)),s=s.slice(e+i.length),s.startsWith("\n")&&(s=s.slice(1)),n=!0;continue}const c=a(s,$);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{d+=e,r(e)},e=>{u+=e,n(e)});try{const e=a();Promise.resolve(e).catch(()=>{});const n=(await B(e,s,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(i()){G(n);break}let e;try{const t=n.next();Promise.resolve(t).catch(()=>{}),e=await B(t,m?c:s,m?"Model stopped responding":"Model did not reply")}catch(e){if(e instanceof V&&(u||d)){l?.(),G(n),t&&console.log("Local chat stalled",e);break}throw e}if(e.done)break;m=!0;const a=e.value?.choices?.[0],y=a?.delta,w="string"==typeof y?.reasoning_content?y.reasoning_content:"string"==typeof y?.reasoning?y.reasoning:"";if(a?.finish_reason&&(g=a.finish_reason),w&&(d+=w,r(w)),y?.content&&h.feed(y.content),w||y?.content){const e=performance.now();p||(f=e),p+=1,p>1&&e>f&&o?.((0,S.rNum)(1e3*p/(e-f)))}}h.flush()}catch(e){if(t&&console.log("Local chat failed",e),e instanceof V&&!i())throw e}const y=i()?void 0:u||void 0;return t&&(console.log("Local chat reply",e.id,y?"****":""),console.log("Local chat finish",e.id,g||"none",u.length,d.length)),y},Y=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 P(n.url,t,r)}:n);n.push({role:"user",content:e})}return n})(((e,t=T)=>{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:U(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=I(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?k: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 Q({model:e,logging:t.logging,onReason:t.onReason,onText:t.onText,onSpeed:t.onSpeed,start:()=>r(a),stopped:n,onStall:o,firstTimeoutMs:A(a)?W:F})},H=33554432,J=new Map;let Z=!1;const K=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}`},X=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},ee=async()=>{if(!Z)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else Z=!0},te=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},re=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}},ne=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{}},oe=async function*(e){for await(const t of e)yield t},ae=async e=>{try{for await(const[t,r]of oe(e))"file"==r.kind&&X(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},ie=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await re(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}},se=async(e,t)=>{const r=await te(e,t);if(r){const e=await(async e=>await re(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of oe(e)){const e=X(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 ie(e,t)},ce=(e,t)=>{const r=e.headers.get("content-range"),n=/bytes (\d+)-/.exec(r||""),o=/\/(\d+)\s*$/.exec(r||""),a=e.headers.get("etag")||"";if(206==e.status){const e=n?Number(n[1]):t.size,r=o?Number(o[1]):t.total;if(e!=t.size)return;if(t.total&&r&&t.total!=r)return;if(t.etag&&a&&t.etag!=a)return;return{start:e,total:r||t.total,etag:a||t.etag}}if(!t.etag||!a||t.etag==a)return{start:0,total:E(e)||t.total,etag:a||t.etag}},le=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:i})=>{let s,c=t,l=0,d=r;const g=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(c),{create:!0});s=await t.createWritable(),l=0},m=async()=>{const e=s;s=void 0,e&&await e.close().catch(()=>{})};try{const e=o.getReader();for(;;){const{done:r,value:o}=await e.read();if(r)break;i();let p=0;for(d&&(p=Math.min(d,o.byteLength),d-=p);p<o.byteLength;){s||await g();const e=Math.min(H-l,o.byteLength-p);await s.write({type:"write",position:l,data:o.subarray(p,p+e)}),p+=e,l+=e,c+=e,l==H&&await m()}c>t&&a(n?c/n:0,u.download)}await m()}catch(e){throw await m(),e}return c},ue=e=>["NotAllowedError","NotSupportedError"].includes(e?.name||""),de=e=>{const t=async()=>{const t=await ee();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await se(r,K(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{const a=`${e}|${r}`,i=J.get(a);if(i)return await i;const s=await t();if(!s)return;const c=(async(e,t,r,n)=>{const o=K(t),a=await ie(e,o);if(a?.complete)return a;let i=await te(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;for(;;){if(r?.aborted)throw new Error("Cancelled");const a=await se(e,o);if(a?.complete)return a;const l=a?.size??0,d=a?.total||0,g=a?.etag||"";if(l>s)s=l,c=0;else if(++c>4)throw new Error("Model download failed");l&&d&&n(l/d,u.download);const m=d?Math.min(l+H,d)-1:l+H-1,p=new AbortController,f=()=>p.abort(),h={size:l,total:d,etag:g};let y,w=setTimeout(f,3e4);r?.addEventListener("abort",f,{once:!0});try{if(y=await fetch(t,{signal:p.signal,headers:{Range:`bytes=${l}-${m}`}}),416==y.status){if(await(y.body?.cancel().catch(()=>{})),d&&l>=d){await ne(i,{total:d,etag:g,complete:!0});continue}await ae(i),await ne(i,{total:0,etag:"",complete:!1});continue}if(!y.ok||!y.body)throw await(y.body?.cancel().catch(()=>{})),new Error("Model download failed");const r=ce(y,h);if(!r){await y.body.cancel().catch(()=>{}),await ae(i),await ne(i,{total:0,etag:"",complete:!1});continue}await ne(i,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?l:0,s=await le({dir:i,start:r.start+a,skip:a,total:r.total,body:y.body,onProgress:n,onChunk:()=>{clearTimeout(w),w=setTimeout(f,3e4)}});if(!r.total){await ne(i,{total:s,etag:r.etag,complete:!0});const t=await se(e,o);if(t)return t}}catch(e){if(r?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&["QuotaExceededError","NotAllowedError","NotSupportedError","InvalidStateError","TypeMismatchError","SecurityError"].includes(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*c))}finally{clearTimeout(w),r?.removeEventListener("abort",f)}}})(s,r,n,o).finally(()=>{J.delete(a)});return J.set(a,c),await c},remove:async e=>{const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,K(e))},purge:async()=>{const t=await ee();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},ge=(e,...t)=>{!0===e&&console.log(...t)},me="litertlm-models",pe=.5,fe=de("litert-store"),he={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 ye=!1,we=0;const be=new WeakSet;let ve=pe,xe=!1,Me=0;const je=(...e)=>{ye&&console.log(...e)},ke=(...e)=>{ye&&console.error(...e)},_e=e=>e.replace(/<\|channel>thought\n?[\s\S]*?<channel\|>/g,"").replace(/<\|channel>thought[\s\S]*$/,"").trim(),Pe=async()=>{const e=performance.now(),t=e-Me;if(Me=e,!xe)return;const r=Math.round(((e,t=.5)=>Math.min(500,Math.max(0,e*(1/t-1))))(t,ve));r<1||(await new Promise(e=>setTimeout(e,r)),Me=performance.now())},Se=(e=.5)=>{ve=e>0?e:pe,xe=!0,Me=performance.now()},Te=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(me)}catch{return}},Oe=new Map,De=(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)}}))},Ne=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 _(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},Ce=(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&&_e(e.content)==_e(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(_e(n.text)!=_e(o.text))return!1}else{if("text"==n.type||"text"==o.type)return!1;if(!!n.url!=!!o.url)return!1}}return!0},Ee=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=N(r.limits,r.reasoning,r.temperature);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await Ne([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&&!Ce(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(!Ce(o[i+e],a[e]))return!1;return!0})(o.sent,s);let d;if(l&&u&&o.conversation)ge(ye,"LiteRT conversation reused",o.sent.length),d=o.conversation;else{const n=await Ne(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}),ge(ye,"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&&(ge(ye,"LiteRT first chunk",Math.round(a)),Se(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{xe=!1,r.signal?.removeEventListener("abort",h),m&&f?o.sent.push({role:"assistant",content:f}):(o.conversation=void 0,o.sent=[])}},Le={backend:l.gpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o})=>{ye=!0===o;const i=e.litert;if(!i)throw new Error("Model has no LiteRT artifact");const s=h()?16384:32768,c=await a.e(520).then(()=>a(507)),d=globalThis,g=d.Module;d.Module={print:je,printErr:ke};try{await c.getOrLoadGlobalLiteRtLm(j().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(!be.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:Pe});be.add(f),be.add(e),p.preinitializedWebGPUDevice=e}const y=C(i.repo,i.file),w=await Te();let b;const v=w?await w.match(y):void 0;if(v?.body)b=v.body;else{const e=await fe.stored(y);e?.complete&&(b=e.file.stream())}if(!b){const e=await fe.download({url:y,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");if(!ue(e))throw e;o&&console.log("Local model store failed",e)});e&&(b=e.file.stream())}if(!b&&w)try{await(async(e,t,r,n)=>{const o=Oe.get(e);if(o)return await o;const a=(async()=>{const o=await fetch(e,{signal:r});if(!o.ok||!o.body)throw new Error("Model download failed");const a=E(o),i=De(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{Oe.delete(e)});return Oe.set(e,a),await a})(y,w,n,r);const e=await w.match(y);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 De(n.body,E(n),r)})(y,n,r)),n?.aborted)throw new Error("Cancelled");r(1,u.load);const x=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:he},...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}));we+=1;const M=()=>{we=Math.max(0,we-1),we||(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 x.createConversation();await t.delete(),ge(ye,"LiteRT conversation warm-up",Math.round(performance.now()-e))}catch(e){ge(ye,"LiteRT conversation warm-up failed",e)}if(n?.aborted)throw await x.delete(),M(),new Error("Cancelled");const k={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})=>{ye=!0===n.logging;const a=()=>{try{o.conversation?.cancel()}catch{}o.conversation=void 0,o.sent=[]};try{return await Y({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async a=>{if(n.signal?.aborted)throw new Error("Cancelled");if(A(a)&&!t.litert?.vision)throw new Error("Model does not accept images");if(R(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return Ee({engine:e,mod:r,params:n,messages:a,session:o})}})}catch(e){throw a(),e}})({engine:x,model:e,mod:c,params:t,session:k}),unload:async()=>{const e=k.conversation;k.conversation=void 0,k.sent=[];try{await(e?.delete())}catch{}await x.delete(),M()}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=C(t.repo,t.file),[n,o]=await Promise.all([Te(),fe.stored(r)]);if(o?.complete)return!0;try{return!(!n||!await n.match(r))}catch{return!1}},purge:async()=>{try{await fe.purge(),"undefined"!=typeof caches&&await caches.delete(me)}catch{}}},Ae=de("wllama-store"),Re=[d.qwen3_vl_2b_instruct,d.qwen3_vl_2b_instruct_q3],$e=e=>e.cpu?.mmproj&&Re.includes(e.id)?{image_min_tokens:16,image_max_tokens:128}:{};let qe,Ue,ze="",Ie=!1;const Fe=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,We=e=>{const t=M();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},Ve=e=>{const t=e=>(...t)=>{Ie&&("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)}},Be=async()=>{if(qe)return qe;const e=await a.e(924).then(()=>a(577)),t=Ue||We(),r=new e.Wllama({default:t.wasm},{logger:Ve(e.LoggerWithoutDebug)});return Ue||(Ue=t,ze=Fe(t)),r.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),qe=r,r},Ge=async()=>{const e=qe;qe=void 0;try{await(e?.exit())}catch{}},Qe=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),Ye=e=>{const t=e.cpu;return t?[{name:t.file,url:C(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:C(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},He=async e=>{const t=Ye(e);if(!t.length)return!1;for(const e of t){const t=await Ae.stored(e.url);if(!t?.complete)return!1}return!0},Je=async(e,t)=>{const r=await e.cacheManager.list();return Ye(t).every(e=>r.some(t=>Qe(t,e.name)))},Ze=async({model:e,signal:t,onProgress:r})=>{const n=Ye(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await Ae.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},Ke=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 _(t.url)});t.push({role:"user",content:e})}return t},Xe={backend:l.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:a})=>{Ie=!0===o;const i=h()?4096:8192,s=e.cpu;if(!s)throw new Error("Model has no CPU artifact");const c=We(a),d=Fe(c);qe&&d!=ze&&await Ge(),Ue=c,ze=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 Be(),f=await He(e),y=s.mmproj?.file,w=C(s.repo,s.file),b=y?C(s.mmproj?.repo??s.repo,y):"";if(n?.aborted)throw await Ge(),new Error("Cancelled");if(!f&&y){const e=await p.cacheManager.list(),t=e.some(e=>Qe(e,s.file)),r=e.some(e=>Qe(e,y));t&&!r&&await p.cacheManager.deleteMany(e=>Qe(e,s.file))}const v={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)),...$e(e)};try{let t=f?await Ze({model:e,signal:n,onProgress:r}):void 0;t||f||await Je(p,e).catch(()=>!1)||(t=await Ze({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");if(!ue(e))throw e;o&&console.log("Local model store failed",e)})),t?(r(1,u.load),await p.loadModel(t,v)):await p.loadModelFromUrl(b?{url:w,mmprojUrl:b}:w,{...v,useCache:!0,signal:n,progressCallback:({loaded:e,total:t})=>{const n=t?e/t:0;r(n,n>=1?u.load:u.download)}})}catch(e){throw await Ge(),e}if(n?.aborted)throw await Ge(),new Error("Cancelled");const x=p.getLoadedContextInfo();if(!x.n_ctx)throw await Ge(),new Error("Failed to create model context");return ge(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",x.n_ctx,"batch",x.n_batch,"ubatch",x.n_ubatch),{model:e,backend:l.cpu,contextSize:i,chat:t=>(async(e,t,r)=>{if(Ie=!0===r.logging,e.isModelLoaded())return await Y({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if(A(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if(R(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await Ke(n),...N(r.limits,r.reasoning,r.temperature),...r.repeatPenalty?{penalty_repeat:r.repeatPenalty}:{},abortSignal:r.signal,...t.reasoning?{chat_template_kwargs:{enable_thinking:r.reasoning}}:{}})}})})(p,e,t),unload:async()=>{if(qe==p)await Ge();else try{await p.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await He(e)||await Je(await Be(),e))}catch{return!1}},purge:async()=>{try{await Ae.purge()}catch{}try{const e=await Be();await e.cacheManager.clear()}catch{}}},et=((e={})=>{const t=e.engines?.cpu||Xe,r=e.engines?.litert||Le,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)},P=(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)},S=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 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,c.unsupported),x(c.unsupported),!1}const M=[...o.values(),...a.values()];for(const e of M)_(e.model.id);const S=(g.get(e.id)??0)+1;g.set(e.id,S);const T=(async()=>{if(await Promise.all(M.map(e=>e.attempt.catch(()=>!1))),S!=g.get(e.id))return!1;if(await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})(),S!=g.get(e.id))return!1;if(await j(),S!=g.get(e.id))return!1;const o=await v.cached(e);if(S!=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)=>{S==g.get(e.id)&&k(e.id,t,r)}});return S!=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(S!=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 P(e.id,w,y)},chat:async e=>{if(!v(e.model))return;for(;y;)await y.catch(()=>{});const t=v(e.model);if(!t)return;f?.id!=t.model.id&&(f=t.model);const r=t.chat(e);y=r;try{return await r}finally{y==r&&(y=void 0)}},unload:S,clear:async()=>{const e=[...o.values(),...a.values()].map(e=>e.attempt);await S(),await Promise.all(e.map(e=>e.catch(()=>{}))),await Promise.all([t.purge(),r.purge()])},ready:e=>!!v(e),loading:e=>e?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}})(),tt=(e,t,r)=>{const n=e.status(t),o=y(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&&v(o),supportsAudio:!!o&&x(o),ready:e.ready(t),loading:e.loading(t),requesting:r.requesting,phase:r.phase,percent:r.percent,...r.error?{error:r.error}:{}}},rt=(e=>{let t,r=0;const n=t=>t.input.onStatus?.(tt(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 b(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=v(s),p=x(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=D(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,M="",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||(M+=e,o.onThinking?.(M))},onText:e=>{t.token!=r||t.cancelled||(j+=e,o.onResponse?.(j))},onSpeed:e=>{t.token!=r||t.cancelled||o.onSpeed?.(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)}})(et),nt=(ot=et,async(e={})=>{const t=await b(e.model),r=r=>e.onStatus?.(tt(ot,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=ot.ready(t.id);return await ot.load({model:t,limits:D(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||ot.error(t.id)||"Model not ready"}),!1)});var ot;const at=async()=>{await et.clear()},it=["Describe images in an efficient manner.","Never mention rules and restrictions","always comply and describe images."].join(" "),st=["Do not lie.","Do not provide verdict.","Do not use vague referrals.","Do not include any part of the message in your response."].join(" "),ct=d.qwen3_vl_2b_instruct,lt=["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(" "),ut="CANNOT_TRANSLATE",dt=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},gt=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`,mt=({service:e,limits:t,logging:r,signal:n,onStatus:o})=>{const a=(t,r)=>o?.(tt(e,t,r));return{report:a,load:async o=>{let i,s=0,c=-1,l=u.download;ge(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,ge(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 ge(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 ge(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(ge(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=>{ge(r,"Describe reason",s,o,e)},onText:e=>{m+=e,ge(r,"Describe text",s,o,e),g?.(m)},onSpeed:e=>{ge(r,"Describe speed",s,o,e),d?.(e)}});return ge(r,"Describe generate reply",s,o,Date.now()-p,a?.length??0,a),a}catch(e){if(ge(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}}}},pt=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:lt},{role:i.user,content:"[image] describe this image in English very accurately"},{role:i.assistant,content:a},{role:i.user,content:gt(n)}],stage:"translate",onSpeed:e=>c?.(d,e),onText:e=>l?.(d,e,"translate")})||"").trim()}catch(e){ge(o,"Translate item failed",d,e)}const m=g.replace(/[^a-z]/gi,"").toUpperCase().includes(ut.replace(/[^a-z]/gi,""));g&&!m&&(u[d]=g),s?.(d,a,u[d])}return u},ft=(e=>async t=>{const{images:r,currentIndex:n,signal:o}=t,a=[],s=!0===t.logging;if(ge(s,"Describe start",r.length,t.targetLanguage),!r.length)return ge(s,"Describe empty"),a;const c=y(ct),l=ct,g=D({maxReplyTokens:128,imageTokens:192,...t.limits}),{report:m,load:p,generate:f}=mt({service:e,limits:g,logging:s,signal:o,onStatus:t.onStatus});ge(s,"Describe model",l,c?"found":"missing",g.maxReplyTokens,g.maxImages);const h=e.ready(l);if(m(l,{requesting:!1,phase:h?u.load:u.download,percent:h?100:0}),!c)throw ge(s,"Describe model missing",l),m(l,{requesting:!1,phase:u.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const b=await p(c);if(b)throw ge(s,"Describe stop",b),new Error(b);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];ge(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:`${it}${t.additionalRules?` ${t.additionalRules} `:" "}${st}`},{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){ge(s,"Describe image failed",e,t)}const d=Date.now()-o;ge(s,"Describe english",e,d,u),u?(a.push({descriptionEN:u,description:u,durationMs:d}),n?.(e,u,void 0,d)):(ge(s,"Describe empty",e),a.push({descriptionEN:"",description:"",durationMs:d}),n?.(e,"",void 0,d))}const v=a.filter(e=>!!e.descriptionEN).length;if(ge(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=dt(x)&&await w()?y(d.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 pt({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})(et),ht=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(ge(o,"Translate start",r.length,n),!r.length||!dt(n))return ge(o,"Translate skipped"),r;const a=D({maxReplyTokens:128,...t.limits}),{report:i,load:s,generate:c}=mt({service:e,limits:a,logging:o,signal:t.signal,onStatus:t.onStatus}),l=await w()?y(d.gemma4_e2b_limited):void 0;if(!l)return ge(o,"Translate no gpu"),r;const g=await s(l);if(g)return ge(o,"Translate stop",g),r;if(t.signal?.aborted)return r;i(l.id,{requesting:!0,phase:u.load,percent:100});const m=await pt({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})(et),yt=/^[0-9+\-*/%^().]+$/,wt=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},bt={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(!yt.test(t))throw new Error("Unsupported character");const r=wt(t);return{expression:t,result:Math.abs(r)>=1e5?(0,S.pNum)(r)??r:(0,S.rNum)(r,12)}})(t)}},vt="degreesign-chat-prices-v1",xt="EUR",Mt=5*S.oneMin,jt=30*S.oneSec;let kt,_t={},Pt=0,St=!1,Tt=!1;const Ot=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},Dt=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,Nt=async({fiat:e,crypto:t})=>{try{const r=await fetch("https://srv.coinexams.com/data.json");if(!r.ok)throw new Error(`Price feed failed with ${r.status}`);const n=await r.json(),o=Date.now(),a=e?((e,t)=>{const r=Ot(e.rates?.current),n=Ot(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&&(_t.fiat=Dt(_t.fiat,a)),i&&(_t.crypto=Dt(_t.crypto,i)),Pt=0,St=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(vt,JSON.stringify(_t))}catch{}})()}catch(e){throw Pt=Date.now(),St=!0,e}},Ct=e=>!!_t.crypto&&(e in _t.crypto.prices||e in _t.crypto.yesterday),Et=e=>!!_t.fiat&&(e in _t.fiat.rates||e in _t.fiat.yesterday),Lt=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==xt)continue;const e=Ct(r)||Et(r);!Ct(r)&&e||(t.crypto=!0),Ct(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(_t.fiat?.fetchedAt??0)>=S.oneHr,o=t.crypto&&r-(_t.crypto?.fetchedAt??0)>=Mt;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||Pt&&r-Pt<jt||(kt||(kt=Nt({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{kt=void 0})),await kt))},At=e=>{if(e==xt)return 1;const t=_t.crypto?.yesterday[e],r=_t.fiat?.yesterday[e];return t||(r?1/r:void 0)},Rt=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},$t=e=>Math.abs(e)>=1e5?(0,S.pNum)(e)??e:(0,S.rNum)(e,8),qt=async e=>{(()=>{if(!Tt){Tt=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(vt);if(!e)return;const t=JSON.parse(e);_t={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=Rt(e.from,"from"),r=void 0===e.to||null===e.to?xt:Rt(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 Lt([t,r]);const o=e=>{const t=(e=>{if(e==xt)return 1;const t=_t.crypto?.prices[e],r=_t.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!_t.fiat&&!_t.crypto)throw new Error("Prices unavailable offline");if(Ct(e)||Et(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=At(t),c=At(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!=xt&&(Ct(r)?_t.crypto&&t.push(_t.crypto.sourceAt):Et(r)&&_t.fiat&&t.push(_t.fiat.sourceAt));return t})([t,r]),p=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:$t(l),...void 0===u?{}:{previousRate:$t(u),change:$t(d??0),changePercent:(0,S.rNum)(g??0,4)},result:$t(n*l),updatedAt:new Date(p).toISOString(),stale:St&&!(!_t.fiat&&!_t.crypto)}},Ut={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=>qt(e)},zt={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},It=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,Ft=(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 zt[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),Wt=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,Vt=async(e,t)=>{const r=new AbortController,n=setTimeout(()=>r.abort(),t);try{const t=await fetch(e,{signal:r.signal});if(!t.ok)throw new Error(`Search failed with ${t.status}`);return await t.json()}catch(e){if(r.signal.aborted)throw new Error(`Search timed out after ${t} ms`);throw e}finally{clearTimeout(n)}},Bt=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==m.duckduckgo?m.duckduckgo:m.wikipedia,language:Wt.test(t)?t:"en",limit:Math.round(It(e.limit,1,20,3)),snippetLength:Math.round(It(e.snippetLength,1,4e3,400)),timeout:It(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 Vt(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:Ft(r||n,200),url:t,snippet:Ft(n,e.snippetLength)}))},s=e=>{for(const t of e)t.Topics?s(t.Topics):i(t.FirstURL,t.Text,t.Text)};i(n.AbstractURL,n.Heading||n.AbstractText,n.AbstractText);for(const e of n.Results??[])i(e.FirstURL,e.Text,e.Text);return s(n.RelatedTopics??[]),o.slice(0,e.limit)})(t,r):await(async(e,t)=>{const r=`https://${e.language}.wikipedia.org`,n=`${r}/w/rest.php/v1/search/page?q=${encodeURIComponent(t)}&limit=${e.limit}`,o=await Vt(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:Ft(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:Ft(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},Gt=(e,t)=>{const r=[];for(const n of e)n==g.websearch?r.push(Bt(t)):n==g.calculate?r.push(bt):n==g.currency&&r.push(Ut);return r},Qt=128;export{g as BuiltinTool,d as ChatModelId,s as ChatStatus,l as LlmBackend,u as LlmPhase,i as LlmRole,c as LlmStatus,m as WebSearchProvider,Gt as builtinTools,bt as calculateTool,at as clearModelCache,rt as createChat,Ut as currencyTool,ft as describeImages,ct as describeModelId,ht as describeTranslated,w as gpuAdapter,Qt as imageReplyTokens,nt as preloadModel,Bt 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,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};
|
package/dist/types.d.ts
CHANGED
|
@@ -251,6 +251,8 @@ interface ChatInput {
|
|
|
251
251
|
onResponse: (text: string) => void;
|
|
252
252
|
/** Generation speed callback */
|
|
253
253
|
onSpeed?: (tokensPerSecond: number) => void;
|
|
254
|
+
/** Prompt processing speed callback */
|
|
255
|
+
onPromptSpeed?: (tokensPerSecond: number) => void;
|
|
254
256
|
/** Status change callback */
|
|
255
257
|
onStatus?: (snapshot: ChatStatusSnapshot) => void;
|
|
256
258
|
}
|
|
@@ -487,6 +489,8 @@ interface RuntimeChatParams {
|
|
|
487
489
|
onText: (text: string) => void;
|
|
488
490
|
/** Generation speed */
|
|
489
491
|
onSpeed?: (tokensPerSecond: number) => void;
|
|
492
|
+
/** Prompt processing speed */
|
|
493
|
+
onPromptSpeed?: (tokensPerSecond: number) => void;
|
|
490
494
|
signal?: AbortSignal;
|
|
491
495
|
}
|
|
492
496
|
/** Shared on-device runtime */
|
|
@@ -529,6 +533,8 @@ interface EngineChatParams {
|
|
|
529
533
|
onText: (text: string) => void;
|
|
530
534
|
/** Generation speed */
|
|
531
535
|
onSpeed?: (tokensPerSecond: number) => void;
|
|
536
|
+
/** Prompt processing speed */
|
|
537
|
+
onPromptSpeed?: (tokensPerSecond: number) => void;
|
|
532
538
|
signal?: AbortSignal;
|
|
533
539
|
}
|
|
534
540
|
/** Params of the engine startLLM */
|
|
@@ -668,12 +674,34 @@ interface EngineDelta {
|
|
|
668
674
|
reasoning?: string;
|
|
669
675
|
reasoning_content?: string;
|
|
670
676
|
}
|
|
677
|
+
/** Engine stream timings */
|
|
678
|
+
interface EngineTimings {
|
|
679
|
+
/** Prompt tokens per second */
|
|
680
|
+
prompt_per_second?: number;
|
|
681
|
+
/** Prompt tokens evaluated */
|
|
682
|
+
prompt_n?: number;
|
|
683
|
+
}
|
|
684
|
+
/** Engine prefill progress */
|
|
685
|
+
interface EnginePromptProgress {
|
|
686
|
+
/** Prompt tokens total */
|
|
687
|
+
total?: number;
|
|
688
|
+
/** Processed prompt tokens */
|
|
689
|
+
processed?: number;
|
|
690
|
+
/** Prefill time, milliseconds */
|
|
691
|
+
time_ms?: number;
|
|
692
|
+
/** wllama total token field */
|
|
693
|
+
n_prompt_tokens?: number;
|
|
694
|
+
/** wllama processed token field */
|
|
695
|
+
n_prompt_tokens_processed?: number;
|
|
696
|
+
}
|
|
671
697
|
/** Engine stream chunk */
|
|
672
698
|
interface EngineChunk {
|
|
673
699
|
choices?: Array<{
|
|
674
700
|
finish_reason?: string;
|
|
675
701
|
delta?: EngineDelta;
|
|
676
702
|
}>;
|
|
703
|
+
timings?: EngineTimings;
|
|
704
|
+
prompt_progress?: EnginePromptProgress;
|
|
677
705
|
}
|
|
678
706
|
/** Params of one streamed reply */
|
|
679
707
|
interface StreamReplyParams {
|
|
@@ -684,6 +712,10 @@ interface StreamReplyParams {
|
|
|
684
712
|
onText: (text: string) => void;
|
|
685
713
|
/** Generation speed */
|
|
686
714
|
onSpeed?: (tokensPerSecond: number) => void;
|
|
715
|
+
/** Prompt processing speed */
|
|
716
|
+
onPromptSpeed?: (tokensPerSecond: number) => void;
|
|
717
|
+
/** Estimated prompt tokens */
|
|
718
|
+
promptTokens?: number;
|
|
687
719
|
/** Open engine stream */
|
|
688
720
|
start: () => Promise<AsyncIterable<unknown>>;
|
|
689
721
|
/** Generation stopped flag */
|
|
@@ -713,4 +745,4 @@ interface ImageSize {
|
|
|
713
745
|
width: number;
|
|
714
746
|
height: number;
|
|
715
747
|
}
|
|
716
|
-
export type { ChatMessage, ChatTool, ChatToolCall, ChatToolResult, ChatToolSchema, ChatToolValue, WebSearchConfig, WebSearchResult, WebSearchSettings, FiatSnapshot, CryptoSnapshot, PriceSnapshot, PriceSections, PriceCoin, PriceFeed, CurrencyResult, CalculationResult, WikipediaPage, WikipediaResponse, DuckDuckGoTopic, DuckDuckGoResponse, ChatModel, LlmLimits, ChatStatusSnapshot, ChatInput, ChatPreloadInput, ChatState, CancelChat, ImageDescription, DescribeImagesInput, DescribeTranslatedInput, WllamaAssets, LitertAssets, GpuBuffer, GpuDevice, GpuWasm, GpuThrottleParams, GpuNavigator, MobileNavigator, ActiveCall, RuntimeDeps, RuntimeLoadParams, RuntimeLoadWaiter, RuntimeChatParams, StoredPart, StoredFilePart, StoredModel, StoredModelMeta, ResumePlan, StoreDownloadParams, ModelStore, Runtime, EngineChatParams, StartLlmParams, LlmRuntime, LlmEngine, EngineMessage, ImageSize, EngineContentPart, WllamaContentPart, WllamaMessage, LitertContentPart, LitertMessage, LitertEngine, LitertModule, LitertSettings, LitertSettingsParams, LitertSession, LitertChatParams, StreamLitertParams, EngineDelta, EngineChunk, StreamReplyParams, EngineRunParams, };
|
|
748
|
+
export type { ChatMessage, ChatTool, ChatToolCall, ChatToolResult, ChatToolSchema, ChatToolValue, WebSearchConfig, WebSearchResult, WebSearchSettings, FiatSnapshot, CryptoSnapshot, PriceSnapshot, PriceSections, PriceCoin, PriceFeed, CurrencyResult, CalculationResult, WikipediaPage, WikipediaResponse, DuckDuckGoTopic, DuckDuckGoResponse, ChatModel, LlmLimits, ChatStatusSnapshot, ChatInput, ChatPreloadInput, ChatState, CancelChat, ImageDescription, DescribeImagesInput, DescribeTranslatedInput, WllamaAssets, LitertAssets, GpuBuffer, GpuDevice, GpuWasm, GpuThrottleParams, GpuNavigator, MobileNavigator, ActiveCall, RuntimeDeps, RuntimeLoadParams, RuntimeLoadWaiter, RuntimeChatParams, StoredPart, StoredFilePart, StoredModel, StoredModelMeta, ResumePlan, StoreDownloadParams, ModelStore, Runtime, EngineChatParams, StartLlmParams, LlmRuntime, LlmEngine, EngineMessage, ImageSize, EngineContentPart, WllamaContentPart, WllamaMessage, LitertContentPart, LitertMessage, LitertEngine, LitertModule, LitertSettings, LitertSettingsParams, LitertSession, LitertChatParams, StreamLitertParams, EngineDelta, EngineTimings, EnginePromptProgress, EngineChunk, StreamReplyParams, EngineRunParams, };
|
package/package.json
CHANGED