@degreesign/chat 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  /*! For license information please see chat.node.min.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="gemma4-e2b",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,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it.litertlm",vision:!0,audio:!0}},{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,t=h())=>e==d.gemma4_e2b&&t?d.gemma4_e2b_limited:e,w=e=>e?f.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(y(e??await(async()=>(p||(p=(async()=>await b()?y(d.gemma4_e2b):d.qwen3_vl_2b)()),await p))())),x=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,M=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio,j=()=>{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},k=()=>{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},_={width:384,height:384},T=async e=>{if(!e.startsWith("data:"))return await(await fetch(e)).arrayBuffer();const t=e.indexOf(","),r=t>=0?e.slice(0,t):"";if(t<0)throw new Error("Invalid image data");if(!r.includes(";base64"))return await(await fetch(e)).arrayBuffer();const n=atob(e.slice(t+1)),o=new Uint8Array(n.length);for(let e=0;e<n.length;e++)o[e]=n.charCodeAt(e);return o.buffer},S=async(e,t)=>{if(!e||"function"!=typeof fetch||"function"!=typeof createImageBitmap)return e;try{const r=await fetch(e),n=await createImageBitmap(await r.blob()),o=t??((e,t)=>{const r=e/Math.max(1,t);let n=32,o=32,a=1/0,i=1/0;for(let e=1;e<=128;e++){const t=Math.ceil(128/e),s=Math.floor(136/e);for(let c=t;c<=s;c++){const t=c*e,s=Math.abs(c/e-r);(s<a-1e-9||Math.abs(s-a)<=1e-9&&t<i)&&(n=32*c,o=32*e,a=s,i=t)}}return{width:n,height:o}})(n.width,n.height),a=n.width/Math.max(1,n.height),i=o.width/o.height,s=Math.min(n.width,a>i?n.height*i:n.width),c=Math.min(n.height,a>i?n.height:n.width/i),l=(n.width-s)/2,u=(n.height-c)/2,d=((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})(o.width,o.height),g=d?d.getContext("2d"):null;if(!d||!g||n.width<1||n.height<1)return n.close(),e;if(g.drawImage(n,l,u,s,c,0,0,o.width,o.height),n.close(),(e=>"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas)(d)){const t=await d.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 d.toDataURL("image/jpeg",.85)}catch{return e}};var P=a(69);const O={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:32},D=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,C=(e={},t=!1)=>{const r=O;return{maxReplyTokens:D(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:D(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:D(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:D(e.maxImages,r.maxImages,0),maxAudio:D(e.maxAudio,r.maxAudio,0),maxContentLength:D(e.maxContentLength,r.maxContentLength,1),promptCharBudget:D(e.promptCharBudget,r.promptCharBudget,1),maxThreads:D(e.maxThreads,r.maxThreads,1)}},N=(e,t)=>({stream:!0,temperature:.7,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),E=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,L=e=>Number(e.headers.get("content-length"))||0,A=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),$=e=>A(e,"image"),R=e=>A(e,"audio"),q=["<|channel>thought\n","<|channel>thought","..."],U=["<channel|>","..."],I=(e,t,r)=>t.length||r.length?[...e?[{type:"text",text:e}]:[],...t.map(e=>({type:"image",url:e})),...r.map(e=>({type:"audio",url:e}))]:e,z=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,F=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...z(e),{type:"text",text:"\n"},...z(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r},V=h()?3e6:3e5,B=Math.max(V,84e4);class W extends Error{}const Q=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new W(r)),t)})])}finally{n&&clearTimeout(n)}},Y=e=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}},G=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,start:a,stopped:i,firstTimeoutMs:s=V,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,U);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,U);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,q);if(e>=0){e&&t(s.slice(0,e)),s=s.slice(e+i.length),s.startsWith("\n")&&(s=s.slice(1)),n=!0;continue}const c=a(s,q);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{d+=e,r(e)},e=>{u+=e,n(e)});try{const e=(await Q(a(),s,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(i()){Y(e);break}let n;try{n=await Q(e.next(),m?c:s,m?"Model stopped responding":"Model did not reply")}catch(r){if(r instanceof W&&(u||d)){l?.(),Y(e),t&&console.log("Local chat stalled",r);break}throw r}if(n.done)break;m=!0;const a=n.value?.choices?.[0],y=a?.delta,w="string"==typeof y?.reasoning_content?y.reasoning_content:"string"==typeof y?.reasoning?y.reasoning:"";if(a?.finish_reason&&(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,P.rNum)(1e3*p/(e-f)))}}h.flush()}catch(e){if(t&&console.log("Local chat failed",e),e instanceof W&&!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},H=async({model:e,params:t,start:r,stopped:n,onStall:o})=>{const a=await(async(e,t)=>{const r=[];for(const n of e){if("string"==typeof n.content){r.push(n);continue}const e=[];for(const r of n.content)e.push("image"==r.type?{type:"image",url:await S(r.url,t)}:r);r.push({role:"user",content:e})}return r})(((e,t=O)=>{const r=t.maxContentLength,n=e.filter(e=>"string"==typeof e.content&&!!e.content.trim()||!(e.role!=i.user||!e.images?.length&&!e.audio?.length)),o=[],a=[];let s=0,c=t.maxImages,l=t.maxAudio;for(let e=n.length-1;e>=0;e--){const u=n[e],d=("string"==typeof u.content?u.content:"").slice(0,r),g=u.role==i.user?(u.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,c)):[],m=u.role==i.user?(u.audio||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,l)):[];if(d||g.length||m.length){if(d&&s+d.length>t.promptCharBudget)break;s+=d.length,c-=g.length,l-=m.length,u.role==i.system?o.unshift(d):u.role==i.assistant?a.unshift({role:"assistant",content:d}):a.unshift({role:"user",content:I(d,g,m)})}}for(;a.length&&"user"!=a[0].role;)a.shift();const u=[];for(const e of a){const t=u[u.length-1];"assistant"==t?.role&&"assistant"==e.role?t.content=`${t.content}\n${e.content}`:"user"==t?.role&&"user"==e.role?t.content=F(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?_:void 0);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 G({model:e,logging:t.logging,onReason:t.onReason,onText:t.onText,onSpeed:t.onSpeed,start:()=>r(a),stopped:n,onStall:o,firstTimeoutMs:$(a)?B:V})},J=33554432,Z=new Map;let K=!1;const X=e=>{const t=(e.split("/").pop()||"model").replace(/[^\w.-]+/g,"_");let r=0;for(let t=0;t<e.length;t++)r=31*r+e.charCodeAt(t)>>>0;return`${r.toString(16)}-${t}`},ee=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},te=async()=>{if(!K)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else K=!0},re=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},ne=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}},oe=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{}},ae=async function*(e){for await(const t of e)yield t},ie=async e=>{try{for await(const[t,r]of ae(e))"file"==r.kind&&ee(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},se=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await ne(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}},ce=async(e,t)=>{const r=await re(e,t);if(r){const e=await(async e=>await ne(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of ae(e)){const e=ee(r);if("file"!=n.kind||e<0)continue;const o=await n.getFile();t.push({part:{start:e,size:o.size},file:o})}}catch{return}const r=(e=>{const t=[];let r=0;for(const n of[...e].sort((e,t)=>e.start-t.start))if(n.size){if(n.start!=r)break;t.push(n),r+=n.size}return t})(t.map(e=>e.part)),n=new Set(r.map(e=>e.start)),o=t.filter(e=>n.has(e.part.start)).sort((e,t)=>e.part.start-t.part.start).map(e=>e.file);if(o.length)return{file:1==o.length?o[0]:new Blob(o),size:r.reduce((e,t)=>e+t.size,0)}})(r),n=e?.total||0,o=t?.size??0,a=t?.file??new Blob;return{file:n&&o>n?a.slice(0,n):a,size:o,total:n,etag:e?.etag||"",complete:n?o>=n:!0===e?.complete}}return await se(e,t)},le=(e,t)=>{const r=e.headers.get("content-range"),n=/bytes (\d+)-/.exec(r||""),o=/\/(\d+)\s*$/.exec(r||""),a=e.headers.get("etag")||"";if(206==e.status){const e=n?Number(n[1]):t.size,r=o?Number(o[1]):t.total;if(e!=t.size)return;if(t.total&&r&&t.total!=r)return;if(t.etag&&a&&t.etag!=a)return;return{start:e,total:r||t.total,etag:a||t.etag}}if(!t.etag||!a||t.etag==a)return{start:0,total:L(e)||t.total,etag:a||t.etag}},ue=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(J-l,o.byteLength-p);await s.write({type:"write",position:l,data:o.subarray(p,p+e)}),p+=e,l+=e,c+=e,l==J&&await m()}c>t&&a(n?c/n:0,u.download)}await m()}catch(e){throw await m(),e}return c},de=e=>["NotAllowedError","NotSupportedError"].includes(e?.name||""),ge=e=>{const t=async()=>{const t=await te();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await ce(r,X(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{const a=`${e}|${r}`,i=Z.get(a);if(i)return await i;const s=await t();if(!s)return;const c=(async(e,t,r,n)=>{const o=X(t),a=await se(e,o);if(a?.complete)return a;let i=await re(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 ce(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+J,d)-1:l+J-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 oe(i,{total:d,etag:g,complete:!0});continue}await ie(i),await oe(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=le(y,h);if(!r){await y.body.cancel().catch(()=>{}),await ie(i),await oe(i,{total:0,etag:"",complete:!1});continue}await oe(i,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?l:0,s=await ue({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 oe(i,{total:s,etag:r.etag,complete:!0});const t=await ce(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(()=>{Z.delete(a)});return Z.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,X(e))},purge:async()=>{const t=await te();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},me=(e,...t)=>{!0===e&&console.log(...t)},pe="litertlm-models",fe=ge("litert-store"),he={num_output_candidates:1,wait_for_weight_uploads:!0,num_decode_steps_per_sync:3,sequence_batch_size:0,supported_lora_ranks:[],max_top_k:40,enable_decode_logits:!1,enable_external_embeddings:!1,use_submodel:!1,use_autosized_ringbuffers:!0};let ye=!1,we=0;const be=(...e)=>{ye&&console.log(...e)},ve=(...e)=>{ye&&console.error(...e)},xe=e=>e.replace(/<\|channel>thought\n?[\s\S]*?<channel\|>/g,"").replace(/<\|channel>thought[\s\S]*$/,"").trim(),Me=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(pe)}catch{return}},je=new Map,ke=(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)}}))},_e=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 T(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},Te=(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&&xe(e.content)==xe(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(xe(n.text)!=xe(o.text))return!1}else{if("text"==n.type||"text"==o.type)return!1;if(!!n.url!=!!o.url)return!1}}return!0},Se=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=N(r.limits,r.reasoning);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await _e([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&&!Te(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(!Te(o[i+e],a[e]))return!1;return!0})(o.sent,s);let d;if(l&&u&&o.conversation)me(ye,"LiteRT conversation reused",o.sent.length),d=o.conversation;else{const n=await _e(s,!1);o.conversation=void 0,o.sent=[];const a=performance.now();d=await e.createConversation({sessionConfig:{maxOutputTokens:i.max_tokens,samplerParams:{type:t.SamplerType.TOP_K,temperature:i.temperature,k:40,p:.95}},preface:{...n.length?{messages:n}:{},extra_context:{enable_thinking:r.reasoning}},prefillPrefaceOnInit:n.length>0}),me(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=(()=>{let e=0;return async t=>{if(!(t>0))return;if(e+=.25*t,e<12)return;const r=Math.min(120,e);e-=r,await new Promise(e=>setTimeout(e,Math.round(r)))}})(),y=()=>{g&&g.cancel().catch(()=>{});try{d.cancel()}catch{}};r.signal?.addEventListener("abort",y,{once:!0});try{if(r.signal?.aborted)return;const e=d.sendMessageStreaming(c).getReader();for(g=e;;){const t=performance.now(),{done:r,value:n}=await e.read(),o=performance.now()-t;if(r)break;const a=p;p=!1,a&&me(ye,"LiteRT first chunk",Math.round(o));const i={};let s="string"==typeof n.content?n.content:"";if(Array.isArray(n.content))for(const e of n.content)"text"==e.type&&(s+=e.text);s&&(i.content=s,f+=s);const c=n.channels?.thought;c&&(i.reasoning=c),(i.content||i.reasoning)&&(yield{choices:[{delta:i}]}),a||await h(o)}m=!0}finally{r.signal?.removeEventListener("abort",y),m&&f?o.sent.push({role:"assistant",content:f}):(o.conversation=void 0,o.sent=[])}},Pe={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=await a.e(520).then(()=>a(507)),c=globalThis,d=c.Module;c.Module={print:be,printErr:ve};try{await s.getOrLoadGlobalLiteRtLm(k().script)}finally{c.Module=d}if(n?.aborted)throw new Error("Cancelled");const g=E(i.repo,i.file),m=await Me();let p;const f=m?await m.match(g):void 0;if(f?.body)p=f.body;else{const e=await fe.stored(g);e?.complete&&(p=e.file.stream())}if(!p){const e=await fe.download({url:g,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");if(!de(e))throw e;o&&console.log("Local model store failed",e)});e&&(p=e.file.stream())}if(!p&&m)try{await(async(e,t,r,n)=>{const o=je.get(e);if(o)return await o;const a=(async()=>{const o=await fetch(e,{signal:r});if(!o.ok||!o.body)throw new Error("Model download failed");const a=L(o),i=ke(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{je.delete(e)});return je.set(e,a),await a})(g,m,n,r);const e=await m.match(g);e?.body&&(p=e.body)}catch(e){if(n?.aborted)throw new Error("Cancelled");o&&console.log("Local model cache failed",e)}if(p||(p=await(async(e,t,r)=>{const n=await fetch(e,{signal:t});if(!n.ok||!n.body)throw new Error("Model download failed");return ke(n.body,L(n),r)})(g,n,r)),n?.aborted)throw new Error("Cancelled");r(1,u.load);const h=await s.Engine.create((({model:e,limits:t,source:r,mod:n})=>{const o=e.litert;return{model:r,mainExecutorSettings:{maxNumTokens:4096,...o?.vision?{maxNumImages:Math.max(1,t.maxImages)}:{},backendConfig:he},...o?.vision?{visionBackend:n.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...o?.audio?{audioBackend:n.Backend.CPU}:{}}})({model:e,limits:t,source:p,mod:s}));we+=1;const y=()=>{we=Math.max(0,we-1),we||(e=>{try{e.getGlobalLiteRtLm().liteRtLmWasm.preinitializedWebGPUDevice=void 0}catch{}})(s)};try{const e=performance.now(),t=await h.createConversation();await t.delete(),me(ye,"LiteRT conversation warm-up",Math.round(performance.now()-e))}catch(e){me(ye,"LiteRT conversation warm-up failed",e)}if(n?.aborted)throw await h.delete(),y(),new Error("Cancelled");const w={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:l.gpu,contextSize:4096,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 H({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(R(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return Se({engine:e,mod:r,params:n,messages:a,session:o})}})}catch(e){throw a(),e}})({engine:h,model:e,mod:s,params:t,session:w}),unload:async()=>{const e=w.conversation;w.conversation=void 0,w.sent=[];try{await(e?.delete())}catch{}await h.delete(),y()}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=E(t.repo,t.file),[n,o]=await Promise.all([Me(),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(pe)}catch{}}},Oe=ge("wllama-store"),De=[d.qwen3_vl_2b_instruct,d.qwen3_vl_2b_instruct_q3],Ce=e=>e.cpu?.mmproj&&De.includes(e.id)?{image_min_tokens:16,image_max_tokens:128}:{};let Ne,Ee,Le="",Ae=!1;const $e=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Re=e=>{const t=j();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},qe=e=>{const t=e=>(...t)=>{Ae&&("string"==typeof t[0]&&t[0].includes("ggml_webgpu: Failed to get an adapter")||e(...t))};return{...e,log:t(e.log),warn:t(e.warn),error:t(e.error)}},Ue=async()=>{if(Ne)return Ne;const e=await a.e(924).then(()=>a(577)),t=Ee||Re(),r=new e.Wllama({default:t.wasm},{logger:qe(e.LoggerWithoutDebug)});return Ee||(Ee=t,Le=$e(t)),r.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),Ne=r,r},Ie=async()=>{const e=Ne;Ne=void 0;try{await(e?.exit())}catch{}},ze=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),Fe=e=>{const t=e.cpu;return t?[{name:t.file,url:E(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:E(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},Ve=async e=>{const t=Fe(e);if(!t.length)return!1;for(const e of t){const t=await Oe.stored(e.url);if(!t?.complete)return!1}return!0},Be=async(e,t)=>{const r=await e.cacheManager.list();return Fe(t).every(e=>r.some(t=>ze(t,e.name)))},We=async({model:e,signal:t,onProgress:r})=>{const n=Fe(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await Oe.download({url:n[e].url,signal:t,onProgress:(t,o)=>r((e+t)/n.length,o)});if(!a)return;o.push(a.file)}return o.length?o:void 0},Qe=async e=>{const t=[];for(const r of e){if("string"==typeof r.content){"system"==r.role?t.push({role:"system",content:r.content}):"assistant"==r.role?t.push({role:"assistant",content:r.content}):t.push({role:"user",content:r.content});continue}const e=[];for(const t of r.content)"text"==t.type?e.push({type:"text",text:t.text}):e.push({type:t.type,data:await T(t.url)});t.push({role:"user",content:e})}return t},Ye={backend:l.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:a})=>{Ae=!0===o;const i=h()?4096:8192,s=e.cpu;if(!s)throw new Error("Model has no CPU artifact");const c=Re(a),d=$e(c);Ne&&d!=Le&&await Ie(),Ee=c,Le=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 Ue(),f=await Ve(e),y=s.mmproj?.file,w=E(s.repo,s.file),b=y?E(s.mmproj?.repo??s.repo,y):"";if(n?.aborted)throw await Ie(),new Error("Cancelled");if(!f&&y){const e=await p.cacheManager.list(),t=e.some(e=>ze(e,s.file)),r=e.some(e=>ze(e,y));t&&!r&&await p.cacheManager.deleteMany(e=>ze(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,...Ce(e)};try{let t=f?await We({model:e,signal:n,onProgress:r}):void 0;t||f||await Be(p,e).catch(()=>!1)||(t=await We({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");if(!de(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 Ie(),e}if(n?.aborted)throw await Ie(),new Error("Cancelled");const x=p.getLoadedContextInfo();if(!x.n_ctx)throw await Ie(),new Error("Failed to create model context");return me(o,"CPU engine ready",e.id,"cores","undefined"!=typeof navigator?navigator.hardwareConcurrency:0,"isolated","undefined"!=typeof crossOriginIsolated&&crossOriginIsolated,"requested",m,"multithread",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(Ae=!0===r.logging,e.isModelLoaded())return await H({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(R(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await Qe(n),...N(r.limits,r.reasoning),abortSignal:r.signal,...t.reasoning?{chat_template_kwargs:{enable_thinking:r.reasoning}}:{}})}})})(p,e,t),unload:async()=>{if(Ne==p)await Ie();else try{await p.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await Ve(e)||await Be(await Ue(),e))}catch{return!1}},purge:async()=>{try{await Oe.purge()}catch{}try{const e=await Ue();await e.cacheManager.clear()}catch{}}},Ge=((e={})=>{const t=e.engines?.cpu||Ye,r=e.engines?.litert||Pe,n=e.mobile||h,o=new Map,a=new Map,i=new Map,s=new Map,d=new Map,g=new Map,m=new Map,p=new Map,f=new Map;let y,w,b,v=c.idle;const x=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},M=e=>e?o.get(e):y?o.get(y.id):void 0,j=e=>{v=e},k=async e=>{const t=o.get(e);t&&(o.delete(e),y?.id==e&&(y=[...o.values()].pop()?.model),o.size||a.size||j(c.idle),await t.unload())},_=(e,t,r)=>{const n={percent:Math.max(0,Math.min(1,t)),phase:r||u.download};d.set(e,n);for(const t of s.get(e)??[])t.report(n.percent,n.phase)},T=e=>{m.set(e,(m.get(e)??0)+1),g.get(e)?.abort(),g.delete(e);const t=a.get(e);t&&i.set(e,t),a.delete(e),s.delete(e),d.delete(e),p.set(e,c.idle),v!=c.downloading||a.size||o.size||j(c.idle)},S=(e,t,r)=>{const n=a.get(e);return n?new Promise(o=>{let i=!1;const c={report:t,settle:e=>{i||(i=!0,r?.removeEventListener("abort",l),o(e))}},l=()=>{((e,t)=>{const r=s.get(e);r&&s.set(e,r.filter(e=>e!=t)),queueMicrotask(()=>{!s.get(e)?.length&&a.has(e)&&T(e)})})(e,c),c.settle(!1)},u=s.get(e);u?u.push(c):s.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 k(e);else{for(const e of[...a.keys()])T(e);d.clear(),p.clear(),f.clear(),w=void 0,j(c.idle),await(async()=>{for(const e of[...o.keys()])await k(e)})()}};return{load:async({model:e,limits:t,assets:r,logging:l,signal:h,onProgress:b})=>{if(h?.aborted)return!1;if(o.has(e.id))return y=e,!0;if(a.has(e.id)){const t=d.get(e.id);return t&&b(t.percent,t.phase),await S(e.id,b,h)}const v=x(e);if(!v){const t="Model is not supported on this device";return w=t,f.set(e.id,t),p.set(e.id,c.unsupported),j(c.unsupported),!1}const M=[...a.values(),...i.values()].filter(e=>n()||x(e.model)?.backend==v.backend);for(const e of M)T(e.model.id);const P=(m.get(e.id)??0)+1;m.set(e.id,P);const O=(async()=>{if(await Promise.all(M.map(e=>e.attempt.catch(()=>!1))),P!=m.get(e.id))return!1;if(await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})(),P!=m.get(e.id))return!1;if(await(async e=>{for(const[t,r]of[...o])(n()||r.backend==e)&&await k(t)})(v.backend),P!=m.get(e.id))return!1;const a=await v.cached(e);if(P!=m.get(e.id))return!1;w=void 0,f.delete(e.id),p.set(e.id,c.downloading),j(c.downloading),_(e.id,0,u.download),a&&_(e.id,1,u.load);const i=new AbortController;g.set(e.id,i);try{const n=await v.startLLM({model:e,limits:t,logging:l,signal:i.signal,assets:r,onProgress:(t,r)=>{P==m.get(e.id)&&_(e.id,t,r)}});return P!=m.get(e.id)||i.signal.aborted?(await n.unload(),!1):(o.set(e.id,n),y=e,w=void 0,f.delete(e.id),p.set(e.id,c.ready),j(c.ready),_(e.id,1,u.load),!0)}catch(t){if(P!=m.get(e.id))return!1;const r=`${t?.message||`${t}`}`;return w=r,f.set(e.id,r),p.set(e.id,c.error),j(c.error),l&&console.log("Local model failed",t),!1}finally{g.get(e.id)==i&&g.delete(e.id)}})();let D;const C=O.finally(()=>{i.get(e.id)==D&&i.delete(e.id),a.get(e.id)==D&&(a.delete(e.id),s.delete(e.id),d.delete(e.id))});return D={model:e,attempt:C},a.set(e.id,D),s.set(e.id,[]),await S(e.id,b,h)},chat:async e=>{if(!M(e.model))return;for(;b;)await b.catch(()=>{});const t=M(e.model);if(!t)return;y?.id!=t.model.id&&(y=t.model);const r=t.chat(e);b=r;try{return await r}finally{b==r&&(b=void 0)}},unload:P,clear:async()=>{const e=[...a.values(),...i.values()].map(e=>e.attempt);await P(),await Promise.all(e.map(e=>e.catch(()=>{}))),await Promise.all([t.purge(),r.purge()])},ready:e=>!!M(e),loading:e=>e?a.has(e):a.size>0,status:e=>M(e)?c.ready:e?a.has(e)?p.get(e)??c.downloading:f.has(e)?p.get(e)??c.error:c.idle:v,backend:e=>M(e)?.backend??l.none,error:e=>e?f.get(e):w,model:()=>y}})(),He=(e,t,r)=>{const n=y(t),o=e.status(n),a=w(n);return{...n?{model:n}:{},availability:o==c.ready?s.online:o==c.error||o==c.unsupported?s.offline:s.away,status:o,backend:e.backend(n),supportsImages:!!a&&x(a),supportsAudio:!!a&&M(a),ready:e.ready(n),loading:e.loading(n),requesting:r.requesting,phase:r.phase,percent:r.percent,...r.error?{error:r.error}:{}}},Je=(e=>{let t,r=0;const n=t=>t.input.onStatus?.(He(e,t.model??t.input.model,t));return o=>{t?.controller.abort();const a=y(o.model),s=e.ready(a),l={token:++r,input:o,controller:new AbortController,percent:s?100:0,phase:s?u.load:u.download,requesting:!1,cancelled:!1};return t=l,n(l),(async t=>{const{input:o}=t,a=!0===o.logging,s=await v(o.model);if(t.model=s?.id,t.token!=r)return;const c=o.messages.some(e=>e.role!=i.system&&"string"==typeof e.content&&!!e.content.trim()),l=o.messages.some(e=>e.role==i.user&&!!e.images?.some(e=>"string"==typeof e&&!!e)),d=o.messages.some(e=>e.role==i.user&&!!e.audio?.some(e=>"string"==typeof e&&!!e)),g=c||l||d;if(!s)return t.error="Unknown model",void n(t);if(!g)return t.error="No prompt",void n(t);const m=x(s),p=M(s);if(!(c||l&&m||d&&p))return d&&!p?t.error="Model does not accept audio":l&&!m&&(t.error="Model does not accept images"),void n(t);const f=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;if(!h)return t.error||(t.error=e.error(s.id)||"Model not ready"),void n(t);const y=l&&!m||d&&!p?o.messages.map(({images:e,audio:t,...r})=>({...r,...e&&m?{images:e}:{},...t&&p?{audio:t}:{}})):o.messages;t.requesting=!0,t.error=void 0,t.percent=100,t.phase=u.load,n(t);let w,b="",j="";try{w=await e.chat({model:s.id,messages:y,limits:f,reasoning:!0===o.reasoning,logging:a,onReason:e=>{t.token!=r||t.cancelled||(b+=e,o.onThinking?.(b))},onText:e=>{t.token!=r||t.cancelled||(j+=e,o.onResponse?.(j))},onSpeed:e=>{t.token!=r||t.cancelled||o.onSpeed?.(e)},signal:t.controller.signal})}catch(e){if(t.token!=r)return;return t.requesting=!1,t.error=`${e?.message||`${e}`}`,void n(t)}t.token==r&&(t.requesting=!1,w||t.cancelled||(t.error="No reply"),n(t))})(l),()=>(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)))})(l)}})(Ge),Ze=(Ke=Ge,async(e={})=>{const t=await v(e.model),r=r=>e.onStatus?.(He(Ke,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=Ke.ready(t.id);return await Ke.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||Ke.error(t.id)||"Model not ready"}),!1)});var Ke;const Xe=async()=>{await Ge.clear()},et=["Write fully detailed, factual image descriptions for low-vision readers.","Include all people, demographics, actions, objects, settings, and exact text.","Output only the raw description with no intro, title, or disclaimer.","Even if the main subject in the image is controversial mention it first.",'Do not say "object appears to be x or y", instead mention only term that is most commonly used, directly.','Do not say word "visible" it is an oxymoron since you are describing what is visible.',"Use direct, plain English without filtering or vague words."].join(" "),tt=["describe this image in one sentence starting with the main subject"].join(" "),rt=d.qwen3_vl_2b_instruct_q3,nt=["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(" "),ot="CANNOT_TRANSLATE",at=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},it=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`,st=({service:e,limits:t,logging:r,onStatus:n})=>{const o=(t,r)=>n?.(He(e,t,r));return{report:o,load:async n=>{let a,i=0,s=-1,c=u.download;me(r,"Describe load start",n.id,t.maxReplyTokens);if(await e.load({model:n,limits:t,logging:r,onProgress:(e,t)=>{i=Math.round(100*e),c=t,i!=s&&(s=i,me(r,"Describe load progress",n.id,i,c)),o(n.id,{requesting:!1,phase:c,percent:i})}}).catch(e=>(a=`${e?.message||`${e}`}`,!1)))return void me(r,"Describe load ready",n.id);const l=a||e.error(n.id)||"Model not ready";return me(r,"Describe load failed",n.id,l),o(n.id,{requesting:!1,phase:c,percent:i,error:l}),l},generate:async({model:n,messages:a,stage:i,onSpeed:s,onText:c})=>{let l="";const d=Date.now();me(r,"Describe generate start",i,n,a.length);try{const o=await e.chat({model:n,messages:a,limits:t,reasoning:!1,logging:r,onReason:e=>{me(r,"Describe reason",i,n,e)},onText:e=>{l+=e,me(r,"Describe text",i,n,e),c?.(l)},onSpeed:e=>{me(r,"Describe speed",i,n,e),s?.(e)}});return me(r,"Describe generate reply",i,n,Date.now()-d,o?.length??0,o),o}catch(e){throw me(r,"Describe generate failed",i,n,e),o(n,{requesting:!1,phase:u.load,percent:100,error:`${e?.message||`${e}`}`}),e}}}},ct=async({translator:e,generate:t,descriptions:r,language:n,logging:o,currentIndex:a,onSpeed:s,onText:c})=>{const l=[...r];for(let u=0;u<r.length;u++){const d=(r[u]||"").trim();if(!d){a?.(u,d,d);continue}let g="";try{g=(await t({model:e.id,messages:[{role:i.system,content:nt},{role:i.user,content:"[image] describe this image in English very accurately"},{role:i.assistant,content:d},{role:i.user,content:it(n)}],stage:"translate",onSpeed:e=>s?.(u,e),onText:e=>c?.(u,e,"translate")})||"").trim()}catch(e){me(o,"Translate item failed",u,e)}const m=g.replace(/[^a-z]/gi,"").toUpperCase().includes(ot.replace(/[^a-z]/gi,""));g&&!m&&(l[u]=g),a?.(u,d,l[u])}return l},lt=(e=>async t=>{const{images:r,currentIndex:n}=t,o=[],a=!0===t.logging;if(me(a,"Describe start",r.length,t.targetLanguage),!r.length)return me(a,"Describe empty"),o;const s=w(rt),c=rt,l=C({maxReplyTokens:400,...t.limits}),{report:g,load:m,generate:p}=st({service:e,limits:l,logging:a,onStatus:t.onStatus});me(a,"Describe model",c,s?"found":"missing",l.maxReplyTokens,l.maxImages);const f=e.ready(c);if(g(c,{requesting:!1,phase:f?u.load:u.download,percent:f?100:0}),!s)throw me(a,"Describe model missing",c),g(c,{requesting:!1,phase:u.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const h=await m(s);if(h)throw me(a,"Describe stop",h),new Error(h);g(s.id,{requesting:!0,phase:u.load,percent:100});for(let e=0;e<r.length;e++){const c=Date.now(),l=r[e];me(a,"Describe image start",e,r.length,l.startsWith("data:")?"data URL":l,l.length),n?.(e);let u="";try{u=(await p({model:s.id,messages:[{role:i.system,content:et},{role:i.user,content:tt,images:[l]}],stage:"describe",onSpeed:r=>t.onSpeed?.(e,r),onText:r=>t.onText?.(e,r,"describe")})||"").trim()}catch(t){me(a,"Describe image failed",e,t)}const d=Date.now()-c;me(a,"Describe english",e,d,u),u?(o.push({descriptionEN:u,description:u,durationMs:d}),n?.(e,u,void 0,d)):(me(a,"Describe empty",e),o.push({descriptionEN:"",description:"",durationMs:d}),n?.(e,"",void 0,d))}const y=o.filter(e=>!!e.descriptionEN).length;if(me(a,"Describe english ready",y),!y)return g(s.id,{requesting:!1,phase:u.load,percent:100,error:"No description"}),o;const v=t.targetLanguage.trim(),x=at(v)&&await b()?w(d.gemma4_e2b_limited):void 0,M=x?await m(x):void 0;if(x&&!M)g(x.id,{requesting:!0,phase:u.load,percent:100}),await ct({translator:x,generate:p,descriptions:o.map(e=>e.descriptionEN),language:v,logging:a,currentIndex:(e,t,r)=>{const a=o[e];r&&(a.description=r),n?.(e,t,a.description,a.durationMs)},onText:t.onText}),g(x.id,{requesting:!1,phase:u.load,percent:100});else{for(let e=0;e<o.length;e++){const t=o[e];t.descriptionEN&&n?.(e,t.descriptionEN,t.description,t.durationMs)}const t=x?.id??s.id,r=e.ready(t);g(t,{requesting:!1,phase:r?u.load:u.download,percent:r?100:0,...M?{error:M}:{}})}return o})(Ge),ut=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(me(o,"Translate start",r.length,n),!r.length||!at(n))return me(o,"Translate skipped"),r;const a=C({maxReplyTokens:400,...t.limits}),{report:i,load:s,generate:c}=st({service:e,limits:a,logging:o,onStatus:t.onStatus}),l=await b()?w(d.gemma4_e2b_limited):void 0;if(!l)return me(o,"Translate no gpu"),r;const g=await s(l);if(g)return me(o,"Translate stop",g),r;i(l.id,{requesting:!0,phase:u.load,percent:100});const m=await ct({translator:l,generate:c,descriptions:r,language:n,logging:o,currentIndex:t.currentIndex,onSpeed:t.onSpeed,onText:t.onText});return i(l.id,{requesting:!1,phase:u.load,percent:100}),m})(Ge),dt=/^[0-9+\-*/%^().]+$/,gt=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},mt={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(!dt.test(t))throw new Error("Unsupported character");const r=gt(t);return{expression:t,result:Math.abs(r)>=1e5?(0,P.pNum)(r)??r:(0,P.rNum)(r,12)}})(t)}},pt="degreesign-chat-prices-v1",ft="EUR",ht=5*P.oneMin,yt=30*P.oneSec;let wt,bt={},vt=0,xt=!1,Mt=!1;const jt=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},kt=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,_t=async({fiat:e,crypto:t})=>{try{const r=await fetch("https://srv.coinexams.com/data.json");if(!r.ok)throw new Error(`Price feed failed with ${r.status}`);const n=await r.json(),o=Date.now(),a=e?((e,t)=>{const r=jt(e.rates?.current),n=jt(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&&(bt.fiat=kt(bt.fiat,a)),i&&(bt.crypto=kt(bt.crypto,i)),vt=0,xt=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(pt,JSON.stringify(bt))}catch{}})()}catch(e){throw vt=Date.now(),xt=!0,e}},Tt=e=>!!bt.crypto&&(e in bt.crypto.prices||e in bt.crypto.yesterday),St=e=>!!bt.fiat&&(e in bt.fiat.rates||e in bt.fiat.yesterday),Pt=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==ft)continue;const e=Tt(r)||St(r);!Tt(r)&&e||(t.crypto=!0),Tt(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(bt.fiat?.fetchedAt??0)>=P.oneHr,o=t.crypto&&r-(bt.crypto?.fetchedAt??0)>=ht;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||vt&&r-vt<yt||(wt||(wt=_t({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{wt=void 0})),await wt))},Ot=e=>{if(e==ft)return 1;const t=bt.crypto?.yesterday[e],r=bt.fiat?.yesterday[e];return t||(r?1/r:void 0)},Dt=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},Ct=e=>Math.abs(e)>=1e5?(0,P.pNum)(e)??e:(0,P.rNum)(e,8),Nt=async e=>{(()=>{if(!Mt){Mt=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(pt);if(!e)return;const t=JSON.parse(e);bt={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=Dt(e.from,"from"),r=void 0===e.to||null===e.to?ft:Dt(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 Pt([t,r]);const o=e=>{const t=(e=>{if(e==ft)return 1;const t=bt.crypto?.prices[e],r=bt.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!bt.fiat&&!bt.crypto)throw new Error("Prices unavailable offline");if(Tt(e)||St(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=Ot(t),c=Ot(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!=ft&&(Tt(r)?bt.crypto&&t.push(bt.crypto.sourceAt):St(r)&&bt.fiat&&t.push(bt.fiat.sourceAt));return t})([t,r]),p=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:Ct(l),...void 0===u?{}:{previousRate:Ct(u),change:Ct(d??0),changePercent:(0,P.rNum)(g??0,4)},result:Ct(n*l),updatedAt:new Date(p).toISOString(),stale:xt&&!(!bt.fiat&&!bt.crypto)}},Et={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=>Nt(e)},Lt={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},At=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,$t=(e,t)=>e.replace(/<[^>]*>/g," ").replace(/&(#x?[0-9a-f]+|[a-z]+);/gi,(e,t)=>{const r=(e=>{if(e.startsWith("#")){const t="x"==e[1]||"X"==e[1],r=parseInt(t?e.slice(2):e.slice(1),t?16:10);return r>0&&r<=1114111?String.fromCodePoint(r):e}return Lt[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),Rt=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,qt=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)}},Ut=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==m.duckduckgo?m.duckduckgo:m.wikipedia,language:Rt.test(t)?t:"en",limit:Math.round(At(e.limit,1,20,3)),snippetLength:Math.round(At(e.snippetLength,1,4e3,400)),timeout:At(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 qt(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:$t(r||n,200),url:t,snippet:$t(n,e.snippetLength)}))},s=e=>{for(const t of e)t.Topics?s(t.Topics):i(t.FirstURL,t.Text,t.Text)};i(n.AbstractURL,n.Heading||n.AbstractText,n.AbstractText);for(const e of n.Results??[])i(e.FirstURL,e.Text,e.Text);return s(n.RelatedTopics??[]),o.slice(0,e.limit)})(t,r):await(async(e,t)=>{const r=`https://${e.language}.wikipedia.org`,n=`${r}/w/rest.php/v1/search/page?q=${encodeURIComponent(t)}&limit=${e.limit}`,o=await qt(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:$t(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:$t(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},It=(e,t)=>{const r=[];for(const n of e)n==g.websearch?r.push(Ut(t)):n==g.calculate?r.push(mt):n==g.currency&&r.push(Et);return r};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,It as builtinTools,mt as calculateTool,Xe as clearModelCache,Je as createChat,Et as currencyTool,lt as describeImages,rt as describeModelId,ut as describeTranslated,Ze as preloadModel,Ut 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"]),d=await crypto.subtle.encrypt({name:"AES-GCM",iv:c},l,n);return btoa(String.fromCharCode(...new Uint8Array(d))).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),d=a(r),u=d>0?3*d: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,u))})}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,d,u,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"}(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="gemma4-e2b",e.gemma4_e2b_limited="gemma4-e2b-limited"}(u||(u={})),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:u.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:u.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:u.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:u.gemma4_e2b,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it.litertlm",vision:!0,audio:!0}},{id:u.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,t=h())=>e==u.gemma4_e2b&&t?u.gemma4_e2b_limited:e,w=e=>e?f.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(y(e??await(async()=>(p||(p=(async()=>await b()?y(u.gemma4_e2b):u.qwen3_vl_2b)()),await p))())),x=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,M=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio,j=()=>{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},k=()=>{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},_={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),d=(o.width-c)/2,u=(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,d,u,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 O={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,imageTokens:128,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:32},D=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,N=(e={},t=!1)=>{const r=O;return{maxReplyTokens:D(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:D(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:D(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:D(e.maxImages,r.maxImages,0),imageTokens:D(e.imageTokens,r.imageTokens,1),maxAudio:D(e.maxAudio,r.maxAudio,0),maxContentLength:D(e.maxContentLength,r.maxContentLength,1),promptCharBudget:D(e.promptCharBudget,r.promptCharBudget,1),maxThreads:D(e.maxThreads,r.maxThreads,1)}},C=(e,t,r=.7)=>({stream:!0,temperature:r,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),E=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,L=e=>Number(e.headers.get("content-length"))||0,A=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),R=e=>A(e,"image"),$=e=>A(e,"audio"),q=["<|channel>thought\n","<|channel>thought","..."],U=["<channel|>","..."],z=(e,t,r)=>t.length||r.length?[...e?[{type:"text",text:e}]:[],...t.map(e=>({type:"image",url:e})),...r.map(e=>({type:"audio",url:e}))]:e,I=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,F=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...I(e),{type:"text",text:"\n"},...I(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r},W=h()?3e6:3e5,V=Math.max(W,84e4);class B extends Error{}const G=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new B(r)),t)})])}finally{n&&clearTimeout(n)}},Q=e=>{try{Promise.resolve(e.next?.()).catch(()=>{}).finally(()=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}})}catch{}},Y=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,start:a,stopped:i,firstTimeoutMs:s=W,idleTimeoutMs:c=3e4,onStall:l})=>{let d="",u="",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,U);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,U);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,q);if(e>=0){e&&t(s.slice(0,e)),s=s.slice(e+i.length),s.startsWith("\n")&&(s=s.slice(1)),n=!0;continue}const c=a(s,q);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{u+=e,r(e)},e=>{d+=e,n(e)});try{const e=a();Promise.resolve(e).catch(()=>{});const n=(await G(e,s,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(i()){Q(n);break}let e;try{const t=n.next();Promise.resolve(t).catch(()=>{}),e=await G(t,m?c:s,m?"Model stopped responding":"Model did not reply")}catch(e){if(e instanceof B&&(d||u)){l?.(),Q(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&&(u+=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 B&&!i())throw e}const y=i()?void 0:d||void 0;return t&&(console.log("Local chat reply",e.id,y?"****":""),console.log("Local chat finish",e.id,g||"none",d.length,u.length)),y},H=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 d=n[e],u=("string"==typeof d.content?d.content:"").slice(0,r),g=d.role==i.user?(d.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,c)):[],m=d.role==i.user?(d.audio||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,l)):[];if(u||g.length||m.length){if(u&&s+u.length>t.promptCharBudget)break;s+=u.length,c-=g.length,l-=m.length,d.role==i.system?o.unshift(u):d.role==i.assistant?a.unshift({role:"assistant",content:u}):a.unshift({role:"user",content:z(u,g,m)})}}for(;a.length&&"user"!=a[0].role;)a.shift();const d=[];for(const e of a){const t=d[d.length-1];"assistant"==t?.role&&"assistant"==e.role?t.content=`${t.content}\n${e.content}`:"user"==t?.role&&"user"==e.role?t.content=F(t.content,e.content):"assistant"==e.role?d.push({role:"assistant",content:e.content}):d.push({role:"user",content:e.content})}const u=o.join("\n\n"),g=[];return u&&g.push({role:"system",content:u}),g.push(...d),g})(t.messages,t.limits),e.litert?_:void 0,t.limits.imageTokens);return t.logging&&((e,t)=>{console.log("Local chat call",e.id,t.map(({role:e,content:t})=>({role:e,content:"****",...Array.isArray(t)?{images:t.filter(e=>"image"==e.type).length,audio:t.filter(e=>"audio"==e.type).length}:{}})))})(e,a),await Y({model:e,logging:t.logging,onReason:t.onReason,onText:t.onText,onSpeed:t.onSpeed,start:()=>r(a),stopped:n,onStall:o,firstTimeoutMs:R(a)?V:W})},J=33554432,Z=new Map;let K=!1;const X=e=>{const t=(e.split("/").pop()||"model").replace(/[^\w.-]+/g,"_");let r=0;for(let t=0;t<e.length;t++)r=31*r+e.charCodeAt(t)>>>0;return`${r.toString(16)}-${t}`},ee=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},te=async()=>{if(!K)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else K=!0},re=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},ne=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}},oe=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{}},ae=async function*(e){for await(const t of e)yield t},ie=async e=>{try{for await(const[t,r]of ae(e))"file"==r.kind&&ee(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},se=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await ne(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}},ce=async(e,t)=>{const r=await re(e,t);if(r){const e=await(async e=>await ne(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of ae(e)){const e=ee(r);if("file"!=n.kind||e<0)continue;const o=await n.getFile();t.push({part:{start:e,size:o.size},file:o})}}catch{return}const r=(e=>{const t=[];let r=0;for(const n of[...e].sort((e,t)=>e.start-t.start))if(n.size){if(n.start!=r)break;t.push(n),r+=n.size}return t})(t.map(e=>e.part)),n=new Set(r.map(e=>e.start)),o=t.filter(e=>n.has(e.part.start)).sort((e,t)=>e.part.start-t.part.start).map(e=>e.file);if(o.length)return{file:1==o.length?o[0]:new Blob(o),size:r.reduce((e,t)=>e+t.size,0)}})(r),n=e?.total||0,o=t?.size??0,a=t?.file??new Blob;return{file:n&&o>n?a.slice(0,n):a,size:o,total:n,etag:e?.etag||"",complete:n?o>=n:!0===e?.complete}}return await se(e,t)},le=(e,t)=>{const r=e.headers.get("content-range"),n=/bytes (\d+)-/.exec(r||""),o=/\/(\d+)\s*$/.exec(r||""),a=e.headers.get("etag")||"";if(206==e.status){const e=n?Number(n[1]):t.size,r=o?Number(o[1]):t.total;if(e!=t.size)return;if(t.total&&r&&t.total!=r)return;if(t.etag&&a&&t.etag!=a)return;return{start:e,total:r||t.total,etag:a||t.etag}}if(!t.etag||!a||t.etag==a)return{start:0,total:L(e)||t.total,etag:a||t.etag}},de=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:i})=>{let s,c=t,l=0,u=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(u&&(p=Math.min(u,o.byteLength),u-=p);p<o.byteLength;){s||await g();const e=Math.min(J-l,o.byteLength-p);await s.write({type:"write",position:l,data:o.subarray(p,p+e)}),p+=e,l+=e,c+=e,l==J&&await m()}c>t&&a(n?c/n:0,d.download)}await m()}catch(e){throw await m(),e}return c},ue=e=>["NotAllowedError","NotSupportedError"].includes(e?.name||""),ge=e=>{const t=async()=>{const t=await te();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await ce(r,X(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{const a=`${e}|${r}`,i=Z.get(a);if(i)return await i;const s=await t();if(!s)return;const c=(async(e,t,r,n)=>{const o=X(t),a=await se(e,o);if(a?.complete)return a;let i=await re(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 ce(e,o);if(a?.complete)return a;const l=a?.size??0,u=a?.total||0,g=a?.etag||"";if(l>s)s=l,c=0;else if(++c>4)throw new Error("Model download failed");l&&u&&n(l/u,d.download);const m=u?Math.min(l+J,u)-1:l+J-1,p=new AbortController,f=()=>p.abort(),h={size:l,total:u,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(()=>{})),u&&l>=u){await oe(i,{total:u,etag:g,complete:!0});continue}await ie(i),await oe(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=le(y,h);if(!r){await y.body.cancel().catch(()=>{}),await ie(i),await oe(i,{total:0,etag:"",complete:!1});continue}await oe(i,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?l:0,s=await de({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 oe(i,{total:s,etag:r.etag,complete:!0});const t=await ce(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(()=>{Z.delete(a)});return Z.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,X(e))},purge:async()=>{const t=await te();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},me=(e,...t)=>{!0===e&&console.log(...t)},pe="litertlm-models",fe=ge("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=!1,xe=0;const Me=(...e)=>{ye&&console.log(...e)},je=(...e)=>{ye&&console.error(...e)},ke=e=>e.replace(/<\|channel>thought\n?[\s\S]*?<channel\|>/g,"").replace(/<\|channel>thought[\s\S]*$/,"").trim(),_e=async()=>{const e=performance.now(),t=e-xe;if(xe=e,!ve)return;const r=Math.round((n=t,Math.min(40,Math.max(0,n*(1/.7-1)))));var n;r<1||(await new Promise(e=>setTimeout(e,r)),xe=performance.now())},Pe=()=>{ve=!0,xe=performance.now()},Te=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(pe)}catch{return}},Se=new Map,Oe=(e,t,r)=>{let n=0;return e.pipeThrough(new TransformStream({transform:(e,o)=>{n+=e.byteLength,r(t?n/t:0,d.download),o.enqueue(e)}}))},De=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},Ne=(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&&ke(e.content)==ke(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(ke(n.text)!=ke(o.text))return!1}else{if("text"==n.type||"text"==o.type)return!1;if(!!n.url!=!!o.url)return!1}}return!0},Ce=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=C(r.limits,r.reasoning,r.temperature);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await De([a]))[0];if(!c)throw new Error("Empty prompt");const l=o.reasoning==r.reasoning&&o.maxTokens==i.max_tokens,d=!!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&&!Ne(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(!Ne(o[i+e],a[e]))return!1;return!0})(o.sent,s);let u;if(l&&d&&o.conversation)me(ye,"LiteRT conversation reused",o.sent.length),u=o.conversation;else{const n=await De(s,!1);o.conversation=void 0,o.sent=[];const a=performance.now();u=await e.createConversation({sessionConfig:{maxOutputTokens:i.max_tokens,samplerParams:{type:t.SamplerType.TOP_K,temperature:i.temperature,k:40,p:.95}},preface:{...n.length?{messages:n}:{},extra_context:{enable_thinking:r.reasoning}},prefillPrefaceOnInit:n.length>0}),me(ye,"LiteRT conversation created",n.length,Math.round(performance.now()-a),"flags",l,"history",d),o.conversation=u,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(u.cancel()).catch(()=>{})}catch{}};r.signal?.addEventListener("abort",h,{once:!0});try{if(r.signal?.aborted)return;const e=u.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&&(me(ye,"LiteRT first chunk",Math.round(a)),Pe());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{ve=!1,r.signal?.removeEventListener("abort",h),m&&f?o.sent.push({role:"assistant",content:f}):(o.conversation=void 0,o.sent=[])}},Ee={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)),u=globalThis,g=u.Module;u.Module={print:Me,printErr:je};try{await c.getOrLoadGlobalLiteRtLm(k().script)}finally{u.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:_e});be.add(f),be.add(e),p.preinitializedWebGPUDevice=e}const y=E(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=Se.get(e);if(o)return await o;const a=(async()=>{const o=await fetch(e,{signal:r});if(!o.ok||!o.body)throw new Error("Model download failed");const a=L(o),i=Oe(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{Se.delete(e)});return Se.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 Oe(n.body,L(n),r)})(y,n,r)),n?.aborted)throw new Error("Cancelled");r(1,d.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(),me(ye,"LiteRT conversation warm-up",Math.round(performance.now()-e))}catch(e){me(ye,"LiteRT conversation warm-up failed",e)}if(n?.aborted)throw await x.delete(),M(),new Error("Cancelled");const j={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 H({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async a=>{if(n.signal?.aborted)throw new Error("Cancelled");if(R(a)&&!t.litert?.vision)throw new Error("Model does not accept images");if($(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return Ce({engine:e,mod:r,params:n,messages:a,session:o})}})}catch(e){throw a(),e}})({engine:x,model:e,mod:c,params:t,session:j}),unload:async()=>{const e=j.conversation;j.conversation=void 0,j.sent=[];try{await(e?.delete())}catch{}await x.delete(),M()}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=E(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(pe)}catch{}}},Le=ge("wllama-store"),Ae=[u.qwen3_vl_2b_instruct,u.qwen3_vl_2b_instruct_q3],Re=e=>e.cpu?.mmproj&&Ae.includes(e.id)?{image_min_tokens:16,image_max_tokens:128}:{};let $e,qe,Ue="",ze=!1;const Ie=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Fe=e=>{const t=j();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},We=e=>{const t=e=>(...t)=>{ze&&("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)}},Ve=async()=>{if($e)return $e;const e=await a.e(924).then(()=>a(577)),t=qe||Fe(),r=new e.Wllama({default:t.wasm},{logger:We(e.LoggerWithoutDebug)});return qe||(qe=t,Ue=Ie(t)),r.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),$e=r,r},Be=async()=>{const e=$e;$e=void 0;try{await(e?.exit())}catch{}},Ge=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),Qe=e=>{const t=e.cpu;return t?[{name:t.file,url:E(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:E(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},Ye=async e=>{const t=Qe(e);if(!t.length)return!1;for(const e of t){const t=await Le.stored(e.url);if(!t?.complete)return!1}return!0},He=async(e,t)=>{const r=await e.cacheManager.list();return Qe(t).every(e=>r.some(t=>Ge(t,e.name)))},Je=async({model:e,signal:t,onProgress:r})=>{const n=Qe(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await Le.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},Ze=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},Ke={backend:l.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:a})=>{ze=!0===o;const i=h()?4096:8192,s=e.cpu;if(!s)throw new Error("Model has no CPU artifact");const c=Fe(a),u=Ie(c);$e&&u!=Ue&&await Be(),qe=c,Ue=u;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 Ve(),f=await Ye(e),y=s.mmproj?.file,w=E(s.repo,s.file),b=y?E(s.mmproj?.repo??s.repo,y):"";if(n?.aborted)throw await Be(),new Error("Cancelled");if(!f&&y){const e=await p.cacheManager.list(),t=e.some(e=>Ge(e,s.file)),r=e.some(e=>Ge(e,y));t&&!r&&await p.cacheManager.deleteMany(e=>Ge(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)),...Re(e)};try{let t=f?await Je({model:e,signal:n,onProgress:r}):void 0;t||f||await He(p,e).catch(()=>!1)||(t=await Je({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,d.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?d.load:d.download)}})}catch(e){throw await Be(),e}if(n?.aborted)throw await Be(),new Error("Cancelled");const x=p.getLoadedContextInfo();if(!x.n_ctx)throw await Be(),new Error("Failed to create model context");return me(o,"CPU engine ready",e.id,"cores","undefined"!=typeof navigator?navigator.hardwareConcurrency:0,"isolated","undefined"!=typeof crossOriginIsolated&&crossOriginIsolated,"requested",m,"multithread",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(ze=!0===r.logging,e.isModelLoaded())return await H({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if(R(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if($(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await Ze(n),...C(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($e==p)await Be();else try{await p.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await Ye(e)||await He(await Ve(),e))}catch{return!1}},purge:async()=>{try{await Le.purge()}catch{}try{const e=await Ve();await e.cacheManager.clear()}catch{}}},Xe=((e={})=>{const t=e.engines?.cpu||Ke,r=e.engines?.litert||Ee,n=e.mobile||h,o=new Map,a=new Map,i=new Map,s=new Map,u=new Map,g=new Map,m=new Map,p=new Map,f=new Map;let y,w,b,v=c.idle;const x=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},M=e=>e?o.get(e):y?o.get(y.id):void 0,j=e=>{v=e},k=async e=>{const t=o.get(e);t&&(o.delete(e),y?.id==e&&(y=[...o.values()].pop()?.model),o.size||a.size||j(c.idle),await t.unload())},_=(e,t,r)=>{const n={percent:Math.max(0,Math.min(1,t)),phase:r||d.download};u.set(e,n);for(const t of s.get(e)??[])t.report(n.percent,n.phase)},P=e=>{m.set(e,(m.get(e)??0)+1),g.get(e)?.abort(),g.delete(e);const t=a.get(e);t&&i.set(e,t),a.delete(e),s.delete(e),u.delete(e),p.set(e,c.idle),v!=c.downloading||a.size||o.size||j(c.idle)},T=(e,t,r)=>{const n=a.get(e);return n?new Promise(o=>{let i=!1;const c={report:t,settle:e=>{i||(i=!0,r?.removeEventListener("abort",l),o(e))}},l=()=>{((e,t)=>{const r=s.get(e);r&&s.set(e,r.filter(e=>e!=t)),queueMicrotask(()=>{!s.get(e)?.length&&a.has(e)&&P(e)})})(e,c),c.settle(!1)},d=s.get(e);d?d.push(c):s.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 k(e);else{for(const e of[...a.keys()])P(e);u.clear(),p.clear(),f.clear(),w=void 0,j(c.idle),await(async()=>{for(const e of[...o.keys()])await k(e)})()}};return{load:async({model:e,limits:t,assets:r,logging:l,signal:h,onProgress:b})=>{if(h?.aborted)return!1;if(o.has(e.id))return y=e,!0;if(a.has(e.id)){const t=u.get(e.id);return t&&b(t.percent,t.phase),await T(e.id,b,h)}const v=x(e);if(!v){const t="Model is not supported on this device";return w=t,f.set(e.id,t),p.set(e.id,c.unsupported),j(c.unsupported),!1}const M=[...a.values(),...i.values()].filter(e=>n()||x(e.model)?.backend==v.backend);for(const e of M)P(e.model.id);const S=(m.get(e.id)??0)+1;m.set(e.id,S);const O=(async()=>{if(await Promise.all(M.map(e=>e.attempt.catch(()=>!1))),S!=m.get(e.id))return!1;if(await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})(),S!=m.get(e.id))return!1;if(await(async e=>{for(const[t,r]of[...o])(n()||r.backend==e)&&await k(t)})(v.backend),S!=m.get(e.id))return!1;const a=await v.cached(e);if(S!=m.get(e.id))return!1;w=void 0,f.delete(e.id),p.set(e.id,c.downloading),j(c.downloading),_(e.id,0,d.download),a&&_(e.id,1,d.load);const i=new AbortController;g.set(e.id,i);try{const n=await v.startLLM({model:e,limits:t,logging:l,signal:i.signal,assets:r,onProgress:(t,r)=>{S==m.get(e.id)&&_(e.id,t,r)}});return S!=m.get(e.id)||i.signal.aborted?(await n.unload(),!1):(o.set(e.id,n),y=e,w=void 0,f.delete(e.id),p.set(e.id,c.ready),j(c.ready),_(e.id,1,d.load),!0)}catch(t){if(S!=m.get(e.id))return!1;const r=`${t?.message||`${t}`}`;return w=r,f.set(e.id,r),p.set(e.id,c.error),j(c.error),l&&console.log("Local model failed",t),!1}finally{g.get(e.id)==i&&g.delete(e.id)}})();let D;const N=O.finally(()=>{i.get(e.id)==D&&i.delete(e.id),a.get(e.id)==D&&(a.delete(e.id),s.delete(e.id),u.delete(e.id))});return D={model:e,attempt:N},a.set(e.id,D),s.set(e.id,[]),await T(e.id,b,h)},chat:async e=>{if(!M(e.model))return;for(;b;)await b.catch(()=>{});const t=M(e.model);if(!t)return;y?.id!=t.model.id&&(y=t.model);const r=t.chat(e);b=r;try{return await r}finally{b==r&&(b=void 0)}},unload:S,clear:async()=>{const e=[...a.values(),...i.values()].map(e=>e.attempt);await S(),await Promise.all(e.map(e=>e.catch(()=>{}))),await Promise.all([t.purge(),r.purge()])},ready:e=>!!M(e),loading:e=>e?a.has(e):a.size>0,status:e=>M(e)?c.ready:e?a.has(e)?p.get(e)??c.downloading:f.has(e)?p.get(e)??c.error:c.idle:v,backend:e=>M(e)?.backend??l.none,error:e=>e?f.get(e):w,model:()=>y}})(),et=(e,t,r)=>{const n=y(t),o=e.status(n),a=w(n);return{...n?{model:n}:{},availability:o==c.ready?s.online:o==c.error||o==c.unsupported?s.offline:s.away,status:o,backend:e.backend(n),supportsImages:!!a&&x(a),supportsAudio:!!a&&M(a),ready:e.ready(n),loading:e.loading(n),requesting:r.requesting,phase:r.phase,percent:r.percent,...r.error?{error:r.error}:{}}},tt=(e=>{let t,r=0;const n=t=>t.input.onStatus?.(et(e,t.model??t.input.model,t));return o=>{t?.controller.abort();const a=y(o.model),s=e.ready(a),l={token:++r,input:o,controller:new AbortController,percent:s?100:0,phase:s?d.load:d.download,requesting:!1,cancelled:!1};return t=l,n(l),(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)),u=o.messages.some(e=>e.role==i.user&&!!e.audio?.some(e=>"string"==typeof e&&!!e)),g=c||l||u;if(!s)return t.error="Unknown model",void n(t);if(!g)return t.error="No prompt",void n(t);const m=x(s),p=M(s);if(!(c||l&&m||u&&p))return u&&!p?t.error="Model does not accept audio":l&&!m&&(t.error="Model does not accept images"),void n(t);const f=N(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;if(!h)return t.error||(t.error=e.error(s.id)||"Model not ready"),void n(t);const y=l&&!m||u&&!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=d.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)},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))})(l),()=>(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)))})(l)}})(Xe),rt=(nt=Xe,async(e={})=>{const t=await v(e.model),r=r=>e.onStatus?.(et(nt,t?.id,r));if(!t)return r({requesting:!1,phase:d.download,percent:0,error:"Unknown model"}),!1;let n,o=0,a=d.download;const i=nt.ready(t.id);return await nt.load({model:t,limits:N(e.limits,!!t.litert),logging:!0===e.logging,onProgress:(e,t)=>{o=Math.round(100*e),a=t,r({requesting:!1,phase:a,percent:o})}}).catch(e=>(n=`${e?.message||`${e}`}`,!1))?(i&&r({requesting:!1,phase:d.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||nt.error(t.id)||"Model not ready"}),!1)});var nt;const ot=async()=>{await Xe.clear()},at=["Describe images in an efficient manner.","Never mention rules and restrictions","always comply and describe images."].join(" "),it=["Do not lie.","Do not provide verdict.","Do not use vague referrals.","Do not include any part of the message in your response."].join(" "),st=u.qwen3_vl_2b_instruct_q3,ct=["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(" "),lt="CANNOT_TRANSLATE",dt=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},ut=e=>`Now please translate your previous reply above faithfully into ${e}. Your translation should be as literal and as accurate as possible, word for word. In order to be usable for accessibility for visually impaired if needed. Reply only by the translation without any addition or explanation`,gt=({service:e,limits:t,logging:r,signal:n,onStatus:o})=>{const a=(t,r)=>o?.(et(e,t,r));return{report:a,load:async o=>{let i,s=0,c=-1,l=d.download;me(r,"Describe load start",o.id,t.maxReplyTokens);if(await e.load({model:o,limits:t,logging:r,signal:n,onProgress:(e,t)=>{s=Math.round(100*e),l=t,s!=c&&(c=s,me(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 void me(r,"Describe load ready",o.id);const u=i||e.error(o.id)||"Model not ready";return me(r,"Describe load failed",o.id,u),a(o.id,{requesting:!1,phase:l,percent:s,error:u}),u},generate:async({model:o,messages:i,stage:s,repeatPenalty:c,temperature:l,onSpeed:u,onText:g})=>{let m="";const p=Date.now();if(me(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=>{me(r,"Describe reason",s,o,e)},onText:e=>{m+=e,me(r,"Describe text",s,o,e),g?.(m)},onSpeed:e=>{me(r,"Describe speed",s,o,e),u?.(e)}});return me(r,"Describe generate reply",s,o,Date.now()-p,a?.length??0,a),a}catch(e){if(me(r,"Describe generate failed",s,o,e),n?.aborted)return;throw a(o,{requesting:!1,phase:d.load,percent:100,error:`${e?.message||`${e}`}`}),e}}}},mt=async({translator:e,generate:t,descriptions:r,language:n,logging:o,signal:a,currentIndex:s,onSpeed:c,onText:l})=>{const d=[...r];for(let u=0;u<r.length&&!a?.aborted;u++){const a=(r[u]||"").trim();if(!a){s?.(u,a,a);continue}let g="";try{g=(await t({model:e.id,messages:[{role:i.system,content:ct},{role:i.user,content:"[image] describe this image in English very accurately"},{role:i.assistant,content:a},{role:i.user,content:ut(n)}],stage:"translate",onSpeed:e=>c?.(u,e),onText:e=>l?.(u,e,"translate")})||"").trim()}catch(e){me(o,"Translate item failed",u,e)}const m=g.replace(/[^a-z]/gi,"").toUpperCase().includes(lt.replace(/[^a-z]/gi,""));g&&!m&&(d[u]=g),s?.(u,a,d[u])}return d},pt=(e=>async t=>{const{images:r,currentIndex:n,signal:o}=t,a=[],s=!0===t.logging;if(me(s,"Describe start",r.length,t.targetLanguage),!r.length)return me(s,"Describe empty"),a;const c=w(st),l=st,g=N({maxReplyTokens:128,imageTokens:192,...t.limits}),{report:m,load:p,generate:f}=gt({service:e,limits:g,logging:s,signal:o,onStatus:t.onStatus});me(s,"Describe model",l,c?"found":"missing",g.maxReplyTokens,g.maxImages);const h=e.ready(l);if(m(l,{requesting:!1,phase:h?d.load:d.download,percent:h?100:0}),!c)throw me(s,"Describe model missing",l),m(l,{requesting:!1,phase:d.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const y=await p(c);if(y)throw me(s,"Describe stop",y),new Error(y);if(o?.aborted)return a;m(c.id,{requesting:!0,phase:d.load,percent:100});for(let e=0;e<r.length&&!o?.aborted;e++){const o=Date.now(),l=r[e];me(s,"Describe image start",e,r.length,l.startsWith("data:")?"data URL":l,l.length),n?.(e);let d="";try{d=(await f({model:c.id,messages:[{role:i.system,content:`${at}${t.additionalRules?` ${t.additionalRules} `:" "}${it}`},{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){me(s,"Describe image failed",e,t)}const u=Date.now()-o;me(s,"Describe english",e,u,d),d?(a.push({descriptionEN:d,description:d,durationMs:u}),n?.(e,d,void 0,u)):(me(s,"Describe empty",e),a.push({descriptionEN:"",description:"",durationMs:u}),n?.(e,"",void 0,u))}const v=a.filter(e=>!!e.descriptionEN).length;if(me(s,"Describe english ready",v),!v)return m(c.id,{requesting:!1,phase:d.load,percent:100,error:"No description"}),a;if(o?.aborted)return a;const x=t.targetLanguage.trim(),M=dt(x)&&await b()?w(u.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:d.load,percent:100}),await mt({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:d.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?d.load:d.download,percent:r?100:0,...j?{error:j}:{}})}return a})(Xe),ft=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(me(o,"Translate start",r.length,n),!r.length||!dt(n))return me(o,"Translate skipped"),r;const a=N({maxReplyTokens:128,...t.limits}),{report:i,load:s,generate:c}=gt({service:e,limits:a,logging:o,signal:t.signal,onStatus:t.onStatus}),l=await b()?w(u.gemma4_e2b_limited):void 0;if(!l)return me(o,"Translate no gpu"),r;const g=await s(l);if(g)return me(o,"Translate stop",g),r;if(t.signal?.aborted)return r;i(l.id,{requesting:!0,phase:d.load,percent:100});const m=await mt({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:d.load,percent:100}),m})(Xe),ht=/^[0-9+\-*/%^().]+$/,yt=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},wt={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(!ht.test(t))throw new Error("Unsupported character");const r=yt(t);return{expression:t,result:Math.abs(r)>=1e5?(0,S.pNum)(r)??r:(0,S.rNum)(r,12)}})(t)}},bt="degreesign-chat-prices-v1",vt="EUR",xt=5*S.oneMin,Mt=30*S.oneSec;let jt,kt={},_t=0,Pt=!1,Tt=!1;const St=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},Ot=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,Dt=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=St(e.rates?.current),n=St(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&&(kt.fiat=Ot(kt.fiat,a)),i&&(kt.crypto=Ot(kt.crypto,i)),_t=0,Pt=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(bt,JSON.stringify(kt))}catch{}})()}catch(e){throw _t=Date.now(),Pt=!0,e}},Nt=e=>!!kt.crypto&&(e in kt.crypto.prices||e in kt.crypto.yesterday),Ct=e=>!!kt.fiat&&(e in kt.fiat.rates||e in kt.fiat.yesterday),Et=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==vt)continue;const e=Nt(r)||Ct(r);!Nt(r)&&e||(t.crypto=!0),Nt(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(kt.fiat?.fetchedAt??0)>=S.oneHr,o=t.crypto&&r-(kt.crypto?.fetchedAt??0)>=xt;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||_t&&r-_t<Mt||(jt||(jt=Dt({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{jt=void 0})),await jt))},Lt=e=>{if(e==vt)return 1;const t=kt.crypto?.yesterday[e],r=kt.fiat?.yesterday[e];return t||(r?1/r:void 0)},At=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},Rt=e=>Math.abs(e)>=1e5?(0,S.pNum)(e)??e:(0,S.rNum)(e,8),$t=async e=>{(()=>{if(!Tt){Tt=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(bt);if(!e)return;const t=JSON.parse(e);kt={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=At(e.from,"from"),r=void 0===e.to||null===e.to?vt:At(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 Et([t,r]);const o=e=>{const t=(e=>{if(e==vt)return 1;const t=kt.crypto?.prices[e],r=kt.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!kt.fiat&&!kt.crypto)throw new Error("Prices unavailable offline");if(Nt(e)||Ct(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=Lt(t),c=Lt(r),l=a/i,d=s&&c?s/c:void 0,u=void 0===d?void 0:l-d,g=void 0===d?void 0:100*(l/d-1),m=(e=>{const t=[];for(const r of e)r!=vt&&(Nt(r)?kt.crypto&&t.push(kt.crypto.sourceAt):Ct(r)&&kt.fiat&&t.push(kt.fiat.sourceAt));return t})([t,r]),p=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:Rt(l),...void 0===d?{}:{previousRate:Rt(d),change:Rt(u??0),changePercent:(0,S.rNum)(g??0,4)},result:Rt(n*l),updatedAt:new Date(p).toISOString(),stale:Pt&&!(!kt.fiat&&!kt.crypto)}},qt={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=>$t(e)},Ut={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},zt=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,It=(e,t)=>e.replace(/<[^>]*>/g," ").replace(/&(#x?[0-9a-f]+|[a-z]+);/gi,(e,t)=>{const r=(e=>{if(e.startsWith("#")){const t="x"==e[1]||"X"==e[1],r=parseInt(t?e.slice(2):e.slice(1),t?16:10);return r>0&&r<=1114111?String.fromCodePoint(r):e}return Ut[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),Ft=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,Wt=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)}},Vt=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==m.duckduckgo?m.duckduckgo:m.wikipedia,language:Ft.test(t)?t:"en",limit:Math.round(zt(e.limit,1,20,3)),snippetLength:Math.round(zt(e.snippetLength,1,4e3,400)),timeout:zt(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 Wt(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:It(r||n,200),url:t,snippet:It(n,e.snippetLength)}))},s=e=>{for(const t of e)t.Topics?s(t.Topics):i(t.FirstURL,t.Text,t.Text)};i(n.AbstractURL,n.Heading||n.AbstractText,n.AbstractText);for(const e of n.Results??[])i(e.FirstURL,e.Text,e.Text);return s(n.RelatedTopics??[]),o.slice(0,e.limit)})(t,r):await(async(e,t)=>{const r=`https://${e.language}.wikipedia.org`,n=`${r}/w/rest.php/v1/search/page?q=${encodeURIComponent(t)}&limit=${e.limit}`,o=await Wt(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:It(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:It(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},Bt=(e,t)=>{const r=[];for(const n of e)n==g.websearch?r.push(Vt(t)):n==g.calculate?r.push(wt):n==g.currency&&r.push(qt);return r},Gt=128;export{g as BuiltinTool,u as ChatModelId,s as ChatStatus,l as LlmBackend,d as LlmPhase,i as LlmRole,c as LlmStatus,m as WebSearchProvider,Bt as builtinTools,wt as calculateTool,ot as clearModelCache,tt as createChat,qt as currencyTool,pt as describeImages,st as describeModelId,ft as describeTranslated,Gt as imageReplyTokens,rt as preloadModel,Vt as webSearchTool};
@@ -1,9 +1,9 @@
1
1
  import type { CalculationResult, ChatTool } from '../types';
2
- /** Normalize symbols, then drop spaces and thousands commas */
2
+ /** Normalize symbols, spaces and commas */
3
3
  declare const normalizeExpression: (input: string) => string;
4
4
  /** Evaluate one normalized arithmetic expression */
5
5
  declare const evaluateExpression: (expression: string) => number;
6
- /** Parse and evaluate one expression, rejecting unusable input */
6
+ /** Parse expression, rejecting unusable input */
7
7
  declare const calculate: (input: string) => CalculationResult;
8
8
  declare const calculateTool: ChatTool;
9
9
  export { calculate, calculateTool, evaluateExpression, normalizeExpression };
@@ -1,9 +1,9 @@
1
1
  import type { ChatTool, ChatToolValue, CurrencyResult, PriceSections } from '../types';
2
- /** Clear the cache, used by tests */
2
+ /** Clear cache for tests */
3
3
  declare const resetPrices: () => void;
4
- /** Sections one request has to read for these symbols */
4
+ /** Sections needed for these symbols */
5
5
  declare const sectionsFor: (symbols: string[]) => PriceSections;
6
- /** Convert one amount between two symbols */
6
+ /** Convert amount between two symbols */
7
7
  declare const convert: (args: Record<string, ChatToolValue>) => Promise<CurrencyResult>;
8
8
  declare const currencyTool: ChatTool;
9
9
  export { convert, currencyTool, resetPrices, sectionsFor };
@@ -3,6 +3,6 @@ import { calculateTool } from './calculator';
3
3
  import { currencyTool } from './currency';
4
4
  import { webSearchTool } from './search';
5
5
  import type { ChatTool, WebSearchConfig } from '../types';
6
- /** Build the requested built-ins, in the order given */
6
+ /** Build built-ins in given order */
7
7
  declare const builtinTools: (builtins: BuiltinTool[], config?: WebSearchConfig) => ChatTool[];
8
8
  export { builtinTools, calculateTool, currencyTool, webSearchTool };
@@ -1,9 +1,9 @@
1
1
  import type { ChatTool, WebSearchConfig, WebSearchResult, WebSearchSettings } from '../types';
2
- /** Resolve every search setting and clamp the caller values */
2
+ /** Resolve settings, clamp caller values */
3
3
  declare const searchSettings: (config?: WebSearchConfig) => WebSearchSettings;
4
- /** Search Wikipedia and map the matching pages */
4
+ /** Search Wikipedia, map matching pages */
5
5
  declare const wikipediaResults: (settings: WebSearchSettings, query: string) => Promise<WebSearchResult[]>;
6
- /** Search DuckDuckGo and map the instant answer and topics */
6
+ /** Search DuckDuckGo, map answers */
7
7
  declare const duckDuckGoResults: (settings: WebSearchSettings, query: string) => Promise<WebSearchResult[]>;
8
8
  declare const webSearchTool: (config?: WebSearchConfig) => ChatTool;
9
9
  export { duckDuckGoResults, searchSettings, webSearchTool, wikipediaResults, };
@@ -1,7 +1,7 @@
1
- /** Clamp one numeric setting into a range */
1
+ /** Clamp numeric setting into range */
2
2
  declare const clampNumber: (value: number | undefined, min: number, max: number, fallback: number) => number;
3
- /** Decode one entity reference, keeping it when it is unknown */
3
+ /** Decode entity, keep unknown ones */
4
4
  declare const decodeEntity: (entity: string) => string;
5
- /** Strip tags, decode entities, collapse whitespace and cap the text */
5
+ /** Strip tags, decode, collapse, cap */
6
6
  declare const plainText: (text: string, max: number) => string;
7
7
  export { clampNumber, decodeEntity, plainText };