@degreesign/chat 1.7.4 → 1.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  /*! For license information please see chat.node.min.mjs.LICENSE.txt */
2
- import{dirname as e,join as t}from"node:path";import{fileURLToPath as r}from"node:url";var n={993(e,t){(()=>{var e={28:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.migrateSecure=t.showError=t.config=t.configureStorageSync=t.configureStorage=void 0;const n=r(896),o=r(205),a={storageKey:"appData",dbName:"appDB",storeName:"appStorage",encryptionKey:void 0,hideErrors:!1,localStoragePrefix:"ds:"},i=({storageKey:e,dbName:t,storeName:r,encryptionKey:n,hideErrors:o,localStoragePrefix:i})=>{try{e&&(a.storageKey=e),t&&(a.dbName=t),r&&(a.storeName=r),n&&(a.encryptionKeyStr=n),null!=o&&(a.hideErrors=o),i&&(a.localStoragePrefix=i)}catch(e){s()&&console.log("configureStorageSync failed",e)}},s=()=>!a.hideErrors;t.config=a,t.configureStorage=async({storageKey:e,dbName:t,storeName:r,encryptionKey:n,hideErrors:c,localStoragePrefix:l})=>{try{i({storageKey:e,dbName:t,storeName:r,hideErrors:c,localStoragePrefix:l}),n&&(a.encryptionKey=await(0,o.cryptoKey)(n),a.encryptionKeyStr=n)}catch(e){s()&&console.log("configureStorage failed",e)}},t.configureStorageSync=i,t.showError=s,t.migrateSecure=async({storedKeys:e,newEncryptionKey:t,newDbName:r,newStoreName:i})=>{s()&&console.log("Data migration started...");const c=a.encryptionKey,l=a.dbName,d=a.storeName;a.encryptionKey=await(0,o.cryptoKey)(t)??a.encryptionKey,a.encryptionKeyStr=t??a.encryptionKeyStr,a.dbName=r??a.dbName,a.storeName=i??a.storeName;for(let t=0;t<e.length;t++){const r=e[t];try{const e=await(0,n.readDB)({key:r,dbName:l,storeName:d}),t=e?c?await(0,o.decryptData)(e,c):JSON.parse(e):void 0,i=t?a.encryptionKey?await(0,o.encryptData)(t,a.encryptionKey):JSON.stringify(t):void 0;i&&await(0,n.saveDB)({key:r,data:i,dbName:a.dbName,storeName:a.storeName})}catch(e){s()&&console.log("migrateSecure failed",r,e)}}s()&&console.log("Data migration finished!")}},185:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.base64ToBytes=t.bytesToBase64=void 0,t.bytesToBase64=e=>{let t="",r=0;for(;r<e.length;r+=32768)t+=String.fromCharCode(...e.subarray(r,r+32768));return btoa(t)},t.base64ToBytes=e=>{const t=atob(e),r=new Uint8Array(t.length);for(let e=0;e<t.length;e++)r[e]=t.charCodeAt(e);return r}},205:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.decrypt=t.encrypt=t.decryptData=t.encryptData=t.cryptoKey=void 0;const n=r(28),o=r(185),a=async(e,t)=>{try{const r=crypto.getRandomValues(new Uint8Array(12)),n=(new TextEncoder).encode(JSON.stringify(e)),a=await crypto.subtle.encrypt({name:"AES-GCM",iv:r},t,n),i=new Uint8Array(a),s=new Uint8Array(r.length+i.length);return s.set(r),s.set(i,r.length),(0,o.bytesToBase64)(s)}catch(t){(0,n.showError)()&&console.log("encryptData failed",t);try{return JSON.stringify(e)}catch(e){}}},i=async(e,t)=>{try{const r=(0,o.base64ToBytes)(e),n=r.slice(0,12),a=r.slice(12),i=await crypto.subtle.decrypt({name:"AES-GCM",iv:n},t,a);return JSON.parse((new TextDecoder).decode(i))}catch(e){(0,n.showError)()&&console.log("decryptData failed",e)}};t.cryptoKey=async e=>{try{if(!e)return;const t=await crypto.subtle.importKey("raw",(new TextEncoder).encode(e),"PBKDF2",!1,["deriveKey"]);return await crypto.subtle.deriveKey({name:"PBKDF2",salt:(new TextEncoder).encode("salt"),iterations:1e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}catch(e){(0,n.showError)()&&console.log("processKey failed",e)}},t.encryptData=a,t.decryptData=i,t.encrypt=async e=>{try{return n.config?.encryptionKey?await a(e,n.config.encryptionKey):JSON.stringify(e)}catch(t){(0,n.showError)()&&console.log("encrypt failed",t);try{return JSON.stringify(e)}catch(e){}}},t.decrypt=async e=>{try{return n.config?.encryptionKey?await i(e,n.config.encryptionKey):JSON.parse(e)}catch(e){(0,n.showError)()&&console.log("decrypt failed",e)}}},247:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.readSecureSync=t.saveSecureSync=t.readSecure=t.saveSecure=void 0;const n=r(28),o=r(896),a=r(205),i=r(622);t.saveSecure=async({key:e,data:t})=>{try{return await(0,o.saveDB)({key:e,data:t?await(0,a.encrypt)(t):void 0,dbName:n.config.dbName,storeName:n.config.storeName})}catch(e){(0,n.showError)()&&console.log("saveSecure failed",e)}return!1},t.readSecure=async e=>{try{const t=await(0,o.readDB)({key:e,dbName:n.config.dbName,storeName:n.config.storeName});return t?await(0,a.decrypt)(t):void 0}catch(e){(0,n.showError)()&&console.log("readSecure failed",e)}},t.saveSecureSync=({key:e,data:t})=>{try{return void 0===t?localStorage.removeItem(e):localStorage.setItem(e,(0,i.encryptSync)(t)??""),!0}catch(e){(0,n.showError)()&&console.log("saveSecureSync failed",e)}return!1},t.readSecureSync=e=>{try{const t=localStorage.getItem(e);return t?(0,i.decryptSync)(t):void 0}catch(e){(0,n.showError)()&&console.log("readSecureSync failed",e)}}},421:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.readData=t.saveData=void 0;const n=r(28);t.saveData=({key:e,data:t})=>{try{void 0===t?localStorage.removeItem(e):localStorage.setItem(e,JSON.stringify(t))}catch(e){(0,n.showError)()&&console.log("saveData failed",e)}},t.readData=e=>{try{const t=localStorage.getItem(e);return t?JSON.parse(t):void 0}catch(e){(0,n.showError)()&&console.log("readData failed",e)}}},622:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.decryptSync=t.encryptSync=t.decryptDataSync=t.encryptDataSync=void 0;const n=r(28),o=r(185),a=(e,t,r)=>{try{const n=new Uint8Array(e.length);for(let o=0;o<e.length;o++)n[o]=e[o]^255&t.charCodeAt(o%t.length)^r[o%r.length];return n}catch(e){(0,n.showError)()&&console.log("xorCipher failed",e)}},i=(e,t)=>{try{const r=crypto.getRandomValues(new Uint8Array(8)),i=(new TextEncoder).encode(JSON.stringify(e)),s=a(i,t,r),c=new Uint8Array(r.length+i.length);return c.set(r),s&&c.set(s,r.length),`${n.config.localStoragePrefix}${(0,o.bytesToBase64)(c)}`}catch(t){(0,n.showError)()&&console.log("encryptDataSync failed",t);try{return JSON.stringify(e)}catch(e){}}},s=(e,t)=>{try{const r=(0,o.base64ToBytes)(e.startsWith(n.config.localStoragePrefix)?e.slice(n.config.localStoragePrefix.length):e),i=r.slice(0,8),s=a(r.slice(8),t,i);return s?JSON.parse((new TextDecoder).decode(s)):void 0}catch(e){(0,n.showError)()&&console.log("decryptDataSync failed",e)}};t.encryptDataSync=i,t.decryptDataSync=s,t.encryptSync=e=>{try{return n.config?.encryptionKeyStr?i(e,n.config.encryptionKeyStr):JSON.stringify(e)}catch(t){(0,n.showError)()&&console.log("encryptSync failed",t);try{return JSON.stringify(e)}catch(e){}}},t.decryptSync=e=>{try{return n.config?.encryptionKeyStr?s(e,n.config.encryptionKeyStr):JSON.parse(e)}catch(e){(0,n.showError)()&&console.log("decryptSync failed",e)}}},896:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.readDB=t.saveDB=t.openDB=void 0;const n=r(28),o=({dbName:e,storeName:t,version:r=1}={})=>new Promise((o,a)=>{e=e||n.config.dbName;const i=indexedDB.open(e,r);i.onupgradeneeded=()=>{t=t||n.config.storeName;const e=i.result;e.objectStoreNames.contains(t)||e.createObjectStore(t,{keyPath:"id"})},i.onsuccess=()=>o(i.result),i.onerror=()=>{(0,n.showError)()&&console.log("openDB failed",i.error),a(i.error)}});t.openDB=o,t.saveDB=async({key:e,data:t,dbName:r,storeName:a})=>{try{const i=await o({dbName:r,storeName:a});return new Promise(r=>{const o=i.transaction([a],"readwrite").objectStore(a),s=t?o.put({id:e,data:t}):o.delete(e);s.onsuccess=()=>r(!0),s.onerror=()=>{(0,n.showError)()&&console.log("saveDB error",s.error),r(!1)},i.close()})}catch(e){(0,n.showError)()&&console.log("saveSecure failed",e)}return!1},t.readDB=async({key:e,dbName:t,storeName:r})=>{try{const a=await o({dbName:t,storeName:r});return new Promise(t=>{const o=a.transaction([r],"readonly").objectStore(r).get(e);o.onsuccess=()=>t(o?.result?.data),o.onerror=()=>{(0,n.showError)()&&console.log("readDB error",o.error),t(void 0)},a.close()})}catch(e){(0,n.showError)()&&console.log("readDB failed",e)}}},915:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.readLarge=t.saveLarge=void 0;const n=r(28),o=r(896);t.saveLarge=async({key:e,data:t})=>{try{return await(0,o.saveDB)({key:e,data:t?JSON.stringify(t):void 0,dbName:n.config.dbName,storeName:n.config.storeName})}catch(e){(0,n.showError)()&&console.log("saveLarge failed",e)}return!1},t.readLarge=async e=>{try{const t=await(0,o.readDB)({key:e,dbName:n.config.dbName,storeName:n.config.storeName});return t?JSON.parse(t):void 0}catch(e){(0,n.showError)()&&console.log("readLarge failed",e)}}}},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.cryptoKey=e.decryptDataSync=e.encryptDataSync=e.decryptData=e.encryptData=e.saveSecureSync=e.readSecureSync=e.saveSecure=e.readSecure=e.saveLarge=e.readLarge=e.saveData=e.readData=e.migrateSecure=e.config=e.configureStorageSync=e.configureStorage=void 0;const t=n(28);Object.defineProperty(e,"configureStorage",{enumerable:!0,get:function(){return t.configureStorage}}),Object.defineProperty(e,"configureStorageSync",{enumerable:!0,get:function(){return t.configureStorageSync}}),Object.defineProperty(e,"config",{enumerable:!0,get:function(){return t.config}}),Object.defineProperty(e,"migrateSecure",{enumerable:!0,get:function(){return t.migrateSecure}});const r=n(421);Object.defineProperty(e,"readData",{enumerable:!0,get:function(){return r.readData}}),Object.defineProperty(e,"saveData",{enumerable:!0,get:function(){return r.saveData}});const a=n(915);Object.defineProperty(e,"readLarge",{enumerable:!0,get:function(){return a.readLarge}}),Object.defineProperty(e,"saveLarge",{enumerable:!0,get:function(){return a.saveLarge}});const i=n(247);Object.defineProperty(e,"readSecure",{enumerable:!0,get:function(){return i.readSecure}}),Object.defineProperty(e,"saveSecure",{enumerable:!0,get:function(){return i.saveSecure}}),Object.defineProperty(e,"readSecureSync",{enumerable:!0,get:function(){return i.readSecureSync}}),Object.defineProperty(e,"saveSecureSync",{enumerable:!0,get:function(){return i.saveSecureSync}});const s=n(205);Object.defineProperty(e,"cryptoKey",{enumerable:!0,get:function(){return s.cryptoKey}}),Object.defineProperty(e,"decryptData",{enumerable:!0,get:function(){return s.decryptData}}),Object.defineProperty(e,"encryptData",{enumerable:!0,get:function(){return s.encryptData}});const c=n(622);Object.defineProperty(e,"encryptDataSync",{enumerable:!0,get:function(){return c.encryptDataSync}}),Object.defineProperty(e,"decryptDataSync",{enumerable:!0,get:function(){return c.decryptDataSync}})})();var a=t;for(var i in o)a[i]=o[i];o.__esModule&&Object.defineProperty(a,"__esModule",{value:!0})})()},69(e,t){(()=>{var e={125:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addZ=t.tN=t.monNm=t.tmUTC=t.tmAP=t.moYrDt=t.shortDt=t.fullLong=t.fullDate=t.fullDt=t.invDt=t.dayRes=t.timeStandard=t.dateStandard=t.seoDt=t.thisYear=t.oneMon=t.oneMin=t.oneHr=t.oneDay=t.oneSec=void 0;const r=()=>Date.now(),n=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],a=["st","nd","rd","th"],i=e=>0==+e?"00":+e<10&&+e>=1?`0${e}`:`${e}`,s=e=>{const t=new Date(e);return`${t.getUTCFullYear()}-${i(t.getUTCMonth()+1)}-${i(t.getUTCDate())}`},c=e=>i(e.getUTCHours())+`:${i(e.getUTCMinutes())}`+`:${i(e.getUTCSeconds())}`;t.tN=r,t.monNm=n,t.dayRes=90,t.oneSec=1e3,t.oneMin=6e4,t.oneHr=36e5,t.oneDay=864e5,t.oneMon=27e8,t.addZ=i,t.tmUTC=e=>{const t=new Date(e);return i(t.getUTCHours())+`:${i(t.getUTCMinutes())} UTC`},t.tmAP=e=>{const t=new Date(e),r=t.getHours();return i(r>12?r-12:r)+`:${i(t.getMinutes())}`+(r>=12?"pm":"am")},t.shortDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]}`},t.moYrDt=e=>{const t=new Date(e);return`${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDate=e=>{const t=new Date(e);return`${t.getDate()} ${n[t.getMonth()]} ${t.getFullYear()}`},t.fullLong=e=>`${(e=>{const t=new Date(e),r=t.getDate();return r+a[r<5?r-1:r>4&&r<21?3:r>20&&r<25?r-21:r>24&&r<31?3:0]+` of ${n[t.getMonth()]}`})(e)} ${new Date(e).getFullYear()}`,t.thisYear=e=>(e?new Date(e):new Date)?.getUTCFullYear(),t.dateStandard=s,t.timeStandard=c,t.seoDt=e=>{!e&&(e=r());const t=new Date(e);return`${s(t)}T${c(t)}Z`},t.invDt=e=>{const t=new Date(e);return`${t.getUTCFullYear()}`.split("20")[1]+i(t.getUTCMonth()+1)+i(t.getUTCDate())+`${e}`.slice(10)}},240:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.idRandLong=t.idRandShort=t.idShuffle=void 0;const r=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","@",".","_","0","1","2","3","4","5","6","7","8","9"];t.idShuffle=async({data:e,password:t})=>4==t?.length?(({data:e,password:t})=>{try{const n=(e,t)=>r.includes(e.toLowerCase())?r[(r.indexOf(e.toLowerCase())+Math.pow(t,3))%r.length]:e;return[...e].map(e=>n(e,Number(t))).join("")}catch{return""}})({data:e,password:t}):await(async({data:e,password:t})=>{if(!e||!t)return"";try{crypto.subtle;const r=new TextEncoder,n=r.encode(e),o=r.encode(t),a=await crypto.subtle.digest("SHA-256",o),i=new Uint8Array(a),s=i.slice(0,32),c=i.slice(0,12),l=await crypto.subtle.importKey("raw",s,{name:"AES-GCM"},!1,["encrypt"]),d=await crypto.subtle.encrypt({name:"AES-GCM",iv:c},l,n);return btoa(String.fromCharCode(...new Uint8Array(d))).replace(/\+/g,"a").replace(/\//g,"b").replace(/=/g,"c").toLowerCase()}catch{return""}})({data:e,password:t}),t.idRandShort=(e=10)=>{try{return crypto.randomUUID()?.replaceAll("-","")?.slice(0,e)}catch(e){return console.log("idRandShort failed",e),""}},t.idRandLong=(e=10)=>{try{const t="abcdefghijklmnopqrstuvwxyz",r=new Uint8Array(e);return crypto.getRandomValues(r),Array.from(r).map(e=>t[e%26]).join("")}catch(e){return console.log("idRandLong failed",e),""}}},246:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.cacheCheck=t.delayCode=void 0;const n=r(125);t.delayCode=async(e=0)=>await new Promise(t=>setTimeout(t,e)),t.cacheCheck=({analysisCacheLimit:e,lastUpdated:t,forceRefresh:r})=>{const o=Date.now();if(t&&(!r&&t>o-e||r&&t>o-n.oneDay))return!0}},792:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isEven=t.pNum=t.sharpeRatio=t.priceVariations=t.nTxtAr=t.zNum=t.addCom=t.adjNum=t.rNum=void 0;const r=[1,.1,.01,.001,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10,1e-11,1e-12,1e-13,1e-14,1e-15,1e-16,1e-17,1e-18,1e-19],n=(e,t=6)=>{const n=+e,o=n?Math.abs(n):0,a=o>1&&t?t-`${Math.round(o)}`.length:0;return n?(n<0?-1:1)*(Number.isInteger(o)||o<1e-16?o:o>1e5?Math.round(o):o>1?Number(o.toFixed(a<0?0:a)):((e,t)=>{let n=0;for(const o of r){if(o<e)return Number(e.toFixed(t+n-1));n++}return e})(o,t)):e},o=(e,t)=>{const r=(n(e,t)+"").split(".");return r[0]=r[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),r.join(".")},a=(e,t=3)=>{const r=Number(e);if(!e||!r)return e+"";const a=Math.abs(r);return(r<0?"-":"")+(a>1e9?o(a/1e9,t)+"b":a>1e6?o(a/1e6,t)+"m":a<1e-6&&a>1e-16?(1+n(a,t)+"").replace(/1./g,"0."):o(a,t))};t.nTxtAr=["zero","one","two","three","four","five","six","seven","eight","nine","ten"],t.rNum=n,t.addCom=o,t.adjNum=a,t.zNum=e=>{const t=Number(e);let r=t?Math.abs(t):0,n=1e10;for(;n>1;)r>n&&(r=Math.round(r/(n/10))*(n/10)),n/=10;return t?(t<0?"-":"")+a(r,2):e},t.pNum=e=>+e||0==+e?Math.round(1e6*+e)/1e6:null,t.priceVariations=e=>{try{let t=0;const r=[...e].sort((e,t)=>e[0]-t[0]),n=e.reduce((e,[,t])=>e+t,0),o=r.find(([,e])=>(t+=e,t>=n/2))[0];return e.filter(([e])=>Math.abs(e-o)/o<.05).map(([e])=>e)}catch{return[]}},t.sharpeRatio=({assetPrices:e,minExpectedReturn:t=.05})=>{if(!e?.length||e?.length<2)return 0;const r=e.slice(1).map((t,r)=>(t-e[r])/e[r]),n=r.reduce((e,t)=>e+t,0)/r.length,o=Math.sqrt(r.reduce((e,t)=>e+Math.pow(t-n,2),0)/r.length);return(n-t)/o},t.isEven=e=>e%2==0},794:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restoreObj=t.restoreObjStr=t.storeObj=t.storeObjStr=t.objNestValueCount=t.objLen=t.objSortSimple=t.objSort=void 0;const n=r(125),o=e=>{try{return Object.keys(e||{})?.length||0}catch(e){return console.log(e),0}},a=e=>{try{return e?.replace(/"/g,"'")}catch(e){return console.log((0,n.tN)(),"storeObjStr failed",e),""}},i=e=>{try{return e?.toString()?.replace(/'/g,'"')}catch(e){console.log((0,n.tN)(),"restoreObjStr failed",e)}};t.objLen=o,t.objNestValueCount=e=>{let t=0;if(o(e))for(const r in e)t+=o(e[r])?1:0;return t},t.objSort=(e={},t,r=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,n])=>null===e[t]||void 0===e[t]?1:null===n[t]||void 0===n[t]?-1:e[t]>n[t]?1*r:-1*r)),t.objSortSimple=(e={},t=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,r])=>null==e?1:null==r?-1:e>r?1*t:-1*t)),t.storeObjStr=a,t.storeObj=e=>{try{return a(JSON.stringify(e))}catch(e){return console.log((0,n.tN)(),"storeObj failed",e),""}},t.restoreObjStr=i,t.restoreObj=e=>{try{if(!e)return;const t=i(e);return t?JSON.parse(t):void 0}catch(e){console.log((0,n.tN)(),"restoreObj failed",e)}}},830:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.phaseDifference=t.compareArrays=t.squeezeArray=t.forecastNextTotal=t.forecastNext=t.getMax=t.getMean=t.getSum=t.maxVl=t.minVl=t.sumArr=void 0;const r=e=>{try{return e?.length?e.reduce((e,t)=>e+t):0}catch(e){return console.log("sumArr failed",e),0}},n=e=>{try{return e?.length?e.reduce((e,t)=>e+t,0):0}catch(e){return console.log("getSum failed",e),0}},o=e=>{try{return e?.length?n(e)/e.length:0}catch(e){return console.log("getMean failed",e),0}},a=e=>{try{return e?.length?Math.max(...e):0}catch(e){return console.log("getMax failed",e),0}},i=e=>{try{if(!e?.length)return 0;const t=[...e].sort((e,t)=>e-t),r=Math.floor(t.length/2);return t.length%2?t[r]:(t[r-1]+t[r])/2}catch(e){return console.log("median failed",e),0}},s=({currentPeriod:e,steps:t=1})=>{try{const r=(Array.isArray(e)?e:[]).filter(Number.isFinite);if(!r.length||t<=0)return[];if(r.length<2){const e=Math.max(0,o(r));return Array.from({length:t},()=>e)}const n=r.length,{slope:s,intercept:c}=(e=>{try{const t=e.length,r=[];for(let n=0;n<t-1;n++)for(let o=n+1;o<t;o++)r.push((e[o]-e[n])/(o-n));const n=i(r);return{slope:n,intercept:i(e.map((e,t)=>e-n*t))}}catch(e){return console.log("theilSen failed",e),{slope:0,intercept:0}}})(r),l=c+s*(n-1),d=a(r),u=d>0?3*d:1/0;return Array.from({length:t},(e,t)=>{const r=t+1,o=l+s*n*Math.log1p(r/n);return Math.max(0,Math.min(o,u))})}catch(e){return console.log("forecastNext failed",e),[]}};t.sumArr=r,t.maxVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]>r&&(r=o[t])}return r},t.minVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]<r&&(r=o[t])}return r},t.getSum=n,t.getMean=o,t.getMax=a,t.forecastNext=s,t.forecastNextTotal=e=>{try{const t=s({currentPeriod:e,steps:e?.length});return n(t)}catch(e){return console.log("forecastNextTotal failed",e),0}},t.squeezeArray=({arr:e,targetLength:t})=>{try{if(!e||0===e.length||t<=0)throw new Error("Invalid input");const n=Math.ceil(e.length/t);return Array.from({length:t},(t,o)=>{const a=o*n,i=Math.min(a+n,e.length),s=e.slice(a,i);return r(s)}).slice(0,t)}catch(e){return console.log("squeezeArray failed",e),[]}},t.compareArrays=({arrays:e})=>{try{const t=[...e],n=Math.min(...t.map(e=>e.length));for(let e=0;e<t.length;e++)t.splice(n);const o=t.map(e=>r(e)),a=[],i=Math.min(...o),s=o.indexOf(i),c=i/Math.max(...o);for(let e=0;e<t.length;e++){const r=t[e];if(a[e]=[],e==s)a[e]=r;else for(let t=0;t<r.length;t++)a[e].push(c*r[t])}return a}catch(t){return console.log("compareArrays failed",t),e}},t.phaseDifference=({array1:e,array2:t})=>{try{let r=e.length,n=e.reduce((e,t)=>e+t)/r,o=t.reduce((e,t)=>e+t)/r,a=e.map(e=>e-n),i=t.map(e=>e-o),s=Math.floor(r/2),c=-1/0,l=0;for(let e=-s;e<=s;e++){let t=0,n=0,o=0,s=0;for(let c=0;c<r;c++){let l=c+e;l>=0&&l<r&&(t+=a[c]*i[l],n+=a[c]*a[c],o+=i[l]*i[l],s++)}if(n>0&&o>0&&s>=.8*r){let r=t/Math.sqrt(n*o);r>c&&(c=r,l=e)}}return l}catch(e){return console.log("phaseDifference failed",e),0}}}},r={};function n(t){var o=r[t];if(void 0!==o)return o.exports;var a=r[t]={exports:{}};return e[t](a,a.exports,n),a.exports}var o={};(()=>{var e=o;Object.defineProperty(e,"__esModule",{value:!0}),e.idShuffle=e.isEven=e.pNum=e.nTxtAr=e.zNum=e.addCom=e.adjNum=e.rNum=e.sharpeRatio=e.priceVariations=e.timeStandard=e.dateStandard=e.addZ=e.tN=e.monNm=e.tmUTC=e.tmAP=e.moYrDt=e.shortDt=e.fullLong=e.fullDate=e.fullDt=e.invDt=e.dayRes=e.thisYear=e.seoDt=e.oneMon=e.oneMin=e.oneHr=e.oneDay=e.oneSec=e.restoreObj=e.restoreObjStr=e.storeObj=e.storeObjStr=e.objSortSimple=e.objSort=e.objNestValueCount=e.objLen=e.phaseDifference=e.compareArrays=e.squeezeArray=e.forecastNextTotal=e.forecastNext=e.getMax=e.getMean=e.getSum=e.maxVl=e.minVl=e.sumArr=void 0,e.cacheCheck=e.delayCode=e.idRandLong=e.idRandShort=void 0;const t=n(246);Object.defineProperty(e,"cacheCheck",{enumerable:!0,get:function(){return t.cacheCheck}}),Object.defineProperty(e,"delayCode",{enumerable:!0,get:function(){return t.delayCode}});const r=n(830);Object.defineProperty(e,"sumArr",{enumerable:!0,get:function(){return r.sumArr}}),Object.defineProperty(e,"minVl",{enumerable:!0,get:function(){return r.minVl}}),Object.defineProperty(e,"maxVl",{enumerable:!0,get:function(){return r.maxVl}}),Object.defineProperty(e,"getMax",{enumerable:!0,get:function(){return r.getMax}}),Object.defineProperty(e,"getMean",{enumerable:!0,get:function(){return r.getMean}}),Object.defineProperty(e,"getSum",{enumerable:!0,get:function(){return r.getSum}}),Object.defineProperty(e,"forecastNext",{enumerable:!0,get:function(){return r.forecastNext}}),Object.defineProperty(e,"forecastNextTotal",{enumerable:!0,get:function(){return r.forecastNextTotal}}),Object.defineProperty(e,"squeezeArray",{enumerable:!0,get:function(){return r.squeezeArray}}),Object.defineProperty(e,"compareArrays",{enumerable:!0,get:function(){return r.compareArrays}}),Object.defineProperty(e,"phaseDifference",{enumerable:!0,get:function(){return r.phaseDifference}});const a=n(240);Object.defineProperty(e,"idRandLong",{enumerable:!0,get:function(){return a.idRandLong}}),Object.defineProperty(e,"idRandShort",{enumerable:!0,get:function(){return a.idRandShort}}),Object.defineProperty(e,"idShuffle",{enumerable:!0,get:function(){return a.idShuffle}});const i=n(792);Object.defineProperty(e,"addCom",{enumerable:!0,get:function(){return i.addCom}}),Object.defineProperty(e,"adjNum",{enumerable:!0,get:function(){return i.adjNum}}),Object.defineProperty(e,"priceVariations",{enumerable:!0,get:function(){return i.priceVariations}}),Object.defineProperty(e,"nTxtAr",{enumerable:!0,get:function(){return i.nTxtAr}}),Object.defineProperty(e,"rNum",{enumerable:!0,get:function(){return i.rNum}}),Object.defineProperty(e,"zNum",{enumerable:!0,get:function(){return i.zNum}}),Object.defineProperty(e,"sharpeRatio",{enumerable:!0,get:function(){return i.sharpeRatio}}),Object.defineProperty(e,"pNum",{enumerable:!0,get:function(){return i.pNum}}),Object.defineProperty(e,"isEven",{enumerable:!0,get:function(){return i.isEven}});const s=n(125);Object.defineProperty(e,"oneSec",{enumerable:!0,get:function(){return s.oneSec}}),Object.defineProperty(e,"oneDay",{enumerable:!0,get:function(){return s.oneDay}}),Object.defineProperty(e,"oneHr",{enumerable:!0,get:function(){return s.oneHr}}),Object.defineProperty(e,"oneMin",{enumerable:!0,get:function(){return s.oneMin}}),Object.defineProperty(e,"oneMon",{enumerable:!0,get:function(){return s.oneMon}}),Object.defineProperty(e,"seoDt",{enumerable:!0,get:function(){return s.seoDt}}),Object.defineProperty(e,"dayRes",{enumerable:!0,get:function(){return s.dayRes}}),Object.defineProperty(e,"invDt",{enumerable:!0,get:function(){return s.invDt}}),Object.defineProperty(e,"fullDt",{enumerable:!0,get:function(){return s.fullDt}}),Object.defineProperty(e,"fullDate",{enumerable:!0,get:function(){return s.fullDate}}),Object.defineProperty(e,"fullLong",{enumerable:!0,get:function(){return s.fullLong}}),Object.defineProperty(e,"shortDt",{enumerable:!0,get:function(){return s.shortDt}}),Object.defineProperty(e,"moYrDt",{enumerable:!0,get:function(){return s.moYrDt}}),Object.defineProperty(e,"tmAP",{enumerable:!0,get:function(){return s.tmAP}}),Object.defineProperty(e,"tmUTC",{enumerable:!0,get:function(){return s.tmUTC}}),Object.defineProperty(e,"monNm",{enumerable:!0,get:function(){return s.monNm}}),Object.defineProperty(e,"tN",{enumerable:!0,get:function(){return s.tN}}),Object.defineProperty(e,"addZ",{enumerable:!0,get:function(){return s.addZ}}),Object.defineProperty(e,"timeStandard",{enumerable:!0,get:function(){return s.timeStandard}}),Object.defineProperty(e,"dateStandard",{enumerable:!0,get:function(){return s.dateStandard}}),Object.defineProperty(e,"thisYear",{enumerable:!0,get:function(){return s.thisYear}});const c=n(794);Object.defineProperty(e,"objSort",{enumerable:!0,get:function(){return c.objSort}}),Object.defineProperty(e,"objLen",{enumerable:!0,get:function(){return c.objLen}}),Object.defineProperty(e,"objNestValueCount",{enumerable:!0,get:function(){return c.objNestValueCount}}),Object.defineProperty(e,"restoreObj",{enumerable:!0,get:function(){return c.restoreObj}}),Object.defineProperty(e,"restoreObjStr",{enumerable:!0,get:function(){return c.restoreObjStr}}),Object.defineProperty(e,"storeObj",{enumerable:!0,get:function(){return c.storeObj}}),Object.defineProperty(e,"storeObjStr",{enumerable:!0,get:function(){return c.storeObjStr}}),Object.defineProperty(e,"objSortSimple",{enumerable:!0,get:function(){return c.objSortSimple}})})();var a=t;for(var i in o)a[i]=o[i];o.__esModule&&Object.defineProperty(a,"__esModule",{value:!0})})()}};const o={};function a(e){const t=o[e];if(void 0!==t)return t.exports;const r=o[e]={exports:{}};return n[e](r,r.exports,a),r.exports}var i,s,c,l,d,u,g,m,p,f,y,h;let w;a.m=n,a.d=(e,t)=>{for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},a.f={},a.e=e=>{const t=[];return a.f.j(e,t),Promise.all(t)},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{const e={520:()=>import("./engine-litert.node.min.mjs"),924:()=>import("./engine-wllama.node.min.mjs")},t={792:0},r=e=>{let{__webpack_esm_ids__:r,__webpack_esm_modules__:n,__webpack_esm_runtime__:o}=e;var i,s,c=0;for(i in n)a.o(n,i)&&(a.m[i]=n[i]);for(o&&o(a);c<r.length;c++)s=r[c],a.o(t,s)&&t[s]&&t[s][0](),t[s]=0};a.f.j=(n,o)=>{let i=a.o(t,n)?t[n]:void 0;if(0!==i)if(i)o.push(i[1]);else{let a=e[n]().then(r,e=>{throw 0!==t[n]&&(t[n]=void 0),e});a=Promise.race([a,new Promise(e=>i=t[n]=[e])]),o.push(i[1]=a)}}})(),function(e){e.system="system",e.user="user",e.assistant="assistant"}(i||(i={})),function(e){e[e.online=0]="online",e[e.away=1]="away",e[e.offline=2]="offline"}(s||(s={})),function(e){e[e.idle=0]="idle",e[e.downloading=1]="downloading",e[e.ready=2]="ready",e[e.error=3]="error",e[e.unsupported=4]="unsupported"}(c||(c={})),function(e){e.cpu="cpu",e.gpu="gpu",e.none="none"}(l||(l={})),function(e){e.download="download",e.load="load"}(d||(d={})),function(e){e.analyze="analyze",e.describe="describe",e.translate="translate",e.tags="tags",e.translateTags="translateTags"}(u||(u={})),function(e){e.translate="translate",e.tags="tags",e.translateTags="translateTags"}(g||(g={})),function(e){e.model="model",e.limits="limits",e.logging="logging",e.onStatus="onStatus"}(m||(m={})),function(e){e.quota="QuotaExceededError",e.notAllowed="NotAllowedError",e.notSupported="NotSupportedError",e.invalidState="InvalidStateError",e.typeMismatch="TypeMismatchError",e.security="SecurityError"}(p||(p={})),function(e){e.qwen3_vl_2b="qwen3-vl-2b",e.qwen3_vl_2b_instruct="qwen3-vl-2b-instruct",e.qwen3_vl_2b_instruct_q3="qwen3-vl-2b-instruct-q3",e.gemma4_e2b_limited="gemma4-e2b-limited"}(f||(f={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(y||(y={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(h||(h={}));const b=[{id:f.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:f.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:f.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:f.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}}],v=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},S=e=>e.litert?v()?16384:32768:v()?4096:8192,x=e=>e?b.find(t=>t.id==e):void 0,M=async()=>{const e="undefined"==typeof navigator?void 0:navigator.gpu;if(!e)return!1;let t;try{return!!await Promise.race([e.requestAdapter({powerPreference:"high-performance"}),new Promise(e=>{t=setTimeout(()=>e(void 0),1500)})])}catch{return!1}finally{t&&clearTimeout(t)}},j=async e=>x(e??await(async()=>(w||(w=(async()=>await M()?f.gemma4_e2b_limited:f.qwen3_vl_2b)()),await w))()),k=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,P=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio;var D=a(69);const _=()=>{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},T=()=>{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},N={width:384,height:384},O=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},E=async(e,t,r=128)=>{if(!e||"function"!=typeof fetch||"function"!=typeof createImageBitmap)return e;try{const n=await fetch(e),o=await createImageBitmap(await n.blob()),a=t??((e,t,r=128)=>{let n=32,o=32,a=1/0,i=1/0;const s=e/Math.max(1,t);for(let e=1;e<=r;e++){const t=Math.ceil(r/e),c=Math.floor((r+8)/e);for(let r=t;r<=c;r++){const t=r*e,c=Math.abs(r/e-s);(c<a-1e-9||Math.abs(c-a)<=1e-9&&t<i)&&(n=32*r,o=32*e,a=c,i=t)}}return{width:n,height:o}})(o.width,o.height,r),i=o.width/Math.max(1,o.height),s=a.width/a.height,c=Math.min(o.width,i>s?o.height*s:o.width),l=Math.min(o.height,i>s?o.height:o.width/s),d=(o.width-c)/2,u=(o.height-l)/2,g=((e,t)=>{if("undefined"!=typeof OffscreenCanvas)return new OffscreenCanvas(e,t);if("undefined"==typeof document)return;const r=document.createElement("canvas");return r.width=e,r.height=t,r})(a.width,a.height),m=g?g.getContext("2d"):null;if(!g||!m||o.width<1||o.height<1)return o.close(),e;if(m.drawImage(o,d,u,c,l,0,0,a.width,a.height),o.close(),(e=>"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas)(g)){const t=await g.convertToBlob({type:"image/jpeg",quality:.85});return await(e=>new Promise(t=>{if("undefined"==typeof FileReader)return void t("");const r=new FileReader;r.onerror=()=>t(""),r.onload=()=>t(`${r.result}`),r.readAsDataURL(e)}))(t)||e}return g.toDataURL("image/jpeg",.85)}catch{return e}},C={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,imageTokens:128,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:32,gpuShare:1},L=(e,t)=>{let r=0;for(const n of e)if("string"!=typeof n.content)for(const e of n.content)r+="text"==e.type?e.text.length/4:t;else r+=n.content.length/4;return Math.round(r)},A=({model:e,limits:t,messages:r,reasoning:n})=>{const o=S(e),a=((e,t,r)=>{const n=[...e];for(;L(n,r)>t&&!(n.filter(e=>"user"==e.role).length<2);){const e="system"==n[0]?.role?1:2;n.splice(e,"assistant"==n[e+1]?.role?2:1)}return n})(r,o-64-128,t.imageTokens),i=o-L(a,t.imageTokens)-128;return{messages:a,maxTokens:Math.max(64,Math.min(n?t.maxReasoningTokens:t.maxReplyTokens,i))}},R=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,$=(e={},t=!1)=>{const r=C;return{maxReplyTokens:R(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:R(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:R(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:R(e.maxImages,r.maxImages,0),imageTokens:R(e.imageTokens,r.imageTokens,1),maxAudio:R(e.maxAudio,r.maxAudio,0),maxContentLength:R(e.maxContentLength,r.maxContentLength,1),promptCharBudget:R(e.promptCharBudget,r.promptCharBudget,1),maxThreads:R(e.maxThreads,r.maxThreads,1),gpuShare:"number"==typeof e.gpuShare&&Number.isFinite(e.gpuShare)&&e.gpuShare>0?Math.min(1,Math.max(.05,e.gpuShare)):r.gpuShare}},U=(e,t,r=.7,n)=>({stream:!0,temperature:r,max_tokens:n??(t?e.maxReasoningTokens:e.maxReplyTokens)}),q=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,B=e=>Number(e.headers.get("content-length"))||0,z=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),I=e=>z(e,"image"),K=e=>z(e,"audio"),F=["<|channel>thought\n","<|channel>thought"],W=["<channel|>"],V=(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,G=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,J=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...G(e),{type:"text",text:"\n"},...G(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r},Y=v()?3e6:3e5,H=Math.max(Y,84e4);class Q extends Error{}const Z=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new Q(r)),t)})])}finally{n&&clearTimeout(n)}},X=e=>{try{Promise.resolve(e.next?.()).catch(()=>{}).finally(()=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}})}catch{}},ee=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,onPromptSpeed:a,promptTokens:i,start:s,stopped:c,firstTimeoutMs:l=Y,idleTimeoutMs:d=3e4,onStall:u})=>{let g,m="",p="",f="",y=!1,h=!1,w=!1,b=0,v=0,S=0,x=0,M=0,j=0,k=0;const P=e=>{!Number.isFinite(e)||e<=0||(b=(0,D.rNum)(e),a?.(b))},_=()=>{if(y||w||!i)return;const e=performance.now()-M;e>0&&P(1e3*i/e)},T=()=>{null!=g&&(clearInterval(g),g=void 0)},N=e=>{if(!e)return;const t=performance.now(),r=e.n_prompt_tokens_processed??e.processed;if("number"!=typeof r||r<=0)return;w=!0,T();let n=0;n="number"==typeof e.time_ms&&e.time_ms>0?1e3*r/e.time_ms:v?1e3*(r-S)/Math.max(1,t-v):1e3*r/Math.max(1,t-M),t-x<500||(x=t,v=t,S=r,P(n))};a&&i&&(g=setInterval(_,500));const O=((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,W);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,W);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,F);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,F);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{p+=e,r(e)},e=>{m+=e,n(e)});try{M=performance.now();const e=s();Promise.resolve(e).catch(()=>{});const n=(await Z(e,l,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(c()){X(n);break}let e;try{const t=n.next();Promise.resolve(t).catch(()=>{}),e=await Z(t,y?d:l,y?"Model stopped responding":"Model did not reply")}catch(e){if(e instanceof Q&&(m||p)){u?.(),X(n),t&&console.log("Local chat stalled",e);break}throw e}if(e.done)break;const a=e.value,i=a?.choices?.[0],s=i?.delta,g="string"==typeof s?.reasoning_content?s.reasoning_content:"string"==typeof s?.reasoning?s.reasoning:"",w=!!g||!!s?.content||!!i?.finish_reason,v=a?.timings?.prompt_per_second;if(w){if(y||(N(a?.prompt_progress),b||_(),y=!0,T()),!h&&"number"==typeof v&&Number.isFinite(v)&&v>0&&(h=!0,P(v)),i?.finish_reason&&(f=i.finish_reason),g&&(p+=g,r(g)),s?.content&&O.feed(s.content),g||s?.content){const e=performance.now();j||(k=e),j+=1,j>1&&e>k&&o?.((0,D.rNum)(1e3*j/(e-k)))}}else N(a?.prompt_progress),!h&&"number"==typeof v&&Number.isFinite(v)&&v>0&&(h=!0,P(v),T())}O.flush()}catch(e){if(t&&console.log("Local chat failed",e),e instanceof Q&&!c())throw e}finally{T()}const E=c()?void 0:m||void 0;return t&&(console.log("Local chat reply",e.id,E?"****":""),console.log("Local chat finish",e.id,f||"none",m.length,p.length)),E},te=async({model:e,params:t,start:r,stopped:n,onStall:o})=>{const a=await(async(e,t,r=128)=>{const n=[];for(const o of e){if("string"==typeof o.content){n.push(o);continue}const e=[];for(const n of o.content)e.push("image"==n.type?{type:"image",url:await E(n.url,t,r)}:n);n.push({role:"user",content:e})}return n})(((e,t=C)=>{let r=0,n=t.maxImages,o=t.maxAudio;const a=t.maxContentLength,s=e.filter(e=>"string"==typeof e.content&&!!e.content.trim()||!(e.role!=i.user||!e.images?.length&&!e.audio?.length)),c=[],l=[];for(let e=s.length-1;e>=0;e--){const d=s[e],u=("string"==typeof d.content?d.content:"").slice(0,a),g=d.role==i.user?(d.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,n)):[],m=d.role==i.user?(d.audio||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,o)):[];if(u||g.length||m.length){if(u&&r+u.length>t.promptCharBudget)break;r+=u.length,n-=g.length,o-=m.length,d.role==i.system?c.unshift(u):d.role==i.assistant?l.unshift({role:"assistant",content:u}):l.unshift({role:"user",content:V(u,g,m)})}}for(;l.length&&"user"!=l[0].role;)l.shift();const d=[];for(const e of l){const t=d[d.length-1];"assistant"==t?.role&&"assistant"==e.role?t.content=`${t.content}\n${e.content}`:"user"==t?.role&&"user"==e.role?t.content=J(t.content,e.content):"assistant"==e.role?d.push({role:"assistant",content:e.content}):d.push({role:"user",content:e.content})}const u=c.join("\n\n"),g=[];return u&&g.push({role:"system",content:u}),g.push(...d),g})(t.messages,t.limits),e.litert?N:void 0,t.limits.imageTokens),s=A({model:e,limits:t.limits,messages:a,reasoning:t.reasoning});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,s.messages),await ee({model:e,logging:t.logging,onReason:t.onReason,onText:t.onText,onSpeed:t.onSpeed,onPromptSpeed:t.onPromptSpeed,promptTokens:L(s.messages,t.limits.imageTokens),start:()=>r(s.messages,s.maxTokens),stopped:n,onStall:o,firstTimeoutMs:I(s.messages)?H:Y})};let re=!1;const ne=33554432,oe=new Set([p.quota,p.notAllowed,p.notSupported,p.invalidState,p.typeMismatch,p.security]),ae=new Map,ie=new Set,se=e=>{let t=0;const r=(e.split("/").pop()||"model").replace(/[^\w.-]+/g,"_");for(let r=0;r<e.length;r++)t=31*t+e.charCodeAt(r)>>>0;return`${t.toString(16)}-${r}`},ce=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},le=async()=>{if(!re)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else re=!0},de=async()=>{try{if("undefined"==typeof navigator||!navigator.storage?.estimate)return;const e=await navigator.storage.estimate();return"number"==typeof e.quota&&e.quota>0?e.quota-(e.usage||0):void 0}catch{return}},ue=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},ge=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}},me=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{}},pe=async function*(e){for await(const t of e)yield t},fe=async e=>{try{for await(const[t,r]of pe(e))"file"==r.kind&&ce(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},ye=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await ge(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}},he=async(e,t)=>{const r=await ue(e,t);if(r){const e=await(async e=>await ge(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of pe(e)){const e=ce(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=>{let t=0;const r=[];for(const n of[...e].sort((e,t)=>e.start-t.start))if(n.size){if(n.start!=t)break;r.push(n),t+=n.size}return r})(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 ye(e,t)},we=(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:B(e)||t.total,etag:a||t.etag}},be=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:i})=>{let s,c,l=t,u=0,g=r;const m=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(l),{create:!0});c=await t.createWritable(),u=0},p=async()=>{const e=c;c=void 0,e&&await e.close()};try{const e=o.getReader();for(s=e;;){const{done:r,value:o}=await e.read();if(r)break;i();let s=0;for(g&&(s=Math.min(g,o.byteLength),g-=s);s<o.byteLength;){c||await m();const e=Math.min(ne-u,o.byteLength-s);await c.write({type:"write",position:u,data:o.slice(s,s+e)}),s+=e,u+=e,l+=e,u==ne&&await p()}l>t&&a(n?l/n:0,d.download)}await p()}catch(e){throw await p().catch(()=>{}),await(s?.cancel().catch(()=>{})),e}return l},ve=e=>e?.name==p.quota,Se=e=>{const t=async()=>{const t=await le();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await he(r,se(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{if(ie.has(r))throw new DOMException("Storage is full",p.quota);const a=`${e}|${r}`,i=ae.get(a);if(i)return await i;const s=await t();if(!s)return;const c=(async(e,t,r,n)=>{const o=se(t),a=await ye(e,o);if(a?.complete)return a;let i=await ue(e,o);i||(await e.removeEntry(o).catch(()=>{}),await e.removeEntry(`${o}.json`).catch(()=>{}),i=await e.getDirectoryHandle(o,{create:!0}));let s=0,c=0,l=!1;for(;;){if(r?.aborted)throw new Error("Cancelled");const a=await he(e,o);if(a?.complete)return a;const u=a?.size??0,g=a?.total||0,m=a?.etag||"";if(u>s)s=u,c=0;else if(++c>4)throw new Error("Model download failed");u&&g&&n(u/g,d.download);const f=g?Math.min(u+ne,g)-1:u+ne-1,y=new AbortController,h=()=>y.abort(),w={size:u,total:g,etag:m};let b,v=setTimeout(h,3e4);r?.addEventListener("abort",h,{once:!0});try{if(b=await fetch(t,{signal:y.signal,headers:{Range:`bytes=${u}-${f}`}}),416==b.status){if(await(b.body?.cancel().catch(()=>{})),g&&u>=g){await me(i,{total:g,etag:m,complete:!0});continue}await fe(i),await me(i,{total:0,etag:"",complete:!1});continue}if(!b.ok||!b.body)throw await(b.body?.cancel().catch(()=>{})),new Error("Model download failed");const r=we(b,w);if(!r){await b.body.cancel().catch(()=>{}),await fe(i),await me(i,{total:0,etag:"",complete:!1});continue}await me(i,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?u:0,s=r.start+a;if(!l&&r.total>s){l=!0;const e=await de();if(null!=e&&e<r.total-s)throw await b.body.cancel().catch(()=>{}),new DOMException("Storage is full",p.quota)}const c=await be({dir:i,start:s,skip:a,total:r.total,body:b.body,onProgress:n,onChunk:()=>{clearTimeout(v),v=setTimeout(h,3e4)}});if(!r.total){await me(i,{total:c,etag:r.etag,complete:!0});const t=await he(e,o);if(t)return t}}catch(e){if(r?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&oe.has(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*c))}finally{clearTimeout(v),r?.removeEventListener("abort",h)}}})(s,r,n,o).catch(e=>{throw ve(e)&&ie.add(r),e}).finally(()=>{ae.delete(a)});return ae.set(a,c),await c},remove:async e=>{ie.delete(e);const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,se(e))},purge:async()=>{ie.clear();const t=await le();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},xe=(e,...t)=>{!0===e&&console.log(...t)};let Me=!1,je=0;const ke="litertlm-models",Pe=Se("litert-store"),De={num_output_candidates:1,wait_for_weight_uploads:!0,num_decode_steps_per_sync:1,sequence_batch_size:0,supported_lora_ranks:[],max_top_k:40,enable_decode_logits:!1,enable_external_embeddings:!1,use_submodel:!1,use_autosized_ringbuffers:!0};let _e=1,Te=!1,Ne=0;const Oe=new WeakSet,Ee=(...e)=>{Me&&console.log(...e)},Ce=(...e)=>{Me&&console.error(...e)},Le=e=>e.replace(/<\|channel>thought\n?[\s\S]*?<channel\|>/g,"").replace(/<\|channel>thought[\s\S]*$/,"").trim(),Ae=async()=>{const e=performance.now(),t=e-Ne;if(Ne=e,!Te)return;const r=Math.round(((e,t=1)=>Math.min(500,Math.max(0,e*(1/t-1))))(t,_e));r<1||(await new Promise(e=>setTimeout(e,r)),Ne=performance.now())},Re=(e=1)=>{_e=e>0?e:1,Te=!0,Ne=performance.now()},$e=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(ke)}catch{return}},Ue=new Map,qe=(e,t,r)=>{let n=0;return e.pipeThrough(new TransformStream({transform:(e,o)=>{n+=e.byteLength,r(t?n/t:0,d.download),o.enqueue(e)}}))},Be=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 O(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},ze=(e,t)=>{if(e.role!=t.role)return!1;if("string"==typeof e.content||"string"==typeof t.content)return"string"==typeof e.content&&"string"==typeof t.content&&Le(e.content)==Le(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(Le(n.text)!=Le(o.text))return!1}else{if("text"==n.type||"text"==o.type)return!1;if(!!n.url!=!!o.url)return!1}}return!0},Ie=async function*({engine:e,mod:t,params:r,messages:n,maxTokens:o,session:a}){const i=n[n.length-1],s=U(r.limits,r.reasoning,r.temperature,o);if("user"!=i?.role)throw new Error("No user turn");const c=n.slice(0,-1),l=(await Be([i]))[0];if(!l)throw new Error("Empty prompt");let d;const u=a.reasoning==r.reasoning&&a.maxTokens==s.max_tokens,g=!!a.conversation&&((e,t)=>{const r="system"==e[0]?.role?e[0]:void 0,n="system"==t[0]?.role?t[0]:void 0;if(!r!=!n)return!1;if(r&&n&&!ze(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(!ze(o[i+e],a[e]))return!1;return!0})(a.sent,c);if(u&&g&&a.conversation)xe(Me,"LiteRT conversation reused",a.sent.length),d=a.conversation;else{const n=await Be(c,!1);a.conversation=void 0,a.sent=[];const o=performance.now();d=await e.createConversation({sessionConfig:{maxOutputTokens:s.max_tokens,samplerParams:{type:t.SamplerType.TOP_K,temperature:s.temperature,k:40,p:.95}},preface:{...n.length?{messages:n}:{},extra_context:{enable_thinking:r.reasoning}},prefillPrefaceOnInit:n.length>0}),xe(Me,"LiteRT conversation created",n.length,Math.round(performance.now()-o),"flags",u,"history",g),a.conversation=d,a.reasoning=r.reasoning,a.maxTokens=s.max_tokens,a.sent=[...c]}a.sent.push(i);let m,p=!1,f=!0,y="";const h=()=>{m&&m.cancel().catch(()=>{});try{Promise.resolve(d.cancel()).catch(()=>{})}catch{}};r.signal?.addEventListener("abort",h,{once:!0});try{if(r.signal?.aborted)return;const e=d.sendMessageStreaming(l).getReader();for(m=e;;){const t=performance.now(),{done:n,value:o}=await e.read().catch(e=>{if(r.signal?.aborted)return{done:!0,value:void 0};throw e}),a=performance.now()-t;if(n)break;const i=f;f=!1,i&&(xe(Me,"LiteRT first chunk",Math.round(a)),Re(r.limits.gpuShare));let s="string"==typeof o.content?o.content:"";const c={};if(Array.isArray(o.content))for(const e of o.content)"text"==e.type&&(s+=e.text);s&&(c.content=s,y+=s);const l=o.channels?.thought;l&&(c.reasoning=l),(c.content||c.reasoning)&&(yield{choices:[{delta:c}]})}p=!0}finally{Te=!1,r.signal?.removeEventListener("abort",h),p&&y?a.sent.push({role:"assistant",content:y}):(a.conversation=void 0,a.sent=[])}},Ke={backend:l.gpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o})=>{Me=!0===o;const i=e.litert;if(!i)throw new Error("Model has no LiteRT artifact");const s=S(e),c=await a.e(520).then(()=>a(507)),u=globalThis,g=u.Module;u.Module={print:Ee,printErr:Ce};try{await c.getOrLoadGlobalLiteRtLm(T().script)}finally{u.Module=g}if(n?.aborted)throw new Error("Cancelled");const m=c.getGlobalLiteRtLm(),p=m.liteRtLmWasm;if(await m.setupDefaultWebGpuDevice(),n?.aborted)throw new Error("Cancelled");const f=p.preinitializedWebGPUDevice;if(!f)throw new Error("No WebGPU device");if(!Oe.has(f)){const e=(({device:e,pace:t})=>new Proxy(e,{get:(e,r)=>{if("createBuffer"==r)return(...n)=>{const o=Reflect.get(e,r,e).apply(e,n),a=o.mapAsync;try{o.mapAsync=async(...e)=>{await a.apply(o,e),await t()}}catch{}return o};const n=Reflect.get(e,r,e);return"function"==typeof n?n.bind(e):n}}))({device:f,pace:Ae});Oe.add(f),Oe.add(e),p.preinitializedWebGPUDevice=e}let y,h=!1;const w=q(i.repo,i.file),b=await $e(),v=b?await b.match(w):void 0;if(v?.body)y=v.body;else{const e=await Pe.stored(w);e?.complete&&(y=e.file.stream())}if(!y){const e=await Pe.download({url:w,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");o&&console.log("Local model store failed",e),h=ve(e)});e&&(y=e.file.stream())}if(!y&&b&&!h)try{await(async(e,t,r,n)=>{const o=Ue.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=B(o),i=qe(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{Ue.delete(e)});return Ue.set(e,a),await a})(w,b,n,r);const e=await b.match(w);e?.body&&(y=e.body)}catch(e){if(n?.aborted)throw new Error("Cancelled");o&&console.log("Local model cache failed",e)}if(y||(y=await(async(e,t,r)=>{const n=await fetch(e,{signal:t});if(!n.ok||!n.body)throw new Error("Model download failed");return qe(n.body,B(n),r)})(w,n,r)),n?.aborted)throw new Error("Cancelled");r(1,d.load);const x=await c.Engine.create((({model:e,limits:t,contextSize:r,source:n,mod:o})=>{const a=e.litert;return{model:n,mainExecutorSettings:{maxNumTokens:r,...a?.vision?{maxNumImages:Math.max(1,t.maxImages)}:{},backendConfig:De},...a?.vision?{visionBackend:o.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...a?.audio?{audioBackend:o.Backend.CPU}:{}}})({model:e,limits:t,contextSize:s,source:y,mod:c}));je+=1;const M=()=>{je=Math.max(0,je-1),je||(e=>{try{const t=e.getGlobalLiteRtLm().liteRtLmWasm,r=t.preinitializedWebGPUDevice;t.preinitializedWebGPUDevice=void 0,t.WebGPU&&(t.WebGPU.preinitializedDeviceId=void 0),r?.destroy?.()}catch{}try{e.unloadLiteRtLm()}catch{}})(c)};try{const e=performance.now(),t=await x.createConversation();await t.delete(),xe(Me,"LiteRT conversation warm-up",Math.round(performance.now()-e))}catch(e){xe(Me,"LiteRT conversation warm-up failed",e)}if(n?.aborted)throw await x.delete(),M(),new Error("Cancelled");const j={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:l.gpu,contextSize:s,chat:t=>(async({engine:e,model:t,mod:r,params:n,session:o})=>{Me=!0===n.logging;const a=()=>{try{o.conversation?.cancel()}catch{}o.conversation=void 0,o.sent=[]};try{const i=await te({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async(a,i)=>{if(n.signal?.aborted)throw new Error("Cancelled");if(I(a)&&!t.litert?.vision)throw new Error("Model does not accept images");if(K(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return Ie({engine:e,mod:r,params:n,messages:a,maxTokens:i,session:o})}}),s=o.conversation;if(s&&n.onPromptSpeed&&!n.signal?.aborted){const e=await s.getBenchmarkInfo().catch(()=>{}),t=e?.lastPrefillTokensPerSecond;"number"==typeof t&&Number.isFinite(t)&&t>0&&n.onPromptSpeed((0,D.rNum)(t))}return i}catch(e){throw a(),e}})({engine:x,model:e,mod:c,params:t,session:j}),unload:async()=>{const e=j.conversation;j.conversation=void 0,j.sent=[];try{await(e?.delete())}catch{}await x.delete(),M()}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=q(t.repo,t.file),[n,o]=await Promise.all([$e(),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(ke)}catch{}}};let Fe,We,Ve="",Ge=!1;const Je=Se("wllama-store"),Ye=[f.qwen3_vl_2b_instruct,f.qwen3_vl_2b_instruct_q3],He=e=>e.cpu?.mmproj&&Ye.includes(e.id)?{image_min_tokens:16,image_max_tokens:128}:{},Qe=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Ze=e=>{const t=_();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},Xe=e=>{const t=e=>(...t)=>{Ge&&("string"==typeof t[0]&&t[0].includes("ggml_webgpu: Failed to get an adapter")||e(...t))};return{...e,log:t(e.log),warn:t(e.warn),error:t(e.error)}},et=async()=>{if(Fe)return Fe;const e=await a.e(924).then(()=>a(577)),t=We||Ze(),r=new e.Wllama({default:t.wasm},{logger:Xe(e.LoggerWithoutDebug)});return We||(We=t,Ve=Qe(t)),r.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),Fe=r,r},tt=async()=>{const e=Fe;Fe=void 0;try{await(e?.exit())}catch{}},rt=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),nt=e=>{const t=e.cpu;return t?[{name:t.file,url:q(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:q(t.mmproj.repo??t.repo,t.mmproj.file)}]:[]]:[]},ot=async e=>{const t=nt(e);if(!t.length)return!1;for(const e of t){const t=await Je.stored(e.url);if(!t?.complete)return!1}return!0},at=async(e,t,r,n)=>{const o=await fetch(e,{signal:n,headers:{Range:`bytes=${t}-${r-1}`}});if(206!=o.status)throw await(o.body?.cancel().catch(()=>{})),new Error("Model range failed");return await o.arrayBuffer()},it=async(e,t)=>{const r=await fetch(e,{method:"HEAD",signal:t});await(r.body?.cancel().catch(()=>{}));const n=Number(r.headers.get("content-length"))||0;if(!r.ok||!n)throw new Error("Model size unknown");return n},st=({url:e,stored:t,storedSize:r,total:n,signal:o})=>{const a=Math.max(0,Math.min(r,n));return{size:n,slice:(r,i)=>({arrayBuffer:async()=>{const s=Math.max(0,Math.min(r??0,n)),c=Math.max(s,Math.min(i??n,n));if(c<=s)return new ArrayBuffer(0);if(t&&c<=a)return await t.slice(s,c).arrayBuffer();if(!t||s>=a)return await at(e,s,c,o);const l=await t.slice(s,a).arrayBuffer(),d=await at(e,a,c,o),u=new Uint8Array(l.byteLength+d.byteLength);return u.set(new Uint8Array(l)),u.set(new Uint8Array(d),l.byteLength),u.buffer}})}},ct=async({model:e,signal:t,onProgress:r})=>{const n=nt(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await Je.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},lt=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 O(t.url)});t.push({role:"user",content:e})}return t},dt={backend:l.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:a})=>{Ge=!0===o;const i=S(e),s=e.cpu;if(!s)throw new Error("Model has no CPU artifact");const c=Ze(a),u=Qe(c);Fe&&u!=Ve&&await tt(),We=c,Ve=u;const g="undefined"!=typeof navigator?navigator.hardwareConcurrency:0,m=Math.min((e=>{const t=e||4;return Math.max(1,t-Math.max(1,Math.floor(t/5)))})(g),t.maxThreads),p=await et(),f=await ot(e),y=s.mmproj?.file;if(n?.aborted)throw await tt(),new Error("Cancelled");if(!f&&y){const e=await p.cacheManager.list(),t=e.some(e=>rt(e,s.file)),r=e.some(e=>rt(e,y));t&&!r&&await p.cacheManager.deleteMany(e=>rt(e,s.file))}const h={n_ctx:i,n_threads:m,n_parallel:1,warmup:!0,...e.reasoning?{reasoning_budget_tokens:t.maxThinkingTokens}:{reasoning_budget_tokens:0},n_gpu_layers:0,jinja:!0,ctx_shift:!0,n_keep:Math.max(64,Math.round(i/16)),...He(e)};try{let t=f?await ct({model:e,signal:n,onProgress:r}):void 0;t||(t=await(async(e,t)=>{const r=nt(t);if(!r.length)return;const n=(await e.modelManager.getModels().catch(()=>[])).find(e=>e.url==r[0].url);return n?await n.open().catch(()=>{}):void 0})(p,e)),t||(t=await ct({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");o&&console.log("Local model store failed",e)})),t||(t=await(async(e,t)=>{const r=[];for(const n of nt(e)){if(t?.aborted)throw new Error("Cancelled");const e=await Je.stored(n.url),o=e?.total||await it(n.url,t);if(!o)throw new Error("Model size unknown");r.push(st({url:n.url,stored:e?.file,storedSize:Math.min(e?.size||0,o),total:o,signal:t}))}return r})(e,n)),r(1,d.load),await p.loadModel(t,h)}catch(e){throw await tt(),e}if(n?.aborted)throw await tt(),new Error("Cancelled");const w=p.getLoadedContextInfo();if(!w.n_ctx)throw await tt(),new Error("Failed to create model context");return xe(o,"CPU engine ready",e.id,"cores","undefined"!=typeof navigator?navigator.hardwareConcurrency:0,"isolated","undefined"!=typeof crossOriginIsolated&&crossOriginIsolated,"requested",m,"multithread",p.isMultithread(),"active",p.getNumThreads(),"context",w.n_ctx,"batch",w.n_batch,"ubatch",w.n_ubatch),{model:e,backend:l.cpu,contextSize:i,chat:t=>(async(e,t,r)=>{if(Ge=!0===r.logging,e.isModelLoaded())return await te({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async(n,o)=>{if(I(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if(K(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await lt(n),...U(r.limits,r.reasoning,r.temperature,o),timings_per_token:!0,return_progress:!0,...r.repeatPenalty?{penalty_repeat:r.repeatPenalty}:{},abortSignal:r.signal,...t.reasoning||Ye.includes(t.id)?{chat_template_kwargs:{enable_thinking:r.reasoning}}:{}})}})})(p,e,t),unload:async()=>{if(Fe==p)await tt();else try{await p.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await ot(e)||await(async(e,t)=>{const r=nt(t),n=await e.modelManager.getModels().catch(()=>[]);return!!r.length&&n.some(e=>e.url==r[0].url)})(await et(),e))}catch{return!1}},purge:async()=>{try{await Je.purge()}catch{}try{const e=await et();await e.cacheManager.clear()}catch{}}},ut=((e={})=>{let t,r,n,o=c.idle;const a=e.engines?.cpu||dt,i=e.engines?.litert||Ke,s=new Map,u=new Map,g=new Map,m=new Map,p=new Map,f=new Map,y=new Map,h=new Map,w=new Map,b=t=>{if(e.backend!=l.none)return e.backend==l.cpu?t.cpu?a:void 0:e.backend==l.gpu?t.litert?i:void 0:t.litert&&"undefined"!=typeof navigator&&navigator.gpu&&"undefined"!=typeof WebAssembly?i:!t.cpu||"undefined"==typeof window&&"undefined"==typeof self&&"undefined"==typeof Worker||"undefined"==typeof WebAssembly?void 0:a},v=e=>e?s.get(e):t?s.get(t.id):void 0,S=e=>{o=e},x=async e=>{const r=s.get(e);r&&(s.delete(e),t?.id==e&&(t=[...s.values()].pop()?.model),s.size||u.size||S(c.idle),await r.unload())},M=async()=>{for(const e of[...s.keys()])await x(e)},j=(e,t,r)=>{const n={percent:Math.max(0,Math.min(1,t)),phase:r||d.download};p.set(e,n);for(const t of m.get(e)??[])t.report(n.percent,n.phase)},k=e=>{y.set(e,(y.get(e)??0)+1),f.get(e)?.abort(),f.delete(e);const t=u.get(e);t&&g.set(e,t),u.delete(e),m.delete(e),p.delete(e),h.set(e,c.idle),o!=c.downloading||u.size||s.size||S(c.idle)},P=(e,t,r)=>{const n=u.get(e);return n?new Promise(o=>{let a=!1;const i={report:t,settle:e=>{a||(a=!0,r?.removeEventListener("abort",s),o(e))}},s=()=>{((e,t)=>{const r=m.get(e);r&&m.set(e,r.filter(e=>e!=t)),queueMicrotask(()=>{!m.get(e)?.length&&u.has(e)&&k(e)})})(e,i),i.settle(!1)},c=m.get(e);c?c.push(i):m.set(e,[i]),r?.aborted?s():r?.addEventListener("abort",s,{once:!0}),n.attempt.then(i.settle,()=>i.settle(!1))}):Promise.resolve(!1)},D=async e=>{if(e)await x(e);else{for(const e of[...u.keys()])k(e);p.clear(),h.clear(),w.clear(),r=void 0,S(c.idle),await M()}};return{load:async({model:e,limits:n,assets:o,logging:a,signal:i,onProgress:l})=>{if(i?.aborted)return!1;if(s.has(e.id))return t=e,!0;if(u.has(e.id)){const t=p.get(e.id);return t&&l(t.percent,t.phase),await P(e.id,l,i)}const v=b(e);if(!v){const t="Model is not supported on this device";return r=t,w.set(e.id,t),h.set(e.id,c.unsupported),S(c.unsupported),!1}const x=[...u.values(),...g.values()];for(const e of x)k(e.model.id);const D=(y.get(e.id)??0)+1;let _;y.set(e.id,D);const T=(async()=>{if(await Promise.all(x.map(e=>e.attempt.catch(()=>!1))),D!=y.get(e.id))return!1;if(await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})(),D!=y.get(e.id))return!1;if(await M(),D!=y.get(e.id))return!1;const i=await v.cached(e);if(D!=y.get(e.id))return!1;r=void 0,w.delete(e.id),h.set(e.id,c.downloading),S(c.downloading),j(e.id,0,d.download),i&&j(e.id,1,d.load);const l=new AbortController;f.set(e.id,l);try{const i=await v.startLLM({model:e,limits:n,logging:a,signal:l.signal,assets:o,onProgress:(t,r)=>{D==y.get(e.id)&&j(e.id,t,r)}});return D!=y.get(e.id)||l.signal.aborted?(await i.unload(),!1):(s.set(e.id,i),t=e,r=void 0,w.delete(e.id),h.set(e.id,c.ready),S(c.ready),j(e.id,1,d.load),!0)}catch(t){if(D!=y.get(e.id))return!1;const n=`${t?.message||`${t}`}`;return r=n,w.set(e.id,n),h.set(e.id,c.error),S(c.error),a&&console.log("Local model failed",t),!1}finally{f.get(e.id)==l&&f.delete(e.id)}})(),N=T.finally(()=>{g.get(e.id)==_&&g.delete(e.id),u.get(e.id)==_&&(u.delete(e.id),m.delete(e.id),p.delete(e.id))});return _={model:e,attempt:N},u.set(e.id,_),m.set(e.id,[]),await P(e.id,l,i)},chat:async e=>{if(!v(e.model))return;for(;n;)await n.catch(()=>{});const r=v(e.model);if(!r)return;t?.id!=r.model.id&&(t=r.model);const o=r.chat(e);n=o;try{return await o}finally{n==o&&(n=void 0)}},unload:D,clear:async()=>{const e=[...u.values(),...g.values()].map(e=>e.attempt);await D(),await Promise.all(e.map(e=>e.catch(()=>{}))),await Promise.all([a.purge(),i.purge()])},ready:e=>!!v(e),loading:e=>e?u.has(e):u.size>0,status:e=>v(e)?c.ready:e?u.has(e)?h.get(e)??c.downloading:w.has(e)?h.get(e)??c.error:c.idle:o,backend:e=>v(e)?.backend??l.none,error:e=>e?w.get(e):r,model:()=>t}})(),gt=(e,t,r)=>{const n=e.status(t),o=x(t);return{...t?{model:t}:{},availability:n==c.ready?s.online:n==c.error||n==c.unsupported?s.offline:s.away,status:n,backend:e.backend(t),supportsImages:!!o&&k(o),supportsAudio:!!o&&P(o),ready:e.ready(t),loading:e.loading(t),requesting:r.requesting,phase:r.phase,percent:r.percent,...r.error?{error:r.error}:{}}},mt=(e=>{let t,r=0;const n=t=>t.input.onStatus?.(gt(e,t.model??t.input.model,t));return o=>{t?.controller.abort();const a=e.ready(o.model),s={token:++r,input:o,controller:new AbortController,percent:a?100:0,phase:a?d.load:d.download,requesting:!1,cancelled:!1};return t=s,n(s),(async t=>{const{input:o}=t,a=!0===o.logging,s=await j(o.model);if(t.model=s?.id,t.token!=r)return;const c=o.messages.some(e=>e.role!=i.system&&"string"==typeof e.content&&!!e.content.trim()),l=o.messages.some(e=>e.role==i.user&&!!e.images?.some(e=>"string"==typeof e&&!!e)),u=o.messages.some(e=>e.role==i.user&&!!e.audio?.some(e=>"string"==typeof e&&!!e)),g=c||l||u;if(!s)return t.error="Unknown model",void n(t);if(!g)return t.error="No prompt",void n(t);const m=k(s),p=P(s);if(!(c||l&&m||u&&p))return u&&!p?t.error="Model does not accept audio":l&&!m&&(t.error="Model does not accept images"),void n(t);const f=$(o.limits,!!s.litert),y=await e.load({model:s,limits:f,logging:a,signal:t.controller.signal,onProgress:(e,o)=>{t.token==r&&(t.percent=Math.round(100*e),t.phase=o,n(t))}}).catch(e=>(t.token==r&&(t.error=`${e?.message||`${e}`}`),!1));if(t.token!=r)return;if(t.cancelled)return void n(t);if(!y)return t.error||(t.error=e.error(s.id)||"Model not ready"),void n(t);const h=l&&!m||u&&!p?o.messages.map(({images:e,audio:t,...r})=>({...r,...e&&m?{images:e}:{},...t&&p?{audio:t}:{}})):o.messages;t.requesting=!0,t.error=void 0,t.percent=100,t.phase=d.load,n(t);let w,b="",v="";try{w=await e.chat({model:s.id,messages:h,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||(v+=e,o.onResponse?.(v))},onSpeed:e=>{t.token!=r||t.cancelled||o.onSpeed?.(e)},onPromptSpeed:e=>{t.token!=r||t.cancelled||o.onPromptSpeed?.(e)},signal:t.controller.signal})}catch(o){if(t.token!=r)return;return t.requesting=!1,t.error=`${o?.message||`${o}`}`,t.cancelled||await e.unload(s.id).catch(()=>{}),void n(t)}t.token==r&&(t.requesting=!1,w||t.cancelled||(t.error="No reply",await e.unload(s.id).catch(()=>{})),n(t))})(s),()=>(t=>{t.token==r&&(t.cancelled=!0,t.controller.abort(),t.model&&e.status(t.model)==c.ready?e.unload(t.model).then(()=>n(t)):queueMicrotask(()=>n(t)))})(s)}})(ut),pt=(yt=ut,async(e={})=>{const t=await j(e.model),r=r=>e.onStatus?.(gt(yt,t?.id,r));if(!t)return r({requesting:!1,phase:d.download,percent:0,error:"Unknown model"}),!1;let n,o=0,a=d.download;const i=yt.ready(t.id);return await yt.load({model:t,limits:$(e.limits,!!t.litert),logging:!0===e.logging,onProgress:(e,t)=>{o=Math.round(100*e),a=t,r({requesting:!1,phase:a,percent:o})}}).catch(e=>(n=`${e?.message||`${e}`}`,!1))?(i&&r({requesting:!1,phase:d.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||yt.error(t.id)||"Model not ready"}),!1)}),ft=async()=>{await ut.clear()};var yt,ht=a(993);let wt;const bt="degreesign-chat-estimates-v1",vt={analyze:95,describe:25,translate:15,tags:6,translateTags:4},St=()=>wt??=(0,ht.readData)(bt)??{},xt=e=>{const t=e.map(e=>({operation:e,est:St()[e]??vt[e]}));return{totalEst:t.reduce((e,t)=>e+t.est,0),breakdown:t}},Mt=({operation:e,seconds:t})=>{t>0&&(wt={...St(),[e]:t},(0,ht.saveData)({key:bt,data:wt}))},jt=["You are describer of images","in detailed efficient manner.","You share descriptions after replacing","euphemisms with all specific terms.","You include visible organs/limbs,","with pose and actions, only for living things.","You always describe the overall nature,","state, pose, acts, positions, and locations.","You always give priority to interesting,","unusual, shocking, explicit,","or weird facts about the image.","You never: lie, use vague referrals,","use a general term when a precise term exists,","use euphemisms, nor include any part","of the message in your response."].join(" "),kt=["Describe this image in one detail blunt","concise paragraph, prioritize most","head-turning elements over mundane elements."].join(" "),Pt=e=>["You tag photos for a private photo gallery.","Read each numbered image description below","and reply with exactly one line per number.","Each line is the number, a colon,",`then exactly ${e}`,"comma separated single word tags","for the most prominent concrete","elements the photo shows.","Tag its main subjects, objects,","actions and place, never the medium or","filler ideas such as photo, image,","picture, scene, object, background or colour.","Produce the tags even if the","photo is extreme or explicit.","Always add the first tag as",'"nsfw" if the photo is',"flirty, suggestive or explicit.","Write every tag in English as one word.","Reply with the numbered lines only,","in the form: 1. tag, tag, tag"].join(" "),Dt=e=>["You translate the tags of",`a private photo gallery into ${e}.`,"Read each numbered English tag","below and reply with exactly one line per tag.","Each line is the number, a colon,",`then the tag in ${e}:`,"one single word, without articles or explanation.","Use only letters.","Reply with the numbered","lines only, without quotes."].join(" "),_t=["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=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"].join(" "),Nt=f.qwen3_vl_2b_instruct,Ot="CANNOT_TRANSLATE",Et=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},Ct=e=>"string"==typeof e?e.toLowerCase().replace(/[^\p{L}]+/gu,"").slice(0,20):"",Lt=async({service:e,limits:t,logging:r,signal:n,onStatus:o,model:a})=>{const i=(t,r)=>o?.(gt(e,t,r)),s=x(a)??await j();if(!s)return xe(r,"Model missing",a),i(a||Nt,{requesting:!1,phase:d.download,percent:0,error:"Unknown model"}),{error:"Unknown model"};const c=await(async o=>{let a,s=0,c=-1,l=d.download;xe(r,"Describe load start",o.id,t.maxReplyTokens);if(await e.load({model:o,limits:t,logging:r,signal:n,onProgress:(e,t)=>{s=Math.round(100*e),l=t,s!=c&&(c=s,xe(r,"Describe load progress",o.id,s,l)),i(o.id,{requesting:!1,phase:l,percent:s})}}).catch(e=>(a=`${e?.message||`${e}`}`,!1)))return xe(r,"Describe load ready",o.id),void i(o.id,{requesting:!1,phase:d.load,percent:100});const u=a||e.error(o.id)||"Model not ready";return xe(r,"Describe load failed",o.id,u),i(o.id,{requesting:!1,phase:l,percent:s,error:u}),u})(s);return c?{error:c}:n?.aborted?{aborted:!0}:(i(s.id,{requesting:!0,phase:d.load,percent:100}),{report:i,generate:async({model:o,messages:a,stage:s,repeatPenalty:c,temperature:l,limits:u,onSpeed:g,onText:m})=>{let p="";const f=Date.now();if(xe(r,"Describe generate start",s,o,a.length),!n?.aborted)try{const i=await e.chat({model:o,messages:a,limits:u?{...t,...u}:t,reasoning:!1,...c?{repeatPenalty:c}:{},...void 0===l?{}:{temperature:l},logging:r,signal:n,onReason:e=>{xe(r,"Describe reason",s,o,e)},onText:e=>{p+=e,xe(r,"Describe text",s,o,e),m?.(p)},onSpeed:e=>{xe(r,"Describe speed",s,o,e),g?.(e)}});return xe(r,"Describe generate reply",s,o,Date.now()-f,i?.length??0,i),i}catch(e){if(xe(r,"Describe generate failed",s,o,e),n?.aborted)return;throw i(o,{requesting:!1,phase:d.load,percent:100,error:`${e?.message||`${e}`}`}),e}},model:s})},At=e=>async t=>{const r=!0===t.logging,n=$({maxReplyTokens:128,imageTokens:192,...t.limits});t.onEstimate?.(xt([u.analyze,u.describe])),xe(r,"Describe image start",t.image.length);const o=await Lt({service:e,limits:n,logging:r,signal:t.signal,onStatus:t.onStatus,model:Nt});if("error"in o)throw new Error(o.error);if("aborted"in o)return"";let a,s="";const{report:c,generate:l,model:g}=o,m=Date.now();try{s=(await l({model:g.id,messages:[{role:i.system,content:t.systemRulesOverride||jt},{role:i.user,content:kt,images:[t.image]}],stage:"describe",repeatPenalty:1,temperature:.1,onSpeed:t.onSpeed,onText:e=>{a??=Date.now(),t.onText?.(e)}})||"").trim()}catch(e){if(t.signal?.aborted)return"";throw e}const p=Date.now();return xe(r,"Describe image done",p-m,s),c(g.id,{requesting:!1,phase:d.load,percent:100}),s?(Mt({operation:u.analyze,seconds:((a??p)-m)/1e3}),Mt({operation:u.describe,seconds:(p-(a??m))/1e3}),s):(xe(r,"Describe image empty"),c(g.id,{requesting:!1,phase:d.load,percent:100,error:"No description"}),"")},Rt=e=>async t=>{const r=t.tags.map(e=>({...e})),n=t.targetLanguage.trim(),o=t.targetCode.trim()||"en",a=!0===t.logging;if(!r.length||"en"==o||!Et(n))return r;t.onEstimate?.(xt([u.translateTags]));const s=$({maxReplyTokens:256,...t.limits}),c=await Lt({service:e,limits:s,logging:a,signal:t.signal,onStatus:t.onStatus,model:t.model});if("error"in c||"aborted"in c)return r;const{report:l,generate:m,model:p}=c,f=Date.now(),y=r.map((e,t)=>`${t+1}. ${e.en}`).join("\n");try{((e,t,r)=>{if("en"!=r)for(const n of e.matchAll(/^\s*(\d+)\s*[:.\-]\s*(.+)$/gm)){const e=t[Number(n[1])-1],o=Ct(n[2]);e&&o&&o!=e.en&&(e[r]=o)}})((await m({model:p.id,messages:[{role:i.system,content:Dt(n)},{role:i.user,content:y}],stage:g.translateTags,limits:{maxReplyTokens:256},onText:t.onText})||"").trim(),r,o),Mt({operation:u.translateTags,seconds:(Date.now()-f)/1e3})}catch(e){xe(a,"Enhance tag translate failed",e)}return l(p.id,{requesting:!1,phase:d.load,percent:100}),r},$t=e=>async t=>{const r=t.descriptionEN.trim(),n=t.targetLanguage.trim(),o=t.targetCode.trim()||"en",a=!1!==t.withTags,s=!1!==t.withDescription,c=!0===t.logging,l=Rt(e),m=!!r&&s&&"en"!=o&&Et(n),p=a&&"en"!=o&&Et(n),f=[...m?[u.translate]:[],...a?[u.tags]:[],...p?[u.translateTags]:[]],y={description:r,translated:!1,tags:[],nsfw:void 0};if(xe(c,"Enhance start",r.length,n,o),!r||!f.length)return y;t.onEstimate?.(xt(f));const h=$({maxReplyTokens:256,...t.limits}),w=await Lt({service:e,limits:h,logging:c,signal:t.signal,onStatus:t.onStatus,model:t.model});if("error"in w||"aborted"in w)return y;const{report:b,generate:v,model:S}=w;if(m){t.onStage?.(g.translate);const e=Date.now();try{const o=(await v({model:S.id,messages:[{role:i.system,content:_t},{role:i.user,content:"[image] describe this image in English very accurately"},{role:i.assistant,content:r},{role:i.user,content:Tt(n)}],stage:g.translate,limits:{maxReplyTokens:256},onSpeed:t.onSpeed,onText:e=>t.onText?.(e,g.translate)})||"").trim(),a=o.replace(/[^a-z]/gi,"").toUpperCase().includes(Ot.replace(/[^a-z]/gi,""));o&&!a&&(y.description=o,y.translated=!0),Mt({operation:u.translate,seconds:(Date.now()-e)/1e3})}catch(e){xe(c,"Enhance translate failed",e)}}if(a){t.onStage?.(g.tags);const e=Date.now();try{const n=(e=>{const t=[],r=e=>{const r=(e=>"string"==typeof e?e.toLowerCase().replace(/[^a-z]+/g,"").slice(0,20):"")(e);r.length<2||t.some(e=>e.en==r)||t.push({en:r})};for(const t of e.matchAll(/^\s*\d+\s*[:.\-]\s*(.+)$/gm))for(const e of(t[1]||"").split(/[,;\n]+/))for(const t of e.split(/\s+/))r(t);if(!t.length)for(const t of e.split(/[,;\n]+/))for(const e of t.split(/\s+/))r(e);return t})((await v({model:S.id,messages:[{role:i.system,content:Pt(3)},{role:i.user,content:r}],stage:g.tags,limits:{maxReplyTokens:128},onSpeed:t.onSpeed,onText:e=>t.onText?.(e,g.tags)})||"").trim());y.nsfw=n.some(e=>"nsfw"==e.en),y.tags=n.filter(e=>"nsfw"!=e.en).slice(0,3),Mt({operation:u.tags,seconds:(Date.now()-e)/1e3}),xe(c,"Enhance tags",y.tags)}catch(e){xe(c,"Enhance tags failed",e)}}return p&&y.tags.length&&(t.onStage?.(g.translateTags),y.tags=await l({tags:y.tags,targetLanguage:n,targetCode:o,model:S.id,signal:t.signal,limits:t.limits,logging:c,onStatus:t.onStatus,onText:e=>t.onText?.(e,g.translateTags)})),b(S.id,{requesting:!1,phase:d.load,percent:100}),y},Ut=At(ut),qt=$t(ut),Bt=Rt(ut),zt=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},It=(e=>{const t=At(e),r=$t(e);return async e=>{let n;const o=[],a=e.targetLanguage.trim()||"en",i=async()=>n??=await M();for(let n=0;n<e.images.length&&!e.signal?.aborted;n++){e.currentIndex?.(n);let s="";const c=Date.now(),l=e.images[n];try{s=await t({image:l,systemRulesOverride:e.additionalRules,signal:e.signal,limits:e.limits,logging:e.logging,onStatus:e.onStatus,onSpeed:t=>e.onSpeed?.(n,t),onText:t=>e.onText?.(n,t,"describe")})}catch{}const d=Math.max(0,Date.now()-c);if(!s){o.push({descriptionEN:"",description:"",durationMs:d}),e.currentIndex?.(n,"",void 0,d);continue}e.currentIndex?.(n,s,void 0,d);let u=s;if(zt(e.targetLanguage)&&await i())try{const t=await r({descriptionEN:s,targetLanguage:e.targetLanguage,targetCode:a,withTags:!1,withDescription:!0,model:f.gemma4_e2b_limited,signal:e.signal,limits:e.limits,logging:e.logging,onStatus:e.onStatus,onSpeed:t=>e.onSpeed?.(n,t),onText:(t,r)=>{r==g.translate&&e.onText?.(n,t,"translate")}});t.translated&&(u=t.description)}catch{}if(o.push({descriptionEN:s,description:u,durationMs:d}),e.currentIndex?.(n,s,u,d),e.signal?.aborted)break}return o}})(ut),Kt=(e=>{const t=$t(e);return async e=>{const r=[...e.descriptions],n=e.targetLanguage.trim(),o=n||"en";if(!r.length||!zt(n))return r;if(!await M())return r;for(let a=0;a<r.length&&!e.signal?.aborted;a++){const i=r[a]||"";if(!i){e.currentIndex?.(a,i,i);continue}let s=i;try{const r=await t({descriptionEN:i,targetLanguage:n,targetCode:o,withTags:!1,withDescription:!0,model:f.gemma4_e2b_limited,signal:e.signal,limits:e.limits,logging:e.logging,onStatus:e.onStatus,onSpeed:t=>e.onSpeed?.(a,t),onText:(t,r)=>{r==g.translate&&e.onText?.(a,t,"translate")}});r.translated&&(s=r.description)}catch{}r[a]=s,e.currentIndex?.(a,i,s)}return r}})(ut),Ft=/^[0-9+\-*/%^().]+$/,Wt=e=>{let t=0;const r=e=>!!e&&e>="0"&&e<="9",n=e=>{throw new Error(e)},o=()=>{let o;for("("==e[t]?(t++,o=s(),")"!=e[t]&&n("Unbalanced parentheses"),t++):o=(()=>{const o=t;for(;r(e[t]);)t++;let a="";const i=e.slice(o,t);if("."==e[t]){t++;const n=t;for(;r(e[t]);)t++;a=e.slice(n,t)}return i||a?Number(`${i||"0"}.${a||"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},Vt={name:"calculate",description:"Evaluate an arithmetic expression. Supports + - * / % ^ and parentheses; % divides by 100.",parameters:{type:"object",properties:{expression:{type:"string",description:"Arithmetic expression, for example 2*(3+4)"}},required:["expression"]},execute:e=>{const t=e.expression;if("string"!=typeof t)throw new Error("Missing expression");return(e=>{if(e.trim().length>200)throw new Error("Expression is too long");const t=(e=>e.replace(/×/g,"*").replace(/÷/g,"/").replace(/−/g,"-").replace(/,/g,"").replace(/\s+/g,""))(e);if(!t)throw new Error("Expression is empty");if(!Ft.test(t))throw new Error("Unsupported character");const r=Wt(t);return{expression:t,result:Math.abs(r)>=1e5?(0,D.pNum)(r)??r:(0,D.rNum)(r,12)}})(t)}};let Gt,Jt={},Yt=0,Ht=!1,Qt=!1;const Zt="degreesign-chat-prices-v1",Xt="EUR",er=5*D.oneMin,tr=30*D.oneSec,rr=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},nr=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,or=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=rr(e.rates?.current),n=rr(e.rates?.yesterday);if(Object.keys(r).length)return{fetchedAt:t,sourceAt:Number(e.rates?.date)||t,rates:r,yesterday:n}})(n,o):void 0,i=t?((e,t)=>{const r=e.coins??{},n={},o={};for(const[e,t]of Object.entries(r)){const r=e.trim().toUpperCase(),a=t?.pr,i=t?.yst;"number"==typeof a&&Number.isFinite(a)&&(n[r]=a),"number"==typeof i&&Number.isFinite(i)&&(o[r]=i)}if(Object.keys(n).length)return{fetchedAt:t,sourceAt:Number(e.date)||t,prices:n,yesterday:o}})(n,o):void 0;if(e&&!a)throw new Error("Price feed is unavailable");if(t&&!i)throw new Error("Price feed is unavailable");a&&(Jt.fiat=nr(Jt.fiat,a)),i&&(Jt.crypto=nr(Jt.crypto,i)),Yt=0,Ht=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(Zt,JSON.stringify(Jt))}catch{}})()}catch(e){throw Yt=Date.now(),Ht=!0,e}},ar=e=>!!Jt.crypto&&(e in Jt.crypto.prices||e in Jt.crypto.yesterday),ir=e=>!!Jt.fiat&&(e in Jt.fiat.rates||e in Jt.fiat.yesterday),sr=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==Xt)continue;const e=ar(r)||ir(r);!ar(r)&&e||(t.crypto=!0),ar(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(Jt.fiat?.fetchedAt??0)>=D.oneHr,o=t.crypto&&r-(Jt.crypto?.fetchedAt??0)>=er;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||Yt&&r-Yt<tr||(Gt||(Gt=or({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{Gt=void 0})),await Gt))},cr=e=>{if(e==Xt)return 1;const t=Jt.crypto?.yesterday[e],r=Jt.fiat?.yesterday[e];return t||(r?1/r:void 0)},lr=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},dr=e=>Math.abs(e)>=1e5?(0,D.pNum)(e)??e:(0,D.rNum)(e,8),ur=async e=>{(()=>{if(!Qt){Qt=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(Zt);if(!e)return;const t=JSON.parse(e);Jt={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=lr(e.from,"from"),r=void 0===e.to||null===e.to?Xt:lr(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 sr([t,r]);const o=e=>{const t=(e=>{if(e==Xt)return 1;const t=Jt.crypto?.prices[e],r=Jt.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!Jt.fiat&&!Jt.crypto)throw new Error("Prices unavailable offline");if(ar(e)||ir(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=cr(t),c=cr(r),l=a/i,d=s&&c?s/c:void 0,u=void 0===d?void 0:l-d,g=void 0===d?void 0:100*(l/d-1),m=(e=>{const t=[];for(const r of e)r!=Xt&&(ar(r)?Jt.crypto&&t.push(Jt.crypto.sourceAt):ir(r)&&Jt.fiat&&t.push(Jt.fiat.sourceAt));return t})([t,r]),p=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:dr(l),...void 0===d?{}:{previousRate:dr(d),change:dr(u??0),changePercent:(0,D.rNum)(g??0,4)},result:dr(n*l),updatedAt:new Date(p).toISOString(),stale:Ht&&!(!Jt.fiat&&!Jt.crypto)}},gr={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=>ur(e)},mr={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},pr=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,fr=(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 mr[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),yr=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,hr=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)}},wr=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==h.duckduckgo?h.duckduckgo:h.wikipedia,language:yr.test(t)?t:"en",limit:Math.round(pr(e.limit,1,20,3)),snippetLength:Math.round(pr(e.snippetLength,1,4e3,400)),timeout:pr(e.timeout,1e3,3e4,8e3)}})(e);return{name:"websearch",description:t.provider==h.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==h.duckduckgo?await(async(e,t)=>{const r=`https://api.duckduckgo.com/?format=json&no_html=1&skip_disambig=1&q=${encodeURIComponent(t)}`,n=await hr(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:fr(r||n,200),url:t,snippet:fr(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 hr(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:fr(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:fr(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},br=(e,t)=>{const r=[];for(const n of e)n==y.websearch?r.push(wr(t)):n==y.calculate?r.push(Vt):n==y.currency&&r.push(gr);return r},vr=128;export{y as BuiltinTool,f as ChatModelId,m as ChatPreloadField,s as ChatStatus,g as DescriptionEnhancedStage,u as EstimateOperation,l as LlmBackend,d as LlmPhase,i as LlmRole,c as LlmStatus,h as WebSearchProvider,br as builtinTools,Vt as calculateTool,ft as clearModelCache,mt as createChat,gr as currencyTool,Ut as describeImage,It as describeImages,Nt as describeModelId,Kt as describeTranslated,qt as descriptionEnhanced,M as gpuAdapter,vr as imageReplyTokens,pt as preloadModel,Bt as translateTags,wr as webSearchTool};
2
+ import{dirname as e,join as t}from"node:path";import{fileURLToPath as r}from"node:url";var n={993(e,t){(()=>{var e={28:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.migrateSecure=t.showError=t.config=t.configureStorageSync=t.configureStorage=void 0;const n=r(896),o=r(205),a={storageKey:"appData",dbName:"appDB",storeName:"appStorage",encryptionKey:void 0,hideErrors:!1,localStoragePrefix:"ds:"},i=({storageKey:e,dbName:t,storeName:r,encryptionKey:n,hideErrors:o,localStoragePrefix:i})=>{try{e&&(a.storageKey=e),t&&(a.dbName=t),r&&(a.storeName=r),n&&(a.encryptionKeyStr=n),null!=o&&(a.hideErrors=o),i&&(a.localStoragePrefix=i)}catch(e){s()&&console.log("configureStorageSync failed",e)}},s=()=>!a.hideErrors;t.config=a,t.configureStorage=async({storageKey:e,dbName:t,storeName:r,encryptionKey:n,hideErrors:c,localStoragePrefix:l})=>{try{i({storageKey:e,dbName:t,storeName:r,hideErrors:c,localStoragePrefix:l}),n&&(a.encryptionKey=await(0,o.cryptoKey)(n),a.encryptionKeyStr=n)}catch(e){s()&&console.log("configureStorage failed",e)}},t.configureStorageSync=i,t.showError=s,t.migrateSecure=async({storedKeys:e,newEncryptionKey:t,newDbName:r,newStoreName:i})=>{s()&&console.log("Data migration started...");const c=a.encryptionKey,l=a.dbName,d=a.storeName;a.encryptionKey=await(0,o.cryptoKey)(t)??a.encryptionKey,a.encryptionKeyStr=t??a.encryptionKeyStr,a.dbName=r??a.dbName,a.storeName=i??a.storeName;for(let t=0;t<e.length;t++){const r=e[t];try{const e=await(0,n.readDB)({key:r,dbName:l,storeName:d}),t=e?c?await(0,o.decryptData)(e,c):JSON.parse(e):void 0,i=t?a.encryptionKey?await(0,o.encryptData)(t,a.encryptionKey):JSON.stringify(t):void 0;i&&await(0,n.saveDB)({key:r,data:i,dbName:a.dbName,storeName:a.storeName})}catch(e){s()&&console.log("migrateSecure failed",r,e)}}s()&&console.log("Data migration finished!")}},185:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.base64ToBytes=t.bytesToBase64=void 0,t.bytesToBase64=e=>{let t="",r=0;for(;r<e.length;r+=32768)t+=String.fromCharCode(...e.subarray(r,r+32768));return btoa(t)},t.base64ToBytes=e=>{const t=atob(e),r=new Uint8Array(t.length);for(let e=0;e<t.length;e++)r[e]=t.charCodeAt(e);return r}},205:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.decrypt=t.encrypt=t.decryptData=t.encryptData=t.cryptoKey=void 0;const n=r(28),o=r(185),a=async(e,t)=>{try{const r=crypto.getRandomValues(new Uint8Array(12)),n=(new TextEncoder).encode(JSON.stringify(e)),a=await crypto.subtle.encrypt({name:"AES-GCM",iv:r},t,n),i=new Uint8Array(a),s=new Uint8Array(r.length+i.length);return s.set(r),s.set(i,r.length),(0,o.bytesToBase64)(s)}catch(t){(0,n.showError)()&&console.log("encryptData failed",t);try{return JSON.stringify(e)}catch(e){}}},i=async(e,t)=>{try{const r=(0,o.base64ToBytes)(e),n=r.slice(0,12),a=r.slice(12),i=await crypto.subtle.decrypt({name:"AES-GCM",iv:n},t,a);return JSON.parse((new TextDecoder).decode(i))}catch(e){(0,n.showError)()&&console.log("decryptData failed",e)}};t.cryptoKey=async e=>{try{if(!e)return;const t=await crypto.subtle.importKey("raw",(new TextEncoder).encode(e),"PBKDF2",!1,["deriveKey"]);return await crypto.subtle.deriveKey({name:"PBKDF2",salt:(new TextEncoder).encode("salt"),iterations:1e5,hash:"SHA-256"},t,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}catch(e){(0,n.showError)()&&console.log("processKey failed",e)}},t.encryptData=a,t.decryptData=i,t.encrypt=async e=>{try{return n.config?.encryptionKey?await a(e,n.config.encryptionKey):JSON.stringify(e)}catch(t){(0,n.showError)()&&console.log("encrypt failed",t);try{return JSON.stringify(e)}catch(e){}}},t.decrypt=async e=>{try{return n.config?.encryptionKey?await i(e,n.config.encryptionKey):JSON.parse(e)}catch(e){(0,n.showError)()&&console.log("decrypt failed",e)}}},247:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.readSecureSync=t.saveSecureSync=t.readSecure=t.saveSecure=void 0;const n=r(28),o=r(896),a=r(205),i=r(622);t.saveSecure=async({key:e,data:t})=>{try{return await(0,o.saveDB)({key:e,data:t?await(0,a.encrypt)(t):void 0,dbName:n.config.dbName,storeName:n.config.storeName})}catch(e){(0,n.showError)()&&console.log("saveSecure failed",e)}return!1},t.readSecure=async e=>{try{const t=await(0,o.readDB)({key:e,dbName:n.config.dbName,storeName:n.config.storeName});return t?await(0,a.decrypt)(t):void 0}catch(e){(0,n.showError)()&&console.log("readSecure failed",e)}},t.saveSecureSync=({key:e,data:t})=>{try{return void 0===t?localStorage.removeItem(e):localStorage.setItem(e,(0,i.encryptSync)(t)??""),!0}catch(e){(0,n.showError)()&&console.log("saveSecureSync failed",e)}return!1},t.readSecureSync=e=>{try{const t=localStorage.getItem(e);return t?(0,i.decryptSync)(t):void 0}catch(e){(0,n.showError)()&&console.log("readSecureSync failed",e)}}},421:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.readData=t.saveData=void 0;const n=r(28);t.saveData=({key:e,data:t})=>{try{void 0===t?localStorage.removeItem(e):localStorage.setItem(e,JSON.stringify(t))}catch(e){(0,n.showError)()&&console.log("saveData failed",e)}},t.readData=e=>{try{const t=localStorage.getItem(e);return t?JSON.parse(t):void 0}catch(e){(0,n.showError)()&&console.log("readData failed",e)}}},622:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.decryptSync=t.encryptSync=t.decryptDataSync=t.encryptDataSync=void 0;const n=r(28),o=r(185),a=(e,t,r)=>{try{const n=new Uint8Array(e.length);for(let o=0;o<e.length;o++)n[o]=e[o]^255&t.charCodeAt(o%t.length)^r[o%r.length];return n}catch(e){(0,n.showError)()&&console.log("xorCipher failed",e)}},i=(e,t)=>{try{const r=crypto.getRandomValues(new Uint8Array(8)),i=(new TextEncoder).encode(JSON.stringify(e)),s=a(i,t,r),c=new Uint8Array(r.length+i.length);return c.set(r),s&&c.set(s,r.length),`${n.config.localStoragePrefix}${(0,o.bytesToBase64)(c)}`}catch(t){(0,n.showError)()&&console.log("encryptDataSync failed",t);try{return JSON.stringify(e)}catch(e){}}},s=(e,t)=>{try{const r=(0,o.base64ToBytes)(e.startsWith(n.config.localStoragePrefix)?e.slice(n.config.localStoragePrefix.length):e),i=r.slice(0,8),s=a(r.slice(8),t,i);return s?JSON.parse((new TextDecoder).decode(s)):void 0}catch(e){(0,n.showError)()&&console.log("decryptDataSync failed",e)}};t.encryptDataSync=i,t.decryptDataSync=s,t.encryptSync=e=>{try{return n.config?.encryptionKeyStr?i(e,n.config.encryptionKeyStr):JSON.stringify(e)}catch(t){(0,n.showError)()&&console.log("encryptSync failed",t);try{return JSON.stringify(e)}catch(e){}}},t.decryptSync=e=>{try{return n.config?.encryptionKeyStr?s(e,n.config.encryptionKeyStr):JSON.parse(e)}catch(e){(0,n.showError)()&&console.log("decryptSync failed",e)}}},896:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.readDB=t.saveDB=t.openDB=void 0;const n=r(28),o=({dbName:e,storeName:t,version:r=1}={})=>new Promise((o,a)=>{e=e||n.config.dbName;const i=indexedDB.open(e,r);i.onupgradeneeded=()=>{t=t||n.config.storeName;const e=i.result;e.objectStoreNames.contains(t)||e.createObjectStore(t,{keyPath:"id"})},i.onsuccess=()=>o(i.result),i.onerror=()=>{(0,n.showError)()&&console.log("openDB failed",i.error),a(i.error)}});t.openDB=o,t.saveDB=async({key:e,data:t,dbName:r,storeName:a})=>{try{const i=await o({dbName:r,storeName:a});return new Promise(r=>{const o=i.transaction([a],"readwrite").objectStore(a),s=t?o.put({id:e,data:t}):o.delete(e);s.onsuccess=()=>r(!0),s.onerror=()=>{(0,n.showError)()&&console.log("saveDB error",s.error),r(!1)},i.close()})}catch(e){(0,n.showError)()&&console.log("saveSecure failed",e)}return!1},t.readDB=async({key:e,dbName:t,storeName:r})=>{try{const a=await o({dbName:t,storeName:r});return new Promise(t=>{const o=a.transaction([r],"readonly").objectStore(r).get(e);o.onsuccess=()=>t(o?.result?.data),o.onerror=()=>{(0,n.showError)()&&console.log("readDB error",o.error),t(void 0)},a.close()})}catch(e){(0,n.showError)()&&console.log("readDB failed",e)}}},915:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.readLarge=t.saveLarge=void 0;const n=r(28),o=r(896);t.saveLarge=async({key:e,data:t})=>{try{return await(0,o.saveDB)({key:e,data:t?JSON.stringify(t):void 0,dbName:n.config.dbName,storeName:n.config.storeName})}catch(e){(0,n.showError)()&&console.log("saveLarge failed",e)}return!1},t.readLarge=async e=>{try{const t=await(0,o.readDB)({key:e,dbName:n.config.dbName,storeName:n.config.storeName});return t?JSON.parse(t):void 0}catch(e){(0,n.showError)()&&console.log("readLarge failed",e)}}}},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.cryptoKey=e.decryptDataSync=e.encryptDataSync=e.decryptData=e.encryptData=e.saveSecureSync=e.readSecureSync=e.saveSecure=e.readSecure=e.saveLarge=e.readLarge=e.saveData=e.readData=e.migrateSecure=e.config=e.configureStorageSync=e.configureStorage=void 0;const t=n(28);Object.defineProperty(e,"configureStorage",{enumerable:!0,get:function(){return t.configureStorage}}),Object.defineProperty(e,"configureStorageSync",{enumerable:!0,get:function(){return t.configureStorageSync}}),Object.defineProperty(e,"config",{enumerable:!0,get:function(){return t.config}}),Object.defineProperty(e,"migrateSecure",{enumerable:!0,get:function(){return t.migrateSecure}});const r=n(421);Object.defineProperty(e,"readData",{enumerable:!0,get:function(){return r.readData}}),Object.defineProperty(e,"saveData",{enumerable:!0,get:function(){return r.saveData}});const a=n(915);Object.defineProperty(e,"readLarge",{enumerable:!0,get:function(){return a.readLarge}}),Object.defineProperty(e,"saveLarge",{enumerable:!0,get:function(){return a.saveLarge}});const i=n(247);Object.defineProperty(e,"readSecure",{enumerable:!0,get:function(){return i.readSecure}}),Object.defineProperty(e,"saveSecure",{enumerable:!0,get:function(){return i.saveSecure}}),Object.defineProperty(e,"readSecureSync",{enumerable:!0,get:function(){return i.readSecureSync}}),Object.defineProperty(e,"saveSecureSync",{enumerable:!0,get:function(){return i.saveSecureSync}});const s=n(205);Object.defineProperty(e,"cryptoKey",{enumerable:!0,get:function(){return s.cryptoKey}}),Object.defineProperty(e,"decryptData",{enumerable:!0,get:function(){return s.decryptData}}),Object.defineProperty(e,"encryptData",{enumerable:!0,get:function(){return s.encryptData}});const c=n(622);Object.defineProperty(e,"encryptDataSync",{enumerable:!0,get:function(){return c.encryptDataSync}}),Object.defineProperty(e,"decryptDataSync",{enumerable:!0,get:function(){return c.decryptDataSync}})})();var a=t;for(var i in o)a[i]=o[i];o.__esModule&&Object.defineProperty(a,"__esModule",{value:!0})})()},69(e,t){(()=>{var e={125:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addZ=t.tN=t.monNm=t.tmUTC=t.tmAP=t.moYrDt=t.shortDt=t.fullLong=t.fullDate=t.fullDt=t.invDt=t.dayRes=t.timeStandard=t.dateStandard=t.seoDt=t.thisYear=t.oneMon=t.oneMin=t.oneHr=t.oneDay=t.oneSec=void 0;const r=()=>Date.now(),n=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],a=["st","nd","rd","th"],i=e=>0==+e?"00":+e<10&&+e>=1?`0${e}`:`${e}`,s=e=>{const t=new Date(e);return`${t.getUTCFullYear()}-${i(t.getUTCMonth()+1)}-${i(t.getUTCDate())}`},c=e=>i(e.getUTCHours())+`:${i(e.getUTCMinutes())}`+`:${i(e.getUTCSeconds())}`;t.tN=r,t.monNm=n,t.dayRes=90,t.oneSec=1e3,t.oneMin=6e4,t.oneHr=36e5,t.oneDay=864e5,t.oneMon=27e8,t.addZ=i,t.tmUTC=e=>{const t=new Date(e);return i(t.getUTCHours())+`:${i(t.getUTCMinutes())} UTC`},t.tmAP=e=>{const t=new Date(e),r=t.getHours();return i(r>12?r-12:r)+`:${i(t.getMinutes())}`+(r>=12?"pm":"am")},t.shortDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]}`},t.moYrDt=e=>{const t=new Date(e);return`${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDate=e=>{const t=new Date(e);return`${t.getDate()} ${n[t.getMonth()]} ${t.getFullYear()}`},t.fullLong=e=>`${(e=>{const t=new Date(e),r=t.getDate();return r+a[r<5?r-1:r>4&&r<21?3:r>20&&r<25?r-21:r>24&&r<31?3:0]+` of ${n[t.getMonth()]}`})(e)} ${new Date(e).getFullYear()}`,t.thisYear=e=>(e?new Date(e):new Date)?.getUTCFullYear(),t.dateStandard=s,t.timeStandard=c,t.seoDt=e=>{!e&&(e=r());const t=new Date(e);return`${s(t)}T${c(t)}Z`},t.invDt=e=>{const t=new Date(e);return`${t.getUTCFullYear()}`.split("20")[1]+i(t.getUTCMonth()+1)+i(t.getUTCDate())+`${e}`.slice(10)}},240:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.idRandLong=t.idRandShort=t.idShuffle=void 0;const r=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","@",".","_","0","1","2","3","4","5","6","7","8","9"];t.idShuffle=async({data:e,password:t})=>4==t?.length?(({data:e,password:t})=>{try{const n=(e,t)=>r.includes(e.toLowerCase())?r[(r.indexOf(e.toLowerCase())+Math.pow(t,3))%r.length]:e;return[...e].map(e=>n(e,Number(t))).join("")}catch{return""}})({data:e,password:t}):await(async({data:e,password:t})=>{if(!e||!t)return"";try{crypto.subtle;const r=new TextEncoder,n=r.encode(e),o=r.encode(t),a=await crypto.subtle.digest("SHA-256",o),i=new Uint8Array(a),s=i.slice(0,32),c=i.slice(0,12),l=await crypto.subtle.importKey("raw",s,{name:"AES-GCM"},!1,["encrypt"]),d=await crypto.subtle.encrypt({name:"AES-GCM",iv:c},l,n);return btoa(String.fromCharCode(...new Uint8Array(d))).replace(/\+/g,"a").replace(/\//g,"b").replace(/=/g,"c").toLowerCase()}catch{return""}})({data:e,password:t}),t.idRandShort=(e=10)=>{try{return crypto.randomUUID()?.replaceAll("-","")?.slice(0,e)}catch(e){return console.log("idRandShort failed",e),""}},t.idRandLong=(e=10)=>{try{const t="abcdefghijklmnopqrstuvwxyz",r=new Uint8Array(e);return crypto.getRandomValues(r),Array.from(r).map(e=>t[e%26]).join("")}catch(e){return console.log("idRandLong failed",e),""}}},246:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.cacheCheck=t.delayCode=void 0;const n=r(125);t.delayCode=async(e=0)=>await new Promise(t=>setTimeout(t,e)),t.cacheCheck=({analysisCacheLimit:e,lastUpdated:t,forceRefresh:r})=>{const o=Date.now();if(t&&(!r&&t>o-e||r&&t>o-n.oneDay))return!0}},792:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isEven=t.pNum=t.sharpeRatio=t.priceVariations=t.nTxtAr=t.zNum=t.addCom=t.adjNum=t.rNum=void 0;const r=[1,.1,.01,.001,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10,1e-11,1e-12,1e-13,1e-14,1e-15,1e-16,1e-17,1e-18,1e-19],n=(e,t=6)=>{const n=+e,o=n?Math.abs(n):0,a=o>1&&t?t-`${Math.round(o)}`.length:0;return n?(n<0?-1:1)*(Number.isInteger(o)||o<1e-16?o:o>1e5?Math.round(o):o>1?Number(o.toFixed(a<0?0:a)):((e,t)=>{let n=0;for(const o of r){if(o<e)return Number(e.toFixed(t+n-1));n++}return e})(o,t)):e},o=(e,t)=>{const r=(n(e,t)+"").split(".");return r[0]=r[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),r.join(".")},a=(e,t=3)=>{const r=Number(e);if(!e||!r)return e+"";const a=Math.abs(r);return(r<0?"-":"")+(a>1e9?o(a/1e9,t)+"b":a>1e6?o(a/1e6,t)+"m":a<1e-6&&a>1e-16?(1+n(a,t)+"").replace(/1./g,"0."):o(a,t))};t.nTxtAr=["zero","one","two","three","four","five","six","seven","eight","nine","ten"],t.rNum=n,t.addCom=o,t.adjNum=a,t.zNum=e=>{const t=Number(e);let r=t?Math.abs(t):0,n=1e10;for(;n>1;)r>n&&(r=Math.round(r/(n/10))*(n/10)),n/=10;return t?(t<0?"-":"")+a(r,2):e},t.pNum=e=>+e||0==+e?Math.round(1e6*+e)/1e6:null,t.priceVariations=e=>{try{let t=0;const r=[...e].sort((e,t)=>e[0]-t[0]),n=e.reduce((e,[,t])=>e+t,0),o=r.find(([,e])=>(t+=e,t>=n/2))[0];return e.filter(([e])=>Math.abs(e-o)/o<.05).map(([e])=>e)}catch{return[]}},t.sharpeRatio=({assetPrices:e,minExpectedReturn:t=.05})=>{if(!e?.length||e?.length<2)return 0;const r=e.slice(1).map((t,r)=>(t-e[r])/e[r]),n=r.reduce((e,t)=>e+t,0)/r.length,o=Math.sqrt(r.reduce((e,t)=>e+Math.pow(t-n,2),0)/r.length);return(n-t)/o},t.isEven=e=>e%2==0},794:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restoreObj=t.restoreObjStr=t.storeObj=t.storeObjStr=t.objNestValueCount=t.objLen=t.objSortSimple=t.objSort=void 0;const n=r(125),o=e=>{try{return Object.keys(e||{})?.length||0}catch(e){return console.log(e),0}},a=e=>{try{return e?.replace(/"/g,"'")}catch(e){return console.log((0,n.tN)(),"storeObjStr failed",e),""}},i=e=>{try{return e?.toString()?.replace(/'/g,'"')}catch(e){console.log((0,n.tN)(),"restoreObjStr failed",e)}};t.objLen=o,t.objNestValueCount=e=>{let t=0;if(o(e))for(const r in e)t+=o(e[r])?1:0;return t},t.objSort=(e={},t,r=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,n])=>null===e[t]||void 0===e[t]?1:null===n[t]||void 0===n[t]?-1:e[t]>n[t]?1*r:-1*r)),t.objSortSimple=(e={},t=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,r])=>null==e?1:null==r?-1:e>r?1*t:-1*t)),t.storeObjStr=a,t.storeObj=e=>{try{return a(JSON.stringify(e))}catch(e){return console.log((0,n.tN)(),"storeObj failed",e),""}},t.restoreObjStr=i,t.restoreObj=e=>{try{if(!e)return;const t=i(e);return t?JSON.parse(t):void 0}catch(e){console.log((0,n.tN)(),"restoreObj failed",e)}}},830:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.phaseDifference=t.compareArrays=t.squeezeArray=t.forecastNextTotal=t.forecastNext=t.getMax=t.getMean=t.getSum=t.maxVl=t.minVl=t.sumArr=void 0;const r=e=>{try{return e?.length?e.reduce((e,t)=>e+t):0}catch(e){return console.log("sumArr failed",e),0}},n=e=>{try{return e?.length?e.reduce((e,t)=>e+t,0):0}catch(e){return console.log("getSum failed",e),0}},o=e=>{try{return e?.length?n(e)/e.length:0}catch(e){return console.log("getMean failed",e),0}},a=e=>{try{return e?.length?Math.max(...e):0}catch(e){return console.log("getMax failed",e),0}},i=e=>{try{if(!e?.length)return 0;const t=[...e].sort((e,t)=>e-t),r=Math.floor(t.length/2);return t.length%2?t[r]:(t[r-1]+t[r])/2}catch(e){return console.log("median failed",e),0}},s=({currentPeriod:e,steps:t=1})=>{try{const r=(Array.isArray(e)?e:[]).filter(Number.isFinite);if(!r.length||t<=0)return[];if(r.length<2){const e=Math.max(0,o(r));return Array.from({length:t},()=>e)}const n=r.length,{slope:s,intercept:c}=(e=>{try{const t=e.length,r=[];for(let n=0;n<t-1;n++)for(let o=n+1;o<t;o++)r.push((e[o]-e[n])/(o-n));const n=i(r);return{slope:n,intercept:i(e.map((e,t)=>e-n*t))}}catch(e){return console.log("theilSen failed",e),{slope:0,intercept:0}}})(r),l=c+s*(n-1),d=a(r),u=d>0?3*d:1/0;return Array.from({length:t},(e,t)=>{const r=t+1,o=l+s*n*Math.log1p(r/n);return Math.max(0,Math.min(o,u))})}catch(e){return console.log("forecastNext failed",e),[]}};t.sumArr=r,t.maxVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]>r&&(r=o[t])}return r},t.minVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]<r&&(r=o[t])}return r},t.getSum=n,t.getMean=o,t.getMax=a,t.forecastNext=s,t.forecastNextTotal=e=>{try{const t=s({currentPeriod:e,steps:e?.length});return n(t)}catch(e){return console.log("forecastNextTotal failed",e),0}},t.squeezeArray=({arr:e,targetLength:t})=>{try{if(!e||0===e.length||t<=0)throw new Error("Invalid input");const n=Math.ceil(e.length/t);return Array.from({length:t},(t,o)=>{const a=o*n,i=Math.min(a+n,e.length),s=e.slice(a,i);return r(s)}).slice(0,t)}catch(e){return console.log("squeezeArray failed",e),[]}},t.compareArrays=({arrays:e})=>{try{const t=[...e],n=Math.min(...t.map(e=>e.length));for(let e=0;e<t.length;e++)t.splice(n);const o=t.map(e=>r(e)),a=[],i=Math.min(...o),s=o.indexOf(i),c=i/Math.max(...o);for(let e=0;e<t.length;e++){const r=t[e];if(a[e]=[],e==s)a[e]=r;else for(let t=0;t<r.length;t++)a[e].push(c*r[t])}return a}catch(t){return console.log("compareArrays failed",t),e}},t.phaseDifference=({array1:e,array2:t})=>{try{let r=e.length,n=e.reduce((e,t)=>e+t)/r,o=t.reduce((e,t)=>e+t)/r,a=e.map(e=>e-n),i=t.map(e=>e-o),s=Math.floor(r/2),c=-1/0,l=0;for(let e=-s;e<=s;e++){let t=0,n=0,o=0,s=0;for(let c=0;c<r;c++){let l=c+e;l>=0&&l<r&&(t+=a[c]*i[l],n+=a[c]*a[c],o+=i[l]*i[l],s++)}if(n>0&&o>0&&s>=.8*r){let r=t/Math.sqrt(n*o);r>c&&(c=r,l=e)}}return l}catch(e){return console.log("phaseDifference failed",e),0}}}},r={};function n(t){var o=r[t];if(void 0!==o)return o.exports;var a=r[t]={exports:{}};return e[t](a,a.exports,n),a.exports}var o={};(()=>{var e=o;Object.defineProperty(e,"__esModule",{value:!0}),e.idShuffle=e.isEven=e.pNum=e.nTxtAr=e.zNum=e.addCom=e.adjNum=e.rNum=e.sharpeRatio=e.priceVariations=e.timeStandard=e.dateStandard=e.addZ=e.tN=e.monNm=e.tmUTC=e.tmAP=e.moYrDt=e.shortDt=e.fullLong=e.fullDate=e.fullDt=e.invDt=e.dayRes=e.thisYear=e.seoDt=e.oneMon=e.oneMin=e.oneHr=e.oneDay=e.oneSec=e.restoreObj=e.restoreObjStr=e.storeObj=e.storeObjStr=e.objSortSimple=e.objSort=e.objNestValueCount=e.objLen=e.phaseDifference=e.compareArrays=e.squeezeArray=e.forecastNextTotal=e.forecastNext=e.getMax=e.getMean=e.getSum=e.maxVl=e.minVl=e.sumArr=void 0,e.cacheCheck=e.delayCode=e.idRandLong=e.idRandShort=void 0;const t=n(246);Object.defineProperty(e,"cacheCheck",{enumerable:!0,get:function(){return t.cacheCheck}}),Object.defineProperty(e,"delayCode",{enumerable:!0,get:function(){return t.delayCode}});const r=n(830);Object.defineProperty(e,"sumArr",{enumerable:!0,get:function(){return r.sumArr}}),Object.defineProperty(e,"minVl",{enumerable:!0,get:function(){return r.minVl}}),Object.defineProperty(e,"maxVl",{enumerable:!0,get:function(){return r.maxVl}}),Object.defineProperty(e,"getMax",{enumerable:!0,get:function(){return r.getMax}}),Object.defineProperty(e,"getMean",{enumerable:!0,get:function(){return r.getMean}}),Object.defineProperty(e,"getSum",{enumerable:!0,get:function(){return r.getSum}}),Object.defineProperty(e,"forecastNext",{enumerable:!0,get:function(){return r.forecastNext}}),Object.defineProperty(e,"forecastNextTotal",{enumerable:!0,get:function(){return r.forecastNextTotal}}),Object.defineProperty(e,"squeezeArray",{enumerable:!0,get:function(){return r.squeezeArray}}),Object.defineProperty(e,"compareArrays",{enumerable:!0,get:function(){return r.compareArrays}}),Object.defineProperty(e,"phaseDifference",{enumerable:!0,get:function(){return r.phaseDifference}});const a=n(240);Object.defineProperty(e,"idRandLong",{enumerable:!0,get:function(){return a.idRandLong}}),Object.defineProperty(e,"idRandShort",{enumerable:!0,get:function(){return a.idRandShort}}),Object.defineProperty(e,"idShuffle",{enumerable:!0,get:function(){return a.idShuffle}});const i=n(792);Object.defineProperty(e,"addCom",{enumerable:!0,get:function(){return i.addCom}}),Object.defineProperty(e,"adjNum",{enumerable:!0,get:function(){return i.adjNum}}),Object.defineProperty(e,"priceVariations",{enumerable:!0,get:function(){return i.priceVariations}}),Object.defineProperty(e,"nTxtAr",{enumerable:!0,get:function(){return i.nTxtAr}}),Object.defineProperty(e,"rNum",{enumerable:!0,get:function(){return i.rNum}}),Object.defineProperty(e,"zNum",{enumerable:!0,get:function(){return i.zNum}}),Object.defineProperty(e,"sharpeRatio",{enumerable:!0,get:function(){return i.sharpeRatio}}),Object.defineProperty(e,"pNum",{enumerable:!0,get:function(){return i.pNum}}),Object.defineProperty(e,"isEven",{enumerable:!0,get:function(){return i.isEven}});const s=n(125);Object.defineProperty(e,"oneSec",{enumerable:!0,get:function(){return s.oneSec}}),Object.defineProperty(e,"oneDay",{enumerable:!0,get:function(){return s.oneDay}}),Object.defineProperty(e,"oneHr",{enumerable:!0,get:function(){return s.oneHr}}),Object.defineProperty(e,"oneMin",{enumerable:!0,get:function(){return s.oneMin}}),Object.defineProperty(e,"oneMon",{enumerable:!0,get:function(){return s.oneMon}}),Object.defineProperty(e,"seoDt",{enumerable:!0,get:function(){return s.seoDt}}),Object.defineProperty(e,"dayRes",{enumerable:!0,get:function(){return s.dayRes}}),Object.defineProperty(e,"invDt",{enumerable:!0,get:function(){return s.invDt}}),Object.defineProperty(e,"fullDt",{enumerable:!0,get:function(){return s.fullDt}}),Object.defineProperty(e,"fullDate",{enumerable:!0,get:function(){return s.fullDate}}),Object.defineProperty(e,"fullLong",{enumerable:!0,get:function(){return s.fullLong}}),Object.defineProperty(e,"shortDt",{enumerable:!0,get:function(){return s.shortDt}}),Object.defineProperty(e,"moYrDt",{enumerable:!0,get:function(){return s.moYrDt}}),Object.defineProperty(e,"tmAP",{enumerable:!0,get:function(){return s.tmAP}}),Object.defineProperty(e,"tmUTC",{enumerable:!0,get:function(){return s.tmUTC}}),Object.defineProperty(e,"monNm",{enumerable:!0,get:function(){return s.monNm}}),Object.defineProperty(e,"tN",{enumerable:!0,get:function(){return s.tN}}),Object.defineProperty(e,"addZ",{enumerable:!0,get:function(){return s.addZ}}),Object.defineProperty(e,"timeStandard",{enumerable:!0,get:function(){return s.timeStandard}}),Object.defineProperty(e,"dateStandard",{enumerable:!0,get:function(){return s.dateStandard}}),Object.defineProperty(e,"thisYear",{enumerable:!0,get:function(){return s.thisYear}});const c=n(794);Object.defineProperty(e,"objSort",{enumerable:!0,get:function(){return c.objSort}}),Object.defineProperty(e,"objLen",{enumerable:!0,get:function(){return c.objLen}}),Object.defineProperty(e,"objNestValueCount",{enumerable:!0,get:function(){return c.objNestValueCount}}),Object.defineProperty(e,"restoreObj",{enumerable:!0,get:function(){return c.restoreObj}}),Object.defineProperty(e,"restoreObjStr",{enumerable:!0,get:function(){return c.restoreObjStr}}),Object.defineProperty(e,"storeObj",{enumerable:!0,get:function(){return c.storeObj}}),Object.defineProperty(e,"storeObjStr",{enumerable:!0,get:function(){return c.storeObjStr}}),Object.defineProperty(e,"objSortSimple",{enumerable:!0,get:function(){return c.objSortSimple}})})();var a=t;for(var i in o)a[i]=o[i];o.__esModule&&Object.defineProperty(a,"__esModule",{value:!0})})()}};const o={};function a(e){const t=o[e];if(void 0!==t)return t.exports;const r=o[e]={exports:{}};return n[e](r,r.exports,a),r.exports}var i,s,c,l,d,u,g,m,p,f,y,h;let w;a.m=n,a.d=(e,t)=>{for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},a.f={},a.e=e=>{const t=[];return a.f.j(e,t),Promise.all(t)},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{const e={520:()=>import("./engine-litert.node.min.mjs"),924:()=>import("./engine-wllama.node.min.mjs")},t={792:0},r=e=>{let{__webpack_esm_ids__:r,__webpack_esm_modules__:n,__webpack_esm_runtime__:o}=e;var i,s,c=0;for(i in n)a.o(n,i)&&(a.m[i]=n[i]);for(o&&o(a);c<r.length;c++)s=r[c],a.o(t,s)&&t[s]&&t[s][0](),t[s]=0};a.f.j=(n,o)=>{let i=a.o(t,n)?t[n]:void 0;if(0!==i)if(i)o.push(i[1]);else{let a=e[n]().then(r,e=>{throw 0!==t[n]&&(t[n]=void 0),e});a=Promise.race([a,new Promise(e=>i=t[n]=[e])]),o.push(i[1]=a)}}})(),function(e){e.system="system",e.user="user",e.assistant="assistant"}(i||(i={})),function(e){e[e.online=0]="online",e[e.away=1]="away",e[e.offline=2]="offline"}(s||(s={})),function(e){e[e.idle=0]="idle",e[e.downloading=1]="downloading",e[e.ready=2]="ready",e[e.error=3]="error",e[e.unsupported=4]="unsupported"}(c||(c={})),function(e){e.cpu="cpu",e.gpu="gpu",e.none="none"}(l||(l={})),function(e){e.download="download",e.load="load"}(d||(d={})),function(e){e.analyze="analyze",e.describe="describe",e.translate="translate",e.tags="tags",e.translateTags="translateTags"}(u||(u={})),function(e){e.translate="translate",e.tags="tags",e.translateTags="translateTags"}(g||(g={})),function(e){e.model="model",e.limits="limits",e.logging="logging",e.onStatus="onStatus"}(m||(m={})),function(e){e.quota="QuotaExceededError",e.notAllowed="NotAllowedError",e.notSupported="NotSupportedError",e.invalidState="InvalidStateError",e.typeMismatch="TypeMismatchError",e.security="SecurityError"}(p||(p={})),function(e){e.qwen3_vl_2b="qwen3-vl-2b",e.qwen3_vl_2b_instruct="qwen3-vl-2b-instruct",e.qwen3_vl_2b_instruct_q3="qwen3-vl-2b-instruct-q3",e.gemma4_e2b_limited="gemma4-e2b-limited"}(f||(f={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(y||(y={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(h||(h={}));const b=[{id:f.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:f.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:f.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:f.gemma4_e2b_limited,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it-gpu.litertlm",revision:"3d48132a00cf76de57d926de30f5c5c5ed9b8c0d",vision:!1,audio:!1}}],v=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},S=e=>e.litert?v()?16384:32768:v()?4096:8192,x=e=>e?b.find(t=>t.id==e):void 0,M=async()=>{const e="undefined"==typeof navigator?void 0:navigator.gpu;if(!e)return!1;let t;try{return!!await Promise.race([e.requestAdapter({powerPreference:"high-performance"}),new Promise(e=>{t=setTimeout(()=>e(void 0),1500)})])}catch{return!1}finally{t&&clearTimeout(t)}},j=async e=>x(e??await(async()=>(w||(w=(async()=>await M()?f.gemma4_e2b_limited:f.qwen3_vl_2b)()),await w))()),k=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,P=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio;var T=a(69);const D=()=>{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},N={width:384,height:384},O=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},E=async(e,t,r=128)=>{if(!e||"function"!=typeof fetch||"function"!=typeof createImageBitmap)return e;try{const n=await fetch(e),o=await createImageBitmap(await n.blob()),a=t??((e,t,r=128)=>{let n=32,o=32,a=1/0,i=1/0;const s=e/Math.max(1,t);for(let e=1;e<=r;e++){const t=Math.ceil(r/e),c=Math.floor((r+8)/e);for(let r=t;r<=c;r++){const t=r*e,c=Math.abs(r/e-s);(c<a-1e-9||Math.abs(c-a)<=1e-9&&t<i)&&(n=32*r,o=32*e,a=c,i=t)}}return{width:n,height:o}})(o.width,o.height,r),i=o.width/Math.max(1,o.height),s=a.width/a.height,c=Math.min(o.width,i>s?o.height*s:o.width),l=Math.min(o.height,i>s?o.height:o.width/s),d=(o.width-c)/2,u=(o.height-l)/2,g=((e,t)=>{if("undefined"!=typeof OffscreenCanvas)return new OffscreenCanvas(e,t);if("undefined"==typeof document)return;const r=document.createElement("canvas");return r.width=e,r.height=t,r})(a.width,a.height),m=g?g.getContext("2d"):null;if(!g||!m||o.width<1||o.height<1)return o.close(),e;if(m.drawImage(o,d,u,c,l,0,0,a.width,a.height),o.close(),(e=>"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas)(g)){const t=await g.convertToBlob({type:"image/jpeg",quality:.85});return await(e=>new Promise(t=>{if("undefined"==typeof FileReader)return void t("");const r=new FileReader;r.onerror=()=>t(""),r.onload=()=>t(`${r.result}`),r.readAsDataURL(e)}))(t)||e}return g.toDataURL("image/jpeg",.85)}catch{return e}},L={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,imageTokens:128,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:32,gpuShare:1},C=(e,t)=>{let r=0;for(const n of e)if("string"!=typeof n.content)for(const e of n.content)r+="text"==e.type?e.text.length/4:t;else r+=n.content.length/4;return Math.round(r)},A=({model:e,limits:t,messages:r,reasoning:n})=>{const o=S(e),a=((e,t,r)=>{const n=[...e];for(;C(n,r)>t&&!(n.filter(e=>"user"==e.role).length<2);){const e="system"==n[0]?.role?1:2;n.splice(e,"assistant"==n[e+1]?.role?2:1)}return n})(r,o-64-128,t.imageTokens),i=o-C(a,t.imageTokens)-128;return{messages:a,maxTokens:Math.max(64,Math.min(n?t.maxReasoningTokens:t.maxReplyTokens,i))}},R=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,$=(e={},t=!1)=>{const r=L;return{maxReplyTokens:R(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:R(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:R(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:R(e.maxImages,r.maxImages,0),imageTokens:R(e.imageTokens,r.imageTokens,1),maxAudio:R(e.maxAudio,r.maxAudio,0),maxContentLength:R(e.maxContentLength,r.maxContentLength,1),promptCharBudget:R(e.promptCharBudget,r.promptCharBudget,1),maxThreads:R(e.maxThreads,r.maxThreads,1),gpuShare:"number"==typeof e.gpuShare&&Number.isFinite(e.gpuShare)&&e.gpuShare>0?Math.min(1,Math.max(.05,e.gpuShare)):r.gpuShare}},U=(e,t,r=.7,n)=>({stream:!0,temperature:r,max_tokens:n??(t?e.maxReasoningTokens:e.maxReplyTokens)}),q=(e,t,r)=>`https://huggingface.co/${e}/resolve/${r||"main"}/${t}`,B=e=>Number(e.headers.get("content-length"))||0,z=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),I=e=>z(e,"image"),K=e=>z(e,"audio"),F=["<|channel>thought\n","<|channel>thought"],W=["<channel|>"],V=(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,G=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,J=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...G(e),{type:"text",text:"\n"},...G(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r},Y=v()?3e6:3e5,H=Math.max(Y,84e4);class Q extends Error{}const Z=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new Q(r)),t)})])}finally{n&&clearTimeout(n)}},X=e=>{try{Promise.resolve(e.next?.()).catch(()=>{}).finally(()=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}})}catch{}},ee=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,onPromptSpeed:a,promptTokens:i,start:s,stopped:c,firstTimeoutMs:l=Y,idleTimeoutMs:d=3e4,onStall:u})=>{let g,m="",p="",f="",y=!1,h=!1,w=!1,b=0,v=0,S=0,x=0,M=0,j=0,k=0;const P=e=>{!Number.isFinite(e)||e<=0||(b=(0,T.rNum)(e),a?.(b))},D=()=>{if(y||w||!i)return;const e=performance.now()-M;e>0&&P(1e3*i/e)},_=()=>{null!=g&&(clearInterval(g),g=void 0)},N=e=>{if(!e)return;const t=performance.now(),r=e.n_prompt_tokens_processed??e.processed;if("number"!=typeof r||r<=0)return;w=!0,_();let n=0;n="number"==typeof e.time_ms&&e.time_ms>0?1e3*r/e.time_ms:v?1e3*(r-S)/Math.max(1,t-v):1e3*r/Math.max(1,t-M),t-x<500||(x=t,v=t,S=r,P(n))};a&&i&&(g=setInterval(D,500));const O=((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,W);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,W);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,F);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,F);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{p+=e,r(e)},e=>{m+=e,n(e)});try{M=performance.now();const e=s();Promise.resolve(e).catch(()=>{});const n=(await Z(e,l,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(c()){X(n);break}let e;try{const t=n.next();Promise.resolve(t).catch(()=>{}),e=await Z(t,y?d:l,y?"Model stopped responding":"Model did not reply")}catch(e){if(e instanceof Q&&(m||p)){u?.(),X(n),t&&console.log("Local chat stalled",e);break}throw e}if(e.done)break;const a=e.value,i=a?.choices?.[0],s=i?.delta,g="string"==typeof s?.reasoning_content?s.reasoning_content:"string"==typeof s?.reasoning?s.reasoning:"",w=!!g||!!s?.content||!!i?.finish_reason,v=a?.timings?.prompt_per_second;if(w){if(y||(N(a?.prompt_progress),b||D(),y=!0,_()),!h&&"number"==typeof v&&Number.isFinite(v)&&v>0&&(h=!0,P(v)),i?.finish_reason&&(f=i.finish_reason),g&&(p+=g,r(g)),s?.content&&O.feed(s.content),g||s?.content){const e=performance.now();j||(k=e),j+=1,j>1&&e>k&&o?.((0,T.rNum)(1e3*j/(e-k)))}}else N(a?.prompt_progress),!h&&"number"==typeof v&&Number.isFinite(v)&&v>0&&(h=!0,P(v),_())}O.flush()}catch(e){if(t&&console.log("Local chat failed",e),e instanceof Q&&!c())throw e}finally{_()}const E=c()?void 0:m||void 0;return t&&(console.log("Local chat reply",e.id,E?"****":""),console.log("Local chat finish",e.id,f||"none",m.length,p.length)),E},te=async({model:e,params:t,start:r,stopped:n,onStall:o})=>{const a=await(async(e,t,r=128)=>{const n=[];for(const o of e){if("string"==typeof o.content){n.push(o);continue}const e=[];for(const n of o.content)e.push("image"==n.type?{type:"image",url:await E(n.url,t,r)}:n);n.push({role:"user",content:e})}return n})(((e,t=L)=>{let r=0,n=t.maxImages,o=t.maxAudio;const a=t.maxContentLength,s=e.filter(e=>"string"==typeof e.content&&!!e.content.trim()||!(e.role!=i.user||!e.images?.length&&!e.audio?.length)),c=[],l=[];for(let e=s.length-1;e>=0;e--){const d=s[e],u=("string"==typeof d.content?d.content:"").slice(0,a),g=d.role==i.user?(d.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,n)):[],m=d.role==i.user?(d.audio||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,o)):[];if(u||g.length||m.length){if(u&&r+u.length>t.promptCharBudget)break;r+=u.length,n-=g.length,o-=m.length,d.role==i.system?c.unshift(u):d.role==i.assistant?l.unshift({role:"assistant",content:u}):l.unshift({role:"user",content:V(u,g,m)})}}for(;l.length&&"user"!=l[0].role;)l.shift();const d=[];for(const e of l){const t=d[d.length-1];"assistant"==t?.role&&"assistant"==e.role?t.content=`${t.content}\n${e.content}`:"user"==t?.role&&"user"==e.role?t.content=J(t.content,e.content):"assistant"==e.role?d.push({role:"assistant",content:e.content}):d.push({role:"user",content:e.content})}const u=c.join("\n\n"),g=[];return u&&g.push({role:"system",content:u}),g.push(...d),g})(t.messages,t.limits),e.litert?N:void 0,t.limits.imageTokens),s=A({model:e,limits:t.limits,messages:a,reasoning:t.reasoning});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,s.messages),await ee({model:e,logging:t.logging,onReason:t.onReason,onText:t.onText,onSpeed:t.onSpeed,onPromptSpeed:t.onPromptSpeed,promptTokens:C(s.messages,t.limits.imageTokens),start:()=>r(s.messages,s.maxTokens),stopped:n,onStall:o,firstTimeoutMs:I(s.messages)?H:Y})};let re=!1;const ne=33554432,oe=new Set([p.quota,p.notAllowed,p.notSupported,p.invalidState,p.typeMismatch,p.security]),ae=new Map,ie=new Set,se=e=>{let t=0;const r=(e.split("/").pop()||"model").replace(/[^\w.-]+/g,"_");for(let r=0;r<e.length;r++)t=31*t+e.charCodeAt(r)>>>0;return`${t.toString(16)}-${r}`},ce=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},le=async()=>{if(!re)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else re=!0},de=async()=>{try{if("undefined"==typeof navigator||!navigator.storage?.estimate)return;const e=await navigator.storage.estimate();return"number"==typeof e.quota&&e.quota>0?e.quota-(e.usage||0):void 0}catch{return}},ue=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},ge=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}},me=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{}},pe=async function*(e){for await(const t of e)yield t},fe=async e=>{try{for await(const[t,r]of pe(e))"file"==r.kind&&ce(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},ye=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await ge(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}},he=async(e,t)=>{const r=await ue(e,t);if(r){const e=await(async e=>await ge(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of pe(e)){const e=ce(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=>{let t=0;const r=[];for(const n of[...e].sort((e,t)=>e.start-t.start))if(n.size){if(n.start!=t)break;r.push(n),t+=n.size}return r})(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 ye(e,t)},we=(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:B(e)||t.total,etag:a||t.etag}},be=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:i})=>{let s,c,l=t,u=0,g=r;const m=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(l),{create:!0});c=await t.createWritable(),u=0},p=async()=>{const e=c;c=void 0,e&&await e.close()};try{const e=o.getReader();for(s=e;;){const{done:r,value:o}=await e.read();if(r)break;i();let s=0;for(g&&(s=Math.min(g,o.byteLength),g-=s);s<o.byteLength;){c||await m();const e=Math.min(ne-u,o.byteLength-s);await c.write({type:"write",position:u,data:o.slice(s,s+e)}),s+=e,u+=e,l+=e,u==ne&&await p()}l>t&&a(n?l/n:0,d.download)}await p()}catch(e){throw await p().catch(()=>{}),await(s?.cancel().catch(()=>{})),e}return l},ve=e=>e?.name==p.quota,Se=e=>{const t=async()=>{const t=await le();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await he(r,se(e)):void 0},download:async({url:r,sourceUrl:n,signal:o,onProgress:a})=>{if(ie.has(r))throw new DOMException("Storage is full",p.quota);const i=`${e}|${r}`,s=ae.get(i);if(s)return await s;const c=await t();if(!c)return;const l=(async(e,t,r,n,o)=>{const a=se(t),i=await ye(e,a);if(i?.complete)return i;let s=await ue(e,a);s||(await e.removeEntry(a).catch(()=>{}),await e.removeEntry(`${a}.json`).catch(()=>{}),s=await e.getDirectoryHandle(a,{create:!0}));let c=0,l=0,u=!1;for(;;){if(n?.aborted)throw new Error("Cancelled");const t=await he(e,a);if(t?.complete)return t;const i=t?.size??0,g=t?.total||0,m=t?.etag||"";if(i>c)c=i,l=0;else if(++l>4)throw new Error("Model download failed");i&&g&&o(i/g,d.download);const f=g?Math.min(i+ne,g)-1:i+ne-1,y=new AbortController,h=()=>y.abort(),w={size:i,total:g,etag:m};let b,v=setTimeout(h,3e4);n?.addEventListener("abort",h,{once:!0});try{if(b=await fetch(r,{signal:y.signal,headers:{Range:`bytes=${i}-${f}`}}),416==b.status){if(await(b.body?.cancel().catch(()=>{})),g&&i>=g){await me(s,{total:g,etag:m,complete:!0});continue}await fe(s),await me(s,{total:0,etag:"",complete:!1});continue}if(!b.ok||!b.body)throw await(b.body?.cancel().catch(()=>{})),new Error("Model download failed");const t=we(b,w);if(!t){await b.body.cancel().catch(()=>{}),await fe(s),await me(s,{total:0,etag:"",complete:!1});continue}await me(s,{total:t.total,etag:t.etag,complete:!1});const n=0==t.start?i:0,c=t.start+n;if(!u&&t.total>c){u=!0;const e=await de();if(null!=e&&e<t.total-c)throw await b.body.cancel().catch(()=>{}),new DOMException("Storage is full",p.quota)}const l=await be({dir:s,start:c,skip:n,total:t.total,body:b.body,onProgress:o,onChunk:()=>{clearTimeout(v),v=setTimeout(h,3e4)}});if(!t.total){await me(s,{total:l,etag:t.etag,complete:!0});const r=await he(e,a);if(r)return r}}catch(e){if(n?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&oe.has(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*l))}finally{clearTimeout(v),n?.removeEventListener("abort",h)}}})(c,r,n||r,o,a).catch(e=>{throw ve(e)&&ie.add(r),e}).finally(()=>{ae.delete(i)});return ae.set(i,l),await l},remove:async e=>{ie.delete(e);const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,se(e))},purge:async()=>{ie.clear();const t=await le();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},xe=(e,...t)=>{!0===e&&console.log(...t)};let Me=!1,je=0;const ke="litertlm-models",Pe=Se("litert-store"),Te={num_output_candidates:1,wait_for_weight_uploads:!0,num_decode_steps_per_sync:1,sequence_batch_size:0,supported_lora_ranks:[],max_top_k:40,enable_decode_logits:!1,enable_external_embeddings:!1,use_submodel:!1,use_autosized_ringbuffers:!0};let De=1,_e=!1,Ne=0;const Oe=new WeakSet,Ee=(...e)=>{Me&&console.log(...e)},Le=(...e)=>{Me&&console.error(...e)},Ce=e=>e.replace(/<\|channel>thought\n?[\s\S]*?<channel\|>/g,"").replace(/<\|channel>thought[\s\S]*$/,"").trim(),Ae=async()=>{const e=performance.now(),t=e-Ne;if(Ne=e,!_e)return;const r=Math.round(((e,t=1)=>Math.min(500,Math.max(0,e*(1/t-1))))(t,De));r<1||(await new Promise(e=>setTimeout(e,r)),Ne=performance.now())},Re=(e=1)=>{De=e>0?e:1,_e=!0,Ne=performance.now()},$e=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(ke)}catch{return}},Ue=new Map,qe=(e,t,r)=>{let n=0;return e.pipeThrough(new TransformStream({transform:(e,o)=>{n+=e.byteLength,r(t?n/t:0,d.download),o.enqueue(e)}}))},Be=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 O(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},ze=(e,t)=>{if(e.role!=t.role)return!1;if("string"==typeof e.content||"string"==typeof t.content)return"string"==typeof e.content&&"string"==typeof t.content&&Ce(e.content)==Ce(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(Ce(n.text)!=Ce(o.text))return!1}else{if("text"==n.type||"text"==o.type)return!1;if(!!n.url!=!!o.url)return!1}}return!0},Ie=async function*({engine:e,mod:t,params:r,messages:n,maxTokens:o,session:a}){const i=n[n.length-1],s=U(r.limits,r.reasoning,r.temperature,o);if("user"!=i?.role)throw new Error("No user turn");const c=n.slice(0,-1),l=(await Be([i]))[0];if(!l)throw new Error("Empty prompt");let d;const u=a.reasoning==r.reasoning&&a.maxTokens==s.max_tokens,g=!!a.conversation&&((e,t)=>{const r="system"==e[0]?.role?e[0]:void 0,n="system"==t[0]?.role?t[0]:void 0;if(!r!=!n)return!1;if(r&&n&&!ze(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(!ze(o[i+e],a[e]))return!1;return!0})(a.sent,c);if(u&&g&&a.conversation)xe(Me,"LiteRT conversation reused",a.sent.length),d=a.conversation;else{const n=await Be(c,!1);a.conversation=void 0,a.sent=[];const o=performance.now();d=await e.createConversation({sessionConfig:{maxOutputTokens:s.max_tokens,samplerParams:{type:t.SamplerType.TOP_K,temperature:s.temperature,k:40,p:.95}},preface:{...n.length?{messages:n}:{},extra_context:{enable_thinking:r.reasoning}},prefillPrefaceOnInit:n.length>0}),xe(Me,"LiteRT conversation created",n.length,Math.round(performance.now()-o),"flags",u,"history",g),a.conversation=d,a.reasoning=r.reasoning,a.maxTokens=s.max_tokens,a.sent=[...c]}a.sent.push(i);let m,p=!1,f=!0,y="";const h=()=>{m&&m.cancel().catch(()=>{});try{Promise.resolve(d.cancel()).catch(()=>{})}catch{}};r.signal?.addEventListener("abort",h,{once:!0});try{if(r.signal?.aborted)return;const e=d.sendMessageStreaming(l).getReader();for(m=e;;){const t=performance.now(),{done:n,value:o}=await e.read().catch(e=>{if(r.signal?.aborted)return{done:!0,value:void 0};throw e}),a=performance.now()-t;if(n)break;const i=f;f=!1,i&&(xe(Me,"LiteRT first chunk",Math.round(a)),Re(r.limits.gpuShare));let s="string"==typeof o.content?o.content:"";const c={};if(Array.isArray(o.content))for(const e of o.content)"text"==e.type&&(s+=e.text);s&&(c.content=s,y+=s);const l=o.channels?.thought;l&&(c.reasoning=l),(c.content||c.reasoning)&&(yield{choices:[{delta:c}]})}p=!0}finally{_e=!1,r.signal?.removeEventListener("abort",h),p&&y?a.sent.push({role:"assistant",content:y}):(a.conversation=void 0,a.sent=[])}},Ke={backend:l.gpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o})=>{Me=!0===o;const i=e.litert;if(!i)throw new Error("Model has no LiteRT artifact");const s=S(e),c=await a.e(520).then(()=>a(507)),u=globalThis,g=u.Module;u.Module={print:Ee,printErr:Le};try{await c.getOrLoadGlobalLiteRtLm(_().script)}finally{u.Module=g}if(n?.aborted)throw new Error("Cancelled");const m=c.getGlobalLiteRtLm(),p=m.liteRtLmWasm;if(await m.setupDefaultWebGpuDevice(),n?.aborted)throw new Error("Cancelled");const f=p.preinitializedWebGPUDevice;if(!f)throw new Error("No WebGPU device");if(!Oe.has(f)){const e=(({device:e,pace:t})=>new Proxy(e,{get:(e,r)=>{if("createBuffer"==r)return(...n)=>{const o=Reflect.get(e,r,e).apply(e,n),a=o.mapAsync;try{o.mapAsync=async(...e)=>{await a.apply(o,e),await t()}}catch{}return o};const n=Reflect.get(e,r,e);return"function"==typeof n?n.bind(e):n}}))({device:f,pace:Ae});Oe.add(f),Oe.add(e),p.preinitializedWebGPUDevice=e}let y,h=!1;const w=q(i.repo,i.file,i.revision),b=q(i.repo,i.file),v=await $e(),x=v?await v.match(w)||await v.match(b):void 0;if(x?.body)y=x.body;else{const e=await Pe.stored(b);e?.complete&&(y=e.file.stream())}if(!y){const e=await Pe.download({url:b,sourceUrl:w,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");o&&console.log("Local model store failed",e),h=ve(e)});e&&(y=e.file.stream())}if(!y&&v&&!h)try{await(async(e,t,r,n)=>{const o=Ue.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=B(o),i=qe(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{Ue.delete(e)});return Ue.set(e,a),await a})(w,v,n,r);const e=await v.match(w);e?.body&&(y=e.body)}catch(e){if(n?.aborted)throw new Error("Cancelled");o&&console.log("Local model cache failed",e)}if(y||(y=await(async(e,t,r)=>{const n=await fetch(e,{signal:t});if(!n.ok||!n.body)throw new Error("Model download failed");return qe(n.body,B(n),r)})(w,n,r)),n?.aborted)throw new Error("Cancelled");r(1,d.load);const M=await c.Engine.create((({model:e,limits:t,contextSize:r,source:n,mod:o})=>{const a=e.litert;return{model:n,mainExecutorSettings:{maxNumTokens:r,...a?.vision?{maxNumImages:Math.max(1,t.maxImages)}:{},backendConfig:Te},...a?.vision?{visionBackend:o.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...a?.audio?{audioBackend:o.Backend.CPU}:{}}})({model:e,limits:t,contextSize:s,source:y,mod:c}));je+=1;const j=()=>{je=Math.max(0,je-1),je||(e=>{try{const t=e.getGlobalLiteRtLm().liteRtLmWasm,r=t.preinitializedWebGPUDevice;t.preinitializedWebGPUDevice=void 0,t.WebGPU&&(t.WebGPU.preinitializedDeviceId=void 0),r?.destroy?.()}catch{}try{e.unloadLiteRtLm()}catch{}})(c)};try{const e=performance.now(),t=await M.createConversation();await t.delete(),xe(Me,"LiteRT conversation warm-up",Math.round(performance.now()-e))}catch(e){xe(Me,"LiteRT conversation warm-up failed",e)}if(n?.aborted)throw await M.delete(),j(),new Error("Cancelled");const k={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:l.gpu,contextSize:s,chat:t=>(async({engine:e,model:t,mod:r,params:n,session:o})=>{Me=!0===n.logging;const a=()=>{try{o.conversation?.cancel()}catch{}o.conversation=void 0,o.sent=[]};try{const i=await te({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async(a,i)=>{if(n.signal?.aborted)throw new Error("Cancelled");if(I(a)&&!t.litert?.vision)throw new Error("Model does not accept images");if(K(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return Ie({engine:e,mod:r,params:n,messages:a,maxTokens:i,session:o})}}),s=o.conversation;if(s&&n.onPromptSpeed&&!n.signal?.aborted){const e=await s.getBenchmarkInfo().catch(()=>{}),t=e?.lastPrefillTokensPerSecond;"number"==typeof t&&Number.isFinite(t)&&t>0&&n.onPromptSpeed((0,T.rNum)(t))}return i}catch(e){throw a(),e}})({engine:M,model:e,mod:c,params:t,session:k}),unload:async()=>{const e=k.conversation;k.conversation=void 0,k.sent=[];try{await(e?.delete())}catch{}await M.delete(),j()}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=q(t.repo,t.file,t.revision),n=q(t.repo,t.file),[o,a]=await Promise.all([$e(),Pe.stored(n)]);if(a?.complete)return!0;try{return!(!o||!await o.match(r)&&!await o.match(n))}catch{return!1}},purge:async()=>{try{await Pe.purge(),"undefined"!=typeof caches&&await caches.delete(ke)}catch{}}};let Fe,We,Ve="",Ge=!1;const Je=Se("wllama-store"),Ye=3e4,He=[f.qwen3_vl_2b_instruct,f.qwen3_vl_2b_instruct_q3],Qe=e=>e.cpu?.mmproj&&He.includes(e.id)?{image_min_tokens:16,image_max_tokens:128}:{},Ze=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Xe=e=>{const t=D();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},et=e=>{const t=e=>(...t)=>{Ge&&("string"==typeof t[0]&&t[0].includes("ggml_webgpu: Failed to get an adapter")||e(...t))};return{...e,log:t(e.log),warn:t(e.warn),error:t(e.error)}},tt=async()=>{if(Fe)return Fe;const e=await a.e(924).then(()=>a(577)),t=We||Xe(),r=new e.Wllama({default:t.wasm},{logger:et(e.LoggerWithoutDebug)});return We||(We=t,Ve=Ze(t)),r.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),Fe=r,r},rt=async()=>{const e=Fe;Fe=void 0;try{await(e?.exit())}catch{}},nt=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),ot=e=>{const t=e.cpu;return t?[{name:t.file,url:q(t.repo,t.file,t.revision)},...t.mmproj?[{name:t.mmproj.file,url:q(t.mmproj.repo??t.repo,t.mmproj.file,t.mmproj.revision??t.revision)}]:[]]:[]},at=async e=>{const t=ot(e);if(!t.length)return!1;for(const e of t){const t=await Je.stored(e.url);if(!t?.complete)return!1}return!0},it=async(e,t,r,n)=>{const o=new AbortController,a=()=>o.abort();let i=setTimeout(a,Ye);n?.addEventListener("abort",a,{once:!0});try{const n=await fetch(e,{signal:o.signal,headers:{Range:`bytes=${t}-${r-1}`}});if(206!=n.status)throw await(n.body?.cancel().catch(()=>{})),new Error("Model range failed");const s=n.body?.getReader(),c=[];let l=0;if(!s)throw new Error("Model range failed");for(;;){const{done:e,value:t}=await s.read();if(e)break;clearTimeout(i),i=setTimeout(a,Ye),c.push(t),l+=t.byteLength}const d=new Uint8Array(l);let u=0;for(const e of c)d.set(e,u),u+=e.byteLength;return d.buffer}finally{clearTimeout(i),n?.removeEventListener("abort",a)}},st=async(e,t)=>{const r=new AbortController,n=()=>r.abort(),o=setTimeout(n,Ye);t?.addEventListener("abort",n,{once:!0});try{const t=await fetch(e,{method:"HEAD",signal:r.signal});await(t.body?.cancel().catch(()=>{}));const n=Number(t.headers.get("content-length"))||0;if(!t.ok||!n)throw new Error("Model size unknown");return n}finally{clearTimeout(o),t?.removeEventListener("abort",n)}},ct=({url:e,stored:t,storedSize:r,total:n,signal:o,onBytes:a})=>{const i=Math.max(0,Math.min(r,n));return{size:n,slice:(r,s)=>({arrayBuffer:async()=>{const c=Math.max(0,Math.min(r??0,n)),l=Math.max(c,Math.min(s??n,n));if(l<=c)return new ArrayBuffer(0);let d;if(t&&l<=i)d=await t.slice(c,l).arrayBuffer();else if(!t||c>=i)d=await it(e,c,l,o);else{const r=await t.slice(c,i).arrayBuffer(),n=await it(e,i,l,o),a=new Uint8Array(r.byteLength+n.byteLength);a.set(new Uint8Array(r)),a.set(new Uint8Array(n),r.byteLength),d=a.buffer}return a?.(d.byteLength),d}})}},lt=async({model:e,signal:t,onProgress:r})=>{const n=ot(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await Je.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},dt=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 O(t.url)});t.push({role:"user",content:e})}return t},ut={backend:l.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:a})=>{Ge=!0===o;const i=S(e),s=e.cpu;if(!s)throw new Error("Model has no CPU artifact");const c=Xe(a),u=Ze(c);Fe&&u!=Ve&&await rt(),We=c,Ve=u;const g="undefined"!=typeof navigator?navigator.hardwareConcurrency:0,m=Math.min((e=>{const t=e||4;return Math.max(1,t-Math.max(1,Math.floor(t/5)))})(g),t.maxThreads),p=await tt(),f=await at(e),y=s.mmproj?.file;if(n?.aborted)throw await rt(),new Error("Cancelled");if(!f&&y){const e=await p.cacheManager.list(),t=e.some(e=>nt(e,s.file)),r=e.some(e=>nt(e,y));t&&!r&&await p.cacheManager.deleteMany(e=>nt(e,s.file))}const h={n_ctx:i,n_threads:m,n_parallel:1,warmup:!0,...e.reasoning?{reasoning_budget_tokens:t.maxThinkingTokens}:{reasoning_budget_tokens:0},n_gpu_layers:0,jinja:!0,ctx_shift:!0,n_keep:Math.max(64,Math.round(i/16)),...Qe(e)};let w=0,b=0,v=!1;try{let t=f?await lt({model:e,signal:n,onProgress:r}):void 0;t||(t=await(async(e,t)=>{const r=ot(t);if(!r.length)return;const n=(await e.modelManager.getModels().catch(()=>[])).find(e=>e.url==r[0].url);return n?await n.open().catch(()=>{}):void 0})(p,e)),t||(t=await lt({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");o&&console.log("Local model store failed",e)})),t?r(1,d.load):(v=!0,t=await(async(e,t,r,n)=>{const o=[];let a=0;for(const n of ot(e)){if(t?.aborted)throw new Error("Cancelled");const e=await Je.stored(n.url),i=e?.total||await st(n.url,t);if(!i)throw new Error("Model size unknown");a+=i,o.push(ct({url:n.url,stored:e?.file,storedSize:Math.min(e?.size||0,i),total:i,signal:t,onBytes:r}))}return n?.(a),o})(e,n,e=>{b&&(w=Math.min(b,w+e),w>=b?r(1,d.load):r(w/b,d.download))},e=>{b=e}),r(0,d.download)),await p.loadModel(t,h),v&&r(1,d.load)}catch(e){throw await rt(),e}if(n?.aborted)throw await rt(),new Error("Cancelled");const x=p.getLoadedContextInfo();if(!x.n_ctx)throw await rt(),new Error("Failed to create model context");return xe(o,"CPU engine ready",e.id,"cores","undefined"!=typeof navigator?navigator.hardwareConcurrency:0,"isolated","undefined"!=typeof crossOriginIsolated&&crossOriginIsolated,"requested",m,"multithread",p.isMultithread(),"active",p.getNumThreads(),"context",x.n_ctx,"batch",x.n_batch,"ubatch",x.n_ubatch),{model:e,backend:l.cpu,contextSize:i,chat:t=>(async(e,t,r)=>{if(Ge=!0===r.logging,e.isModelLoaded())return await te({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async(n,o)=>{if(I(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if(K(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await dt(n),...U(r.limits,r.reasoning,r.temperature,o),timings_per_token:!0,return_progress:!0,...r.repeatPenalty?{penalty_repeat:r.repeatPenalty}:{},abortSignal:r.signal,...t.reasoning||He.includes(t.id)?{chat_template_kwargs:{enable_thinking:r.reasoning}}:{}})}})})(p,e,t),unload:async()=>{if(Fe==p)await rt();else try{await p.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await at(e)||await(async(e,t)=>{const r=ot(t),n=await e.modelManager.getModels().catch(()=>[]);return!!r.length&&n.some(e=>e.url==r[0].url&&(!r[1]||e.mmprojUrl==r[1].url))})(await tt(),e))}catch{return!1}},purge:async()=>{try{await Je.purge()}catch{}try{const e=await tt();await e.cacheManager.clear()}catch{}}},gt=((e={})=>{let t,r,n,o=c.idle;const a=e.engines?.cpu||ut,i=e.engines?.litert||Ke,s=new Map,u=new Map,g=new Map,m=new Map,p=new Map,f=new Map,y=new Map,h=new Map,w=new Map,b=t=>{if(e.backend!=l.none)return e.backend==l.cpu?t.cpu?a:void 0:e.backend==l.gpu?t.litert?i:void 0:t.litert&&"undefined"!=typeof navigator&&navigator.gpu&&"undefined"!=typeof WebAssembly?i:!t.cpu||"undefined"==typeof window&&"undefined"==typeof self&&"undefined"==typeof Worker||"undefined"==typeof WebAssembly?void 0:a},v=e=>e?s.get(e):t?s.get(t.id):void 0,S=e=>{o=e},x=async e=>{const r=s.get(e);r&&(s.delete(e),t?.id==e&&(t=[...s.values()].pop()?.model),s.size||u.size||S(c.idle),await r.unload())},M=async()=>{for(const e of[...s.keys()])await x(e)},j=(e,t,r)=>{const n={percent:Math.max(0,Math.min(1,t)),phase:r||d.download};p.set(e,n);for(const t of m.get(e)??[])t.report(n.percent,n.phase)},k=e=>{y.set(e,(y.get(e)??0)+1),f.get(e)?.abort(),f.delete(e);const t=u.get(e);t&&g.set(e,t),u.delete(e),m.delete(e),p.delete(e),h.set(e,c.idle),o!=c.downloading||u.size||s.size||S(c.idle)},P=(e,t,r)=>{const n=u.get(e);return n?new Promise(o=>{let a=!1;const i={report:t,settle:e=>{a||(a=!0,r?.removeEventListener("abort",s),o(e))}},s=()=>{((e,t)=>{const r=m.get(e);r&&m.set(e,r.filter(e=>e!=t)),queueMicrotask(()=>{!m.get(e)?.length&&u.has(e)&&k(e)})})(e,i),i.settle(!1)},c=m.get(e);c?c.push(i):m.set(e,[i]),r?.aborted?s():r?.addEventListener("abort",s,{once:!0}),n.attempt.then(i.settle,()=>i.settle(!1))}):Promise.resolve(!1)},T=async e=>{if(e)await x(e);else{for(const e of[...u.keys()])k(e);p.clear(),h.clear(),w.clear(),r=void 0,S(c.idle),await M()}};return{load:async({model:e,limits:n,assets:o,logging:a,signal:i,onProgress:l})=>{if(i?.aborted)return!1;if(s.has(e.id))return t=e,!0;if(u.has(e.id)){const t=p.get(e.id);return t&&l(t.percent,t.phase),await P(e.id,l,i)}const v=b(e);if(!v){const t="Model is not supported on this device";return r=t,w.set(e.id,t),h.set(e.id,c.unsupported),S(c.unsupported),!1}const x=[...u.values(),...g.values()];for(const e of x)k(e.model.id);const T=(y.get(e.id)??0)+1;let D;y.set(e.id,T);const _=(async()=>{if(await Promise.all(x.map(e=>e.attempt.catch(()=>!1))),T!=y.get(e.id))return!1;if(await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})(),T!=y.get(e.id))return!1;if(await M(),T!=y.get(e.id))return!1;const i=await v.cached(e);if(T!=y.get(e.id))return!1;r=void 0,w.delete(e.id),h.set(e.id,c.downloading),S(c.downloading),j(e.id,0,d.download),i&&j(e.id,1,d.load);const l=new AbortController;f.set(e.id,l);try{const i=await v.startLLM({model:e,limits:n,logging:a,signal:l.signal,assets:o,onProgress:(t,r)=>{T==y.get(e.id)&&j(e.id,t,r)}});return T!=y.get(e.id)||l.signal.aborted?(await i.unload(),!1):(s.set(e.id,i),t=e,r=void 0,w.delete(e.id),h.set(e.id,c.ready),S(c.ready),j(e.id,1,d.load),!0)}catch(t){if(T!=y.get(e.id))return!1;const n=`${t?.message||`${t}`}`;return r=n,w.set(e.id,n),h.set(e.id,c.error),S(c.error),a&&console.log("Local model failed",t),!1}finally{f.get(e.id)==l&&f.delete(e.id)}})(),N=_.finally(()=>{g.get(e.id)==D&&g.delete(e.id),u.get(e.id)==D&&(u.delete(e.id),m.delete(e.id),p.delete(e.id))});return D={model:e,attempt:N},u.set(e.id,D),m.set(e.id,[]),await P(e.id,l,i)},chat:async e=>{if(!v(e.model))return;for(;n;)await n.catch(()=>{});const r=v(e.model);if(!r)return;t?.id!=r.model.id&&(t=r.model);const o=r.chat(e);n=o;try{return await o}finally{n==o&&(n=void 0)}},unload:T,clear:async()=>{const e=[...u.values(),...g.values()].map(e=>e.attempt);await T(),await Promise.all(e.map(e=>e.catch(()=>{}))),await Promise.all([a.purge(),i.purge()])},ready:e=>!!v(e),loading:e=>e?u.has(e):u.size>0,status:e=>v(e)?c.ready:e?u.has(e)?h.get(e)??c.downloading:w.has(e)?h.get(e)??c.error:c.idle:o,backend:e=>v(e)?.backend??l.none,error:e=>e?w.get(e):r,model:()=>t}})(),mt=(e,t,r)=>{const n=e.status(t),o=x(t);return{...t?{model:t}:{},availability:n==c.ready?s.online:n==c.error||n==c.unsupported?s.offline:s.away,status:n,backend:e.backend(t),supportsImages:!!o&&k(o),supportsAudio:!!o&&P(o),ready:e.ready(t),loading:e.loading(t),requesting:r.requesting,phase:r.phase,percent:r.percent,...r.error?{error:r.error}:{}}},pt=(e=>{let t,r=0;const n=t=>t.input.onStatus?.(mt(e,t.model??t.input.model,t));return o=>{t?.controller.abort();const a=e.ready(o.model),s={token:++r,input:o,controller:new AbortController,percent:a?100:0,phase:a?d.load:d.download,requesting:!1,cancelled:!1};return t=s,n(s),(async t=>{const{input:o}=t,a=!0===o.logging,s=await j(o.model);if(t.model=s?.id,t.token!=r)return;const c=o.messages.some(e=>e.role!=i.system&&"string"==typeof e.content&&!!e.content.trim()),l=o.messages.some(e=>e.role==i.user&&!!e.images?.some(e=>"string"==typeof e&&!!e)),u=o.messages.some(e=>e.role==i.user&&!!e.audio?.some(e=>"string"==typeof e&&!!e)),g=c||l||u;if(!s)return t.error="Unknown model",void n(t);if(!g)return t.error="No prompt",void n(t);const m=k(s),p=P(s);if(!(c||l&&m||u&&p))return u&&!p?t.error="Model does not accept audio":l&&!m&&(t.error="Model does not accept images"),void n(t);const f=$(o.limits,!!s.litert),y=await e.load({model:s,limits:f,logging:a,signal:t.controller.signal,onProgress:(e,o)=>{t.token==r&&(t.percent=Math.round(100*e),t.phase=o,n(t))}}).catch(e=>(t.token==r&&(t.error=`${e?.message||`${e}`}`),!1));if(t.token!=r)return;if(t.cancelled)return void n(t);if(!y)return t.error||(t.error=e.error(s.id)||"Model not ready"),void n(t);const h=l&&!m||u&&!p?o.messages.map(({images:e,audio:t,...r})=>({...r,...e&&m?{images:e}:{},...t&&p?{audio:t}:{}})):o.messages;t.requesting=!0,t.error=void 0,t.percent=100,t.phase=d.load,n(t);let w,b="",v="";try{w=await e.chat({model:s.id,messages:h,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||(v+=e,o.onResponse?.(v))},onSpeed:e=>{t.token!=r||t.cancelled||o.onSpeed?.(e)},onPromptSpeed:e=>{t.token!=r||t.cancelled||o.onPromptSpeed?.(e)},signal:t.controller.signal})}catch(o){if(t.token!=r)return;return t.requesting=!1,t.error=`${o?.message||`${o}`}`,t.cancelled||await e.unload(s.id).catch(()=>{}),void n(t)}t.token==r&&(t.requesting=!1,w||t.cancelled||(t.error="No reply",await e.unload(s.id).catch(()=>{})),n(t))})(s),()=>(t=>{t.token==r&&(t.cancelled=!0,t.controller.abort(),t.model&&e.status(t.model)==c.ready?e.unload(t.model).then(()=>n(t)):queueMicrotask(()=>n(t)))})(s)}})(gt),ft=(ht=gt,async(e={})=>{const t=await j(e.model),r=r=>e.onStatus?.(mt(ht,t?.id,r));if(!t)return r({requesting:!1,phase:d.download,percent:0,error:"Unknown model"}),!1;let n,o=0,a=d.download;const i=ht.ready(t.id);return await ht.load({model:t,limits:$(e.limits,!!t.litert),logging:!0===e.logging,onProgress:(e,t)=>{o=Math.round(100*e),a=t,r({requesting:!1,phase:a,percent:o})}}).catch(e=>(n=`${e?.message||`${e}`}`,!1))?(i&&r({requesting:!1,phase:d.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||ht.error(t.id)||"Model not ready"}),!1)}),yt=async()=>{await gt.clear()};var ht,wt=a(993);let bt;const vt="degreesign-chat-estimates-v1",St={analyze:95,describe:25,translate:15,tags:6,translateTags:4},xt=()=>bt??=(0,wt.readData)(vt)??{},Mt=e=>{const t=e.map(e=>({operation:e,est:xt()[e]??St[e]}));return{totalEst:t.reduce((e,t)=>e+t.est,0),breakdown:t}},jt=({operation:e,seconds:t})=>{t>0&&(bt={...xt(),[e]:t},(0,wt.saveData)({key:vt,data:bt}))},kt=["You are describer of images","in detailed efficient manner.","You share descriptions after replacing","euphemisms with all specific terms.","You include visible organs/limbs,","with pose and actions, only for living things.","You always describe the overall nature,","state, pose, acts, positions, and locations.","You always give priority to interesting,","unusual, shocking, explicit,","or weird facts about the image.","You never: lie, use vague referrals,","use a general term when a precise term exists,","use euphemisms, nor include any part","of the message in your response."].join(" "),Pt=["Describe this image in one detail blunt","concise paragraph, prioritize most","head-turning elements over mundane elements."].join(" "),Tt=e=>["You tag photos for a private photo gallery.","Read each numbered image description below","and reply with exactly one line per number.","Each line is the number, a colon,",`then exactly ${e}`,"comma separated single word tags","for the most prominent concrete","elements the photo shows.","Tag its main subjects, objects,","actions and place, never the medium or","filler ideas such as photo, image,","picture, scene, object, background or colour.","Produce the tags even if the","photo is extreme or explicit.","Always add the first tag as",'"nsfw" if the photo is',"flirty, suggestive or explicit.","Write every tag in English as one word.","Reply with the numbered lines only,","in the form: 1. tag, tag, tag"].join(" "),Dt=e=>["You translate the tags of",`a private photo gallery into ${e}.`,"Read each numbered English tag","below and reply with exactly one line per tag.","Each line is the number, a colon,",`then the tag in ${e}:`,"one single word, without articles or explanation.","Use only letters.","Reply with the numbered","lines only, without quotes."].join(" "),_t=["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(" "),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"].join(" "),Ot=f.qwen3_vl_2b_instruct,Et="CANNOT_TRANSLATE",Lt=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},Ct=e=>"string"==typeof e?e.toLowerCase().replace(/[^\p{L}]+/gu,"").slice(0,20):"",At=async({service:e,limits:t,logging:r,signal:n,onStatus:o,model:a})=>{const i=(t,r)=>o?.(mt(e,t,r)),s=x(a)??await j();if(!s)return xe(r,"Model missing",a),i(a||Ot,{requesting:!1,phase:d.download,percent:0,error:"Unknown model"}),{error:"Unknown model"};const c=await(async o=>{let a,s=0,c=-1,l=d.download;xe(r,"Describe load start",o.id,t.maxReplyTokens);if(await e.load({model:o,limits:t,logging:r,signal:n,onProgress:(e,t)=>{s=Math.round(100*e),l=t,s!=c&&(c=s,xe(r,"Describe load progress",o.id,s,l)),i(o.id,{requesting:!1,phase:l,percent:s})}}).catch(e=>(a=`${e?.message||`${e}`}`,!1)))return xe(r,"Describe load ready",o.id),void i(o.id,{requesting:!1,phase:d.load,percent:100});const u=a||e.error(o.id)||"Model not ready";return xe(r,"Describe load failed",o.id,u),i(o.id,{requesting:!1,phase:l,percent:s,error:u}),u})(s);return c?{error:c}:n?.aborted?{aborted:!0}:(i(s.id,{requesting:!0,phase:d.load,percent:100}),{report:i,generate:async({model:o,messages:a,stage:s,repeatPenalty:c,temperature:l,limits:u,onSpeed:g,onText:m})=>{let p="";const f=Date.now();if(xe(r,"Describe generate start",s,o,a.length),!n?.aborted)try{const i=await e.chat({model:o,messages:a,limits:u?{...t,...u}:t,reasoning:!1,...c?{repeatPenalty:c}:{},...void 0===l?{}:{temperature:l},logging:r,signal:n,onReason:e=>{xe(r,"Describe reason",s,o,e)},onText:e=>{p+=e,xe(r,"Describe text",s,o,e),m?.(p)},onSpeed:e=>{xe(r,"Describe speed",s,o,e),g?.(e)}});return xe(r,"Describe generate reply",s,o,Date.now()-f,i?.length??0,i),i}catch(e){if(xe(r,"Describe generate failed",s,o,e),n?.aborted)return;throw i(o,{requesting:!1,phase:d.load,percent:100,error:`${e?.message||`${e}`}`}),e}},model:s})},Rt=e=>async t=>{const r=!0===t.logging,n=$({maxReplyTokens:128,imageTokens:192,...t.limits});t.onEstimate?.(Mt([u.analyze,u.describe])),xe(r,"Describe image start",t.image.length);const o=await At({service:e,limits:n,logging:r,signal:t.signal,onStatus:t.onStatus,model:Ot});if("error"in o)throw new Error(o.error);if("aborted"in o)return"";let a,s="";const{report:c,generate:l,model:g}=o,m=Date.now();try{s=(await l({model:g.id,messages:[{role:i.system,content:t.systemRulesOverride||kt},{role:i.user,content:Pt,images:[t.image]}],stage:"describe",repeatPenalty:1,temperature:.1,onSpeed:t.onSpeed,onText:e=>{a??=Date.now(),t.onText?.(e)}})||"").trim()}catch(e){if(t.signal?.aborted)return"";throw e}const p=Date.now();return xe(r,"Describe image done",p-m,s),c(g.id,{requesting:!1,phase:d.load,percent:100}),s?(jt({operation:u.analyze,seconds:((a??p)-m)/1e3}),jt({operation:u.describe,seconds:(p-(a??m))/1e3}),s):(xe(r,"Describe image empty"),c(g.id,{requesting:!1,phase:d.load,percent:100,error:"No description"}),"")},$t=e=>async t=>{const r=t.tags.map(e=>({...e})),n=t.targetLanguage.trim(),o=t.targetCode.trim()||"en",a=!0===t.logging;if(!r.length||"en"==o||!Lt(n))return r;t.onEstimate?.(Mt([u.translateTags]));const s=$({maxReplyTokens:256,...t.limits}),c=await At({service:e,limits:s,logging:a,signal:t.signal,onStatus:t.onStatus,model:t.model});if("error"in c||"aborted"in c)return r;const{report:l,generate:m,model:p}=c,f=Date.now(),y=r.map((e,t)=>`${t+1}. ${e.en}`).join("\n");try{((e,t,r)=>{if("en"!=r)for(const n of e.matchAll(/^\s*(\d+)\s*[:.\-]\s*(.+)$/gm)){const e=t[Number(n[1])-1],o=Ct(n[2]);e&&o&&o!=e.en&&(e[r]=o)}})((await m({model:p.id,messages:[{role:i.system,content:Dt(n)},{role:i.user,content:y}],stage:g.translateTags,limits:{maxReplyTokens:256},onText:t.onText})||"").trim(),r,o),jt({operation:u.translateTags,seconds:(Date.now()-f)/1e3})}catch(e){xe(a,"Enhance tag translate failed",e)}return l(p.id,{requesting:!1,phase:d.load,percent:100}),r},Ut=e=>async t=>{const r=t.descriptionEN.trim(),n=t.targetLanguage.trim(),o=t.targetCode.trim()||"en",a=!1!==t.withTags,s=!1!==t.withDescription,c=!0===t.logging,l=$t(e),m=!!r&&s&&"en"!=o&&Lt(n),p=a&&"en"!=o&&Lt(n),f=[...m?[u.translate]:[],...a?[u.tags]:[],...p?[u.translateTags]:[]],y={description:r,translated:!1,tags:[],nsfw:void 0};if(xe(c,"Enhance start",r.length,n,o),!r||!f.length)return y;t.onEstimate?.(Mt(f));const h=$({maxReplyTokens:256,...t.limits}),w=await At({service:e,limits:h,logging:c,signal:t.signal,onStatus:t.onStatus,model:t.model});if("error"in w||"aborted"in w)return y;const{report:b,generate:v,model:S}=w;if(m){t.onStage?.(g.translate);const e=Date.now();try{const o=(await v({model:S.id,messages:[{role:i.system,content:_t},{role:i.user,content:"[image] describe this image in English very accurately"},{role:i.assistant,content:r},{role:i.user,content:Nt(n)}],stage:g.translate,limits:{maxReplyTokens:256},onSpeed:t.onSpeed,onText:e=>t.onText?.(e,g.translate)})||"").trim(),a=o.replace(/[^a-z]/gi,"").toUpperCase().includes(Et.replace(/[^a-z]/gi,""));o&&!a&&(y.description=o,y.translated=!0),jt({operation:u.translate,seconds:(Date.now()-e)/1e3})}catch(e){xe(c,"Enhance translate failed",e)}}if(a){t.onStage?.(g.tags);const e=Date.now();try{const n=(e=>{const t=[],r=e=>{const r=(e=>"string"==typeof e?e.toLowerCase().replace(/[^a-z]+/g,"").slice(0,20):"")(e);r.length<2||t.some(e=>e.en==r)||t.push({en:r})};for(const t of e.matchAll(/^\s*\d+\s*[:.\-]\s*(.+)$/gm))for(const e of(t[1]||"").split(/[,;\n]+/))for(const t of e.split(/\s+/))r(t);if(!t.length)for(const t of e.split(/[,;\n]+/))for(const e of t.split(/\s+/))r(e);return t})((await v({model:S.id,messages:[{role:i.system,content:Tt(3)},{role:i.user,content:r}],stage:g.tags,limits:{maxReplyTokens:128},onSpeed:t.onSpeed,onText:e=>t.onText?.(e,g.tags)})||"").trim());y.nsfw=n.some(e=>"nsfw"==e.en),y.tags=n.filter(e=>"nsfw"!=e.en).slice(0,3),jt({operation:u.tags,seconds:(Date.now()-e)/1e3}),xe(c,"Enhance tags",y.tags)}catch(e){xe(c,"Enhance tags failed",e)}}return p&&y.tags.length&&(t.onStage?.(g.translateTags),y.tags=await l({tags:y.tags,targetLanguage:n,targetCode:o,model:S.id,signal:t.signal,limits:t.limits,logging:c,onStatus:t.onStatus,onText:e=>t.onText?.(e,g.translateTags)})),b(S.id,{requesting:!1,phase:d.load,percent:100}),y},qt=Rt(gt),Bt=Ut(gt),zt=$t(gt),It=e=>{const t=e.trim().toLowerCase();return!!t&&!/^(en|eng|english)([-_]|$)/.test(t)},Kt=(e=>{const t=Rt(e),r=Ut(e);return async e=>{let n;const o=[],a=e.targetLanguage.trim()||"en",i=async()=>n??=await M();for(let n=0;n<e.images.length&&!e.signal?.aborted;n++){e.currentIndex?.(n);let s="";const c=Date.now(),l=e.images[n];try{s=await t({image:l,systemRulesOverride:e.additionalRules,signal:e.signal,limits:e.limits,logging:e.logging,onStatus:e.onStatus,onSpeed:t=>e.onSpeed?.(n,t),onText:t=>e.onText?.(n,t,"describe")})}catch{}const d=Math.max(0,Date.now()-c);if(!s){o.push({descriptionEN:"",description:"",durationMs:d}),e.currentIndex?.(n,"",void 0,d);continue}e.currentIndex?.(n,s,void 0,d);let u=s;if(It(e.targetLanguage)&&await i())try{const t=await r({descriptionEN:s,targetLanguage:e.targetLanguage,targetCode:a,withTags:!1,withDescription:!0,model:f.gemma4_e2b_limited,signal:e.signal,limits:e.limits,logging:e.logging,onStatus:e.onStatus,onSpeed:t=>e.onSpeed?.(n,t),onText:(t,r)=>{r==g.translate&&e.onText?.(n,t,"translate")}});t.translated&&(u=t.description)}catch{}if(o.push({descriptionEN:s,description:u,durationMs:d}),e.currentIndex?.(n,s,u,d),e.signal?.aborted)break}return o}})(gt),Ft=(e=>{const t=Ut(e);return async e=>{const r=[...e.descriptions],n=e.targetLanguage.trim(),o=n||"en";if(!r.length||!It(n))return r;if(!await M())return r;for(let a=0;a<r.length&&!e.signal?.aborted;a++){const i=r[a]||"";if(!i){e.currentIndex?.(a,i,i);continue}let s=i;try{const r=await t({descriptionEN:i,targetLanguage:n,targetCode:o,withTags:!1,withDescription:!0,model:f.gemma4_e2b_limited,signal:e.signal,limits:e.limits,logging:e.logging,onStatus:e.onStatus,onSpeed:t=>e.onSpeed?.(a,t),onText:(t,r)=>{r==g.translate&&e.onText?.(a,t,"translate")}});r.translated&&(s=r.description)}catch{}r[a]=s,e.currentIndex?.(a,i,s)}return r}})(gt),Wt=/^[0-9+\-*/%^().]+$/,Vt=e=>{let t=0;const r=e=>!!e&&e>="0"&&e<="9",n=e=>{throw new Error(e)},o=()=>{let o;for("("==e[t]?(t++,o=s(),")"!=e[t]&&n("Unbalanced parentheses"),t++):o=(()=>{const o=t;for(;r(e[t]);)t++;let a="";const i=e.slice(o,t);if("."==e[t]){t++;const n=t;for(;r(e[t]);)t++;a=e.slice(n,t)}return i||a?Number(`${i||"0"}.${a||"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},Gt={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(!Wt.test(t))throw new Error("Unsupported character");const r=Vt(t);return{expression:t,result:Math.abs(r)>=1e5?(0,T.pNum)(r)??r:(0,T.rNum)(r,12)}})(t)}};let Jt,Yt={},Ht=0,Qt=!1,Zt=!1;const Xt="degreesign-chat-prices-v1",er="EUR",tr=5*T.oneMin,rr=30*T.oneSec,nr=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},or=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,ar=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=nr(e.rates?.current),n=nr(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=or(Yt.fiat,a)),i&&(Yt.crypto=or(Yt.crypto,i)),Ht=0,Qt=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(Xt,JSON.stringify(Yt))}catch{}})()}catch(e){throw Ht=Date.now(),Qt=!0,e}},ir=e=>!!Yt.crypto&&(e in Yt.crypto.prices||e in Yt.crypto.yesterday),sr=e=>!!Yt.fiat&&(e in Yt.fiat.rates||e in Yt.fiat.yesterday),cr=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==er)continue;const e=ir(r)||sr(r);!ir(r)&&e||(t.crypto=!0),ir(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(Yt.fiat?.fetchedAt??0)>=T.oneHr,o=t.crypto&&r-(Yt.crypto?.fetchedAt??0)>=tr;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||Ht&&r-Ht<rr||(Jt||(Jt=ar({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{Jt=void 0})),await Jt))},lr=e=>{if(e==er)return 1;const t=Yt.crypto?.yesterday[e],r=Yt.fiat?.yesterday[e];return t||(r?1/r:void 0)},dr=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},ur=e=>Math.abs(e)>=1e5?(0,T.pNum)(e)??e:(0,T.rNum)(e,8),gr=async e=>{(()=>{if(!Zt){Zt=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(Xt);if(!e)return;const t=JSON.parse(e);Yt={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=dr(e.from,"from"),r=void 0===e.to||null===e.to?er:dr(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 cr([t,r]);const o=e=>{const t=(e=>{if(e==er)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(ir(e)||sr(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=lr(t),c=lr(r),l=a/i,d=s&&c?s/c:void 0,u=void 0===d?void 0:l-d,g=void 0===d?void 0:100*(l/d-1),m=(e=>{const t=[];for(const r of e)r!=er&&(ir(r)?Yt.crypto&&t.push(Yt.crypto.sourceAt):sr(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:ur(l),...void 0===d?{}:{previousRate:ur(d),change:ur(u??0),changePercent:(0,T.rNum)(g??0,4)},result:ur(n*l),updatedAt:new Date(p).toISOString(),stale:Qt&&!(!Yt.fiat&&!Yt.crypto)}},mr={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=>gr(e)},pr={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},fr=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,yr=(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 pr[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),hr=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,wr=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)}},br=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==h.duckduckgo?h.duckduckgo:h.wikipedia,language:hr.test(t)?t:"en",limit:Math.round(fr(e.limit,1,20,3)),snippetLength:Math.round(fr(e.snippetLength,1,4e3,400)),timeout:fr(e.timeout,1e3,3e4,8e3)}})(e);return{name:"websearch",description:t.provider==h.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==h.duckduckgo?await(async(e,t)=>{const r=`https://api.duckduckgo.com/?format=json&no_html=1&skip_disambig=1&q=${encodeURIComponent(t)}`,n=await wr(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:yr(r||n,200),url:t,snippet:yr(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 wr(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:yr(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:yr(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},vr=(e,t)=>{const r=[];for(const n of e)n==y.websearch?r.push(br(t)):n==y.calculate?r.push(Gt):n==y.currency&&r.push(mr);return r},Sr=128;export{y as BuiltinTool,f as ChatModelId,m as ChatPreloadField,s as ChatStatus,g as DescriptionEnhancedStage,u as EstimateOperation,l as LlmBackend,d as LlmPhase,i as LlmRole,c as LlmStatus,h as WebSearchProvider,vr as builtinTools,Gt as calculateTool,yt as clearModelCache,pt as createChat,mr as currencyTool,qt as describeImage,Kt as describeImages,Ot as describeModelId,Ft as describeTranslated,Bt as descriptionEnhanced,M as gpuAdapter,Sr as imageReplyTokens,ft as preloadModel,zt as translateTags,br as webSearchTool};
@@ -168,11 +168,15 @@ interface ChatModel {
168
168
  cpu?: {
169
169
  repo: string;
170
170
  file: string;
171
+ /** Optional pinned repository revision */
172
+ revision?: string;
171
173
  /** Optional CPU vision projector */
172
174
  mmproj?: {
173
175
  /** Projector repository override */
174
176
  repo?: string;
175
177
  file: string;
178
+ /** Optional pinned projector revision */
179
+ revision?: string;
176
180
  /** Projector audio support */
177
181
  audio?: boolean;
178
182
  };
@@ -182,6 +186,8 @@ interface ChatModel {
182
186
  repo: string;
183
187
  /** Model repository file name */
184
188
  file: string;
189
+ /** Optional pinned repository revision */
190
+ revision?: string;
185
191
  /** Whether the build accepts images */
186
192
  vision: boolean;
187
193
  /** Whether the build accepts audio */
@@ -545,7 +551,10 @@ interface ResumePlan {
545
551
  }
546
552
  /** Model download into store */
547
553
  interface StoreDownloadParams {
554
+ /** Stable cache key */
548
555
  url: string;
556
+ /** Pinned fetch URL */
557
+ sourceUrl?: string;
549
558
  /** Stop download, keep bytes */
550
559
  signal?: AbortSignal;
551
560
  onProgress: StartLlmParams[`onProgress`];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@degreesign/chat",
3
- "version": "1.7.4",
3
+ "version": "1.7.6",
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",