@degreesign/chat 0.6.2 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -200
- package/dist/browser/chat.min.mjs +1 -1
- package/dist/engines/litert.d.ts +3 -22
- package/dist/enums.d.ts +2 -1
- package/dist/index.d.ts +1 -0
- package/dist/models.d.ts +6 -8
- package/dist/node/chat.node.min.js +1 -1
- package/dist/node/chat.node.min.mjs +1 -1
- package/dist/tools/index.d.ts +6 -7
- package/dist/types.d.ts +25 -80
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see chat.node.min.mjs.LICENSE.txt */
|
|
2
|
-
import{dirname as e,join as t}from"node:path";import{fileURLToPath as r}from"node:url";var n={69(e,t){(()=>{var e={125:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addZ=t.tN=t.monNm=t.tmUTC=t.tmAP=t.moYrDt=t.shortDt=t.fullLong=t.fullDate=t.fullDt=t.invDt=t.dayRes=t.timeStandard=t.dateStandard=t.seoDt=t.thisYear=t.oneMon=t.oneMin=t.oneHr=t.oneDay=t.oneSec=void 0;const r=()=>Date.now(),n=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],a=["st","nd","rd","th"],i=e=>0==+e?"00":+e<10&&+e>=1?`0${e}`:`${e}`,s=e=>{const t=new Date(e);return`${t.getUTCFullYear()}-${i(t.getUTCMonth()+1)}-${i(t.getUTCDate())}`},c=e=>i(e.getUTCHours())+`:${i(e.getUTCMinutes())}`+`:${i(e.getUTCSeconds())}`;t.tN=r,t.monNm=n,t.dayRes=90,t.oneSec=1e3,t.oneMin=6e4,t.oneHr=36e5,t.oneDay=864e5,t.oneMon=27e8,t.addZ=i,t.tmUTC=e=>{const t=new Date(e);return i(t.getUTCHours())+`:${i(t.getUTCMinutes())} UTC`},t.tmAP=e=>{const t=new Date(e),r=t.getHours();return i(r>12?r-12:r)+`:${i(t.getMinutes())}`+(r>=12?"pm":"am")},t.shortDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]}`},t.moYrDt=e=>{const t=new Date(e);return`${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDate=e=>{const t=new Date(e);return`${t.getDate()} ${n[t.getMonth()]} ${t.getFullYear()}`},t.fullLong=e=>`${(e=>{const t=new Date(e),r=t.getDate();return r+a[r<5?r-1:r>4&&r<21?3:r>20&&r<25?r-21:r>24&&r<31?3:0]+` of ${n[t.getMonth()]}`})(e)} ${new Date(e).getFullYear()}`,t.thisYear=e=>(e?new Date(e):new Date)?.getUTCFullYear(),t.dateStandard=s,t.timeStandard=c,t.seoDt=e=>{!e&&(e=r());const t=new Date(e);return`${s(t)}T${c(t)}Z`},t.invDt=e=>{const t=new Date(e);return`${t.getUTCFullYear()}`.split("20")[1]+i(t.getUTCMonth()+1)+i(t.getUTCDate())+`${e}`.slice(10)}},240:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.idRandLong=t.idRandShort=t.idShuffle=void 0;const r=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","@",".","_","0","1","2","3","4","5","6","7","8","9"];t.idShuffle=async({data:e,password:t})=>4==t?.length?(({data:e,password:t})=>{try{const n=(e,t)=>r.includes(e.toLowerCase())?r[(r.indexOf(e.toLowerCase())+Math.pow(t,3))%r.length]:e;return[...e].map(e=>n(e,Number(t))).join("")}catch{return""}})({data:e,password:t}):await(async({data:e,password:t})=>{if(!e||!t)return"";try{crypto.subtle;const r=new TextEncoder,n=r.encode(e),o=r.encode(t),a=await crypto.subtle.digest("SHA-256",o),i=new Uint8Array(a),s=i.slice(0,32),c=i.slice(0,12),l=await crypto.subtle.importKey("raw",s,{name:"AES-GCM"},!1,["encrypt"]),u=await crypto.subtle.encrypt({name:"AES-GCM",iv:c},l,n);return btoa(String.fromCharCode(...new Uint8Array(u))).replace(/\+/g,"a").replace(/\//g,"b").replace(/=/g,"c").toLowerCase()}catch{return""}})({data:e,password:t}),t.idRandShort=(e=10)=>{try{return crypto.randomUUID()?.replaceAll("-","")?.slice(0,e)}catch(e){return console.log("idRandShort failed",e),""}},t.idRandLong=(e=10)=>{try{const t="abcdefghijklmnopqrstuvwxyz",r=new Uint8Array(e);return crypto.getRandomValues(r),Array.from(r).map(e=>t[e%26]).join("")}catch(e){return console.log("idRandLong failed",e),""}}},246:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.cacheCheck=t.delayCode=void 0;const n=r(125);t.delayCode=async(e=0)=>await new Promise(t=>setTimeout(t,e)),t.cacheCheck=({analysisCacheLimit:e,lastUpdated:t,forceRefresh:r})=>{const o=Date.now();if(t&&(!r&&t>o-e||r&&t>o-n.oneDay))return!0}},792:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isEven=t.pNum=t.sharpeRatio=t.priceVariations=t.nTxtAr=t.zNum=t.addCom=t.adjNum=t.rNum=void 0;const r=[1,.1,.01,.001,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10,1e-11,1e-12,1e-13,1e-14,1e-15,1e-16,1e-17,1e-18,1e-19],n=(e,t=6)=>{const n=+e,o=n?Math.abs(n):0,a=o>1&&t?t-`${Math.round(o)}`.length:0;return n?(n<0?-1:1)*(Number.isInteger(o)||o<1e-16?o:o>1e5?Math.round(o):o>1?Number(o.toFixed(a<0?0:a)):((e,t)=>{let n=0;for(const o of r){if(o<e)return Number(e.toFixed(t+n-1));n++}return e})(o,t)):e},o=(e,t)=>{const r=(n(e,t)+"").split(".");return r[0]=r[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),r.join(".")},a=(e,t=3)=>{const r=Number(e);if(!e||!r)return e+"";const a=Math.abs(r);return(r<0?"-":"")+(a>1e9?o(a/1e9,t)+"b":a>1e6?o(a/1e6,t)+"m":a<1e-6&&a>1e-16?(1+n(a,t)+"").replace(/1./g,"0."):o(a,t))};t.nTxtAr=["zero","one","two","three","four","five","six","seven","eight","nine","ten"],t.rNum=n,t.addCom=o,t.adjNum=a,t.zNum=e=>{const t=Number(e);let r=t?Math.abs(t):0,n=1e10;for(;n>1;)r>n&&(r=Math.round(r/(n/10))*(n/10)),n/=10;return t?(t<0?"-":"")+a(r,2):e},t.pNum=e=>+e||0==+e?Math.round(1e6*+e)/1e6:null,t.priceVariations=e=>{try{let t=0;const r=[...e].sort((e,t)=>e[0]-t[0]),n=e.reduce((e,[,t])=>e+t,0),o=r.find(([,e])=>(t+=e,t>=n/2))[0];return e.filter(([e])=>Math.abs(e-o)/o<.05).map(([e])=>e)}catch{return[]}},t.sharpeRatio=({assetPrices:e,minExpectedReturn:t=.05})=>{if(!e?.length||e?.length<2)return 0;const r=e.slice(1).map((t,r)=>(t-e[r])/e[r]),n=r.reduce((e,t)=>e+t,0)/r.length,o=Math.sqrt(r.reduce((e,t)=>e+Math.pow(t-n,2),0)/r.length);return(n-t)/o},t.isEven=e=>e%2==0},794:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restoreObj=t.restoreObjStr=t.storeObj=t.storeObjStr=t.objNestValueCount=t.objLen=t.objSortSimple=t.objSort=void 0;const n=r(125),o=e=>{try{return Object.keys(e||{})?.length||0}catch(e){return console.log(e),0}},a=e=>{try{return e?.replace(/"/g,"'")}catch(e){return console.log((0,n.tN)(),"storeObjStr failed",e),""}},i=e=>{try{return e?.toString()?.replace(/'/g,'"')}catch(e){console.log((0,n.tN)(),"restoreObjStr failed",e)}};t.objLen=o,t.objNestValueCount=e=>{let t=0;if(o(e))for(const r in e)t+=o(e[r])?1:0;return t},t.objSort=(e={},t,r=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,n])=>null===e[t]||void 0===e[t]?1:null===n[t]||void 0===n[t]?-1:e[t]>n[t]?1*r:-1*r)),t.objSortSimple=(e={},t=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,r])=>null==e?1:null==r?-1:e>r?1*t:-1*t)),t.storeObjStr=a,t.storeObj=e=>{try{return a(JSON.stringify(e))}catch(e){return console.log((0,n.tN)(),"storeObj failed",e),""}},t.restoreObjStr=i,t.restoreObj=e=>{try{if(!e)return;const t=i(e);return t?JSON.parse(t):void 0}catch(e){console.log((0,n.tN)(),"restoreObj failed",e)}}},830:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.phaseDifference=t.compareArrays=t.squeezeArray=t.forecastNextTotal=t.forecastNext=t.getMax=t.getMean=t.getSum=t.maxVl=t.minVl=t.sumArr=void 0;const r=e=>{try{return e?.length?e.reduce((e,t)=>e+t):0}catch(e){return console.log("sumArr failed",e),0}},n=e=>{try{return e?.length?e.reduce((e,t)=>e+t,0):0}catch(e){return console.log("getSum failed",e),0}},o=e=>{try{return e?.length?n(e)/e.length:0}catch(e){return console.log("getMean failed",e),0}},a=e=>{try{return e?.length?Math.max(...e):0}catch(e){return console.log("getMax failed",e),0}},i=e=>{try{if(!e?.length)return 0;const t=[...e].sort((e,t)=>e-t),r=Math.floor(t.length/2);return t.length%2?t[r]:(t[r-1]+t[r])/2}catch(e){return console.log("median failed",e),0}},s=({currentPeriod:e,steps:t=1})=>{try{const r=(Array.isArray(e)?e:[]).filter(Number.isFinite);if(!r.length||t<=0)return[];if(r.length<2){const e=Math.max(0,o(r));return Array.from({length:t},()=>e)}const n=r.length,{slope:s,intercept:c}=(e=>{try{const t=e.length,r=[];for(let n=0;n<t-1;n++)for(let o=n+1;o<t;o++)r.push((e[o]-e[n])/(o-n));const n=i(r);return{slope:n,intercept:i(e.map((e,t)=>e-n*t))}}catch(e){return console.log("theilSen failed",e),{slope:0,intercept:0}}})(r),l=c+s*(n-1),u=a(r),d=u>0?3*u:1/0;return Array.from({length:t},(e,t)=>{const r=t+1,o=l+s*n*Math.log1p(r/n);return Math.max(0,Math.min(o,d))})}catch(e){return console.log("forecastNext failed",e),[]}};t.sumArr=r,t.maxVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]>r&&(r=o[t])}return r},t.minVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]<r&&(r=o[t])}return r},t.getSum=n,t.getMean=o,t.getMax=a,t.forecastNext=s,t.forecastNextTotal=e=>{try{const t=s({currentPeriod:e,steps:e?.length});return n(t)}catch(e){return console.log("forecastNextTotal failed",e),0}},t.squeezeArray=({arr:e,targetLength:t})=>{try{if(!e||0===e.length||t<=0)throw new Error("Invalid input");const n=Math.ceil(e.length/t);return Array.from({length:t},(t,o)=>{const a=o*n,i=Math.min(a+n,e.length),s=e.slice(a,i);return r(s)}).slice(0,t)}catch(e){return console.log("squeezeArray failed",e),[]}},t.compareArrays=({arrays:e})=>{try{const t=[...e],n=Math.min(...t.map(e=>e.length));for(let e=0;e<t.length;e++)t.splice(n);const o=t.map(e=>r(e)),a=[],i=Math.min(...o),s=o.indexOf(i),c=i/Math.max(...o);for(let e=0;e<t.length;e++){const r=t[e];if(a[e]=[],e==s)a[e]=r;else for(let t=0;t<r.length;t++)a[e].push(c*r[t])}return a}catch(t){return console.log("compareArrays failed",t),e}},t.phaseDifference=({array1:e,array2:t})=>{try{let r=e.length,n=e.reduce((e,t)=>e+t)/r,o=t.reduce((e,t)=>e+t)/r,a=e.map(e=>e-n),i=t.map(e=>e-o),s=Math.floor(r/2),c=-1/0,l=0;for(let e=-s;e<=s;e++){let t=0,n=0,o=0,s=0;for(let c=0;c<r;c++){let l=c+e;l>=0&&l<r&&(t+=a[c]*i[l],n+=a[c]*a[c],o+=i[l]*i[l],s++)}if(n>0&&o>0&&s>=.8*r){let r=t/Math.sqrt(n*o);r>c&&(c=r,l=e)}}return l}catch(e){return console.log("phaseDifference failed",e),0}}}},r={};function n(t){var o=r[t];if(void 0!==o)return o.exports;var a=r[t]={exports:{}};return e[t](a,a.exports,n),a.exports}var o={};(()=>{var e=o;Object.defineProperty(e,"__esModule",{value:!0}),e.idShuffle=e.isEven=e.pNum=e.nTxtAr=e.zNum=e.addCom=e.adjNum=e.rNum=e.sharpeRatio=e.priceVariations=e.timeStandard=e.dateStandard=e.addZ=e.tN=e.monNm=e.tmUTC=e.tmAP=e.moYrDt=e.shortDt=e.fullLong=e.fullDate=e.fullDt=e.invDt=e.dayRes=e.thisYear=e.seoDt=e.oneMon=e.oneMin=e.oneHr=e.oneDay=e.oneSec=e.restoreObj=e.restoreObjStr=e.storeObj=e.storeObjStr=e.objSortSimple=e.objSort=e.objNestValueCount=e.objLen=e.phaseDifference=e.compareArrays=e.squeezeArray=e.forecastNextTotal=e.forecastNext=e.getMax=e.getMean=e.getSum=e.maxVl=e.minVl=e.sumArr=void 0,e.cacheCheck=e.delayCode=e.idRandLong=e.idRandShort=void 0;const t=n(246);Object.defineProperty(e,"cacheCheck",{enumerable:!0,get:function(){return t.cacheCheck}}),Object.defineProperty(e,"delayCode",{enumerable:!0,get:function(){return t.delayCode}});const r=n(830);Object.defineProperty(e,"sumArr",{enumerable:!0,get:function(){return r.sumArr}}),Object.defineProperty(e,"minVl",{enumerable:!0,get:function(){return r.minVl}}),Object.defineProperty(e,"maxVl",{enumerable:!0,get:function(){return r.maxVl}}),Object.defineProperty(e,"getMax",{enumerable:!0,get:function(){return r.getMax}}),Object.defineProperty(e,"getMean",{enumerable:!0,get:function(){return r.getMean}}),Object.defineProperty(e,"getSum",{enumerable:!0,get:function(){return r.getSum}}),Object.defineProperty(e,"forecastNext",{enumerable:!0,get:function(){return r.forecastNext}}),Object.defineProperty(e,"forecastNextTotal",{enumerable:!0,get:function(){return r.forecastNextTotal}}),Object.defineProperty(e,"squeezeArray",{enumerable:!0,get:function(){return r.squeezeArray}}),Object.defineProperty(e,"compareArrays",{enumerable:!0,get:function(){return r.compareArrays}}),Object.defineProperty(e,"phaseDifference",{enumerable:!0,get:function(){return r.phaseDifference}});const a=n(240);Object.defineProperty(e,"idRandLong",{enumerable:!0,get:function(){return a.idRandLong}}),Object.defineProperty(e,"idRandShort",{enumerable:!0,get:function(){return a.idRandShort}}),Object.defineProperty(e,"idShuffle",{enumerable:!0,get:function(){return a.idShuffle}});const i=n(792);Object.defineProperty(e,"addCom",{enumerable:!0,get:function(){return i.addCom}}),Object.defineProperty(e,"adjNum",{enumerable:!0,get:function(){return i.adjNum}}),Object.defineProperty(e,"priceVariations",{enumerable:!0,get:function(){return i.priceVariations}}),Object.defineProperty(e,"nTxtAr",{enumerable:!0,get:function(){return i.nTxtAr}}),Object.defineProperty(e,"rNum",{enumerable:!0,get:function(){return i.rNum}}),Object.defineProperty(e,"zNum",{enumerable:!0,get:function(){return i.zNum}}),Object.defineProperty(e,"sharpeRatio",{enumerable:!0,get:function(){return i.sharpeRatio}}),Object.defineProperty(e,"pNum",{enumerable:!0,get:function(){return i.pNum}}),Object.defineProperty(e,"isEven",{enumerable:!0,get:function(){return i.isEven}});const s=n(125);Object.defineProperty(e,"oneSec",{enumerable:!0,get:function(){return s.oneSec}}),Object.defineProperty(e,"oneDay",{enumerable:!0,get:function(){return s.oneDay}}),Object.defineProperty(e,"oneHr",{enumerable:!0,get:function(){return s.oneHr}}),Object.defineProperty(e,"oneMin",{enumerable:!0,get:function(){return s.oneMin}}),Object.defineProperty(e,"oneMon",{enumerable:!0,get:function(){return s.oneMon}}),Object.defineProperty(e,"seoDt",{enumerable:!0,get:function(){return s.seoDt}}),Object.defineProperty(e,"dayRes",{enumerable:!0,get:function(){return s.dayRes}}),Object.defineProperty(e,"invDt",{enumerable:!0,get:function(){return s.invDt}}),Object.defineProperty(e,"fullDt",{enumerable:!0,get:function(){return s.fullDt}}),Object.defineProperty(e,"fullDate",{enumerable:!0,get:function(){return s.fullDate}}),Object.defineProperty(e,"fullLong",{enumerable:!0,get:function(){return s.fullLong}}),Object.defineProperty(e,"shortDt",{enumerable:!0,get:function(){return s.shortDt}}),Object.defineProperty(e,"moYrDt",{enumerable:!0,get:function(){return s.moYrDt}}),Object.defineProperty(e,"tmAP",{enumerable:!0,get:function(){return s.tmAP}}),Object.defineProperty(e,"tmUTC",{enumerable:!0,get:function(){return s.tmUTC}}),Object.defineProperty(e,"monNm",{enumerable:!0,get:function(){return s.monNm}}),Object.defineProperty(e,"tN",{enumerable:!0,get:function(){return s.tN}}),Object.defineProperty(e,"addZ",{enumerable:!0,get:function(){return s.addZ}}),Object.defineProperty(e,"timeStandard",{enumerable:!0,get:function(){return s.timeStandard}}),Object.defineProperty(e,"dateStandard",{enumerable:!0,get:function(){return s.dateStandard}}),Object.defineProperty(e,"thisYear",{enumerable:!0,get:function(){return s.thisYear}});const c=n(794);Object.defineProperty(e,"objSort",{enumerable:!0,get:function(){return c.objSort}}),Object.defineProperty(e,"objLen",{enumerable:!0,get:function(){return c.objLen}}),Object.defineProperty(e,"objNestValueCount",{enumerable:!0,get:function(){return c.objNestValueCount}}),Object.defineProperty(e,"restoreObj",{enumerable:!0,get:function(){return c.restoreObj}}),Object.defineProperty(e,"restoreObjStr",{enumerable:!0,get:function(){return c.restoreObjStr}}),Object.defineProperty(e,"storeObj",{enumerable:!0,get:function(){return c.storeObj}}),Object.defineProperty(e,"storeObjStr",{enumerable:!0,get:function(){return c.storeObjStr}}),Object.defineProperty(e,"objSortSimple",{enumerable:!0,get:function(){return c.objSortSimple}})})();var a=t;for(var i in o)a[i]=o[i];o.__esModule&&Object.defineProperty(a,"__esModule",{value:!0})})()}};const o={};function a(e){const t=o[e];if(void 0!==t)return t.exports;const r=o[e]={exports:{}};return n[e](r,r.exports,a),r.exports}var i,s,c,l,u,d,f,m;let g;a.m=n,a.d=(e,t)=>{for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},a.f={},a.e=e=>{const t=[];return a.f.j(e,t),Promise.all(t)},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{const e={520:()=>import("./engine-litert.node.min.mjs"),924:()=>import("./engine-wllama.node.min.mjs")},t={792:0},r=e=>{let{__webpack_esm_ids__:r,__webpack_esm_modules__:n,__webpack_esm_runtime__:o}=e;var i,s,c=0;for(i in n)a.o(n,i)&&(a.m[i]=n[i]);for(o&&o(a);c<r.length;c++)s=r[c],a.o(t,s)&&t[s]&&t[s][0](),t[s]=0};a.f.j=(n,o)=>{let i=a.o(t,n)?t[n]:void 0;if(0!==i)if(i)o.push(i[1]);else{let a=e[n]().then(r,e=>{throw 0!==t[n]&&(t[n]=void 0),e});a=Promise.race([a,new Promise(e=>i=t[n]=[e])]),o.push(i[1]=a)}}})(),function(e){e.system="system",e.user="user",e.assistant="assistant"}(i||(i={})),function(e){e[e.online=0]="online",e[e.away=1]="away",e[e.offline=2]="offline"}(s||(s={})),function(e){e[e.idle=0]="idle",e[e.downloading=1]="downloading",e[e.ready=2]="ready",e[e.error=3]="error",e[e.unsupported=4]="unsupported"}(c||(c={})),function(e){e.cpu="cpu",e.gpu="gpu",e.none="none"}(l||(l={})),function(e){e.download="download",e.load="load"}(u||(u={})),function(e){e.qwen3_vl_2b="qwen3-vl-2b",e.gemma4_e2b="gemma4-e2b"}(d||(d={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(f||(f={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(m||(m={}));const p=[{id:d.qwen3_vl_2b,reasoning:!0,cpu:{repo:"Qwen/Qwen3-VL-2B-Thinking-GGUF",file:"Qwen3VL-2B-Thinking-Q4_K_M.gguf",mmproj:{file:"mmproj-Qwen3VL-2B-Thinking-Q8_0.gguf"}}},{id:d.gemma4_e2b,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it.litertlm",vision:!0,audio:!0,tools:!0,web:{file:"gemma-4-E2B-it-gpu.litertlm",vision:!1,audio:!1,tools:!0}}}],h=e=>{const t=e??("undefined"==typeof navigator?void 0:navigator);if(!t)return!1;if("boolean"==typeof t.userAgentData?.mobile)return t.userAgentData.mobile;const r=t.userAgent||"";return/Android|iPhone|iPad|iPod|Mobile/i.test(r)||/Macintosh/.test(r)&&t.maxTouchPoints>1},y=(e,t=h())=>{const r=e.litert;if(r)return t&&r.web?r.web:{file:r.file,vision:r.vision,audio:r.audio,tools:r.tools}},w=e=>e?p.find(t=>t.id==e):void 0,b=async()=>(g||(g=(async()=>(await(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)}})()?p.find(e=>!!e.litert):p.find(e=>!!e.cpu))?.id)()),await g),v=async e=>w(e||await b()),x=(e,t=h())=>!!e.cpu?.mmproj||!0===y(e,t)?.vision,j=(e,t=h())=>!!e.cpu?.mmproj?.audio||!0===y(e,t)?.audio,M=(e,t=h())=>!0===y(e,t)?.tools,k=()=>{return n=t(e(r("file:///media/x/store/code/DegreeSign/ds_chat/src/assets/nodeEsm.js")),"../assets/wllama"),{wasm:t(n,"wllama.wasm"),compatWasm:t(n,"compat/wllama.wasm"),compatWorker:t(n,"compat/wllama.js")};var n},P=()=>{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},T=288,S=async e=>{if(!e.startsWith("data:"))return await(await fetch(e)).arrayBuffer();const t=e.indexOf(","),r=t>=0?e.slice(0,t):"";if(t<0)throw new Error("Invalid image data");if(!r.includes(";base64"))return await(await fetch(e)).arrayBuffer();const n=atob(e.slice(t+1)),o=new Uint8Array(n.length);for(let e=0;e<n.length;e++)o[e]=n.charCodeAt(e);return o.buffer},O=async e=>{if(!e||"function"!=typeof fetch||"function"!=typeof createImageBitmap)return e;try{const t=await fetch(e),r=await createImageBitmap(await t.blob()),n=Math.min(r.width,r.height),o=Math.floor((r.width-n)/2),a=Math.floor((r.height-n)/2),i=((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})(T,T),s=i?i.getContext("2d"):null;if(!i||!s||n<1)return r.close(),e;if(s.drawImage(r,o,a,n,n,0,0,T,T),r.close(),(e=>"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas)(i)){const t=await i.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 i.toDataURL("image/jpeg",.85)}catch{return e}},C={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:6},E=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,_=(e={},t=!1)=>{const r=C;return{maxReplyTokens:E(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:E(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:E(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:E(e.maxImages,r.maxImages,0),maxAudio:E(e.maxAudio,r.maxAudio,0),maxContentLength:E(e.maxContentLength,r.maxContentLength,1),promptCharBudget:E(e.promptCharBudget,r.promptCharBudget,1),maxThreads:E(e.maxThreads,r.maxThreads,1)}},N=(e,t)=>({stream:!0,temperature:.7,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),A=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,D=e=>Number(e.headers.get("content-length"))||0,L=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),R=e=>L(e,"image"),$=e=>L(e,"audio"),U=["<|channel>thought\n","<|channel>thought","..."],q=["<channel|>","..."],z=(e,t,r)=>t.length||r.length?[...e?[{type:"text",text:e}]:[],...t.map(e=>({type:"image",url:e})),...r.map(e=>({type:"audio",url:e}))]:e,F=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,I=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...F(e),{type:"text",text:"\n"},...F(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r};class W extends Error{}const V=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new W(r)),t)})])}finally{n&&clearTimeout(n)}},B=e=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}},H=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,start:a,stopped:i,firstTimeoutMs:s=18e4,idleTimeoutMs:c=3e4,onStall:l})=>{let u="",d="",f="",m=!1,g=0,p=0;const h=((e,t)=>{let r="",n=!1;const o=(e,t)=>{let r=-1,n="";for(const o of t){const t=e.indexOf(o);t>=0&&(r<0||t<r)&&(r=t,n=o)}return{at:r,tag:n}},a=(e,t)=>{let r="";for(const n of t)for(let t=Math.min(e.length,n.length-1);t>r.length;t--)if(e.endsWith(n.slice(0,t))){r=e.slice(e.length-t);break}return r};return{feed:i=>{let s=r+i;for(r="";s;){if(n){const{at:t,tag:i}=o(s,q);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,q);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,U);if(e>=0){e&&t(s.slice(0,e)),s=s.slice(e+i.length),s.startsWith("\n")&&(s=s.slice(1)),n=!0;continue}const c=a(s,U);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{d+=e,r(e)},e=>{u+=e,n(e)});try{const e=(await V(a(),s,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(i()){B(e);break}let n;try{n=await V(e.next(),m?c:s,m?"Model stopped responding":"Model did not reply")}catch(r){if(r instanceof W&&(u||d)){l?.(),B(e),t&&console.log("Local chat stalled",r);break}throw r}if(n.done)break;m=!0;const a=n.value?.choices?.[0],y=a?.delta,w="string"==typeof y?.reasoning_content?y.reasoning_content:"string"==typeof y?.reasoning?y.reasoning:"";if(a?.finish_reason&&(f=a.finish_reason),w&&(d+=w,r(w)),y?.content&&h.feed(y.content),w||y?.content){const e=performance.now();g||(p=e),g+=1,g>1&&e>p&&o?.(1e3*g/(e-p))}}h.flush()}catch(e){if(t&&console.log("Local chat failed",e),!i())throw e}const y=i()?void 0:u||void 0;return t&&(console.log("Local chat reply",e.id,y?"****":""),console.log("Local chat finish",e.id,f||"none",u.length,d.length)),y},Y=async({model:e,params:t,start:r,stopped:n,onStall:o})=>{const a=await(async e=>{const t=[];for(const r of e){if("string"==typeof r.content){t.push(r);continue}const e=[];for(const t of r.content)e.push("image"==t.type?{type:"image",url:await O(t.url)}:t);t.push({role:"user",content:e})}return t})(((e,t=C)=>{const r=t.maxContentLength,n=e.filter(e=>"string"==typeof e.content&&!!e.content.trim()||!(e.role!=i.user||!e.images?.length&&!e.audio?.length)),o=[],a=[];let s=0,c=t.maxImages,l=t.maxAudio;for(let e=n.length-1;e>=0;e--){const u=n[e],d=("string"==typeof u.content?u.content:"").slice(0,r),f=u.role==i.user?(u.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,c)):[],m=u.role==i.user?(u.audio||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,l)):[];if(d||f.length||m.length){if(d&&s+d.length>t.promptCharBudget)break;s+=d.length,c-=f.length,l-=m.length,u.role==i.system?o.unshift(d):u.role==i.assistant?a.unshift({role:"assistant",content:d}):a.unshift({role:"user",content:z(d,f,m)})}}for(;a.length&&"user"!=a[0].role;)a.shift();const u=[];for(const e of a){const t=u[u.length-1];"assistant"==t?.role&&"assistant"==e.role?t.content=`${t.content}\n${e.content}`:"user"==t?.role&&"user"==e.role?t.content=I(t.content,e.content):"assistant"==e.role?u.push({role:"assistant",content:e.content}):u.push({role:"user",content:e.content})}const d=o.join("\n\n"),f=[];return d&&f.push({role:"system",content:d}),f.push(...u),f})(t.messages,t.limits));return t.logging&&((e,t)=>{console.log("Local chat call",e.id,t.map(({role:e,content:t})=>({role:e,content:"****",...Array.isArray(t)?{images:t.filter(e=>"image"==e.type).length,audio:t.filter(e=>"audio"==e.type).length}:{}})))})(e,a),await H({model:e,logging:t.logging,onReason:t.onReason,onText:t.onText,onSpeed:t.onSpeed,start:()=>r(a),stopped:n,onStall:o})},G=33554432,J=new Map;let Q=!1;const Z=e=>{const t=(e.split("/").pop()||"model").replace(/[^\w.-]+/g,"_");let r=0;for(let t=0;t<e.length;t++)r=31*r+e.charCodeAt(t)>>>0;return`${r.toString(16)}-${t}`},K=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},X=async()=>{if(!Q)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else Q=!0},ee=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},te=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}},re=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{}},ne=async function*(e){for await(const t of e)yield t},oe=async e=>{try{for await(const[t,r]of ne(e))"file"==r.kind&&K(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},ae=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await te(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}},ie=async(e,t)=>{const r=await ee(e,t);if(r){const e=await(async e=>await te(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of ne(e)){const e=K(r);if("file"!=n.kind||e<0)continue;const o=await n.getFile();t.push({part:{start:e,size:o.size},file:o})}}catch{return}const r=(e=>{const t=[];let r=0;for(const n of[...e].sort((e,t)=>e.start-t.start))if(n.size){if(n.start!=r)break;t.push(n),r+=n.size}return t})(t.map(e=>e.part)),n=new Set(r.map(e=>e.start)),o=t.filter(e=>n.has(e.part.start)).sort((e,t)=>e.part.start-t.part.start).map(e=>e.file);if(o.length)return{file:1==o.length?o[0]:new Blob(o),size:r.reduce((e,t)=>e+t.size,0)}})(r),n=e?.total||0,o=t?.size??0,a=t?.file??new Blob;return{file:n&&o>n?a.slice(0,n):a,size:o,total:n,etag:e?.etag||"",complete:n?o>=n:!0===e?.complete}}return await ae(e,t)},se=(e,t)=>{const r=e.headers.get("content-range"),n=/bytes (\d+)-/.exec(r||""),o=/\/(\d+)\s*$/.exec(r||""),a=e.headers.get("etag")||"";if(206==e.status){const e=n?Number(n[1]):t.size,r=o?Number(o[1]):t.total;if(e!=t.size)return;if(t.total&&r&&t.total!=r)return;if(t.etag&&a&&t.etag!=a)return;return{start:e,total:r||t.total,etag:a||t.etag}}if(!t.etag||!a||t.etag==a)return{start:0,total:D(e)||t.total,etag:a||t.etag}},ce=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:i})=>{let s,c=t,l=0,d=r;const f=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(c),{create:!0});s=await t.createWritable(),l=0},m=async()=>{const e=s;s=void 0,e&&await e.close().catch(()=>{})};try{const e=o.getReader();for(;;){const{done:r,value:o}=await e.read();if(r)break;i();let g=0;for(d&&(g=Math.min(d,o.byteLength),d-=g);g<o.byteLength;){s||await f();const e=Math.min(G-l,o.byteLength-g);await s.write({type:"write",position:l,data:o.subarray(g,g+e)}),g+=e,l+=e,c+=e,l==G&&await m()}c>t&&a(n?c/n:0,u.download)}await m()}catch(e){throw await m(),e}return c},le=e=>["NotAllowedError","NotSupportedError"].includes(e?.name||""),ue=e=>{const t=async()=>{const t=await X();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await ie(r,Z(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{const a=`${e}|${r}`,i=J.get(a);if(i)return await i;const s=await t();if(!s)return;const c=(async(e,t,r,n)=>{const o=Z(t),a=await ae(e,o);if(a?.complete)return a;let i=await ee(e,o);i||(await e.removeEntry(o).catch(()=>{}),await e.removeEntry(`${o}.json`).catch(()=>{}),i=await e.getDirectoryHandle(o,{create:!0}));let s=0,c=0;for(;;){if(r?.aborted)throw new Error("Cancelled");const a=await ie(e,o);if(a?.complete)return a;const l=a?.size??0,d=a?.total||0,f=a?.etag||"";if(l>s)s=l,c=0;else if(++c>4)throw new Error("Model download failed");l&&d&&n(l/d,u.download);const m=d?Math.min(l+G,d)-1:l+G-1,g=new AbortController,p=()=>g.abort(),h={size:l,total:d,etag:f};let y,w=setTimeout(p,3e4);r?.addEventListener("abort",p,{once:!0});try{if(y=await fetch(t,{signal:g.signal,headers:{Range:`bytes=${l}-${m}`}}),416==y.status){if(await(y.body?.cancel().catch(()=>{})),d&&l>=d){await re(i,{total:d,etag:f,complete:!0});continue}await oe(i),await re(i,{total:0,etag:"",complete:!1});continue}if(!y.ok||!y.body)throw await(y.body?.cancel().catch(()=>{})),new Error("Model download failed");const r=se(y,h);if(!r){await y.body.cancel().catch(()=>{}),await oe(i),await re(i,{total:0,etag:"",complete:!1});continue}await re(i,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?l:0,s=await ce({dir:i,start:r.start+a,skip:a,total:r.total,body:y.body,onProgress:n,onChunk:()=>{clearTimeout(w),w=setTimeout(p,3e4)}});if(!r.total){await re(i,{total:s,etag:r.etag,complete:!0});const t=await ie(e,o);if(t)return t}}catch(e){if(r?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&["QuotaExceededError","NotAllowedError","NotSupportedError","InvalidStateError","TypeMismatchError","SecurityError"].includes(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*c))}finally{clearTimeout(w),r?.removeEventListener("abort",p)}}})(s,r,n,o).finally(()=>{J.delete(a)});return J.set(a,c),await c},remove:async e=>{const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,Z(e))},purge:async()=>{const t=await X();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},de="litertlm-models",fe=[4096,2048,1024],me=ue("litert-store"),ge={num_output_candidates:1,wait_for_weight_uploads:!0,num_decode_steps_per_sync:3,sequence_batch_size:0,supported_lora_ranks:[],max_top_k:40,enable_decode_logits:!1,enable_external_embeddings:!1,use_submodel:!1,use_autosized_ringbuffers:!0};let pe=!1;const he=(...e)=>{pe&&console.log(...e)},ye=(...e)=>{pe&&console.error(...e)},we=e=>{const t=e.mod.getGlobalLiteRtLm().liteRtLmWasm.preinitializedWebGPUDevice;e.device=t,e.lost=!1,t&&t.lost.then(()=>{e.device==t&&(e.lost=!0)})},be=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(de)}catch{return}},ve=async e=>{const t=globalThis,r=t.Module;t.Module={print:he,printErr:ye};try{await e.getOrLoadGlobalLiteRtLm(P().script)}finally{t.Module=r}},xe=new Map,je=(e,t,r)=>{let n=0;return e.pipeThrough(new TransformStream({transform:(e,o)=>{n+=e.byteLength,r(t?n/t:0,u.download),o.enqueue(e)}}))},Me=async({url:e,signal:t,onProgress:r})=>{const n=await be();let o;const a=n?await n.match(e):void 0;if(a?.body)o=a.body;else{const t=await me.stored(e);t?.complete&&(o=t.file.stream())}if(!o){const n=await me.download({url:e,signal:t,onProgress:r}).catch(e=>{if(t?.aborted)throw new Error("Cancelled");if(!le(e))throw e;pe&&console.log("Local model store failed",e)});n&&(o=n.file.stream())}if(!o&&n)try{await(async(e,t,r,n)=>{const o=xe.get(e);if(o)return await o;const a=(async()=>{const o=await fetch(e,{signal:r});if(!o.ok||!o.body)throw new Error("Model download failed");const a=D(o),i=je(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{xe.delete(e)});return xe.set(e,a),await a})(e,n,t,r);const a=await n.match(e);a?.body&&(o=a.body)}catch(e){if(t?.aborted)throw new Error("Cancelled");pe&&console.log("Local model cache failed",e)}return o||(o=await(async(e,t,r)=>{const n=await fetch(e,{signal:t});if(!n.ok||!n.body)throw new Error("Model download failed");return je(n.body,D(n),r)})(e,t,r)),o},ke=async(e,t=!0)=>{const r=[];for(const n of e){if("string"==typeof n.content){r.push({role:n.role,content:n.content});continue}const e=[];for(const r of n.content)"text"!=r.type?t?e.push({type:r.type,data:await S(r.url)}):e.push({type:"text",text:`[${r.type}]`}):e.push({type:"text",text:r.text});r.push({role:n.role,content:e})}return r},Pe=(e,t)=>{if(e.role!=t.role)return!1;if("string"==typeof e.content||"string"==typeof t.content)return e.content==t.content;if(e.content.length!=t.content.length)return!1;for(let r=0;r<e.content.length;r++){const n=e.content[r],o=t.content[r];if(n.type!=o.type)return!1;if("text"==n.type&&"text"==o.type){if(n.text!=o.text)return!1}else if(("image"==n.type&&"image"==o.type||"audio"==n.type&&"audio"==o.type)&&n.url!=o.url)return!1}return!0},Te=e=>({type:"function",function:{name:e.name,...void 0===e.description?{}:{description:e.description},...void 0===e.parameters?{}:{parameters:e.parameters}},execute:e.execute}),Se=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=N(r.limits,r.reasoning),s=r.tools??[];if("user"!=a?.role)throw new Error("No user turn");const c=n.slice(0,-1),l=(await ke([a]))[0];if(!l)throw new Error("Empty prompt");const u=!!o.conversation&&o.reasoning==r.reasoning&&o.maxTokens==i.max_tokens&&((e=[],t=[])=>{if(e.length!=t.length)return!1;for(let r=0;r<e.length;r++){const n=e[r],o=t[r];if(n.name!=o.name)return!1;if(n.description!=o.description)return!1;if(n.execute!==o.execute)return!1;if(JSON.stringify(n.parameters)!=JSON.stringify(o.parameters))return!1}return!0})(o.tools,s)&&((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&&!Pe(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(!Pe(o[i+e],a[e]))return!1;return!0})(o.sent,c);let d;if(u&&o.conversation)d=o.conversation;else{const n=await ke(c,!1);o.conversation=void 0,o.sent=[];const a={sessionConfig:{maxOutputTokens:i.max_tokens,samplerParams:{type:t.SamplerType.TOP_K,temperature:i.temperature,k:40,p:.95}},preface:{...n.length?{messages:n}:{},extra_context:{enable_thinking:r.reasoning}},prefillPrefaceOnInit:n.length>0};d=s.length?new t.AutoToolChat({engine:e,config:a,tools:s.map(Te),recurringToolCallLimit:(f=r.maxToolRounds,"number"==typeof f&&Number.isFinite(f)?Math.min(25,Math.max(1,Math.floor(f))):4),onToolProgress:e=>((e,t)=>{const r={id:t.id,name:t.name,arguments:t.arguments};"started"!=t.status?"completed"==t.status?e.onToolResult?.({...r,result:t.result}):e.onToolResult?.({...r,error:t.error||"Tool failed"}):e.onToolCall?.(r)})(r,e)}):await e.createConversation(a),o.conversation=d,o.reasoning=r.reasoning,o.maxTokens=i.max_tokens,o.tools=[...s],o.sent=[...c]}var f;o.sent.push(a);let m,g=!1,p="";const h=()=>{m&&m.cancel().catch(()=>{});try{d.cancel()}catch{}};r.signal?.addEventListener("abort",h,{once:!0});try{if(r.signal?.aborted)return;const e=d.sendMessageStreaming(l).getReader();for(m=e;;){const{done:t,value:r}=await e.read();if(t)break;const n={};let o="string"==typeof r.content?r.content:"";if(Array.isArray(r.content))for(const e of r.content)"text"==e.type&&(o+=e.text);o&&(n.content=o,p+=o);const a=r.channels?.thought;a&&(n.reasoning=a),(n.content||n.reasoning)&&(yield{choices:[{delta:n}]})}g=!0}finally{r.signal?.removeEventListener("abort",h),g&&p?o.sent.push({role:"assistant",content:p}):(o.conversation=void 0,o.sent=[])}},Oe=({model:e,limits:t,source:r,mod:n,contextTokens:o=4096})=>{const a=y(e);return{model:r,mainExecutorSettings:{maxNumTokens:o,...a?.vision?{maxNumImages:Math.max(1,t.maxImages)}:{},backendConfig:ge},...a?.vision?{visionBackend:n.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...a?.audio?{audioBackend:n.Backend.CPU}:{}}},Ce=async(e,t,r)=>{if(e.contextStep>=fe.length-1)throw new Error("The graphics device was lost");try{await e.engine.delete()}catch{}e.mod.unloadLiteRtLm(),await ve(e.mod),await e.mod.getGlobalLiteRtLm().setupDefaultWebGpuDevice(),e.contextStep+=1,e.engine=await e.mod.Engine.create(Oe({model:t,limits:r,source:await e.reopen(),mod:e.mod,contextTokens:fe[e.contextStep]})),we(e)},Ee={backend:l.gpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o})=>{pe=!0===o;const i=e.litert,s=y(e);if(!i||!s)throw new Error("Model has no LiteRT artifact");const c=await a.e(520).then(()=>a(507));if(await ve(c),n?.aborted)throw new Error("Cancelled");const d=A(i.repo,s.file),f=await Me({url:d,signal:n,onProgress:r});if(n?.aborted)throw new Error("Cancelled");r(1,u.load);const m=c.getGlobalLiteRtLm();m.liteRtLmWasm.preinitializedWebGPUDevice||await m.setupDefaultWebGpuDevice();const g={engine:await c.Engine.create(Oe({model:e,limits:t,source:f,mod:c})),mod:c,lost:!1,contextStep:0,reopen:()=>Me({url:d,onProgress:()=>{}})};if(we(g),n?.aborted)throw await g.engine.delete(),new Error("Cancelled");const p={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:l.gpu,contextSize:fe[g.contextStep],chat:t=>(async({gpu:e,model:t,params:r,session:n})=>{pe=!0===r.logging;const o=()=>!!r.signal?.aborted,a=()=>{try{n.conversation?.cancel()}catch{}n.conversation=void 0,n.sent=[],n.tools=void 0},i=async()=>{try{return await Y({model:t,params:r,stopped:o,onStall:a,start:async a=>{if(o())throw new Error("Cancelled");const i=y(t);if(R(a)&&!i?.vision)throw new Error("Model does not accept images");if($(a)&&!i?.audio)throw new Error("Model does not accept audio");if(r.tools?.length&&!i?.tools)throw new Error("Model does not accept tools");return Se({engine:e.engine,mod:e.mod,params:r,messages:a,session:n})}})}catch(e){throw a(),e}};let s;try{s=await i()}catch(t){if(!e.lost&&!(e=>/device.*lost|lost.*device|vkQueueSubmit|device.*destroyed|aborted/i.test(`${e?.message||e}`))(t))throw t;e.lost=!0}return!e.lost||o()?s:(r.onRestart?.(),a(),await Ce(e,t,r.limits),await i())})({gpu:g,model:e,params:t,session:p}),fatal:()=>g.lost,unload:async()=>{p.conversation=void 0,p.sent=[],p.tools=void 0;try{await g.engine.delete()}catch{}}}},cached:async e=>{const t=e.litert,r=y(e);if(!t||!r)return!1;const n=A(t.repo,r.file),[o,a]=await Promise.all([be(),me.stored(n)]);if(a?.complete)return!0;try{return!(!o||!await o.match(n))}catch{return!1}},hasCache:async()=>{try{for(const e of p){const t=e.litert,r=y(e);if(!t||!r)continue;if(await me.stored(A(t.repo,r.file)))return!0}const e=await be();return!!e&&(await e.keys()).length>0}catch{return!1}},remove:async e=>{try{const t=e.litert,r=y(e);if(!t||!r)return;const n=A(t.repo,r.file),o=await be();await me.remove(n),o&&await o.delete(n)}catch{}},purge:async()=>{try{await me.purge(),"undefined"!=typeof caches&&await caches.delete(de)}catch{}}},_e=ue("wllama-store");let Ne,Ae,De="",Le=!1;const Re=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,$e=e=>{const t=k();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},Ue=e=>{const t=e=>(...t)=>{Le&&("string"==typeof t[0]&&t[0].includes("ggml_webgpu: Failed to get an adapter")||e(...t))};return{...e,log:t(e.log),warn:t(e.warn),error:t(e.error)}},qe=async()=>{if(Ne)return Ne;const e=await a.e(924).then(()=>a(577)),t=Ae||$e(),r=new e.Wllama({default:t.wasm},{logger:Ue(e.LoggerWithoutDebug)});return Ae||(Ae=t,De=Re(t)),r.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),Ne=r,r},ze=async()=>{const e=Ne;Ne=void 0;try{await(e?.exit())}catch{}},Fe=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),Ie=e=>{const t=e.cpu;return t?[{name:t.file,url:A(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:A(t.repo,t.mmproj.file)}]:[]]:[]},We=async e=>{const t=Ie(e);if(!t.length)return!1;for(const e of t){const t=await _e.stored(e.url);if(!t?.complete)return!1}return!0},Ve=async(e,t)=>{const r=await e.cacheManager.list();return Ie(t).every(e=>r.some(t=>Fe(t,e.name)))},Be=async({model:e,signal:t,onProgress:r})=>{const n=Ie(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await _e.download({url:n[e].url,signal:t,onProgress:(t,o)=>r((e+t)/n.length,o)});if(!a)return;o.push(a.file)}return o.length?o:void 0},He=async e=>{const t=[];for(const r of e){if("string"==typeof r.content){"system"==r.role?t.push({role:"system",content:r.content}):"assistant"==r.role?t.push({role:"assistant",content:r.content}):t.push({role:"user",content:r.content});continue}const e=[];for(const t of r.content)"text"==t.type?e.push({type:"text",text:t.text}):e.push({type:t.type,data:await S(t.url)});t.push({role:"user",content:e})}return t},Ye={backend:l.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:a})=>{Le=!0===o;const i=h()?4096:8192,s=e.cpu;if(!s)throw new Error("Model has no CPU artifact");const c=$e(a),d=Re(c);Ne&&d!=De&&await ze(),Ae=c,De=d;const f=(m="undefined"!=typeof navigator&&navigator.hardwareConcurrency||4,g=s.mmproj?Math.min(t.maxThreads,2):t.maxThreads,Math.max(1,Math.min(Math.max(2,Math.min(8,(m||4)-1)),g)));var m,g;const p=await qe(),y=await We(e),w=s.mmproj?.file,b=A(s.repo,s.file),v=w?A(s.repo,w):"";if(n?.aborted)throw await ze(),new Error("Cancelled");if(!y&&w){const e=await p.cacheManager.list(),t=e.some(e=>Fe(e,s.file)),r=e.some(e=>Fe(e,w));t&&!r&&await p.cacheManager.deleteMany(e=>Fe(e,s.file))}const x={n_ctx:i,n_threads:f,reasoning_budget_tokens:t.maxThinkingTokens,n_gpu_layers:0,jinja:!0};try{let t=y?await Be({model:e,signal:n,onProgress:r}):void 0;t||y||await Ve(p,e).catch(()=>!1)||(t=await Be({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");if(!le(e))throw e;o&&console.log("Local model store failed",e)})),t?(r(1,u.load),await p.loadModel(t,x)):await p.loadModelFromUrl(v?{url:b,mmprojUrl:v}:b,{...x,useCache:!0,signal:n,progressCallback:({loaded:e,total:t})=>{const n=t?e/t:0;r(n,n>=1?u.load:u.download)}})}catch(e){throw await ze(),e}if(n?.aborted)throw await ze(),new Error("Cancelled");if(!p.getLoadedContextInfo().n_ctx)throw await ze(),new Error("Failed to create model context");return{model:e,backend:l.cpu,contextSize:i,chat:t=>(async(e,t,r)=>{if(Le=!0===r.logging,e.isModelLoaded())return await Y({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if(R(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if($(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await He(n),...N(r.limits,r.reasoning),abortSignal:r.signal,...t.reasoning?{chat_template_kwargs:{enable_thinking:r.reasoning}}:{}})}})})(p,e,t),unload:async()=>{if(Ne==p)await ze();else try{await p.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await We(e)||await Ve(await qe(),e))}catch{return!1}},hasCache:async()=>{try{for(const e of p.flatMap(e=>Ie(e)))if(await _e.stored(e.url))return!0;const e=await qe();return(await e.cacheManager.list()).length>0}catch{return!1}},remove:async e=>{const t=Ie(e);try{for(const e of t)await _e.remove(e.url)}catch{}try{const e=await qe();await e.cacheManager.deleteMany(e=>t.some(t=>Fe(e,t.name)))}catch{}},purge:async()=>{try{await _e.purge()}catch{}try{const e=await qe();await e.cacheManager.clear()}catch{}}},Ge=((e={})=>{const t=e.engines?.cpu||Ye,r=e.engines?.litert||Ee;let n,o,a,i,s,d,f,m,g=l.none,h=c.idle,y=[],w=0,b={percent:0,phase:u.download};const v=n=>{if(e.backend!=l.none)return e.backend==l.cpu?n.cpu?t:void 0:e.backend==l.gpu?n.litert?r:void 0:n.litert&&"undefined"!=typeof navigator&&navigator.gpu&&"undefined"!=typeof WebAssembly?r:!n.cpu||"undefined"==typeof window&&"undefined"==typeof self&&"undefined"==typeof Worker||"undefined"==typeof WebAssembly?void 0:t},x=(e,t)=>{b={percent:Math.max(0,Math.min(1,e)),phase:t||u.download};for(const e of[...y])e.report(b.percent,b.phase)},j=e=>{h=e},M=()=>{w++,d?.abort(),d=void 0,s=void 0,h==c.downloading&&j(c.idle)},k=(e,t)=>{const r=i;return r?new Promise(n=>{let o=!1;const a={report:e,settle:e=>{o||(o=!0,t?.removeEventListener("abort",s),n(e))}},s=()=>{(e=>{y=y.filter(t=>t!=e),queueMicrotask(()=>{!y.length&&i&&M()})})(a),a.settle(!1)};y.push(a),t?.aborted?s():t?.addEventListener("abort",s,{once:!0}),r.then(a.settle,()=>a.settle(!1))}):Promise.resolve(!1)},P=()=>h==c.ready&&!!n&&!!o,T=async()=>{const e=n;M(),n=void 0,o=void 0,a=void 0,j(c.idle),await(e?.unload())};return{load:async({model:e,limits:t,assets:r,logging:l,signal:m,onProgress:h})=>{if(m?.aborted)return!1;if(P()&&o?.id==e.id)return!0;if(i&&s==e.id)return h(b.percent,b.phase),await k(h,m);i&&(M(),y=[],await i.catch(()=>!1));const T=++w,S=(async()=>{await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})();const i=v(e);if(T!=w)return!1;if(!i)return f="Model is not supported on this device",j(c.unsupported),!1;if(await(async(e,t)=>{if(o&&o.id!=e.id){const e=o,t=a,r=n;n=void 0,o=void 0,a=void 0,await(r?.unload()),await(t?.remove(e))}if(await t.hasCache())for(const r of p)r.id!=e.id&&v(r)==t&&await t.remove(r)})(e,i),T!=w)return!1;const s=await i.cached(e);if(T!=w)return!1;f=void 0,j(c.downloading),x(0,u.download),s&&x(1,u.load);const m=new AbortController;d=m;try{const s=await i.startLLM({model:e,limits:t,logging:l,signal:m.signal,assets:r,onProgress:(e,t)=>{T==w&&x(e,t)}});return T!=w||m.signal.aborted?(await s.unload(),!1):(n=s,o=e,a=i,g=i.backend,f=void 0,j(c.ready),x(1,u.load),!0)}catch(e){return T!=w||(n=void 0,o=void 0,a=void 0,f=`${e?.message||`${e}`}`,l&&console.log("Local model failed",e),j(c.error)),!1}finally{d==m&&(d=void 0)}})().finally(()=>{i==S&&(i=void 0,s=void 0,y=[])});return i=S,s=e.id,await k(h,m)},chat:async e=>{if(!P()||!n)return;for(;m;)await m.catch(()=>{});if(!P()||!n)return;const t=n,r=t.chat(e);m=r;try{return await r}catch(e){throw t.fatal?.()&&n==t&&(await T(),g=l.none,f=`${e?.message||`${e}`}`,j(c.error)),e}finally{m==r&&(m=void 0)}},unload:T,ready:P,loading:()=>!P()&&h==c.downloading,status:()=>h,backend:()=>g,error:()=>f,model:()=>o}})();var Je=a(69);const Qe=/^[0-9+\-*/%^().]+$/,Ze=e=>{let t=0;const r=e=>!!e&&e>="0"&&e<="9",n=e=>{throw new Error(e)},o=()=>{let o;for("("==e[t]?(t++,o=s(),")"!=e[t]&&n("Unbalanced parentheses"),t++):o=(()=>{const o=t;for(;r(e[t]);)t++;const a=e.slice(o,t);let i="";if("."==e[t]){t++;const n=t;for(;r(e[t]);)t++;i=e.slice(n,t)}return a||i?Number(`${a||"0"}.${i||"0"}`):n("Expected a number")})();"%"==e[t];)t++,o/=100;return o},a=()=>"+"==e[t]?(t++,a()):"-"==e[t]?(t++,-a()):(()=>{const r=o();return"^"!=e[t]?r:(t++,r**a())})(),i=()=>{let r=a();for(;"*"==e[t]||"/"==e[t];){const o=e[t];t++;const i=a();"*"==o?r*=i:(i||n("Division by zero"),r/=i)}return r},s=()=>{let r=i();for(;"+"==e[t]||"-"==e[t];){const n=e[t];t++;const o=i();r="+"==n?r+o:r-o}return r},c=s();return t<e.length&&n("Unexpected character"),Number.isFinite(c)||n("Result is not a finite number"),c},Ke={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(!Qe.test(t))throw new Error("Unsupported character");const r=Ze(t);return{expression:t,result:Math.abs(r)>=1e5?(0,Je.pNum)(r)??r:(0,Je.rNum)(r,12)}})(t)}},Xe="degreesign-chat-prices-v1",et="EUR",tt=5*Je.oneMin,rt=30*Je.oneSec;let nt,ot={},at=0,it=!1,st=!1;const ct=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},lt=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,ut=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=ct(e.rates?.current),n=ct(e.rates?.yesterday);if(Object.keys(r).length)return{fetchedAt:t,sourceAt:Number(e.rates?.date)||t,rates:r,yesterday:n}})(n,o):void 0,i=t?((e,t)=>{const r=e.coins??{},n={},o={};for(const[e,t]of Object.entries(r)){const r=e.trim().toUpperCase(),a=t?.pr,i=t?.yst;"number"==typeof a&&Number.isFinite(a)&&(n[r]=a),"number"==typeof i&&Number.isFinite(i)&&(o[r]=i)}if(Object.keys(n).length)return{fetchedAt:t,sourceAt:Number(e.date)||t,prices:n,yesterday:o}})(n,o):void 0;if(e&&!a)throw new Error("Price feed is unavailable");if(t&&!i)throw new Error("Price feed is unavailable");a&&(ot.fiat=lt(ot.fiat,a)),i&&(ot.crypto=lt(ot.crypto,i)),at=0,it=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(Xe,JSON.stringify(ot))}catch{}})()}catch(e){throw at=Date.now(),it=!0,e}},dt=e=>!!ot.crypto&&(e in ot.crypto.prices||e in ot.crypto.yesterday),ft=e=>!!ot.fiat&&(e in ot.fiat.rates||e in ot.fiat.yesterday),mt=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==et)continue;const e=dt(r)||ft(r);!dt(r)&&e||(t.crypto=!0),dt(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(ot.fiat?.fetchedAt??0)>=Je.oneHr,o=t.crypto&&r-(ot.crypto?.fetchedAt??0)>=tt;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||at&&r-at<rt||(nt||(nt=ut({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{nt=void 0})),await nt))},gt=e=>{if(e==et)return 1;const t=ot.crypto?.yesterday[e],r=ot.fiat?.yesterday[e];return t||(r?1/r:void 0)},pt=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},ht=e=>Math.abs(e)>=1e5?(0,Je.pNum)(e)??e:(0,Je.rNum)(e,8),yt=async e=>{(()=>{if(!st){st=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(Xe);if(!e)return;const t=JSON.parse(e);ot={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=pt(e.from,"from"),r=void 0===e.to||null===e.to?et:pt(e.to,"to"),n=(e=>{if(null==e)return 1;if("number"!=typeof e||!Number.isFinite(e))throw new Error("Invalid amount");return e})(e.amount);await mt([t,r]);const o=e=>{const t=(e=>{if(e==et)return 1;const t=ot.crypto?.prices[e],r=ot.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!ot.fiat&&!ot.crypto)throw new Error("Prices unavailable offline");if(dt(e)||ft(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=gt(t),c=gt(r),l=a/i,u=s&&c?s/c:void 0,d=void 0===u?void 0:l-u,f=void 0===u?void 0:100*(l/u-1),m=(e=>{const t=[];for(const r of e)r!=et&&(dt(r)?ot.crypto&&t.push(ot.crypto.sourceAt):ft(r)&&ot.fiat&&t.push(ot.fiat.sourceAt));return t})([t,r]),g=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:ht(l),...void 0===u?{}:{previousRate:ht(u),change:ht(d??0),changePercent:(0,Je.rNum)(f??0,4)},result:ht(n*l),updatedAt:new Date(g).toISOString(),stale:it&&!(!ot.fiat&&!ot.crypto)}},wt={name:"currency",description:"Get the EUR price of a fiat currency, crypto coin or metal, or convert an amount. Returns the 24-hour change.",parameters:{type:"object",properties:{from:{type:"string",description:"Currency, coin or metal to convert from"},to:{type:"string",description:"Currency, coin or metal to convert to, EUR by default"},amount:{type:"number",description:"Amount to convert, 1 by default"}},required:["from"]},execute:e=>yt(e)},bt={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},vt=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,xt=(e,t)=>e.replace(/<[^>]*>/g," ").replace(/&(#x?[0-9a-f]+|[a-z]+);/gi,(e,t)=>{const r=(e=>{if(e.startsWith("#")){const t="x"==e[1]||"X"==e[1],r=parseInt(t?e.slice(2):e.slice(1),t?16:10);return r>0&&r<=1114111?String.fromCodePoint(r):e}return bt[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),jt=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,Mt=async(e,t)=>{const r=new AbortController,n=setTimeout(()=>r.abort(),t);try{const t=await fetch(e,{signal:r.signal});if(!t.ok)throw new Error(`Search failed with ${t.status}`);return await t.json()}catch(e){if(r.signal.aborted)throw new Error(`Search timed out after ${t} ms`);throw e}finally{clearTimeout(n)}},kt=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==m.duckduckgo?m.duckduckgo:m.wikipedia,language:jt.test(t)?t:"en",limit:Math.round(vt(e.limit,1,20,3)),snippetLength:Math.round(vt(e.snippetLength,1,4e3,400)),timeout:vt(e.timeout,1e3,3e4,8e3)}})(e);return{name:"websearch",description:t.provider==m.duckduckgo?"Search DuckDuckGo for an instant answer and related topics.":"Search Wikipedia and return a few matching articles.",parameters:{type:"object",properties:{query:{type:"string",description:"What to search for"}},required:["query"]},execute:async e=>{const r="string"==typeof e.query?e.query.trim():"";if(!r)throw new Error("Missing query");const n=t.provider==m.duckduckgo?await(async(e,t)=>{const r=`https://api.duckduckgo.com/?format=json&no_html=1&skip_disambig=1&q=${encodeURIComponent(t)}`,n=await Mt(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:xt(r||n,200),url:t,snippet:xt(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 Mt(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:xt(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:xt(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},Pt=[f.websearch,f.calculate,f.currency],Tt=e=>{const t=e.tools??[],r=!1===e.builtins?[]:e.builtins??Pt,n=new Set,o=[];for(const e of t){if(n.has(e.name))throw new Error(`Duplicate tool name ${e.name}`);n.add(e.name)}for(const t of((e,t)=>{const r=[];for(const n of e)n==f.websearch?r.push(kt(t)):n==f.calculate?r.push(Ke):n==f.currency&&r.push(wt);return r})(r,e.websearch))n.has(t.name)||o.push(t);return o.push(...t),{tools:o,explicit:t.length>0}},St=(e,t,r)=>{const n=e.status(),o=w(t);return{availability:n==c.ready?s.online:n==c.error||n==c.unsupported?s.offline:s.away,status:n,backend:e.backend(),supportsImages:!!o&&x(o),supportsAudio:!!o&&j(o),supportsTools:!!o&&M(o),ready:e.ready(),loading:e.loading(),requesting:r.requesting,phase:r.phase,percent:r.percent,...r.error?{error:r.error}:{}}},Ot=(e=>{let t,r=0;const n=t=>t.input.onStatus?.(St(e,t.model??t.input.model,t));return o=>{t?.controller.abort();const a={token:++r,input:o,controller:new AbortController,percent:e.ready()?100:0,phase:e.ready()?u.load:u.download,requesting:!1,cancelled:!1};return t=a,n(a),(async t=>{const{input:o}=t,a=!0===o.logging,s=await v(o.model);if(t.model=s?.id,t.token!=r)return;const c=o.messages.some(e=>e.role!=i.system&&"string"==typeof e.content&&!!e.content.trim()),l=o.messages.some(e=>e.role==i.user&&!!e.images?.some(e=>"string"==typeof e&&!!e)),d=o.messages.some(e=>e.role==i.user&&!!e.audio?.some(e=>"string"==typeof e&&!!e)),f=c||l||d;if(!s)return t.error="Unknown model",void n(t);if(!f)return t.error="No prompt",void n(t);const m=x(s),g=j(s);if(!(c||l&&m||d&&g))return d&&!g?t.error="Model does not accept audio":l&&!m&&(t.error="Model does not accept images"),void n(t);let p;try{p=Tt(o)}catch(e){return t.error=`${e?.message||`${e}`}`,void n(t)}const h=M(s);if(!h&&p.explicit)return t.error="Model does not accept tools",void n(t);const y=h?p.tools:[],w=_(o.limits,!!s.litert),b=await e.load({model:s,limits:w,logging:a,signal:t.controller.signal,onProgress:(e,o)=>{t.token==r&&(t.percent=Math.round(100*e),t.phase=o,n(t))}}).catch(e=>(t.token==r&&(t.error=`${e?.message||`${e}`}`),!1));if(t.token!=r)return;if(t.cancelled)return;if(!b)return t.error||(t.error=e.error()||"Model not ready"),void n(t);const k=l&&!m||d&&!g?o.messages.map(({images:e,audio:t,...r})=>({...r,...e&&m?{images:e}:{},...t&&g?{audio:t}:{}})):o.messages;t.requesting=!0,t.error=void 0,t.percent=100,t.phase=u.load,n(t);let P,T="",S="";try{P=await e.chat({messages:k,limits:w,reasoning:!0===o.reasoning,logging:a,...y.length?{tools:y}:{},...void 0===o.maxToolRounds?{}:{maxToolRounds:o.maxToolRounds},onToolCall:e=>{t.token!=r||t.cancelled||o.onToolCall?.(e)},onToolResult:e=>{t.token!=r||t.cancelled||o.onToolResult?.(e)},onReason:e=>{t.token!=r||t.cancelled||(T+=e,o.onThinking?.(T))},onText:e=>{t.token!=r||t.cancelled||(S+=e,o.onResponse?.(S))},onRestart:()=>{T="",S="",o.onThinking?.(T),o.onResponse?.(S)},onSpeed:e=>{t.token!=r||t.cancelled||o.onSpeed?.(e)},signal:t.controller.signal})}catch(e){if(t.token!=r)return;return t.requesting=!1,t.error=`${e?.message||`${e}`}`,void n(t)}t.token==r&&(t.requesting=!1,P||t.cancelled||(t.error="No reply"),n(t))})(a),()=>(t=>{t.token==r&&(t.cancelled=!0,t.controller.abort(),e.status()!=c.ready?queueMicrotask(()=>n(t)):e.unload().then(()=>n(t)))})(a)}})(Ge),Ct=(Et=Ge,async(e={})=>{const t=await v(e.model),r=r=>e.onStatus?.(St(Et,t?.id,r));if(!t)return r({requesting:!1,phase:u.download,percent:0,error:"Unknown model"}),!1;let n,o=0,a=u.download;const i=Et.ready()&&Et.model()?.id==t.id;return await Et.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:u.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||Et.error()||"Model not ready"}),!1)});var Et;export{f as BuiltinTool,d as ChatModelId,s as ChatStatus,l as LlmBackend,u as LlmPhase,i as LlmRole,c as LlmStatus,m as WebSearchProvider,Ot as createChat,Ct as preloadModel};
|
|
2
|
+
import{dirname as e,join as t}from"node:path";import{fileURLToPath as r}from"node:url";var n={69(e,t){(()=>{var e={125:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addZ=t.tN=t.monNm=t.tmUTC=t.tmAP=t.moYrDt=t.shortDt=t.fullLong=t.fullDate=t.fullDt=t.invDt=t.dayRes=t.timeStandard=t.dateStandard=t.seoDt=t.thisYear=t.oneMon=t.oneMin=t.oneHr=t.oneDay=t.oneSec=void 0;const r=()=>Date.now(),n=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],a=["st","nd","rd","th"],i=e=>0==+e?"00":+e<10&&+e>=1?`0${e}`:`${e}`,s=e=>{const t=new Date(e);return`${t.getUTCFullYear()}-${i(t.getUTCMonth()+1)}-${i(t.getUTCDate())}`},c=e=>i(e.getUTCHours())+`:${i(e.getUTCMinutes())}`+`:${i(e.getUTCSeconds())}`;t.tN=r,t.monNm=n,t.dayRes=90,t.oneSec=1e3,t.oneMin=6e4,t.oneHr=36e5,t.oneDay=864e5,t.oneMon=27e8,t.addZ=i,t.tmUTC=e=>{const t=new Date(e);return i(t.getUTCHours())+`:${i(t.getUTCMinutes())} UTC`},t.tmAP=e=>{const t=new Date(e),r=t.getHours();return i(r>12?r-12:r)+`:${i(t.getMinutes())}`+(r>=12?"pm":"am")},t.shortDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]}`},t.moYrDt=e=>{const t=new Date(e);return`${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDt=e=>{const t=new Date(e);return`${t.getDate()} ${o[t.getMonth()]} ${t.getFullYear()}`},t.fullDate=e=>{const t=new Date(e);return`${t.getDate()} ${n[t.getMonth()]} ${t.getFullYear()}`},t.fullLong=e=>`${(e=>{const t=new Date(e),r=t.getDate();return r+a[r<5?r-1:r>4&&r<21?3:r>20&&r<25?r-21:r>24&&r<31?3:0]+` of ${n[t.getMonth()]}`})(e)} ${new Date(e).getFullYear()}`,t.thisYear=e=>(e?new Date(e):new Date)?.getUTCFullYear(),t.dateStandard=s,t.timeStandard=c,t.seoDt=e=>{!e&&(e=r());const t=new Date(e);return`${s(t)}T${c(t)}Z`},t.invDt=e=>{const t=new Date(e);return`${t.getUTCFullYear()}`.split("20")[1]+i(t.getUTCMonth()+1)+i(t.getUTCDate())+`${e}`.slice(10)}},240:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.idRandLong=t.idRandShort=t.idShuffle=void 0;const r=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","@",".","_","0","1","2","3","4","5","6","7","8","9"];t.idShuffle=async({data:e,password:t})=>4==t?.length?(({data:e,password:t})=>{try{const n=(e,t)=>r.includes(e.toLowerCase())?r[(r.indexOf(e.toLowerCase())+Math.pow(t,3))%r.length]:e;return[...e].map(e=>n(e,Number(t))).join("")}catch{return""}})({data:e,password:t}):await(async({data:e,password:t})=>{if(!e||!t)return"";try{crypto.subtle;const r=new TextEncoder,n=r.encode(e),o=r.encode(t),a=await crypto.subtle.digest("SHA-256",o),i=new Uint8Array(a),s=i.slice(0,32),c=i.slice(0,12),l=await crypto.subtle.importKey("raw",s,{name:"AES-GCM"},!1,["encrypt"]),u=await crypto.subtle.encrypt({name:"AES-GCM",iv:c},l,n);return btoa(String.fromCharCode(...new Uint8Array(u))).replace(/\+/g,"a").replace(/\//g,"b").replace(/=/g,"c").toLowerCase()}catch{return""}})({data:e,password:t}),t.idRandShort=(e=10)=>{try{return crypto.randomUUID()?.replaceAll("-","")?.slice(0,e)}catch(e){return console.log("idRandShort failed",e),""}},t.idRandLong=(e=10)=>{try{const t="abcdefghijklmnopqrstuvwxyz",r=new Uint8Array(e);return crypto.getRandomValues(r),Array.from(r).map(e=>t[e%26]).join("")}catch(e){return console.log("idRandLong failed",e),""}}},246:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.cacheCheck=t.delayCode=void 0;const n=r(125);t.delayCode=async(e=0)=>await new Promise(t=>setTimeout(t,e)),t.cacheCheck=({analysisCacheLimit:e,lastUpdated:t,forceRefresh:r})=>{const o=Date.now();if(t&&(!r&&t>o-e||r&&t>o-n.oneDay))return!0}},792:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isEven=t.pNum=t.sharpeRatio=t.priceVariations=t.nTxtAr=t.zNum=t.addCom=t.adjNum=t.rNum=void 0;const r=[1,.1,.01,.001,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10,1e-11,1e-12,1e-13,1e-14,1e-15,1e-16,1e-17,1e-18,1e-19],n=(e,t=6)=>{const n=+e,o=n?Math.abs(n):0,a=o>1&&t?t-`${Math.round(o)}`.length:0;return n?(n<0?-1:1)*(Number.isInteger(o)||o<1e-16?o:o>1e5?Math.round(o):o>1?Number(o.toFixed(a<0?0:a)):((e,t)=>{let n=0;for(const o of r){if(o<e)return Number(e.toFixed(t+n-1));n++}return e})(o,t)):e},o=(e,t)=>{const r=(n(e,t)+"").split(".");return r[0]=r[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),r.join(".")},a=(e,t=3)=>{const r=Number(e);if(!e||!r)return e+"";const a=Math.abs(r);return(r<0?"-":"")+(a>1e9?o(a/1e9,t)+"b":a>1e6?o(a/1e6,t)+"m":a<1e-6&&a>1e-16?(1+n(a,t)+"").replace(/1./g,"0."):o(a,t))};t.nTxtAr=["zero","one","two","three","four","five","six","seven","eight","nine","ten"],t.rNum=n,t.addCom=o,t.adjNum=a,t.zNum=e=>{const t=Number(e);let r=t?Math.abs(t):0,n=1e10;for(;n>1;)r>n&&(r=Math.round(r/(n/10))*(n/10)),n/=10;return t?(t<0?"-":"")+a(r,2):e},t.pNum=e=>+e||0==+e?Math.round(1e6*+e)/1e6:null,t.priceVariations=e=>{try{let t=0;const r=[...e].sort((e,t)=>e[0]-t[0]),n=e.reduce((e,[,t])=>e+t,0),o=r.find(([,e])=>(t+=e,t>=n/2))[0];return e.filter(([e])=>Math.abs(e-o)/o<.05).map(([e])=>e)}catch{return[]}},t.sharpeRatio=({assetPrices:e,minExpectedReturn:t=.05})=>{if(!e?.length||e?.length<2)return 0;const r=e.slice(1).map((t,r)=>(t-e[r])/e[r]),n=r.reduce((e,t)=>e+t,0)/r.length,o=Math.sqrt(r.reduce((e,t)=>e+Math.pow(t-n,2),0)/r.length);return(n-t)/o},t.isEven=e=>e%2==0},794:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.restoreObj=t.restoreObjStr=t.storeObj=t.storeObjStr=t.objNestValueCount=t.objLen=t.objSortSimple=t.objSort=void 0;const n=r(125),o=e=>{try{return Object.keys(e||{})?.length||0}catch(e){return console.log(e),0}},a=e=>{try{return e?.replace(/"/g,"'")}catch(e){return console.log((0,n.tN)(),"storeObjStr failed",e),""}},i=e=>{try{return e?.toString()?.replace(/'/g,'"')}catch(e){console.log((0,n.tN)(),"restoreObjStr failed",e)}};t.objLen=o,t.objNestValueCount=e=>{let t=0;if(o(e))for(const r in e)t+=o(e[r])?1:0;return t},t.objSort=(e={},t,r=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,n])=>null===e[t]||void 0===e[t]?1:null===n[t]||void 0===n[t]?-1:e[t]>n[t]?1*r:-1*r)),t.objSortSimple=(e={},t=-1)=>Object.fromEntries(Object.entries(e).sort(([,e],[,r])=>null==e?1:null==r?-1:e>r?1*t:-1*t)),t.storeObjStr=a,t.storeObj=e=>{try{return a(JSON.stringify(e))}catch(e){return console.log((0,n.tN)(),"storeObj failed",e),""}},t.restoreObjStr=i,t.restoreObj=e=>{try{if(!e)return;const t=i(e);return t?JSON.parse(t):void 0}catch(e){console.log((0,n.tN)(),"restoreObj failed",e)}}},830:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.phaseDifference=t.compareArrays=t.squeezeArray=t.forecastNextTotal=t.forecastNext=t.getMax=t.getMean=t.getSum=t.maxVl=t.minVl=t.sumArr=void 0;const r=e=>{try{return e?.length?e.reduce((e,t)=>e+t):0}catch(e){return console.log("sumArr failed",e),0}},n=e=>{try{return e?.length?e.reduce((e,t)=>e+t,0):0}catch(e){return console.log("getSum failed",e),0}},o=e=>{try{return e?.length?n(e)/e.length:0}catch(e){return console.log("getMean failed",e),0}},a=e=>{try{return e?.length?Math.max(...e):0}catch(e){return console.log("getMax failed",e),0}},i=e=>{try{if(!e?.length)return 0;const t=[...e].sort((e,t)=>e-t),r=Math.floor(t.length/2);return t.length%2?t[r]:(t[r-1]+t[r])/2}catch(e){return console.log("median failed",e),0}},s=({currentPeriod:e,steps:t=1})=>{try{const r=(Array.isArray(e)?e:[]).filter(Number.isFinite);if(!r.length||t<=0)return[];if(r.length<2){const e=Math.max(0,o(r));return Array.from({length:t},()=>e)}const n=r.length,{slope:s,intercept:c}=(e=>{try{const t=e.length,r=[];for(let n=0;n<t-1;n++)for(let o=n+1;o<t;o++)r.push((e[o]-e[n])/(o-n));const n=i(r);return{slope:n,intercept:i(e.map((e,t)=>e-n*t))}}catch(e){return console.log("theilSen failed",e),{slope:0,intercept:0}}})(r),l=c+s*(n-1),u=a(r),d=u>0?3*u:1/0;return Array.from({length:t},(e,t)=>{const r=t+1,o=l+s*n*Math.log1p(r/n);return Math.max(0,Math.min(o,d))})}catch(e){return console.log("forecastNext failed",e),[]}};t.sumArr=r,t.maxVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]>r&&(r=o[t])}return r},t.minVl=(e,t)=>{let r=0;for(let n=0;n<e.length;n++){const o=e[n];o[t]<r&&(r=o[t])}return r},t.getSum=n,t.getMean=o,t.getMax=a,t.forecastNext=s,t.forecastNextTotal=e=>{try{const t=s({currentPeriod:e,steps:e?.length});return n(t)}catch(e){return console.log("forecastNextTotal failed",e),0}},t.squeezeArray=({arr:e,targetLength:t})=>{try{if(!e||0===e.length||t<=0)throw new Error("Invalid input");const n=Math.ceil(e.length/t);return Array.from({length:t},(t,o)=>{const a=o*n,i=Math.min(a+n,e.length),s=e.slice(a,i);return r(s)}).slice(0,t)}catch(e){return console.log("squeezeArray failed",e),[]}},t.compareArrays=({arrays:e})=>{try{const t=[...e],n=Math.min(...t.map(e=>e.length));for(let e=0;e<t.length;e++)t.splice(n);const o=t.map(e=>r(e)),a=[],i=Math.min(...o),s=o.indexOf(i),c=i/Math.max(...o);for(let e=0;e<t.length;e++){const r=t[e];if(a[e]=[],e==s)a[e]=r;else for(let t=0;t<r.length;t++)a[e].push(c*r[t])}return a}catch(t){return console.log("compareArrays failed",t),e}},t.phaseDifference=({array1:e,array2:t})=>{try{let r=e.length,n=e.reduce((e,t)=>e+t)/r,o=t.reduce((e,t)=>e+t)/r,a=e.map(e=>e-n),i=t.map(e=>e-o),s=Math.floor(r/2),c=-1/0,l=0;for(let e=-s;e<=s;e++){let t=0,n=0,o=0,s=0;for(let c=0;c<r;c++){let l=c+e;l>=0&&l<r&&(t+=a[c]*i[l],n+=a[c]*a[c],o+=i[l]*i[l],s++)}if(n>0&&o>0&&s>=.8*r){let r=t/Math.sqrt(n*o);r>c&&(c=r,l=e)}}return l}catch(e){return console.log("phaseDifference failed",e),0}}}},r={};function n(t){var o=r[t];if(void 0!==o)return o.exports;var a=r[t]={exports:{}};return e[t](a,a.exports,n),a.exports}var o={};(()=>{var e=o;Object.defineProperty(e,"__esModule",{value:!0}),e.idShuffle=e.isEven=e.pNum=e.nTxtAr=e.zNum=e.addCom=e.adjNum=e.rNum=e.sharpeRatio=e.priceVariations=e.timeStandard=e.dateStandard=e.addZ=e.tN=e.monNm=e.tmUTC=e.tmAP=e.moYrDt=e.shortDt=e.fullLong=e.fullDate=e.fullDt=e.invDt=e.dayRes=e.thisYear=e.seoDt=e.oneMon=e.oneMin=e.oneHr=e.oneDay=e.oneSec=e.restoreObj=e.restoreObjStr=e.storeObj=e.storeObjStr=e.objSortSimple=e.objSort=e.objNestValueCount=e.objLen=e.phaseDifference=e.compareArrays=e.squeezeArray=e.forecastNextTotal=e.forecastNext=e.getMax=e.getMean=e.getSum=e.maxVl=e.minVl=e.sumArr=void 0,e.cacheCheck=e.delayCode=e.idRandLong=e.idRandShort=void 0;const t=n(246);Object.defineProperty(e,"cacheCheck",{enumerable:!0,get:function(){return t.cacheCheck}}),Object.defineProperty(e,"delayCode",{enumerable:!0,get:function(){return t.delayCode}});const r=n(830);Object.defineProperty(e,"sumArr",{enumerable:!0,get:function(){return r.sumArr}}),Object.defineProperty(e,"minVl",{enumerable:!0,get:function(){return r.minVl}}),Object.defineProperty(e,"maxVl",{enumerable:!0,get:function(){return r.maxVl}}),Object.defineProperty(e,"getMax",{enumerable:!0,get:function(){return r.getMax}}),Object.defineProperty(e,"getMean",{enumerable:!0,get:function(){return r.getMean}}),Object.defineProperty(e,"getSum",{enumerable:!0,get:function(){return r.getSum}}),Object.defineProperty(e,"forecastNext",{enumerable:!0,get:function(){return r.forecastNext}}),Object.defineProperty(e,"forecastNextTotal",{enumerable:!0,get:function(){return r.forecastNextTotal}}),Object.defineProperty(e,"squeezeArray",{enumerable:!0,get:function(){return r.squeezeArray}}),Object.defineProperty(e,"compareArrays",{enumerable:!0,get:function(){return r.compareArrays}}),Object.defineProperty(e,"phaseDifference",{enumerable:!0,get:function(){return r.phaseDifference}});const a=n(240);Object.defineProperty(e,"idRandLong",{enumerable:!0,get:function(){return a.idRandLong}}),Object.defineProperty(e,"idRandShort",{enumerable:!0,get:function(){return a.idRandShort}}),Object.defineProperty(e,"idShuffle",{enumerable:!0,get:function(){return a.idShuffle}});const i=n(792);Object.defineProperty(e,"addCom",{enumerable:!0,get:function(){return i.addCom}}),Object.defineProperty(e,"adjNum",{enumerable:!0,get:function(){return i.adjNum}}),Object.defineProperty(e,"priceVariations",{enumerable:!0,get:function(){return i.priceVariations}}),Object.defineProperty(e,"nTxtAr",{enumerable:!0,get:function(){return i.nTxtAr}}),Object.defineProperty(e,"rNum",{enumerable:!0,get:function(){return i.rNum}}),Object.defineProperty(e,"zNum",{enumerable:!0,get:function(){return i.zNum}}),Object.defineProperty(e,"sharpeRatio",{enumerable:!0,get:function(){return i.sharpeRatio}}),Object.defineProperty(e,"pNum",{enumerable:!0,get:function(){return i.pNum}}),Object.defineProperty(e,"isEven",{enumerable:!0,get:function(){return i.isEven}});const s=n(125);Object.defineProperty(e,"oneSec",{enumerable:!0,get:function(){return s.oneSec}}),Object.defineProperty(e,"oneDay",{enumerable:!0,get:function(){return s.oneDay}}),Object.defineProperty(e,"oneHr",{enumerable:!0,get:function(){return s.oneHr}}),Object.defineProperty(e,"oneMin",{enumerable:!0,get:function(){return s.oneMin}}),Object.defineProperty(e,"oneMon",{enumerable:!0,get:function(){return s.oneMon}}),Object.defineProperty(e,"seoDt",{enumerable:!0,get:function(){return s.seoDt}}),Object.defineProperty(e,"dayRes",{enumerable:!0,get:function(){return s.dayRes}}),Object.defineProperty(e,"invDt",{enumerable:!0,get:function(){return s.invDt}}),Object.defineProperty(e,"fullDt",{enumerable:!0,get:function(){return s.fullDt}}),Object.defineProperty(e,"fullDate",{enumerable:!0,get:function(){return s.fullDate}}),Object.defineProperty(e,"fullLong",{enumerable:!0,get:function(){return s.fullLong}}),Object.defineProperty(e,"shortDt",{enumerable:!0,get:function(){return s.shortDt}}),Object.defineProperty(e,"moYrDt",{enumerable:!0,get:function(){return s.moYrDt}}),Object.defineProperty(e,"tmAP",{enumerable:!0,get:function(){return s.tmAP}}),Object.defineProperty(e,"tmUTC",{enumerable:!0,get:function(){return s.tmUTC}}),Object.defineProperty(e,"monNm",{enumerable:!0,get:function(){return s.monNm}}),Object.defineProperty(e,"tN",{enumerable:!0,get:function(){return s.tN}}),Object.defineProperty(e,"addZ",{enumerable:!0,get:function(){return s.addZ}}),Object.defineProperty(e,"timeStandard",{enumerable:!0,get:function(){return s.timeStandard}}),Object.defineProperty(e,"dateStandard",{enumerable:!0,get:function(){return s.dateStandard}}),Object.defineProperty(e,"thisYear",{enumerable:!0,get:function(){return s.thisYear}});const c=n(794);Object.defineProperty(e,"objSort",{enumerable:!0,get:function(){return c.objSort}}),Object.defineProperty(e,"objLen",{enumerable:!0,get:function(){return c.objLen}}),Object.defineProperty(e,"objNestValueCount",{enumerable:!0,get:function(){return c.objNestValueCount}}),Object.defineProperty(e,"restoreObj",{enumerable:!0,get:function(){return c.restoreObj}}),Object.defineProperty(e,"restoreObjStr",{enumerable:!0,get:function(){return c.restoreObjStr}}),Object.defineProperty(e,"storeObj",{enumerable:!0,get:function(){return c.storeObj}}),Object.defineProperty(e,"storeObjStr",{enumerable:!0,get:function(){return c.storeObjStr}}),Object.defineProperty(e,"objSortSimple",{enumerable:!0,get:function(){return c.objSortSimple}})})();var a=t;for(var i in o)a[i]=o[i];o.__esModule&&Object.defineProperty(a,"__esModule",{value:!0})})()}};const o={};function a(e){const t=o[e];if(void 0!==t)return t.exports;const r=o[e]={exports:{}};return n[e](r,r.exports,a),r.exports}var i,s,c,l,u,d,f,m;let g;a.m=n,a.d=(e,t)=>{for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},a.f={},a.e=e=>{const t=[];return a.f.j(e,t),Promise.all(t)},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{const e={520:()=>import("./engine-litert.node.min.mjs"),924:()=>import("./engine-wllama.node.min.mjs")},t={792:0},r=e=>{let{__webpack_esm_ids__:r,__webpack_esm_modules__:n,__webpack_esm_runtime__:o}=e;var i,s,c=0;for(i in n)a.o(n,i)&&(a.m[i]=n[i]);for(o&&o(a);c<r.length;c++)s=r[c],a.o(t,s)&&t[s]&&t[s][0](),t[s]=0};a.f.j=(n,o)=>{let i=a.o(t,n)?t[n]:void 0;if(0!==i)if(i)o.push(i[1]);else{let a=e[n]().then(r,e=>{throw 0!==t[n]&&(t[n]=void 0),e});a=Promise.race([a,new Promise(e=>i=t[n]=[e])]),o.push(i[1]=a)}}})(),function(e){e.system="system",e.user="user",e.assistant="assistant"}(i||(i={})),function(e){e[e.online=0]="online",e[e.away=1]="away",e[e.offline=2]="offline"}(s||(s={})),function(e){e[e.idle=0]="idle",e[e.downloading=1]="downloading",e[e.ready=2]="ready",e[e.error=3]="error",e[e.unsupported=4]="unsupported"}(c||(c={})),function(e){e.cpu="cpu",e.gpu="gpu",e.none="none"}(l||(l={})),function(e){e.download="download",e.load="load"}(u||(u={})),function(e){e.qwen3_vl_2b="qwen3-vl-2b",e.gemma4_e2b="gemma4-e2b",e.gemma4_e2b_limited="gemma4-e2b-limited"}(d||(d={})),function(e){e.websearch="websearch",e.calculate="calculate",e.currency="currency"}(f||(f={})),function(e){e.wikipedia="wikipedia",e.duckduckgo="duckduckgo"}(m||(m={}));const p=[{id:d.qwen3_vl_2b,reasoning:!0,cpu:{repo:"Qwen/Qwen3-VL-2B-Thinking-GGUF",file:"Qwen3VL-2B-Thinking-Q4_K_M.gguf",mmproj:{file:"mmproj-Qwen3VL-2B-Thinking-Q8_0.gguf"}}},{id:d.gemma4_e2b,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it.litertlm",vision:!0,audio:!0}},{id:d.gemma4_e2b_limited,reasoning:!0,litert:{repo:"litert-community/gemma-4-E2B-it-litert-lm",file:"gemma-4-E2B-it-gpu.litertlm",vision:!1,audio:!1}}],h=e=>{const t=e??("undefined"==typeof navigator?void 0:navigator);if(!t)return!1;if("boolean"==typeof t.userAgentData?.mobile)return t.userAgentData.mobile;const r=t.userAgent||"";return/Android|iPhone|iPad|iPod|Mobile/i.test(r)||/Macintosh/.test(r)&&t.maxTouchPoints>1},y=(e,t=h())=>e==d.gemma4_e2b?t?d.gemma4_e2b_limited:e:e==d.gemma4_e2b_limited?t?e:d.gemma4_e2b:e,w=e=>e?p.find(t=>t.id==e):void 0,b=async()=>(g||(g=(async()=>await(async()=>{const e="undefined"==typeof navigator?void 0:navigator.gpu;if(!e)return!1;let t;try{return!!await Promise.race([e.requestAdapter({powerPreference:"high-performance"}),new Promise(e=>{t=setTimeout(()=>e(void 0),1500)})])}catch{return!1}finally{t&&clearTimeout(t)}})()?y(d.gemma4_e2b):d.qwen3_vl_2b)()),await g),v=async e=>w(y(e??await b())),x=e=>!!e.cpu?.mmproj||!0===e.litert?.vision,j=e=>!!e.cpu?.mmproj?.audio||!0===e.litert?.audio,M=()=>{return n=t(e(r("file:///media/x/store/code/DegreeSign/ds_chat/src/assets/nodeEsm.js")),"../assets/wllama"),{wasm:t(n,"wllama.wasm"),compatWasm:t(n,"compat/wllama.wasm"),compatWorker:t(n,"compat/wllama.js")};var n},k=()=>{return n=t(e(r("file:///media/x/store/code/DegreeSign/ds_chat/src/assets/nodeEsm.js")),"../assets/litert"),{script:t(n,"litertlm_wasm_internal.js"),wasm:t(n,"litertlm_wasm_internal.wasm")};var n},P=288,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},S=async e=>{if(!e||"function"!=typeof fetch||"function"!=typeof createImageBitmap)return e;try{const t=await fetch(e),r=await createImageBitmap(await t.blob()),n=Math.min(r.width,r.height),o=Math.floor((r.width-n)/2),a=Math.floor((r.height-n)/2),i=((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})(P,P),s=i?i.getContext("2d"):null;if(!i||!s||n<1)return r.close(),e;if(s.drawImage(r,o,a,n,n,0,0,P,P),r.close(),(e=>"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas)(i)){const t=await i.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 i.toDataURL("image/jpeg",.85)}catch{return e}},_={maxReplyTokens:250,maxThinkingTokens:128,maxReasoningTokens:320,maxImages:2,maxAudio:1,maxContentLength:1e3,promptCharBudget:1e4,maxThreads:6},C=(e,t,r)=>"number"==typeof e&&Number.isFinite(e)&&e>=r?Math.floor(e):t,T=(e={},t=!1)=>{const r=_;return{maxReplyTokens:C(e.maxReplyTokens,r.maxReplyTokens,1),maxThinkingTokens:C(e.maxThinkingTokens,r.maxThinkingTokens,1),maxReasoningTokens:C(e.maxReasoningTokens,t?1200:r.maxReasoningTokens,1),maxImages:C(e.maxImages,r.maxImages,0),maxAudio:C(e.maxAudio,r.maxAudio,0),maxContentLength:C(e.maxContentLength,r.maxContentLength,1),promptCharBudget:C(e.promptCharBudget,r.promptCharBudget,1),maxThreads:C(e.maxThreads,r.maxThreads,1)}},E=(e,t)=>({stream:!0,temperature:.7,max_tokens:t?e.maxReasoningTokens:e.maxReplyTokens}),N=(e,t)=>`https://huggingface.co/${e}/resolve/main/${t}`,A=e=>Number(e.headers.get("content-length"))||0,D=(e,t)=>e.some(e=>Array.isArray(e.content)&&e.content.some(e=>e.type==t)),$=e=>D(e,"image"),L=e=>D(e,"audio"),R=["<|channel>thought\n","<|channel>thought","..."],U=["<channel|>","..."],q=(e,t,r)=>t.length||r.length?[...e?[{type:"text",text:e}]:[],...t.map(e=>({type:"image",url:e})),...r.map(e=>({type:"audio",url:e}))]:e,z=e=>"string"==typeof e?e?[{type:"text",text:e}]:[]:e,F=(e,t)=>{if("string"==typeof e&&"string"==typeof t)return`${e}\n${t}`;const r=[];for(const n of[...z(e),{type:"text",text:"\n"},...z(t)]){const e=r[r.length-1];"text"==n.type&&"text"==e?.type?e.text+=n.text:r.push(n)}return r};class I extends Error{}const V=async(e,t,r)=>{let n;try{return await Promise.race([e,new Promise((e,o)=>{n=setTimeout(()=>o(new I(r)),t)})])}finally{n&&clearTimeout(n)}},B=e=>{try{Promise.resolve(e.return?.()).catch(()=>{})}catch{}},W=async({model:e,logging:t,onReason:r,onText:n,onSpeed:o,start:a,stopped:i,firstTimeoutMs:s=18e4,idleTimeoutMs:c=3e4,onStall:l})=>{let u="",d="",f="",m=!1,g=0,p=0;const h=((e,t)=>{let r="",n=!1;const o=(e,t)=>{let r=-1,n="";for(const o of t){const t=e.indexOf(o);t>=0&&(r<0||t<r)&&(r=t,n=o)}return{at:r,tag:n}},a=(e,t)=>{let r="";for(const n of t)for(let t=Math.min(e.length,n.length-1);t>r.length;t--)if(e.endsWith(n.slice(0,t))){r=e.slice(e.length-t);break}return r};return{feed:i=>{let s=r+i;for(r="";s;){if(n){const{at:t,tag:i}=o(s,U);if(t>=0){t&&e(s.slice(0,t)),s=s.slice(t+i.length),n=!1;continue}const c=a(s,U);e(s.slice(0,s.length-c.length)),r=c;break}{const{at:e,tag:i}=o(s,R);if(e>=0){e&&t(s.slice(0,e)),s=s.slice(e+i.length),s.startsWith("\n")&&(s=s.slice(1)),n=!0;continue}const c=a(s,R);t(s.slice(0,s.length-c.length)),r=c;break}}},flush:()=>{r&&(n?e(r):t(r),r="")}}})(e=>{d+=e,r(e)},e=>{u+=e,n(e)});try{const e=(await V(a(),s,"Model did not start"))[Symbol.asyncIterator]();for(;;){if(i()){B(e);break}let n;try{n=await V(e.next(),m?c:s,m?"Model stopped responding":"Model did not reply")}catch(r){if(r instanceof I&&(u||d)){l?.(),B(e),t&&console.log("Local chat stalled",r);break}throw r}if(n.done)break;m=!0;const a=n.value?.choices?.[0],y=a?.delta,w="string"==typeof y?.reasoning_content?y.reasoning_content:"string"==typeof y?.reasoning?y.reasoning:"";if(a?.finish_reason&&(f=a.finish_reason),w&&(d+=w,r(w)),y?.content&&h.feed(y.content),w||y?.content){const e=performance.now();g||(p=e),g+=1,g>1&&e>p&&o?.(1e3*g/(e-p))}}h.flush()}catch(e){if(t&&console.log("Local chat failed",e),e instanceof I&&!i())throw e}const y=i()?void 0:u||void 0;return t&&(console.log("Local chat reply",e.id,y?"****":""),console.log("Local chat finish",e.id,f||"none",u.length,d.length)),y},H=async({model:e,params:t,start:r,stopped:n,onStall:o})=>{const a=await(async e=>{const t=[];for(const r of e){if("string"==typeof r.content){t.push(r);continue}const e=[];for(const t of r.content)e.push("image"==t.type?{type:"image",url:await S(t.url)}:t);t.push({role:"user",content:e})}return t})(((e,t=_)=>{const r=t.maxContentLength,n=e.filter(e=>"string"==typeof e.content&&!!e.content.trim()||!(e.role!=i.user||!e.images?.length&&!e.audio?.length)),o=[],a=[];let s=0,c=t.maxImages,l=t.maxAudio;for(let e=n.length-1;e>=0;e--){const u=n[e],d=("string"==typeof u.content?u.content:"").slice(0,r),f=u.role==i.user?(u.images||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,c)):[],m=u.role==i.user?(u.audio||[]).filter(e=>"string"==typeof e&&!!e).slice(0,Math.max(0,l)):[];if(d||f.length||m.length){if(d&&s+d.length>t.promptCharBudget)break;s+=d.length,c-=f.length,l-=m.length,u.role==i.system?o.unshift(d):u.role==i.assistant?a.unshift({role:"assistant",content:d}):a.unshift({role:"user",content:q(d,f,m)})}}for(;a.length&&"user"!=a[0].role;)a.shift();const u=[];for(const e of a){const t=u[u.length-1];"assistant"==t?.role&&"assistant"==e.role?t.content=`${t.content}\n${e.content}`:"user"==t?.role&&"user"==e.role?t.content=F(t.content,e.content):"assistant"==e.role?u.push({role:"assistant",content:e.content}):u.push({role:"user",content:e.content})}const d=o.join("\n\n"),f=[];return d&&f.push({role:"system",content:d}),f.push(...u),f})(t.messages,t.limits));return t.logging&&((e,t)=>{console.log("Local chat call",e.id,t.map(({role:e,content:t})=>({role:e,content:"****",...Array.isArray(t)?{images:t.filter(e=>"image"==e.type).length,audio:t.filter(e=>"audio"==e.type).length}:{}})))})(e,a),await W({model:e,logging:t.logging,onReason:t.onReason,onText:t.onText,onSpeed:t.onSpeed,start:()=>r(a),stopped:n,onStall:o})},Y=33554432,J=new Map;let G=!1;const Q=e=>{const t=(e.split("/").pop()||"model").replace(/[^\w.-]+/g,"_");let r=0;for(let t=0;t<e.length;t++)r=31*r+e.charCodeAt(t)>>>0;return`${r.toString(16)}-${t}`},Z=e=>{const t=/^part-(\d+)$/.exec(e);return t?Number(t[1]):-1},K=async()=>{if(!G)if("undefined"!=typeof navigator&&navigator.storage?.getDirectory)try{return await navigator.storage.getDirectory()}catch{return}else G=!0},X=async(e,t)=>{try{return await e.getDirectoryHandle(t)}catch{return}},ee=async e=>{if(e)try{const t=await e.getFile(),r=JSON.parse(await t.text());return{total:Number(r.total)||0,etag:`${r.etag||""}`,complete:!0===r.complete}}catch{return}},te=async(e,t)=>{try{const r=await e.getFileHandle("meta.json",{create:!0}),n=await r.createWritable();await n.write(JSON.stringify(t)),await n.close()}catch{}},re=async function*(e){for await(const t of e)yield t},ne=async e=>{try{for await(const[t,r]of re(e))"file"==r.kind&&Z(t)>=0&&await e.removeEntry(t).catch(()=>{})}catch{}},oe=async(e,t)=>{try{const r=await(await e.getFileHandle(t)).getFile(),n=await ee(await e.getFileHandle(`${t}.json`).catch(()=>{}));if(!n)return;return{file:r,size:r.size,total:n.total,etag:n.etag,complete:n.total?r.size>=n.total:!0===n.complete}}catch{return}},ae=async(e,t)=>{const r=await X(e,t);if(r){const e=await(async e=>await ee(await e.getFileHandle("meta.json").catch(()=>{})))(r),t=await(async e=>{const t=[];try{for await(const[r,n]of re(e)){const e=Z(r);if("file"!=n.kind||e<0)continue;const o=await n.getFile();t.push({part:{start:e,size:o.size},file:o})}}catch{return}const r=(e=>{const t=[];let r=0;for(const n of[...e].sort((e,t)=>e.start-t.start))if(n.size){if(n.start!=r)break;t.push(n),r+=n.size}return t})(t.map(e=>e.part)),n=new Set(r.map(e=>e.start)),o=t.filter(e=>n.has(e.part.start)).sort((e,t)=>e.part.start-t.part.start).map(e=>e.file);if(o.length)return{file:1==o.length?o[0]:new Blob(o),size:r.reduce((e,t)=>e+t.size,0)}})(r),n=e?.total||0,o=t?.size??0,a=t?.file??new Blob;return{file:n&&o>n?a.slice(0,n):a,size:o,total:n,etag:e?.etag||"",complete:n?o>=n:!0===e?.complete}}return await oe(e,t)},ie=(e,t)=>{const r=e.headers.get("content-range"),n=/bytes (\d+)-/.exec(r||""),o=/\/(\d+)\s*$/.exec(r||""),a=e.headers.get("etag")||"";if(206==e.status){const e=n?Number(n[1]):t.size,r=o?Number(o[1]):t.total;if(e!=t.size)return;if(t.total&&r&&t.total!=r)return;if(t.etag&&a&&t.etag!=a)return;return{start:e,total:r||t.total,etag:a||t.etag}}if(!t.etag||!a||t.etag==a)return{start:0,total:A(e)||t.total,etag:a||t.etag}},se=async({dir:e,start:t,skip:r,total:n,body:o,onProgress:a,onChunk:i})=>{let s,c=t,l=0,d=r;const f=async()=>{const t=await e.getFileHandle((e=>`part-${e}`)(c),{create:!0});s=await t.createWritable(),l=0},m=async()=>{const e=s;s=void 0,e&&await e.close().catch(()=>{})};try{const e=o.getReader();for(;;){const{done:r,value:o}=await e.read();if(r)break;i();let g=0;for(d&&(g=Math.min(d,o.byteLength),d-=g);g<o.byteLength;){s||await f();const e=Math.min(Y-l,o.byteLength-g);await s.write({type:"write",position:l,data:o.subarray(g,g+e)}),g+=e,l+=e,c+=e,l==Y&&await m()}c>t&&a(n?c/n:0,u.download)}await m()}catch(e){throw await m(),e}return c},ce=e=>["NotAllowedError","NotSupportedError"].includes(e?.name||""),le=e=>{const t=async()=>{const t=await K();if(t)try{return await t.getDirectoryHandle(e,{create:!0})}catch{return}};return{stored:async e=>{const r=await t();return r?await ae(r,Q(e)):void 0},download:async({url:r,signal:n,onProgress:o})=>{const a=`${e}|${r}`,i=J.get(a);if(i)return await i;const s=await t();if(!s)return;const c=(async(e,t,r,n)=>{const o=Q(t),a=await oe(e,o);if(a?.complete)return a;let i=await X(e,o);i||(await e.removeEntry(o).catch(()=>{}),await e.removeEntry(`${o}.json`).catch(()=>{}),i=await e.getDirectoryHandle(o,{create:!0}));let s=0,c=0;for(;;){if(r?.aborted)throw new Error("Cancelled");const a=await ae(e,o);if(a?.complete)return a;const l=a?.size??0,d=a?.total||0,f=a?.etag||"";if(l>s)s=l,c=0;else if(++c>4)throw new Error("Model download failed");l&&d&&n(l/d,u.download);const m=d?Math.min(l+Y,d)-1:l+Y-1,g=new AbortController,p=()=>g.abort(),h={size:l,total:d,etag:f};let y,w=setTimeout(p,3e4);r?.addEventListener("abort",p,{once:!0});try{if(y=await fetch(t,{signal:g.signal,headers:{Range:`bytes=${l}-${m}`}}),416==y.status){if(await(y.body?.cancel().catch(()=>{})),d&&l>=d){await te(i,{total:d,etag:f,complete:!0});continue}await ne(i),await te(i,{total:0,etag:"",complete:!1});continue}if(!y.ok||!y.body)throw await(y.body?.cancel().catch(()=>{})),new Error("Model download failed");const r=ie(y,h);if(!r){await y.body.cancel().catch(()=>{}),await ne(i),await te(i,{total:0,etag:"",complete:!1});continue}await te(i,{total:r.total,etag:r.etag,complete:!1});const a=0==r.start?l:0,s=await se({dir:i,start:r.start+a,skip:a,total:r.total,body:y.body,onProgress:n,onChunk:()=>{clearTimeout(w),w=setTimeout(p,3e4)}});if(!r.total){await te(i,{total:s,etag:r.etag,complete:!0});const t=await ae(e,o);if(t)return t}}catch(e){if(r?.aborted)throw new Error("Cancelled");if(e instanceof DOMException&&["QuotaExceededError","NotAllowedError","NotSupportedError","InvalidStateError","TypeMismatchError","SecurityError"].includes(e.name))throw e;await new Promise(e=>setTimeout(e,250+500*c))}finally{clearTimeout(w),r?.removeEventListener("abort",p)}}})(s,r,n,o).finally(()=>{J.delete(a)});return J.set(a,c),await c},remove:async e=>{const r=await t();r&&await(async(e,t)=>{await e.removeEntry(t,{recursive:!0}).catch(()=>{}),await e.removeEntry(`${t}.json`).catch(()=>{})})(r,Q(e))},purge:async()=>{const t=await K();t&&await t.removeEntry(e,{recursive:!0}).catch(()=>{})}}},ue="litertlm-models",de=le("litert-store"),fe={num_output_candidates:1,wait_for_weight_uploads:!0,num_decode_steps_per_sync:3,sequence_batch_size:0,supported_lora_ranks:[],max_top_k:40,enable_decode_logits:!1,enable_external_embeddings:!1,use_submodel:!1,use_autosized_ringbuffers:!0};let me=!1;const ge=(...e)=>{me&&console.log(...e)},pe=(...e)=>{me&&console.error(...e)},he=async()=>{try{if("undefined"==typeof caches)return;return await caches.open(ue)}catch{return}},ye=new Map,we=(e,t,r)=>{let n=0;return e.pipeThrough(new TransformStream({transform:(e,o)=>{n+=e.byteLength,r(t?n/t:0,u.download),o.enqueue(e)}}))},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},ve=(e,t)=>{if(e.role!=t.role)return!1;if("string"==typeof e.content||"string"==typeof t.content)return e.content==t.content;if(e.content.length!=t.content.length)return!1;for(let r=0;r<e.content.length;r++){const n=e.content[r],o=t.content[r];if(n.type!=o.type)return!1;if("text"==n.type&&"text"==o.type){if(n.text!=o.text)return!1}else if(("image"==n.type&&"image"==o.type||"audio"==n.type&&"audio"==o.type)&&n.url!=o.url)return!1}return!0},xe=async function*({engine:e,mod:t,params:r,messages:n,session:o}){const a=n[n.length-1],i=E(r.limits,r.reasoning);if("user"!=a?.role)throw new Error("No user turn");const s=n.slice(0,-1),c=(await be([a]))[0];if(!c)throw new Error("Empty prompt");const l=!!o.conversation&&o.reasoning==r.reasoning&&o.maxTokens==i.max_tokens&&((e,t)=>{const r="system"==e[0]?.role?e[0]:void 0,n="system"==t[0]?.role?t[0]:void 0;if(!r!=!n)return!1;if(r&&n&&!ve(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(!ve(o[i+e],a[e]))return!1;return!0})(o.sent,s);let u;if(l&&o.conversation)u=o.conversation;else{const n=await be(s,!1);o.conversation=void 0,o.sent=[],u=await e.createConversation({sessionConfig:{maxOutputTokens:i.max_tokens,samplerParams:{type:t.SamplerType.TOP_K,temperature:i.temperature,k:40,p:.95}},preface:{...n.length?{messages:n}:{},extra_context:{enable_thinking:r.reasoning}},prefillPrefaceOnInit:n.length>0}),o.conversation=u,o.reasoning=r.reasoning,o.maxTokens=i.max_tokens,o.sent=[...s]}o.sent.push(a);let d,f=!1,m="";const g=()=>{d&&d.cancel().catch(()=>{});try{u.cancel()}catch{}};r.signal?.addEventListener("abort",g,{once:!0});try{if(r.signal?.aborted)return;const e=u.sendMessageStreaming(c).getReader();for(d=e;;){const{done:t,value:r}=await e.read();if(t)break;const n={};let o="string"==typeof r.content?r.content:"";if(Array.isArray(r.content))for(const e of r.content)"text"==e.type&&(o+=e.text);o&&(n.content=o,m+=o);const a=r.channels?.thought;a&&(n.reasoning=a),(n.content||n.reasoning)&&(yield{choices:[{delta:n}]})}f=!0}finally{r.signal?.removeEventListener("abort",g),f&&m?o.sent.push({role:"assistant",content:m}):(o.conversation=void 0,o.sent=[])}},je={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=await a.e(520).then(()=>a(507)),c=globalThis,d=c.Module;c.Module={print:ge,printErr:pe};try{await s.getOrLoadGlobalLiteRtLm(k().script)}finally{c.Module=d}if(n?.aborted)throw new Error("Cancelled");const f=N(i.repo,i.file),m=await he();let g;const p=m?await m.match(f):void 0;if(p?.body)g=p.body;else{const e=await de.stored(f);e?.complete&&(g=e.file.stream())}if(!g){const e=await de.download({url:f,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");if(!ce(e))throw e;o&&console.log("Local model store failed",e)});e&&(g=e.file.stream())}if(!g&&m)try{await(async(e,t,r,n)=>{const o=ye.get(e);if(o)return await o;const a=(async()=>{const o=await fetch(e,{signal:r});if(!o.ok||!o.body)throw new Error("Model download failed");const a=A(o),i=we(o.body,a,n);await t.put(e,new Response(i,{headers:{"content-type":"application/octet-stream",...a?{"content-length":`${a}`}:{}}}))})().finally(()=>{ye.delete(e)});return ye.set(e,a),await a})(f,m,n,r);const e=await m.match(f);e?.body&&(g=e.body)}catch(e){if(n?.aborted)throw new Error("Cancelled");o&&console.log("Local model cache failed",e)}if(g||(g=await(async(e,t,r)=>{const n=await fetch(e,{signal:t});if(!n.ok||!n.body)throw new Error("Model download failed");return we(n.body,A(n),r)})(f,n,r)),n?.aborted)throw new Error("Cancelled");r(1,u.load);const h=await s.Engine.create((({model:e,limits:t,source:r,mod:n})=>{const o=e.litert;return{model:r,mainExecutorSettings:{maxNumTokens:4096,...o?.vision?{maxNumImages:Math.max(1,t.maxImages)}:{},backendConfig:fe},...o?.vision?{visionBackend:n.Backend.GPU,maxVisionTokensPerImage:70,minVisionTokensPerImage:70}:{},...o?.audio?{audioBackend:n.Backend.CPU}:{}}})({model:e,limits:t,source:g,mod:s}));if(n?.aborted)throw await h.delete(),new Error("Cancelled");const y={sent:[],reasoning:!1,maxTokens:0};return{model:e,backend:l.gpu,contextSize:4096,chat:t=>(async({engine:e,model:t,mod:r,params:n,session:o})=>{me=!0===n.logging;const a=()=>{try{o.conversation?.cancel()}catch{}o.conversation=void 0,o.sent=[]};try{return await H({model:t,params:n,stopped:()=>!!n.signal?.aborted,onStall:a,start:async a=>{if(n.signal?.aborted)throw new Error("Cancelled");if($(a)&&!t.litert?.vision)throw new Error("Model does not accept images");if(L(a)&&!t.litert?.audio)throw new Error("Model does not accept audio");return xe({engine:e,mod:r,params:n,messages:a,session:o})}})}catch(e){throw a(),e}})({engine:h,model:e,mod:s,params:t,session:y}),unload:async()=>{y.conversation=void 0,y.sent=[],await h.delete()}}},cached:async e=>{const t=e.litert;if(!t)return!1;const r=N(t.repo,t.file),[n,o]=await Promise.all([he(),de.stored(r)]);if(o?.complete)return!0;try{return!(!n||!await n.match(r))}catch{return!1}},hasCache:async()=>{try{for(const e of p){const t=e.litert;if(!t)continue;if(await de.stored(N(t.repo,t.file)))return!0}const e=await he();return!!e&&(await e.keys()).length>0}catch{return!1}},remove:async e=>{try{const t=e.litert;if(!t)return;const r=N(t.repo,t.file),n=await he();await de.remove(r),n&&await n.delete(r)}catch{}},purge:async()=>{try{await de.purge(),"undefined"!=typeof caches&&await caches.delete(ue)}catch{}}},Me=le("wllama-store");let ke,Pe,Oe="",Se=!1;const _e=e=>`${e.wasm}|${e.compatWasm}|${e.compatWorker}`,Ce=e=>{const t=M();return{wasm:e?.wasm||t.wasm,compatWasm:e?.compatWasm||t.compatWasm,compatWorker:e?.compatWorker||t.compatWorker}},Te=e=>{const t=e=>(...t)=>{Se&&("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)}},Ee=async()=>{if(ke)return ke;const e=await a.e(924).then(()=>a(577)),t=Pe||Ce(),r=new e.Wllama({default:t.wasm},{logger:Te(e.LoggerWithoutDebug)});return Pe||(Pe=t,Oe=_e(t)),r.setCompat({wasm:t.compatWasm,worker:t.compatWorker}),ke=r,r},Ne=async()=>{const e=ke;ke=void 0;try{await(e?.exit())}catch{}},Ae=(e,t)=>e.name.includes(t)||!!e.metadata?.originalURL?.includes(t),De=e=>{const t=e.cpu;return t?[{name:t.file,url:N(t.repo,t.file)},...t.mmproj?[{name:t.mmproj.file,url:N(t.repo,t.mmproj.file)}]:[]]:[]},$e=async e=>{const t=De(e);if(!t.length)return!1;for(const e of t){const t=await Me.stored(e.url);if(!t?.complete)return!1}return!0},Le=async(e,t)=>{const r=await e.cacheManager.list();return De(t).every(e=>r.some(t=>Ae(t,e.name)))},Re=async({model:e,signal:t,onProgress:r})=>{const n=De(e),o=[];for(let e=0;e<n.length;e++){if(t?.aborted)throw new Error("Cancelled");const a=await Me.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},Ue=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},qe={backend:l.cpu,startLLM:async({model:e,limits:t,onProgress:r,signal:n,logging:o,assets:a})=>{Se=!0===o;const i=h()?4096:8192,s=e.cpu;if(!s)throw new Error("Model has no CPU artifact");const c=Ce(a),d=_e(c);ke&&d!=Oe&&await Ne(),Pe=c,Oe=d;const f=(m="undefined"!=typeof navigator&&navigator.hardwareConcurrency||4,g=s.mmproj?Math.min(t.maxThreads,2):t.maxThreads,Math.max(1,Math.min(Math.max(2,Math.min(8,(m||4)-1)),g)));var m,g;const p=await Ee(),y=await $e(e),w=s.mmproj?.file,b=N(s.repo,s.file),v=w?N(s.repo,w):"";if(n?.aborted)throw await Ne(),new Error("Cancelled");if(!y&&w){const e=await p.cacheManager.list(),t=e.some(e=>Ae(e,s.file)),r=e.some(e=>Ae(e,w));t&&!r&&await p.cacheManager.deleteMany(e=>Ae(e,s.file))}const x={n_ctx:i,n_threads:f,reasoning_budget_tokens:t.maxThinkingTokens,n_gpu_layers:0,jinja:!0};try{let t=y?await Re({model:e,signal:n,onProgress:r}):void 0;t||y||await Le(p,e).catch(()=>!1)||(t=await Re({model:e,signal:n,onProgress:r}).catch(e=>{if(n?.aborted)throw new Error("Cancelled");if(!ce(e))throw e;o&&console.log("Local model store failed",e)})),t?(r(1,u.load),await p.loadModel(t,x)):await p.loadModelFromUrl(v?{url:b,mmprojUrl:v}:b,{...x,useCache:!0,signal:n,progressCallback:({loaded:e,total:t})=>{const n=t?e/t:0;r(n,n>=1?u.load:u.download)}})}catch(e){throw await Ne(),e}if(n?.aborted)throw await Ne(),new Error("Cancelled");if(!p.getLoadedContextInfo().n_ctx)throw await Ne(),new Error("Failed to create model context");return{model:e,backend:l.cpu,contextSize:i,chat:t=>(async(e,t,r)=>{if(Se=!0===r.logging,e.isModelLoaded())return await H({model:t,params:r,stopped:()=>!!r.signal?.aborted,start:async n=>{if($(n)&&!e.supportInputModality("image"))throw new Error("Model does not accept images");if(L(n)&&!e.supportInputModality("audio"))throw new Error("Model does not accept audio");return await e.createChatCompletion({messages:await Ue(n),...E(r.limits,r.reasoning),abortSignal:r.signal,...t.reasoning?{chat_template_kwargs:{enable_thinking:r.reasoning}}:{}})}})})(p,e,t),unload:async()=>{if(ke==p)await Ne();else try{await p.exit()}catch{}}}},cached:async e=>{try{return!!e.cpu&&(!!await $e(e)||await Le(await Ee(),e))}catch{return!1}},hasCache:async()=>{try{for(const e of p.flatMap(e=>De(e)))if(await Me.stored(e.url))return!0;const e=await Ee();return(await e.cacheManager.list()).length>0}catch{return!1}},remove:async e=>{const t=De(e);try{for(const e of t)await Me.remove(e.url)}catch{}try{const e=await Ee();await e.cacheManager.deleteMany(e=>t.some(t=>Ae(e,t.name)))}catch{}},purge:async()=>{try{await Me.purge()}catch{}try{const e=await Ee();await e.cacheManager.clear()}catch{}}},ze=((e={})=>{const t=e.engines?.cpu||qe,r=e.engines?.litert||je;let n,o,a,i,s,d,f,m,g=l.none,h=c.idle,y=[],w=0,b={percent:0,phase:u.download};const v=n=>{if(e.backend!=l.none)return e.backend==l.cpu?n.cpu?t:void 0:e.backend==l.gpu?n.litert?r:void 0:n.litert&&"undefined"!=typeof navigator&&navigator.gpu&&"undefined"!=typeof WebAssembly?r:!n.cpu||"undefined"==typeof window&&"undefined"==typeof self&&"undefined"==typeof Worker||"undefined"==typeof WebAssembly?void 0:t},x=(e,t)=>{b={percent:Math.max(0,Math.min(1,e)),phase:t||u.download};for(const e of[...y])e.report(b.percent,b.phase)},j=e=>{h=e},M=()=>{w++,d?.abort(),d=void 0,s=void 0,h==c.downloading&&j(c.idle)},k=(e,t)=>{const r=i;return r?new Promise(n=>{let o=!1;const a={report:e,settle:e=>{o||(o=!0,t?.removeEventListener("abort",s),n(e))}},s=()=>{(e=>{y=y.filter(t=>t!=e),queueMicrotask(()=>{!y.length&&i&&M()})})(a),a.settle(!1)};y.push(a),t?.aborted?s():t?.addEventListener("abort",s,{once:!0}),r.then(a.settle,()=>a.settle(!1))}):Promise.resolve(!1)},P=()=>h==c.ready&&!!n&&!!o;return{load:async({model:e,limits:t,assets:r,logging:l,signal:m,onProgress:h})=>{if(m?.aborted)return!1;if(P()&&o?.id==e.id)return!0;if(i&&s==e.id)return h(b.percent,b.phase),await k(h,m);i&&(M(),y=[],await i.catch(()=>!1));const O=++w,S=(async()=>{await(async()=>{try{if("undefined"==typeof navigator)return;await(navigator.storage?.persist?.())}catch{}})();const i=v(e);if(O!=w)return!1;if(!i)return f="Model is not supported on this device",j(c.unsupported),!1;if(await(async(e,t)=>{if(o&&o.id!=e.id){const e=o,t=a,r=n;n=void 0,o=void 0,a=void 0,await(r?.unload()),await(t?.remove(e))}if(await t.hasCache())for(const r of p)r.id!=e.id&&v(r)==t&&await t.remove(r)})(e,i),O!=w)return!1;const s=await i.cached(e);if(O!=w)return!1;f=void 0,j(c.downloading),x(0,u.download),s&&x(1,u.load);const m=new AbortController;d=m;try{const s=await i.startLLM({model:e,limits:t,logging:l,signal:m.signal,assets:r,onProgress:(e,t)=>{O==w&&x(e,t)}});return O!=w||m.signal.aborted?(await s.unload(),!1):(n=s,o=e,a=i,g=i.backend,f=void 0,j(c.ready),x(1,u.load),!0)}catch(e){return O!=w||(n=void 0,o=void 0,a=void 0,f=`${e?.message||`${e}`}`,l&&console.log("Local model failed",e),j(c.error)),!1}finally{d==m&&(d=void 0)}})().finally(()=>{i==S&&(i=void 0,s=void 0,y=[])});return i=S,s=e.id,await k(h,m)},chat:async e=>{if(!P()||!n)return;for(;m;)await m.catch(()=>{});if(!P()||!n)return;const t=n.chat(e);m=t;try{return await t}finally{m==t&&(m=void 0)}},unload:async()=>{const e=n;M(),n=void 0,o=void 0,a=void 0,j(c.idle),await(e?.unload())},ready:P,loading:()=>!P()&&h==c.downloading,status:()=>h,backend:()=>g,error:()=>f,model:()=>o}})(),Fe=(e,t,r)=>{const n=e.status(),o=y(t),a=w(o);return{...o?{model:o}:{},availability:n==c.ready?s.online:n==c.error||n==c.unsupported?s.offline:s.away,status:n,backend:e.backend(),supportsImages:!!a&&x(a),supportsAudio:!!a&&j(a),ready:e.ready(),loading:e.loading(),requesting:r.requesting,phase:r.phase,percent:r.percent,...r.error?{error:r.error}:{}}},Ie=(e=>{let t,r=0;const n=t=>t.input.onStatus?.(Fe(e,t.model??t.input.model,t));return o=>{t?.controller.abort();const a={token:++r,input:o,controller:new AbortController,percent:e.ready()?100:0,phase:e.ready()?u.load:u.download,requesting:!1,cancelled:!1};return t=a,n(a),(async t=>{const{input:o}=t,a=!0===o.logging,s=await v(o.model);if(t.model=s?.id,t.token!=r)return;const c=o.messages.some(e=>e.role!=i.system&&"string"==typeof e.content&&!!e.content.trim()),l=o.messages.some(e=>e.role==i.user&&!!e.images?.some(e=>"string"==typeof e&&!!e)),d=o.messages.some(e=>e.role==i.user&&!!e.audio?.some(e=>"string"==typeof e&&!!e)),f=c||l||d;if(!s)return t.error="Unknown model",void n(t);if(!f)return t.error="No prompt",void n(t);const m=x(s),g=j(s);if(!(c||l&&m||d&&g))return d&&!g?t.error="Model does not accept audio":l&&!m&&(t.error="Model does not accept images"),void n(t);const p=T(o.limits,!!s.litert),h=await e.load({model:s,limits:p,logging:a,signal:t.controller.signal,onProgress:(e,o)=>{t.token==r&&(t.percent=Math.round(100*e),t.phase=o,n(t))}}).catch(e=>(t.token==r&&(t.error=`${e?.message||`${e}`}`),!1));if(t.token!=r)return;if(t.cancelled)return;if(!h)return t.error||(t.error=e.error()||"Model not ready"),void n(t);const y=l&&!m||d&&!g?o.messages.map(({images:e,audio:t,...r})=>({...r,...e&&m?{images:e}:{},...t&&g?{audio:t}:{}})):o.messages;t.requesting=!0,t.error=void 0,t.percent=100,t.phase=u.load,n(t);let w,b="",M="";try{w=await e.chat({messages:y,limits:p,reasoning:!0===o.reasoning,logging:a,onReason:e=>{t.token!=r||t.cancelled||(b+=e,o.onThinking?.(b))},onText:e=>{t.token!=r||t.cancelled||(M+=e,o.onResponse?.(M))},onSpeed:e=>{t.token!=r||t.cancelled||o.onSpeed?.(e)},signal:t.controller.signal})}catch(e){if(t.token!=r)return;return t.requesting=!1,t.error=`${e?.message||`${e}`}`,void n(t)}t.token==r&&(t.requesting=!1,w||t.cancelled||(t.error="No reply"),n(t))})(a),()=>(t=>{t.token==r&&(t.cancelled=!0,t.controller.abort(),e.status()!=c.ready?queueMicrotask(()=>n(t)):e.unload().then(()=>n(t)))})(a)}})(ze),Ve=(Be=ze,async(e={})=>{const t=await v(e.model),r=r=>e.onStatus?.(Fe(Be,t?.id,r));if(!t)return r({requesting:!1,phase:u.download,percent:0,error:"Unknown model"}),!1;let n,o=0,a=u.download;const i=Be.ready()&&Be.model()?.id==t.id;return await Be.load({model:t,limits:T(e.limits,!!t.litert),logging:!0===e.logging,onProgress:(e,t)=>{o=Math.round(100*e),a=t,r({requesting:!1,phase:a,percent:o})}}).catch(e=>(n=`${e?.message||`${e}`}`,!1))?(i&&r({requesting:!1,phase:u.load,percent:100}),!0):(r({requesting:!1,phase:a,percent:o,error:n||Be.error()||"Model not ready"}),!1)});var Be,We=a(69);const He=/^[0-9+\-*/%^().]+$/,Ye=e=>{let t=0;const r=e=>!!e&&e>="0"&&e<="9",n=e=>{throw new Error(e)},o=()=>{let o;for("("==e[t]?(t++,o=s(),")"!=e[t]&&n("Unbalanced parentheses"),t++):o=(()=>{const o=t;for(;r(e[t]);)t++;const a=e.slice(o,t);let i="";if("."==e[t]){t++;const n=t;for(;r(e[t]);)t++;i=e.slice(n,t)}return a||i?Number(`${a||"0"}.${i||"0"}`):n("Expected a number")})();"%"==e[t];)t++,o/=100;return o},a=()=>"+"==e[t]?(t++,a()):"-"==e[t]?(t++,-a()):(()=>{const r=o();return"^"!=e[t]?r:(t++,r**a())})(),i=()=>{let r=a();for(;"*"==e[t]||"/"==e[t];){const o=e[t];t++;const i=a();"*"==o?r*=i:(i||n("Division by zero"),r/=i)}return r},s=()=>{let r=i();for(;"+"==e[t]||"-"==e[t];){const n=e[t];t++;const o=i();r="+"==n?r+o:r-o}return r},c=s();return t<e.length&&n("Unexpected character"),Number.isFinite(c)||n("Result is not a finite number"),c},Je={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(!He.test(t))throw new Error("Unsupported character");const r=Ye(t);return{expression:t,result:Math.abs(r)>=1e5?(0,We.pNum)(r)??r:(0,We.rNum)(r,12)}})(t)}},Ge="degreesign-chat-prices-v1",Qe="EUR",Ze=5*We.oneMin,Ke=30*We.oneSec;let Xe,et={},tt=0,rt=!1,nt=!1;const ot=e=>{const t={};for(const[r,n]of Object.entries(e??{}))"number"==typeof n&&Number.isFinite(n)&&(t[r.trim().toUpperCase()]=n);return t},at=(e,t)=>e&&e.sourceAt>t.sourceAt?e:t,it=async({fiat:e,crypto:t})=>{try{const r=await fetch("https://srv.coinexams.com/data.json");if(!r.ok)throw new Error(`Price feed failed with ${r.status}`);const n=await r.json(),o=Date.now(),a=e?((e,t)=>{const r=ot(e.rates?.current),n=ot(e.rates?.yesterday);if(Object.keys(r).length)return{fetchedAt:t,sourceAt:Number(e.rates?.date)||t,rates:r,yesterday:n}})(n,o):void 0,i=t?((e,t)=>{const r=e.coins??{},n={},o={};for(const[e,t]of Object.entries(r)){const r=e.trim().toUpperCase(),a=t?.pr,i=t?.yst;"number"==typeof a&&Number.isFinite(a)&&(n[r]=a),"number"==typeof i&&Number.isFinite(i)&&(o[r]=i)}if(Object.keys(n).length)return{fetchedAt:t,sourceAt:Number(e.date)||t,prices:n,yesterday:o}})(n,o):void 0;if(e&&!a)throw new Error("Price feed is unavailable");if(t&&!i)throw new Error("Price feed is unavailable");a&&(et.fiat=at(et.fiat,a)),i&&(et.crypto=at(et.crypto,i)),tt=0,rt=!1,(()=>{try{if("undefined"==typeof localStorage)return;localStorage.setItem(Ge,JSON.stringify(et))}catch{}})()}catch(e){throw tt=Date.now(),rt=!0,e}},st=e=>!!et.crypto&&(e in et.crypto.prices||e in et.crypto.yesterday),ct=e=>!!et.fiat&&(e in et.fiat.rates||e in et.fiat.yesterday),lt=async e=>{const t=(e=>{const t={fiat:!1,crypto:!1};for(const r of e){if(r==Qe)continue;const e=st(r)||ct(r);!st(r)&&e||(t.crypto=!0),st(r)||(t.fiat=!0)}return t})(e),r=Date.now(),n=t.fiat&&r-(et.fiat?.fetchedAt??0)>=We.oneHr,o=t.crypto&&r-(et.crypto?.fetchedAt??0)>=Ze;(n||o)&&("undefined"!=typeof navigator&&!1===navigator.onLine||tt&&r-tt<Ke||(Xe||(Xe=it({fiat:n,crypto:o}).catch(()=>{}).finally(()=>{Xe=void 0})),await Xe))},ut=e=>{if(e==Qe)return 1;const t=et.crypto?.yesterday[e],r=et.fiat?.yesterday[e];return t||(r?1/r:void 0)},dt=(e,t)=>{if("string"!=typeof e||!e.trim())throw new Error(`Missing ${t}`);return e.trim().toUpperCase()},ft=e=>Math.abs(e)>=1e5?(0,We.pNum)(e)??e:(0,We.rNum)(e,8),mt=async e=>{(()=>{if(!nt){nt=!0;try{if("undefined"==typeof localStorage)return;const e=localStorage.getItem(Ge);if(!e)return;const t=JSON.parse(e);et={...t.fiat?{fiat:t.fiat}:{},...t.crypto?{crypto:t.crypto}:{}}}catch{}}})();const t=dt(e.from,"from"),r=void 0===e.to||null===e.to?Qe:dt(e.to,"to"),n=(e=>{if(null==e)return 1;if("number"!=typeof e||!Number.isFinite(e))throw new Error("Invalid amount");return e})(e.amount);await lt([t,r]);const o=e=>{const t=(e=>{if(e==Qe)return 1;const t=et.crypto?.prices[e],r=et.fiat?.rates[e];return t||(r?1/r:void 0)})(e);if(void 0!==t)return t;if(!et.fiat&&!et.crypto)throw new Error("Prices unavailable offline");if(st(e)||ct(e))throw new Error(`Unavailable quote for ${e}`);throw new Error(`Unknown symbol ${e}`)},a=o(t),i=o(r),s=ut(t),c=ut(r),l=a/i,u=s&&c?s/c:void 0,d=void 0===u?void 0:l-u,f=void 0===u?void 0:100*(l/u-1),m=(e=>{const t=[];for(const r of e)r!=Qe&&(st(r)?et.crypto&&t.push(et.crypto.sourceAt):ct(r)&&et.fiat&&t.push(et.fiat.sourceAt));return t})([t,r]),g=m.length?Math.min(...m):Date.now();return{from:t,to:r,amount:n,rate:ft(l),...void 0===u?{}:{previousRate:ft(u),change:ft(d??0),changePercent:(0,We.rNum)(f??0,4)},result:ft(n*l),updatedAt:new Date(g).toISOString(),stale:rt&&!(!et.fiat&&!et.crypto)}},gt={name:"currency",description:"Get the EUR price of a fiat currency, crypto coin or metal, or convert an amount. Returns the 24-hour change.",parameters:{type:"object",properties:{from:{type:"string",description:"Currency, coin or metal to convert from"},to:{type:"string",description:"Currency, coin or metal to convert to, EUR by default"},amount:{type:"number",description:"Amount to convert, 1 by default"}},required:["from"]},execute:e=>mt(e)},pt={amp:"&",apos:"'",gt:">",lt:"<",nbsp:" ",quot:'"',hellip:"...",mdash:"-",ndash:"-",ldquo:'"',lsquo:"'",rdquo:'"',rsquo:"'"},ht=(e,t,r,n)=>"number"==typeof e&&Number.isFinite(e)?Math.min(r,Math.max(t,e)):n,yt=(e,t)=>e.replace(/<[^>]*>/g," ").replace(/&(#x?[0-9a-f]+|[a-z]+);/gi,(e,t)=>{const r=(e=>{if(e.startsWith("#")){const t="x"==e[1]||"X"==e[1],r=parseInt(t?e.slice(2):e.slice(1),t?16:10);return r>0&&r<=1114111?String.fromCodePoint(r):e}return pt[e.toLowerCase()]??e})(t);return r==t?e:r}).replace(/\s+/g," ").trim().slice(0,Math.max(0,t)).trim(),wt=/^[a-z]{2,3}(-[a-z]{2,4})?$/i,bt=async(e,t)=>{const r=new AbortController,n=setTimeout(()=>r.abort(),t);try{const t=await fetch(e,{signal:r.signal});if(!t.ok)throw new Error(`Search failed with ${t.status}`);return await t.json()}catch(e){if(r.signal.aborted)throw new Error(`Search timed out after ${t} ms`);throw e}finally{clearTimeout(n)}},vt=(e={})=>{const t=((e={})=>{const t=e.language?.trim()??"";return{provider:e.provider==m.duckduckgo?m.duckduckgo:m.wikipedia,language:wt.test(t)?t:"en",limit:Math.round(ht(e.limit,1,20,3)),snippetLength:Math.round(ht(e.snippetLength,1,4e3,400)),timeout:ht(e.timeout,1e3,3e4,8e3)}})(e);return{name:"websearch",description:t.provider==m.duckduckgo?"Search DuckDuckGo for an instant answer and related topics.":"Search Wikipedia and return a few matching articles.",parameters:{type:"object",properties:{query:{type:"string",description:"What to search for"}},required:["query"]},execute:async e=>{const r="string"==typeof e.query?e.query.trim():"";if(!r)throw new Error("Missing query");const n=t.provider==m.duckduckgo?await(async(e,t)=>{const r=`https://api.duckduckgo.com/?format=json&no_html=1&skip_disambig=1&q=${encodeURIComponent(t)}`,n=await bt(r,e.timeout),o=[],a=new Set,i=(t,r,n)=>{t&&n&&!a.has(t)&&(a.add(t),o.push({title:yt(r||n,200),url:t,snippet:yt(n,e.snippetLength)}))},s=e=>{for(const t of e)t.Topics?s(t.Topics):i(t.FirstURL,t.Text,t.Text)};i(n.AbstractURL,n.Heading||n.AbstractText,n.AbstractText);for(const e of n.Results??[])i(e.FirstURL,e.Text,e.Text);return s(n.RelatedTopics??[]),o.slice(0,e.limit)})(t,r):await(async(e,t)=>{const r=`https://${e.language}.wikipedia.org`,n=`${r}/w/rest.php/v1/search/page?q=${encodeURIComponent(t)}&limit=${e.limit}`,o=await bt(n,e.timeout),a=[];for(const t of o.pages??[]){const n=t.key;n&&a.push({title:yt(t.title??n,200),url:`${r}/wiki/${encodeURIComponent(n)}`,snippet:yt(`${t.description??""} ${t.excerpt??""}`,e.snippetLength)})}return a})(t,r);return n}}},xt=(e,t)=>{const r=[];for(const n of e)n==f.websearch?r.push(vt(t)):n==f.calculate?r.push(Je):n==f.currency&&r.push(gt);return r};export{f as BuiltinTool,d as ChatModelId,s as ChatStatus,l as LlmBackend,u as LlmPhase,i as LlmRole,c as LlmStatus,m as WebSearchProvider,xt as builtinTools,Je as calculateTool,Ie as createChat,gt as currencyTool,Ve as preloadModel,vt as webSearchTool};
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { BuiltinTool } from '../enums';
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import { calculateTool } from './calculator';
|
|
3
|
+
import { currencyTool } from './currency';
|
|
4
|
+
import { webSearchTool } from './search';
|
|
5
|
+
import type { ChatTool, WebSearchConfig } from '../types';
|
|
6
|
+
/** Build the requested built-ins, in the order given */
|
|
6
7
|
declare const builtinTools: (builtins: BuiltinTool[], config?: WebSearchConfig) => ChatTool[];
|
|
7
|
-
|
|
8
|
-
declare const resolveChatTools: (input: ChatInput) => ResolvedTools;
|
|
9
|
-
export { builtinTools, defaultBuiltins, resolveChatTools };
|
|
8
|
+
export { builtinTools, calculateTool, currencyTool, webSearchTool };
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ChatModelId, ChatStatus, LlmBackend, LlmPhase, LlmRole, LlmStatus, WebSearchProvider } from './enums';
|
|
2
2
|
/** One chat message, owned by the host */
|
|
3
3
|
interface ChatMessage {
|
|
4
4
|
role: LlmRole;
|
|
@@ -21,16 +21,16 @@ interface ChatToolSchema {
|
|
|
21
21
|
items?: ChatToolSchema;
|
|
22
22
|
enum?: string[];
|
|
23
23
|
}
|
|
24
|
-
/** One tool
|
|
24
|
+
/** One tool a host may run itself, never handed to the model */
|
|
25
25
|
interface ChatTool {
|
|
26
|
-
/** Unique tool name
|
|
26
|
+
/** Unique tool name */
|
|
27
27
|
name: string;
|
|
28
|
-
/** What the tool does
|
|
28
|
+
/** What the tool does */
|
|
29
29
|
description?: string;
|
|
30
30
|
parameters?: ChatToolSchema;
|
|
31
31
|
execute: (args: Record<string, ChatToolValue>) => ChatToolValue | Promise<ChatToolValue>;
|
|
32
32
|
}
|
|
33
|
-
/** One call
|
|
33
|
+
/** One tool call, with its parsed arguments */
|
|
34
34
|
interface ChatToolCall {
|
|
35
35
|
id: number;
|
|
36
36
|
name: string;
|
|
@@ -41,7 +41,7 @@ interface ChatToolResult extends ChatToolCall {
|
|
|
41
41
|
result?: ChatToolValue;
|
|
42
42
|
error?: string;
|
|
43
43
|
}
|
|
44
|
-
/** Search provider settings of the
|
|
44
|
+
/** Search provider settings of the websearch tool */
|
|
45
45
|
interface WebSearchConfig {
|
|
46
46
|
provider?: WebSearchProvider;
|
|
47
47
|
/** Wikipedia language edition, two or three letters plus an optional region */
|
|
@@ -53,7 +53,7 @@ interface WebSearchConfig {
|
|
|
53
53
|
/** Request budget in milliseconds */
|
|
54
54
|
timeout?: number;
|
|
55
55
|
}
|
|
56
|
-
/** One search hit returned
|
|
56
|
+
/** One search hit returned by the websearch tool */
|
|
57
57
|
interface WebSearchResult {
|
|
58
58
|
title: string;
|
|
59
59
|
url: string;
|
|
@@ -93,7 +93,7 @@ interface PriceSections {
|
|
|
93
93
|
fiat: boolean;
|
|
94
94
|
crypto: boolean;
|
|
95
95
|
}
|
|
96
|
-
/** One conversion returned
|
|
96
|
+
/** One conversion returned by the currency tool */
|
|
97
97
|
interface CurrencyResult {
|
|
98
98
|
from: string;
|
|
99
99
|
to: string;
|
|
@@ -106,24 +106,6 @@ interface CurrencyResult {
|
|
|
106
106
|
updatedAt: string;
|
|
107
107
|
stale: boolean;
|
|
108
108
|
}
|
|
109
|
-
/** Tool fields shared by the host input and one generation */
|
|
110
|
-
interface ChatToolParams {
|
|
111
|
-
/** Extra host tools, appended after the built-ins */
|
|
112
|
-
tools?: ChatTool[];
|
|
113
|
-
/** Called before a host or built-in tool runs */
|
|
114
|
-
onToolCall?: (call: ChatToolCall) => void;
|
|
115
|
-
/** Called when a tool returns or throws */
|
|
116
|
-
onToolResult?: (result: ChatToolResult) => void;
|
|
117
|
-
/** Max tool rounds in one reply, defaults to 4 */
|
|
118
|
-
maxToolRounds?: number;
|
|
119
|
-
}
|
|
120
|
-
/** Host tools resolved against the built-ins for one request */
|
|
121
|
-
interface ResolvedTools {
|
|
122
|
-
/** Tools offered to the model, host tools replacing a built-in */
|
|
123
|
-
tools: ChatTool[];
|
|
124
|
-
/** Whether the host passed tools of its own */
|
|
125
|
-
explicit: boolean;
|
|
126
|
-
}
|
|
127
109
|
/** One evaluated arithmetic expression */
|
|
128
110
|
interface CalculationResult {
|
|
129
111
|
/** Normalized expression that was evaluated */
|
|
@@ -176,17 +158,6 @@ interface PriceFeed {
|
|
|
176
158
|
/** Feed timestamp of the crypto prices, milliseconds */
|
|
177
159
|
date?: number;
|
|
178
160
|
}
|
|
179
|
-
/** One LiteRT-LM model file and its capabilities */
|
|
180
|
-
interface LitertArtifact {
|
|
181
|
-
/** File name inside the model repository */
|
|
182
|
-
file: string;
|
|
183
|
-
/** Whether the build accepts images */
|
|
184
|
-
vision: boolean;
|
|
185
|
-
/** Whether the build accepts audio */
|
|
186
|
-
audio: boolean;
|
|
187
|
-
/** Whether the build accepts tool declarations */
|
|
188
|
-
tools: boolean;
|
|
189
|
-
}
|
|
190
161
|
/** One on-device model */
|
|
191
162
|
interface ChatModel {
|
|
192
163
|
/** Stable catalog id, passed by the host */
|
|
@@ -205,10 +176,14 @@ interface ChatModel {
|
|
|
205
176
|
};
|
|
206
177
|
};
|
|
207
178
|
/** LiteRT-LM (WebGPU) artifact */
|
|
208
|
-
litert?:
|
|
179
|
+
litert?: {
|
|
209
180
|
repo: string;
|
|
210
|
-
/**
|
|
211
|
-
|
|
181
|
+
/** File name inside the model repository */
|
|
182
|
+
file: string;
|
|
183
|
+
/** Whether the build accepts images */
|
|
184
|
+
vision: boolean;
|
|
185
|
+
/** Whether the build accepts audio */
|
|
186
|
+
audio: boolean;
|
|
212
187
|
};
|
|
213
188
|
}
|
|
214
189
|
/** Token, prompt and thread budgets of an on-device generation */
|
|
@@ -232,6 +207,8 @@ interface LlmLimits {
|
|
|
232
207
|
}
|
|
233
208
|
/** Current model and request state reported to the host */
|
|
234
209
|
interface ChatStatusSnapshot {
|
|
210
|
+
/** Build that runs on this device after the mobile swap */
|
|
211
|
+
model?: ChatModelId;
|
|
235
212
|
/** Availability derived from the engine status */
|
|
236
213
|
availability: ChatStatus;
|
|
237
214
|
status: LlmStatus;
|
|
@@ -240,8 +217,6 @@ interface ChatStatusSnapshot {
|
|
|
240
217
|
supportsImages: boolean;
|
|
241
218
|
/** Whether the requested model accepts audio on this backend */
|
|
242
219
|
supportsAudio: boolean;
|
|
243
|
-
/** Whether the requested model accepts tool declarations on this backend */
|
|
244
|
-
supportsTools: boolean;
|
|
245
220
|
ready: boolean;
|
|
246
221
|
loading: boolean;
|
|
247
222
|
/** Whether a reply is streaming right now */
|
|
@@ -253,7 +228,7 @@ interface ChatStatusSnapshot {
|
|
|
253
228
|
error?: string;
|
|
254
229
|
}
|
|
255
230
|
/** One chat request, invoked for every response */
|
|
256
|
-
interface ChatInput
|
|
231
|
+
interface ChatInput {
|
|
257
232
|
/** Model that answers, the GPU model when WebGPU is available, else the CPU one */
|
|
258
233
|
model?: ChatModelId;
|
|
259
234
|
/** Complete prompt, including the system and user turns */
|
|
@@ -264,10 +239,6 @@ interface ChatInput extends ChatToolParams {
|
|
|
264
239
|
reasoning?: boolean;
|
|
265
240
|
/** Whether package and engine logs reach the console, defaults to off */
|
|
266
241
|
logging?: boolean;
|
|
267
|
-
/** Built-in tools to attach, all three by default */
|
|
268
|
-
builtins?: BuiltinTool[] | false;
|
|
269
|
-
/** Search provider settings */
|
|
270
|
-
websearch?: WebSearchConfig;
|
|
271
242
|
/** Accumulated reasoning text, streamed while the model thinks */
|
|
272
243
|
onThinking?: (text: string) => void;
|
|
273
244
|
/** Accumulated reply text, streamed while the model answers */
|
|
@@ -414,7 +385,7 @@ interface ModelStore {
|
|
|
414
385
|
purge: () => Promise<void>;
|
|
415
386
|
}
|
|
416
387
|
/** One generation request */
|
|
417
|
-
interface RuntimeChatParams
|
|
388
|
+
interface RuntimeChatParams {
|
|
418
389
|
messages: ChatMessage[];
|
|
419
390
|
limits: LlmLimits;
|
|
420
391
|
reasoning: boolean;
|
|
@@ -422,8 +393,6 @@ interface RuntimeChatParams extends ChatToolParams {
|
|
|
422
393
|
logging?: boolean;
|
|
423
394
|
onReason: (text: string) => void;
|
|
424
395
|
onText: (text: string) => void;
|
|
425
|
-
/** Called before a rebuilt engine restarts the reply */
|
|
426
|
-
onRestart?: () => void;
|
|
427
396
|
/** Current generation speed in tokens per second */
|
|
428
397
|
onSpeed?: (tokensPerSecond: number) => void;
|
|
429
398
|
signal?: AbortSignal;
|
|
@@ -444,7 +413,7 @@ interface Runtime {
|
|
|
444
413
|
model: () => ChatModel | undefined;
|
|
445
414
|
}
|
|
446
415
|
/** Params for a single on-device chat generation */
|
|
447
|
-
interface EngineChatParams
|
|
416
|
+
interface EngineChatParams {
|
|
448
417
|
messages: ChatMessage[];
|
|
449
418
|
limits: LlmLimits;
|
|
450
419
|
/** User preference, off unless explicitly turned on */
|
|
@@ -455,8 +424,6 @@ interface EngineChatParams extends ChatToolParams {
|
|
|
455
424
|
onReason: (text: string) => void;
|
|
456
425
|
/** Streamed reply delta */
|
|
457
426
|
onText: (text: string) => void;
|
|
458
|
-
/** Called before a rebuilt engine restarts the reply */
|
|
459
|
-
onRestart?: () => void;
|
|
460
427
|
/** Current generation speed in tokens per second */
|
|
461
428
|
onSpeed?: (tokensPerSecond: number) => void;
|
|
462
429
|
signal?: AbortSignal;
|
|
@@ -485,8 +452,6 @@ interface LlmRuntime {
|
|
|
485
452
|
contextSize: number;
|
|
486
453
|
/** Stream one reply, returning the final text or undefined when stopped */
|
|
487
454
|
chat: (params: EngineChatParams) => Promise<string | undefined>;
|
|
488
|
-
/** Whether the runtime cannot serve another turn */
|
|
489
|
-
fatal?: () => boolean;
|
|
490
455
|
/** Release the model from memory, keeping its cache */
|
|
491
456
|
unload: () => Promise<void>;
|
|
492
457
|
}
|
|
@@ -554,23 +519,6 @@ type LitertContentPart = import('@litert-lm/core').ContentPart;
|
|
|
554
519
|
type LitertMessage = import('@litert-lm/core').Message;
|
|
555
520
|
/** One LiteRT-LM engine */
|
|
556
521
|
type LitertEngine = import('@litert-lm/core').Engine;
|
|
557
|
-
/** WebGPU device the wasm module initialized */
|
|
558
|
-
type LitertDevice = NonNullable<import('@litert-lm/core').Wasm.LiteRtLmWasm[`preinitializedWebGPUDevice`]>;
|
|
559
|
-
/** One live LiteRT-LM engine and its device */
|
|
560
|
-
interface LitertGpu {
|
|
561
|
-
/** Live engine, rebuilt after a device loss */
|
|
562
|
-
engine: LitertEngine;
|
|
563
|
-
/** Wasm module the engine belongs to */
|
|
564
|
-
mod: LitertModule;
|
|
565
|
-
/** Device the engine runs on */
|
|
566
|
-
device?: LitertDevice;
|
|
567
|
-
/** Whether the device was lost */
|
|
568
|
-
lost: boolean;
|
|
569
|
-
/** Context window step of this engine */
|
|
570
|
-
contextStep: number;
|
|
571
|
-
/** Model file stream of a rebuild */
|
|
572
|
-
reopen: () => Promise<ReadableStream<Uint8Array>>;
|
|
573
|
-
}
|
|
574
522
|
/** The LiteRT-LM module namespace */
|
|
575
523
|
type LitertModule = typeof import('@litert-lm/core');
|
|
576
524
|
/** Settings handed to the LiteRT-LM engine */
|
|
@@ -585,26 +533,23 @@ interface LitertSettingsParams {
|
|
|
585
533
|
source: ReadableStream<Uint8Array>;
|
|
586
534
|
/** Loaded LiteRT module */
|
|
587
535
|
mod: LitertModule;
|
|
588
|
-
/** Context window of this engine */
|
|
589
|
-
contextTokens?: number;
|
|
590
536
|
}
|
|
591
537
|
/** One reused LiteRT-LM conversation and the turns it already holds */
|
|
592
538
|
interface LitertSession {
|
|
593
|
-
/** Live conversation
|
|
594
|
-
conversation?: import('@litert-lm/core').
|
|
539
|
+
/** Live conversation, dropped when a turn cannot be continued */
|
|
540
|
+
conversation?: import('@litert-lm/core').Conversation;
|
|
595
541
|
/** Built turns already sent to the conversation */
|
|
596
542
|
sent: EngineMessage[];
|
|
597
543
|
/** Reasoning flag the conversation was created with */
|
|
598
544
|
reasoning: boolean;
|
|
599
545
|
/** Output token budget the conversation was created with */
|
|
600
546
|
maxTokens: number;
|
|
601
|
-
/** Tools the conversation was created with */
|
|
602
|
-
tools?: ChatTool[];
|
|
603
547
|
}
|
|
604
548
|
/** Params of one LiteRT-LM chat call */
|
|
605
549
|
interface LitertChatParams {
|
|
606
|
-
|
|
550
|
+
engine: LitertEngine;
|
|
607
551
|
model: ChatModel;
|
|
552
|
+
mod: LitertModule;
|
|
608
553
|
params: EngineChatParams;
|
|
609
554
|
session: LitertSession;
|
|
610
555
|
}
|
|
@@ -662,4 +607,4 @@ interface EngineRunParams {
|
|
|
662
607
|
/** Called when a slow stream keeps the text already delivered */
|
|
663
608
|
onStall?: () => void;
|
|
664
609
|
}
|
|
665
|
-
export type { ChatMessage,
|
|
610
|
+
export type { ChatMessage, ChatTool, ChatToolCall, ChatToolResult, ChatToolSchema, ChatToolValue, WebSearchConfig, WebSearchResult, WebSearchSettings, FiatSnapshot, CryptoSnapshot, PriceSnapshot, PriceSections, PriceCoin, PriceFeed, CurrencyResult, CalculationResult, WikipediaPage, WikipediaResponse, DuckDuckGoTopic, DuckDuckGoResponse, ChatModel, LlmLimits, ChatStatusSnapshot, ChatInput, ChatPreloadInput, ChatState, CancelChat, WllamaAssets, LitertAssets, GpuNavigator, MobileNavigator, ActiveCall, RuntimeDeps, RuntimeLoadParams, RuntimeLoadWaiter, RuntimeChatParams, StoredPart, StoredFilePart, StoredModel, StoredModelMeta, ResumePlan, StoreDownloadParams, ModelStore, Runtime, EngineChatParams, StartLlmParams, LlmRuntime, LlmEngine, EngineMessage, EngineContentPart, WllamaContentPart, WllamaMessage, LitertContentPart, LitertMessage, LitertEngine, LitertModule, LitertSettings, LitertSettingsParams, LitertSession, LitertChatParams, StreamLitertParams, EngineDelta, EngineChunk, StreamReplyParams, EngineRunParams, };
|
package/package.json
CHANGED