@degreesign/chat 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -124,7 +124,7 @@ second, measured from the first token so prompt processing is excluded.
124
124
  `false` when it cannot load.
125
125
 
126
126
  Attach images to a user turn with `images: [dataUrl]`. The package sends them
127
- only to a model with vision support, fits each image to 64 to 72 vision
127
+ only to a model with vision support, fits each image to 128 to 136 vision
128
128
  tokens, snaps both sides to multiples of 32 px, crops the remainder, and caps
129
129
  the number with `limits.maxImages`. The WebGPU engine asks LiteRT for the
130
130
  smallest Gemma 4 vision budget (70 tokens, 630 patches), so it center-crops to a
@@ -315,8 +315,9 @@ description and translation calls use a 600-token reply budget unless
315
315
  100 vision-token window; other models leave the engine image limits unset.
316
316
 
317
317
  The describer and translator each receive a system message that puts accuracy
318
- first: the describer reports only visible detail and the translator preserves
319
- meaning, names and numbers without adding or omitting anything.
318
+ first: the describer reports only visible detail, and the translator translates
319
+ its own previous reply, never the user's instruction, preserving meaning, names
320
+ and numbers without adding or omitting anything.
320
321
 
321
322
  `DescribeImagesInput`:
322
323
 
@@ -516,8 +517,8 @@ user: {next turn}
516
517
  vision or audio support.
517
518
  - Images are collected from the newest turns first and capped by `maxImages`
518
519
  (default 2). Older image parts are dropped and their text stays.
519
- - Every image part keeps its full frame and targets 64 vision tokens, with at
520
- most 72. Both sides are snapped to multiples of 32 px and the remainder is
520
+ - Every image part keeps its full frame and targets 128 vision tokens, with at
521
+ most 136. Both sides are snapped to multiples of 32 px and the remainder is
521
522
  cropped. The WebGPU engine instead center-crops to a 384 x 384 square, the
522
523
  smallest Gemma 4 encoder signature.
523
524
  - Audio is collected from the newest turns first and capped by `maxAudio`
@@ -706,8 +707,8 @@ Yes, on models with vision support. Put image URLs in a user turn's `images`
706
707
  array. Qwen3-VL 2B accepts images on the CPU engine and Gemma 4 E2B accepts
707
708
  images on the desktop WebGPU engine. On a phone or tablet Gemma resolves to
708
709
  `gemma4_e2b_limited`, the text-only browser build, so use `qwen3_vl_2b` for
709
- mobile images. Each image keeps its full frame and targets 64 vision tokens,
710
- at most 72, with both sides snapped to multiples of 32 px and the remainder
710
+ mobile images. Each image keeps its full frame and targets 128 vision tokens,
711
+ at most 136, with both sides snapped to multiples of 32 px and the remainder
711
712
  cropped. The WebGPU engine instead center-crops a 384 x 384 square with the
712
713
  smallest Gemma 4 vision budget. A model without vision drops images
713
714
  when the turn also has text; an image-only turn reports
@@ -1,2 +1,2 @@
1
1
  /*! For license information please see chat.min.mjs.LICENSE.txt */
2
- var e={155(e){e.exports=(()=>{var e={125:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addZ=t.tN=t.monNm=t.tmUTC=t.tmAP=t.moYrDt=t.shortDt=t.fullLong=t.fullDate=t.fullDt=t.invDt=t.dayRes=t.timeStandard=t.dateStandard=t.seoDt=t.thisYear=t.oneMon=t.oneMin=t.oneHr=t.oneDay=t.oneSec=void 0;const r=()=>Date.now(),n=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],a=["st","nd","rd","th"],i=e=>0==+e?"00":+e<10&&+e>=1?`0${e}`:`${e}`,s=e=>{const t=new Date(e);return`${t.getUTCFullYear()}-${i(t.getUTCMonth()+1)}-${i(t.getUTCDate())}`},c=e=>i(e.getUTCHours())+`:${i(e.getUTCMinutes())}`+`:${i(e.getUTCSeconds())}`;t.tN=r,t.monNm=n,t.dayRes=90,t.oneSec=1e3,t.oneMin=6e4,t.oneHr=36e5,t.oneDay=864e5,t.oneMon=27e8,t.addZ=i,t.tmUTC=e=>{const t=new Date(e);return i(t.getUTCHours())+`:${i(t.getUTCMinutes())} UTC`},t.tmAP=e=>{const t=new Date(e),r=t.getHours();return i(r>12?r-12:r)+`:${i(t.getMinutes())}`+(r>=12?"pm":"am")},t.shortDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]}`},t.moYrDt=e=>{const t=new Date(e);return`${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDate=e=>{const t=new Date(e);return`${t.getDate()} ${n[t.getMonth()]} ${t.getFullYear()}`},t.fullLong=e=>`${(e=>{const t=new Date(e),r=t.getDate();return r+a[r<5?r-1:r>4&&r<21?3:r>20&&r<25?r-21:r>24&&r<31?3:0]+` of ${n[t.getMonth()]}`})(e)} ${new Date(e).getFullYear()}`,t.thisYear=e=>(e?new Date(e):new Date)?.getUTCFullYear(),t.dateStandard=s,t.timeStandard=c,t.seoDt=e=>{!e&&(e=r());const t=new Date(e);return`${s(t)}T${c(t)}Z`},t.invDt=e=>{const t=new Date(e);return`${t.getUTCFullYear()}`.split("20")[1]+i(t.getUTCMonth()+1)+i(t.getUTCDate())+`${e}`.slice(10)}},240:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.idRandLong=t.idRandShort=t.idShuffle=void 0;const r=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","@",".","_","0","1","2","3","4","5","6","7","8","9"],n=({data:e,password:t})=>{try{const n=(e,t)=>r.includes(e.toLowerCase())?r[(r.indexOf(e.toLowerCase())+Math.pow(t,3))%r.length]:e;return[...e].map(e=>n(e,Number(t))).join("")}catch{return""}},o=async({data:e,password:t})=>{if(!e||!t)return"";try{crypto.subtle;const r=new TextEncoder,n=r.encode(e),o=r.encode(t),a=await crypto.subtle.digest("SHA-256",o),i=new Uint8Array(a),s=i.slice(0,32),c=i.slice(0,12),l=await crypto.subtle.importKey("raw",s,{name:"AES-GCM"},!1,["encrypt"]),u=await crypto.subtle.encrypt({name:"AES-GCM",iv:c},l,n);return btoa(String.fromCharCode(...new Uint8Array(u))).replace(/\+/g,"a").replace(/\//g,"b").replace(/=/g,"c").toLowerCase()}catch{return""}};t.idShuffle=async({data:e,password:t})=>4==t?.length?n({data:e,password:t}):await o({data:e,password:t}),t.idRandShort=(e=10)=>{try{return crypto.randomUUID()?.replaceAll("-","")?.slice(0,e)}catch(e){return console.log("idRandShort failed",e),""}},t.idRandLong=(e=10)=>{try{const t="abcdefghijklmnopqrstuvwxyz",r=new Uint8Array(e);return crypto.getRandomValues(r),Array.from(r).map(e=>t[e%26]).join("")}catch(e){return console.log("idRandLong failed",e),""}}},246:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.cacheCheck=t.delayCode=void 0;const n=r(125);t.delayCode=async(e=0)=>await new Promise(t=>setTimeout(t,e)),t.cacheCheck=({analysisCacheLimit:e,lastUpdated:t,forceRefresh:r})=>{const o=Date.now();if(t&&(!r&&t>o-e||r&&t>o-n.oneDay))return!0}},792:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isEven=t.pNum=t.sharpeRatio=t.priceVariations=t.nTxtAr=t.zNum=t.addCom=t.adjNum=t.rNum=void 0;const r=[1,.1,.01,.001,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10,1e-11,1e-12,1e-13,1e-14,1e-15,1e-16,1e-17,1e-18,1e-19],n=(e,t=6)=>{const n=+e,o=n?Math.abs(n):0,a=o>1&&t?t-`${Math.round(o)}`.length:0;return n?(n<0?-1:1)*(Number.isInteger(o)||o<1e-16?o:o>1e5?Math.round(o):o>1?Number(o.toFixed(a<0?0:a)):((e,t)=>{let n=0;for(const o of r){if(o<e)return Number(e.toFixed(t+n-1));n++}return e})(o,t)):e},o=(e,t)=>{const r=(n(e,t)+"").split(".");return r[0]=r[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),r.join(".")},a=(e,t=3)=>{const r=Number(e);if(!e||!r)return e+"";const a=Math.abs(r);return(r<0?"-":"")+(a>1e9?o(a/1e9,t)+"b":a>1e6?o(a/1e6,t)+"m":a<1e-6&&a>1e-16?(1+n(a,t)+"").replace(/1./g,"0."):o(a,t))};t.nTxtAr=["zero","one","two","three","four","five","six","seven","eight","nine","ten"],t.rNum=n,t.addCom=o,t.adjNum=a,t.zNum=e=>{const t=Number(e);let r=t?Math.abs(t):0,n=1e10;for(;n>1;)r>n&&(r=Math.round(r/(n/10))*(n/10)),n/=10;return t?(t<0?"-":"")+a(r,2):e},t.pNum=e=>+e||0==+e?Math.round(1e6*+e)/1e6:null,t.priceVariations=e=>{try{let t=0;const r=[...e].sort((e,t)=>e[0]-t[0]),n=e.reduce((e,[,t])=>e+t,0),o=r.find(([,e])=>(t+=e,t>=n/2))[0];return e.filter(([e])=>Math.abs(e-o)/o<.05).map(([e])=>e)}catch{return[]}},t.sharpeRatio=({assetPrices:e,minExpectedReturn:t=.05})=>{if(!e?.length||e?.length<2)return 0;const r=e.slice(1).map((t,r)=>(t-e[r])/e[r]),n=r.reduce((e,t)=>e+t,0)/r.length,o=Math.sqrt(r.reduce((e,t)=>e+Math.pow(t-n,2),0)/r.length);return(n-t)/o},t.isEven=e=>e%2==0},794:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restoreObj=t.restoreObjStr=t.storeObj=t.storeObjStr=t.objNestValueCount=t.objLen=t.objSortSimple=t.objSort=void 0;const n=r(125),o=e=>{try{return Object.keys(e||{})?.length||0}catch(e){return console.log(e),0}},a=e=>{try{return e?.replace(/"/g,"'")}catch(e){return console.log((0,n.tN)(),"storeObjStr failed",e),""}},i=e=>{try{return e?.toString()?.replace(/'/g,'"')}catch(e){console.log((0,n.tN)(),"restoreObjStr failed",e)}};t.objLen=o,t.objNestValueCount=e=>{let t=0;if(o(e))for(const r in e)t+=o(e[r])?1:0;return t},t.objSort=(e={},t,r=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,n])=>null===e[t]||void 0===e[t]?1:null===n[t]||void 0===n[t]?-1:e[t]>n[t]?1*r:-1*r)),t.objSortSimple=(e={},t=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,r])=>null==e?1:null==r?-1:e>r?1*t:-1*t)),t.storeObjStr=a,t.storeObj=e=>{try{return a(JSON.stringify(e))}catch(e){return console.log((0,n.tN)(),"storeObj failed",e),""}},t.restoreObjStr=i,t.restoreObj=e=>{try{if(!e)return;const t=i(e);return t?JSON.parse(t):void 0}catch(e){console.log((0,n.tN)(),"restoreObj failed",e)}}},830:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.phaseDifference=t.compareArrays=t.squeezeArray=t.forecastNextTotal=t.forecastNext=t.getMax=t.getMean=t.getSum=t.maxVl=t.minVl=t.sumArr=void 0;const r=e=>{try{return e?.length?e.reduce((e,t)=>e+t):0}catch(e){return console.log("sumArr failed",e),0}},n=e=>{try{return e?.length?e.reduce((e,t)=>e+t,0):0}catch(e){return console.log("getSum failed",e),0}},o=e=>{try{return e?.length?n(e)/e.length:0}catch(e){return console.log("getMean failed",e),0}},a=e=>{try{return e?.length?Math.max(...e):0}catch(e){return console.log("getMax failed",e),0}},i=e=>{try{if(!e?.length)return 0;const t=[...e].sort((e,t)=>e-t),r=Math.floor(t.length/2);return t.length%2?t[r]:(t[r-1]+t[r])/2}catch(e){return console.log("median failed",e),0}},s=({currentPeriod:e,steps:t=1})=>{try{const r=(Array.isArray(e)?e:[]).filter(Number.isFinite);if(!r.length||t<=0)return[];if(r.length<2){const e=Math.max(0,o(r));return Array.from({length:t},()=>e)}const n=r.length,{slope:s,intercept:c}=(e=>{try{const t=e.length,r=[];for(let n=0;n<t-1;n++)for(let o=n+1;o<t;o++)r.push((e[o]-e[n])/(o-n));const n=i(r);return{slope:n,intercept:i(e.map((e,t)=>e-n*t))}}catch(e){return console.log("theilSen failed",e),{slope:0,intercept:0}}})(r),l=c+s*(n-1),u=a(r),d=u>0?3*u:1/0;return Array.from({length:t},(e,t)=>{const r=t+1,o=l+s*n*Math.log1p(r/n);return Math.max(0,Math.min(o,d))})}catch(e){return console.log("forecastNext failed",e),[]}};t.sumArr=r,t.maxVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]>r&&(r=o[t])}return r},t.minVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]<r&&(r=o[t])}return r},t.getSum=n,t.getMean=o,t.getMax=a,t.forecastNext=s,t.forecastNextTotal=e=>{try{const t=s({currentPeriod:e,steps:e?.length});return n(t)}catch(e){return console.log("forecastNextTotal failed",e),0}},t.squeezeArray=({arr:e,targetLength:t})=>{try{if(!e||0===e.length||t<=0)throw new Error("Invalid input");const n=Math.ceil(e.length/t);return Array.from({length:t},(t,o)=>{const a=o*n,i=Math.min(a+n,e.length),s=e.slice(a,i);return r(s)}).slice(0,t)}catch(e){return console.log("squeezeArray failed",e),[]}},t.compareArrays=({arrays:e})=>{try{const t=[...e],n=Math.min(...t.map(e=>e.length));for(let e=0;e<t.length;e++)t.splice(n);const o=t.map(e=>r(e)),a=[],i=Math.min(...o),s=o.indexOf(i),c=i/Math.max(...o);for(let e=0;e<t.length;e++){const r=t[e];if(a[e]=[],e==s)a[e]=r;else for(let t=0;t<r.length;t++)a[e].push(c*r[t])}return a}catch(t){return console.log("compareArrays failed",t),e}},t.phaseDifference=({array1:e,array2:t})=>{try{let r=e.length,n=e.reduce((e,t)=>e+t)/r,o=t.reduce((e,t)=>e+t)/r,a=e.map(e=>e-n),i=t.map(e=>e-o),s=Math.floor(r/2),c=-1/0,l=0;for(let e=-s;e<=s;e++){let t=0,n=0,o=0,s=0;for(let c=0;c<r;c++){let l=c+e;l>=0&&l<r&&(t+=a[c]*i[l],n+=a[c]*a[c],o+=i[l]*i[l],s++)}if(n>0&&o>0&&s>=.8*r){let r=t/Math.sqrt(n*o);r>c&&(c=r,l=e)}}return l}catch(e){return console.log("phaseDifference failed",e),0}}}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var a=t[n]={exports:{}};return e[n](a,a.exports,r),a.exports}var n={};return(()=>{var e=n;Object.defineProperty(e,"__esModule",{value:!0}),e.idShuffle=e.isEven=e.pNum=e.nTxtAr=e.zNum=e.addCom=e.adjNum=e.rNum=e.sharpeRatio=e.priceVariations=e.timeStandard=e.dateStandard=e.addZ=e.tN=e.monNm=e.tmUTC=e.tmAP=e.moYrDt=e.shortDt=e.fullLong=e.fullDate=e.fullDt=e.invDt=e.dayRes=e.thisYear=e.seoDt=e.oneMon=e.oneMin=e.oneHr=e.oneDay=e.oneSec=e.restoreObj=e.restoreObjStr=e.storeObj=e.storeObjStr=e.objSortSimple=e.objSort=e.objNestValueCount=e.objLen=e.phaseDifference=e.compareArrays=e.squeezeArray=e.forecastNextTotal=e.forecastNext=e.getMax=e.getMean=e.getSum=e.maxVl=e.minVl=e.sumArr=void 0,e.cacheCheck=e.delayCode=e.idRandLong=e.idRandShort=void 0;const t=r(246);Object.defineProperty(e,"cacheCheck",{enumerable:!0,get:function(){return t.cacheCheck}}),Object.defineProperty(e,"delayCode",{enumerable:!0,get:function(){return t.delayCode}});const o=r(830);Object.defineProperty(e,"sumArr",{enumerable:!0,get:function(){return o.sumArr}}),Object.defineProperty(e,"minVl",{enumerable:!0,get:function(){return o.minVl}}),Object.defineProperty(e,"maxVl",{enumerable:!0,get:function(){return o.maxVl}}),Object.defineProperty(e,"getMax",{enumerable:!0,get:function(){return o.getMax}}),Object.defineProperty(e,"getMean",{enumerable:!0,get:function(){return o.getMean}}),Object.defineProperty(e,"getSum",{enumerable:!0,get:function(){return o.getSum}}),Object.defineProperty(e,"forecastNext",{enumerable:!0,get:function(){return o.forecastNext}}),Object.defineProperty(e,"forecastNextTotal",{enumerable:!0,get:function(){return o.forecastNextTotal}}),Object.defineProperty(e,"squeezeArray",{enumerable:!0,get:function(){return o.squeezeArray}}),Object.defineProperty(e,"compareArrays",{enumerable:!0,get:function(){return o.compareArrays}}),Object.defineProperty(e,"phaseDifference",{enumerable:!0,get:function(){return o.phaseDifference}});const a=r(240);Object.defineProperty(e,"idRandLong",{enumerable:!0,get:function(){return a.idRandLong}}),Object.defineProperty(e,"idRandShort",{enumerable:!0,get:function(){return a.idRandShort}}),Object.defineProperty(e,"idShuffle",{enumerable:!0,get:function(){return a.idShuffle}});const i=r(792);Object.defineProperty(e,"addCom",{enumerable:!0,get:function(){return i.addCom}}),Object.defineProperty(e,"adjNum",{enumerable:!0,get:function(){return i.adjNum}}),Object.defineProperty(e,"priceVariations",{enumerable:!0,get:function(){return i.priceVariations}}),Object.defineProperty(e,"nTxtAr",{enumerable:!0,get:function(){return i.nTxtAr}}),Object.defineProperty(e,"rNum",{enumerable:!0,get:function(){return i.rNum}}),Object.defineProperty(e,"zNum",{enumerable:!0,get:function(){return i.zNum}}),Object.defineProperty(e,"sharpeRatio",{enumerable:!0,get:function(){return i.sharpeRatio}}),Object.defineProperty(e,"pNum",{enumerable:!0,get:function(){return i.pNum}}),Object.defineProperty(e,"isEven",{enumerable:!0,get:function(){return i.isEven}});const s=r(125);Object.defineProperty(e,"oneSec",{enumerable:!0,get:function(){return s.oneSec}}),Object.defineProperty(e,"oneDay",{enumerable:!0,get:function(){return s.oneDay}}),Object.defineProperty(e,"oneHr",{enumerable:!0,get:function(){return s.oneHr}}),Object.defineProperty(e,"oneMin",{enumerable:!0,get:function(){return s.oneMin}}),Object.defineProperty(e,"oneMon",{enumerable:!0,get:function(){return s.oneMon}}),Object.defineProperty(e,"seoDt",{enumerable:!0,get:function(){return s.seoDt}}),Object.defineProperty(e,"dayRes",{enumerable:!0,get:function(){return s.dayRes}}),Object.defineProperty(e,"invDt",{enumerable:!0,get:function(){return s.invDt}}),Object.defineProperty(e,"fullDt",{enumerable:!0,get:function(){return s.fullDt}}),Object.defineProperty(e,"fullDate",{enumerable:!0,get:function(){return s.fullDate}}),Object.defineProperty(e,"fullLong",{enumerable:!0,get:function(){return s.fullLong}}),Object.defineProperty(e,"shortDt",{enumerable:!0,get:function(){return s.shortDt}}),Object.defineProperty(e,"moYrDt",{enumerable:!0,get:function(){return s.moYrDt}}),Object.defineProperty(e,"tmAP",{enumerable:!0,get:function(){return s.tmAP}}),Object.defineProperty(e,"tmUTC",{enumerable:!0,get:function(){return s.tmUTC}}),Object.defineProperty(e,"monNm",{enumerable:!0,get:function(){return s.monNm}}),Object.defineProperty(e,"tN",{enumerable:!0,get:function(){return s.tN}}),Object.defineProperty(e,"addZ",{enumerable:!0,get:function(){return s.addZ}}),Object.defineProperty(e,"timeStandard",{enumerable:!0,get:function(){return s.timeStandard}}),Object.defineProperty(e,"dateStandard",{enumerable:!0,get:function(){return s.dateStandard}}),Object.defineProperty(e,"thisYear",{enumerable:!0,get:function(){return s.thisYear}});const c=r(794);Object.defineProperty(e,"objSort",{enumerable:!0,get:function(){return c.objSort}}),Object.defineProperty(e,"objLen",{enumerable:!0,get:function(){return c.objLen}}),Object.defineProperty(e,"objNestValueCount",{enumerable:!0,get:function(){return c.objNestValueCount}}),Object.defineProperty(e,"restoreObj",{enumerable:!0,get:function(){return c.restoreObj}}),Object.defineProperty(e,"restoreObjStr",{enumerable:!0,get:function(){return c.restoreObjStr}}),Object.defineProperty(e,"storeObj",{enumerable:!0,get:function(){return c.storeObj}}),Object.defineProperty(e,"storeObjStr",{enumerable:!0,get:function(){return c.storeObjStr}}),Object.defineProperty(e,"objSortSimple",{enumerable:!0,get:function(){return c.objSortSimple}})})(),n})()}};const t={};function r(n){const o=t[n];if(void 0!==o)return o.exports;const a=t[n]={exports:{}};return e[n].call(a.exports,a,a.exports,r),a.exports}var n,o,a,i,s,c,l,u;let d;r.m=e,r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.f={},r.e=e=>{const t=[];return r.f.j(e,t),Promise.all(t)},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{const e={520:()=>import("./engine-litert.min.mjs"),924:()=>import("./engine-wllama.min.mjs")},t={792:0},n=e=>{let{__webpack_esm_ids__:n,__webpack_esm_modules__:o,__webpack_esm_runtime__:a}=e;var i,s,c=0;for(i in o)r.o(o,i)&&(r.m[i]=o[i]);for(a&&a(r);c<n.length;c++)s=n[c],r.o(t,s)&&t[s]&&t[s][0](),t[s]=0};r.f.j=(o,a)=>{let i=r.o(t,o)?t[o]:void 0;if(0!==i)if(i)a.push(i[1]);else{let r=e[o]().then(n,e=>{throw 0!==t[o]&&(t[o]=void 0),e});r=Promise.race([r,new Promise(e=>i=t[o]=[e])]),a.push(i[1]=r)}}})(),function(e){e.system="system",e.user="user",e.assistant="assistant"}(n||(n={})),function(e){e[e.online=0]="online",e[e.away=1]="away",e[e.offline=2]="offline"}(o||(o={})),function(e){e[e.idle=0]="idle",e[e.downloading=1]="downloading",e[e.ready=2]="ready",e[e.error=3]="error",e[e.unsupported=4]="unsupported"}(a||(a={})),function(e){e.cpu="cpu",e.gpu="gpu",e.none="none"}(i||(i={})),function(e){e.download="download",e.load="load"}(s||(s={})),function(e){e.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"}(c||(c={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(l||(l={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(u||(u={}));const g=[{id:c.qwen3_vl_2b,reasoning:!0,cpu:{repo:"Qwen/Qwen3-VL-2B-Thinking-GGUF",file:"Qwen3VL-2B-Thinking-Q4_K_M.gguf",mmproj:{file:"mmproj-Qwen3VL-2B-Thinking-Q8_0.gguf"}}},{id:c.qwen3_vl_2b_instruct,reasoning:!1,cpu:{repo:"unsloth/Qwen3-VL-2B-Instruct-GGUF",file:"Qwen3-VL-2B-Instruct-Q4_K_M.gguf",mmproj:{repo:"Qwen/Qwen3-VL-2B-Instruct-GGUF",file:"mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf"}}},{id:c.qwen3_vl_2b_instruct_q3,reasoning:!1,cpu:{repo:"unsloth/Qwen3-VL-2B-Instruct-GGUF",file:"Qwen3-VL-2B-Instruct-Q3_K_M.gguf",mmproj:{repo:"Qwen/Qwen3-VL-2B-Instruct-GGUF",file:"mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf"}}},{id:c.gemma4_e2b,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it.litertlm",vision:!0,audio:!0}},{id:c.gemma4_e2b_limited,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it-gpu.litertlm",vision:!1,audio:!1}}],m=e=>{const t=e??("undefined"==typeof navigator?void 0:navigator);if(!t)return!1;if("boolean"==typeof t.userAgentData?.mobile)return t.userAgentData.mobile;const r=t.userAgent||"";return/Android|iPhone|iPad|iPod|Mobile/i.test(r)||/Macintosh/.test(r)&&t.maxTouchPoints>1},p=(e,t=m())=>e==c.gemma4_e2b&&t?c.gemma4_e2b_limited:e,f=e=>e?g.find(t=>t.id==e):void 0,h=async()=>{const e="undefined"==typeof navigator?void 0:navigator.gpu;if(!e)return!1;let t;try{return!!await Promise.race([e.requestAdapter({powerPreference:"high-performance"}),new Promise(e=>{t=setTimeout(()=>e(void 0),1500)})])}catch{return!1}finally{t&&clearTimeout(t)}},y=async e=>f(p(e??await(async()=>(d||(d=(async()=>await h()?p(c.gemma4_e2b):c.qwen3_vl_2b)()),await d))())),w=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,b=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio,v=new URL("./../assets/wllama/wllama.wasm",import.meta.url).href,x=new URL("./../assets/wllama/compat/wllama.wasm",import.meta.url).href,j=new URL("./../assets/wllama/compat/wllama.js",import.meta.url).href,M=new URL("./../assets/litert/litertlm_wasm_internal.js",import.meta.url).href,k=(new URL("./../assets/litert/litertlm_wasm_internal.wasm",import.meta.url).href,{width:384,height:384}),_=async e=>{if(!e.startsWith("data:"))return await(await fetch(e)).arrayBuffer();const t=e.indexOf(","),r=t>=0?e.slice(0,t):"";if(t<0)throw new Error("Invalid image data");if(!r.includes(";base64"))return await(await fetch(e)).arrayBuffer();const n=atob(e.slice(t+1)),o=new Uint8Array(n.length);for(let e=0;e<n.length;e++)o[e]=n.charCodeAt(e);return o.buffer},T=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<=64;e++){const t=Math.ceil(64/e),s=Math.floor(72/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 S=r(155);const P={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:6},O=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,D=(e={},t=!1)=>{const r=P;return{maxReplyTokens:O(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:O(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:O(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:O(e.maxImages,r.maxImages,0),maxAudio:O(e.maxAudio,r.maxAudio,0),maxContentLength:O(e.maxContentLength,r.maxContentLength,1),promptCharBudget:O(e.promptCharBudget,r.promptCharBudget,1),maxThreads:O(e.maxThreads,r.maxThreads,1)}},C=(e,t)=>({stream:!0,temperature:.7,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),N=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,E=e=>Number(e.headers.get("content-length"))||0,A=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),L=e=>A(e,"image"),$=e=>A(e,"audio"),R=["<|channel>thought\n","<|channel>thought","..."],q=["<channel|>","..."],U=(e,t,r)=>t.length||r.length?[...e?[{type:"text",text:e}]:[],...t.map(e=>({type:"image",url:e})),...r.map(e=>({type:"audio",url:e}))]:e,I=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,z=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...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},F=m()?3e6:3e5,V=Math.max(F,84e4);class B extends Error{}const W=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new B(r)),t)})])}finally{n&&clearTimeout(n)}},Q=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=F,idleTimeoutMs:c=3e4,onStall:l})=>{let u="",d="",g="",m=!1,p=0,f=0;const h=((e,t)=>{let r="",n=!1;const o=(e,t)=>{let r=-1,n="";for(const o of t){const t=e.indexOf(o);t>=0&&(r<0||t<r)&&(r=t,n=o)}return{at:r,tag:n}},a=(e,t)=>{let r="";for(const n of t)for(let t=Math.min(e.length,n.length-1);t>r.length;t--)if(e.endsWith(n.slice(0,t))){r=e.slice(e.length-t);break}return r};return{feed:i=>{let s=r+i;for(r="";s;){if(n){const{at:t,tag:i}=o(s,q);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,q);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,R);if(e>=0){e&&t(s.slice(0,e)),s=s.slice(e+i.length),s.startsWith("\n")&&(s=s.slice(1)),n=!0;continue}const c=a(s,R);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{d+=e,r(e)},e=>{u+=e,n(e)});try{const e=(await W(a(),s,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(i()){Q(e);break}let n;try{n=await W(e.next(),m?c:s,m?"Model stopped responding":"Model did not reply")}catch(r){if(r instanceof B&&(u||d)){l?.(),Q(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,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: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:o,onStall:a})=>{const i=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 T(r.url,t)}:r);r.push({role:"user",content:e})}return r})(((e,t=P)=>{const r=t.maxContentLength,o=e.filter(e=>"string"==typeof e.content&&!!e.content.trim()||!(e.role!=n.user||!e.images?.length&&!e.audio?.length)),a=[],i=[];let s=0,c=t.maxImages,l=t.maxAudio;for(let e=o.length-1;e>=0;e--){const u=o[e],d=("string"==typeof u.content?u.content:"").slice(0,r),g=u.role==n.user?(u.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,c)):[],m=u.role==n.user?(u.audio||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,l)):[];if(d||g.length||m.length){if(d&&s+d.length>t.promptCharBudget)break;s+=d.length,c-=g.length,l-=m.length,u.role==n.system?a.unshift(d):u.role==n.assistant?i.unshift({role:"assistant",content:d}):i.unshift({role:"user",content:U(d,g,m)})}}for(;i.length&&"user"!=i[0].role;)i.shift();const u=[];for(const e of i){const t=u[u.length-1];"assistant"==t?.role&&"assistant"==e.role?t.content=`${t.content}\n${e.content}`:"user"==t?.role&&"user"==e.role?t.content=z(t.content,e.content):"assistant"==e.role?u.push({role:"assistant",content:e.content}):u.push({role:"user",content:e.content})}const d=a.join("\n\n"),g=[];return d&&g.push({role:"system",content:d}),g.push(...u),g})(t.messages,t.limits),e.litert?k: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,i),await G({model:e,logging:t.logging,onReason:t.onReason,onText:t.onText,onSpeed:t.onSpeed,start:()=>r(i),stopped:o,onStall:a,firstTimeoutMs:L(i)?V:F})},Y=33554432,J=new Map;let Z=!1;const K=e=>{const t=(e.split("/").pop()||"model").replace(/[^\w.-]+/g,"_");let r=0;for(let t=0;t<e.length;t++)r=31*r+e.charCodeAt(t)>>>0;return`${r.toString(16)}-${t}`},X=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},ee=async()=>{if(!Z)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else Z=!0},te=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},re=async e=>{if(e)try{const t=await e.getFile(),r=JSON.parse(await t.text());return{total:Number(r.total)||0,etag:`${r.etag||""}`,complete:!0===r.complete}}catch{return}},ne=async(e,t)=>{try{const r=await e.getFileHandle("meta.json",{create:!0}),n=await r.createWritable();await n.write(JSON.stringify(t)),await n.close()}catch{}},oe=async function*(e){for await(const t of e)yield t},ae=async e=>{try{for await(const[t,r]of oe(e))"file"==r.kind&&X(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},ie=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await re(await e.getFileHandle(`${t}.json`).catch(()=>{}));if(!n)return;return{file:r,size:r.size,total:n.total,etag:n.etag,complete:n.total?r.size>=n.total:!0===n.complete}}catch{return}},se=async(e,t)=>{const r=await te(e,t);if(r){const e=await(async e=>await re(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of oe(e)){const e=X(r);if("file"!=n.kind||e<0)continue;const o=await n.getFile();t.push({part:{start:e,size:o.size},file:o})}}catch{return}const r=(e=>{const t=[];let r=0;for(const n of[...e].sort((e,t)=>e.start-t.start))if(n.size){if(n.start!=r)break;t.push(n),r+=n.size}return t})(t.map(e=>e.part)),n=new Set(r.map(e=>e.start)),o=t.filter(e=>n.has(e.part.start)).sort((e,t)=>e.part.start-t.part.start).map(e=>e.file);if(o.length)return{file:1==o.length?o[0]:new Blob(o),size:r.reduce((e,t)=>e+t.size,0)}})(r),n=e?.total||0,o=t?.size??0,a=t?.file??new Blob;return{file:n&&o>n?a.slice(0,n):a,size:o,total:n,etag:e?.etag||"",complete:n?o>=n:!0===e?.complete}}return await ie(e,t)},ce=(e,t)=>{const r=e.headers.get("content-range"),n=/bytes (\d+)-/.exec(r||""),o=/\/(\d+)\s*$/.exec(r||""),a=e.headers.get("etag")||"";if(206==e.status){const e=n?Number(n[1]):t.size,r=o?Number(o[1]):t.total;if(e!=t.size)return;if(t.total&&r&&t.total!=r)return;if(t.etag&&a&&t.etag!=a)return;return{start:e,total:r||t.total,etag:a||t.etag}}if(!t.etag||!a||t.etag==a)return{start:0,total:E(e)||t.total,etag:a||t.etag}},le=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:i})=>{let c,l=t,u=0,d=r;const g=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(l),{create:!0});c=await t.createWritable(),u=0},m=async()=>{const e=c;c=void 0,e&&await e.close().catch(()=>{})};try{const e=o.getReader();for(;;){const{done:r,value:o}=await e.read();if(r)break;i();let p=0;for(d&&(p=Math.min(d,o.byteLength),d-=p);p<o.byteLength;){c||await g();const e=Math.min(Y-u,o.byteLength-p);await c.write({type:"write",position:u,data:o.subarray(p,p+e)}),p+=e,u+=e,l+=e,u==Y&&await m()}l>t&&a(n?l/n:0,s.download)}await m()}catch(e){throw await m(),e}return l},ue=e=>["NotAllowedError","NotSupportedError"].includes(e?.name||""),de=e=>{const t=async()=>{const t=await ee();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await se(r,K(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{const a=`${e}|${r}`,i=J.get(a);if(i)return await i;const c=await t();if(!c)return;const l=(async(e,t,r,n)=>{const o=K(t),a=await ie(e,o);if(a?.complete)return a;let i=await te(e,o);i||(await e.removeEntry(o).catch(()=>{}),await e.removeEntry(`${o}.json`).catch(()=>{}),i=await e.getDirectoryHandle(o,{create:!0}));let c=0,l=0;for(;;){if(r?.aborted)throw new Error("Cancelled");const a=await se(e,o);if(a?.complete)return a;const u=a?.size??0,d=a?.total||0,g=a?.etag||"";if(u>c)c=u,l=0;else if(++l>4)throw new Error("Model download failed");u&&d&&n(u/d,s.download);const m=d?Math.min(u+Y,d)-1:u+Y-1,p=new AbortController,f=()=>p.abort(),h={size:u,total:d,etag:g};let y,w=setTimeout(f,3e4);r?.addEventListener("abort",f,{once:!0});try{if(y=await fetch(t,{signal:p.signal,headers:{Range:`bytes=${u}-${m}`}}),416==y.status){if(await(y.body?.cancel().catch(()=>{})),d&&u>=d){await ne(i,{total:d,etag:g,complete:!0});continue}await ae(i),await ne(i,{total:0,etag:"",complete:!1});continue}if(!y.ok||!y.body)throw await(y.body?.cancel().catch(()=>{})),new Error("Model download failed");const r=ce(y,h);if(!r){await y.body.cancel().catch(()=>{}),await ae(i),await ne(i,{total:0,etag:"",complete:!1});continue}await ne(i,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?u:0,s=await le({dir:i,start:r.start+a,skip:a,total:r.total,body:y.body,onProgress:n,onChunk:()=>{clearTimeout(w),w=setTimeout(f,3e4)}});if(!r.total){await ne(i,{total:s,etag:r.etag,complete:!0});const t=await se(e,o);if(t)return t}}catch(e){if(r?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&["QuotaExceededError","NotAllowedError","NotSupportedError","InvalidStateError","TypeMismatchError","SecurityError"].includes(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*l))}finally{clearTimeout(w),r?.removeEventListener("abort",f)}}})(c,r,n,o).finally(()=>{J.delete(a)});return J.set(a,l),await l},remove:async e=>{const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,K(e))},purge:async()=>{const t=await ee();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},ge="litertlm-models",me=de("litert-store"),pe={num_output_candidates:1,wait_for_weight_uploads:!0,num_decode_steps_per_sync:3,sequence_batch_size:0,supported_lora_ranks:[],max_top_k:40,enable_decode_logits:!1,enable_external_embeddings:!1,use_submodel:!1,use_autosized_ringbuffers:!0};let fe=!1;const he=(...e)=>{fe&&console.log(...e)},ye=(...e)=>{fe&&console.error(...e)},we=e=>{try{e.getGlobalLiteRtLm().liteRtLmWasm.preinitializedWebGPUDevice=void 0}catch{}},be=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(ge)}catch{return}},ve=new Map,xe=(e,t,r)=>{let n=0;return e.pipeThrough(new TransformStream({transform:(e,o)=>{n+=e.byteLength,r(t?n/t:0,s.download),o.enqueue(e)}}))},je=async(e,t=!0)=>{const r=[];for(const n of e){if("string"==typeof n.content){r.push({role:n.role,content:n.content});continue}const e=[];for(const r of n.content)"text"!=r.type?t?e.push({type:r.type,data:await _(r.url)}):e.push({type:"text",text:`[${r.type}]`}):e.push({type:"text",text:r.text});r.push({role:n.role,content:e})}return r},Me=(e,t)=>{if(e.role!=t.role)return!1;if("string"==typeof e.content||"string"==typeof t.content)return e.content==t.content;if(e.content.length!=t.content.length)return!1;for(let r=0;r<e.content.length;r++){const n=e.content[r],o=t.content[r];if(n.type!=o.type)return!1;if("text"==n.type&&"text"==o.type){if(n.text!=o.text)return!1}else if(("image"==n.type&&"image"==o.type||"audio"==n.type&&"audio"==o.type)&&n.url!=o.url)return!1}return!0},ke=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=C(r.limits,r.reasoning);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await je([a]))[0];if(!c)throw new Error("Empty prompt");const l=!!o.conversation&&o.reasoning==r.reasoning&&o.maxTokens==i.max_tokens&&((e,t)=>{const r="system"==e[0]?.role?e[0]:void 0,n="system"==t[0]?.role?t[0]:void 0;if(!r!=!n)return!1;if(r&&n&&!Me(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(!Me(o[i+e],a[e]))return!1;return!0})(o.sent,s);let u;if(l&&o.conversation)u=o.conversation;else{const n=await je(s,!1);o.conversation=void 0,o.sent=[],u=await e.createConversation({sessionConfig:{maxOutputTokens:i.max_tokens,samplerParams:{type:t.SamplerType.TOP_K,temperature:i.temperature,k:40,p:.95}},preface:{...n.length?{messages:n}:{},extra_context:{enable_thinking:r.reasoning}},prefillPrefaceOnInit:n.length>0}),o.conversation=u,o.reasoning=r.reasoning,o.maxTokens=i.max_tokens,o.sent=[...s]}o.sent.push(a);let d,g=!1,m="";const p=()=>{d&&d.cancel().catch(()=>{});try{u.cancel()}catch{}};r.signal?.addEventListener("abort",p,{once:!0});try{if(r.signal?.aborted)return;const e=u.sendMessageStreaming(c).getReader();for(d=e;;){const{done:t,value:r}=await e.read();if(t)break;const n={};let o="string"==typeof r.content?r.content:"";if(Array.isArray(r.content))for(const e of r.content)"text"==e.type&&(o+=e.text);o&&(n.content=o,m+=o);const a=r.channels?.thought;a&&(n.reasoning=a),(n.content||n.reasoning)&&(yield{choices:[{delta:n}]})}g=!0}finally{r.signal?.removeEventListener("abort",p),g&&m?o.sent.push({role:"assistant",content:m}):(o.conversation=void 0,o.sent=[])}},_e={backend:i.gpu,startLLM:async({model:e,limits:t,onProgress:n,signal:o,logging:a})=>{fe=!0===a;const c=e.litert;if(!c)throw new Error("Model has no LiteRT artifact");const l=await r.e(520).then(()=>r(507)),u=globalThis,d=u.Module;u.Module={print:he,printErr:ye};try{await l.getOrLoadGlobalLiteRtLm(M)}finally{u.Module=d}if(o?.aborted)throw new Error("Cancelled");const g=N(c.repo,c.file),m=await be();let p;const f=m?await m.match(g):void 0;if(f?.body)p=f.body;else{const e=await me.stored(g);e?.complete&&(p=e.file.stream())}if(!p){const e=await me.download({url:g,signal:o,onProgress:n}).catch(e=>{if(o?.aborted)throw new Error("Cancelled");if(!ue(e))throw e;a&&console.log("Local model store failed",e)});e&&(p=e.file.stream())}if(!p&&m)try{await(async(e,t,r,n)=>{const o=ve.get(e);if(o)return await o;const a=(async()=>{const o=await fetch(e,{signal:r});if(!o.ok||!o.body)throw new Error("Model download failed");const a=E(o),i=xe(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{ve.delete(e)});return ve.set(e,a),await a})(g,m,o,n);const e=await m.match(g);e?.body&&(p=e.body)}catch(e){if(o?.aborted)throw new Error("Cancelled");a&&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 xe(n.body,E(n),r)})(g,o,n)),o?.aborted)throw new Error("Cancelled");n(1,s.load);const h=await l.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:pe},...o?.vision?{visionBackend:n.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...o?.audio?{audioBackend:n.Backend.CPU}:{}}})({model:e,limits:t,source:p,mod:l}));if(o?.aborted)throw await h.delete(),we(l),new Error("Cancelled");const y={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:i.gpu,contextSize:4096,chat:t=>(async({engine:e,model:t,mod:r,params:n,session:o})=>{fe=!0===n.logging;const a=()=>{try{o.conversation?.cancel()}catch{}o.conversation=void 0,o.sent=[]};try{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(L(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 ke({engine:e,mod:r,params:n,messages:a,session:o})}})}catch(e){throw a(),e}})({engine:h,model:e,mod:l,params:t,session:y}),unload:async()=>{const e=y.conversation;y.conversation=void 0,y.sent=[];try{await(e?.delete())}catch{}await h.delete(),we(l)}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=N(t.repo,t.file),[n,o]=await Promise.all([be(),me.stored(r)]);if(o?.complete)return!0;try{return!(!n||!await n.match(r))}catch{return!1}},purge:async()=>{try{await me.purge(),"undefined"!=typeof caches&&await caches.delete(ge)}catch{}}},Te=de("wllama-store"),Se=[c.qwen3_vl_2b_instruct,c.qwen3_vl_2b_instruct_q3],Pe=e=>e.cpu?.mmproj&&Se.includes(e.id)?{image_min_tokens:16,image_max_tokens:100}:{};let Oe,De,Ce="",Ne=!1;const Ee=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Ae=e=>{const t={wasm:v,compatWasm:x,compatWorker:j};return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},Le=e=>{const t=e=>(...t)=>{Ne&&("string"==typeof t[0]&&t[0].includes("ggml_webgpu: Failed to get an adapter")||e(...t))};return{...e,log:t(e.log),warn:t(e.warn),error:t(e.error)}},$e=async()=>{if(Oe)return Oe;const e=await r.e(924).then(()=>r(577)),t=De||Ae(),n=new e.Wllama({default:t.wasm},{logger:Le(e.LoggerWithoutDebug)});return De||(De=t,Ce=Ee(t)),n.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),Oe=n,n},Re=async()=>{const e=Oe;Oe=void 0;try{await(e?.exit())}catch{}},qe=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),Ue=e=>{const t=e.cpu;return t?[{name:t.file,url:N(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:N(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},Ie=async e=>{const t=Ue(e);if(!t.length)return!1;for(const e of t){const t=await Te.stored(e.url);if(!t?.complete)return!1}return!0},ze=async(e,t)=>{const r=await e.cacheManager.list();return Ue(t).every(e=>r.some(t=>qe(t,e.name)))},Fe=async({model:e,signal:t,onProgress:r})=>{const n=Ue(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await Te.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},Ve=async e=>{const t=[];for(const r of e){if("string"==typeof r.content){"system"==r.role?t.push({role:"system",content:r.content}):"assistant"==r.role?t.push({role:"assistant",content:r.content}):t.push({role:"user",content:r.content});continue}const e=[];for(const t of r.content)"text"==t.type?e.push({type:"text",text:t.text}):e.push({type:t.type,data:await _(t.url)});t.push({role:"user",content:e})}return t},Be={backend:i.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:a})=>{Ne=!0===o;const c=m()?4096:8192,l=e.cpu;if(!l)throw new Error("Model has no CPU artifact");const u=Ae(a),d=Ee(u);Oe&&d!=Ce&&await Re(),De=u,Ce=d;const g=((e,t,r=!1)=>Math.max(1,Math.min(Math.max(2,Math.min(8,(e||4)-1)),t,r?2:3)))("undefined"!=typeof navigator&&navigator.hardwareConcurrency||4,t.maxThreads,!!l.mmproj),p=await $e(),f=await Ie(e),h=l.mmproj?.file,y=N(l.repo,l.file),w=h?N(l.mmproj?.repo??l.repo,h):"";if(n?.aborted)throw await Re(),new Error("Cancelled");if(!f&&h){const e=await p.cacheManager.list(),t=e.some(e=>qe(e,l.file)),r=e.some(e=>qe(e,h));t&&!r&&await p.cacheManager.deleteMany(e=>qe(e,l.file))}const b={n_ctx:c,n_threads:g,reasoning_budget_tokens:t.maxThinkingTokens,n_gpu_layers:0,jinja:!0,...Pe(e)};try{let t=f?await Fe({model:e,signal:n,onProgress:r}):void 0;t||f||await ze(p,e).catch(()=>!1)||(t=await Fe({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,s.load),await p.loadModel(t,b)):await p.loadModelFromUrl(w?{url:y,mmprojUrl:w}:y,{...b,useCache:!0,signal:n,progressCallback:({loaded:e,total:t})=>{const n=t?e/t:0;r(n,n>=1?s.load:s.download)}})}catch(e){throw await Re(),e}if(n?.aborted)throw await Re(),new Error("Cancelled");if(!p.getLoadedContextInfo().n_ctx)throw await Re(),new Error("Failed to create model context");return{model:e,backend:i.cpu,contextSize:c,chat:t=>(async(e,t,r)=>{if(Ne=!0===r.logging,e.isModelLoaded())return await H({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if(L(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if($(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await Ve(n),...C(r.limits,r.reasoning),abortSignal:r.signal,...t.reasoning?{chat_template_kwargs:{enable_thinking:r.reasoning}}:{}})}})})(p,e,t),unload:async()=>{if(Oe==p)await Re();else try{await p.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await Ie(e)||await ze(await $e(),e))}catch{return!1}},purge:async()=>{try{await Te.purge()}catch{}try{const e=await $e();await e.cacheManager.clear()}catch{}}},We=((e={})=>{const t=e.engines?.cpu||Be,r=e.engines?.litert||_e;let n,o,c,l,u,d,g,m=i.none,p=a.idle,f=[],h=0,y={percent:0,phase:s.download};const w=n=>{if(e.backend!=i.none)return e.backend==i.cpu?n.cpu?t:void 0:e.backend==i.gpu?n.litert?r:void 0:n.litert&&"undefined"!=typeof navigator&&navigator.gpu&&"undefined"!=typeof WebAssembly?r:!n.cpu||"undefined"==typeof window&&"undefined"==typeof self&&"undefined"==typeof Worker||"undefined"==typeof WebAssembly?void 0:t},b=async()=>{const e=n;n=void 0,o=void 0,await(e?.unload())},v=(e,t)=>{y={percent:Math.max(0,Math.min(1,e)),phase:t||s.download};for(const e of[...f])e.report(y.percent,y.phase)},x=e=>{p=e},j=()=>{h++,u?.abort(),u=void 0,l=void 0,p==a.downloading&&x(a.idle)},M=(e,t)=>{const r=c;return r?new Promise(n=>{let o=!1;const a={report:e,settle:e=>{o||(o=!0,t?.removeEventListener("abort",i),n(e))}},i=()=>{(e=>{f=f.filter(t=>t!=e),queueMicrotask(()=>{!f.length&&c&&j()})})(a),a.settle(!1)};f.push(a),t?.aborted?i():t?.addEventListener("abort",i,{once:!0}),r.then(a.settle,()=>a.settle(!1))}):Promise.resolve(!1)},k=()=>p==a.ready&&!!n&&!!o,_=async()=>{j(),x(a.idle),await b()};return{load:async({model:e,limits:t,assets:r,logging:i,signal:g,onProgress:p})=>{if(g?.aborted)return!1;if(k()&&o?.id==e.id)return!0;if(c&&l==e.id)return p(y.percent,y.phase),await M(p,g);c&&(j(),f=[],await c.catch(()=>!1));const _=++h,T=(async()=>{await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})();const c=w(e);if(_!=h)return!1;if(!c)return d="Model is not supported on this device",x(a.unsupported),!1;if(await b(),_!=h)return!1;const l=await c.cached(e);if(_!=h)return!1;d=void 0,x(a.downloading),v(0,s.download),l&&v(1,s.load);const g=new AbortController;u=g;try{const l=await c.startLLM({model:e,limits:t,logging:i,signal:g.signal,assets:r,onProgress:(e,t)=>{_==h&&v(e,t)}});return _!=h||g.signal.aborted?(await l.unload(),!1):(n=l,o=e,m=c.backend,d=void 0,x(a.ready),v(1,s.load),!0)}catch(e){return _!=h||(n=void 0,o=void 0,d=`${e?.message||`${e}`}`,i&&console.log("Local model failed",e),x(a.error)),!1}finally{u==g&&(u=void 0)}})().finally(()=>{c==T&&(c=void 0,l=void 0,f=[])});return c=T,l=e.id,await M(p,g)},chat:async e=>{if(!k()||!n)return;for(;g;)await g.catch(()=>{});if(!k()||!n)return;const t=n.chat(e);g=t;try{return await t}finally{g==t&&(g=void 0)}},unload:_,clear:async()=>{const e=c;await _(),await(e?.catch(()=>{})),await Promise.all([t.purge(),r.purge()])},ready:k,loading:()=>!k()&&p==a.downloading,status:()=>p,backend:()=>m,error:()=>d,model:()=>o}})(),Qe=(e,t,r)=>{const n=e.status(),i=p(t),s=f(i);return{...i?{model:i}:{},availability:n==a.ready?o.online:n==a.error||n==a.unsupported?o.offline:o.away,status:n,backend:e.backend(),supportsImages:!!s&&w(s),supportsAudio:!!s&&b(s),ready:e.ready(),loading:e.loading(),requesting:r.requesting,phase:r.phase,percent:r.percent,...r.error?{error:r.error}:{}}},Ge=(e=>{let t,r=0;const o=t=>t.input.onStatus?.(Qe(e,t.model??t.input.model,t));return i=>{t?.controller.abort();const c={token:++r,input:i,controller:new AbortController,percent:e.ready()?100:0,phase:e.ready()?s.load:s.download,requesting:!1,cancelled:!1};return t=c,o(c),(async t=>{const{input:a}=t,i=!0===a.logging,c=await y(a.model);if(t.model=c?.id,t.token!=r)return;const l=a.messages.some(e=>e.role!=n.system&&"string"==typeof e.content&&!!e.content.trim()),u=a.messages.some(e=>e.role==n.user&&!!e.images?.some(e=>"string"==typeof e&&!!e)),d=a.messages.some(e=>e.role==n.user&&!!e.audio?.some(e=>"string"==typeof e&&!!e)),g=l||u||d;if(!c)return t.error="Unknown model",void o(t);if(!g)return t.error="No prompt",void o(t);const m=w(c),p=b(c);if(!(l||u&&m||d&&p))return d&&!p?t.error="Model does not accept audio":u&&!m&&(t.error="Model does not accept images"),void o(t);const f=D(a.limits,!!c.litert),h=await e.load({model:c,limits:f,logging:i,signal:t.controller.signal,onProgress:(e,n)=>{t.token==r&&(t.percent=Math.round(100*e),t.phase=n,o(t))}}).catch(e=>(t.token==r&&(t.error=`${e?.message||`${e}`}`),!1));if(t.token!=r)return;if(t.cancelled)return;if(!h)return t.error||(t.error=e.error()||"Model not ready"),void o(t);const v=u&&!m||d&&!p?a.messages.map(({images:e,audio:t,...r})=>({...r,...e&&m?{images:e}:{},...t&&p?{audio:t}:{}})):a.messages;t.requesting=!0,t.error=void 0,t.percent=100,t.phase=s.load,o(t);let x,j="",M="";try{x=await e.chat({messages:v,limits:f,reasoning:!0===a.reasoning,logging:i,onReason:e=>{t.token!=r||t.cancelled||(j+=e,a.onThinking?.(j))},onText:e=>{t.token!=r||t.cancelled||(M+=e,a.onResponse?.(M))},onSpeed:e=>{t.token!=r||t.cancelled||a.onSpeed?.(e)},signal:t.controller.signal})}catch(e){if(t.token!=r)return;return t.requesting=!1,t.error=`${e?.message||`${e}`}`,void o(t)}t.token==r&&(t.requesting=!1,x||t.cancelled||(t.error="No reply"),o(t))})(c),()=>(t=>{t.token==r&&(t.cancelled=!0,t.controller.abort(),e.status()!=a.ready?queueMicrotask(()=>o(t)):e.unload().then(()=>o(t)))})(c)}})(We),He=(Ye=We,async(e={})=>{const t=await y(e.model),r=r=>e.onStatus?.(Qe(Ye,t?.id,r));if(!t)return r({requesting:!1,phase:s.download,percent:0,error:"Unknown model"}),!1;let n,o=0,a=s.download;const i=Ye.ready()&&Ye.model()?.id==t.id;return await Ye.load({model:t,limits:D(e.limits,!!t.litert),logging:!0===e.logging,onProgress:(e,t)=>{o=Math.round(100*e),a=t,r({requesting:!1,phase:a,percent:o})}}).catch(e=>(n=`${e?.message||`${e}`}`,!1))?(i&&r({requesting:!1,phase:s.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||Ye.error()||"Model not ready"}),!1)});var Ye;const Je=async()=>{await We.clear()},Ze=(e,...t)=>{!0===e&&console.log(...t)},Ke=["Write fully detailed, factual image descriptions for low-vision readers.","Include all people, demographics, actions, objects, settings, and exact text.","Use direct, plain English without filtering or vague words.","Output only the raw description with no intro, title, or disclaimer.","Use English."].join(" "),Xe=["describe this image in one sentence starting with the main subject"].join(" "),et=["You are a precise translator.","Translate the text faithfully and literally into the target language.","Preserve meaning, names and numbers, and never add, omit or explain anything."].join(" "),tt="CANNOT_TRANSLATE",rt=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},nt=e=>`Thanks this was accurate. Now please translate it faithfully into ${e}. This 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`,ot=({service:e,limits:t,logging:r,onStatus:n})=>{const o=(t,r)=>n?.(Qe(e,t,r));return{report:o,load:async n=>{let a,i=0,c=-1,l=s.download;Ze(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),l=t,i!=c&&(c=i,Ze(r,"Describe load progress",n.id,i,l)),o(n.id,{requesting:!1,phase:l,percent:i})}}).catch(e=>(a=`${e?.message||`${e}`}`,!1)))return void Ze(r,"Describe load ready",n.id);const u=a||e.error()||"Model not ready";return Ze(r,"Describe load failed",n.id,u),o(n.id,{requesting:!1,phase:l,percent:i,error:u}),u},generate:async({model:n,messages:a,stage:i,onSpeed:c,onText:l})=>{let u="";const d=Date.now();Ze(r,"Describe generate start",i,n,a.length);try{const o=await e.chat({messages:a,limits:t,reasoning:!1,logging:r,onReason:e=>{Ze(r,"Describe reason",i,n,e)},onText:e=>{u+=e,Ze(r,"Describe text",i,n,e),l?.(u)},onSpeed:e=>{Ze(r,"Describe speed",i,n,e),c?.(e)}});return Ze(r,"Describe generate reply",i,n,Date.now()-d,o?.length??0,o),o}catch(e){throw Ze(r,"Describe generate failed",i,n,e),o(n,{requesting:!1,phase:s.load,percent:100,error:`${e?.message||`${e}`}`}),e}}}},at=async({translator:e,generate:t,descriptions:r,language:o,currentIndex:a,onSpeed:i,onText:s})=>{const c=[...r];for(let l=0;l<r.length;l++){const u=r[l],d=(await t({model:e.id,messages:[{role:n.system,content:et},{role:n.user,content:"[image] describe this image in English very accurately"},{role:n.assistant,content:u},{role:n.user,content:nt(o)}],stage:"translate",onSpeed:e=>i?.(l,e),onText:e=>s?.(l,e,"translate")})||"").trim(),g=d.replace(/[^a-z]/gi,"").toUpperCase().includes(tt.replace(/[^a-z]/gi,""));d&&!g&&(c[l]=d),a?.(l,u,c[l])}return c},it=(e=>async t=>{const{images:r,currentIndex:o}=t,a=[],i=!0===t.logging;if(Ze(i,"Describe start",r.length,t.targetLanguage),!r.length)return Ze(i,"Describe empty"),a;const l=f(c.qwen3_vl_2b_instruct_q3),u=c.qwen3_vl_2b_instruct_q3,d=D({maxReplyTokens:400,...t.limits}),{report:g,load:m,generate:p}=ot({service:e,limits:d,logging:i,onStatus:t.onStatus});if(Ze(i,"Describe model",u,l?"found":"missing",d.maxReplyTokens,d.maxImages),g(u,{requesting:!1,phase:e.ready()?s.load:s.download,percent:e.ready()?100:0}),!l)throw Ze(i,"Describe model missing",u),g(u,{requesting:!1,phase:s.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const y=await m(l);if(y)throw Ze(i,"Describe stop",y),new Error(y);g(l.id,{requesting:!0,phase:s.load,percent:100});for(let e=0;e<r.length;e++){const c=Date.now(),u=r[e];Ze(i,"Describe image start",e,r.length,u.startsWith("data:")?"data URL":u,u.length),o?.(e);const d=await p({model:l.id,messages:[{role:n.system,content:Ke},{role:n.user,content:Xe,images:[u]}],stage:"describe",onSpeed:r=>t.onSpeed?.(e,r),onText:r=>t.onText?.(e,r,"describe")}),m=Date.now()-c,f=(d||"").trim();if(Ze(i,"Describe english",e,m,f),!f)throw Ze(i,"Describe empty",e,d),g(l.id,{requesting:!1,phase:s.load,percent:100,error:"No description"}),new Error("No description");a.push({descriptionEN:f,description:f,durationMs:m}),o?.(e,f,void 0,m)}Ze(i,"Describe english ready",a.length);const w=t.targetLanguage.trim(),b=rt(w)&&await h()?f(c.gemma4_e2b_limited):void 0,v=b?await m(b):void 0;if(b&&!v)g(b.id,{requesting:!0,phase:s.load,percent:100}),await at({translator:b,generate:p,descriptions:a.map(e=>e.descriptionEN),language:w,currentIndex:(e,t,r)=>{const n=a[e];r&&(n.description=r),o?.(e,t,n.description,n.durationMs)},onText:t.onText}),g(b.id,{requesting:!1,phase:s.load,percent:100});else{for(let e=0;e<a.length;e++)o?.(e,a[e].descriptionEN,a[e].description,a[e].durationMs);g(b?.id??l.id,{requesting:!1,phase:e.ready()?s.load:s.download,percent:e.ready()?100:0,...v?{error:v}:{}})}return a})(We),st=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(Ze(o,"Translate start",r.length,n),!r.length||!rt(n))return Ze(o,"Translate skipped"),r;const a=D({maxReplyTokens:400,...t.limits}),{report:i,load:l,generate:u}=ot({service:e,limits:a,logging:o,onStatus:t.onStatus}),d=await h()?f(c.gemma4_e2b_limited):void 0;if(!d)return Ze(o,"Translate no gpu"),r;const g=await l(d);if(g)return Ze(o,"Translate stop",g),r;i(d.id,{requesting:!0,phase:s.load,percent:100});const m=await at({translator:d,generate:u,descriptions:r,language:n,currentIndex:t.currentIndex,onSpeed:t.onSpeed,onText:t.onText});return i(d.id,{requesting:!1,phase:s.load,percent:100}),m})(We),ct=/^[0-9+\-*/%^().]+$/,lt=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},ut={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(!ct.test(t))throw new Error("Unsupported character");const r=lt(t);return{expression:t,result:Math.abs(r)>=1e5?(0,S.pNum)(r)??r:(0,S.rNum)(r,12)}})(t)}},dt="degreesign-chat-prices-v1",gt="EUR",mt=5*S.oneMin,pt=30*S.oneSec;let ft,ht={},yt=0,wt=!1,bt=!1;const vt=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},xt=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,jt=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=vt(e.rates?.current),n=vt(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&&(ht.fiat=xt(ht.fiat,a)),i&&(ht.crypto=xt(ht.crypto,i)),yt=0,wt=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(dt,JSON.stringify(ht))}catch{}})()}catch(e){throw yt=Date.now(),wt=!0,e}},Mt=e=>!!ht.crypto&&(e in ht.crypto.prices||e in ht.crypto.yesterday),kt=e=>!!ht.fiat&&(e in ht.fiat.rates||e in ht.fiat.yesterday),_t=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==gt)continue;const e=Mt(r)||kt(r);!Mt(r)&&e||(t.crypto=!0),Mt(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(ht.fiat?.fetchedAt??0)>=S.oneHr,o=t.crypto&&r-(ht.crypto?.fetchedAt??0)>=mt;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||yt&&r-yt<pt||(ft||(ft=jt({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{ft=void 0})),await ft))},Tt=e=>{if(e==gt)return 1;const t=ht.crypto?.yesterday[e],r=ht.fiat?.yesterday[e];return t||(r?1/r:void 0)},St=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},Pt=e=>Math.abs(e)>=1e5?(0,S.pNum)(e)??e:(0,S.rNum)(e,8),Ot=async e=>{(()=>{if(!bt){bt=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(dt);if(!e)return;const t=JSON.parse(e);ht={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=St(e.from,"from"),r=void 0===e.to||null===e.to?gt:St(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 _t([t,r]);const o=e=>{const t=(e=>{if(e==gt)return 1;const t=ht.crypto?.prices[e],r=ht.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!ht.fiat&&!ht.crypto)throw new Error("Prices unavailable offline");if(Mt(e)||kt(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=Tt(t),c=Tt(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!=gt&&(Mt(r)?ht.crypto&&t.push(ht.crypto.sourceAt):kt(r)&&ht.fiat&&t.push(ht.fiat.sourceAt));return t})([t,r]),p=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:Pt(l),...void 0===u?{}:{previousRate:Pt(u),change:Pt(d??0),changePercent:(0,S.rNum)(g??0,4)},result:Pt(n*l),updatedAt:new Date(p).toISOString(),stale:wt&&!(!ht.fiat&&!ht.crypto)}},Dt={name:"currency",description:"Get the EUR price of a fiat currency, crypto coin or metal, or convert an amount. Returns the 24-hour change.",parameters:{type:"object",properties:{from:{type:"string",description:"Currency, coin or metal to convert from"},to:{type:"string",description:"Currency, coin or metal to convert to, EUR by default"},amount:{type:"number",description:"Amount to convert, 1 by default"}},required:["from"]},execute:e=>Ot(e)},Ct={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},Nt=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,Et=(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 Ct[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),At=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,Lt=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)}},$t=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==u.duckduckgo?u.duckduckgo:u.wikipedia,language:At.test(t)?t:"en",limit:Math.round(Nt(e.limit,1,20,3)),snippetLength:Math.round(Nt(e.snippetLength,1,4e3,400)),timeout:Nt(e.timeout,1e3,3e4,8e3)}})(e);return{name:"websearch",description:t.provider==u.duckduckgo?"Search DuckDuckGo for an instant answer and related topics.":"Search Wikipedia and return a few matching articles.",parameters:{type:"object",properties:{query:{type:"string",description:"What to search for"}},required:["query"]},execute:async e=>{const r="string"==typeof e.query?e.query.trim():"";if(!r)throw new Error("Missing query");const n=t.provider==u.duckduckgo?await(async(e,t)=>{const r=`https://api.duckduckgo.com/?format=json&no_html=1&skip_disambig=1&q=${encodeURIComponent(t)}`,n=await Lt(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:Et(r||n,200),url:t,snippet:Et(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 Lt(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:Et(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:Et(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},Rt=(e,t)=>{const r=[];for(const n of e)n==l.websearch?r.push($t(t)):n==l.calculate?r.push(ut):n==l.currency&&r.push(Dt);return r};export{l as BuiltinTool,c as ChatModelId,o as ChatStatus,i as LlmBackend,s as LlmPhase,n as LlmRole,a as LlmStatus,u as WebSearchProvider,Rt as builtinTools,ut as calculateTool,Je as clearModelCache,Ge as createChat,Dt as currencyTool,it as describeImages,st as describeTranslated,He as preloadModel,$t as webSearchTool};
2
+ var e={155(e){e.exports=(()=>{var e={125:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addZ=t.tN=t.monNm=t.tmUTC=t.tmAP=t.moYrDt=t.shortDt=t.fullLong=t.fullDate=t.fullDt=t.invDt=t.dayRes=t.timeStandard=t.dateStandard=t.seoDt=t.thisYear=t.oneMon=t.oneMin=t.oneHr=t.oneDay=t.oneSec=void 0;const r=()=>Date.now(),n=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],a=["st","nd","rd","th"],i=e=>0==+e?"00":+e<10&&+e>=1?`0${e}`:`${e}`,s=e=>{const t=new Date(e);return`${t.getUTCFullYear()}-${i(t.getUTCMonth()+1)}-${i(t.getUTCDate())}`},c=e=>i(e.getUTCHours())+`:${i(e.getUTCMinutes())}`+`:${i(e.getUTCSeconds())}`;t.tN=r,t.monNm=n,t.dayRes=90,t.oneSec=1e3,t.oneMin=6e4,t.oneHr=36e5,t.oneDay=864e5,t.oneMon=27e8,t.addZ=i,t.tmUTC=e=>{const t=new Date(e);return i(t.getUTCHours())+`:${i(t.getUTCMinutes())} UTC`},t.tmAP=e=>{const t=new Date(e),r=t.getHours();return i(r>12?r-12:r)+`:${i(t.getMinutes())}`+(r>=12?"pm":"am")},t.shortDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]}`},t.moYrDt=e=>{const t=new Date(e);return`${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDate=e=>{const t=new Date(e);return`${t.getDate()} ${n[t.getMonth()]} ${t.getFullYear()}`},t.fullLong=e=>`${(e=>{const t=new Date(e),r=t.getDate();return r+a[r<5?r-1:r>4&&r<21?3:r>20&&r<25?r-21:r>24&&r<31?3:0]+` of ${n[t.getMonth()]}`})(e)} ${new Date(e).getFullYear()}`,t.thisYear=e=>(e?new Date(e):new Date)?.getUTCFullYear(),t.dateStandard=s,t.timeStandard=c,t.seoDt=e=>{!e&&(e=r());const t=new Date(e);return`${s(t)}T${c(t)}Z`},t.invDt=e=>{const t=new Date(e);return`${t.getUTCFullYear()}`.split("20")[1]+i(t.getUTCMonth()+1)+i(t.getUTCDate())+`${e}`.slice(10)}},240:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.idRandLong=t.idRandShort=t.idShuffle=void 0;const r=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","@",".","_","0","1","2","3","4","5","6","7","8","9"],n=({data:e,password:t})=>{try{const n=(e,t)=>r.includes(e.toLowerCase())?r[(r.indexOf(e.toLowerCase())+Math.pow(t,3))%r.length]:e;return[...e].map(e=>n(e,Number(t))).join("")}catch{return""}},o=async({data:e,password:t})=>{if(!e||!t)return"";try{crypto.subtle;const r=new TextEncoder,n=r.encode(e),o=r.encode(t),a=await crypto.subtle.digest("SHA-256",o),i=new Uint8Array(a),s=i.slice(0,32),c=i.slice(0,12),l=await crypto.subtle.importKey("raw",s,{name:"AES-GCM"},!1,["encrypt"]),u=await crypto.subtle.encrypt({name:"AES-GCM",iv:c},l,n);return btoa(String.fromCharCode(...new Uint8Array(u))).replace(/\+/g,"a").replace(/\//g,"b").replace(/=/g,"c").toLowerCase()}catch{return""}};t.idShuffle=async({data:e,password:t})=>4==t?.length?n({data:e,password:t}):await o({data:e,password:t}),t.idRandShort=(e=10)=>{try{return crypto.randomUUID()?.replaceAll("-","")?.slice(0,e)}catch(e){return console.log("idRandShort failed",e),""}},t.idRandLong=(e=10)=>{try{const t="abcdefghijklmnopqrstuvwxyz",r=new Uint8Array(e);return crypto.getRandomValues(r),Array.from(r).map(e=>t[e%26]).join("")}catch(e){return console.log("idRandLong failed",e),""}}},246:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.cacheCheck=t.delayCode=void 0;const n=r(125);t.delayCode=async(e=0)=>await new Promise(t=>setTimeout(t,e)),t.cacheCheck=({analysisCacheLimit:e,lastUpdated:t,forceRefresh:r})=>{const o=Date.now();if(t&&(!r&&t>o-e||r&&t>o-n.oneDay))return!0}},792:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isEven=t.pNum=t.sharpeRatio=t.priceVariations=t.nTxtAr=t.zNum=t.addCom=t.adjNum=t.rNum=void 0;const r=[1,.1,.01,.001,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10,1e-11,1e-12,1e-13,1e-14,1e-15,1e-16,1e-17,1e-18,1e-19],n=(e,t=6)=>{const n=+e,o=n?Math.abs(n):0,a=o>1&&t?t-`${Math.round(o)}`.length:0;return n?(n<0?-1:1)*(Number.isInteger(o)||o<1e-16?o:o>1e5?Math.round(o):o>1?Number(o.toFixed(a<0?0:a)):((e,t)=>{let n=0;for(const o of r){if(o<e)return Number(e.toFixed(t+n-1));n++}return e})(o,t)):e},o=(e,t)=>{const r=(n(e,t)+"").split(".");return r[0]=r[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),r.join(".")},a=(e,t=3)=>{const r=Number(e);if(!e||!r)return e+"";const a=Math.abs(r);return(r<0?"-":"")+(a>1e9?o(a/1e9,t)+"b":a>1e6?o(a/1e6,t)+"m":a<1e-6&&a>1e-16?(1+n(a,t)+"").replace(/1./g,"0."):o(a,t))};t.nTxtAr=["zero","one","two","three","four","five","six","seven","eight","nine","ten"],t.rNum=n,t.addCom=o,t.adjNum=a,t.zNum=e=>{const t=Number(e);let r=t?Math.abs(t):0,n=1e10;for(;n>1;)r>n&&(r=Math.round(r/(n/10))*(n/10)),n/=10;return t?(t<0?"-":"")+a(r,2):e},t.pNum=e=>+e||0==+e?Math.round(1e6*+e)/1e6:null,t.priceVariations=e=>{try{let t=0;const r=[...e].sort((e,t)=>e[0]-t[0]),n=e.reduce((e,[,t])=>e+t,0),o=r.find(([,e])=>(t+=e,t>=n/2))[0];return e.filter(([e])=>Math.abs(e-o)/o<.05).map(([e])=>e)}catch{return[]}},t.sharpeRatio=({assetPrices:e,minExpectedReturn:t=.05})=>{if(!e?.length||e?.length<2)return 0;const r=e.slice(1).map((t,r)=>(t-e[r])/e[r]),n=r.reduce((e,t)=>e+t,0)/r.length,o=Math.sqrt(r.reduce((e,t)=>e+Math.pow(t-n,2),0)/r.length);return(n-t)/o},t.isEven=e=>e%2==0},794:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restoreObj=t.restoreObjStr=t.storeObj=t.storeObjStr=t.objNestValueCount=t.objLen=t.objSortSimple=t.objSort=void 0;const n=r(125),o=e=>{try{return Object.keys(e||{})?.length||0}catch(e){return console.log(e),0}},a=e=>{try{return e?.replace(/"/g,"'")}catch(e){return console.log((0,n.tN)(),"storeObjStr failed",e),""}},i=e=>{try{return e?.toString()?.replace(/'/g,'"')}catch(e){console.log((0,n.tN)(),"restoreObjStr failed",e)}};t.objLen=o,t.objNestValueCount=e=>{let t=0;if(o(e))for(const r in e)t+=o(e[r])?1:0;return t},t.objSort=(e={},t,r=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,n])=>null===e[t]||void 0===e[t]?1:null===n[t]||void 0===n[t]?-1:e[t]>n[t]?1*r:-1*r)),t.objSortSimple=(e={},t=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,r])=>null==e?1:null==r?-1:e>r?1*t:-1*t)),t.storeObjStr=a,t.storeObj=e=>{try{return a(JSON.stringify(e))}catch(e){return console.log((0,n.tN)(),"storeObj failed",e),""}},t.restoreObjStr=i,t.restoreObj=e=>{try{if(!e)return;const t=i(e);return t?JSON.parse(t):void 0}catch(e){console.log((0,n.tN)(),"restoreObj failed",e)}}},830:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.phaseDifference=t.compareArrays=t.squeezeArray=t.forecastNextTotal=t.forecastNext=t.getMax=t.getMean=t.getSum=t.maxVl=t.minVl=t.sumArr=void 0;const r=e=>{try{return e?.length?e.reduce((e,t)=>e+t):0}catch(e){return console.log("sumArr failed",e),0}},n=e=>{try{return e?.length?e.reduce((e,t)=>e+t,0):0}catch(e){return console.log("getSum failed",e),0}},o=e=>{try{return e?.length?n(e)/e.length:0}catch(e){return console.log("getMean failed",e),0}},a=e=>{try{return e?.length?Math.max(...e):0}catch(e){return console.log("getMax failed",e),0}},i=e=>{try{if(!e?.length)return 0;const t=[...e].sort((e,t)=>e-t),r=Math.floor(t.length/2);return t.length%2?t[r]:(t[r-1]+t[r])/2}catch(e){return console.log("median failed",e),0}},s=({currentPeriod:e,steps:t=1})=>{try{const r=(Array.isArray(e)?e:[]).filter(Number.isFinite);if(!r.length||t<=0)return[];if(r.length<2){const e=Math.max(0,o(r));return Array.from({length:t},()=>e)}const n=r.length,{slope:s,intercept:c}=(e=>{try{const t=e.length,r=[];for(let n=0;n<t-1;n++)for(let o=n+1;o<t;o++)r.push((e[o]-e[n])/(o-n));const n=i(r);return{slope:n,intercept:i(e.map((e,t)=>e-n*t))}}catch(e){return console.log("theilSen failed",e),{slope:0,intercept:0}}})(r),l=c+s*(n-1),u=a(r),d=u>0?3*u:1/0;return Array.from({length:t},(e,t)=>{const r=t+1,o=l+s*n*Math.log1p(r/n);return Math.max(0,Math.min(o,d))})}catch(e){return console.log("forecastNext failed",e),[]}};t.sumArr=r,t.maxVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]>r&&(r=o[t])}return r},t.minVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]<r&&(r=o[t])}return r},t.getSum=n,t.getMean=o,t.getMax=a,t.forecastNext=s,t.forecastNextTotal=e=>{try{const t=s({currentPeriod:e,steps:e?.length});return n(t)}catch(e){return console.log("forecastNextTotal failed",e),0}},t.squeezeArray=({arr:e,targetLength:t})=>{try{if(!e||0===e.length||t<=0)throw new Error("Invalid input");const n=Math.ceil(e.length/t);return Array.from({length:t},(t,o)=>{const a=o*n,i=Math.min(a+n,e.length),s=e.slice(a,i);return r(s)}).slice(0,t)}catch(e){return console.log("squeezeArray failed",e),[]}},t.compareArrays=({arrays:e})=>{try{const t=[...e],n=Math.min(...t.map(e=>e.length));for(let e=0;e<t.length;e++)t.splice(n);const o=t.map(e=>r(e)),a=[],i=Math.min(...o),s=o.indexOf(i),c=i/Math.max(...o);for(let e=0;e<t.length;e++){const r=t[e];if(a[e]=[],e==s)a[e]=r;else for(let t=0;t<r.length;t++)a[e].push(c*r[t])}return a}catch(t){return console.log("compareArrays failed",t),e}},t.phaseDifference=({array1:e,array2:t})=>{try{let r=e.length,n=e.reduce((e,t)=>e+t)/r,o=t.reduce((e,t)=>e+t)/r,a=e.map(e=>e-n),i=t.map(e=>e-o),s=Math.floor(r/2),c=-1/0,l=0;for(let e=-s;e<=s;e++){let t=0,n=0,o=0,s=0;for(let c=0;c<r;c++){let l=c+e;l>=0&&l<r&&(t+=a[c]*i[l],n+=a[c]*a[c],o+=i[l]*i[l],s++)}if(n>0&&o>0&&s>=.8*r){let r=t/Math.sqrt(n*o);r>c&&(c=r,l=e)}}return l}catch(e){return console.log("phaseDifference failed",e),0}}}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var a=t[n]={exports:{}};return e[n](a,a.exports,r),a.exports}var n={};return(()=>{var e=n;Object.defineProperty(e,"__esModule",{value:!0}),e.idShuffle=e.isEven=e.pNum=e.nTxtAr=e.zNum=e.addCom=e.adjNum=e.rNum=e.sharpeRatio=e.priceVariations=e.timeStandard=e.dateStandard=e.addZ=e.tN=e.monNm=e.tmUTC=e.tmAP=e.moYrDt=e.shortDt=e.fullLong=e.fullDate=e.fullDt=e.invDt=e.dayRes=e.thisYear=e.seoDt=e.oneMon=e.oneMin=e.oneHr=e.oneDay=e.oneSec=e.restoreObj=e.restoreObjStr=e.storeObj=e.storeObjStr=e.objSortSimple=e.objSort=e.objNestValueCount=e.objLen=e.phaseDifference=e.compareArrays=e.squeezeArray=e.forecastNextTotal=e.forecastNext=e.getMax=e.getMean=e.getSum=e.maxVl=e.minVl=e.sumArr=void 0,e.cacheCheck=e.delayCode=e.idRandLong=e.idRandShort=void 0;const t=r(246);Object.defineProperty(e,"cacheCheck",{enumerable:!0,get:function(){return t.cacheCheck}}),Object.defineProperty(e,"delayCode",{enumerable:!0,get:function(){return t.delayCode}});const o=r(830);Object.defineProperty(e,"sumArr",{enumerable:!0,get:function(){return o.sumArr}}),Object.defineProperty(e,"minVl",{enumerable:!0,get:function(){return o.minVl}}),Object.defineProperty(e,"maxVl",{enumerable:!0,get:function(){return o.maxVl}}),Object.defineProperty(e,"getMax",{enumerable:!0,get:function(){return o.getMax}}),Object.defineProperty(e,"getMean",{enumerable:!0,get:function(){return o.getMean}}),Object.defineProperty(e,"getSum",{enumerable:!0,get:function(){return o.getSum}}),Object.defineProperty(e,"forecastNext",{enumerable:!0,get:function(){return o.forecastNext}}),Object.defineProperty(e,"forecastNextTotal",{enumerable:!0,get:function(){return o.forecastNextTotal}}),Object.defineProperty(e,"squeezeArray",{enumerable:!0,get:function(){return o.squeezeArray}}),Object.defineProperty(e,"compareArrays",{enumerable:!0,get:function(){return o.compareArrays}}),Object.defineProperty(e,"phaseDifference",{enumerable:!0,get:function(){return o.phaseDifference}});const a=r(240);Object.defineProperty(e,"idRandLong",{enumerable:!0,get:function(){return a.idRandLong}}),Object.defineProperty(e,"idRandShort",{enumerable:!0,get:function(){return a.idRandShort}}),Object.defineProperty(e,"idShuffle",{enumerable:!0,get:function(){return a.idShuffle}});const i=r(792);Object.defineProperty(e,"addCom",{enumerable:!0,get:function(){return i.addCom}}),Object.defineProperty(e,"adjNum",{enumerable:!0,get:function(){return i.adjNum}}),Object.defineProperty(e,"priceVariations",{enumerable:!0,get:function(){return i.priceVariations}}),Object.defineProperty(e,"nTxtAr",{enumerable:!0,get:function(){return i.nTxtAr}}),Object.defineProperty(e,"rNum",{enumerable:!0,get:function(){return i.rNum}}),Object.defineProperty(e,"zNum",{enumerable:!0,get:function(){return i.zNum}}),Object.defineProperty(e,"sharpeRatio",{enumerable:!0,get:function(){return i.sharpeRatio}}),Object.defineProperty(e,"pNum",{enumerable:!0,get:function(){return i.pNum}}),Object.defineProperty(e,"isEven",{enumerable:!0,get:function(){return i.isEven}});const s=r(125);Object.defineProperty(e,"oneSec",{enumerable:!0,get:function(){return s.oneSec}}),Object.defineProperty(e,"oneDay",{enumerable:!0,get:function(){return s.oneDay}}),Object.defineProperty(e,"oneHr",{enumerable:!0,get:function(){return s.oneHr}}),Object.defineProperty(e,"oneMin",{enumerable:!0,get:function(){return s.oneMin}}),Object.defineProperty(e,"oneMon",{enumerable:!0,get:function(){return s.oneMon}}),Object.defineProperty(e,"seoDt",{enumerable:!0,get:function(){return s.seoDt}}),Object.defineProperty(e,"dayRes",{enumerable:!0,get:function(){return s.dayRes}}),Object.defineProperty(e,"invDt",{enumerable:!0,get:function(){return s.invDt}}),Object.defineProperty(e,"fullDt",{enumerable:!0,get:function(){return s.fullDt}}),Object.defineProperty(e,"fullDate",{enumerable:!0,get:function(){return s.fullDate}}),Object.defineProperty(e,"fullLong",{enumerable:!0,get:function(){return s.fullLong}}),Object.defineProperty(e,"shortDt",{enumerable:!0,get:function(){return s.shortDt}}),Object.defineProperty(e,"moYrDt",{enumerable:!0,get:function(){return s.moYrDt}}),Object.defineProperty(e,"tmAP",{enumerable:!0,get:function(){return s.tmAP}}),Object.defineProperty(e,"tmUTC",{enumerable:!0,get:function(){return s.tmUTC}}),Object.defineProperty(e,"monNm",{enumerable:!0,get:function(){return s.monNm}}),Object.defineProperty(e,"tN",{enumerable:!0,get:function(){return s.tN}}),Object.defineProperty(e,"addZ",{enumerable:!0,get:function(){return s.addZ}}),Object.defineProperty(e,"timeStandard",{enumerable:!0,get:function(){return s.timeStandard}}),Object.defineProperty(e,"dateStandard",{enumerable:!0,get:function(){return s.dateStandard}}),Object.defineProperty(e,"thisYear",{enumerable:!0,get:function(){return s.thisYear}});const c=r(794);Object.defineProperty(e,"objSort",{enumerable:!0,get:function(){return c.objSort}}),Object.defineProperty(e,"objLen",{enumerable:!0,get:function(){return c.objLen}}),Object.defineProperty(e,"objNestValueCount",{enumerable:!0,get:function(){return c.objNestValueCount}}),Object.defineProperty(e,"restoreObj",{enumerable:!0,get:function(){return c.restoreObj}}),Object.defineProperty(e,"restoreObjStr",{enumerable:!0,get:function(){return c.restoreObjStr}}),Object.defineProperty(e,"storeObj",{enumerable:!0,get:function(){return c.storeObj}}),Object.defineProperty(e,"storeObjStr",{enumerable:!0,get:function(){return c.storeObjStr}}),Object.defineProperty(e,"objSortSimple",{enumerable:!0,get:function(){return c.objSortSimple}})})(),n})()}};const t={};function r(n){const o=t[n];if(void 0!==o)return o.exports;const a=t[n]={exports:{}};return e[n].call(a.exports,a,a.exports,r),a.exports}var n,o,a,i,s,c,l,u;let d;r.m=e,r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.f={},r.e=e=>{const t=[];return r.f.j(e,t),Promise.all(t)},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{const e={520:()=>import("./engine-litert.min.mjs"),924:()=>import("./engine-wllama.min.mjs")},t={792:0},n=e=>{let{__webpack_esm_ids__:n,__webpack_esm_modules__:o,__webpack_esm_runtime__:a}=e;var i,s,c=0;for(i in o)r.o(o,i)&&(r.m[i]=o[i]);for(a&&a(r);c<n.length;c++)s=n[c],r.o(t,s)&&t[s]&&t[s][0](),t[s]=0};r.f.j=(o,a)=>{let i=r.o(t,o)?t[o]:void 0;if(0!==i)if(i)a.push(i[1]);else{let r=e[o]().then(n,e=>{throw 0!==t[o]&&(t[o]=void 0),e});r=Promise.race([r,new Promise(e=>i=t[o]=[e])]),a.push(i[1]=r)}}})(),function(e){e.system="system",e.user="user",e.assistant="assistant"}(n||(n={})),function(e){e[e.online=0]="online",e[e.away=1]="away",e[e.offline=2]="offline"}(o||(o={})),function(e){e[e.idle=0]="idle",e[e.downloading=1]="downloading",e[e.ready=2]="ready",e[e.error=3]="error",e[e.unsupported=4]="unsupported"}(a||(a={})),function(e){e.cpu="cpu",e.gpu="gpu",e.none="none"}(i||(i={})),function(e){e.download="download",e.load="load"}(s||(s={})),function(e){e.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"}(c||(c={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(l||(l={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(u||(u={}));const g=[{id:c.qwen3_vl_2b,reasoning:!0,cpu:{repo:"Qwen/Qwen3-VL-2B-Thinking-GGUF",file:"Qwen3VL-2B-Thinking-Q4_K_M.gguf",mmproj:{file:"mmproj-Qwen3VL-2B-Thinking-Q8_0.gguf"}}},{id:c.qwen3_vl_2b_instruct,reasoning:!1,cpu:{repo:"unsloth/Qwen3-VL-2B-Instruct-GGUF",file:"Qwen3-VL-2B-Instruct-Q4_K_M.gguf",mmproj:{repo:"Qwen/Qwen3-VL-2B-Instruct-GGUF",file:"mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf"}}},{id:c.qwen3_vl_2b_instruct_q3,reasoning:!1,cpu:{repo:"unsloth/Qwen3-VL-2B-Instruct-GGUF",file:"Qwen3-VL-2B-Instruct-Q3_K_M.gguf",mmproj:{repo:"Qwen/Qwen3-VL-2B-Instruct-GGUF",file:"mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf"}}},{id:c.gemma4_e2b,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it.litertlm",vision:!0,audio:!0}},{id:c.gemma4_e2b_limited,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it-gpu.litertlm",vision:!1,audio:!1}}],m=e=>{const t=e??("undefined"==typeof navigator?void 0:navigator);if(!t)return!1;if("boolean"==typeof t.userAgentData?.mobile)return t.userAgentData.mobile;const r=t.userAgent||"";return/Android|iPhone|iPad|iPod|Mobile/i.test(r)||/Macintosh/.test(r)&&t.maxTouchPoints>1},p=(e,t=m())=>e==c.gemma4_e2b&&t?c.gemma4_e2b_limited:e,f=e=>e?g.find(t=>t.id==e):void 0,h=async()=>{const e="undefined"==typeof navigator?void 0:navigator.gpu;if(!e)return!1;let t;try{return!!await Promise.race([e.requestAdapter({powerPreference:"high-performance"}),new Promise(e=>{t=setTimeout(()=>e(void 0),1500)})])}catch{return!1}finally{t&&clearTimeout(t)}},y=async e=>f(p(e??await(async()=>(d||(d=(async()=>await h()?p(c.gemma4_e2b):c.qwen3_vl_2b)()),await d))())),w=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,b=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio,v=new URL("./../assets/wllama/wllama.wasm",import.meta.url).href,x=new URL("./../assets/wllama/compat/wllama.wasm",import.meta.url).href,j=new URL("./../assets/wllama/compat/wllama.js",import.meta.url).href,M=new URL("./../assets/litert/litertlm_wasm_internal.js",import.meta.url).href,k=(new URL("./../assets/litert/litertlm_wasm_internal.wasm",import.meta.url).href,{width:384,height:384}),_=async e=>{if(!e.startsWith("data:"))return await(await fetch(e)).arrayBuffer();const t=e.indexOf(","),r=t>=0?e.slice(0,t):"";if(t<0)throw new Error("Invalid image data");if(!r.includes(";base64"))return await(await fetch(e)).arrayBuffer();const n=atob(e.slice(t+1)),o=new Uint8Array(n.length);for(let e=0;e<n.length;e++)o[e]=n.charCodeAt(e);return o.buffer},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 T=r(155);const P={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:6},O=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,D=(e={},t=!1)=>{const r=P;return{maxReplyTokens:O(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:O(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:O(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:O(e.maxImages,r.maxImages,0),maxAudio:O(e.maxAudio,r.maxAudio,0),maxContentLength:O(e.maxContentLength,r.maxContentLength,1),promptCharBudget:O(e.promptCharBudget,r.promptCharBudget,1),maxThreads:O(e.maxThreads,r.maxThreads,1)}},N=(e,t)=>({stream:!0,temperature:.7,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),C=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,E=e=>Number(e.headers.get("content-length"))||0,A=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),L=e=>A(e,"image"),$=e=>A(e,"audio"),R=["<|channel>thought\n","<|channel>thought","..."],q=["<channel|>","..."],U=(e,t,r)=>t.length||r.length?[...e?[{type:"text",text:e}]:[],...t.map(e=>({type:"image",url:e})),...r.map(e=>({type:"audio",url:e}))]:e,I=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,z=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...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},F=m()?3e6:3e5,V=Math.max(F,84e4);class B extends Error{}const W=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new B(r)),t)})])}finally{n&&clearTimeout(n)}},Q=e=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}},Y=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,start:a,stopped:i,firstTimeoutMs:s=F,idleTimeoutMs:c=3e4,onStall:l})=>{let u="",d="",g="",m=!1,p=0,f=0;const h=((e,t)=>{let r="",n=!1;const o=(e,t)=>{let r=-1,n="";for(const o of t){const t=e.indexOf(o);t>=0&&(r<0||t<r)&&(r=t,n=o)}return{at:r,tag:n}},a=(e,t)=>{let r="";for(const n of t)for(let t=Math.min(e.length,n.length-1);t>r.length;t--)if(e.endsWith(n.slice(0,t))){r=e.slice(e.length-t);break}return r};return{feed:i=>{let s=r+i;for(r="";s;){if(n){const{at:t,tag:i}=o(s,q);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,q);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,R);if(e>=0){e&&t(s.slice(0,e)),s=s.slice(e+i.length),s.startsWith("\n")&&(s=s.slice(1)),n=!0;continue}const c=a(s,R);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{d+=e,r(e)},e=>{u+=e,n(e)});try{const e=(await W(a(),s,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(i()){Q(e);break}let n;try{n=await W(e.next(),m?c:s,m?"Model stopped responding":"Model did not reply")}catch(r){if(r instanceof B&&(u||d)){l?.(),Q(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,T.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: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},G=async({model:e,params:t,start:r,stopped:o,onStall:a})=>{const i=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=P)=>{const r=t.maxContentLength,o=e.filter(e=>"string"==typeof e.content&&!!e.content.trim()||!(e.role!=n.user||!e.images?.length&&!e.audio?.length)),a=[],i=[];let s=0,c=t.maxImages,l=t.maxAudio;for(let e=o.length-1;e>=0;e--){const u=o[e],d=("string"==typeof u.content?u.content:"").slice(0,r),g=u.role==n.user?(u.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,c)):[],m=u.role==n.user?(u.audio||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,l)):[];if(d||g.length||m.length){if(d&&s+d.length>t.promptCharBudget)break;s+=d.length,c-=g.length,l-=m.length,u.role==n.system?a.unshift(d):u.role==n.assistant?i.unshift({role:"assistant",content:d}):i.unshift({role:"user",content:U(d,g,m)})}}for(;i.length&&"user"!=i[0].role;)i.shift();const u=[];for(const e of i){const t=u[u.length-1];"assistant"==t?.role&&"assistant"==e.role?t.content=`${t.content}\n${e.content}`:"user"==t?.role&&"user"==e.role?t.content=z(t.content,e.content):"assistant"==e.role?u.push({role:"assistant",content:e.content}):u.push({role:"user",content:e.content})}const d=a.join("\n\n"),g=[];return d&&g.push({role:"system",content:d}),g.push(...u),g})(t.messages,t.limits),e.litert?k: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,i),await Y({model:e,logging:t.logging,onReason:t.onReason,onText:t.onText,onSpeed:t.onSpeed,start:()=>r(i),stopped:o,onStall:a,firstTimeoutMs:L(i)?V:F})},H=33554432,J=new Map;let Z=!1;const K=e=>{const t=(e.split("/").pop()||"model").replace(/[^\w.-]+/g,"_");let r=0;for(let t=0;t<e.length;t++)r=31*r+e.charCodeAt(t)>>>0;return`${r.toString(16)}-${t}`},X=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},ee=async()=>{if(!Z)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else Z=!0},te=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},re=async e=>{if(e)try{const t=await e.getFile(),r=JSON.parse(await t.text());return{total:Number(r.total)||0,etag:`${r.etag||""}`,complete:!0===r.complete}}catch{return}},ne=async(e,t)=>{try{const r=await e.getFileHandle("meta.json",{create:!0}),n=await r.createWritable();await n.write(JSON.stringify(t)),await n.close()}catch{}},oe=async function*(e){for await(const t of e)yield t},ae=async e=>{try{for await(const[t,r]of oe(e))"file"==r.kind&&X(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},ie=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await re(await e.getFileHandle(`${t}.json`).catch(()=>{}));if(!n)return;return{file:r,size:r.size,total:n.total,etag:n.etag,complete:n.total?r.size>=n.total:!0===n.complete}}catch{return}},se=async(e,t)=>{const r=await te(e,t);if(r){const e=await(async e=>await re(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of oe(e)){const e=X(r);if("file"!=n.kind||e<0)continue;const o=await n.getFile();t.push({part:{start:e,size:o.size},file:o})}}catch{return}const r=(e=>{const t=[];let r=0;for(const n of[...e].sort((e,t)=>e.start-t.start))if(n.size){if(n.start!=r)break;t.push(n),r+=n.size}return t})(t.map(e=>e.part)),n=new Set(r.map(e=>e.start)),o=t.filter(e=>n.has(e.part.start)).sort((e,t)=>e.part.start-t.part.start).map(e=>e.file);if(o.length)return{file:1==o.length?o[0]:new Blob(o),size:r.reduce((e,t)=>e+t.size,0)}})(r),n=e?.total||0,o=t?.size??0,a=t?.file??new Blob;return{file:n&&o>n?a.slice(0,n):a,size:o,total:n,etag:e?.etag||"",complete:n?o>=n:!0===e?.complete}}return await ie(e,t)},ce=(e,t)=>{const r=e.headers.get("content-range"),n=/bytes (\d+)-/.exec(r||""),o=/\/(\d+)\s*$/.exec(r||""),a=e.headers.get("etag")||"";if(206==e.status){const e=n?Number(n[1]):t.size,r=o?Number(o[1]):t.total;if(e!=t.size)return;if(t.total&&r&&t.total!=r)return;if(t.etag&&a&&t.etag!=a)return;return{start:e,total:r||t.total,etag:a||t.etag}}if(!t.etag||!a||t.etag==a)return{start:0,total:E(e)||t.total,etag:a||t.etag}},le=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:i})=>{let c,l=t,u=0,d=r;const g=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(l),{create:!0});c=await t.createWritable(),u=0},m=async()=>{const e=c;c=void 0,e&&await e.close().catch(()=>{})};try{const e=o.getReader();for(;;){const{done:r,value:o}=await e.read();if(r)break;i();let p=0;for(d&&(p=Math.min(d,o.byteLength),d-=p);p<o.byteLength;){c||await g();const e=Math.min(H-u,o.byteLength-p);await c.write({type:"write",position:u,data:o.subarray(p,p+e)}),p+=e,u+=e,l+=e,u==H&&await m()}l>t&&a(n?l/n:0,s.download)}await m()}catch(e){throw await m(),e}return l},ue=e=>["NotAllowedError","NotSupportedError"].includes(e?.name||""),de=e=>{const t=async()=>{const t=await ee();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await se(r,K(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{const a=`${e}|${r}`,i=J.get(a);if(i)return await i;const c=await t();if(!c)return;const l=(async(e,t,r,n)=>{const o=K(t),a=await ie(e,o);if(a?.complete)return a;let i=await te(e,o);i||(await e.removeEntry(o).catch(()=>{}),await e.removeEntry(`${o}.json`).catch(()=>{}),i=await e.getDirectoryHandle(o,{create:!0}));let c=0,l=0;for(;;){if(r?.aborted)throw new Error("Cancelled");const a=await se(e,o);if(a?.complete)return a;const u=a?.size??0,d=a?.total||0,g=a?.etag||"";if(u>c)c=u,l=0;else if(++l>4)throw new Error("Model download failed");u&&d&&n(u/d,s.download);const m=d?Math.min(u+H,d)-1:u+H-1,p=new AbortController,f=()=>p.abort(),h={size:u,total:d,etag:g};let y,w=setTimeout(f,3e4);r?.addEventListener("abort",f,{once:!0});try{if(y=await fetch(t,{signal:p.signal,headers:{Range:`bytes=${u}-${m}`}}),416==y.status){if(await(y.body?.cancel().catch(()=>{})),d&&u>=d){await ne(i,{total:d,etag:g,complete:!0});continue}await ae(i),await ne(i,{total:0,etag:"",complete:!1});continue}if(!y.ok||!y.body)throw await(y.body?.cancel().catch(()=>{})),new Error("Model download failed");const r=ce(y,h);if(!r){await y.body.cancel().catch(()=>{}),await ae(i),await ne(i,{total:0,etag:"",complete:!1});continue}await ne(i,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?u:0,s=await le({dir:i,start:r.start+a,skip:a,total:r.total,body:y.body,onProgress:n,onChunk:()=>{clearTimeout(w),w=setTimeout(f,3e4)}});if(!r.total){await ne(i,{total:s,etag:r.etag,complete:!0});const t=await se(e,o);if(t)return t}}catch(e){if(r?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&["QuotaExceededError","NotAllowedError","NotSupportedError","InvalidStateError","TypeMismatchError","SecurityError"].includes(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*l))}finally{clearTimeout(w),r?.removeEventListener("abort",f)}}})(c,r,n,o).finally(()=>{J.delete(a)});return J.set(a,l),await l},remove:async e=>{const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,K(e))},purge:async()=>{const t=await ee();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},ge="litertlm-models",me=de("litert-store"),pe={num_output_candidates:1,wait_for_weight_uploads:!0,num_decode_steps_per_sync:3,sequence_batch_size:0,supported_lora_ranks:[],max_top_k:40,enable_decode_logits:!1,enable_external_embeddings:!1,use_submodel:!1,use_autosized_ringbuffers:!0};let fe=!1;const he=(...e)=>{fe&&console.log(...e)},ye=(...e)=>{fe&&console.error(...e)},we=e=>{try{e.getGlobalLiteRtLm().liteRtLmWasm.preinitializedWebGPUDevice=void 0}catch{}},be=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(ge)}catch{return}},ve=new Map,xe=(e,t,r)=>{let n=0;return e.pipeThrough(new TransformStream({transform:(e,o)=>{n+=e.byteLength,r(t?n/t:0,s.download),o.enqueue(e)}}))},je=async(e,t=!0)=>{const r=[];for(const n of e){if("string"==typeof n.content){r.push({role:n.role,content:n.content});continue}const e=[];for(const r of n.content)"text"!=r.type?t?e.push({type:r.type,data:await _(r.url)}):e.push({type:"text",text:`[${r.type}]`}):e.push({type:"text",text:r.text});r.push({role:n.role,content:e})}return r},Me=(e,t)=>{if(e.role!=t.role)return!1;if("string"==typeof e.content||"string"==typeof t.content)return e.content==t.content;if(e.content.length!=t.content.length)return!1;for(let r=0;r<e.content.length;r++){const n=e.content[r],o=t.content[r];if(n.type!=o.type)return!1;if("text"==n.type&&"text"==o.type){if(n.text!=o.text)return!1}else if(("image"==n.type&&"image"==o.type||"audio"==n.type&&"audio"==o.type)&&n.url!=o.url)return!1}return!0},ke=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 je([a]))[0];if(!c)throw new Error("Empty prompt");const l=!!o.conversation&&o.reasoning==r.reasoning&&o.maxTokens==i.max_tokens&&((e,t)=>{const r="system"==e[0]?.role?e[0]:void 0,n="system"==t[0]?.role?t[0]:void 0;if(!r!=!n)return!1;if(r&&n&&!Me(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(!Me(o[i+e],a[e]))return!1;return!0})(o.sent,s);let u;if(l&&o.conversation)u=o.conversation;else{const n=await je(s,!1);o.conversation=void 0,o.sent=[],u=await e.createConversation({sessionConfig:{maxOutputTokens:i.max_tokens,samplerParams:{type:t.SamplerType.TOP_K,temperature:i.temperature,k:40,p:.95}},preface:{...n.length?{messages:n}:{},extra_context:{enable_thinking:r.reasoning}},prefillPrefaceOnInit:n.length>0}),o.conversation=u,o.reasoning=r.reasoning,o.maxTokens=i.max_tokens,o.sent=[...s]}o.sent.push(a);let d,g=!1,m="";const p=()=>{d&&d.cancel().catch(()=>{});try{u.cancel()}catch{}};r.signal?.addEventListener("abort",p,{once:!0});try{if(r.signal?.aborted)return;const e=u.sendMessageStreaming(c).getReader();for(d=e;;){const{done:t,value:r}=await e.read();if(t)break;const n={};let o="string"==typeof r.content?r.content:"";if(Array.isArray(r.content))for(const e of r.content)"text"==e.type&&(o+=e.text);o&&(n.content=o,m+=o);const a=r.channels?.thought;a&&(n.reasoning=a),(n.content||n.reasoning)&&(yield{choices:[{delta:n}]})}g=!0}finally{r.signal?.removeEventListener("abort",p),g&&m?o.sent.push({role:"assistant",content:m}):(o.conversation=void 0,o.sent=[])}},_e={backend:i.gpu,startLLM:async({model:e,limits:t,onProgress:n,signal:o,logging:a})=>{fe=!0===a;const c=e.litert;if(!c)throw new Error("Model has no LiteRT artifact");const l=await r.e(520).then(()=>r(507)),u=globalThis,d=u.Module;u.Module={print:he,printErr:ye};try{await l.getOrLoadGlobalLiteRtLm(M)}finally{u.Module=d}if(o?.aborted)throw new Error("Cancelled");const g=C(c.repo,c.file),m=await be();let p;const f=m?await m.match(g):void 0;if(f?.body)p=f.body;else{const e=await me.stored(g);e?.complete&&(p=e.file.stream())}if(!p){const e=await me.download({url:g,signal:o,onProgress:n}).catch(e=>{if(o?.aborted)throw new Error("Cancelled");if(!ue(e))throw e;a&&console.log("Local model store failed",e)});e&&(p=e.file.stream())}if(!p&&m)try{await(async(e,t,r,n)=>{const o=ve.get(e);if(o)return await o;const a=(async()=>{const o=await fetch(e,{signal:r});if(!o.ok||!o.body)throw new Error("Model download failed");const a=E(o),i=xe(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{ve.delete(e)});return ve.set(e,a),await a})(g,m,o,n);const e=await m.match(g);e?.body&&(p=e.body)}catch(e){if(o?.aborted)throw new Error("Cancelled");a&&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 xe(n.body,E(n),r)})(g,o,n)),o?.aborted)throw new Error("Cancelled");n(1,s.load);const h=await l.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:pe},...o?.vision?{visionBackend:n.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...o?.audio?{audioBackend:n.Backend.CPU}:{}}})({model:e,limits:t,source:p,mod:l}));if(o?.aborted)throw await h.delete(),we(l),new Error("Cancelled");const y={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:i.gpu,contextSize:4096,chat:t=>(async({engine:e,model:t,mod:r,params:n,session:o})=>{fe=!0===n.logging;const a=()=>{try{o.conversation?.cancel()}catch{}o.conversation=void 0,o.sent=[]};try{return await G({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async a=>{if(n.signal?.aborted)throw new Error("Cancelled");if(L(a)&&!t.litert?.vision)throw new Error("Model does not accept images");if($(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return ke({engine:e,mod:r,params:n,messages:a,session:o})}})}catch(e){throw a(),e}})({engine:h,model:e,mod:l,params:t,session:y}),unload:async()=>{const e=y.conversation;y.conversation=void 0,y.sent=[];try{await(e?.delete())}catch{}await h.delete(),we(l)}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=C(t.repo,t.file),[n,o]=await Promise.all([be(),me.stored(r)]);if(o?.complete)return!0;try{return!(!n||!await n.match(r))}catch{return!1}},purge:async()=>{try{await me.purge(),"undefined"!=typeof caches&&await caches.delete(ge)}catch{}}},Se=de("wllama-store"),Te=[c.qwen3_vl_2b_instruct,c.qwen3_vl_2b_instruct_q3],Pe=e=>e.cpu?.mmproj&&Te.includes(e.id)?{image_min_tokens:16,image_max_tokens:100}:{};let Oe,De,Ne="",Ce=!1;const Ee=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Ae=e=>{const t={wasm:v,compatWasm:x,compatWorker:j};return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},Le=e=>{const t=e=>(...t)=>{Ce&&("string"==typeof t[0]&&t[0].includes("ggml_webgpu: Failed to get an adapter")||e(...t))};return{...e,log:t(e.log),warn:t(e.warn),error:t(e.error)}},$e=async()=>{if(Oe)return Oe;const e=await r.e(924).then(()=>r(577)),t=De||Ae(),n=new e.Wllama({default:t.wasm},{logger:Le(e.LoggerWithoutDebug)});return De||(De=t,Ne=Ee(t)),n.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),Oe=n,n},Re=async()=>{const e=Oe;Oe=void 0;try{await(e?.exit())}catch{}},qe=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),Ue=e=>{const t=e.cpu;return t?[{name:t.file,url:C(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:C(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},Ie=async e=>{const t=Ue(e);if(!t.length)return!1;for(const e of t){const t=await Se.stored(e.url);if(!t?.complete)return!1}return!0},ze=async(e,t)=>{const r=await e.cacheManager.list();return Ue(t).every(e=>r.some(t=>qe(t,e.name)))},Fe=async({model:e,signal:t,onProgress:r})=>{const n=Ue(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await Se.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},Ve=async e=>{const t=[];for(const r of e){if("string"==typeof r.content){"system"==r.role?t.push({role:"system",content:r.content}):"assistant"==r.role?t.push({role:"assistant",content:r.content}):t.push({role:"user",content:r.content});continue}const e=[];for(const t of r.content)"text"==t.type?e.push({type:"text",text:t.text}):e.push({type:t.type,data:await _(t.url)});t.push({role:"user",content:e})}return t},Be={backend:i.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:a})=>{Ce=!0===o;const c=m()?4096:8192,l=e.cpu;if(!l)throw new Error("Model has no CPU artifact");const u=Ae(a),d=Ee(u);Oe&&d!=Ne&&await Re(),De=u,Ne=d;const g=((e,t,r=!1)=>Math.max(1,Math.min(Math.max(2,Math.min(8,(e||4)-1)),t,r?2:3)))("undefined"!=typeof navigator&&navigator.hardwareConcurrency||4,t.maxThreads,!!l.mmproj),p=await $e(),f=await Ie(e),h=l.mmproj?.file,y=C(l.repo,l.file),w=h?C(l.mmproj?.repo??l.repo,h):"";if(n?.aborted)throw await Re(),new Error("Cancelled");if(!f&&h){const e=await p.cacheManager.list(),t=e.some(e=>qe(e,l.file)),r=e.some(e=>qe(e,h));t&&!r&&await p.cacheManager.deleteMany(e=>qe(e,l.file))}const b={n_ctx:c,n_threads:g,reasoning_budget_tokens:t.maxThinkingTokens,n_gpu_layers:0,jinja:!0,...Pe(e)};try{let t=f?await Fe({model:e,signal:n,onProgress:r}):void 0;t||f||await ze(p,e).catch(()=>!1)||(t=await Fe({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,s.load),await p.loadModel(t,b)):await p.loadModelFromUrl(w?{url:y,mmprojUrl:w}:y,{...b,useCache:!0,signal:n,progressCallback:({loaded:e,total:t})=>{const n=t?e/t:0;r(n,n>=1?s.load:s.download)}})}catch(e){throw await Re(),e}if(n?.aborted)throw await Re(),new Error("Cancelled");if(!p.getLoadedContextInfo().n_ctx)throw await Re(),new Error("Failed to create model context");return{model:e,backend:i.cpu,contextSize:c,chat:t=>(async(e,t,r)=>{if(Ce=!0===r.logging,e.isModelLoaded())return await G({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if(L(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if($(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await Ve(n),...N(r.limits,r.reasoning),abortSignal:r.signal,...t.reasoning?{chat_template_kwargs:{enable_thinking:r.reasoning}}:{}})}})})(p,e,t),unload:async()=>{if(Oe==p)await Re();else try{await p.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await Ie(e)||await ze(await $e(),e))}catch{return!1}},purge:async()=>{try{await Se.purge()}catch{}try{const e=await $e();await e.cacheManager.clear()}catch{}}},We=((e={})=>{const t=e.engines?.cpu||Be,r=e.engines?.litert||_e;let n,o,c,l,u,d,g,m=i.none,p=a.idle,f=[],h=0,y={percent:0,phase:s.download};const w=n=>{if(e.backend!=i.none)return e.backend==i.cpu?n.cpu?t:void 0:e.backend==i.gpu?n.litert?r:void 0:n.litert&&"undefined"!=typeof navigator&&navigator.gpu&&"undefined"!=typeof WebAssembly?r:!n.cpu||"undefined"==typeof window&&"undefined"==typeof self&&"undefined"==typeof Worker||"undefined"==typeof WebAssembly?void 0:t},b=async()=>{const e=n;n=void 0,o=void 0,await(e?.unload())},v=(e,t)=>{y={percent:Math.max(0,Math.min(1,e)),phase:t||s.download};for(const e of[...f])e.report(y.percent,y.phase)},x=e=>{p=e},j=()=>{h++,u?.abort(),u=void 0,l=void 0,p==a.downloading&&x(a.idle)},M=(e,t)=>{const r=c;return r?new Promise(n=>{let o=!1;const a={report:e,settle:e=>{o||(o=!0,t?.removeEventListener("abort",i),n(e))}},i=()=>{(e=>{f=f.filter(t=>t!=e),queueMicrotask(()=>{!f.length&&c&&j()})})(a),a.settle(!1)};f.push(a),t?.aborted?i():t?.addEventListener("abort",i,{once:!0}),r.then(a.settle,()=>a.settle(!1))}):Promise.resolve(!1)},k=()=>p==a.ready&&!!n&&!!o,_=async()=>{j(),x(a.idle),await b()};return{load:async({model:e,limits:t,assets:r,logging:i,signal:g,onProgress:p})=>{if(g?.aborted)return!1;if(k()&&o?.id==e.id)return!0;if(c&&l==e.id)return p(y.percent,y.phase),await M(p,g);c&&(j(),f=[],await c.catch(()=>!1));const _=++h,S=(async()=>{await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})();const c=w(e);if(_!=h)return!1;if(!c)return d="Model is not supported on this device",x(a.unsupported),!1;if(await b(),_!=h)return!1;const l=await c.cached(e);if(_!=h)return!1;d=void 0,x(a.downloading),v(0,s.download),l&&v(1,s.load);const g=new AbortController;u=g;try{const l=await c.startLLM({model:e,limits:t,logging:i,signal:g.signal,assets:r,onProgress:(e,t)=>{_==h&&v(e,t)}});return _!=h||g.signal.aborted?(await l.unload(),!1):(n=l,o=e,m=c.backend,d=void 0,x(a.ready),v(1,s.load),!0)}catch(e){return _!=h||(n=void 0,o=void 0,d=`${e?.message||`${e}`}`,i&&console.log("Local model failed",e),x(a.error)),!1}finally{u==g&&(u=void 0)}})().finally(()=>{c==S&&(c=void 0,l=void 0,f=[])});return c=S,l=e.id,await M(p,g)},chat:async e=>{if(!k()||!n)return;for(;g;)await g.catch(()=>{});if(!k()||!n)return;const t=n.chat(e);g=t;try{return await t}finally{g==t&&(g=void 0)}},unload:_,clear:async()=>{const e=c;await _(),await(e?.catch(()=>{})),await Promise.all([t.purge(),r.purge()])},ready:k,loading:()=>!k()&&p==a.downloading,status:()=>p,backend:()=>m,error:()=>d,model:()=>o}})(),Qe=(e,t,r)=>{const n=e.status(),i=p(t),s=f(i);return{...i?{model:i}:{},availability:n==a.ready?o.online:n==a.error||n==a.unsupported?o.offline:o.away,status:n,backend:e.backend(),supportsImages:!!s&&w(s),supportsAudio:!!s&&b(s),ready:e.ready(),loading:e.loading(),requesting:r.requesting,phase:r.phase,percent:r.percent,...r.error?{error:r.error}:{}}},Ye=(e=>{let t,r=0;const o=t=>t.input.onStatus?.(Qe(e,t.model??t.input.model,t));return i=>{t?.controller.abort();const c={token:++r,input:i,controller:new AbortController,percent:e.ready()?100:0,phase:e.ready()?s.load:s.download,requesting:!1,cancelled:!1};return t=c,o(c),(async t=>{const{input:a}=t,i=!0===a.logging,c=await y(a.model);if(t.model=c?.id,t.token!=r)return;const l=a.messages.some(e=>e.role!=n.system&&"string"==typeof e.content&&!!e.content.trim()),u=a.messages.some(e=>e.role==n.user&&!!e.images?.some(e=>"string"==typeof e&&!!e)),d=a.messages.some(e=>e.role==n.user&&!!e.audio?.some(e=>"string"==typeof e&&!!e)),g=l||u||d;if(!c)return t.error="Unknown model",void o(t);if(!g)return t.error="No prompt",void o(t);const m=w(c),p=b(c);if(!(l||u&&m||d&&p))return d&&!p?t.error="Model does not accept audio":u&&!m&&(t.error="Model does not accept images"),void o(t);const f=D(a.limits,!!c.litert),h=await e.load({model:c,limits:f,logging:i,signal:t.controller.signal,onProgress:(e,n)=>{t.token==r&&(t.percent=Math.round(100*e),t.phase=n,o(t))}}).catch(e=>(t.token==r&&(t.error=`${e?.message||`${e}`}`),!1));if(t.token!=r)return;if(t.cancelled)return;if(!h)return t.error||(t.error=e.error()||"Model not ready"),void o(t);const v=u&&!m||d&&!p?a.messages.map(({images:e,audio:t,...r})=>({...r,...e&&m?{images:e}:{},...t&&p?{audio:t}:{}})):a.messages;t.requesting=!0,t.error=void 0,t.percent=100,t.phase=s.load,o(t);let x,j="",M="";try{x=await e.chat({messages:v,limits:f,reasoning:!0===a.reasoning,logging:i,onReason:e=>{t.token!=r||t.cancelled||(j+=e,a.onThinking?.(j))},onText:e=>{t.token!=r||t.cancelled||(M+=e,a.onResponse?.(M))},onSpeed:e=>{t.token!=r||t.cancelled||a.onSpeed?.(e)},signal:t.controller.signal})}catch(e){if(t.token!=r)return;return t.requesting=!1,t.error=`${e?.message||`${e}`}`,void o(t)}t.token==r&&(t.requesting=!1,x||t.cancelled||(t.error="No reply"),o(t))})(c),()=>(t=>{t.token==r&&(t.cancelled=!0,t.controller.abort(),e.status()!=a.ready?queueMicrotask(()=>o(t)):e.unload().then(()=>o(t)))})(c)}})(We),Ge=(He=We,async(e={})=>{const t=await y(e.model),r=r=>e.onStatus?.(Qe(He,t?.id,r));if(!t)return r({requesting:!1,phase:s.download,percent:0,error:"Unknown model"}),!1;let n,o=0,a=s.download;const i=He.ready()&&He.model()?.id==t.id;return await He.load({model:t,limits:D(e.limits,!!t.litert),logging:!0===e.logging,onProgress:(e,t)=>{o=Math.round(100*e),a=t,r({requesting:!1,phase:a,percent:o})}}).catch(e=>(n=`${e?.message||`${e}`}`,!1))?(i&&r({requesting:!1,phase:s.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||He.error()||"Model not ready"}),!1)});var He;const Je=async()=>{await We.clear()},Ze=(e,...t)=>{!0===e&&console.log(...t)},Ke=["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(" "),Xe=["describe this image in one sentence starting with the main subject"].join(" "),et=["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(" "),tt="CANNOT_TRANSLATE",rt=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},nt=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`,ot=({service:e,limits:t,logging:r,onStatus:n})=>{const o=(t,r)=>n?.(Qe(e,t,r));return{report:o,load:async n=>{let a,i=0,c=-1,l=s.download;Ze(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),l=t,i!=c&&(c=i,Ze(r,"Describe load progress",n.id,i,l)),o(n.id,{requesting:!1,phase:l,percent:i})}}).catch(e=>(a=`${e?.message||`${e}`}`,!1)))return void Ze(r,"Describe load ready",n.id);const u=a||e.error()||"Model not ready";return Ze(r,"Describe load failed",n.id,u),o(n.id,{requesting:!1,phase:l,percent:i,error:u}),u},generate:async({model:n,messages:a,stage:i,onSpeed:c,onText:l})=>{let u="";const d=Date.now();Ze(r,"Describe generate start",i,n,a.length);try{const o=await e.chat({messages:a,limits:t,reasoning:!1,logging:r,onReason:e=>{Ze(r,"Describe reason",i,n,e)},onText:e=>{u+=e,Ze(r,"Describe text",i,n,e),l?.(u)},onSpeed:e=>{Ze(r,"Describe speed",i,n,e),c?.(e)}});return Ze(r,"Describe generate reply",i,n,Date.now()-d,o?.length??0,o),o}catch(e){throw Ze(r,"Describe generate failed",i,n,e),o(n,{requesting:!1,phase:s.load,percent:100,error:`${e?.message||`${e}`}`}),e}}}},at=async({translator:e,generate:t,descriptions:r,language:o,logging:a,currentIndex:i,onSpeed:s,onText:c})=>{const l=[...r];for(let u=0;u<r.length;u++){const d=(r[u]||"").trim();if(!d){i?.(u,d,d);continue}let g="";try{g=(await t({model:e.id,messages:[{role:n.system,content:et},{role:n.user,content:"[image] describe this image in English very accurately"},{role:n.assistant,content:d},{role:n.user,content:nt(o)}],stage:"translate",onSpeed:e=>s?.(u,e),onText:e=>c?.(u,e,"translate")})||"").trim()}catch(e){Ze(a,"Translate item failed",u,e)}const m=g.replace(/[^a-z]/gi,"").toUpperCase().includes(tt.replace(/[^a-z]/gi,""));g&&!m&&(l[u]=g),i?.(u,d,l[u])}return l},it=(e=>async t=>{const{images:r,currentIndex:o}=t,a=[],i=!0===t.logging;if(Ze(i,"Describe start",r.length,t.targetLanguage),!r.length)return Ze(i,"Describe empty"),a;const l=f(c.qwen3_vl_2b_instruct_q3),u=c.qwen3_vl_2b_instruct_q3,d=D({maxReplyTokens:400,...t.limits}),{report:g,load:m,generate:p}=ot({service:e,limits:d,logging:i,onStatus:t.onStatus});if(Ze(i,"Describe model",u,l?"found":"missing",d.maxReplyTokens,d.maxImages),g(u,{requesting:!1,phase:e.ready()?s.load:s.download,percent:e.ready()?100:0}),!l)throw Ze(i,"Describe model missing",u),g(u,{requesting:!1,phase:s.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const y=await m(l);if(y)throw Ze(i,"Describe stop",y),new Error(y);g(l.id,{requesting:!0,phase:s.load,percent:100});for(let e=0;e<r.length;e++){const s=Date.now(),c=r[e];Ze(i,"Describe image start",e,r.length,c.startsWith("data:")?"data URL":c,c.length),o?.(e);let u="";try{u=(await p({model:l.id,messages:[{role:n.system,content:Ke},{role:n.user,content:Xe,images:[c]}],stage:"describe",onSpeed:r=>t.onSpeed?.(e,r),onText:r=>t.onText?.(e,r,"describe")})||"").trim()}catch(t){Ze(i,"Describe image failed",e,t)}const d=Date.now()-s;Ze(i,"Describe english",e,d,u),u?(a.push({descriptionEN:u,description:u,durationMs:d}),o?.(e,u,void 0,d)):(Ze(i,"Describe empty",e),a.push({descriptionEN:"",description:"",durationMs:d}),o?.(e,"",void 0,d))}const w=a.filter(e=>!!e.descriptionEN).length;if(Ze(i,"Describe english ready",w),!w)return g(l.id,{requesting:!1,phase:s.load,percent:100,error:"No description"}),a;const b=t.targetLanguage.trim(),v=rt(b)&&await h()?f(c.gemma4_e2b_limited):void 0,x=v?await m(v):void 0;if(v&&!x)g(v.id,{requesting:!0,phase:s.load,percent:100}),await at({translator:v,generate:p,descriptions:a.map(e=>e.descriptionEN),language:b,logging:i,currentIndex:(e,t,r)=>{const n=a[e];r&&(n.description=r),o?.(e,t,n.description,n.durationMs)},onText:t.onText}),g(v.id,{requesting:!1,phase:s.load,percent:100});else{for(let e=0;e<a.length;e++){const t=a[e];t.descriptionEN&&o?.(e,t.descriptionEN,t.description,t.durationMs)}g(v?.id??l.id,{requesting:!1,phase:e.ready()?s.load:s.download,percent:e.ready()?100:0,...x?{error:x}:{}})}return a})(We),st=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(Ze(o,"Translate start",r.length,n),!r.length||!rt(n))return Ze(o,"Translate skipped"),r;const a=D({maxReplyTokens:400,...t.limits}),{report:i,load:l,generate:u}=ot({service:e,limits:a,logging:o,onStatus:t.onStatus}),d=await h()?f(c.gemma4_e2b_limited):void 0;if(!d)return Ze(o,"Translate no gpu"),r;const g=await l(d);if(g)return Ze(o,"Translate stop",g),r;i(d.id,{requesting:!0,phase:s.load,percent:100});const m=await at({translator:d,generate:u,descriptions:r,language:n,logging:o,currentIndex:t.currentIndex,onSpeed:t.onSpeed,onText:t.onText});return i(d.id,{requesting:!1,phase:s.load,percent:100}),m})(We),ct=/^[0-9+\-*/%^().]+$/,lt=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},ut={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(!ct.test(t))throw new Error("Unsupported character");const r=lt(t);return{expression:t,result:Math.abs(r)>=1e5?(0,T.pNum)(r)??r:(0,T.rNum)(r,12)}})(t)}},dt="degreesign-chat-prices-v1",gt="EUR",mt=5*T.oneMin,pt=30*T.oneSec;let ft,ht={},yt=0,wt=!1,bt=!1;const vt=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},xt=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,jt=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=vt(e.rates?.current),n=vt(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&&(ht.fiat=xt(ht.fiat,a)),i&&(ht.crypto=xt(ht.crypto,i)),yt=0,wt=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(dt,JSON.stringify(ht))}catch{}})()}catch(e){throw yt=Date.now(),wt=!0,e}},Mt=e=>!!ht.crypto&&(e in ht.crypto.prices||e in ht.crypto.yesterday),kt=e=>!!ht.fiat&&(e in ht.fiat.rates||e in ht.fiat.yesterday),_t=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==gt)continue;const e=Mt(r)||kt(r);!Mt(r)&&e||(t.crypto=!0),Mt(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(ht.fiat?.fetchedAt??0)>=T.oneHr,o=t.crypto&&r-(ht.crypto?.fetchedAt??0)>=mt;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||yt&&r-yt<pt||(ft||(ft=jt({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{ft=void 0})),await ft))},St=e=>{if(e==gt)return 1;const t=ht.crypto?.yesterday[e],r=ht.fiat?.yesterday[e];return t||(r?1/r:void 0)},Tt=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},Pt=e=>Math.abs(e)>=1e5?(0,T.pNum)(e)??e:(0,T.rNum)(e,8),Ot=async e=>{(()=>{if(!bt){bt=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(dt);if(!e)return;const t=JSON.parse(e);ht={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=Tt(e.from,"from"),r=void 0===e.to||null===e.to?gt:Tt(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 _t([t,r]);const o=e=>{const t=(e=>{if(e==gt)return 1;const t=ht.crypto?.prices[e],r=ht.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!ht.fiat&&!ht.crypto)throw new Error("Prices unavailable offline");if(Mt(e)||kt(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=St(t),c=St(r),l=a/i,u=s&&c?s/c:void 0,d=void 0===u?void 0:l-u,g=void 0===u?void 0:100*(l/u-1),m=(e=>{const t=[];for(const r of e)r!=gt&&(Mt(r)?ht.crypto&&t.push(ht.crypto.sourceAt):kt(r)&&ht.fiat&&t.push(ht.fiat.sourceAt));return t})([t,r]),p=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:Pt(l),...void 0===u?{}:{previousRate:Pt(u),change:Pt(d??0),changePercent:(0,T.rNum)(g??0,4)},result:Pt(n*l),updatedAt:new Date(p).toISOString(),stale:wt&&!(!ht.fiat&&!ht.crypto)}},Dt={name:"currency",description:"Get the EUR price of a fiat currency, crypto coin or metal, or convert an amount. Returns the 24-hour change.",parameters:{type:"object",properties:{from:{type:"string",description:"Currency, coin or metal to convert from"},to:{type:"string",description:"Currency, coin or metal to convert to, EUR by default"},amount:{type:"number",description:"Amount to convert, 1 by default"}},required:["from"]},execute:e=>Ot(e)},Nt={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},Ct=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,Et=(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 Nt[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),At=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,Lt=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)}},$t=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==u.duckduckgo?u.duckduckgo:u.wikipedia,language:At.test(t)?t:"en",limit:Math.round(Ct(e.limit,1,20,3)),snippetLength:Math.round(Ct(e.snippetLength,1,4e3,400)),timeout:Ct(e.timeout,1e3,3e4,8e3)}})(e);return{name:"websearch",description:t.provider==u.duckduckgo?"Search DuckDuckGo for an instant answer and related topics.":"Search Wikipedia and return a few matching articles.",parameters:{type:"object",properties:{query:{type:"string",description:"What to search for"}},required:["query"]},execute:async e=>{const r="string"==typeof e.query?e.query.trim():"";if(!r)throw new Error("Missing query");const n=t.provider==u.duckduckgo?await(async(e,t)=>{const r=`https://api.duckduckgo.com/?format=json&no_html=1&skip_disambig=1&q=${encodeURIComponent(t)}`,n=await Lt(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:Et(r||n,200),url:t,snippet:Et(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 Lt(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:Et(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:Et(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},Rt=(e,t)=>{const r=[];for(const n of e)n==l.websearch?r.push($t(t)):n==l.calculate?r.push(ut):n==l.currency&&r.push(Dt);return r};export{l as BuiltinTool,c as ChatModelId,o as ChatStatus,i as LlmBackend,s as LlmPhase,n as LlmRole,a as LlmStatus,u as WebSearchProvider,Rt as builtinTools,ut as calculateTool,Je as clearModelCache,Ye as createChat,Dt as currencyTool,it as describeImages,st as describeTranslated,Ge as preloadModel,$t as webSearchTool};
@@ -1,7 +1,7 @@
1
1
  import type { EngineMessage, ImageSize } from '../types';
2
2
  declare const
3
3
  /** Vision token target */
4
- imageTokens = 64,
4
+ imageTokens = 128,
5
5
  /** Pixels per vision token */
6
6
  tokenCell = 32,
7
7
  /** Tokens allowed above the target */
@@ -1,2 +1,2 @@
1
1
  /*! For license information please see chat.node.min.js.LICENSE.txt */
2
- (()=>{var e={69(e,t){(()=>{"use strict";var e={125:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addZ=t.tN=t.monNm=t.tmUTC=t.tmAP=t.moYrDt=t.shortDt=t.fullLong=t.fullDate=t.fullDt=t.invDt=t.dayRes=t.timeStandard=t.dateStandard=t.seoDt=t.thisYear=t.oneMon=t.oneMin=t.oneHr=t.oneDay=t.oneSec=void 0;const r=()=>Date.now(),n=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],a=["st","nd","rd","th"],i=e=>0==+e?"00":+e<10&&+e>=1?`0${e}`:`${e}`,s=e=>{const t=new Date(e);return`${t.getUTCFullYear()}-${i(t.getUTCMonth()+1)}-${i(t.getUTCDate())}`},c=e=>i(e.getUTCHours())+`:${i(e.getUTCMinutes())}`+`:${i(e.getUTCSeconds())}`;t.tN=r,t.monNm=n,t.dayRes=90,t.oneSec=1e3,t.oneMin=6e4,t.oneHr=36e5,t.oneDay=864e5,t.oneMon=27e8,t.addZ=i,t.tmUTC=e=>{const t=new Date(e);return i(t.getUTCHours())+`:${i(t.getUTCMinutes())} UTC`},t.tmAP=e=>{const t=new Date(e),r=t.getHours();return i(r>12?r-12:r)+`:${i(t.getMinutes())}`+(r>=12?"pm":"am")},t.shortDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]}`},t.moYrDt=e=>{const t=new Date(e);return`${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDate=e=>{const t=new Date(e);return`${t.getDate()} ${n[t.getMonth()]} ${t.getFullYear()}`},t.fullLong=e=>`${(e=>{const t=new Date(e),r=t.getDate();return r+a[r<5?r-1:r>4&&r<21?3:r>20&&r<25?r-21:r>24&&r<31?3:0]+` of ${n[t.getMonth()]}`})(e)} ${new Date(e).getFullYear()}`,t.thisYear=e=>(e?new Date(e):new Date)?.getUTCFullYear(),t.dateStandard=s,t.timeStandard=c,t.seoDt=e=>{!e&&(e=r());const t=new Date(e);return`${s(t)}T${c(t)}Z`},t.invDt=e=>{const t=new Date(e);return`${t.getUTCFullYear()}`.split("20")[1]+i(t.getUTCMonth()+1)+i(t.getUTCDate())+`${e}`.slice(10)}},240:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.idRandLong=t.idRandShort=t.idShuffle=void 0;const r=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","@",".","_","0","1","2","3","4","5","6","7","8","9"];t.idShuffle=async({data:e,password:t})=>4==t?.length?(({data:e,password:t})=>{try{const n=(e,t)=>r.includes(e.toLowerCase())?r[(r.indexOf(e.toLowerCase())+Math.pow(t,3))%r.length]:e;return[...e].map(e=>n(e,Number(t))).join("")}catch{return""}})({data:e,password:t}):await(async({data:e,password:t})=>{if(!e||!t)return"";try{crypto.subtle;const r=new TextEncoder,n=r.encode(e),o=r.encode(t),a=await crypto.subtle.digest("SHA-256",o),i=new Uint8Array(a),s=i.slice(0,32),c=i.slice(0,12),l=await crypto.subtle.importKey("raw",s,{name:"AES-GCM"},!1,["encrypt"]),u=await crypto.subtle.encrypt({name:"AES-GCM",iv:c},l,n);return btoa(String.fromCharCode(...new Uint8Array(u))).replace(/\+/g,"a").replace(/\//g,"b").replace(/=/g,"c").toLowerCase()}catch{return""}})({data:e,password:t}),t.idRandShort=(e=10)=>{try{return crypto.randomUUID()?.replaceAll("-","")?.slice(0,e)}catch(e){return console.log("idRandShort failed",e),""}},t.idRandLong=(e=10)=>{try{const t="abcdefghijklmnopqrstuvwxyz",r=new Uint8Array(e);return crypto.getRandomValues(r),Array.from(r).map(e=>t[e%26]).join("")}catch(e){return console.log("idRandLong failed",e),""}}},246:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.cacheCheck=t.delayCode=void 0;const n=r(125);t.delayCode=async(e=0)=>await new Promise(t=>setTimeout(t,e)),t.cacheCheck=({analysisCacheLimit:e,lastUpdated:t,forceRefresh:r})=>{const o=Date.now();if(t&&(!r&&t>o-e||r&&t>o-n.oneDay))return!0}},792:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isEven=t.pNum=t.sharpeRatio=t.priceVariations=t.nTxtAr=t.zNum=t.addCom=t.adjNum=t.rNum=void 0;const r=[1,.1,.01,.001,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10,1e-11,1e-12,1e-13,1e-14,1e-15,1e-16,1e-17,1e-18,1e-19],n=(e,t=6)=>{const n=+e,o=n?Math.abs(n):0,a=o>1&&t?t-`${Math.round(o)}`.length:0;return n?(n<0?-1:1)*(Number.isInteger(o)||o<1e-16?o:o>1e5?Math.round(o):o>1?Number(o.toFixed(a<0?0:a)):((e,t)=>{let n=0;for(const o of r){if(o<e)return Number(e.toFixed(t+n-1));n++}return e})(o,t)):e},o=(e,t)=>{const r=(n(e,t)+"").split(".");return r[0]=r[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),r.join(".")},a=(e,t=3)=>{const r=Number(e);if(!e||!r)return e+"";const a=Math.abs(r);return(r<0?"-":"")+(a>1e9?o(a/1e9,t)+"b":a>1e6?o(a/1e6,t)+"m":a<1e-6&&a>1e-16?(1+n(a,t)+"").replace(/1./g,"0."):o(a,t))};t.nTxtAr=["zero","one","two","three","four","five","six","seven","eight","nine","ten"],t.rNum=n,t.addCom=o,t.adjNum=a,t.zNum=e=>{const t=Number(e);let r=t?Math.abs(t):0,n=1e10;for(;n>1;)r>n&&(r=Math.round(r/(n/10))*(n/10)),n/=10;return t?(t<0?"-":"")+a(r,2):e},t.pNum=e=>+e||0==+e?Math.round(1e6*+e)/1e6:null,t.priceVariations=e=>{try{let t=0;const r=[...e].sort((e,t)=>e[0]-t[0]),n=e.reduce((e,[,t])=>e+t,0),o=r.find(([,e])=>(t+=e,t>=n/2))[0];return e.filter(([e])=>Math.abs(e-o)/o<.05).map(([e])=>e)}catch{return[]}},t.sharpeRatio=({assetPrices:e,minExpectedReturn:t=.05})=>{if(!e?.length||e?.length<2)return 0;const r=e.slice(1).map((t,r)=>(t-e[r])/e[r]),n=r.reduce((e,t)=>e+t,0)/r.length,o=Math.sqrt(r.reduce((e,t)=>e+Math.pow(t-n,2),0)/r.length);return(n-t)/o},t.isEven=e=>e%2==0},794:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restoreObj=t.restoreObjStr=t.storeObj=t.storeObjStr=t.objNestValueCount=t.objLen=t.objSortSimple=t.objSort=void 0;const n=r(125),o=e=>{try{return Object.keys(e||{})?.length||0}catch(e){return console.log(e),0}},a=e=>{try{return e?.replace(/"/g,"'")}catch(e){return console.log((0,n.tN)(),"storeObjStr failed",e),""}},i=e=>{try{return e?.toString()?.replace(/'/g,'"')}catch(e){console.log((0,n.tN)(),"restoreObjStr failed",e)}};t.objLen=o,t.objNestValueCount=e=>{let t=0;if(o(e))for(const r in e)t+=o(e[r])?1:0;return t},t.objSort=(e={},t,r=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,n])=>null===e[t]||void 0===e[t]?1:null===n[t]||void 0===n[t]?-1:e[t]>n[t]?1*r:-1*r)),t.objSortSimple=(e={},t=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,r])=>null==e?1:null==r?-1:e>r?1*t:-1*t)),t.storeObjStr=a,t.storeObj=e=>{try{return a(JSON.stringify(e))}catch(e){return console.log((0,n.tN)(),"storeObj failed",e),""}},t.restoreObjStr=i,t.restoreObj=e=>{try{if(!e)return;const t=i(e);return t?JSON.parse(t):void 0}catch(e){console.log((0,n.tN)(),"restoreObj failed",e)}}},830:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.phaseDifference=t.compareArrays=t.squeezeArray=t.forecastNextTotal=t.forecastNext=t.getMax=t.getMean=t.getSum=t.maxVl=t.minVl=t.sumArr=void 0;const r=e=>{try{return e?.length?e.reduce((e,t)=>e+t):0}catch(e){return console.log("sumArr failed",e),0}},n=e=>{try{return e?.length?e.reduce((e,t)=>e+t,0):0}catch(e){return console.log("getSum failed",e),0}},o=e=>{try{return e?.length?n(e)/e.length:0}catch(e){return console.log("getMean failed",e),0}},a=e=>{try{return e?.length?Math.max(...e):0}catch(e){return console.log("getMax failed",e),0}},i=e=>{try{if(!e?.length)return 0;const t=[...e].sort((e,t)=>e-t),r=Math.floor(t.length/2);return t.length%2?t[r]:(t[r-1]+t[r])/2}catch(e){return console.log("median failed",e),0}},s=({currentPeriod:e,steps:t=1})=>{try{const r=(Array.isArray(e)?e:[]).filter(Number.isFinite);if(!r.length||t<=0)return[];if(r.length<2){const e=Math.max(0,o(r));return Array.from({length:t},()=>e)}const n=r.length,{slope:s,intercept:c}=(e=>{try{const t=e.length,r=[];for(let n=0;n<t-1;n++)for(let o=n+1;o<t;o++)r.push((e[o]-e[n])/(o-n));const n=i(r);return{slope:n,intercept:i(e.map((e,t)=>e-n*t))}}catch(e){return console.log("theilSen failed",e),{slope:0,intercept:0}}})(r),l=c+s*(n-1),u=a(r),d=u>0?3*u:1/0;return Array.from({length:t},(e,t)=>{const r=t+1,o=l+s*n*Math.log1p(r/n);return Math.max(0,Math.min(o,d))})}catch(e){return console.log("forecastNext failed",e),[]}};t.sumArr=r,t.maxVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]>r&&(r=o[t])}return r},t.minVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]<r&&(r=o[t])}return r},t.getSum=n,t.getMean=o,t.getMax=a,t.forecastNext=s,t.forecastNextTotal=e=>{try{const t=s({currentPeriod:e,steps:e?.length});return n(t)}catch(e){return console.log("forecastNextTotal failed",e),0}},t.squeezeArray=({arr:e,targetLength:t})=>{try{if(!e||0===e.length||t<=0)throw new Error("Invalid input");const n=Math.ceil(e.length/t);return Array.from({length:t},(t,o)=>{const a=o*n,i=Math.min(a+n,e.length),s=e.slice(a,i);return r(s)}).slice(0,t)}catch(e){return console.log("squeezeArray failed",e),[]}},t.compareArrays=({arrays:e})=>{try{const t=[...e],n=Math.min(...t.map(e=>e.length));for(let e=0;e<t.length;e++)t.splice(n);const o=t.map(e=>r(e)),a=[],i=Math.min(...o),s=o.indexOf(i),c=i/Math.max(...o);for(let e=0;e<t.length;e++){const r=t[e];if(a[e]=[],e==s)a[e]=r;else for(let t=0;t<r.length;t++)a[e].push(c*r[t])}return a}catch(t){return console.log("compareArrays failed",t),e}},t.phaseDifference=({array1:e,array2:t})=>{try{let r=e.length,n=e.reduce((e,t)=>e+t)/r,o=t.reduce((e,t)=>e+t)/r,a=e.map(e=>e-n),i=t.map(e=>e-o),s=Math.floor(r/2),c=-1/0,l=0;for(let e=-s;e<=s;e++){let t=0,n=0,o=0,s=0;for(let c=0;c<r;c++){let l=c+e;l>=0&&l<r&&(t+=a[c]*i[l],n+=a[c]*a[c],o+=i[l]*i[l],s++)}if(n>0&&o>0&&s>=.8*r){let r=t/Math.sqrt(n*o);r>c&&(c=r,l=e)}}return l}catch(e){return console.log("phaseDifference failed",e),0}}}},r={};function n(t){var o=r[t];if(void 0!==o)return o.exports;var a=r[t]={exports:{}};return e[t](a,a.exports,n),a.exports}var o={};(()=>{var e=o;Object.defineProperty(e,"__esModule",{value:!0}),e.idShuffle=e.isEven=e.pNum=e.nTxtAr=e.zNum=e.addCom=e.adjNum=e.rNum=e.sharpeRatio=e.priceVariations=e.timeStandard=e.dateStandard=e.addZ=e.tN=e.monNm=e.tmUTC=e.tmAP=e.moYrDt=e.shortDt=e.fullLong=e.fullDate=e.fullDt=e.invDt=e.dayRes=e.thisYear=e.seoDt=e.oneMon=e.oneMin=e.oneHr=e.oneDay=e.oneSec=e.restoreObj=e.restoreObjStr=e.storeObj=e.storeObjStr=e.objSortSimple=e.objSort=e.objNestValueCount=e.objLen=e.phaseDifference=e.compareArrays=e.squeezeArray=e.forecastNextTotal=e.forecastNext=e.getMax=e.getMean=e.getSum=e.maxVl=e.minVl=e.sumArr=void 0,e.cacheCheck=e.delayCode=e.idRandLong=e.idRandShort=void 0;const t=n(246);Object.defineProperty(e,"cacheCheck",{enumerable:!0,get:function(){return t.cacheCheck}}),Object.defineProperty(e,"delayCode",{enumerable:!0,get:function(){return t.delayCode}});const r=n(830);Object.defineProperty(e,"sumArr",{enumerable:!0,get:function(){return r.sumArr}}),Object.defineProperty(e,"minVl",{enumerable:!0,get:function(){return r.minVl}}),Object.defineProperty(e,"maxVl",{enumerable:!0,get:function(){return r.maxVl}}),Object.defineProperty(e,"getMax",{enumerable:!0,get:function(){return r.getMax}}),Object.defineProperty(e,"getMean",{enumerable:!0,get:function(){return r.getMean}}),Object.defineProperty(e,"getSum",{enumerable:!0,get:function(){return r.getSum}}),Object.defineProperty(e,"forecastNext",{enumerable:!0,get:function(){return r.forecastNext}}),Object.defineProperty(e,"forecastNextTotal",{enumerable:!0,get:function(){return r.forecastNextTotal}}),Object.defineProperty(e,"squeezeArray",{enumerable:!0,get:function(){return r.squeezeArray}}),Object.defineProperty(e,"compareArrays",{enumerable:!0,get:function(){return r.compareArrays}}),Object.defineProperty(e,"phaseDifference",{enumerable:!0,get:function(){return r.phaseDifference}});const a=n(240);Object.defineProperty(e,"idRandLong",{enumerable:!0,get:function(){return a.idRandLong}}),Object.defineProperty(e,"idRandShort",{enumerable:!0,get:function(){return a.idRandShort}}),Object.defineProperty(e,"idShuffle",{enumerable:!0,get:function(){return a.idShuffle}});const i=n(792);Object.defineProperty(e,"addCom",{enumerable:!0,get:function(){return i.addCom}}),Object.defineProperty(e,"adjNum",{enumerable:!0,get:function(){return i.adjNum}}),Object.defineProperty(e,"priceVariations",{enumerable:!0,get:function(){return i.priceVariations}}),Object.defineProperty(e,"nTxtAr",{enumerable:!0,get:function(){return i.nTxtAr}}),Object.defineProperty(e,"rNum",{enumerable:!0,get:function(){return i.rNum}}),Object.defineProperty(e,"zNum",{enumerable:!0,get:function(){return i.zNum}}),Object.defineProperty(e,"sharpeRatio",{enumerable:!0,get:function(){return i.sharpeRatio}}),Object.defineProperty(e,"pNum",{enumerable:!0,get:function(){return i.pNum}}),Object.defineProperty(e,"isEven",{enumerable:!0,get:function(){return i.isEven}});const s=n(125);Object.defineProperty(e,"oneSec",{enumerable:!0,get:function(){return s.oneSec}}),Object.defineProperty(e,"oneDay",{enumerable:!0,get:function(){return s.oneDay}}),Object.defineProperty(e,"oneHr",{enumerable:!0,get:function(){return s.oneHr}}),Object.defineProperty(e,"oneMin",{enumerable:!0,get:function(){return s.oneMin}}),Object.defineProperty(e,"oneMon",{enumerable:!0,get:function(){return s.oneMon}}),Object.defineProperty(e,"seoDt",{enumerable:!0,get:function(){return s.seoDt}}),Object.defineProperty(e,"dayRes",{enumerable:!0,get:function(){return s.dayRes}}),Object.defineProperty(e,"invDt",{enumerable:!0,get:function(){return s.invDt}}),Object.defineProperty(e,"fullDt",{enumerable:!0,get:function(){return s.fullDt}}),Object.defineProperty(e,"fullDate",{enumerable:!0,get:function(){return s.fullDate}}),Object.defineProperty(e,"fullLong",{enumerable:!0,get:function(){return s.fullLong}}),Object.defineProperty(e,"shortDt",{enumerable:!0,get:function(){return s.shortDt}}),Object.defineProperty(e,"moYrDt",{enumerable:!0,get:function(){return s.moYrDt}}),Object.defineProperty(e,"tmAP",{enumerable:!0,get:function(){return s.tmAP}}),Object.defineProperty(e,"tmUTC",{enumerable:!0,get:function(){return s.tmUTC}}),Object.defineProperty(e,"monNm",{enumerable:!0,get:function(){return s.monNm}}),Object.defineProperty(e,"tN",{enumerable:!0,get:function(){return s.tN}}),Object.defineProperty(e,"addZ",{enumerable:!0,get:function(){return s.addZ}}),Object.defineProperty(e,"timeStandard",{enumerable:!0,get:function(){return s.timeStandard}}),Object.defineProperty(e,"dateStandard",{enumerable:!0,get:function(){return s.dateStandard}}),Object.defineProperty(e,"thisYear",{enumerable:!0,get:function(){return s.thisYear}});const c=n(794);Object.defineProperty(e,"objSort",{enumerable:!0,get:function(){return c.objSort}}),Object.defineProperty(e,"objLen",{enumerable:!0,get:function(){return c.objLen}}),Object.defineProperty(e,"objNestValueCount",{enumerable:!0,get:function(){return c.objNestValueCount}}),Object.defineProperty(e,"restoreObj",{enumerable:!0,get:function(){return c.restoreObj}}),Object.defineProperty(e,"restoreObjStr",{enumerable:!0,get:function(){return c.restoreObjStr}}),Object.defineProperty(e,"storeObj",{enumerable:!0,get:function(){return c.storeObj}}),Object.defineProperty(e,"storeObjStr",{enumerable:!0,get:function(){return c.storeObjStr}}),Object.defineProperty(e,"objSortSimple",{enumerable:!0,get:function(){return c.objSortSimple}})})();var a=t;for(var i in o)a[i]=o[i];o.__esModule&&Object.defineProperty(a,"__esModule",{value:!0})})()}};const t={};function r(n){const o=t[n];if(void 0!==o)return o.exports;const a=t[n]={exports:{}};return e[n](a,a.exports,r),a.exports}r.m=e,r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.f={},r.e=e=>{const t=[];return r.f.require(e,t),Promise.all(t)},r.u=e=>({520:"engine-litert",924:"engine-wllama"}[e]+".node.min.js"),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{const e={792:1};r.f.require=(t,n)=>{if(!e[t]){const n=require("./"+r.u(t));e[t]||(t=>{const n=t.modules,o=t.ids,a=t.runtime;for(var i in n)r.o(n,i)&&(r.m[i]=n[i]);a&&a(r);for(var s=0;s<o.length;s++)e[o[s]]=1})(n)}}})();let n={};(()=>{"use strict";var e,t,o,a,i,s,c,l;let u;r.r(n),r.d(n,{BuiltinTool:()=>c,ChatModelId:()=>s,ChatStatus:()=>t,LlmBackend:()=>a,LlmPhase:()=>i,LlmRole:()=>e,LlmStatus:()=>o,WebSearchProvider:()=>l,builtinTools:()=>Lt,calculateTool:()=>ct,clearModelCache:()=>He,createChat:()=>We,currencyTool:()=>Pt,describeImages:()=>ot,describeTranslated:()=>at,preloadModel:()=>Qe,webSearchTool:()=>At}),function(e){e.system="system",e.user="user",e.assistant="assistant"}(e||(e={})),function(e){e[e.online=0]="online",e[e.away=1]="away",e[e.offline=2]="offline"}(t||(t={})),function(e){e[e.idle=0]="idle",e[e.downloading=1]="downloading",e[e.ready=2]="ready",e[e.error=3]="error",e[e.unsupported=4]="unsupported"}(o||(o={})),function(e){e.cpu="cpu",e.gpu="gpu",e.none="none"}(a||(a={})),function(e){e.download="download",e.load="load"}(i||(i={})),function(e){e.qwen3_vl_2b="qwen3-vl-2b",e.qwen3_vl_2b_instruct="qwen3-vl-2b-instruct",e.qwen3_vl_2b_instruct_q3="qwen3-vl-2b-instruct-q3",e.gemma4_e2b="gemma4-e2b",e.gemma4_e2b_limited="gemma4-e2b-limited"}(s||(s={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(c||(c={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(l||(l={}));const d=[{id:s.qwen3_vl_2b,reasoning:!0,cpu:{repo:"Qwen/Qwen3-VL-2B-Thinking-GGUF",file:"Qwen3VL-2B-Thinking-Q4_K_M.gguf",mmproj:{file:"mmproj-Qwen3VL-2B-Thinking-Q8_0.gguf"}}},{id:s.qwen3_vl_2b_instruct,reasoning:!1,cpu:{repo:"unsloth/Qwen3-VL-2B-Instruct-GGUF",file:"Qwen3-VL-2B-Instruct-Q4_K_M.gguf",mmproj:{repo:"Qwen/Qwen3-VL-2B-Instruct-GGUF",file:"mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf"}}},{id:s.qwen3_vl_2b_instruct_q3,reasoning:!1,cpu:{repo:"unsloth/Qwen3-VL-2B-Instruct-GGUF",file:"Qwen3-VL-2B-Instruct-Q3_K_M.gguf",mmproj:{repo:"Qwen/Qwen3-VL-2B-Instruct-GGUF",file:"mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf"}}},{id:s.gemma4_e2b,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it.litertlm",vision:!0,audio:!0}},{id:s.gemma4_e2b_limited,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it-gpu.litertlm",vision:!1,audio:!1}}],g=e=>{const t=e??("undefined"==typeof navigator?void 0:navigator);if(!t)return!1;if("boolean"==typeof t.userAgentData?.mobile)return t.userAgentData.mobile;const r=t.userAgent||"";return/Android|iPhone|iPad|iPod|Mobile/i.test(r)||/Macintosh/.test(r)&&t.maxTouchPoints>1},m=(e,t=g())=>e==s.gemma4_e2b&&t?s.gemma4_e2b_limited:e,p=e=>e?d.find(t=>t.id==e):void 0,f=async()=>{const e="undefined"==typeof navigator?void 0:navigator.gpu;if(!e)return!1;let t;try{return!!await Promise.race([e.requestAdapter({powerPreference:"high-performance"}),new Promise(e=>{t=setTimeout(()=>e(void 0),1500)})])}catch{return!1}finally{t&&clearTimeout(t)}},h=async e=>p(m(e??await(async()=>(u||(u=(async()=>await f()?m(s.gemma4_e2b):s.qwen3_vl_2b)()),await u))())),y=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,w=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio,b=require("node:path"),v=()=>{return e=(0,b.join)(__dirname,"../assets/wllama"),{wasm:(0,b.join)(e,"wllama.wasm"),compatWasm:(0,b.join)(e,"compat/wllama.wasm"),compatWorker:(0,b.join)(e,"compat/wllama.js")};var e},x=()=>{return e=(0,b.join)(__dirname,"../assets/litert"),{script:(0,b.join)(e,"litertlm_wasm_internal.js"),wasm:(0,b.join)(e,"litertlm_wasm_internal.wasm")};var e},j={width:384,height:384},M=async e=>{if(!e.startsWith("data:"))return await(await fetch(e)).arrayBuffer();const t=e.indexOf(","),r=t>=0?e.slice(0,t):"";if(t<0)throw new Error("Invalid image data");if(!r.includes(";base64"))return await(await fetch(e)).arrayBuffer();const n=atob(e.slice(t+1)),o=new Uint8Array(n.length);for(let e=0;e<n.length;e++)o[e]=n.charCodeAt(e);return o.buffer},k=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<=64;e++){const t=Math.ceil(64/e),s=Math.floor(72/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 _=r(69);const T={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:6},S=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,P=(e={},t=!1)=>{const r=T;return{maxReplyTokens:S(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:S(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:S(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:S(e.maxImages,r.maxImages,0),maxAudio:S(e.maxAudio,r.maxAudio,0),maxContentLength:S(e.maxContentLength,r.maxContentLength,1),promptCharBudget:S(e.promptCharBudget,r.promptCharBudget,1),maxThreads:S(e.maxThreads,r.maxThreads,1)}},O=(e,t)=>({stream:!0,temperature:.7,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),C=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,D=e=>Number(e.headers.get("content-length"))||0,N=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),E=e=>N(e,"image"),A=e=>N(e,"audio"),L=["<|channel>thought\n","<|channel>thought","..."],$=["<channel|>","..."],q=(e,t,r)=>t.length||r.length?[...e?[{type:"text",text:e}]:[],...t.map(e=>({type:"image",url:e})),...r.map(e=>({type:"audio",url:e}))]:e,R=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,U=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...R(e),{type:"text",text:"\n"},...R(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r},I=g()?3e6:3e5,z=Math.max(I,84e4);class F extends Error{}const B=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new F(r)),t)})])}finally{n&&clearTimeout(n)}},V=e=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}},W=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,start:a,stopped:i,firstTimeoutMs:s=I,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,$);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,$);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,L);if(e>=0){e&&t(s.slice(0,e)),s=s.slice(e+i.length),s.startsWith("\n")&&(s=s.slice(1)),n=!0;continue}const c=a(s,L);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{d+=e,r(e)},e=>{u+=e,n(e)});try{const e=(await B(a(),s,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(i()){V(e);break}let n;try{n=await B(e.next(),m?c:s,m?"Model stopped responding":"Model did not reply")}catch(r){if(r instanceof F&&(u||d)){l?.(),V(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,_.rNum)(1e3*p/(e-f)))}}h.flush()}catch(e){if(t&&console.log("Local chat failed",e),e instanceof F&&!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},Q=async({model:t,params:r,start:n,stopped:o,onStall:a})=>{const i=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 k(r.url,t)}:r);r.push({role:"user",content:e})}return r})(((t,r=T)=>{const n=r.maxContentLength,o=t.filter(t=>"string"==typeof t.content&&!!t.content.trim()||!(t.role!=e.user||!t.images?.length&&!t.audio?.length)),a=[],i=[];let s=0,c=r.maxImages,l=r.maxAudio;for(let t=o.length-1;t>=0;t--){const u=o[t],d=("string"==typeof u.content?u.content:"").slice(0,n),g=u.role==e.user?(u.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,c)):[],m=u.role==e.user?(u.audio||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,l)):[];if(d||g.length||m.length){if(d&&s+d.length>r.promptCharBudget)break;s+=d.length,c-=g.length,l-=m.length,u.role==e.system?a.unshift(d):u.role==e.assistant?i.unshift({role:"assistant",content:d}):i.unshift({role:"user",content:q(d,g,m)})}}for(;i.length&&"user"!=i[0].role;)i.shift();const u=[];for(const e of i){const t=u[u.length-1];"assistant"==t?.role&&"assistant"==e.role?t.content=`${t.content}\n${e.content}`:"user"==t?.role&&"user"==e.role?t.content=U(t.content,e.content):"assistant"==e.role?u.push({role:"assistant",content:e.content}):u.push({role:"user",content:e.content})}const d=a.join("\n\n"),g=[];return d&&g.push({role:"system",content:d}),g.push(...u),g})(r.messages,r.limits),t.litert?j:void 0);return r.logging&&((e,t)=>{console.log("Local chat call",e.id,t.map(({role:e,content:t})=>({role:e,content:"****",...Array.isArray(t)?{images:t.filter(e=>"image"==e.type).length,audio:t.filter(e=>"audio"==e.type).length}:{}})))})(t,i),await W({model:t,logging:r.logging,onReason:r.onReason,onText:r.onText,onSpeed:r.onSpeed,start:()=>n(i),stopped:o,onStall:a,firstTimeoutMs:E(i)?z:I})},G=33554432,H=new Map;let Y=!1;const J=e=>{const t=(e.split("/").pop()||"model").replace(/[^\w.-]+/g,"_");let r=0;for(let t=0;t<e.length;t++)r=31*r+e.charCodeAt(t)>>>0;return`${r.toString(16)}-${t}`},Z=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},K=async()=>{if(!Y)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else Y=!0},X=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},ee=async e=>{if(e)try{const t=await e.getFile(),r=JSON.parse(await t.text());return{total:Number(r.total)||0,etag:`${r.etag||""}`,complete:!0===r.complete}}catch{return}},te=async(e,t)=>{try{const r=await e.getFileHandle("meta.json",{create:!0}),n=await r.createWritable();await n.write(JSON.stringify(t)),await n.close()}catch{}},re=async function*(e){for await(const t of e)yield t},ne=async e=>{try{for await(const[t,r]of re(e))"file"==r.kind&&Z(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},oe=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await ee(await e.getFileHandle(`${t}.json`).catch(()=>{}));if(!n)return;return{file:r,size:r.size,total:n.total,etag:n.etag,complete:n.total?r.size>=n.total:!0===n.complete}}catch{return}},ae=async(e,t)=>{const r=await X(e,t);if(r){const e=await(async e=>await ee(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of re(e)){const e=Z(r);if("file"!=n.kind||e<0)continue;const o=await n.getFile();t.push({part:{start:e,size:o.size},file:o})}}catch{return}const r=(e=>{const t=[];let r=0;for(const n of[...e].sort((e,t)=>e.start-t.start))if(n.size){if(n.start!=r)break;t.push(n),r+=n.size}return t})(t.map(e=>e.part)),n=new Set(r.map(e=>e.start)),o=t.filter(e=>n.has(e.part.start)).sort((e,t)=>e.part.start-t.part.start).map(e=>e.file);if(o.length)return{file:1==o.length?o[0]:new Blob(o),size:r.reduce((e,t)=>e+t.size,0)}})(r),n=e?.total||0,o=t?.size??0,a=t?.file??new Blob;return{file:n&&o>n?a.slice(0,n):a,size:o,total:n,etag:e?.etag||"",complete:n?o>=n:!0===e?.complete}}return await oe(e,t)},ie=(e,t)=>{const r=e.headers.get("content-range"),n=/bytes (\d+)-/.exec(r||""),o=/\/(\d+)\s*$/.exec(r||""),a=e.headers.get("etag")||"";if(206==e.status){const e=n?Number(n[1]):t.size,r=o?Number(o[1]):t.total;if(e!=t.size)return;if(t.total&&r&&t.total!=r)return;if(t.etag&&a&&t.etag!=a)return;return{start:e,total:r||t.total,etag:a||t.etag}}if(!t.etag||!a||t.etag==a)return{start:0,total:D(e)||t.total,etag:a||t.etag}},se=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:s})=>{let c,l=t,u=0,d=r;const g=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(l),{create:!0});c=await t.createWritable(),u=0},m=async()=>{const e=c;c=void 0,e&&await e.close().catch(()=>{})};try{const e=o.getReader();for(;;){const{done:r,value:o}=await e.read();if(r)break;s();let p=0;for(d&&(p=Math.min(d,o.byteLength),d-=p);p<o.byteLength;){c||await g();const e=Math.min(G-u,o.byteLength-p);await c.write({type:"write",position:u,data:o.subarray(p,p+e)}),p+=e,u+=e,l+=e,u==G&&await m()}l>t&&a(n?l/n:0,i.download)}await m()}catch(e){throw await m(),e}return l},ce=e=>["NotAllowedError","NotSupportedError"].includes(e?.name||""),le=e=>{const t=async()=>{const t=await K();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await ae(r,J(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{const a=`${e}|${r}`,s=H.get(a);if(s)return await s;const c=await t();if(!c)return;const l=(async(e,t,r,n)=>{const o=J(t),a=await oe(e,o);if(a?.complete)return a;let s=await X(e,o);s||(await e.removeEntry(o).catch(()=>{}),await e.removeEntry(`${o}.json`).catch(()=>{}),s=await e.getDirectoryHandle(o,{create:!0}));let c=0,l=0;for(;;){if(r?.aborted)throw new Error("Cancelled");const a=await ae(e,o);if(a?.complete)return a;const u=a?.size??0,d=a?.total||0,g=a?.etag||"";if(u>c)c=u,l=0;else if(++l>4)throw new Error("Model download failed");u&&d&&n(u/d,i.download);const m=d?Math.min(u+G,d)-1:u+G-1,p=new AbortController,f=()=>p.abort(),h={size:u,total:d,etag:g};let y,w=setTimeout(f,3e4);r?.addEventListener("abort",f,{once:!0});try{if(y=await fetch(t,{signal:p.signal,headers:{Range:`bytes=${u}-${m}`}}),416==y.status){if(await(y.body?.cancel().catch(()=>{})),d&&u>=d){await te(s,{total:d,etag:g,complete:!0});continue}await ne(s),await te(s,{total:0,etag:"",complete:!1});continue}if(!y.ok||!y.body)throw await(y.body?.cancel().catch(()=>{})),new Error("Model download failed");const r=ie(y,h);if(!r){await y.body.cancel().catch(()=>{}),await ne(s),await te(s,{total:0,etag:"",complete:!1});continue}await te(s,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?u:0,i=await se({dir:s,start:r.start+a,skip:a,total:r.total,body:y.body,onProgress:n,onChunk:()=>{clearTimeout(w),w=setTimeout(f,3e4)}});if(!r.total){await te(s,{total:i,etag:r.etag,complete:!0});const t=await ae(e,o);if(t)return t}}catch(e){if(r?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&["QuotaExceededError","NotAllowedError","NotSupportedError","InvalidStateError","TypeMismatchError","SecurityError"].includes(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*l))}finally{clearTimeout(w),r?.removeEventListener("abort",f)}}})(c,r,n,o).finally(()=>{H.delete(a)});return H.set(a,l),await l},remove:async e=>{const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,J(e))},purge:async()=>{const t=await K();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},ue="litertlm-models",de=le("litert-store"),ge={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 me=!1;const pe=(...e)=>{me&&console.log(...e)},fe=(...e)=>{me&&console.error(...e)},he=e=>{try{e.getGlobalLiteRtLm().liteRtLmWasm.preinitializedWebGPUDevice=void 0}catch{}},ye=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(ue)}catch{return}},we=new Map,be=(e,t,r)=>{let n=0;return e.pipeThrough(new TransformStream({transform:(e,o)=>{n+=e.byteLength,r(t?n/t:0,i.download),o.enqueue(e)}}))},ve=async(e,t=!0)=>{const r=[];for(const n of e){if("string"==typeof n.content){r.push({role:n.role,content:n.content});continue}const e=[];for(const r of n.content)"text"!=r.type?t?e.push({type:r.type,data:await M(r.url)}):e.push({type:"text",text:`[${r.type}]`}):e.push({type:"text",text:r.text});r.push({role:n.role,content:e})}return r},xe=(e,t)=>{if(e.role!=t.role)return!1;if("string"==typeof e.content||"string"==typeof t.content)return e.content==t.content;if(e.content.length!=t.content.length)return!1;for(let r=0;r<e.content.length;r++){const n=e.content[r],o=t.content[r];if(n.type!=o.type)return!1;if("text"==n.type&&"text"==o.type){if(n.text!=o.text)return!1}else if(("image"==n.type&&"image"==o.type||"audio"==n.type&&"audio"==o.type)&&n.url!=o.url)return!1}return!0},je=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=O(r.limits,r.reasoning);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await ve([a]))[0];if(!c)throw new Error("Empty prompt");const l=!!o.conversation&&o.reasoning==r.reasoning&&o.maxTokens==i.max_tokens&&((e,t)=>{const r="system"==e[0]?.role?e[0]:void 0,n="system"==t[0]?.role?t[0]:void 0;if(!r!=!n)return!1;if(r&&n&&!xe(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(!xe(o[i+e],a[e]))return!1;return!0})(o.sent,s);let u;if(l&&o.conversation)u=o.conversation;else{const n=await ve(s,!1);o.conversation=void 0,o.sent=[],u=await e.createConversation({sessionConfig:{maxOutputTokens:i.max_tokens,samplerParams:{type:t.SamplerType.TOP_K,temperature:i.temperature,k:40,p:.95}},preface:{...n.length?{messages:n}:{},extra_context:{enable_thinking:r.reasoning}},prefillPrefaceOnInit:n.length>0}),o.conversation=u,o.reasoning=r.reasoning,o.maxTokens=i.max_tokens,o.sent=[...s]}o.sent.push(a);let d,g=!1,m="";const p=()=>{d&&d.cancel().catch(()=>{});try{u.cancel()}catch{}};r.signal?.addEventListener("abort",p,{once:!0});try{if(r.signal?.aborted)return;const e=u.sendMessageStreaming(c).getReader();for(d=e;;){const{done:t,value:r}=await e.read();if(t)break;const n={};let o="string"==typeof r.content?r.content:"";if(Array.isArray(r.content))for(const e of r.content)"text"==e.type&&(o+=e.text);o&&(n.content=o,m+=o);const a=r.channels?.thought;a&&(n.reasoning=a),(n.content||n.reasoning)&&(yield{choices:[{delta:n}]})}g=!0}finally{r.signal?.removeEventListener("abort",p),g&&m?o.sent.push({role:"assistant",content:m}):(o.conversation=void 0,o.sent=[])}},Me={backend:a.gpu,startLLM:async({model:e,limits:t,onProgress:n,signal:o,logging:s})=>{me=!0===s;const c=e.litert;if(!c)throw new Error("Model has no LiteRT artifact");const l=await r.e(520).then(()=>r(507)),u=globalThis,d=u.Module;u.Module={print:pe,printErr:fe};try{await l.getOrLoadGlobalLiteRtLm(x().script)}finally{u.Module=d}if(o?.aborted)throw new Error("Cancelled");const g=C(c.repo,c.file),m=await ye();let p;const f=m?await m.match(g):void 0;if(f?.body)p=f.body;else{const e=await de.stored(g);e?.complete&&(p=e.file.stream())}if(!p){const e=await de.download({url:g,signal:o,onProgress:n}).catch(e=>{if(o?.aborted)throw new Error("Cancelled");if(!ce(e))throw e;s&&console.log("Local model store failed",e)});e&&(p=e.file.stream())}if(!p&&m)try{await(async(e,t,r,n)=>{const o=we.get(e);if(o)return await o;const a=(async()=>{const o=await fetch(e,{signal:r});if(!o.ok||!o.body)throw new Error("Model download failed");const a=D(o),i=be(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{we.delete(e)});return we.set(e,a),await a})(g,m,o,n);const e=await m.match(g);e?.body&&(p=e.body)}catch(e){if(o?.aborted)throw new Error("Cancelled");s&&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 be(n.body,D(n),r)})(g,o,n)),o?.aborted)throw new Error("Cancelled");n(1,i.load);const h=await l.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:ge},...o?.vision?{visionBackend:n.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...o?.audio?{audioBackend:n.Backend.CPU}:{}}})({model:e,limits:t,source:p,mod:l}));if(o?.aborted)throw await h.delete(),he(l),new Error("Cancelled");const y={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:a.gpu,contextSize:4096,chat:t=>(async({engine:e,model:t,mod:r,params:n,session:o})=>{me=!0===n.logging;const a=()=>{try{o.conversation?.cancel()}catch{}o.conversation=void 0,o.sent=[]};try{return await Q({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async a=>{if(n.signal?.aborted)throw new Error("Cancelled");if(E(a)&&!t.litert?.vision)throw new Error("Model does not accept images");if(A(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return je({engine:e,mod:r,params:n,messages:a,session:o})}})}catch(e){throw a(),e}})({engine:h,model:e,mod:l,params:t,session:y}),unload:async()=>{const e=y.conversation;y.conversation=void 0,y.sent=[];try{await(e?.delete())}catch{}await h.delete(),he(l)}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=C(t.repo,t.file),[n,o]=await Promise.all([ye(),de.stored(r)]);if(o?.complete)return!0;try{return!(!n||!await n.match(r))}catch{return!1}},purge:async()=>{try{await de.purge(),"undefined"!=typeof caches&&await caches.delete(ue)}catch{}}},ke=le("wllama-store"),_e=[s.qwen3_vl_2b_instruct,s.qwen3_vl_2b_instruct_q3],Te=e=>e.cpu?.mmproj&&_e.includes(e.id)?{image_min_tokens:16,image_max_tokens:100}:{};let Se,Pe,Oe="",Ce=!1;const De=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Ne=e=>{const t=v();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},Ee=e=>{const t=e=>(...t)=>{Ce&&("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)}},Ae=async()=>{if(Se)return Se;const e=await r.e(924).then(()=>r(577)),t=Pe||Ne(),n=new e.Wllama({default:t.wasm},{logger:Ee(e.LoggerWithoutDebug)});return Pe||(Pe=t,Oe=De(t)),n.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),Se=n,n},Le=async()=>{const e=Se;Se=void 0;try{await(e?.exit())}catch{}},$e=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),qe=e=>{const t=e.cpu;return t?[{name:t.file,url:C(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:C(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},Re=async e=>{const t=qe(e);if(!t.length)return!1;for(const e of t){const t=await ke.stored(e.url);if(!t?.complete)return!1}return!0},Ue=async(e,t)=>{const r=await e.cacheManager.list();return qe(t).every(e=>r.some(t=>$e(t,e.name)))},Ie=async({model:e,signal:t,onProgress:r})=>{const n=qe(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await ke.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 M(t.url)});t.push({role:"user",content:e})}return t},Fe={backend:a.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:s})=>{Ce=!0===o;const c=g()?4096:8192,l=e.cpu;if(!l)throw new Error("Model has no CPU artifact");const u=Ne(s),d=De(u);Se&&d!=Oe&&await Le(),Pe=u,Oe=d;const m=((e,t,r=!1)=>Math.max(1,Math.min(Math.max(2,Math.min(8,(e||4)-1)),t,r?2:3)))("undefined"!=typeof navigator&&navigator.hardwareConcurrency||4,t.maxThreads,!!l.mmproj),p=await Ae(),f=await Re(e),h=l.mmproj?.file,y=C(l.repo,l.file),w=h?C(l.mmproj?.repo??l.repo,h):"";if(n?.aborted)throw await Le(),new Error("Cancelled");if(!f&&h){const e=await p.cacheManager.list(),t=e.some(e=>$e(e,l.file)),r=e.some(e=>$e(e,h));t&&!r&&await p.cacheManager.deleteMany(e=>$e(e,l.file))}const b={n_ctx:c,n_threads:m,reasoning_budget_tokens:t.maxThinkingTokens,n_gpu_layers:0,jinja:!0,...Te(e)};try{let t=f?await Ie({model:e,signal:n,onProgress:r}):void 0;t||f||await Ue(p,e).catch(()=>!1)||(t=await Ie({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");if(!ce(e))throw e;o&&console.log("Local model store failed",e)})),t?(r(1,i.load),await p.loadModel(t,b)):await p.loadModelFromUrl(w?{url:y,mmprojUrl:w}:y,{...b,useCache:!0,signal:n,progressCallback:({loaded:e,total:t})=>{const n=t?e/t:0;r(n,n>=1?i.load:i.download)}})}catch(e){throw await Le(),e}if(n?.aborted)throw await Le(),new Error("Cancelled");if(!p.getLoadedContextInfo().n_ctx)throw await Le(),new Error("Failed to create model context");return{model:e,backend:a.cpu,contextSize:c,chat:t=>(async(e,t,r)=>{if(Ce=!0===r.logging,e.isModelLoaded())return await Q({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if(E(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if(A(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await ze(n),...O(r.limits,r.reasoning),abortSignal:r.signal,...t.reasoning?{chat_template_kwargs:{enable_thinking:r.reasoning}}:{}})}})})(p,e,t),unload:async()=>{if(Se==p)await Le();else try{await p.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await Re(e)||await Ue(await Ae(),e))}catch{return!1}},purge:async()=>{try{await ke.purge()}catch{}try{const e=await Ae();await e.cacheManager.clear()}catch{}}},Be=((e={})=>{const t=e.engines?.cpu||Fe,r=e.engines?.litert||Me;let n,s,c,l,u,d,g,m=a.none,p=o.idle,f=[],h=0,y={percent:0,phase:i.download};const w=n=>{if(e.backend!=a.none)return e.backend==a.cpu?n.cpu?t:void 0:e.backend==a.gpu?n.litert?r:void 0:n.litert&&"undefined"!=typeof navigator&&navigator.gpu&&"undefined"!=typeof WebAssembly?r:!n.cpu||"undefined"==typeof window&&"undefined"==typeof self&&"undefined"==typeof Worker||"undefined"==typeof WebAssembly?void 0:t},b=async()=>{const e=n;n=void 0,s=void 0,await(e?.unload())},v=(e,t)=>{y={percent:Math.max(0,Math.min(1,e)),phase:t||i.download};for(const e of[...f])e.report(y.percent,y.phase)},x=e=>{p=e},j=()=>{h++,u?.abort(),u=void 0,l=void 0,p==o.downloading&&x(o.idle)},M=(e,t)=>{const r=c;return r?new Promise(n=>{let o=!1;const a={report:e,settle:e=>{o||(o=!0,t?.removeEventListener("abort",i),n(e))}},i=()=>{(e=>{f=f.filter(t=>t!=e),queueMicrotask(()=>{!f.length&&c&&j()})})(a),a.settle(!1)};f.push(a),t?.aborted?i():t?.addEventListener("abort",i,{once:!0}),r.then(a.settle,()=>a.settle(!1))}):Promise.resolve(!1)},k=()=>p==o.ready&&!!n&&!!s,_=async()=>{j(),x(o.idle),await b()};return{load:async({model:e,limits:t,assets:r,logging:a,signal:g,onProgress:p})=>{if(g?.aborted)return!1;if(k()&&s?.id==e.id)return!0;if(c&&l==e.id)return p(y.percent,y.phase),await M(p,g);c&&(j(),f=[],await c.catch(()=>!1));const _=++h,T=(async()=>{await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})();const c=w(e);if(_!=h)return!1;if(!c)return d="Model is not supported on this device",x(o.unsupported),!1;if(await b(),_!=h)return!1;const l=await c.cached(e);if(_!=h)return!1;d=void 0,x(o.downloading),v(0,i.download),l&&v(1,i.load);const g=new AbortController;u=g;try{const l=await c.startLLM({model:e,limits:t,logging:a,signal:g.signal,assets:r,onProgress:(e,t)=>{_==h&&v(e,t)}});return _!=h||g.signal.aborted?(await l.unload(),!1):(n=l,s=e,m=c.backend,d=void 0,x(o.ready),v(1,i.load),!0)}catch(e){return _!=h||(n=void 0,s=void 0,d=`${e?.message||`${e}`}`,a&&console.log("Local model failed",e),x(o.error)),!1}finally{u==g&&(u=void 0)}})().finally(()=>{c==T&&(c=void 0,l=void 0,f=[])});return c=T,l=e.id,await M(p,g)},chat:async e=>{if(!k()||!n)return;for(;g;)await g.catch(()=>{});if(!k()||!n)return;const t=n.chat(e);g=t;try{return await t}finally{g==t&&(g=void 0)}},unload:_,clear:async()=>{const e=c;await _(),await(e?.catch(()=>{})),await Promise.all([t.purge(),r.purge()])},ready:k,loading:()=>!k()&&p==o.downloading,status:()=>p,backend:()=>m,error:()=>d,model:()=>s}})(),Ve=(e,r,n)=>{const a=e.status(),i=m(r),s=p(i);return{...i?{model:i}:{},availability:a==o.ready?t.online:a==o.error||a==o.unsupported?t.offline:t.away,status:a,backend:e.backend(),supportsImages:!!s&&y(s),supportsAudio:!!s&&w(s),ready:e.ready(),loading:e.loading(),requesting:n.requesting,phase:n.phase,percent:n.percent,...n.error?{error:n.error}:{}}},We=(t=>{let r,n=0;const a=e=>e.input.onStatus?.(Ve(t,e.model??e.input.model,e));return s=>{r?.controller.abort();const c={token:++n,input:s,controller:new AbortController,percent:t.ready()?100:0,phase:t.ready()?i.load:i.download,requesting:!1,cancelled:!1};return r=c,a(c),(async r=>{const{input:o}=r,s=!0===o.logging,c=await h(o.model);if(r.model=c?.id,r.token!=n)return;const l=o.messages.some(t=>t.role!=e.system&&"string"==typeof t.content&&!!t.content.trim()),u=o.messages.some(t=>t.role==e.user&&!!t.images?.some(e=>"string"==typeof e&&!!e)),d=o.messages.some(t=>t.role==e.user&&!!t.audio?.some(e=>"string"==typeof e&&!!e)),g=l||u||d;if(!c)return r.error="Unknown model",void a(r);if(!g)return r.error="No prompt",void a(r);const m=y(c),p=w(c);if(!(l||u&&m||d&&p))return d&&!p?r.error="Model does not accept audio":u&&!m&&(r.error="Model does not accept images"),void a(r);const f=P(o.limits,!!c.litert),b=await t.load({model:c,limits:f,logging:s,signal:r.controller.signal,onProgress:(e,t)=>{r.token==n&&(r.percent=Math.round(100*e),r.phase=t,a(r))}}).catch(e=>(r.token==n&&(r.error=`${e?.message||`${e}`}`),!1));if(r.token!=n)return;if(r.cancelled)return;if(!b)return r.error||(r.error=t.error()||"Model not ready"),void a(r);const v=u&&!m||d&&!p?o.messages.map(({images:e,audio:t,...r})=>({...r,...e&&m?{images:e}:{},...t&&p?{audio:t}:{}})):o.messages;r.requesting=!0,r.error=void 0,r.percent=100,r.phase=i.load,a(r);let x,j="",M="";try{x=await t.chat({messages:v,limits:f,reasoning:!0===o.reasoning,logging:s,onReason:e=>{r.token!=n||r.cancelled||(j+=e,o.onThinking?.(j))},onText:e=>{r.token!=n||r.cancelled||(M+=e,o.onResponse?.(M))},onSpeed:e=>{r.token!=n||r.cancelled||o.onSpeed?.(e)},signal:r.controller.signal})}catch(e){if(r.token!=n)return;return r.requesting=!1,r.error=`${e?.message||`${e}`}`,void a(r)}r.token==n&&(r.requesting=!1,x||r.cancelled||(r.error="No reply"),a(r))})(c),()=>(e=>{e.token==n&&(e.cancelled=!0,e.controller.abort(),t.status()!=o.ready?queueMicrotask(()=>a(e)):t.unload().then(()=>a(e)))})(c)}})(Be),Qe=(Ge=Be,async(e={})=>{const t=await h(e.model),r=r=>e.onStatus?.(Ve(Ge,t?.id,r));if(!t)return r({requesting:!1,phase:i.download,percent:0,error:"Unknown model"}),!1;let n,o=0,a=i.download;const s=Ge.ready()&&Ge.model()?.id==t.id;return await Ge.load({model:t,limits:P(e.limits,!!t.litert),logging:!0===e.logging,onProgress:(e,t)=>{o=Math.round(100*e),a=t,r({requesting:!1,phase:a,percent:o})}}).catch(e=>(n=`${e?.message||`${e}`}`,!1))?(s&&r({requesting:!1,phase:i.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||Ge.error()||"Model not ready"}),!1)});var Ge;const He=async()=>{await Be.clear()},Ye=(e,...t)=>{!0===e&&console.log(...t)},Je=["Write fully detailed, factual image descriptions for low-vision readers.","Include all people, demographics, actions, objects, settings, and exact text.","Use direct, plain English without filtering or vague words.","Output only the raw description with no intro, title, or disclaimer.","Use English."].join(" "),Ze=["describe this image in one sentence starting with the main subject"].join(" "),Ke=["You are a precise translator.","Translate the text faithfully and literally into the target language.","Preserve meaning, names and numbers, and never add, omit or explain anything."].join(" "),Xe="CANNOT_TRANSLATE",et=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},tt=e=>`Thanks this was accurate. Now please translate it faithfully into ${e}. This 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`,rt=({service:e,limits:t,logging:r,onStatus:n})=>{const o=(t,r)=>n?.(Ve(e,t,r));return{report:o,load:async n=>{let a,s=0,c=-1,l=i.download;Ye(r,"Describe load start",n.id,t.maxReplyTokens);if(await e.load({model:n,limits:t,logging:r,onProgress:(e,t)=>{s=Math.round(100*e),l=t,s!=c&&(c=s,Ye(r,"Describe load progress",n.id,s,l)),o(n.id,{requesting:!1,phase:l,percent:s})}}).catch(e=>(a=`${e?.message||`${e}`}`,!1)))return void Ye(r,"Describe load ready",n.id);const u=a||e.error()||"Model not ready";return Ye(r,"Describe load failed",n.id,u),o(n.id,{requesting:!1,phase:l,percent:s,error:u}),u},generate:async({model:n,messages:a,stage:s,onSpeed:c,onText:l})=>{let u="";const d=Date.now();Ye(r,"Describe generate start",s,n,a.length);try{const o=await e.chat({messages:a,limits:t,reasoning:!1,logging:r,onReason:e=>{Ye(r,"Describe reason",s,n,e)},onText:e=>{u+=e,Ye(r,"Describe text",s,n,e),l?.(u)},onSpeed:e=>{Ye(r,"Describe speed",s,n,e),c?.(e)}});return Ye(r,"Describe generate reply",s,n,Date.now()-d,o?.length??0,o),o}catch(e){throw Ye(r,"Describe generate failed",s,n,e),o(n,{requesting:!1,phase:i.load,percent:100,error:`${e?.message||`${e}`}`}),e}}}},nt=async({translator:t,generate:r,descriptions:n,language:o,currentIndex:a,onSpeed:i,onText:s})=>{const c=[...n];for(let l=0;l<n.length;l++){const u=n[l],d=(await r({model:t.id,messages:[{role:e.system,content:Ke},{role:e.user,content:"[image] describe this image in English very accurately"},{role:e.assistant,content:u},{role:e.user,content:tt(o)}],stage:"translate",onSpeed:e=>i?.(l,e),onText:e=>s?.(l,e,"translate")})||"").trim(),g=d.replace(/[^a-z]/gi,"").toUpperCase().includes(Xe.replace(/[^a-z]/gi,""));d&&!g&&(c[l]=d),a?.(l,u,c[l])}return c},ot=(t=>async r=>{const{images:n,currentIndex:o}=r,a=[],c=!0===r.logging;if(Ye(c,"Describe start",n.length,r.targetLanguage),!n.length)return Ye(c,"Describe empty"),a;const l=p(s.qwen3_vl_2b_instruct_q3),u=s.qwen3_vl_2b_instruct_q3,d=P({maxReplyTokens:400,...r.limits}),{report:g,load:m,generate:h}=rt({service:t,limits:d,logging:c,onStatus:r.onStatus});if(Ye(c,"Describe model",u,l?"found":"missing",d.maxReplyTokens,d.maxImages),g(u,{requesting:!1,phase:t.ready()?i.load:i.download,percent:t.ready()?100:0}),!l)throw Ye(c,"Describe model missing",u),g(u,{requesting:!1,phase:i.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const y=await m(l);if(y)throw Ye(c,"Describe stop",y),new Error(y);g(l.id,{requesting:!0,phase:i.load,percent:100});for(let t=0;t<n.length;t++){const s=Date.now(),u=n[t];Ye(c,"Describe image start",t,n.length,u.startsWith("data:")?"data URL":u,u.length),o?.(t);const d=await h({model:l.id,messages:[{role:e.system,content:Je},{role:e.user,content:Ze,images:[u]}],stage:"describe",onSpeed:e=>r.onSpeed?.(t,e),onText:e=>r.onText?.(t,e,"describe")}),m=Date.now()-s,p=(d||"").trim();if(Ye(c,"Describe english",t,m,p),!p)throw Ye(c,"Describe empty",t,d),g(l.id,{requesting:!1,phase:i.load,percent:100,error:"No description"}),new Error("No description");a.push({descriptionEN:p,description:p,durationMs:m}),o?.(t,p,void 0,m)}Ye(c,"Describe english ready",a.length);const w=r.targetLanguage.trim(),b=et(w)&&await f()?p(s.gemma4_e2b_limited):void 0,v=b?await m(b):void 0;if(b&&!v)g(b.id,{requesting:!0,phase:i.load,percent:100}),await nt({translator:b,generate:h,descriptions:a.map(e=>e.descriptionEN),language:w,currentIndex:(e,t,r)=>{const n=a[e];r&&(n.description=r),o?.(e,t,n.description,n.durationMs)},onText:r.onText}),g(b.id,{requesting:!1,phase:i.load,percent:100});else{for(let e=0;e<a.length;e++)o?.(e,a[e].descriptionEN,a[e].description,a[e].durationMs);g(b?.id??l.id,{requesting:!1,phase:t.ready()?i.load:i.download,percent:t.ready()?100:0,...v?{error:v}:{}})}return a})(Be),at=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(Ye(o,"Translate start",r.length,n),!r.length||!et(n))return Ye(o,"Translate skipped"),r;const a=P({maxReplyTokens:400,...t.limits}),{report:c,load:l,generate:u}=rt({service:e,limits:a,logging:o,onStatus:t.onStatus}),d=await f()?p(s.gemma4_e2b_limited):void 0;if(!d)return Ye(o,"Translate no gpu"),r;const g=await l(d);if(g)return Ye(o,"Translate stop",g),r;c(d.id,{requesting:!0,phase:i.load,percent:100});const m=await nt({translator:d,generate:u,descriptions:r,language:n,currentIndex:t.currentIndex,onSpeed:t.onSpeed,onText:t.onText});return c(d.id,{requesting:!1,phase:i.load,percent:100}),m})(Be),it=/^[0-9+\-*/%^().]+$/,st=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},ct={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(!it.test(t))throw new Error("Unsupported character");const r=st(t);return{expression:t,result:Math.abs(r)>=1e5?(0,_.pNum)(r)??r:(0,_.rNum)(r,12)}})(t)}},lt="degreesign-chat-prices-v1",ut="EUR",dt=5*_.oneMin,gt=30*_.oneSec;let mt,pt={},ft=0,ht=!1,yt=!1;const wt=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},bt=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,vt=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=wt(e.rates?.current),n=wt(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&&(pt.fiat=bt(pt.fiat,a)),i&&(pt.crypto=bt(pt.crypto,i)),ft=0,ht=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(lt,JSON.stringify(pt))}catch{}})()}catch(e){throw ft=Date.now(),ht=!0,e}},xt=e=>!!pt.crypto&&(e in pt.crypto.prices||e in pt.crypto.yesterday),jt=e=>!!pt.fiat&&(e in pt.fiat.rates||e in pt.fiat.yesterday),Mt=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==ut)continue;const e=xt(r)||jt(r);!xt(r)&&e||(t.crypto=!0),xt(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(pt.fiat?.fetchedAt??0)>=_.oneHr,o=t.crypto&&r-(pt.crypto?.fetchedAt??0)>=dt;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||ft&&r-ft<gt||(mt||(mt=vt({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{mt=void 0})),await mt))},kt=e=>{if(e==ut)return 1;const t=pt.crypto?.yesterday[e],r=pt.fiat?.yesterday[e];return t||(r?1/r:void 0)},_t=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},Tt=e=>Math.abs(e)>=1e5?(0,_.pNum)(e)??e:(0,_.rNum)(e,8),St=async e=>{(()=>{if(!yt){yt=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(lt);if(!e)return;const t=JSON.parse(e);pt={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=_t(e.from,"from"),r=void 0===e.to||null===e.to?ut:_t(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 Mt([t,r]);const o=e=>{const t=(e=>{if(e==ut)return 1;const t=pt.crypto?.prices[e],r=pt.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!pt.fiat&&!pt.crypto)throw new Error("Prices unavailable offline");if(xt(e)||jt(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=kt(t),c=kt(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!=ut&&(xt(r)?pt.crypto&&t.push(pt.crypto.sourceAt):jt(r)&&pt.fiat&&t.push(pt.fiat.sourceAt));return t})([t,r]),p=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:Tt(l),...void 0===u?{}:{previousRate:Tt(u),change:Tt(d??0),changePercent:(0,_.rNum)(g??0,4)},result:Tt(n*l),updatedAt:new Date(p).toISOString(),stale:ht&&!(!pt.fiat&&!pt.crypto)}},Pt={name:"currency",description:"Get the EUR price of a fiat currency, crypto coin or metal, or convert an amount. Returns the 24-hour change.",parameters:{type:"object",properties:{from:{type:"string",description:"Currency, coin or metal to convert from"},to:{type:"string",description:"Currency, coin or metal to convert to, EUR by default"},amount:{type:"number",description:"Amount to convert, 1 by default"}},required:["from"]},execute:e=>St(e)},Ot={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},Ct=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,Dt=(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 Ot[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),Nt=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,Et=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)}},At=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==l.duckduckgo?l.duckduckgo:l.wikipedia,language:Nt.test(t)?t:"en",limit:Math.round(Ct(e.limit,1,20,3)),snippetLength:Math.round(Ct(e.snippetLength,1,4e3,400)),timeout:Ct(e.timeout,1e3,3e4,8e3)}})(e);return{name:"websearch",description:t.provider==l.duckduckgo?"Search DuckDuckGo for an instant answer and related topics.":"Search Wikipedia and return a few matching articles.",parameters:{type:"object",properties:{query:{type:"string",description:"What to search for"}},required:["query"]},execute:async e=>{const r="string"==typeof e.query?e.query.trim():"";if(!r)throw new Error("Missing query");const n=t.provider==l.duckduckgo?await(async(e,t)=>{const r=`https://api.duckduckgo.com/?format=json&no_html=1&skip_disambig=1&q=${encodeURIComponent(t)}`,n=await Et(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:Dt(r||n,200),url:t,snippet:Dt(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 Et(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:Dt(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:Dt(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},Lt=(e,t)=>{const r=[];for(const n of e)n==c.websearch?r.push(At(t)):n==c.calculate?r.push(ct):n==c.currency&&r.push(Pt);return r}})(),module.exports=n})();
2
+ (()=>{var e={69(e,t){(()=>{"use strict";var e={125:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addZ=t.tN=t.monNm=t.tmUTC=t.tmAP=t.moYrDt=t.shortDt=t.fullLong=t.fullDate=t.fullDt=t.invDt=t.dayRes=t.timeStandard=t.dateStandard=t.seoDt=t.thisYear=t.oneMon=t.oneMin=t.oneHr=t.oneDay=t.oneSec=void 0;const r=()=>Date.now(),n=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],a=["st","nd","rd","th"],i=e=>0==+e?"00":+e<10&&+e>=1?`0${e}`:`${e}`,s=e=>{const t=new Date(e);return`${t.getUTCFullYear()}-${i(t.getUTCMonth()+1)}-${i(t.getUTCDate())}`},c=e=>i(e.getUTCHours())+`:${i(e.getUTCMinutes())}`+`:${i(e.getUTCSeconds())}`;t.tN=r,t.monNm=n,t.dayRes=90,t.oneSec=1e3,t.oneMin=6e4,t.oneHr=36e5,t.oneDay=864e5,t.oneMon=27e8,t.addZ=i,t.tmUTC=e=>{const t=new Date(e);return i(t.getUTCHours())+`:${i(t.getUTCMinutes())} UTC`},t.tmAP=e=>{const t=new Date(e),r=t.getHours();return i(r>12?r-12:r)+`:${i(t.getMinutes())}`+(r>=12?"pm":"am")},t.shortDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]}`},t.moYrDt=e=>{const t=new Date(e);return`${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDate=e=>{const t=new Date(e);return`${t.getDate()} ${n[t.getMonth()]} ${t.getFullYear()}`},t.fullLong=e=>`${(e=>{const t=new Date(e),r=t.getDate();return r+a[r<5?r-1:r>4&&r<21?3:r>20&&r<25?r-21:r>24&&r<31?3:0]+` of ${n[t.getMonth()]}`})(e)} ${new Date(e).getFullYear()}`,t.thisYear=e=>(e?new Date(e):new Date)?.getUTCFullYear(),t.dateStandard=s,t.timeStandard=c,t.seoDt=e=>{!e&&(e=r());const t=new Date(e);return`${s(t)}T${c(t)}Z`},t.invDt=e=>{const t=new Date(e);return`${t.getUTCFullYear()}`.split("20")[1]+i(t.getUTCMonth()+1)+i(t.getUTCDate())+`${e}`.slice(10)}},240:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.idRandLong=t.idRandShort=t.idShuffle=void 0;const r=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","@",".","_","0","1","2","3","4","5","6","7","8","9"];t.idShuffle=async({data:e,password:t})=>4==t?.length?(({data:e,password:t})=>{try{const n=(e,t)=>r.includes(e.toLowerCase())?r[(r.indexOf(e.toLowerCase())+Math.pow(t,3))%r.length]:e;return[...e].map(e=>n(e,Number(t))).join("")}catch{return""}})({data:e,password:t}):await(async({data:e,password:t})=>{if(!e||!t)return"";try{crypto.subtle;const r=new TextEncoder,n=r.encode(e),o=r.encode(t),a=await crypto.subtle.digest("SHA-256",o),i=new Uint8Array(a),s=i.slice(0,32),c=i.slice(0,12),l=await crypto.subtle.importKey("raw",s,{name:"AES-GCM"},!1,["encrypt"]),u=await crypto.subtle.encrypt({name:"AES-GCM",iv:c},l,n);return btoa(String.fromCharCode(...new Uint8Array(u))).replace(/\+/g,"a").replace(/\//g,"b").replace(/=/g,"c").toLowerCase()}catch{return""}})({data:e,password:t}),t.idRandShort=(e=10)=>{try{return crypto.randomUUID()?.replaceAll("-","")?.slice(0,e)}catch(e){return console.log("idRandShort failed",e),""}},t.idRandLong=(e=10)=>{try{const t="abcdefghijklmnopqrstuvwxyz",r=new Uint8Array(e);return crypto.getRandomValues(r),Array.from(r).map(e=>t[e%26]).join("")}catch(e){return console.log("idRandLong failed",e),""}}},246:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.cacheCheck=t.delayCode=void 0;const n=r(125);t.delayCode=async(e=0)=>await new Promise(t=>setTimeout(t,e)),t.cacheCheck=({analysisCacheLimit:e,lastUpdated:t,forceRefresh:r})=>{const o=Date.now();if(t&&(!r&&t>o-e||r&&t>o-n.oneDay))return!0}},792:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isEven=t.pNum=t.sharpeRatio=t.priceVariations=t.nTxtAr=t.zNum=t.addCom=t.adjNum=t.rNum=void 0;const r=[1,.1,.01,.001,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10,1e-11,1e-12,1e-13,1e-14,1e-15,1e-16,1e-17,1e-18,1e-19],n=(e,t=6)=>{const n=+e,o=n?Math.abs(n):0,a=o>1&&t?t-`${Math.round(o)}`.length:0;return n?(n<0?-1:1)*(Number.isInteger(o)||o<1e-16?o:o>1e5?Math.round(o):o>1?Number(o.toFixed(a<0?0:a)):((e,t)=>{let n=0;for(const o of r){if(o<e)return Number(e.toFixed(t+n-1));n++}return e})(o,t)):e},o=(e,t)=>{const r=(n(e,t)+"").split(".");return r[0]=r[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),r.join(".")},a=(e,t=3)=>{const r=Number(e);if(!e||!r)return e+"";const a=Math.abs(r);return(r<0?"-":"")+(a>1e9?o(a/1e9,t)+"b":a>1e6?o(a/1e6,t)+"m":a<1e-6&&a>1e-16?(1+n(a,t)+"").replace(/1./g,"0."):o(a,t))};t.nTxtAr=["zero","one","two","three","four","five","six","seven","eight","nine","ten"],t.rNum=n,t.addCom=o,t.adjNum=a,t.zNum=e=>{const t=Number(e);let r=t?Math.abs(t):0,n=1e10;for(;n>1;)r>n&&(r=Math.round(r/(n/10))*(n/10)),n/=10;return t?(t<0?"-":"")+a(r,2):e},t.pNum=e=>+e||0==+e?Math.round(1e6*+e)/1e6:null,t.priceVariations=e=>{try{let t=0;const r=[...e].sort((e,t)=>e[0]-t[0]),n=e.reduce((e,[,t])=>e+t,0),o=r.find(([,e])=>(t+=e,t>=n/2))[0];return e.filter(([e])=>Math.abs(e-o)/o<.05).map(([e])=>e)}catch{return[]}},t.sharpeRatio=({assetPrices:e,minExpectedReturn:t=.05})=>{if(!e?.length||e?.length<2)return 0;const r=e.slice(1).map((t,r)=>(t-e[r])/e[r]),n=r.reduce((e,t)=>e+t,0)/r.length,o=Math.sqrt(r.reduce((e,t)=>e+Math.pow(t-n,2),0)/r.length);return(n-t)/o},t.isEven=e=>e%2==0},794:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restoreObj=t.restoreObjStr=t.storeObj=t.storeObjStr=t.objNestValueCount=t.objLen=t.objSortSimple=t.objSort=void 0;const n=r(125),o=e=>{try{return Object.keys(e||{})?.length||0}catch(e){return console.log(e),0}},a=e=>{try{return e?.replace(/"/g,"'")}catch(e){return console.log((0,n.tN)(),"storeObjStr failed",e),""}},i=e=>{try{return e?.toString()?.replace(/'/g,'"')}catch(e){console.log((0,n.tN)(),"restoreObjStr failed",e)}};t.objLen=o,t.objNestValueCount=e=>{let t=0;if(o(e))for(const r in e)t+=o(e[r])?1:0;return t},t.objSort=(e={},t,r=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,n])=>null===e[t]||void 0===e[t]?1:null===n[t]||void 0===n[t]?-1:e[t]>n[t]?1*r:-1*r)),t.objSortSimple=(e={},t=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,r])=>null==e?1:null==r?-1:e>r?1*t:-1*t)),t.storeObjStr=a,t.storeObj=e=>{try{return a(JSON.stringify(e))}catch(e){return console.log((0,n.tN)(),"storeObj failed",e),""}},t.restoreObjStr=i,t.restoreObj=e=>{try{if(!e)return;const t=i(e);return t?JSON.parse(t):void 0}catch(e){console.log((0,n.tN)(),"restoreObj failed",e)}}},830:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.phaseDifference=t.compareArrays=t.squeezeArray=t.forecastNextTotal=t.forecastNext=t.getMax=t.getMean=t.getSum=t.maxVl=t.minVl=t.sumArr=void 0;const r=e=>{try{return e?.length?e.reduce((e,t)=>e+t):0}catch(e){return console.log("sumArr failed",e),0}},n=e=>{try{return e?.length?e.reduce((e,t)=>e+t,0):0}catch(e){return console.log("getSum failed",e),0}},o=e=>{try{return e?.length?n(e)/e.length:0}catch(e){return console.log("getMean failed",e),0}},a=e=>{try{return e?.length?Math.max(...e):0}catch(e){return console.log("getMax failed",e),0}},i=e=>{try{if(!e?.length)return 0;const t=[...e].sort((e,t)=>e-t),r=Math.floor(t.length/2);return t.length%2?t[r]:(t[r-1]+t[r])/2}catch(e){return console.log("median failed",e),0}},s=({currentPeriod:e,steps:t=1})=>{try{const r=(Array.isArray(e)?e:[]).filter(Number.isFinite);if(!r.length||t<=0)return[];if(r.length<2){const e=Math.max(0,o(r));return Array.from({length:t},()=>e)}const n=r.length,{slope:s,intercept:c}=(e=>{try{const t=e.length,r=[];for(let n=0;n<t-1;n++)for(let o=n+1;o<t;o++)r.push((e[o]-e[n])/(o-n));const n=i(r);return{slope:n,intercept:i(e.map((e,t)=>e-n*t))}}catch(e){return console.log("theilSen failed",e),{slope:0,intercept:0}}})(r),l=c+s*(n-1),u=a(r),d=u>0?3*u:1/0;return Array.from({length:t},(e,t)=>{const r=t+1,o=l+s*n*Math.log1p(r/n);return Math.max(0,Math.min(o,d))})}catch(e){return console.log("forecastNext failed",e),[]}};t.sumArr=r,t.maxVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]>r&&(r=o[t])}return r},t.minVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]<r&&(r=o[t])}return r},t.getSum=n,t.getMean=o,t.getMax=a,t.forecastNext=s,t.forecastNextTotal=e=>{try{const t=s({currentPeriod:e,steps:e?.length});return n(t)}catch(e){return console.log("forecastNextTotal failed",e),0}},t.squeezeArray=({arr:e,targetLength:t})=>{try{if(!e||0===e.length||t<=0)throw new Error("Invalid input");const n=Math.ceil(e.length/t);return Array.from({length:t},(t,o)=>{const a=o*n,i=Math.min(a+n,e.length),s=e.slice(a,i);return r(s)}).slice(0,t)}catch(e){return console.log("squeezeArray failed",e),[]}},t.compareArrays=({arrays:e})=>{try{const t=[...e],n=Math.min(...t.map(e=>e.length));for(let e=0;e<t.length;e++)t.splice(n);const o=t.map(e=>r(e)),a=[],i=Math.min(...o),s=o.indexOf(i),c=i/Math.max(...o);for(let e=0;e<t.length;e++){const r=t[e];if(a[e]=[],e==s)a[e]=r;else for(let t=0;t<r.length;t++)a[e].push(c*r[t])}return a}catch(t){return console.log("compareArrays failed",t),e}},t.phaseDifference=({array1:e,array2:t})=>{try{let r=e.length,n=e.reduce((e,t)=>e+t)/r,o=t.reduce((e,t)=>e+t)/r,a=e.map(e=>e-n),i=t.map(e=>e-o),s=Math.floor(r/2),c=-1/0,l=0;for(let e=-s;e<=s;e++){let t=0,n=0,o=0,s=0;for(let c=0;c<r;c++){let l=c+e;l>=0&&l<r&&(t+=a[c]*i[l],n+=a[c]*a[c],o+=i[l]*i[l],s++)}if(n>0&&o>0&&s>=.8*r){let r=t/Math.sqrt(n*o);r>c&&(c=r,l=e)}}return l}catch(e){return console.log("phaseDifference failed",e),0}}}},r={};function n(t){var o=r[t];if(void 0!==o)return o.exports;var a=r[t]={exports:{}};return e[t](a,a.exports,n),a.exports}var o={};(()=>{var e=o;Object.defineProperty(e,"__esModule",{value:!0}),e.idShuffle=e.isEven=e.pNum=e.nTxtAr=e.zNum=e.addCom=e.adjNum=e.rNum=e.sharpeRatio=e.priceVariations=e.timeStandard=e.dateStandard=e.addZ=e.tN=e.monNm=e.tmUTC=e.tmAP=e.moYrDt=e.shortDt=e.fullLong=e.fullDate=e.fullDt=e.invDt=e.dayRes=e.thisYear=e.seoDt=e.oneMon=e.oneMin=e.oneHr=e.oneDay=e.oneSec=e.restoreObj=e.restoreObjStr=e.storeObj=e.storeObjStr=e.objSortSimple=e.objSort=e.objNestValueCount=e.objLen=e.phaseDifference=e.compareArrays=e.squeezeArray=e.forecastNextTotal=e.forecastNext=e.getMax=e.getMean=e.getSum=e.maxVl=e.minVl=e.sumArr=void 0,e.cacheCheck=e.delayCode=e.idRandLong=e.idRandShort=void 0;const t=n(246);Object.defineProperty(e,"cacheCheck",{enumerable:!0,get:function(){return t.cacheCheck}}),Object.defineProperty(e,"delayCode",{enumerable:!0,get:function(){return t.delayCode}});const r=n(830);Object.defineProperty(e,"sumArr",{enumerable:!0,get:function(){return r.sumArr}}),Object.defineProperty(e,"minVl",{enumerable:!0,get:function(){return r.minVl}}),Object.defineProperty(e,"maxVl",{enumerable:!0,get:function(){return r.maxVl}}),Object.defineProperty(e,"getMax",{enumerable:!0,get:function(){return r.getMax}}),Object.defineProperty(e,"getMean",{enumerable:!0,get:function(){return r.getMean}}),Object.defineProperty(e,"getSum",{enumerable:!0,get:function(){return r.getSum}}),Object.defineProperty(e,"forecastNext",{enumerable:!0,get:function(){return r.forecastNext}}),Object.defineProperty(e,"forecastNextTotal",{enumerable:!0,get:function(){return r.forecastNextTotal}}),Object.defineProperty(e,"squeezeArray",{enumerable:!0,get:function(){return r.squeezeArray}}),Object.defineProperty(e,"compareArrays",{enumerable:!0,get:function(){return r.compareArrays}}),Object.defineProperty(e,"phaseDifference",{enumerable:!0,get:function(){return r.phaseDifference}});const a=n(240);Object.defineProperty(e,"idRandLong",{enumerable:!0,get:function(){return a.idRandLong}}),Object.defineProperty(e,"idRandShort",{enumerable:!0,get:function(){return a.idRandShort}}),Object.defineProperty(e,"idShuffle",{enumerable:!0,get:function(){return a.idShuffle}});const i=n(792);Object.defineProperty(e,"addCom",{enumerable:!0,get:function(){return i.addCom}}),Object.defineProperty(e,"adjNum",{enumerable:!0,get:function(){return i.adjNum}}),Object.defineProperty(e,"priceVariations",{enumerable:!0,get:function(){return i.priceVariations}}),Object.defineProperty(e,"nTxtAr",{enumerable:!0,get:function(){return i.nTxtAr}}),Object.defineProperty(e,"rNum",{enumerable:!0,get:function(){return i.rNum}}),Object.defineProperty(e,"zNum",{enumerable:!0,get:function(){return i.zNum}}),Object.defineProperty(e,"sharpeRatio",{enumerable:!0,get:function(){return i.sharpeRatio}}),Object.defineProperty(e,"pNum",{enumerable:!0,get:function(){return i.pNum}}),Object.defineProperty(e,"isEven",{enumerable:!0,get:function(){return i.isEven}});const s=n(125);Object.defineProperty(e,"oneSec",{enumerable:!0,get:function(){return s.oneSec}}),Object.defineProperty(e,"oneDay",{enumerable:!0,get:function(){return s.oneDay}}),Object.defineProperty(e,"oneHr",{enumerable:!0,get:function(){return s.oneHr}}),Object.defineProperty(e,"oneMin",{enumerable:!0,get:function(){return s.oneMin}}),Object.defineProperty(e,"oneMon",{enumerable:!0,get:function(){return s.oneMon}}),Object.defineProperty(e,"seoDt",{enumerable:!0,get:function(){return s.seoDt}}),Object.defineProperty(e,"dayRes",{enumerable:!0,get:function(){return s.dayRes}}),Object.defineProperty(e,"invDt",{enumerable:!0,get:function(){return s.invDt}}),Object.defineProperty(e,"fullDt",{enumerable:!0,get:function(){return s.fullDt}}),Object.defineProperty(e,"fullDate",{enumerable:!0,get:function(){return s.fullDate}}),Object.defineProperty(e,"fullLong",{enumerable:!0,get:function(){return s.fullLong}}),Object.defineProperty(e,"shortDt",{enumerable:!0,get:function(){return s.shortDt}}),Object.defineProperty(e,"moYrDt",{enumerable:!0,get:function(){return s.moYrDt}}),Object.defineProperty(e,"tmAP",{enumerable:!0,get:function(){return s.tmAP}}),Object.defineProperty(e,"tmUTC",{enumerable:!0,get:function(){return s.tmUTC}}),Object.defineProperty(e,"monNm",{enumerable:!0,get:function(){return s.monNm}}),Object.defineProperty(e,"tN",{enumerable:!0,get:function(){return s.tN}}),Object.defineProperty(e,"addZ",{enumerable:!0,get:function(){return s.addZ}}),Object.defineProperty(e,"timeStandard",{enumerable:!0,get:function(){return s.timeStandard}}),Object.defineProperty(e,"dateStandard",{enumerable:!0,get:function(){return s.dateStandard}}),Object.defineProperty(e,"thisYear",{enumerable:!0,get:function(){return s.thisYear}});const c=n(794);Object.defineProperty(e,"objSort",{enumerable:!0,get:function(){return c.objSort}}),Object.defineProperty(e,"objLen",{enumerable:!0,get:function(){return c.objLen}}),Object.defineProperty(e,"objNestValueCount",{enumerable:!0,get:function(){return c.objNestValueCount}}),Object.defineProperty(e,"restoreObj",{enumerable:!0,get:function(){return c.restoreObj}}),Object.defineProperty(e,"restoreObjStr",{enumerable:!0,get:function(){return c.restoreObjStr}}),Object.defineProperty(e,"storeObj",{enumerable:!0,get:function(){return c.storeObj}}),Object.defineProperty(e,"storeObjStr",{enumerable:!0,get:function(){return c.storeObjStr}}),Object.defineProperty(e,"objSortSimple",{enumerable:!0,get:function(){return c.objSortSimple}})})();var a=t;for(var i in o)a[i]=o[i];o.__esModule&&Object.defineProperty(a,"__esModule",{value:!0})})()}};const t={};function r(n){const o=t[n];if(void 0!==o)return o.exports;const a=t[n]={exports:{}};return e[n](a,a.exports,r),a.exports}r.m=e,r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.f={},r.e=e=>{const t=[];return r.f.require(e,t),Promise.all(t)},r.u=e=>({520:"engine-litert",924:"engine-wllama"}[e]+".node.min.js"),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{const e={792:1};r.f.require=(t,n)=>{if(!e[t]){const n=require("./"+r.u(t));e[t]||(t=>{const n=t.modules,o=t.ids,a=t.runtime;for(var i in n)r.o(n,i)&&(r.m[i]=n[i]);a&&a(r);for(var s=0;s<o.length;s++)e[o[s]]=1})(n)}}})();let n={};(()=>{"use strict";var e,t,o,a,i,s,c,l;let u;r.r(n),r.d(n,{BuiltinTool:()=>c,ChatModelId:()=>s,ChatStatus:()=>t,LlmBackend:()=>a,LlmPhase:()=>i,LlmRole:()=>e,LlmStatus:()=>o,WebSearchProvider:()=>l,builtinTools:()=>Lt,calculateTool:()=>ct,clearModelCache:()=>Ge,createChat:()=>We,currencyTool:()=>Pt,describeImages:()=>ot,describeTranslated:()=>at,preloadModel:()=>Qe,webSearchTool:()=>At}),function(e){e.system="system",e.user="user",e.assistant="assistant"}(e||(e={})),function(e){e[e.online=0]="online",e[e.away=1]="away",e[e.offline=2]="offline"}(t||(t={})),function(e){e[e.idle=0]="idle",e[e.downloading=1]="downloading",e[e.ready=2]="ready",e[e.error=3]="error",e[e.unsupported=4]="unsupported"}(o||(o={})),function(e){e.cpu="cpu",e.gpu="gpu",e.none="none"}(a||(a={})),function(e){e.download="download",e.load="load"}(i||(i={})),function(e){e.qwen3_vl_2b="qwen3-vl-2b",e.qwen3_vl_2b_instruct="qwen3-vl-2b-instruct",e.qwen3_vl_2b_instruct_q3="qwen3-vl-2b-instruct-q3",e.gemma4_e2b="gemma4-e2b",e.gemma4_e2b_limited="gemma4-e2b-limited"}(s||(s={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(c||(c={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(l||(l={}));const d=[{id:s.qwen3_vl_2b,reasoning:!0,cpu:{repo:"Qwen/Qwen3-VL-2B-Thinking-GGUF",file:"Qwen3VL-2B-Thinking-Q4_K_M.gguf",mmproj:{file:"mmproj-Qwen3VL-2B-Thinking-Q8_0.gguf"}}},{id:s.qwen3_vl_2b_instruct,reasoning:!1,cpu:{repo:"unsloth/Qwen3-VL-2B-Instruct-GGUF",file:"Qwen3-VL-2B-Instruct-Q4_K_M.gguf",mmproj:{repo:"Qwen/Qwen3-VL-2B-Instruct-GGUF",file:"mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf"}}},{id:s.qwen3_vl_2b_instruct_q3,reasoning:!1,cpu:{repo:"unsloth/Qwen3-VL-2B-Instruct-GGUF",file:"Qwen3-VL-2B-Instruct-Q3_K_M.gguf",mmproj:{repo:"Qwen/Qwen3-VL-2B-Instruct-GGUF",file:"mmproj-Qwen3VL-2B-Instruct-Q8_0.gguf"}}},{id:s.gemma4_e2b,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it.litertlm",vision:!0,audio:!0}},{id:s.gemma4_e2b_limited,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it-gpu.litertlm",vision:!1,audio:!1}}],g=e=>{const t=e??("undefined"==typeof navigator?void 0:navigator);if(!t)return!1;if("boolean"==typeof t.userAgentData?.mobile)return t.userAgentData.mobile;const r=t.userAgent||"";return/Android|iPhone|iPad|iPod|Mobile/i.test(r)||/Macintosh/.test(r)&&t.maxTouchPoints>1},m=(e,t=g())=>e==s.gemma4_e2b&&t?s.gemma4_e2b_limited:e,p=e=>e?d.find(t=>t.id==e):void 0,f=async()=>{const e="undefined"==typeof navigator?void 0:navigator.gpu;if(!e)return!1;let t;try{return!!await Promise.race([e.requestAdapter({powerPreference:"high-performance"}),new Promise(e=>{t=setTimeout(()=>e(void 0),1500)})])}catch{return!1}finally{t&&clearTimeout(t)}},h=async e=>p(m(e??await(async()=>(u||(u=(async()=>await f()?m(s.gemma4_e2b):s.qwen3_vl_2b)()),await u))())),y=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,w=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio,b=require("node:path"),v=()=>{return e=(0,b.join)(__dirname,"../assets/wllama"),{wasm:(0,b.join)(e,"wllama.wasm"),compatWasm:(0,b.join)(e,"compat/wllama.wasm"),compatWorker:(0,b.join)(e,"compat/wllama.js")};var e},x=()=>{return e=(0,b.join)(__dirname,"../assets/litert"),{script:(0,b.join)(e,"litertlm_wasm_internal.js"),wasm:(0,b.join)(e,"litertlm_wasm_internal.wasm")};var e},j={width:384,height:384},M=async e=>{if(!e.startsWith("data:"))return await(await fetch(e)).arrayBuffer();const t=e.indexOf(","),r=t>=0?e.slice(0,t):"";if(t<0)throw new Error("Invalid image data");if(!r.includes(";base64"))return await(await fetch(e)).arrayBuffer();const n=atob(e.slice(t+1)),o=new Uint8Array(n.length);for(let e=0;e<n.length;e++)o[e]=n.charCodeAt(e);return o.buffer},k=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 _=r(69);const T={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:6},S=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,P=(e={},t=!1)=>{const r=T;return{maxReplyTokens:S(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:S(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:S(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:S(e.maxImages,r.maxImages,0),maxAudio:S(e.maxAudio,r.maxAudio,0),maxContentLength:S(e.maxContentLength,r.maxContentLength,1),promptCharBudget:S(e.promptCharBudget,r.promptCharBudget,1),maxThreads:S(e.maxThreads,r.maxThreads,1)}},O=(e,t)=>({stream:!0,temperature:.7,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),C=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,D=e=>Number(e.headers.get("content-length"))||0,N=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),E=e=>N(e,"image"),A=e=>N(e,"audio"),L=["<|channel>thought\n","<|channel>thought","..."],$=["<channel|>","..."],q=(e,t,r)=>t.length||r.length?[...e?[{type:"text",text:e}]:[],...t.map(e=>({type:"image",url:e})),...r.map(e=>({type:"audio",url:e}))]:e,R=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,U=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...R(e),{type:"text",text:"\n"},...R(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r},I=g()?3e6:3e5,z=Math.max(I,84e4);class F extends Error{}const B=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new F(r)),t)})])}finally{n&&clearTimeout(n)}},V=e=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}},W=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,start:a,stopped:i,firstTimeoutMs:s=I,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,$);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,$);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,L);if(e>=0){e&&t(s.slice(0,e)),s=s.slice(e+i.length),s.startsWith("\n")&&(s=s.slice(1)),n=!0;continue}const c=a(s,L);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{d+=e,r(e)},e=>{u+=e,n(e)});try{const e=(await B(a(),s,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(i()){V(e);break}let n;try{n=await B(e.next(),m?c:s,m?"Model stopped responding":"Model did not reply")}catch(r){if(r instanceof F&&(u||d)){l?.(),V(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,_.rNum)(1e3*p/(e-f)))}}h.flush()}catch(e){if(t&&console.log("Local chat failed",e),e instanceof F&&!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},Q=async({model:t,params:r,start:n,stopped:o,onStall:a})=>{const i=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 k(r.url,t)}:r);r.push({role:"user",content:e})}return r})(((t,r=T)=>{const n=r.maxContentLength,o=t.filter(t=>"string"==typeof t.content&&!!t.content.trim()||!(t.role!=e.user||!t.images?.length&&!t.audio?.length)),a=[],i=[];let s=0,c=r.maxImages,l=r.maxAudio;for(let t=o.length-1;t>=0;t--){const u=o[t],d=("string"==typeof u.content?u.content:"").slice(0,n),g=u.role==e.user?(u.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,c)):[],m=u.role==e.user?(u.audio||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,l)):[];if(d||g.length||m.length){if(d&&s+d.length>r.promptCharBudget)break;s+=d.length,c-=g.length,l-=m.length,u.role==e.system?a.unshift(d):u.role==e.assistant?i.unshift({role:"assistant",content:d}):i.unshift({role:"user",content:q(d,g,m)})}}for(;i.length&&"user"!=i[0].role;)i.shift();const u=[];for(const e of i){const t=u[u.length-1];"assistant"==t?.role&&"assistant"==e.role?t.content=`${t.content}\n${e.content}`:"user"==t?.role&&"user"==e.role?t.content=U(t.content,e.content):"assistant"==e.role?u.push({role:"assistant",content:e.content}):u.push({role:"user",content:e.content})}const d=a.join("\n\n"),g=[];return d&&g.push({role:"system",content:d}),g.push(...u),g})(r.messages,r.limits),t.litert?j:void 0);return r.logging&&((e,t)=>{console.log("Local chat call",e.id,t.map(({role:e,content:t})=>({role:e,content:"****",...Array.isArray(t)?{images:t.filter(e=>"image"==e.type).length,audio:t.filter(e=>"audio"==e.type).length}:{}})))})(t,i),await W({model:t,logging:r.logging,onReason:r.onReason,onText:r.onText,onSpeed:r.onSpeed,start:()=>n(i),stopped:o,onStall:a,firstTimeoutMs:E(i)?z:I})},Y=33554432,G=new Map;let H=!1;const J=e=>{const t=(e.split("/").pop()||"model").replace(/[^\w.-]+/g,"_");let r=0;for(let t=0;t<e.length;t++)r=31*r+e.charCodeAt(t)>>>0;return`${r.toString(16)}-${t}`},Z=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},K=async()=>{if(!H)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else H=!0},X=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},ee=async e=>{if(e)try{const t=await e.getFile(),r=JSON.parse(await t.text());return{total:Number(r.total)||0,etag:`${r.etag||""}`,complete:!0===r.complete}}catch{return}},te=async(e,t)=>{try{const r=await e.getFileHandle("meta.json",{create:!0}),n=await r.createWritable();await n.write(JSON.stringify(t)),await n.close()}catch{}},re=async function*(e){for await(const t of e)yield t},ne=async e=>{try{for await(const[t,r]of re(e))"file"==r.kind&&Z(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},oe=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await ee(await e.getFileHandle(`${t}.json`).catch(()=>{}));if(!n)return;return{file:r,size:r.size,total:n.total,etag:n.etag,complete:n.total?r.size>=n.total:!0===n.complete}}catch{return}},ae=async(e,t)=>{const r=await X(e,t);if(r){const e=await(async e=>await ee(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of re(e)){const e=Z(r);if("file"!=n.kind||e<0)continue;const o=await n.getFile();t.push({part:{start:e,size:o.size},file:o})}}catch{return}const r=(e=>{const t=[];let r=0;for(const n of[...e].sort((e,t)=>e.start-t.start))if(n.size){if(n.start!=r)break;t.push(n),r+=n.size}return t})(t.map(e=>e.part)),n=new Set(r.map(e=>e.start)),o=t.filter(e=>n.has(e.part.start)).sort((e,t)=>e.part.start-t.part.start).map(e=>e.file);if(o.length)return{file:1==o.length?o[0]:new Blob(o),size:r.reduce((e,t)=>e+t.size,0)}})(r),n=e?.total||0,o=t?.size??0,a=t?.file??new Blob;return{file:n&&o>n?a.slice(0,n):a,size:o,total:n,etag:e?.etag||"",complete:n?o>=n:!0===e?.complete}}return await oe(e,t)},ie=(e,t)=>{const r=e.headers.get("content-range"),n=/bytes (\d+)-/.exec(r||""),o=/\/(\d+)\s*$/.exec(r||""),a=e.headers.get("etag")||"";if(206==e.status){const e=n?Number(n[1]):t.size,r=o?Number(o[1]):t.total;if(e!=t.size)return;if(t.total&&r&&t.total!=r)return;if(t.etag&&a&&t.etag!=a)return;return{start:e,total:r||t.total,etag:a||t.etag}}if(!t.etag||!a||t.etag==a)return{start:0,total:D(e)||t.total,etag:a||t.etag}},se=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:s})=>{let c,l=t,u=0,d=r;const g=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(l),{create:!0});c=await t.createWritable(),u=0},m=async()=>{const e=c;c=void 0,e&&await e.close().catch(()=>{})};try{const e=o.getReader();for(;;){const{done:r,value:o}=await e.read();if(r)break;s();let p=0;for(d&&(p=Math.min(d,o.byteLength),d-=p);p<o.byteLength;){c||await g();const e=Math.min(Y-u,o.byteLength-p);await c.write({type:"write",position:u,data:o.subarray(p,p+e)}),p+=e,u+=e,l+=e,u==Y&&await m()}l>t&&a(n?l/n:0,i.download)}await m()}catch(e){throw await m(),e}return l},ce=e=>["NotAllowedError","NotSupportedError"].includes(e?.name||""),le=e=>{const t=async()=>{const t=await K();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await ae(r,J(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{const a=`${e}|${r}`,s=G.get(a);if(s)return await s;const c=await t();if(!c)return;const l=(async(e,t,r,n)=>{const o=J(t),a=await oe(e,o);if(a?.complete)return a;let s=await X(e,o);s||(await e.removeEntry(o).catch(()=>{}),await e.removeEntry(`${o}.json`).catch(()=>{}),s=await e.getDirectoryHandle(o,{create:!0}));let c=0,l=0;for(;;){if(r?.aborted)throw new Error("Cancelled");const a=await ae(e,o);if(a?.complete)return a;const u=a?.size??0,d=a?.total||0,g=a?.etag||"";if(u>c)c=u,l=0;else if(++l>4)throw new Error("Model download failed");u&&d&&n(u/d,i.download);const m=d?Math.min(u+Y,d)-1:u+Y-1,p=new AbortController,f=()=>p.abort(),h={size:u,total:d,etag:g};let y,w=setTimeout(f,3e4);r?.addEventListener("abort",f,{once:!0});try{if(y=await fetch(t,{signal:p.signal,headers:{Range:`bytes=${u}-${m}`}}),416==y.status){if(await(y.body?.cancel().catch(()=>{})),d&&u>=d){await te(s,{total:d,etag:g,complete:!0});continue}await ne(s),await te(s,{total:0,etag:"",complete:!1});continue}if(!y.ok||!y.body)throw await(y.body?.cancel().catch(()=>{})),new Error("Model download failed");const r=ie(y,h);if(!r){await y.body.cancel().catch(()=>{}),await ne(s),await te(s,{total:0,etag:"",complete:!1});continue}await te(s,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?u:0,i=await se({dir:s,start:r.start+a,skip:a,total:r.total,body:y.body,onProgress:n,onChunk:()=>{clearTimeout(w),w=setTimeout(f,3e4)}});if(!r.total){await te(s,{total:i,etag:r.etag,complete:!0});const t=await ae(e,o);if(t)return t}}catch(e){if(r?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&["QuotaExceededError","NotAllowedError","NotSupportedError","InvalidStateError","TypeMismatchError","SecurityError"].includes(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*l))}finally{clearTimeout(w),r?.removeEventListener("abort",f)}}})(c,r,n,o).finally(()=>{G.delete(a)});return G.set(a,l),await l},remove:async e=>{const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,J(e))},purge:async()=>{const t=await K();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},ue="litertlm-models",de=le("litert-store"),ge={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 me=!1;const pe=(...e)=>{me&&console.log(...e)},fe=(...e)=>{me&&console.error(...e)},he=e=>{try{e.getGlobalLiteRtLm().liteRtLmWasm.preinitializedWebGPUDevice=void 0}catch{}},ye=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(ue)}catch{return}},we=new Map,be=(e,t,r)=>{let n=0;return e.pipeThrough(new TransformStream({transform:(e,o)=>{n+=e.byteLength,r(t?n/t:0,i.download),o.enqueue(e)}}))},ve=async(e,t=!0)=>{const r=[];for(const n of e){if("string"==typeof n.content){r.push({role:n.role,content:n.content});continue}const e=[];for(const r of n.content)"text"!=r.type?t?e.push({type:r.type,data:await M(r.url)}):e.push({type:"text",text:`[${r.type}]`}):e.push({type:"text",text:r.text});r.push({role:n.role,content:e})}return r},xe=(e,t)=>{if(e.role!=t.role)return!1;if("string"==typeof e.content||"string"==typeof t.content)return e.content==t.content;if(e.content.length!=t.content.length)return!1;for(let r=0;r<e.content.length;r++){const n=e.content[r],o=t.content[r];if(n.type!=o.type)return!1;if("text"==n.type&&"text"==o.type){if(n.text!=o.text)return!1}else if(("image"==n.type&&"image"==o.type||"audio"==n.type&&"audio"==o.type)&&n.url!=o.url)return!1}return!0},je=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=O(r.limits,r.reasoning);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await ve([a]))[0];if(!c)throw new Error("Empty prompt");const l=!!o.conversation&&o.reasoning==r.reasoning&&o.maxTokens==i.max_tokens&&((e,t)=>{const r="system"==e[0]?.role?e[0]:void 0,n="system"==t[0]?.role?t[0]:void 0;if(!r!=!n)return!1;if(r&&n&&!xe(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(!xe(o[i+e],a[e]))return!1;return!0})(o.sent,s);let u;if(l&&o.conversation)u=o.conversation;else{const n=await ve(s,!1);o.conversation=void 0,o.sent=[],u=await e.createConversation({sessionConfig:{maxOutputTokens:i.max_tokens,samplerParams:{type:t.SamplerType.TOP_K,temperature:i.temperature,k:40,p:.95}},preface:{...n.length?{messages:n}:{},extra_context:{enable_thinking:r.reasoning}},prefillPrefaceOnInit:n.length>0}),o.conversation=u,o.reasoning=r.reasoning,o.maxTokens=i.max_tokens,o.sent=[...s]}o.sent.push(a);let d,g=!1,m="";const p=()=>{d&&d.cancel().catch(()=>{});try{u.cancel()}catch{}};r.signal?.addEventListener("abort",p,{once:!0});try{if(r.signal?.aborted)return;const e=u.sendMessageStreaming(c).getReader();for(d=e;;){const{done:t,value:r}=await e.read();if(t)break;const n={};let o="string"==typeof r.content?r.content:"";if(Array.isArray(r.content))for(const e of r.content)"text"==e.type&&(o+=e.text);o&&(n.content=o,m+=o);const a=r.channels?.thought;a&&(n.reasoning=a),(n.content||n.reasoning)&&(yield{choices:[{delta:n}]})}g=!0}finally{r.signal?.removeEventListener("abort",p),g&&m?o.sent.push({role:"assistant",content:m}):(o.conversation=void 0,o.sent=[])}},Me={backend:a.gpu,startLLM:async({model:e,limits:t,onProgress:n,signal:o,logging:s})=>{me=!0===s;const c=e.litert;if(!c)throw new Error("Model has no LiteRT artifact");const l=await r.e(520).then(()=>r(507)),u=globalThis,d=u.Module;u.Module={print:pe,printErr:fe};try{await l.getOrLoadGlobalLiteRtLm(x().script)}finally{u.Module=d}if(o?.aborted)throw new Error("Cancelled");const g=C(c.repo,c.file),m=await ye();let p;const f=m?await m.match(g):void 0;if(f?.body)p=f.body;else{const e=await de.stored(g);e?.complete&&(p=e.file.stream())}if(!p){const e=await de.download({url:g,signal:o,onProgress:n}).catch(e=>{if(o?.aborted)throw new Error("Cancelled");if(!ce(e))throw e;s&&console.log("Local model store failed",e)});e&&(p=e.file.stream())}if(!p&&m)try{await(async(e,t,r,n)=>{const o=we.get(e);if(o)return await o;const a=(async()=>{const o=await fetch(e,{signal:r});if(!o.ok||!o.body)throw new Error("Model download failed");const a=D(o),i=be(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{we.delete(e)});return we.set(e,a),await a})(g,m,o,n);const e=await m.match(g);e?.body&&(p=e.body)}catch(e){if(o?.aborted)throw new Error("Cancelled");s&&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 be(n.body,D(n),r)})(g,o,n)),o?.aborted)throw new Error("Cancelled");n(1,i.load);const h=await l.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:ge},...o?.vision?{visionBackend:n.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...o?.audio?{audioBackend:n.Backend.CPU}:{}}})({model:e,limits:t,source:p,mod:l}));if(o?.aborted)throw await h.delete(),he(l),new Error("Cancelled");const y={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:a.gpu,contextSize:4096,chat:t=>(async({engine:e,model:t,mod:r,params:n,session:o})=>{me=!0===n.logging;const a=()=>{try{o.conversation?.cancel()}catch{}o.conversation=void 0,o.sent=[]};try{return await Q({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async a=>{if(n.signal?.aborted)throw new Error("Cancelled");if(E(a)&&!t.litert?.vision)throw new Error("Model does not accept images");if(A(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return je({engine:e,mod:r,params:n,messages:a,session:o})}})}catch(e){throw a(),e}})({engine:h,model:e,mod:l,params:t,session:y}),unload:async()=>{const e=y.conversation;y.conversation=void 0,y.sent=[];try{await(e?.delete())}catch{}await h.delete(),he(l)}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=C(t.repo,t.file),[n,o]=await Promise.all([ye(),de.stored(r)]);if(o?.complete)return!0;try{return!(!n||!await n.match(r))}catch{return!1}},purge:async()=>{try{await de.purge(),"undefined"!=typeof caches&&await caches.delete(ue)}catch{}}},ke=le("wllama-store"),_e=[s.qwen3_vl_2b_instruct,s.qwen3_vl_2b_instruct_q3],Te=e=>e.cpu?.mmproj&&_e.includes(e.id)?{image_min_tokens:16,image_max_tokens:100}:{};let Se,Pe,Oe="",Ce=!1;const De=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Ne=e=>{const t=v();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},Ee=e=>{const t=e=>(...t)=>{Ce&&("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)}},Ae=async()=>{if(Se)return Se;const e=await r.e(924).then(()=>r(577)),t=Pe||Ne(),n=new e.Wllama({default:t.wasm},{logger:Ee(e.LoggerWithoutDebug)});return Pe||(Pe=t,Oe=De(t)),n.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),Se=n,n},Le=async()=>{const e=Se;Se=void 0;try{await(e?.exit())}catch{}},$e=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),qe=e=>{const t=e.cpu;return t?[{name:t.file,url:C(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:C(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},Re=async e=>{const t=qe(e);if(!t.length)return!1;for(const e of t){const t=await ke.stored(e.url);if(!t?.complete)return!1}return!0},Ue=async(e,t)=>{const r=await e.cacheManager.list();return qe(t).every(e=>r.some(t=>$e(t,e.name)))},Ie=async({model:e,signal:t,onProgress:r})=>{const n=qe(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await ke.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 M(t.url)});t.push({role:"user",content:e})}return t},Fe={backend:a.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:s})=>{Ce=!0===o;const c=g()?4096:8192,l=e.cpu;if(!l)throw new Error("Model has no CPU artifact");const u=Ne(s),d=De(u);Se&&d!=Oe&&await Le(),Pe=u,Oe=d;const m=((e,t,r=!1)=>Math.max(1,Math.min(Math.max(2,Math.min(8,(e||4)-1)),t,r?2:3)))("undefined"!=typeof navigator&&navigator.hardwareConcurrency||4,t.maxThreads,!!l.mmproj),p=await Ae(),f=await Re(e),h=l.mmproj?.file,y=C(l.repo,l.file),w=h?C(l.mmproj?.repo??l.repo,h):"";if(n?.aborted)throw await Le(),new Error("Cancelled");if(!f&&h){const e=await p.cacheManager.list(),t=e.some(e=>$e(e,l.file)),r=e.some(e=>$e(e,h));t&&!r&&await p.cacheManager.deleteMany(e=>$e(e,l.file))}const b={n_ctx:c,n_threads:m,reasoning_budget_tokens:t.maxThinkingTokens,n_gpu_layers:0,jinja:!0,...Te(e)};try{let t=f?await Ie({model:e,signal:n,onProgress:r}):void 0;t||f||await Ue(p,e).catch(()=>!1)||(t=await Ie({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");if(!ce(e))throw e;o&&console.log("Local model store failed",e)})),t?(r(1,i.load),await p.loadModel(t,b)):await p.loadModelFromUrl(w?{url:y,mmprojUrl:w}:y,{...b,useCache:!0,signal:n,progressCallback:({loaded:e,total:t})=>{const n=t?e/t:0;r(n,n>=1?i.load:i.download)}})}catch(e){throw await Le(),e}if(n?.aborted)throw await Le(),new Error("Cancelled");if(!p.getLoadedContextInfo().n_ctx)throw await Le(),new Error("Failed to create model context");return{model:e,backend:a.cpu,contextSize:c,chat:t=>(async(e,t,r)=>{if(Ce=!0===r.logging,e.isModelLoaded())return await Q({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if(E(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if(A(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await ze(n),...O(r.limits,r.reasoning),abortSignal:r.signal,...t.reasoning?{chat_template_kwargs:{enable_thinking:r.reasoning}}:{}})}})})(p,e,t),unload:async()=>{if(Se==p)await Le();else try{await p.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await Re(e)||await Ue(await Ae(),e))}catch{return!1}},purge:async()=>{try{await ke.purge()}catch{}try{const e=await Ae();await e.cacheManager.clear()}catch{}}},Be=((e={})=>{const t=e.engines?.cpu||Fe,r=e.engines?.litert||Me;let n,s,c,l,u,d,g,m=a.none,p=o.idle,f=[],h=0,y={percent:0,phase:i.download};const w=n=>{if(e.backend!=a.none)return e.backend==a.cpu?n.cpu?t:void 0:e.backend==a.gpu?n.litert?r:void 0:n.litert&&"undefined"!=typeof navigator&&navigator.gpu&&"undefined"!=typeof WebAssembly?r:!n.cpu||"undefined"==typeof window&&"undefined"==typeof self&&"undefined"==typeof Worker||"undefined"==typeof WebAssembly?void 0:t},b=async()=>{const e=n;n=void 0,s=void 0,await(e?.unload())},v=(e,t)=>{y={percent:Math.max(0,Math.min(1,e)),phase:t||i.download};for(const e of[...f])e.report(y.percent,y.phase)},x=e=>{p=e},j=()=>{h++,u?.abort(),u=void 0,l=void 0,p==o.downloading&&x(o.idle)},M=(e,t)=>{const r=c;return r?new Promise(n=>{let o=!1;const a={report:e,settle:e=>{o||(o=!0,t?.removeEventListener("abort",i),n(e))}},i=()=>{(e=>{f=f.filter(t=>t!=e),queueMicrotask(()=>{!f.length&&c&&j()})})(a),a.settle(!1)};f.push(a),t?.aborted?i():t?.addEventListener("abort",i,{once:!0}),r.then(a.settle,()=>a.settle(!1))}):Promise.resolve(!1)},k=()=>p==o.ready&&!!n&&!!s,_=async()=>{j(),x(o.idle),await b()};return{load:async({model:e,limits:t,assets:r,logging:a,signal:g,onProgress:p})=>{if(g?.aborted)return!1;if(k()&&s?.id==e.id)return!0;if(c&&l==e.id)return p(y.percent,y.phase),await M(p,g);c&&(j(),f=[],await c.catch(()=>!1));const _=++h,T=(async()=>{await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})();const c=w(e);if(_!=h)return!1;if(!c)return d="Model is not supported on this device",x(o.unsupported),!1;if(await b(),_!=h)return!1;const l=await c.cached(e);if(_!=h)return!1;d=void 0,x(o.downloading),v(0,i.download),l&&v(1,i.load);const g=new AbortController;u=g;try{const l=await c.startLLM({model:e,limits:t,logging:a,signal:g.signal,assets:r,onProgress:(e,t)=>{_==h&&v(e,t)}});return _!=h||g.signal.aborted?(await l.unload(),!1):(n=l,s=e,m=c.backend,d=void 0,x(o.ready),v(1,i.load),!0)}catch(e){return _!=h||(n=void 0,s=void 0,d=`${e?.message||`${e}`}`,a&&console.log("Local model failed",e),x(o.error)),!1}finally{u==g&&(u=void 0)}})().finally(()=>{c==T&&(c=void 0,l=void 0,f=[])});return c=T,l=e.id,await M(p,g)},chat:async e=>{if(!k()||!n)return;for(;g;)await g.catch(()=>{});if(!k()||!n)return;const t=n.chat(e);g=t;try{return await t}finally{g==t&&(g=void 0)}},unload:_,clear:async()=>{const e=c;await _(),await(e?.catch(()=>{})),await Promise.all([t.purge(),r.purge()])},ready:k,loading:()=>!k()&&p==o.downloading,status:()=>p,backend:()=>m,error:()=>d,model:()=>s}})(),Ve=(e,r,n)=>{const a=e.status(),i=m(r),s=p(i);return{...i?{model:i}:{},availability:a==o.ready?t.online:a==o.error||a==o.unsupported?t.offline:t.away,status:a,backend:e.backend(),supportsImages:!!s&&y(s),supportsAudio:!!s&&w(s),ready:e.ready(),loading:e.loading(),requesting:n.requesting,phase:n.phase,percent:n.percent,...n.error?{error:n.error}:{}}},We=(t=>{let r,n=0;const a=e=>e.input.onStatus?.(Ve(t,e.model??e.input.model,e));return s=>{r?.controller.abort();const c={token:++n,input:s,controller:new AbortController,percent:t.ready()?100:0,phase:t.ready()?i.load:i.download,requesting:!1,cancelled:!1};return r=c,a(c),(async r=>{const{input:o}=r,s=!0===o.logging,c=await h(o.model);if(r.model=c?.id,r.token!=n)return;const l=o.messages.some(t=>t.role!=e.system&&"string"==typeof t.content&&!!t.content.trim()),u=o.messages.some(t=>t.role==e.user&&!!t.images?.some(e=>"string"==typeof e&&!!e)),d=o.messages.some(t=>t.role==e.user&&!!t.audio?.some(e=>"string"==typeof e&&!!e)),g=l||u||d;if(!c)return r.error="Unknown model",void a(r);if(!g)return r.error="No prompt",void a(r);const m=y(c),p=w(c);if(!(l||u&&m||d&&p))return d&&!p?r.error="Model does not accept audio":u&&!m&&(r.error="Model does not accept images"),void a(r);const f=P(o.limits,!!c.litert),b=await t.load({model:c,limits:f,logging:s,signal:r.controller.signal,onProgress:(e,t)=>{r.token==n&&(r.percent=Math.round(100*e),r.phase=t,a(r))}}).catch(e=>(r.token==n&&(r.error=`${e?.message||`${e}`}`),!1));if(r.token!=n)return;if(r.cancelled)return;if(!b)return r.error||(r.error=t.error()||"Model not ready"),void a(r);const v=u&&!m||d&&!p?o.messages.map(({images:e,audio:t,...r})=>({...r,...e&&m?{images:e}:{},...t&&p?{audio:t}:{}})):o.messages;r.requesting=!0,r.error=void 0,r.percent=100,r.phase=i.load,a(r);let x,j="",M="";try{x=await t.chat({messages:v,limits:f,reasoning:!0===o.reasoning,logging:s,onReason:e=>{r.token!=n||r.cancelled||(j+=e,o.onThinking?.(j))},onText:e=>{r.token!=n||r.cancelled||(M+=e,o.onResponse?.(M))},onSpeed:e=>{r.token!=n||r.cancelled||o.onSpeed?.(e)},signal:r.controller.signal})}catch(e){if(r.token!=n)return;return r.requesting=!1,r.error=`${e?.message||`${e}`}`,void a(r)}r.token==n&&(r.requesting=!1,x||r.cancelled||(r.error="No reply"),a(r))})(c),()=>(e=>{e.token==n&&(e.cancelled=!0,e.controller.abort(),t.status()!=o.ready?queueMicrotask(()=>a(e)):t.unload().then(()=>a(e)))})(c)}})(Be),Qe=(Ye=Be,async(e={})=>{const t=await h(e.model),r=r=>e.onStatus?.(Ve(Ye,t?.id,r));if(!t)return r({requesting:!1,phase:i.download,percent:0,error:"Unknown model"}),!1;let n,o=0,a=i.download;const s=Ye.ready()&&Ye.model()?.id==t.id;return await Ye.load({model:t,limits:P(e.limits,!!t.litert),logging:!0===e.logging,onProgress:(e,t)=>{o=Math.round(100*e),a=t,r({requesting:!1,phase:a,percent:o})}}).catch(e=>(n=`${e?.message||`${e}`}`,!1))?(s&&r({requesting:!1,phase:i.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||Ye.error()||"Model not ready"}),!1)});var Ye;const Ge=async()=>{await Be.clear()},He=(e,...t)=>{!0===e&&console.log(...t)},Je=["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(" "),Ze=["describe this image in one sentence starting with the main subject"].join(" "),Ke=["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(" "),Xe="CANNOT_TRANSLATE",et=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},tt=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`,rt=({service:e,limits:t,logging:r,onStatus:n})=>{const o=(t,r)=>n?.(Ve(e,t,r));return{report:o,load:async n=>{let a,s=0,c=-1,l=i.download;He(r,"Describe load start",n.id,t.maxReplyTokens);if(await e.load({model:n,limits:t,logging:r,onProgress:(e,t)=>{s=Math.round(100*e),l=t,s!=c&&(c=s,He(r,"Describe load progress",n.id,s,l)),o(n.id,{requesting:!1,phase:l,percent:s})}}).catch(e=>(a=`${e?.message||`${e}`}`,!1)))return void He(r,"Describe load ready",n.id);const u=a||e.error()||"Model not ready";return He(r,"Describe load failed",n.id,u),o(n.id,{requesting:!1,phase:l,percent:s,error:u}),u},generate:async({model:n,messages:a,stage:s,onSpeed:c,onText:l})=>{let u="";const d=Date.now();He(r,"Describe generate start",s,n,a.length);try{const o=await e.chat({messages:a,limits:t,reasoning:!1,logging:r,onReason:e=>{He(r,"Describe reason",s,n,e)},onText:e=>{u+=e,He(r,"Describe text",s,n,e),l?.(u)},onSpeed:e=>{He(r,"Describe speed",s,n,e),c?.(e)}});return He(r,"Describe generate reply",s,n,Date.now()-d,o?.length??0,o),o}catch(e){throw He(r,"Describe generate failed",s,n,e),o(n,{requesting:!1,phase:i.load,percent:100,error:`${e?.message||`${e}`}`}),e}}}},nt=async({translator:t,generate:r,descriptions:n,language:o,logging:a,currentIndex:i,onSpeed:s,onText:c})=>{const l=[...n];for(let u=0;u<n.length;u++){const d=(n[u]||"").trim();if(!d){i?.(u,d,d);continue}let g="";try{g=(await r({model:t.id,messages:[{role:e.system,content:Ke},{role:e.user,content:"[image] describe this image in English very accurately"},{role:e.assistant,content:d},{role:e.user,content:tt(o)}],stage:"translate",onSpeed:e=>s?.(u,e),onText:e=>c?.(u,e,"translate")})||"").trim()}catch(e){He(a,"Translate item failed",u,e)}const m=g.replace(/[^a-z]/gi,"").toUpperCase().includes(Xe.replace(/[^a-z]/gi,""));g&&!m&&(l[u]=g),i?.(u,d,l[u])}return l},ot=(t=>async r=>{const{images:n,currentIndex:o}=r,a=[],c=!0===r.logging;if(He(c,"Describe start",n.length,r.targetLanguage),!n.length)return He(c,"Describe empty"),a;const l=p(s.qwen3_vl_2b_instruct_q3),u=s.qwen3_vl_2b_instruct_q3,d=P({maxReplyTokens:400,...r.limits}),{report:g,load:m,generate:h}=rt({service:t,limits:d,logging:c,onStatus:r.onStatus});if(He(c,"Describe model",u,l?"found":"missing",d.maxReplyTokens,d.maxImages),g(u,{requesting:!1,phase:t.ready()?i.load:i.download,percent:t.ready()?100:0}),!l)throw He(c,"Describe model missing",u),g(u,{requesting:!1,phase:i.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const y=await m(l);if(y)throw He(c,"Describe stop",y),new Error(y);g(l.id,{requesting:!0,phase:i.load,percent:100});for(let t=0;t<n.length;t++){const i=Date.now(),s=n[t];He(c,"Describe image start",t,n.length,s.startsWith("data:")?"data URL":s,s.length),o?.(t);let u="";try{u=(await h({model:l.id,messages:[{role:e.system,content:Je},{role:e.user,content:Ze,images:[s]}],stage:"describe",onSpeed:e=>r.onSpeed?.(t,e),onText:e=>r.onText?.(t,e,"describe")})||"").trim()}catch(e){He(c,"Describe image failed",t,e)}const d=Date.now()-i;He(c,"Describe english",t,d,u),u?(a.push({descriptionEN:u,description:u,durationMs:d}),o?.(t,u,void 0,d)):(He(c,"Describe empty",t),a.push({descriptionEN:"",description:"",durationMs:d}),o?.(t,"",void 0,d))}const w=a.filter(e=>!!e.descriptionEN).length;if(He(c,"Describe english ready",w),!w)return g(l.id,{requesting:!1,phase:i.load,percent:100,error:"No description"}),a;const b=r.targetLanguage.trim(),v=et(b)&&await f()?p(s.gemma4_e2b_limited):void 0,x=v?await m(v):void 0;if(v&&!x)g(v.id,{requesting:!0,phase:i.load,percent:100}),await nt({translator:v,generate:h,descriptions:a.map(e=>e.descriptionEN),language:b,logging:c,currentIndex:(e,t,r)=>{const n=a[e];r&&(n.description=r),o?.(e,t,n.description,n.durationMs)},onText:r.onText}),g(v.id,{requesting:!1,phase:i.load,percent:100});else{for(let e=0;e<a.length;e++){const t=a[e];t.descriptionEN&&o?.(e,t.descriptionEN,t.description,t.durationMs)}g(v?.id??l.id,{requesting:!1,phase:t.ready()?i.load:i.download,percent:t.ready()?100:0,...x?{error:x}:{}})}return a})(Be),at=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(He(o,"Translate start",r.length,n),!r.length||!et(n))return He(o,"Translate skipped"),r;const a=P({maxReplyTokens:400,...t.limits}),{report:c,load:l,generate:u}=rt({service:e,limits:a,logging:o,onStatus:t.onStatus}),d=await f()?p(s.gemma4_e2b_limited):void 0;if(!d)return He(o,"Translate no gpu"),r;const g=await l(d);if(g)return He(o,"Translate stop",g),r;c(d.id,{requesting:!0,phase:i.load,percent:100});const m=await nt({translator:d,generate:u,descriptions:r,language:n,logging:o,currentIndex:t.currentIndex,onSpeed:t.onSpeed,onText:t.onText});return c(d.id,{requesting:!1,phase:i.load,percent:100}),m})(Be),it=/^[0-9+\-*/%^().]+$/,st=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},ct={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(!it.test(t))throw new Error("Unsupported character");const r=st(t);return{expression:t,result:Math.abs(r)>=1e5?(0,_.pNum)(r)??r:(0,_.rNum)(r,12)}})(t)}},lt="degreesign-chat-prices-v1",ut="EUR",dt=5*_.oneMin,gt=30*_.oneSec;let mt,pt={},ft=0,ht=!1,yt=!1;const wt=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},bt=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,vt=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=wt(e.rates?.current),n=wt(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&&(pt.fiat=bt(pt.fiat,a)),i&&(pt.crypto=bt(pt.crypto,i)),ft=0,ht=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(lt,JSON.stringify(pt))}catch{}})()}catch(e){throw ft=Date.now(),ht=!0,e}},xt=e=>!!pt.crypto&&(e in pt.crypto.prices||e in pt.crypto.yesterday),jt=e=>!!pt.fiat&&(e in pt.fiat.rates||e in pt.fiat.yesterday),Mt=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==ut)continue;const e=xt(r)||jt(r);!xt(r)&&e||(t.crypto=!0),xt(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(pt.fiat?.fetchedAt??0)>=_.oneHr,o=t.crypto&&r-(pt.crypto?.fetchedAt??0)>=dt;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||ft&&r-ft<gt||(mt||(mt=vt({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{mt=void 0})),await mt))},kt=e=>{if(e==ut)return 1;const t=pt.crypto?.yesterday[e],r=pt.fiat?.yesterday[e];return t||(r?1/r:void 0)},_t=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},Tt=e=>Math.abs(e)>=1e5?(0,_.pNum)(e)??e:(0,_.rNum)(e,8),St=async e=>{(()=>{if(!yt){yt=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(lt);if(!e)return;const t=JSON.parse(e);pt={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=_t(e.from,"from"),r=void 0===e.to||null===e.to?ut:_t(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 Mt([t,r]);const o=e=>{const t=(e=>{if(e==ut)return 1;const t=pt.crypto?.prices[e],r=pt.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!pt.fiat&&!pt.crypto)throw new Error("Prices unavailable offline");if(xt(e)||jt(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=kt(t),c=kt(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!=ut&&(xt(r)?pt.crypto&&t.push(pt.crypto.sourceAt):jt(r)&&pt.fiat&&t.push(pt.fiat.sourceAt));return t})([t,r]),p=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:Tt(l),...void 0===u?{}:{previousRate:Tt(u),change:Tt(d??0),changePercent:(0,_.rNum)(g??0,4)},result:Tt(n*l),updatedAt:new Date(p).toISOString(),stale:ht&&!(!pt.fiat&&!pt.crypto)}},Pt={name:"currency",description:"Get the EUR price of a fiat currency, crypto coin or metal, or convert an amount. Returns the 24-hour change.",parameters:{type:"object",properties:{from:{type:"string",description:"Currency, coin or metal to convert from"},to:{type:"string",description:"Currency, coin or metal to convert to, EUR by default"},amount:{type:"number",description:"Amount to convert, 1 by default"}},required:["from"]},execute:e=>St(e)},Ot={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},Ct=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,Dt=(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 Ot[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),Nt=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,Et=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)}},At=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==l.duckduckgo?l.duckduckgo:l.wikipedia,language:Nt.test(t)?t:"en",limit:Math.round(Ct(e.limit,1,20,3)),snippetLength:Math.round(Ct(e.snippetLength,1,4e3,400)),timeout:Ct(e.timeout,1e3,3e4,8e3)}})(e);return{name:"websearch",description:t.provider==l.duckduckgo?"Search DuckDuckGo for an instant answer and related topics.":"Search Wikipedia and return a few matching articles.",parameters:{type:"object",properties:{query:{type:"string",description:"What to search for"}},required:["query"]},execute:async e=>{const r="string"==typeof e.query?e.query.trim():"";if(!r)throw new Error("Missing query");const n=t.provider==l.duckduckgo?await(async(e,t)=>{const r=`https://api.duckduckgo.com/?format=json&no_html=1&skip_disambig=1&q=${encodeURIComponent(t)}`,n=await Et(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:Dt(r||n,200),url:t,snippet:Dt(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 Et(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:Dt(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:Dt(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},Lt=(e,t)=>{const r=[];for(const n of e)n==c.websearch?r.push(At(t)):n==c.calculate?r.push(ct):n==c.currency&&r.push(Pt);return r}})(),module.exports=n})();
@@ -1,2 +1,2 @@
1
1
  /*! For license information please see chat.node.min.mjs.LICENSE.txt */
2
- import{dirname as e,join as t}from"node:path";import{fileURLToPath as r}from"node:url";var n={69(e,t){(()=>{var e={125:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addZ=t.tN=t.monNm=t.tmUTC=t.tmAP=t.moYrDt=t.shortDt=t.fullLong=t.fullDate=t.fullDt=t.invDt=t.dayRes=t.timeStandard=t.dateStandard=t.seoDt=t.thisYear=t.oneMon=t.oneMin=t.oneHr=t.oneDay=t.oneSec=void 0;const r=()=>Date.now(),n=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],a=["st","nd","rd","th"],i=e=>0==+e?"00":+e<10&&+e>=1?`0${e}`:`${e}`,s=e=>{const t=new Date(e);return`${t.getUTCFullYear()}-${i(t.getUTCMonth()+1)}-${i(t.getUTCDate())}`},c=e=>i(e.getUTCHours())+`:${i(e.getUTCMinutes())}`+`:${i(e.getUTCSeconds())}`;t.tN=r,t.monNm=n,t.dayRes=90,t.oneSec=1e3,t.oneMin=6e4,t.oneHr=36e5,t.oneDay=864e5,t.oneMon=27e8,t.addZ=i,t.tmUTC=e=>{const t=new Date(e);return i(t.getUTCHours())+`:${i(t.getUTCMinutes())} UTC`},t.tmAP=e=>{const t=new Date(e),r=t.getHours();return i(r>12?r-12:r)+`:${i(t.getMinutes())}`+(r>=12?"pm":"am")},t.shortDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]}`},t.moYrDt=e=>{const t=new Date(e);return`${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDate=e=>{const t=new Date(e);return`${t.getDate()} ${n[t.getMonth()]} ${t.getFullYear()}`},t.fullLong=e=>`${(e=>{const t=new Date(e),r=t.getDate();return r+a[r<5?r-1:r>4&&r<21?3:r>20&&r<25?r-21:r>24&&r<31?3:0]+` of ${n[t.getMonth()]}`})(e)} ${new Date(e).getFullYear()}`,t.thisYear=e=>(e?new Date(e):new Date)?.getUTCFullYear(),t.dateStandard=s,t.timeStandard=c,t.seoDt=e=>{!e&&(e=r());const t=new Date(e);return`${s(t)}T${c(t)}Z`},t.invDt=e=>{const t=new Date(e);return`${t.getUTCFullYear()}`.split("20")[1]+i(t.getUTCMonth()+1)+i(t.getUTCDate())+`${e}`.slice(10)}},240:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.idRandLong=t.idRandShort=t.idShuffle=void 0;const r=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","@",".","_","0","1","2","3","4","5","6","7","8","9"];t.idShuffle=async({data:e,password:t})=>4==t?.length?(({data:e,password:t})=>{try{const n=(e,t)=>r.includes(e.toLowerCase())?r[(r.indexOf(e.toLowerCase())+Math.pow(t,3))%r.length]:e;return[...e].map(e=>n(e,Number(t))).join("")}catch{return""}})({data:e,password:t}):await(async({data:e,password:t})=>{if(!e||!t)return"";try{crypto.subtle;const r=new TextEncoder,n=r.encode(e),o=r.encode(t),a=await crypto.subtle.digest("SHA-256",o),i=new Uint8Array(a),s=i.slice(0,32),c=i.slice(0,12),l=await crypto.subtle.importKey("raw",s,{name:"AES-GCM"},!1,["encrypt"]),u=await crypto.subtle.encrypt({name:"AES-GCM",iv:c},l,n);return btoa(String.fromCharCode(...new Uint8Array(u))).replace(/\+/g,"a").replace(/\//g,"b").replace(/=/g,"c").toLowerCase()}catch{return""}})({data:e,password:t}),t.idRandShort=(e=10)=>{try{return crypto.randomUUID()?.replaceAll("-","")?.slice(0,e)}catch(e){return console.log("idRandShort failed",e),""}},t.idRandLong=(e=10)=>{try{const t="abcdefghijklmnopqrstuvwxyz",r=new Uint8Array(e);return crypto.getRandomValues(r),Array.from(r).map(e=>t[e%26]).join("")}catch(e){return console.log("idRandLong failed",e),""}}},246:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.cacheCheck=t.delayCode=void 0;const n=r(125);t.delayCode=async(e=0)=>await new Promise(t=>setTimeout(t,e)),t.cacheCheck=({analysisCacheLimit:e,lastUpdated:t,forceRefresh:r})=>{const o=Date.now();if(t&&(!r&&t>o-e||r&&t>o-n.oneDay))return!0}},792:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isEven=t.pNum=t.sharpeRatio=t.priceVariations=t.nTxtAr=t.zNum=t.addCom=t.adjNum=t.rNum=void 0;const r=[1,.1,.01,.001,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10,1e-11,1e-12,1e-13,1e-14,1e-15,1e-16,1e-17,1e-18,1e-19],n=(e,t=6)=>{const n=+e,o=n?Math.abs(n):0,a=o>1&&t?t-`${Math.round(o)}`.length:0;return n?(n<0?-1:1)*(Number.isInteger(o)||o<1e-16?o:o>1e5?Math.round(o):o>1?Number(o.toFixed(a<0?0:a)):((e,t)=>{let n=0;for(const o of r){if(o<e)return Number(e.toFixed(t+n-1));n++}return e})(o,t)):e},o=(e,t)=>{const r=(n(e,t)+"").split(".");return r[0]=r[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),r.join(".")},a=(e,t=3)=>{const r=Number(e);if(!e||!r)return e+"";const a=Math.abs(r);return(r<0?"-":"")+(a>1e9?o(a/1e9,t)+"b":a>1e6?o(a/1e6,t)+"m":a<1e-6&&a>1e-16?(1+n(a,t)+"").replace(/1./g,"0."):o(a,t))};t.nTxtAr=["zero","one","two","three","four","five","six","seven","eight","nine","ten"],t.rNum=n,t.addCom=o,t.adjNum=a,t.zNum=e=>{const t=Number(e);let r=t?Math.abs(t):0,n=1e10;for(;n>1;)r>n&&(r=Math.round(r/(n/10))*(n/10)),n/=10;return t?(t<0?"-":"")+a(r,2):e},t.pNum=e=>+e||0==+e?Math.round(1e6*+e)/1e6:null,t.priceVariations=e=>{try{let t=0;const r=[...e].sort((e,t)=>e[0]-t[0]),n=e.reduce((e,[,t])=>e+t,0),o=r.find(([,e])=>(t+=e,t>=n/2))[0];return e.filter(([e])=>Math.abs(e-o)/o<.05).map(([e])=>e)}catch{return[]}},t.sharpeRatio=({assetPrices:e,minExpectedReturn:t=.05})=>{if(!e?.length||e?.length<2)return 0;const r=e.slice(1).map((t,r)=>(t-e[r])/e[r]),n=r.reduce((e,t)=>e+t,0)/r.length,o=Math.sqrt(r.reduce((e,t)=>e+Math.pow(t-n,2),0)/r.length);return(n-t)/o},t.isEven=e=>e%2==0},794:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restoreObj=t.restoreObjStr=t.storeObj=t.storeObjStr=t.objNestValueCount=t.objLen=t.objSortSimple=t.objSort=void 0;const n=r(125),o=e=>{try{return Object.keys(e||{})?.length||0}catch(e){return console.log(e),0}},a=e=>{try{return e?.replace(/"/g,"'")}catch(e){return console.log((0,n.tN)(),"storeObjStr failed",e),""}},i=e=>{try{return e?.toString()?.replace(/'/g,'"')}catch(e){console.log((0,n.tN)(),"restoreObjStr failed",e)}};t.objLen=o,t.objNestValueCount=e=>{let t=0;if(o(e))for(const r in e)t+=o(e[r])?1:0;return t},t.objSort=(e={},t,r=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,n])=>null===e[t]||void 0===e[t]?1:null===n[t]||void 0===n[t]?-1:e[t]>n[t]?1*r:-1*r)),t.objSortSimple=(e={},t=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,r])=>null==e?1:null==r?-1:e>r?1*t:-1*t)),t.storeObjStr=a,t.storeObj=e=>{try{return a(JSON.stringify(e))}catch(e){return console.log((0,n.tN)(),"storeObj failed",e),""}},t.restoreObjStr=i,t.restoreObj=e=>{try{if(!e)return;const t=i(e);return t?JSON.parse(t):void 0}catch(e){console.log((0,n.tN)(),"restoreObj failed",e)}}},830:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.phaseDifference=t.compareArrays=t.squeezeArray=t.forecastNextTotal=t.forecastNext=t.getMax=t.getMean=t.getSum=t.maxVl=t.minVl=t.sumArr=void 0;const r=e=>{try{return e?.length?e.reduce((e,t)=>e+t):0}catch(e){return console.log("sumArr failed",e),0}},n=e=>{try{return e?.length?e.reduce((e,t)=>e+t,0):0}catch(e){return console.log("getSum failed",e),0}},o=e=>{try{return e?.length?n(e)/e.length:0}catch(e){return console.log("getMean failed",e),0}},a=e=>{try{return e?.length?Math.max(...e):0}catch(e){return console.log("getMax failed",e),0}},i=e=>{try{if(!e?.length)return 0;const t=[...e].sort((e,t)=>e-t),r=Math.floor(t.length/2);return t.length%2?t[r]:(t[r-1]+t[r])/2}catch(e){return console.log("median failed",e),0}},s=({currentPeriod:e,steps:t=1})=>{try{const r=(Array.isArray(e)?e:[]).filter(Number.isFinite);if(!r.length||t<=0)return[];if(r.length<2){const e=Math.max(0,o(r));return Array.from({length:t},()=>e)}const n=r.length,{slope:s,intercept:c}=(e=>{try{const t=e.length,r=[];for(let n=0;n<t-1;n++)for(let o=n+1;o<t;o++)r.push((e[o]-e[n])/(o-n));const n=i(r);return{slope:n,intercept:i(e.map((e,t)=>e-n*t))}}catch(e){return console.log("theilSen failed",e),{slope:0,intercept:0}}})(r),l=c+s*(n-1),u=a(r),d=u>0?3*u:1/0;return Array.from({length:t},(e,t)=>{const r=t+1,o=l+s*n*Math.log1p(r/n);return Math.max(0,Math.min(o,d))})}catch(e){return console.log("forecastNext failed",e),[]}};t.sumArr=r,t.maxVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]>r&&(r=o[t])}return r},t.minVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]<r&&(r=o[t])}return r},t.getSum=n,t.getMean=o,t.getMax=a,t.forecastNext=s,t.forecastNextTotal=e=>{try{const t=s({currentPeriod:e,steps:e?.length});return n(t)}catch(e){return console.log("forecastNextTotal failed",e),0}},t.squeezeArray=({arr:e,targetLength:t})=>{try{if(!e||0===e.length||t<=0)throw new Error("Invalid input");const n=Math.ceil(e.length/t);return Array.from({length:t},(t,o)=>{const a=o*n,i=Math.min(a+n,e.length),s=e.slice(a,i);return r(s)}).slice(0,t)}catch(e){return console.log("squeezeArray failed",e),[]}},t.compareArrays=({arrays:e})=>{try{const t=[...e],n=Math.min(...t.map(e=>e.length));for(let e=0;e<t.length;e++)t.splice(n);const o=t.map(e=>r(e)),a=[],i=Math.min(...o),s=o.indexOf(i),c=i/Math.max(...o);for(let e=0;e<t.length;e++){const r=t[e];if(a[e]=[],e==s)a[e]=r;else for(let t=0;t<r.length;t++)a[e].push(c*r[t])}return a}catch(t){return console.log("compareArrays failed",t),e}},t.phaseDifference=({array1:e,array2:t})=>{try{let r=e.length,n=e.reduce((e,t)=>e+t)/r,o=t.reduce((e,t)=>e+t)/r,a=e.map(e=>e-n),i=t.map(e=>e-o),s=Math.floor(r/2),c=-1/0,l=0;for(let e=-s;e<=s;e++){let t=0,n=0,o=0,s=0;for(let c=0;c<r;c++){let l=c+e;l>=0&&l<r&&(t+=a[c]*i[l],n+=a[c]*a[c],o+=i[l]*i[l],s++)}if(n>0&&o>0&&s>=.8*r){let r=t/Math.sqrt(n*o);r>c&&(c=r,l=e)}}return l}catch(e){return console.log("phaseDifference failed",e),0}}}},r={};function n(t){var o=r[t];if(void 0!==o)return o.exports;var a=r[t]={exports:{}};return e[t](a,a.exports,n),a.exports}var o={};(()=>{var e=o;Object.defineProperty(e,"__esModule",{value:!0}),e.idShuffle=e.isEven=e.pNum=e.nTxtAr=e.zNum=e.addCom=e.adjNum=e.rNum=e.sharpeRatio=e.priceVariations=e.timeStandard=e.dateStandard=e.addZ=e.tN=e.monNm=e.tmUTC=e.tmAP=e.moYrDt=e.shortDt=e.fullLong=e.fullDate=e.fullDt=e.invDt=e.dayRes=e.thisYear=e.seoDt=e.oneMon=e.oneMin=e.oneHr=e.oneDay=e.oneSec=e.restoreObj=e.restoreObjStr=e.storeObj=e.storeObjStr=e.objSortSimple=e.objSort=e.objNestValueCount=e.objLen=e.phaseDifference=e.compareArrays=e.squeezeArray=e.forecastNextTotal=e.forecastNext=e.getMax=e.getMean=e.getSum=e.maxVl=e.minVl=e.sumArr=void 0,e.cacheCheck=e.delayCode=e.idRandLong=e.idRandShort=void 0;const t=n(246);Object.defineProperty(e,"cacheCheck",{enumerable:!0,get:function(){return t.cacheCheck}}),Object.defineProperty(e,"delayCode",{enumerable:!0,get:function(){return t.delayCode}});const r=n(830);Object.defineProperty(e,"sumArr",{enumerable:!0,get:function(){return r.sumArr}}),Object.defineProperty(e,"minVl",{enumerable:!0,get:function(){return r.minVl}}),Object.defineProperty(e,"maxVl",{enumerable:!0,get:function(){return r.maxVl}}),Object.defineProperty(e,"getMax",{enumerable:!0,get:function(){return r.getMax}}),Object.defineProperty(e,"getMean",{enumerable:!0,get:function(){return r.getMean}}),Object.defineProperty(e,"getSum",{enumerable:!0,get:function(){return r.getSum}}),Object.defineProperty(e,"forecastNext",{enumerable:!0,get:function(){return r.forecastNext}}),Object.defineProperty(e,"forecastNextTotal",{enumerable:!0,get:function(){return r.forecastNextTotal}}),Object.defineProperty(e,"squeezeArray",{enumerable:!0,get:function(){return r.squeezeArray}}),Object.defineProperty(e,"compareArrays",{enumerable:!0,get:function(){return r.compareArrays}}),Object.defineProperty(e,"phaseDifference",{enumerable:!0,get:function(){return r.phaseDifference}});const a=n(240);Object.defineProperty(e,"idRandLong",{enumerable:!0,get:function(){return a.idRandLong}}),Object.defineProperty(e,"idRandShort",{enumerable:!0,get:function(){return a.idRandShort}}),Object.defineProperty(e,"idShuffle",{enumerable:!0,get:function(){return a.idShuffle}});const i=n(792);Object.defineProperty(e,"addCom",{enumerable:!0,get:function(){return i.addCom}}),Object.defineProperty(e,"adjNum",{enumerable:!0,get:function(){return i.adjNum}}),Object.defineProperty(e,"priceVariations",{enumerable:!0,get:function(){return i.priceVariations}}),Object.defineProperty(e,"nTxtAr",{enumerable:!0,get:function(){return i.nTxtAr}}),Object.defineProperty(e,"rNum",{enumerable:!0,get:function(){return i.rNum}}),Object.defineProperty(e,"zNum",{enumerable:!0,get:function(){return i.zNum}}),Object.defineProperty(e,"sharpeRatio",{enumerable:!0,get:function(){return i.sharpeRatio}}),Object.defineProperty(e,"pNum",{enumerable:!0,get:function(){return i.pNum}}),Object.defineProperty(e,"isEven",{enumerable:!0,get:function(){return i.isEven}});const s=n(125);Object.defineProperty(e,"oneSec",{enumerable:!0,get:function(){return s.oneSec}}),Object.defineProperty(e,"oneDay",{enumerable:!0,get:function(){return s.oneDay}}),Object.defineProperty(e,"oneHr",{enumerable:!0,get:function(){return s.oneHr}}),Object.defineProperty(e,"oneMin",{enumerable:!0,get:function(){return s.oneMin}}),Object.defineProperty(e,"oneMon",{enumerable:!0,get:function(){return s.oneMon}}),Object.defineProperty(e,"seoDt",{enumerable:!0,get:function(){return s.seoDt}}),Object.defineProperty(e,"dayRes",{enumerable:!0,get:function(){return s.dayRes}}),Object.defineProperty(e,"invDt",{enumerable:!0,get:function(){return s.invDt}}),Object.defineProperty(e,"fullDt",{enumerable:!0,get:function(){return s.fullDt}}),Object.defineProperty(e,"fullDate",{enumerable:!0,get:function(){return s.fullDate}}),Object.defineProperty(e,"fullLong",{enumerable:!0,get:function(){return s.fullLong}}),Object.defineProperty(e,"shortDt",{enumerable:!0,get:function(){return s.shortDt}}),Object.defineProperty(e,"moYrDt",{enumerable:!0,get:function(){return s.moYrDt}}),Object.defineProperty(e,"tmAP",{enumerable:!0,get:function(){return s.tmAP}}),Object.defineProperty(e,"tmUTC",{enumerable:!0,get:function(){return s.tmUTC}}),Object.defineProperty(e,"monNm",{enumerable:!0,get:function(){return s.monNm}}),Object.defineProperty(e,"tN",{enumerable:!0,get:function(){return s.tN}}),Object.defineProperty(e,"addZ",{enumerable:!0,get:function(){return s.addZ}}),Object.defineProperty(e,"timeStandard",{enumerable:!0,get:function(){return s.timeStandard}}),Object.defineProperty(e,"dateStandard",{enumerable:!0,get:function(){return s.dateStandard}}),Object.defineProperty(e,"thisYear",{enumerable:!0,get:function(){return s.thisYear}});const c=n(794);Object.defineProperty(e,"objSort",{enumerable:!0,get:function(){return c.objSort}}),Object.defineProperty(e,"objLen",{enumerable:!0,get:function(){return c.objLen}}),Object.defineProperty(e,"objNestValueCount",{enumerable:!0,get:function(){return c.objNestValueCount}}),Object.defineProperty(e,"restoreObj",{enumerable:!0,get:function(){return c.restoreObj}}),Object.defineProperty(e,"restoreObjStr",{enumerable:!0,get:function(){return c.restoreObjStr}}),Object.defineProperty(e,"storeObj",{enumerable:!0,get:function(){return c.storeObj}}),Object.defineProperty(e,"storeObjStr",{enumerable:!0,get:function(){return c.storeObjStr}}),Object.defineProperty(e,"objSortSimple",{enumerable:!0,get:function(){return c.objSortSimple}})})();var a=t;for(var i in o)a[i]=o[i];o.__esModule&&Object.defineProperty(a,"__esModule",{value:!0})})()}};const o={};function a(e){const t=o[e];if(void 0!==t)return t.exports;const r=o[e]={exports:{}};return n[e](r,r.exports,a),r.exports}var i,s,c,l,u,d,g,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,j=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio,M=()=>{return n=t(e(r("file:///media/x/store/code/DegreeSign/ds_chat/src/assets/nodeEsm.js")),"../assets/wllama"),{wasm:t(n,"wllama.wasm"),compatWasm:t(n,"compat/wllama.wasm"),compatWorker:t(n,"compat/wllama.js")};var n},_=()=>{return n=t(e(r("file:///media/x/store/code/DegreeSign/ds_chat/src/assets/nodeEsm.js")),"../assets/litert"),{script:t(n,"litertlm_wasm_internal.js"),wasm:t(n,"litertlm_wasm_internal.wasm")};var n},k={width:384,height:384},S=async e=>{if(!e.startsWith("data:"))return await(await fetch(e)).arrayBuffer();const t=e.indexOf(","),r=t>=0?e.slice(0,t):"";if(t<0)throw new Error("Invalid image data");if(!r.includes(";base64"))return await(await fetch(e)).arrayBuffer();const n=atob(e.slice(t+1)),o=new Uint8Array(n.length);for(let e=0;e<n.length;e++)o[e]=n.charCodeAt(e);return o.buffer},T=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<=64;e++){const t=Math.ceil(64/e),s=Math.floor(72/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:6},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)}},E=(e,t)=>({stream:!0,temperature:.7,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),N=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,A=e=>Number(e.headers.get("content-length"))||0,L=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),$=e=>L(e,"image"),R=e=>L(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)}},G=e=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}},H=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()){G(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?.(),G(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},Y=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 T(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?k: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 H({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:A(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="litertlm-models",pe=ge("litert-store"),fe={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 he=!1;const ye=(...e)=>{he&&console.log(...e)},we=(...e)=>{he&&console.error(...e)},be=e=>{try{e.getGlobalLiteRtLm().liteRtLmWasm.preinitializedWebGPUDevice=void 0}catch{}},ve=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(me)}catch{return}},xe=new Map,je=(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)}}))},Me=async(e,t=!0)=>{const r=[];for(const n of e){if("string"==typeof n.content){r.push({role:n.role,content:n.content});continue}const e=[];for(const r of n.content)"text"!=r.type?t?e.push({type:r.type,data:await S(r.url)}):e.push({type:"text",text:`[${r.type}]`}):e.push({type:"text",text:r.text});r.push({role:n.role,content:e})}return r},_e=(e,t)=>{if(e.role!=t.role)return!1;if("string"==typeof e.content||"string"==typeof t.content)return e.content==t.content;if(e.content.length!=t.content.length)return!1;for(let r=0;r<e.content.length;r++){const n=e.content[r],o=t.content[r];if(n.type!=o.type)return!1;if("text"==n.type&&"text"==o.type){if(n.text!=o.text)return!1}else if(("image"==n.type&&"image"==o.type||"audio"==n.type&&"audio"==o.type)&&n.url!=o.url)return!1}return!0},ke=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=E(r.limits,r.reasoning);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await Me([a]))[0];if(!c)throw new Error("Empty prompt");const l=!!o.conversation&&o.reasoning==r.reasoning&&o.maxTokens==i.max_tokens&&((e,t)=>{const r="system"==e[0]?.role?e[0]:void 0,n="system"==t[0]?.role?t[0]:void 0;if(!r!=!n)return!1;if(r&&n&&!_e(r,n))return!1;const o=r?e.slice(1):e,a=n?t.slice(1):t;if(!a.length||a.length>o.length)return!1;const i=o.length-a.length;for(let e=0;e<a.length;e++)if(!_e(o[i+e],a[e]))return!1;return!0})(o.sent,s);let u;if(l&&o.conversation)u=o.conversation;else{const n=await Me(s,!1);o.conversation=void 0,o.sent=[],u=await e.createConversation({sessionConfig:{maxOutputTokens:i.max_tokens,samplerParams:{type:t.SamplerType.TOP_K,temperature:i.temperature,k:40,p:.95}},preface:{...n.length?{messages:n}:{},extra_context:{enable_thinking:r.reasoning}},prefillPrefaceOnInit:n.length>0}),o.conversation=u,o.reasoning=r.reasoning,o.maxTokens=i.max_tokens,o.sent=[...s]}o.sent.push(a);let d,g=!1,m="";const p=()=>{d&&d.cancel().catch(()=>{});try{u.cancel()}catch{}};r.signal?.addEventListener("abort",p,{once:!0});try{if(r.signal?.aborted)return;const e=u.sendMessageStreaming(c).getReader();for(d=e;;){const{done:t,value:r}=await e.read();if(t)break;const n={};let o="string"==typeof r.content?r.content:"";if(Array.isArray(r.content))for(const e of r.content)"text"==e.type&&(o+=e.text);o&&(n.content=o,m+=o);const a=r.channels?.thought;a&&(n.reasoning=a),(n.content||n.reasoning)&&(yield{choices:[{delta:n}]})}g=!0}finally{r.signal?.removeEventListener("abort",p),g&&m?o.sent.push({role:"assistant",content:m}):(o.conversation=void 0,o.sent=[])}},Se={backend:l.gpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o})=>{he=!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:ye,printErr:we};try{await s.getOrLoadGlobalLiteRtLm(_().script)}finally{c.Module=d}if(n?.aborted)throw new Error("Cancelled");const g=N(i.repo,i.file),m=await ve();let p;const f=m?await m.match(g):void 0;if(f?.body)p=f.body;else{const e=await pe.stored(g);e?.complete&&(p=e.file.stream())}if(!p){const e=await pe.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=xe.get(e);if(o)return await o;const a=(async()=>{const o=await fetch(e,{signal:r});if(!o.ok||!o.body)throw new Error("Model download failed");const a=A(o),i=je(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{xe.delete(e)});return xe.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 je(n.body,A(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:fe},...o?.vision?{visionBackend:n.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...o?.audio?{audioBackend:n.Backend.CPU}:{}}})({model:e,limits:t,source:p,mod:s}));if(n?.aborted)throw await h.delete(),be(s),new Error("Cancelled");const y={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})=>{he=!0===n.logging;const a=()=>{try{o.conversation?.cancel()}catch{}o.conversation=void 0,o.sent=[]};try{return await Y({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async a=>{if(n.signal?.aborted)throw new Error("Cancelled");if($(a)&&!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 ke({engine:e,mod:r,params:n,messages:a,session:o})}})}catch(e){throw a(),e}})({engine:h,model:e,mod:s,params:t,session:y}),unload:async()=>{const e=y.conversation;y.conversation=void 0,y.sent=[];try{await(e?.delete())}catch{}await h.delete(),be(s)}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=N(t.repo,t.file),[n,o]=await Promise.all([ve(),pe.stored(r)]);if(o?.complete)return!0;try{return!(!n||!await n.match(r))}catch{return!1}},purge:async()=>{try{await pe.purge(),"undefined"!=typeof caches&&await caches.delete(me)}catch{}}},Te=ge("wllama-store"),Pe=[d.qwen3_vl_2b_instruct,d.qwen3_vl_2b_instruct_q3],Oe=e=>e.cpu?.mmproj&&Pe.includes(e.id)?{image_min_tokens:16,image_max_tokens:100}:{};let De,Ce,Ee="",Ne=!1;const Ae=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Le=e=>{const t=M();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},$e=e=>{const t=e=>(...t)=>{Ne&&("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)}},Re=async()=>{if(De)return De;const e=await a.e(924).then(()=>a(577)),t=Ce||Le(),r=new e.Wllama({default:t.wasm},{logger:$e(e.LoggerWithoutDebug)});return Ce||(Ce=t,Ee=Ae(t)),r.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),De=r,r},qe=async()=>{const e=De;De=void 0;try{await(e?.exit())}catch{}},Ue=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),Ie=e=>{const t=e.cpu;return t?[{name:t.file,url:N(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:N(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},ze=async e=>{const t=Ie(e);if(!t.length)return!1;for(const e of t){const t=await Te.stored(e.url);if(!t?.complete)return!1}return!0},Fe=async(e,t)=>{const r=await e.cacheManager.list();return Ie(t).every(e=>r.some(t=>Ue(t,e.name)))},Ve=async({model:e,signal:t,onProgress:r})=>{const n=Ie(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await Te.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},Be=async e=>{const t=[];for(const r of e){if("string"==typeof r.content){"system"==r.role?t.push({role:"system",content:r.content}):"assistant"==r.role?t.push({role:"assistant",content:r.content}):t.push({role:"user",content:r.content});continue}const e=[];for(const t of r.content)"text"==t.type?e.push({type:"text",text:t.text}):e.push({type:t.type,data:await S(t.url)});t.push({role:"user",content:e})}return t},We={backend:l.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:a})=>{Ne=!0===o;const i=h()?4096:8192,s=e.cpu;if(!s)throw new Error("Model has no CPU artifact");const c=Le(a),d=Ae(c);De&&d!=Ee&&await qe(),Ce=c,Ee=d;const g=((e,t,r=!1)=>Math.max(1,Math.min(Math.max(2,Math.min(8,(e||4)-1)),t,r?2:3)))("undefined"!=typeof navigator&&navigator.hardwareConcurrency||4,t.maxThreads,!!s.mmproj),m=await Re(),p=await ze(e),f=s.mmproj?.file,y=N(s.repo,s.file),w=f?N(s.mmproj?.repo??s.repo,f):"";if(n?.aborted)throw await qe(),new Error("Cancelled");if(!p&&f){const e=await m.cacheManager.list(),t=e.some(e=>Ue(e,s.file)),r=e.some(e=>Ue(e,f));t&&!r&&await m.cacheManager.deleteMany(e=>Ue(e,s.file))}const b={n_ctx:i,n_threads:g,reasoning_budget_tokens:t.maxThinkingTokens,n_gpu_layers:0,jinja:!0,...Oe(e)};try{let t=p?await Ve({model:e,signal:n,onProgress:r}):void 0;t||p||await Fe(m,e).catch(()=>!1)||(t=await Ve({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 m.loadModel(t,b)):await m.loadModelFromUrl(w?{url:y,mmprojUrl:w}:y,{...b,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 qe(),e}if(n?.aborted)throw await qe(),new Error("Cancelled");if(!m.getLoadedContextInfo().n_ctx)throw await qe(),new Error("Failed to create model context");return{model:e,backend:l.cpu,contextSize:i,chat:t=>(async(e,t,r)=>{if(Ne=!0===r.logging,e.isModelLoaded())return await Y({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 Be(n),...E(r.limits,r.reasoning),abortSignal:r.signal,...t.reasoning?{chat_template_kwargs:{enable_thinking:r.reasoning}}:{}})}})})(m,e,t),unload:async()=>{if(De==m)await qe();else try{await m.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await ze(e)||await Fe(await Re(),e))}catch{return!1}},purge:async()=>{try{await Te.purge()}catch{}try{const e=await Re();await e.cacheManager.clear()}catch{}}},Qe=((e={})=>{const t=e.engines?.cpu||We,r=e.engines?.litert||Se;let n,o,a,i,s,d,g,m=l.none,p=c.idle,f=[],h=0,y={percent:0,phase:u.download};const w=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},b=async()=>{const e=n;n=void 0,o=void 0,await(e?.unload())},v=(e,t)=>{y={percent:Math.max(0,Math.min(1,e)),phase:t||u.download};for(const e of[...f])e.report(y.percent,y.phase)},x=e=>{p=e},j=()=>{h++,s?.abort(),s=void 0,i=void 0,p==c.downloading&&x(c.idle)},M=(e,t)=>{const r=a;return r?new Promise(n=>{let o=!1;const i={report:e,settle:e=>{o||(o=!0,t?.removeEventListener("abort",s),n(e))}},s=()=>{(e=>{f=f.filter(t=>t!=e),queueMicrotask(()=>{!f.length&&a&&j()})})(i),i.settle(!1)};f.push(i),t?.aborted?s():t?.addEventListener("abort",s,{once:!0}),r.then(i.settle,()=>i.settle(!1))}):Promise.resolve(!1)},_=()=>p==c.ready&&!!n&&!!o,k=async()=>{j(),x(c.idle),await b()};return{load:async({model:e,limits:t,assets:r,logging:l,signal:g,onProgress:p})=>{if(g?.aborted)return!1;if(_()&&o?.id==e.id)return!0;if(a&&i==e.id)return p(y.percent,y.phase),await M(p,g);a&&(j(),f=[],await a.catch(()=>!1));const k=++h,S=(async()=>{await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})();const a=w(e);if(k!=h)return!1;if(!a)return d="Model is not supported on this device",x(c.unsupported),!1;if(await b(),k!=h)return!1;const i=await a.cached(e);if(k!=h)return!1;d=void 0,x(c.downloading),v(0,u.download),i&&v(1,u.load);const g=new AbortController;s=g;try{const i=await a.startLLM({model:e,limits:t,logging:l,signal:g.signal,assets:r,onProgress:(e,t)=>{k==h&&v(e,t)}});return k!=h||g.signal.aborted?(await i.unload(),!1):(n=i,o=e,m=a.backend,d=void 0,x(c.ready),v(1,u.load),!0)}catch(e){return k!=h||(n=void 0,o=void 0,d=`${e?.message||`${e}`}`,l&&console.log("Local model failed",e),x(c.error)),!1}finally{s==g&&(s=void 0)}})().finally(()=>{a==S&&(a=void 0,i=void 0,f=[])});return a=S,i=e.id,await M(p,g)},chat:async e=>{if(!_()||!n)return;for(;g;)await g.catch(()=>{});if(!_()||!n)return;const t=n.chat(e);g=t;try{return await t}finally{g==t&&(g=void 0)}},unload:k,clear:async()=>{const e=a;await k(),await(e?.catch(()=>{})),await Promise.all([t.purge(),r.purge()])},ready:_,loading:()=>!_()&&p==c.downloading,status:()=>p,backend:()=>m,error:()=>d,model:()=>o}})(),Ge=(e,t,r)=>{const n=e.status(),o=y(t),a=w(o);return{...o?{model:o}:{},availability:n==c.ready?s.online:n==c.error||n==c.unsupported?s.offline:s.away,status:n,backend:e.backend(),supportsImages:!!a&&x(a),supportsAudio:!!a&&j(a),ready:e.ready(),loading:e.loading(),requesting:r.requesting,phase:r.phase,percent:r.percent,...r.error?{error:r.error}:{}}},He=(e=>{let t,r=0;const n=t=>t.input.onStatus?.(Ge(e,t.model??t.input.model,t));return o=>{t?.controller.abort();const a={token:++r,input:o,controller:new AbortController,percent:e.ready()?100:0,phase:e.ready()?u.load:u.download,requesting:!1,cancelled:!1};return t=a,n(a),(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=j(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()||"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="",M="";try{w=await e.chat({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||(M+=e,o.onResponse?.(M))},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))})(a),()=>(t=>{t.token==r&&(t.cancelled=!0,t.controller.abort(),e.status()!=c.ready?queueMicrotask(()=>n(t)):e.unload().then(()=>n(t)))})(a)}})(Qe),Ye=(Je=Qe,async(e={})=>{const t=await v(e.model),r=r=>e.onStatus?.(Ge(Je,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=Je.ready()&&Je.model()?.id==t.id;return await Je.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||Je.error()||"Model not ready"}),!1)});var Je;const Ze=async()=>{await Qe.clear()},Ke=(e,...t)=>{!0===e&&console.log(...t)},Xe=["Write fully detailed, factual image descriptions for low-vision readers.","Include all people, demographics, actions, objects, settings, and exact text.","Use direct, plain English without filtering or vague words.","Output only the raw description with no intro, title, or disclaimer.","Use English."].join(" "),et=["describe this image in one sentence starting with the main subject"].join(" "),tt=["You are a precise translator.","Translate the text faithfully and literally into the target language.","Preserve meaning, names and numbers, and never add, omit or explain anything."].join(" "),rt="CANNOT_TRANSLATE",nt=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},ot=e=>`Thanks this was accurate. Now please translate it faithfully into ${e}. This 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`,at=({service:e,limits:t,logging:r,onStatus:n})=>{const o=(t,r)=>n?.(Ge(e,t,r));return{report:o,load:async n=>{let a,i=0,s=-1,c=u.download;Ke(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,Ke(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 Ke(r,"Describe load ready",n.id);const l=a||e.error()||"Model not ready";return Ke(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();Ke(r,"Describe generate start",i,n,a.length);try{const o=await e.chat({messages:a,limits:t,reasoning:!1,logging:r,onReason:e=>{Ke(r,"Describe reason",i,n,e)},onText:e=>{l+=e,Ke(r,"Describe text",i,n,e),c?.(l)},onSpeed:e=>{Ke(r,"Describe speed",i,n,e),s?.(e)}});return Ke(r,"Describe generate reply",i,n,Date.now()-d,o?.length??0,o),o}catch(e){throw Ke(r,"Describe generate failed",i,n,e),o(n,{requesting:!1,phase:u.load,percent:100,error:`${e?.message||`${e}`}`}),e}}}},it=async({translator:e,generate:t,descriptions:r,language:n,currentIndex:o,onSpeed:a,onText:s})=>{const c=[...r];for(let l=0;l<r.length;l++){const u=r[l],d=(await t({model:e.id,messages:[{role:i.system,content:tt},{role:i.user,content:"[image] describe this image in English very accurately"},{role:i.assistant,content:u},{role:i.user,content:ot(n)}],stage:"translate",onSpeed:e=>a?.(l,e),onText:e=>s?.(l,e,"translate")})||"").trim(),g=d.replace(/[^a-z]/gi,"").toUpperCase().includes(rt.replace(/[^a-z]/gi,""));d&&!g&&(c[l]=d),o?.(l,u,c[l])}return c},st=(e=>async t=>{const{images:r,currentIndex:n}=t,o=[],a=!0===t.logging;if(Ke(a,"Describe start",r.length,t.targetLanguage),!r.length)return Ke(a,"Describe empty"),o;const s=w(d.qwen3_vl_2b_instruct_q3),c=d.qwen3_vl_2b_instruct_q3,l=C({maxReplyTokens:400,...t.limits}),{report:g,load:m,generate:p}=at({service:e,limits:l,logging:a,onStatus:t.onStatus});if(Ke(a,"Describe model",c,s?"found":"missing",l.maxReplyTokens,l.maxImages),g(c,{requesting:!1,phase:e.ready()?u.load:u.download,percent:e.ready()?100:0}),!s)throw Ke(a,"Describe model missing",c),g(c,{requesting:!1,phase:u.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const f=await m(s);if(f)throw Ke(a,"Describe stop",f),new Error(f);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];Ke(a,"Describe image start",e,r.length,l.startsWith("data:")?"data URL":l,l.length),n?.(e);const d=await p({model:s.id,messages:[{role:i.system,content:Xe},{role:i.user,content:et,images:[l]}],stage:"describe",onSpeed:r=>t.onSpeed?.(e,r),onText:r=>t.onText?.(e,r,"describe")}),m=Date.now()-c,f=(d||"").trim();if(Ke(a,"Describe english",e,m,f),!f)throw Ke(a,"Describe empty",e,d),g(s.id,{requesting:!1,phase:u.load,percent:100,error:"No description"}),new Error("No description");o.push({descriptionEN:f,description:f,durationMs:m}),n?.(e,f,void 0,m)}Ke(a,"Describe english ready",o.length);const h=t.targetLanguage.trim(),y=nt(h)&&await b()?w(d.gemma4_e2b_limited):void 0,v=y?await m(y):void 0;if(y&&!v)g(y.id,{requesting:!0,phase:u.load,percent:100}),await it({translator:y,generate:p,descriptions:o.map(e=>e.descriptionEN),language:h,currentIndex:(e,t,r)=>{const a=o[e];r&&(a.description=r),n?.(e,t,a.description,a.durationMs)},onText:t.onText}),g(y.id,{requesting:!1,phase:u.load,percent:100});else{for(let e=0;e<o.length;e++)n?.(e,o[e].descriptionEN,o[e].description,o[e].durationMs);g(y?.id??s.id,{requesting:!1,phase:e.ready()?u.load:u.download,percent:e.ready()?100:0,...v?{error:v}:{}})}return o})(Qe),ct=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(Ke(o,"Translate start",r.length,n),!r.length||!nt(n))return Ke(o,"Translate skipped"),r;const a=C({maxReplyTokens:400,...t.limits}),{report:i,load:s,generate:c}=at({service:e,limits:a,logging:o,onStatus:t.onStatus}),l=await b()?w(d.gemma4_e2b_limited):void 0;if(!l)return Ke(o,"Translate no gpu"),r;const g=await s(l);if(g)return Ke(o,"Translate stop",g),r;i(l.id,{requesting:!0,phase:u.load,percent:100});const m=await it({translator:l,generate:c,descriptions:r,language:n,currentIndex:t.currentIndex,onSpeed:t.onSpeed,onText:t.onText});return i(l.id,{requesting:!1,phase:u.load,percent:100}),m})(Qe),lt=/^[0-9+\-*/%^().]+$/,ut=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},dt={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(!lt.test(t))throw new Error("Unsupported character");const r=ut(t);return{expression:t,result:Math.abs(r)>=1e5?(0,P.pNum)(r)??r:(0,P.rNum)(r,12)}})(t)}},gt="degreesign-chat-prices-v1",mt="EUR",pt=5*P.oneMin,ft=30*P.oneSec;let ht,yt={},wt=0,bt=!1,vt=!1;const xt=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},jt=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,Mt=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=xt(e.rates?.current),n=xt(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&&(yt.fiat=jt(yt.fiat,a)),i&&(yt.crypto=jt(yt.crypto,i)),wt=0,bt=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(gt,JSON.stringify(yt))}catch{}})()}catch(e){throw wt=Date.now(),bt=!0,e}},_t=e=>!!yt.crypto&&(e in yt.crypto.prices||e in yt.crypto.yesterday),kt=e=>!!yt.fiat&&(e in yt.fiat.rates||e in yt.fiat.yesterday),St=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==mt)continue;const e=_t(r)||kt(r);!_t(r)&&e||(t.crypto=!0),_t(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(yt.fiat?.fetchedAt??0)>=P.oneHr,o=t.crypto&&r-(yt.crypto?.fetchedAt??0)>=pt;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||wt&&r-wt<ft||(ht||(ht=Mt({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{ht=void 0})),await ht))},Tt=e=>{if(e==mt)return 1;const t=yt.crypto?.yesterday[e],r=yt.fiat?.yesterday[e];return t||(r?1/r:void 0)},Pt=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},Ot=e=>Math.abs(e)>=1e5?(0,P.pNum)(e)??e:(0,P.rNum)(e,8),Dt=async e=>{(()=>{if(!vt){vt=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(gt);if(!e)return;const t=JSON.parse(e);yt={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=Pt(e.from,"from"),r=void 0===e.to||null===e.to?mt:Pt(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 St([t,r]);const o=e=>{const t=(e=>{if(e==mt)return 1;const t=yt.crypto?.prices[e],r=yt.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!yt.fiat&&!yt.crypto)throw new Error("Prices unavailable offline");if(_t(e)||kt(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=Tt(t),c=Tt(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!=mt&&(_t(r)?yt.crypto&&t.push(yt.crypto.sourceAt):kt(r)&&yt.fiat&&t.push(yt.fiat.sourceAt));return t})([t,r]),p=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:Ot(l),...void 0===u?{}:{previousRate:Ot(u),change:Ot(d??0),changePercent:(0,P.rNum)(g??0,4)},result:Ot(n*l),updatedAt:new Date(p).toISOString(),stale:bt&&!(!yt.fiat&&!yt.crypto)}},Ct={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=>Dt(e)},Et={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},Nt=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,At=(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 Et[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),Lt=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,$t=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)}},Rt=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==m.duckduckgo?m.duckduckgo:m.wikipedia,language:Lt.test(t)?t:"en",limit:Math.round(Nt(e.limit,1,20,3)),snippetLength:Math.round(Nt(e.snippetLength,1,4e3,400)),timeout:Nt(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 $t(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:At(r||n,200),url:t,snippet:At(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 $t(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:At(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:At(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},qt=(e,t)=>{const r=[];for(const n of e)n==g.websearch?r.push(Rt(t)):n==g.calculate?r.push(dt):n==g.currency&&r.push(Ct);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,qt as builtinTools,dt as calculateTool,Ze as clearModelCache,He as createChat,Ct as currencyTool,st as describeImages,ct as describeTranslated,Ye as preloadModel,Rt as webSearchTool};
2
+ import{dirname as e,join as t}from"node:path";import{fileURLToPath as r}from"node:url";var n={69(e,t){(()=>{var e={125:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addZ=t.tN=t.monNm=t.tmUTC=t.tmAP=t.moYrDt=t.shortDt=t.fullLong=t.fullDate=t.fullDt=t.invDt=t.dayRes=t.timeStandard=t.dateStandard=t.seoDt=t.thisYear=t.oneMon=t.oneMin=t.oneHr=t.oneDay=t.oneSec=void 0;const r=()=>Date.now(),n=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],a=["st","nd","rd","th"],i=e=>0==+e?"00":+e<10&&+e>=1?`0${e}`:`${e}`,s=e=>{const t=new Date(e);return`${t.getUTCFullYear()}-${i(t.getUTCMonth()+1)}-${i(t.getUTCDate())}`},c=e=>i(e.getUTCHours())+`:${i(e.getUTCMinutes())}`+`:${i(e.getUTCSeconds())}`;t.tN=r,t.monNm=n,t.dayRes=90,t.oneSec=1e3,t.oneMin=6e4,t.oneHr=36e5,t.oneDay=864e5,t.oneMon=27e8,t.addZ=i,t.tmUTC=e=>{const t=new Date(e);return i(t.getUTCHours())+`:${i(t.getUTCMinutes())} UTC`},t.tmAP=e=>{const t=new Date(e),r=t.getHours();return i(r>12?r-12:r)+`:${i(t.getMinutes())}`+(r>=12?"pm":"am")},t.shortDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]}`},t.moYrDt=e=>{const t=new Date(e);return`${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDate=e=>{const t=new Date(e);return`${t.getDate()} ${n[t.getMonth()]} ${t.getFullYear()}`},t.fullLong=e=>`${(e=>{const t=new Date(e),r=t.getDate();return r+a[r<5?r-1:r>4&&r<21?3:r>20&&r<25?r-21:r>24&&r<31?3:0]+` of ${n[t.getMonth()]}`})(e)} ${new Date(e).getFullYear()}`,t.thisYear=e=>(e?new Date(e):new Date)?.getUTCFullYear(),t.dateStandard=s,t.timeStandard=c,t.seoDt=e=>{!e&&(e=r());const t=new Date(e);return`${s(t)}T${c(t)}Z`},t.invDt=e=>{const t=new Date(e);return`${t.getUTCFullYear()}`.split("20")[1]+i(t.getUTCMonth()+1)+i(t.getUTCDate())+`${e}`.slice(10)}},240:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.idRandLong=t.idRandShort=t.idShuffle=void 0;const r=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","@",".","_","0","1","2","3","4","5","6","7","8","9"];t.idShuffle=async({data:e,password:t})=>4==t?.length?(({data:e,password:t})=>{try{const n=(e,t)=>r.includes(e.toLowerCase())?r[(r.indexOf(e.toLowerCase())+Math.pow(t,3))%r.length]:e;return[...e].map(e=>n(e,Number(t))).join("")}catch{return""}})({data:e,password:t}):await(async({data:e,password:t})=>{if(!e||!t)return"";try{crypto.subtle;const r=new TextEncoder,n=r.encode(e),o=r.encode(t),a=await crypto.subtle.digest("SHA-256",o),i=new Uint8Array(a),s=i.slice(0,32),c=i.slice(0,12),l=await crypto.subtle.importKey("raw",s,{name:"AES-GCM"},!1,["encrypt"]),u=await crypto.subtle.encrypt({name:"AES-GCM",iv:c},l,n);return btoa(String.fromCharCode(...new Uint8Array(u))).replace(/\+/g,"a").replace(/\//g,"b").replace(/=/g,"c").toLowerCase()}catch{return""}})({data:e,password:t}),t.idRandShort=(e=10)=>{try{return crypto.randomUUID()?.replaceAll("-","")?.slice(0,e)}catch(e){return console.log("idRandShort failed",e),""}},t.idRandLong=(e=10)=>{try{const t="abcdefghijklmnopqrstuvwxyz",r=new Uint8Array(e);return crypto.getRandomValues(r),Array.from(r).map(e=>t[e%26]).join("")}catch(e){return console.log("idRandLong failed",e),""}}},246:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.cacheCheck=t.delayCode=void 0;const n=r(125);t.delayCode=async(e=0)=>await new Promise(t=>setTimeout(t,e)),t.cacheCheck=({analysisCacheLimit:e,lastUpdated:t,forceRefresh:r})=>{const o=Date.now();if(t&&(!r&&t>o-e||r&&t>o-n.oneDay))return!0}},792:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isEven=t.pNum=t.sharpeRatio=t.priceVariations=t.nTxtAr=t.zNum=t.addCom=t.adjNum=t.rNum=void 0;const r=[1,.1,.01,.001,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10,1e-11,1e-12,1e-13,1e-14,1e-15,1e-16,1e-17,1e-18,1e-19],n=(e,t=6)=>{const n=+e,o=n?Math.abs(n):0,a=o>1&&t?t-`${Math.round(o)}`.length:0;return n?(n<0?-1:1)*(Number.isInteger(o)||o<1e-16?o:o>1e5?Math.round(o):o>1?Number(o.toFixed(a<0?0:a)):((e,t)=>{let n=0;for(const o of r){if(o<e)return Number(e.toFixed(t+n-1));n++}return e})(o,t)):e},o=(e,t)=>{const r=(n(e,t)+"").split(".");return r[0]=r[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),r.join(".")},a=(e,t=3)=>{const r=Number(e);if(!e||!r)return e+"";const a=Math.abs(r);return(r<0?"-":"")+(a>1e9?o(a/1e9,t)+"b":a>1e6?o(a/1e6,t)+"m":a<1e-6&&a>1e-16?(1+n(a,t)+"").replace(/1./g,"0."):o(a,t))};t.nTxtAr=["zero","one","two","three","four","five","six","seven","eight","nine","ten"],t.rNum=n,t.addCom=o,t.adjNum=a,t.zNum=e=>{const t=Number(e);let r=t?Math.abs(t):0,n=1e10;for(;n>1;)r>n&&(r=Math.round(r/(n/10))*(n/10)),n/=10;return t?(t<0?"-":"")+a(r,2):e},t.pNum=e=>+e||0==+e?Math.round(1e6*+e)/1e6:null,t.priceVariations=e=>{try{let t=0;const r=[...e].sort((e,t)=>e[0]-t[0]),n=e.reduce((e,[,t])=>e+t,0),o=r.find(([,e])=>(t+=e,t>=n/2))[0];return e.filter(([e])=>Math.abs(e-o)/o<.05).map(([e])=>e)}catch{return[]}},t.sharpeRatio=({assetPrices:e,minExpectedReturn:t=.05})=>{if(!e?.length||e?.length<2)return 0;const r=e.slice(1).map((t,r)=>(t-e[r])/e[r]),n=r.reduce((e,t)=>e+t,0)/r.length,o=Math.sqrt(r.reduce((e,t)=>e+Math.pow(t-n,2),0)/r.length);return(n-t)/o},t.isEven=e=>e%2==0},794:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restoreObj=t.restoreObjStr=t.storeObj=t.storeObjStr=t.objNestValueCount=t.objLen=t.objSortSimple=t.objSort=void 0;const n=r(125),o=e=>{try{return Object.keys(e||{})?.length||0}catch(e){return console.log(e),0}},a=e=>{try{return e?.replace(/"/g,"'")}catch(e){return console.log((0,n.tN)(),"storeObjStr failed",e),""}},i=e=>{try{return e?.toString()?.replace(/'/g,'"')}catch(e){console.log((0,n.tN)(),"restoreObjStr failed",e)}};t.objLen=o,t.objNestValueCount=e=>{let t=0;if(o(e))for(const r in e)t+=o(e[r])?1:0;return t},t.objSort=(e={},t,r=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,n])=>null===e[t]||void 0===e[t]?1:null===n[t]||void 0===n[t]?-1:e[t]>n[t]?1*r:-1*r)),t.objSortSimple=(e={},t=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,r])=>null==e?1:null==r?-1:e>r?1*t:-1*t)),t.storeObjStr=a,t.storeObj=e=>{try{return a(JSON.stringify(e))}catch(e){return console.log((0,n.tN)(),"storeObj failed",e),""}},t.restoreObjStr=i,t.restoreObj=e=>{try{if(!e)return;const t=i(e);return t?JSON.parse(t):void 0}catch(e){console.log((0,n.tN)(),"restoreObj failed",e)}}},830:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.phaseDifference=t.compareArrays=t.squeezeArray=t.forecastNextTotal=t.forecastNext=t.getMax=t.getMean=t.getSum=t.maxVl=t.minVl=t.sumArr=void 0;const r=e=>{try{return e?.length?e.reduce((e,t)=>e+t):0}catch(e){return console.log("sumArr failed",e),0}},n=e=>{try{return e?.length?e.reduce((e,t)=>e+t,0):0}catch(e){return console.log("getSum failed",e),0}},o=e=>{try{return e?.length?n(e)/e.length:0}catch(e){return console.log("getMean failed",e),0}},a=e=>{try{return e?.length?Math.max(...e):0}catch(e){return console.log("getMax failed",e),0}},i=e=>{try{if(!e?.length)return 0;const t=[...e].sort((e,t)=>e-t),r=Math.floor(t.length/2);return t.length%2?t[r]:(t[r-1]+t[r])/2}catch(e){return console.log("median failed",e),0}},s=({currentPeriod:e,steps:t=1})=>{try{const r=(Array.isArray(e)?e:[]).filter(Number.isFinite);if(!r.length||t<=0)return[];if(r.length<2){const e=Math.max(0,o(r));return Array.from({length:t},()=>e)}const n=r.length,{slope:s,intercept:c}=(e=>{try{const t=e.length,r=[];for(let n=0;n<t-1;n++)for(let o=n+1;o<t;o++)r.push((e[o]-e[n])/(o-n));const n=i(r);return{slope:n,intercept:i(e.map((e,t)=>e-n*t))}}catch(e){return console.log("theilSen failed",e),{slope:0,intercept:0}}})(r),l=c+s*(n-1),u=a(r),d=u>0?3*u:1/0;return Array.from({length:t},(e,t)=>{const r=t+1,o=l+s*n*Math.log1p(r/n);return Math.max(0,Math.min(o,d))})}catch(e){return console.log("forecastNext failed",e),[]}};t.sumArr=r,t.maxVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]>r&&(r=o[t])}return r},t.minVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]<r&&(r=o[t])}return r},t.getSum=n,t.getMean=o,t.getMax=a,t.forecastNext=s,t.forecastNextTotal=e=>{try{const t=s({currentPeriod:e,steps:e?.length});return n(t)}catch(e){return console.log("forecastNextTotal failed",e),0}},t.squeezeArray=({arr:e,targetLength:t})=>{try{if(!e||0===e.length||t<=0)throw new Error("Invalid input");const n=Math.ceil(e.length/t);return Array.from({length:t},(t,o)=>{const a=o*n,i=Math.min(a+n,e.length),s=e.slice(a,i);return r(s)}).slice(0,t)}catch(e){return console.log("squeezeArray failed",e),[]}},t.compareArrays=({arrays:e})=>{try{const t=[...e],n=Math.min(...t.map(e=>e.length));for(let e=0;e<t.length;e++)t.splice(n);const o=t.map(e=>r(e)),a=[],i=Math.min(...o),s=o.indexOf(i),c=i/Math.max(...o);for(let e=0;e<t.length;e++){const r=t[e];if(a[e]=[],e==s)a[e]=r;else for(let t=0;t<r.length;t++)a[e].push(c*r[t])}return a}catch(t){return console.log("compareArrays failed",t),e}},t.phaseDifference=({array1:e,array2:t})=>{try{let r=e.length,n=e.reduce((e,t)=>e+t)/r,o=t.reduce((e,t)=>e+t)/r,a=e.map(e=>e-n),i=t.map(e=>e-o),s=Math.floor(r/2),c=-1/0,l=0;for(let e=-s;e<=s;e++){let t=0,n=0,o=0,s=0;for(let c=0;c<r;c++){let l=c+e;l>=0&&l<r&&(t+=a[c]*i[l],n+=a[c]*a[c],o+=i[l]*i[l],s++)}if(n>0&&o>0&&s>=.8*r){let r=t/Math.sqrt(n*o);r>c&&(c=r,l=e)}}return l}catch(e){return console.log("phaseDifference failed",e),0}}}},r={};function n(t){var o=r[t];if(void 0!==o)return o.exports;var a=r[t]={exports:{}};return e[t](a,a.exports,n),a.exports}var o={};(()=>{var e=o;Object.defineProperty(e,"__esModule",{value:!0}),e.idShuffle=e.isEven=e.pNum=e.nTxtAr=e.zNum=e.addCom=e.adjNum=e.rNum=e.sharpeRatio=e.priceVariations=e.timeStandard=e.dateStandard=e.addZ=e.tN=e.monNm=e.tmUTC=e.tmAP=e.moYrDt=e.shortDt=e.fullLong=e.fullDate=e.fullDt=e.invDt=e.dayRes=e.thisYear=e.seoDt=e.oneMon=e.oneMin=e.oneHr=e.oneDay=e.oneSec=e.restoreObj=e.restoreObjStr=e.storeObj=e.storeObjStr=e.objSortSimple=e.objSort=e.objNestValueCount=e.objLen=e.phaseDifference=e.compareArrays=e.squeezeArray=e.forecastNextTotal=e.forecastNext=e.getMax=e.getMean=e.getSum=e.maxVl=e.minVl=e.sumArr=void 0,e.cacheCheck=e.delayCode=e.idRandLong=e.idRandShort=void 0;const t=n(246);Object.defineProperty(e,"cacheCheck",{enumerable:!0,get:function(){return t.cacheCheck}}),Object.defineProperty(e,"delayCode",{enumerable:!0,get:function(){return t.delayCode}});const r=n(830);Object.defineProperty(e,"sumArr",{enumerable:!0,get:function(){return r.sumArr}}),Object.defineProperty(e,"minVl",{enumerable:!0,get:function(){return r.minVl}}),Object.defineProperty(e,"maxVl",{enumerable:!0,get:function(){return r.maxVl}}),Object.defineProperty(e,"getMax",{enumerable:!0,get:function(){return r.getMax}}),Object.defineProperty(e,"getMean",{enumerable:!0,get:function(){return r.getMean}}),Object.defineProperty(e,"getSum",{enumerable:!0,get:function(){return r.getSum}}),Object.defineProperty(e,"forecastNext",{enumerable:!0,get:function(){return r.forecastNext}}),Object.defineProperty(e,"forecastNextTotal",{enumerable:!0,get:function(){return r.forecastNextTotal}}),Object.defineProperty(e,"squeezeArray",{enumerable:!0,get:function(){return r.squeezeArray}}),Object.defineProperty(e,"compareArrays",{enumerable:!0,get:function(){return r.compareArrays}}),Object.defineProperty(e,"phaseDifference",{enumerable:!0,get:function(){return r.phaseDifference}});const a=n(240);Object.defineProperty(e,"idRandLong",{enumerable:!0,get:function(){return a.idRandLong}}),Object.defineProperty(e,"idRandShort",{enumerable:!0,get:function(){return a.idRandShort}}),Object.defineProperty(e,"idShuffle",{enumerable:!0,get:function(){return a.idShuffle}});const i=n(792);Object.defineProperty(e,"addCom",{enumerable:!0,get:function(){return i.addCom}}),Object.defineProperty(e,"adjNum",{enumerable:!0,get:function(){return i.adjNum}}),Object.defineProperty(e,"priceVariations",{enumerable:!0,get:function(){return i.priceVariations}}),Object.defineProperty(e,"nTxtAr",{enumerable:!0,get:function(){return i.nTxtAr}}),Object.defineProperty(e,"rNum",{enumerable:!0,get:function(){return i.rNum}}),Object.defineProperty(e,"zNum",{enumerable:!0,get:function(){return i.zNum}}),Object.defineProperty(e,"sharpeRatio",{enumerable:!0,get:function(){return i.sharpeRatio}}),Object.defineProperty(e,"pNum",{enumerable:!0,get:function(){return i.pNum}}),Object.defineProperty(e,"isEven",{enumerable:!0,get:function(){return i.isEven}});const s=n(125);Object.defineProperty(e,"oneSec",{enumerable:!0,get:function(){return s.oneSec}}),Object.defineProperty(e,"oneDay",{enumerable:!0,get:function(){return s.oneDay}}),Object.defineProperty(e,"oneHr",{enumerable:!0,get:function(){return s.oneHr}}),Object.defineProperty(e,"oneMin",{enumerable:!0,get:function(){return s.oneMin}}),Object.defineProperty(e,"oneMon",{enumerable:!0,get:function(){return s.oneMon}}),Object.defineProperty(e,"seoDt",{enumerable:!0,get:function(){return s.seoDt}}),Object.defineProperty(e,"dayRes",{enumerable:!0,get:function(){return s.dayRes}}),Object.defineProperty(e,"invDt",{enumerable:!0,get:function(){return s.invDt}}),Object.defineProperty(e,"fullDt",{enumerable:!0,get:function(){return s.fullDt}}),Object.defineProperty(e,"fullDate",{enumerable:!0,get:function(){return s.fullDate}}),Object.defineProperty(e,"fullLong",{enumerable:!0,get:function(){return s.fullLong}}),Object.defineProperty(e,"shortDt",{enumerable:!0,get:function(){return s.shortDt}}),Object.defineProperty(e,"moYrDt",{enumerable:!0,get:function(){return s.moYrDt}}),Object.defineProperty(e,"tmAP",{enumerable:!0,get:function(){return s.tmAP}}),Object.defineProperty(e,"tmUTC",{enumerable:!0,get:function(){return s.tmUTC}}),Object.defineProperty(e,"monNm",{enumerable:!0,get:function(){return s.monNm}}),Object.defineProperty(e,"tN",{enumerable:!0,get:function(){return s.tN}}),Object.defineProperty(e,"addZ",{enumerable:!0,get:function(){return s.addZ}}),Object.defineProperty(e,"timeStandard",{enumerable:!0,get:function(){return s.timeStandard}}),Object.defineProperty(e,"dateStandard",{enumerable:!0,get:function(){return s.dateStandard}}),Object.defineProperty(e,"thisYear",{enumerable:!0,get:function(){return s.thisYear}});const c=n(794);Object.defineProperty(e,"objSort",{enumerable:!0,get:function(){return c.objSort}}),Object.defineProperty(e,"objLen",{enumerable:!0,get:function(){return c.objLen}}),Object.defineProperty(e,"objNestValueCount",{enumerable:!0,get:function(){return c.objNestValueCount}}),Object.defineProperty(e,"restoreObj",{enumerable:!0,get:function(){return c.restoreObj}}),Object.defineProperty(e,"restoreObjStr",{enumerable:!0,get:function(){return c.restoreObjStr}}),Object.defineProperty(e,"storeObj",{enumerable:!0,get:function(){return c.storeObj}}),Object.defineProperty(e,"storeObjStr",{enumerable:!0,get:function(){return c.storeObjStr}}),Object.defineProperty(e,"objSortSimple",{enumerable:!0,get:function(){return c.objSortSimple}})})();var a=t;for(var i in o)a[i]=o[i];o.__esModule&&Object.defineProperty(a,"__esModule",{value:!0})})()}};const o={};function a(e){const t=o[e];if(void 0!==t)return t.exports;const r=o[e]={exports:{}};return n[e](r,r.exports,a),r.exports}var i,s,c,l,u,d,g,m;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,j=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio,M=()=>{return n=t(e(r("file:///media/x/store/code/DegreeSign/ds_chat/src/assets/nodeEsm.js")),"../assets/wllama"),{wasm:t(n,"wllama.wasm"),compatWasm:t(n,"compat/wllama.wasm"),compatWorker:t(n,"compat/wllama.js")};var n},_=()=>{return n=t(e(r("file:///media/x/store/code/DegreeSign/ds_chat/src/assets/nodeEsm.js")),"../assets/litert"),{script:t(n,"litertlm_wasm_internal.js"),wasm:t(n,"litertlm_wasm_internal.wasm")};var n},k={width:384,height:384},S=async e=>{if(!e.startsWith("data:"))return await(await fetch(e)).arrayBuffer();const t=e.indexOf(","),r=t>=0?e.slice(0,t):"";if(t<0)throw new Error("Invalid image data");if(!r.includes(";base64"))return await(await fetch(e)).arrayBuffer();const n=atob(e.slice(t+1)),o=new Uint8Array(n.length);for(let e=0;e<n.length;e++)o[e]=n.charCodeAt(e);return o.buffer},T=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:6},D=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,E=(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}),C=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,A=e=>Number(e.headers.get("content-length"))||0,L=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),$=e=>L(e,"image"),R=e=>L(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 T(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?k: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:A(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="litertlm-models",pe=ge("litert-store"),fe={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 he=!1;const ye=(...e)=>{he&&console.log(...e)},we=(...e)=>{he&&console.error(...e)},be=e=>{try{e.getGlobalLiteRtLm().liteRtLmWasm.preinitializedWebGPUDevice=void 0}catch{}},ve=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(me)}catch{return}},xe=new Map,je=(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)}}))},Me=async(e,t=!0)=>{const r=[];for(const n of e){if("string"==typeof n.content){r.push({role:n.role,content:n.content});continue}const e=[];for(const r of n.content)"text"!=r.type?t?e.push({type:r.type,data:await S(r.url)}):e.push({type:"text",text:`[${r.type}]`}):e.push({type:"text",text:r.text});r.push({role:n.role,content:e})}return r},_e=(e,t)=>{if(e.role!=t.role)return!1;if("string"==typeof e.content||"string"==typeof t.content)return e.content==t.content;if(e.content.length!=t.content.length)return!1;for(let r=0;r<e.content.length;r++){const n=e.content[r],o=t.content[r];if(n.type!=o.type)return!1;if("text"==n.type&&"text"==o.type){if(n.text!=o.text)return!1}else if(("image"==n.type&&"image"==o.type||"audio"==n.type&&"audio"==o.type)&&n.url!=o.url)return!1}return!0},ke=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 Me([a]))[0];if(!c)throw new Error("Empty prompt");const l=!!o.conversation&&o.reasoning==r.reasoning&&o.maxTokens==i.max_tokens&&((e,t)=>{const r="system"==e[0]?.role?e[0]:void 0,n="system"==t[0]?.role?t[0]:void 0;if(!r!=!n)return!1;if(r&&n&&!_e(r,n))return!1;const o=r?e.slice(1):e,a=n?t.slice(1):t;if(!a.length||a.length>o.length)return!1;const i=o.length-a.length;for(let e=0;e<a.length;e++)if(!_e(o[i+e],a[e]))return!1;return!0})(o.sent,s);let u;if(l&&o.conversation)u=o.conversation;else{const n=await Me(s,!1);o.conversation=void 0,o.sent=[],u=await e.createConversation({sessionConfig:{maxOutputTokens:i.max_tokens,samplerParams:{type:t.SamplerType.TOP_K,temperature:i.temperature,k:40,p:.95}},preface:{...n.length?{messages:n}:{},extra_context:{enable_thinking:r.reasoning}},prefillPrefaceOnInit:n.length>0}),o.conversation=u,o.reasoning=r.reasoning,o.maxTokens=i.max_tokens,o.sent=[...s]}o.sent.push(a);let d,g=!1,m="";const p=()=>{d&&d.cancel().catch(()=>{});try{u.cancel()}catch{}};r.signal?.addEventListener("abort",p,{once:!0});try{if(r.signal?.aborted)return;const e=u.sendMessageStreaming(c).getReader();for(d=e;;){const{done:t,value:r}=await e.read();if(t)break;const n={};let o="string"==typeof r.content?r.content:"";if(Array.isArray(r.content))for(const e of r.content)"text"==e.type&&(o+=e.text);o&&(n.content=o,m+=o);const a=r.channels?.thought;a&&(n.reasoning=a),(n.content||n.reasoning)&&(yield{choices:[{delta:n}]})}g=!0}finally{r.signal?.removeEventListener("abort",p),g&&m?o.sent.push({role:"assistant",content:m}):(o.conversation=void 0,o.sent=[])}},Se={backend:l.gpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o})=>{he=!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:ye,printErr:we};try{await s.getOrLoadGlobalLiteRtLm(_().script)}finally{c.Module=d}if(n?.aborted)throw new Error("Cancelled");const g=C(i.repo,i.file),m=await ve();let p;const f=m?await m.match(g):void 0;if(f?.body)p=f.body;else{const e=await pe.stored(g);e?.complete&&(p=e.file.stream())}if(!p){const e=await pe.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=xe.get(e);if(o)return await o;const a=(async()=>{const o=await fetch(e,{signal:r});if(!o.ok||!o.body)throw new Error("Model download failed");const a=A(o),i=je(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{xe.delete(e)});return xe.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 je(n.body,A(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:fe},...o?.vision?{visionBackend:n.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...o?.audio?{audioBackend:n.Backend.CPU}:{}}})({model:e,limits:t,source:p,mod:s}));if(n?.aborted)throw await h.delete(),be(s),new Error("Cancelled");const y={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})=>{he=!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 ke({engine:e,mod:r,params:n,messages:a,session:o})}})}catch(e){throw a(),e}})({engine:h,model:e,mod:s,params:t,session:y}),unload:async()=>{const e=y.conversation;y.conversation=void 0,y.sent=[];try{await(e?.delete())}catch{}await h.delete(),be(s)}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=C(t.repo,t.file),[n,o]=await Promise.all([ve(),pe.stored(r)]);if(o?.complete)return!0;try{return!(!n||!await n.match(r))}catch{return!1}},purge:async()=>{try{await pe.purge(),"undefined"!=typeof caches&&await caches.delete(me)}catch{}}},Te=ge("wllama-store"),Pe=[d.qwen3_vl_2b_instruct,d.qwen3_vl_2b_instruct_q3],Oe=e=>e.cpu?.mmproj&&Pe.includes(e.id)?{image_min_tokens:16,image_max_tokens:100}:{};let De,Ee,Ne="",Ce=!1;const Ae=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Le=e=>{const t=M();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},$e=e=>{const t=e=>(...t)=>{Ce&&("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)}},Re=async()=>{if(De)return De;const e=await a.e(924).then(()=>a(577)),t=Ee||Le(),r=new e.Wllama({default:t.wasm},{logger:$e(e.LoggerWithoutDebug)});return Ee||(Ee=t,Ne=Ae(t)),r.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),De=r,r},qe=async()=>{const e=De;De=void 0;try{await(e?.exit())}catch{}},Ue=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),Ie=e=>{const t=e.cpu;return t?[{name:t.file,url:C(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:C(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},ze=async e=>{const t=Ie(e);if(!t.length)return!1;for(const e of t){const t=await Te.stored(e.url);if(!t?.complete)return!1}return!0},Fe=async(e,t)=>{const r=await e.cacheManager.list();return Ie(t).every(e=>r.some(t=>Ue(t,e.name)))},Ve=async({model:e,signal:t,onProgress:r})=>{const n=Ie(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await Te.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},Be=async e=>{const t=[];for(const r of e){if("string"==typeof r.content){"system"==r.role?t.push({role:"system",content:r.content}):"assistant"==r.role?t.push({role:"assistant",content:r.content}):t.push({role:"user",content:r.content});continue}const e=[];for(const t of r.content)"text"==t.type?e.push({type:"text",text:t.text}):e.push({type:t.type,data:await S(t.url)});t.push({role:"user",content:e})}return t},We={backend:l.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:a})=>{Ce=!0===o;const i=h()?4096:8192,s=e.cpu;if(!s)throw new Error("Model has no CPU artifact");const c=Le(a),d=Ae(c);De&&d!=Ne&&await qe(),Ee=c,Ne=d;const g=((e,t,r=!1)=>Math.max(1,Math.min(Math.max(2,Math.min(8,(e||4)-1)),t,r?2:3)))("undefined"!=typeof navigator&&navigator.hardwareConcurrency||4,t.maxThreads,!!s.mmproj),m=await Re(),p=await ze(e),f=s.mmproj?.file,y=C(s.repo,s.file),w=f?C(s.mmproj?.repo??s.repo,f):"";if(n?.aborted)throw await qe(),new Error("Cancelled");if(!p&&f){const e=await m.cacheManager.list(),t=e.some(e=>Ue(e,s.file)),r=e.some(e=>Ue(e,f));t&&!r&&await m.cacheManager.deleteMany(e=>Ue(e,s.file))}const b={n_ctx:i,n_threads:g,reasoning_budget_tokens:t.maxThinkingTokens,n_gpu_layers:0,jinja:!0,...Oe(e)};try{let t=p?await Ve({model:e,signal:n,onProgress:r}):void 0;t||p||await Fe(m,e).catch(()=>!1)||(t=await Ve({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 m.loadModel(t,b)):await m.loadModelFromUrl(w?{url:y,mmprojUrl:w}:y,{...b,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 qe(),e}if(n?.aborted)throw await qe(),new Error("Cancelled");if(!m.getLoadedContextInfo().n_ctx)throw await qe(),new Error("Failed to create model context");return{model:e,backend:l.cpu,contextSize:i,chat:t=>(async(e,t,r)=>{if(Ce=!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 Be(n),...N(r.limits,r.reasoning),abortSignal:r.signal,...t.reasoning?{chat_template_kwargs:{enable_thinking:r.reasoning}}:{}})}})})(m,e,t),unload:async()=>{if(De==m)await qe();else try{await m.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await ze(e)||await Fe(await Re(),e))}catch{return!1}},purge:async()=>{try{await Te.purge()}catch{}try{const e=await Re();await e.cacheManager.clear()}catch{}}},Qe=((e={})=>{const t=e.engines?.cpu||We,r=e.engines?.litert||Se;let n,o,a,i,s,d,g,m=l.none,p=c.idle,f=[],h=0,y={percent:0,phase:u.download};const w=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},b=async()=>{const e=n;n=void 0,o=void 0,await(e?.unload())},v=(e,t)=>{y={percent:Math.max(0,Math.min(1,e)),phase:t||u.download};for(const e of[...f])e.report(y.percent,y.phase)},x=e=>{p=e},j=()=>{h++,s?.abort(),s=void 0,i=void 0,p==c.downloading&&x(c.idle)},M=(e,t)=>{const r=a;return r?new Promise(n=>{let o=!1;const i={report:e,settle:e=>{o||(o=!0,t?.removeEventListener("abort",s),n(e))}},s=()=>{(e=>{f=f.filter(t=>t!=e),queueMicrotask(()=>{!f.length&&a&&j()})})(i),i.settle(!1)};f.push(i),t?.aborted?s():t?.addEventListener("abort",s,{once:!0}),r.then(i.settle,()=>i.settle(!1))}):Promise.resolve(!1)},_=()=>p==c.ready&&!!n&&!!o,k=async()=>{j(),x(c.idle),await b()};return{load:async({model:e,limits:t,assets:r,logging:l,signal:g,onProgress:p})=>{if(g?.aborted)return!1;if(_()&&o?.id==e.id)return!0;if(a&&i==e.id)return p(y.percent,y.phase),await M(p,g);a&&(j(),f=[],await a.catch(()=>!1));const k=++h,S=(async()=>{await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})();const a=w(e);if(k!=h)return!1;if(!a)return d="Model is not supported on this device",x(c.unsupported),!1;if(await b(),k!=h)return!1;const i=await a.cached(e);if(k!=h)return!1;d=void 0,x(c.downloading),v(0,u.download),i&&v(1,u.load);const g=new AbortController;s=g;try{const i=await a.startLLM({model:e,limits:t,logging:l,signal:g.signal,assets:r,onProgress:(e,t)=>{k==h&&v(e,t)}});return k!=h||g.signal.aborted?(await i.unload(),!1):(n=i,o=e,m=a.backend,d=void 0,x(c.ready),v(1,u.load),!0)}catch(e){return k!=h||(n=void 0,o=void 0,d=`${e?.message||`${e}`}`,l&&console.log("Local model failed",e),x(c.error)),!1}finally{s==g&&(s=void 0)}})().finally(()=>{a==S&&(a=void 0,i=void 0,f=[])});return a=S,i=e.id,await M(p,g)},chat:async e=>{if(!_()||!n)return;for(;g;)await g.catch(()=>{});if(!_()||!n)return;const t=n.chat(e);g=t;try{return await t}finally{g==t&&(g=void 0)}},unload:k,clear:async()=>{const e=a;await k(),await(e?.catch(()=>{})),await Promise.all([t.purge(),r.purge()])},ready:_,loading:()=>!_()&&p==c.downloading,status:()=>p,backend:()=>m,error:()=>d,model:()=>o}})(),Ye=(e,t,r)=>{const n=e.status(),o=y(t),a=w(o);return{...o?{model:o}:{},availability:n==c.ready?s.online:n==c.error||n==c.unsupported?s.offline:s.away,status:n,backend:e.backend(),supportsImages:!!a&&x(a),supportsAudio:!!a&&j(a),ready:e.ready(),loading:e.loading(),requesting:r.requesting,phase:r.phase,percent:r.percent,...r.error?{error:r.error}:{}}},Ge=(e=>{let t,r=0;const n=t=>t.input.onStatus?.(Ye(e,t.model??t.input.model,t));return o=>{t?.controller.abort();const a={token:++r,input:o,controller:new AbortController,percent:e.ready()?100:0,phase:e.ready()?u.load:u.download,requesting:!1,cancelled:!1};return t=a,n(a),(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=j(s);if(!(c||l&&m||d&&p))return d&&!p?t.error="Model does not accept audio":l&&!m&&(t.error="Model does not accept images"),void n(t);const f=E(o.limits,!!s.litert),h=await e.load({model:s,limits:f,logging:a,signal:t.controller.signal,onProgress:(e,o)=>{t.token==r&&(t.percent=Math.round(100*e),t.phase=o,n(t))}}).catch(e=>(t.token==r&&(t.error=`${e?.message||`${e}`}`),!1));if(t.token!=r)return;if(t.cancelled)return;if(!h)return t.error||(t.error=e.error()||"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="",M="";try{w=await e.chat({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||(M+=e,o.onResponse?.(M))},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))})(a),()=>(t=>{t.token==r&&(t.cancelled=!0,t.controller.abort(),e.status()!=c.ready?queueMicrotask(()=>n(t)):e.unload().then(()=>n(t)))})(a)}})(Qe),He=(Je=Qe,async(e={})=>{const t=await v(e.model),r=r=>e.onStatus?.(Ye(Je,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=Je.ready()&&Je.model()?.id==t.id;return await Je.load({model:t,limits:E(e.limits,!!t.litert),logging:!0===e.logging,onProgress:(e,t)=>{o=Math.round(100*e),a=t,r({requesting:!1,phase:a,percent:o})}}).catch(e=>(n=`${e?.message||`${e}`}`,!1))?(i&&r({requesting:!1,phase:u.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||Je.error()||"Model not ready"}),!1)});var Je;const Ze=async()=>{await Qe.clear()},Ke=(e,...t)=>{!0===e&&console.log(...t)},Xe=["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(" "),et=["describe this image in one sentence starting with the main subject"].join(" "),tt=["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(" "),rt="CANNOT_TRANSLATE",nt=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},ot=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`,at=({service:e,limits:t,logging:r,onStatus:n})=>{const o=(t,r)=>n?.(Ye(e,t,r));return{report:o,load:async n=>{let a,i=0,s=-1,c=u.download;Ke(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,Ke(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 Ke(r,"Describe load ready",n.id);const l=a||e.error()||"Model not ready";return Ke(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();Ke(r,"Describe generate start",i,n,a.length);try{const o=await e.chat({messages:a,limits:t,reasoning:!1,logging:r,onReason:e=>{Ke(r,"Describe reason",i,n,e)},onText:e=>{l+=e,Ke(r,"Describe text",i,n,e),c?.(l)},onSpeed:e=>{Ke(r,"Describe speed",i,n,e),s?.(e)}});return Ke(r,"Describe generate reply",i,n,Date.now()-d,o?.length??0,o),o}catch(e){throw Ke(r,"Describe generate failed",i,n,e),o(n,{requesting:!1,phase:u.load,percent:100,error:`${e?.message||`${e}`}`}),e}}}},it=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:tt},{role:i.user,content:"[image] describe this image in English very accurately"},{role:i.assistant,content:d},{role:i.user,content:ot(n)}],stage:"translate",onSpeed:e=>s?.(u,e),onText:e=>c?.(u,e,"translate")})||"").trim()}catch(e){Ke(o,"Translate item failed",u,e)}const m=g.replace(/[^a-z]/gi,"").toUpperCase().includes(rt.replace(/[^a-z]/gi,""));g&&!m&&(l[u]=g),a?.(u,d,l[u])}return l},st=(e=>async t=>{const{images:r,currentIndex:n}=t,o=[],a=!0===t.logging;if(Ke(a,"Describe start",r.length,t.targetLanguage),!r.length)return Ke(a,"Describe empty"),o;const s=w(d.qwen3_vl_2b_instruct_q3),c=d.qwen3_vl_2b_instruct_q3,l=E({maxReplyTokens:400,...t.limits}),{report:g,load:m,generate:p}=at({service:e,limits:l,logging:a,onStatus:t.onStatus});if(Ke(a,"Describe model",c,s?"found":"missing",l.maxReplyTokens,l.maxImages),g(c,{requesting:!1,phase:e.ready()?u.load:u.download,percent:e.ready()?100:0}),!s)throw Ke(a,"Describe model missing",c),g(c,{requesting:!1,phase:u.download,percent:0,error:"Unknown model"}),new Error("Unknown model");const f=await m(s);if(f)throw Ke(a,"Describe stop",f),new Error(f);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];Ke(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:Xe},{role:i.user,content:et,images:[l]}],stage:"describe",onSpeed:r=>t.onSpeed?.(e,r),onText:r=>t.onText?.(e,r,"describe")})||"").trim()}catch(t){Ke(a,"Describe image failed",e,t)}const d=Date.now()-c;Ke(a,"Describe english",e,d,u),u?(o.push({descriptionEN:u,description:u,durationMs:d}),n?.(e,u,void 0,d)):(Ke(a,"Describe empty",e),o.push({descriptionEN:"",description:"",durationMs:d}),n?.(e,"",void 0,d))}const h=o.filter(e=>!!e.descriptionEN).length;if(Ke(a,"Describe english ready",h),!h)return g(s.id,{requesting:!1,phase:u.load,percent:100,error:"No description"}),o;const y=t.targetLanguage.trim(),v=nt(y)&&await b()?w(d.gemma4_e2b_limited):void 0,x=v?await m(v):void 0;if(v&&!x)g(v.id,{requesting:!0,phase:u.load,percent:100}),await it({translator:v,generate:p,descriptions:o.map(e=>e.descriptionEN),language:y,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(v.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)}g(v?.id??s.id,{requesting:!1,phase:e.ready()?u.load:u.download,percent:e.ready()?100:0,...x?{error:x}:{}})}return o})(Qe),ct=(e=>async t=>{const r=[...t.descriptions],n=t.targetLanguage.trim(),o=!0===t.logging;if(Ke(o,"Translate start",r.length,n),!r.length||!nt(n))return Ke(o,"Translate skipped"),r;const a=E({maxReplyTokens:400,...t.limits}),{report:i,load:s,generate:c}=at({service:e,limits:a,logging:o,onStatus:t.onStatus}),l=await b()?w(d.gemma4_e2b_limited):void 0;if(!l)return Ke(o,"Translate no gpu"),r;const g=await s(l);if(g)return Ke(o,"Translate stop",g),r;i(l.id,{requesting:!0,phase:u.load,percent:100});const m=await it({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})(Qe),lt=/^[0-9+\-*/%^().]+$/,ut=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},dt={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(!lt.test(t))throw new Error("Unsupported character");const r=ut(t);return{expression:t,result:Math.abs(r)>=1e5?(0,P.pNum)(r)??r:(0,P.rNum)(r,12)}})(t)}},gt="degreesign-chat-prices-v1",mt="EUR",pt=5*P.oneMin,ft=30*P.oneSec;let ht,yt={},wt=0,bt=!1,vt=!1;const xt=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},jt=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,Mt=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=xt(e.rates?.current),n=xt(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&&(yt.fiat=jt(yt.fiat,a)),i&&(yt.crypto=jt(yt.crypto,i)),wt=0,bt=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(gt,JSON.stringify(yt))}catch{}})()}catch(e){throw wt=Date.now(),bt=!0,e}},_t=e=>!!yt.crypto&&(e in yt.crypto.prices||e in yt.crypto.yesterday),kt=e=>!!yt.fiat&&(e in yt.fiat.rates||e in yt.fiat.yesterday),St=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==mt)continue;const e=_t(r)||kt(r);!_t(r)&&e||(t.crypto=!0),_t(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(yt.fiat?.fetchedAt??0)>=P.oneHr,o=t.crypto&&r-(yt.crypto?.fetchedAt??0)>=pt;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||wt&&r-wt<ft||(ht||(ht=Mt({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{ht=void 0})),await ht))},Tt=e=>{if(e==mt)return 1;const t=yt.crypto?.yesterday[e],r=yt.fiat?.yesterday[e];return t||(r?1/r:void 0)},Pt=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},Ot=e=>Math.abs(e)>=1e5?(0,P.pNum)(e)??e:(0,P.rNum)(e,8),Dt=async e=>{(()=>{if(!vt){vt=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(gt);if(!e)return;const t=JSON.parse(e);yt={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=Pt(e.from,"from"),r=void 0===e.to||null===e.to?mt:Pt(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 St([t,r]);const o=e=>{const t=(e=>{if(e==mt)return 1;const t=yt.crypto?.prices[e],r=yt.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!yt.fiat&&!yt.crypto)throw new Error("Prices unavailable offline");if(_t(e)||kt(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=Tt(t),c=Tt(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!=mt&&(_t(r)?yt.crypto&&t.push(yt.crypto.sourceAt):kt(r)&&yt.fiat&&t.push(yt.fiat.sourceAt));return t})([t,r]),p=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:Ot(l),...void 0===u?{}:{previousRate:Ot(u),change:Ot(d??0),changePercent:(0,P.rNum)(g??0,4)},result:Ot(n*l),updatedAt:new Date(p).toISOString(),stale:bt&&!(!yt.fiat&&!yt.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=>Dt(e)},Nt={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},Ct=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,At=(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 Nt[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),Lt=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,$t=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)}},Rt=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==m.duckduckgo?m.duckduckgo:m.wikipedia,language:Lt.test(t)?t:"en",limit:Math.round(Ct(e.limit,1,20,3)),snippetLength:Math.round(Ct(e.snippetLength,1,4e3,400)),timeout:Ct(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 $t(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:At(r||n,200),url:t,snippet:At(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 $t(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:At(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:At(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},qt=(e,t)=>{const r=[];for(const n of e)n==g.websearch?r.push(Rt(t)):n==g.calculate?r.push(dt):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,qt as builtinTools,dt as calculateTool,Ze as clearModelCache,Ge as createChat,Et as currencyTool,st as describeImages,ct as describeTranslated,He as preloadModel,Rt as webSearchTool};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@degreesign/chat",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Headless on-device AI chat for browsers and Node with wllama CPU and LiteRT WebGPU engines",
5
5
  "main": "dist/node/chat.node.min.js",
6
6
  "module": "dist/browser/chat.min.mjs",