Spaces:
Running
Running
Upload index-B7MnxBmF.js
Browse files- assets/index-B7MnxBmF.js +1 -1
assets/index-B7MnxBmF.js
CHANGED
|
@@ -722,7 +722,7 @@ if (!WebAssembly.Suspending) {
|
|
| 722 |
|
| 723 |
`);this.worker=Rg(a),this.worker.onmessage=this.onRecvMsg.bind(this),this.worker.onerror=this.logger.error;const o=await this.pushTask({verb:"module.init",args:[new Blob([n],{type:"text/javascript"}),this.useAsyncFile],callbackId:this.taskId++}),s=[];for(const l of t){const u=!this.useAsyncFile,f=await this.fileAlloc(l.name,l.blob.size,u);s.push({id:f,...l}),this.useAsyncFile&&this.fileBlobs.set(l.name,l.blob)}return this.useAsyncFile||await Promise.all(s.map(l=>this.fileWrite(l.id,l.blob))),o}async wllamaStart(){const t=await this.pushTask({verb:"wllama.start",args:[],callbackId:this.taskId++});return this.parseResult(t)}async wllamaAction(t,n){const r=B0(n),i=await this.pushTask({verb:"wllama.action",args:[t,r],callbackId:this.taskId++});return j0(i)}async wllamaExit(){this.worker&&this.worker.terminate()}async wllamaDebug(){const t=await this.pushTask({verb:"wllama.debug",args:[],callbackId:this.taskId++});return JSON.parse(t)}async fileAlloc(t,n,r){return(await this.pushTask({verb:"fs.alloc",args:[t,n,r],callbackId:this.taskId++})).fileId}async fileWrite(t,n){const r=n.stream().getReader();let i=0;for(;;){const{done:a,value:o}=await r.read();if(a)break;const s=o.byteLength;await this.pushTask({verb:"fs.write",args:[t,o,i],callbackId:this.taskId++},[o.buffer]),i+=s}}async fileReadResponse(t,n,r){var i;try{const a=this.fileBlobs.get(t);if(!a)throw new Error(`blob not found for name="${t}"`);const s=await a.slice(n,n+r).arrayBuffer();this.worker.postMessage({verb:"fs.read_res",args:[s]},{transfer:[s]})}catch(a){this.logger.error("fileReadResponse failed, terminating worker:",a),(i=this.worker)==null||i.terminate(),this.worker=void 0,this.abort(`File read failed: ${a}`,a.stack||"")}}parseResult(t){const n=JSON.parse(t);if(n&&n.error)throw new Ld("Unknown error, please see console.log","");return n}pushTask(t,n){return new Promise((r,i)=>{this.taskQueue.push({resolve:r,reject:i,param:t,buffers:n}),this.runTaskLoop()})}async runTaskLoop(){if(!this.busy){for(this.busy=!0;;){const t=this.taskQueue.shift();if(!t)break;this.resultQueue.push(t),this.worker.postMessage(t.param,Ng()?void 0:{transfer:t.buffers??[]})}this.busy=!1}}onRecvMsg(t){if(!t.data)return;const{verb:n,args:r}=t.data,i=this.resources.compat;if(n&&n.startsWith("console.")){if(this.suppressNativeLog)return;n.endsWith("debug")&&this.logger.debug(...r),n.endsWith("log")&&this.logger.log(...r),n.endsWith("warn")&&this.logger.warn(...r),n.endsWith("error")&&this.logger.error(...r);return}else if(n==="signal.abort"){const[l,u,f,c]=r;c&&this.logger.error(c),(async()=>{let p="",d=u.replace("Build with -sASSERTIONS for more info.","");l==="abort"?(d=`(ABORT) ${d}`,p=f.replace(/\|/g,`
|
| 724 |
`)):l==="exception"&&(p=f);const h=await _g.decodeStackTrace(p,i);this.logger.error(`Stack trace (${l}):
|
| 725 |
-
`+h),this.abort(d,h)})();return}if(n===ab){const[l,u,f]=r;this.fileReadResponse(l,u,f).catch(()=>{});return}const{callbackId:a,result:o,err:s}=t.data;if(a){const l=this.resultQueue.findIndex(u=>u.param.callbackId===a);if(l!==-1){const u=this.resultQueue.splice(l,1)[0];s?u.reject(s):u.resolve(o)}else this.logger.error(`Cannot find waiting task with callbackId = ${a}`)}}abort(t,n){const r=new Ld(t.length==0?"(unknown error)":t,n);for(;this.resultQueue.length>0;){const i=this.resultQueue.pop();if(!i)break;i.reject(r)}for(;this.taskQueue.length>0;){const i=this.taskQueue.pop();if(!i)break;i.reject(r)}}}const lu="https://huggingface.co",sb=["Q4_K_M","Q8_0"];async function lb(e,t){const n=`${lu}/api/models/${e}/tree/main?recursive=true`,r={Accept:"application/json"};t&&(r.Authorization=`Bearer ${t}`);const i=await fetch(n,{headers:r});if(!i.ok){let a=i.statusText;try{a=(await i.json()).error??a}catch{}throw new Error(`HF API error (${i.status}): ${a}`)}return i.json()}function Bs(e,t){const n=t.match(/^(.+)-(\d{5})-of-(\d{5})\.gguf$/i);if(!n)return t;const r=`${n[1]}-00001-of-${n[3]}.gguf`;return e.some(i=>i.path===r)?r:t}function Rd(e,t,n){const r=e.filter(i=>{if(i.type!=="file"||!i.path.toLowerCase().endsWith(".gguf"))return!1;const a=i.path.toLowerCase().includes("mmproj");return n?a:!a});if(r.length===0)return null;if(t){const i=t.toUpperCase(),a=r.find(o=>o.path.toUpperCase().includes(i));return a?Bs(r,a.path):null}for(const i of sb){const a=r.find(o=>o.path.toUpperCase().includes(i));if(a)return Bs(r,a.path)}return Bs(r,r[0].path)}async function ub(e){const{repo:t,file:n,quant:r,mmprojFile:i,mmprojQuant:a,hfToken:o}=e,s=await lb(t,o),l=n??Rd(s,r,!1);if(!l)throw new Error(`No GGUF file found in repo "${t}"`);const u={url:`${lu}/${t}/resolve/main/${l}`};if(i||a!==void 0){const f=i??Rd(s,a,!0);f&&(u.mmprojUrl=`${lu}/${t}/resolve/main/${f}`)}if(o){const f=new URLSearchParams({token:o});u.url+=`?${f}`,u.mmprojUrl&&(u.mmprojUrl+=`?${f}`)}return u}async function cb(e,t){if(!e.includes("/resolve/"))return;const n=e.replace("/resolve/","/raw/");try{const i=(await fetch(n,{headers:t}).then(a=>a.text())).match(/^oid sha256:([0-9a-f]{64})$/m);return i?i[1]:void 0}catch{return}}class fb{isSupported(){var t;return typeof navigator<"u"&&"storage"in navigator&&!!((t=navigator.storage)!=null&&t.getDirectory)}async read(t){try{return await(await(await _a()).getFileHandle(t)).getFile()}catch{return null}}async write(t,n){const r=await db(t);await r.truncate(0);const i=n.getReader();try{for(;;){const{done:a,value:o}=await i.read();if(a)break;await r.write(o)}}finally{await r.close()}}async getSize(t){try{return(await(await(await _a()).getFileHandle(t)).getFile()).size}catch{return-1}}async list(){const t=await _a(),n=[];for await(const[r,i]of t.entries())if(i.kind==="file"){const a=await i.getFile();n.push({key:r,size:a.size})}return n}async delete(t){try{await(await _a()).removeEntry(t)}catch(n){if((n==null?void 0:n.name)!=="NotFoundError")throw n}}}async function _a(){return(await navigator.storage.getDirectory()).getDirectoryHandle("cache",{create:!0})}async function db(e){const t=Rg(rb);let n,r;t.onmessage=a=>{a.data.ok?n(null):a.data.err&&r(a.data.err)},t.onerror=a=>r==null?void 0:r(a.message??a);const i=a=>new Promise((o,s)=>{n=o,r=s,t.postMessage(a,Ng()?void 0:{transfer:"buf"in a&&a.buf?[a.buf.buffer]:[]})});return await i({action:"open",filename:e}),{truncate:async()=>{},write:a=>i({action:"write",buf:a}),close:async()=>{await i({action:"close"}),t.terminate()}}}function Vs(e){return{algorithm:"SHA-256",value:e}}class pb{isSupported(){return typeof navigator<"u"&&"crossOriginStorage"in navigator}async read(t){try{return(await navigator.crossOriginStorage.requestFileHandle(Vs(t))).getFile()}catch{return null}}async write(t,n){const i=await(await navigator.crossOriginStorage.requestFileHandle(Vs(t),{create:!0})).createWritable(),a=n.getReader();try{for(;;){const{done:o,value:s}=await a.read();if(o)break;await i.write(s)}}finally{await i.close()}}async getSize(t){try{return(await(await navigator.crossOriginStorage.requestFileHandle(Vs(t))).getFile()).size}catch{return-1}}async list(){throw new Error("not implemented")}async delete(t){throw new Error("not implemented")}}class mb{constructor(){this.cos=new pb,this.priv=new fb}isSupported(){return this.priv.isSupported()}async read(t,n){if(n!=null&&n.sha256&&this.cos.isSupported()){const r=await this.cos.read(n.sha256);if(r)return r}return this.priv.read(t)}async write(t,n,r){r!=null&&r.sha256&&this.cos.isSupported()?await this.cos.write(r.sha256,n):await this.priv.write(t,n)}async getSize(t,n){if(n!=null&&n.sha256&&this.cos.isSupported()){const r=await this.cos.getSize(n.sha256);if(r!==-1)return r}return this.priv.getSize(t)}async list(){return this.priv.list()}async delete(t){return this.priv.delete(t)}}const pr="__metadata__",hb="polyfill_for_older_version";function Hs(e){if(e&&e.sha256)return{sha256:e.sha256}}class Og{constructor(t=[new mb]){for(const n of t)if(n.isSupported()){this.sb=n;return}throw new Error("No supported storage backend found")}async getNameFromURL(t){return Ws(t,"")}async write(t,n,r){await this.sb.write(t,n),await this.writeMetadata(t,r)}async download(t,n={}){const r=await Ws(t,""),i=await cb(t,n.headers??{}),a=i?{sha256:i}:void 0;if(a&&await this.sb.getSize(r,a)!==-1){if(!await this.getMetadata(r)){const y=await fetch(t,{method:"HEAD",...n.headers?{headers:n.headers}:{}}),E=y.headers.get("content-length"),m=(y.headers.get("etag")||"").replace(/[^A-Za-z0-9]/g,"");await this.writeMetadata(r,{originalURL:t,originalSize:parseInt(E??"0",10),etag:m,sha256:i,...n.metadataAdditional??{}})}return}const o=await fetch(t,{...n.headers?{headers:n.headers}:{},...n.signal?{signal:n.signal}:{}});if(!o.ok||!o.body)throw new Error(`Failed to fetch ${t}: HTTP ${o.status}`);const s=o.headers.get("content-length"),l=(o.headers.get("etag")||"").replace(/[^A-Za-z0-9]/g,""),u=parseInt(s??"0",10),f=n.progressCallback;let c=0,p=0;const d=new TransformStream({transform(y,E){if(c+=y.byteLength,f){const m=Date.now();m-p>100&&(p=m,f({loaded:c,total:u}))}E.enqueue(y)},flush(){f==null||f({loaded:c,total:u||c})}}),h={originalURL:t,originalSize:u,etag:l,...n.metadataAdditional??{}};i&&(h.sha256=i),await this.sb.write(r,o.body.pipeThrough(d),a),await this.writeMetadata(r,h)}async open(t){const n=Hs(await this.getMetadata(t)),r=await this.sb.read(t,n);if(r)return r;const i=await Ws(t,""),a=Hs(await this.getMetadata(i));return this.sb.read(i,a)}async getSize(t){const n=Hs(await this.getMetadata(t));return this.sb.getSize(t,n)}async getMetadata(t){const n=await this.sb.read(`${pr}${t}`),r=await this.sb.getSize(t);if(!n)return r>0?{etag:hb,originalSize:r,originalURL:""}:null;try{return await new Response(n).json()}catch{return null}}async list(){const t=await this.sb.list(),n={};for(const{key:i}of t)if(i.startsWith(pr)){const a=await this.sb.read(i);if(a){const o=await new Response(a).json().catch(()=>null);n[i.slice(pr.length)]=o}}const r=[];for(const{key:i,size:a}of t)i.startsWith(pr)||r.push({name:i,size:a,metadata:n[i]||{originalSize:a,originalURL:"",etag:""}});return r}async clear(){await this.deleteMany(()=>!0)}async delete(t){const n=await this.getNameFromURL(t);await this.deleteMany(r=>r.name===t||r.name===n)}async deleteMany(t){const n=await this.list();for(const r of n)t(r)&&(await this.sb.delete(r.name),await this.sb.delete(`${pr}${r.name}`))}async writeMetadata(t,n){const r=new Blob([JSON.stringify(n)],{type:"text/plain"});await this.sb.write(`${pr}${t}`,r.stream())}}async function Ws(e,t){const n=await crypto.subtle.digest("SHA-1",new TextEncoder().encode(e)),i=Array.from(new Uint8Array(n)).map(a=>a.toString(16).padStart(2,"0")).join("");return`${t}${i}_${e.split("/").pop()}`}const gb=3;class uu{constructor(t,n,r,i){this.modelManager=t,this.url=n,this.mmprojUrl=r,i?(this.files=this.getAllFiles(i),this.size=zs(this.files.map(a=>a.metadata.originalSize))):(this.files=[],this.size=0)}async open(){if(this.size===-1)throw new ye("Model is deleted from the cache; Call ModelManager.downloadModel to re-download the model","load_error");const t=[];for(const n of this.files){const r=await this.modelManager.cacheManager.open(n.name);if(!r)throw new Error(`Failed to open file ${n.name}; Hint: the model may be invalid, please refresh it`);t.push(r)}return t}validate(){let t=Zn.parseModelUrl(this.url).length;if(this.mmprojUrl&&(t+=1),this.size===-1)return"deleted";if(this.size<16||this.files.length!==t)return"invalid";for(const n of this.files)if(!n.metadata||n.metadata.originalSize!==n.size)return"invalid";return"valid"}async refresh(t={}){const n=Zn.parseModelUrl(this.url);this.mmprojUrl&&n.push(this.mmprojUrl);const r=n.map((u,f)=>({url:u,index:f}));this.modelManager.logger.debug("Downloading model files:",n);const i=this.modelManager.params.parallelDownloads??gb,a=await this.getTotalDownloadSize(n),o=[],s=async()=>{for(;r.length>0;){const u=r.shift();if(!u)break;await this.modelManager.cacheManager.download(u.url,{...t,metadataAdditional:{originalURL:u.url,mmprojURL:this.mmprojUrl},progressCallback:({loaded:f})=>{var c;o[u.index]=f,(c=t.progressCallback)==null||c.call(t,{loaded:zs(o),total:a})}})}},l=[];for(let u=0;u<i;u++)l.push(s()),o.push(0);await Promise.all(l),this.files=this.getAllFiles(await this.modelManager.cacheManager.list()),this.size=this.files.reduce((u,f)=>u+f.metadata.originalSize,0)}async remove(){this.files=this.getAllFiles(await this.modelManager.cacheManager.list()),await this.modelManager.cacheManager.deleteMany(t=>!!this.files.find(n=>n.name===t.name)),this.size=-1}getAllFiles(t){const n=new Set(Zn.parseModelUrl(this.url));this.mmprojUrl&&n.add(this.mmprojUrl);const r=[];for(const i of n){const a=t.find(o=>o.metadata.originalURL===i);if(!a)throw new Error(`Model file not found: ${i}`);r.push(a)}return r.sort((i,a)=>i.metadata.originalURL.localeCompare(a.metadata.originalURL)),r}async getTotalDownloadSize(t){const r=(await Promise.all(t.map(i=>fetch(i,{method:"HEAD"})))).map(i=>Number(i.headers.get("content-length")||"0"));return zs(r)}}class Zn{constructor(t={}){this.cacheManager=t.cacheManager||new Og,this.params=t,this.logger=t.logger||console}static parseModelUrl(t){if(Array.isArray(t))return t;const n=/-(\d{5})-of-(\d{5})\.gguf(?:\?.*)?$/,r=t.match(/\.gguf(\?.*)?$/),i=(r==null?void 0:r[1])??"",a=t.match(n);if(!a)return[t];const o=t.replace(n,""),s=a[2];return Array.from({length:Number(s)},(u,f)=>(f+1).toString().padStart(5,"0")).map(u=>`${o}-${u}-of-${s}.gguf${i}`)}async getModels(t={}){const n=await this.cacheManager.list();let r=[];for(const i of n){const a=Zn.parseModelUrl(i.metadata.originalURL),o=i.metadata.mmprojURL;(a.length===1||a[0]===i.metadata.originalURL)&&r.push(new uu(this,i.metadata.originalURL,o,n))}return t.includeInvalid||(r=r.filter(i=>i.validate()==="valid")),r}async downloadModel(t,n={}){const r=Yo(t)?{url:t}:t;if(!Ig(r.url))throw new ye(`Invalid model URL: ${r.url}; URL must ends with ".gguf"`,"download_error");const i=new uu(this,r.url,r.mmprojUrl);return i.validate()!=="valid"&&await i.refresh(n),i}async getModelOrDownload(t,n={}){var a;const i=(await this.getModels()).find(o=>o.url===t.url);return i?((a=n.progressCallback)==null||a.call(n,{loaded:i.size,total:i.size}),i):this.downloadModel(t,n)}async clear(){await this.cacheManager.clear()}}var Dg=(e=>(e[e.DEBUG=1]="DEBUG",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e))(Dg||{});const Gs={worker:"https://cdn.jsdelivr.net/npm/@wllama/wllama-compat@3.5.1/wasm/wllama.js",wasm:"https://cdn.jsdelivr.net/npm/@wllama/wllama-compat@3.5.1/wasm/wllama.wasm"};class ye extends Error{constructor(t,n="unknown_error"){super(t),this.type=n}}class wb extends Error{constructor(){super("Operation aborted"),this.name="AbortError"}}class Ld extends Error{constructor(t,n){super(t),this.name="RuntimeError",this.stack=n}}class yb{constructor(t,n={}){if(this.compat=null,this.proxy=null,this.useMultiThread=!1,this.nbThreads=1,this.useEmbeddings=!1,this.useRerank=!1,this.loadedContextInfo=null,this.seed=void 0,this.bosToken=-1,this.eosToken=-1,this.eotToken=-1,this.eogTokens=new Set,this.addBosToken=!1,this.addEosToken=!1,this.hasEncoder=!1,this.decoderStartToken=-1,this.chatTemplateKwargs={},Z0(),!t)throw new ye("AssetsPathConfig is required");this.pathConfig=t,this.config=n,this.cacheManager=n.cacheManager??new Og,this.modelManager=n.modelManager??new Zn({cacheManager:this.cacheManager,logger:n.logger??console,parallelDownloads:n.parallelDownloads,allowOffline:n.allowOffline}),this.setCompat("default")}logger(){return this.config.logger??console}checkModelLoaded(){if(!this.isModelLoaded())throw new ye("loadModel() is not yet called","model_not_loaded")}static getLibllamaVersion(){return tb}setCompat(t,n="safari"){if(n==="safari"&&js()){this.compat=null;return}this.compat=t==="default"?Gs:t}isModelLoaded(){return!!this.proxy&&!!this.metadata}getBOS(){return this.bosToken}getEOS(){return this.eosToken}getEOT(){return this.eotToken}isTokenEOG(t){return t===this.eosToken||t===this.eotToken||this.eogTokens.has(t)}getDecoderStartToken(){return this.decoderStartToken}getModelMetadata(){return this.checkModelLoaded(),this.metadata}isMultithread(){return this.checkModelLoaded(),this.useMultiThread}getNumThreads(){return this.checkModelLoaded(),this.useMultiThread?this.nbThreads:1}isEncoderDecoderArchitecture(){return this.checkModelLoaded(),this.hasEncoder}mustAddBosToken(){return this.checkModelLoaded(),this.addBosToken}mustAddEosToken(){return this.checkModelLoaded(),this.addEosToken}getChatTemplate(){return this.checkModelLoaded(),this.chatTemplate??null}isSupportWebGPU(){return Q0()}async loadModelFromUrl(t,n={}){const r=Yo(t)?{url:t}:t,o=await(n.useCache??!0?await this.modelManager.getModelOrDownload(r,n):await this.modelManager.downloadModel(r,n)).open();return await this.loadModel(o,n)}async loadModelFromHF(t,n={}){const r=await ub(t);return await this.loadModelFromUrl(r,n)}async loadModel(t,n={}){var d,h;const r=t instanceof uu?await t.open():[...t];if(r.some(y=>y.size===0))throw new ye("Input model (or splits) must be non-empty Blob or File","load_error");if(!this.pathConfig.default)throw new ye('"default" is missing from pathConfig',"load_error");if(this.proxy)throw new ye("Module is already initialized","load_error");const i=await Id(),a=Math.floor((navigator.hardwareConcurrency||1)/2),o=n.n_threads??a;this.nbThreads=o,this.useMultiThread=i&&o>1;const s=this.getWorkerResources();this.proxy=new Nd(s,this.useMultiThread?o:0,this.config.suppressNativeLog??!1,this.logger());let l=n.log_level??Dg.INFO;this.config.suppressNativeLog&&(l=9999);const u=await q0(r);await this.proxy.moduleInit(u.all),this.logger().debug("Calling wllamaStart...");const f=await this.proxy.wllamaStart();if(!f.success)throw new ye(`Error while calling start function, result = ${f}`);this.logger().debug("Loading model...");const c=await this.proxy.wllamaAction("load",{_name:"load_req",log_level:l,use_mmap:!Lg(s.compat),use_mlock:!1,n_gpu_layers:n.n_gpu_layers??99999,n_ctx:n.n_ctx??1024,n_threads:this.useMultiThread?o:1,n_ctx_auto:!1,mmproj_path:u.mmproj?`/models/${Qa}`:void 0,model_paths:u.llm.map(y=>`models/${y.name}`),embeddings:n.embeddings,offload_kqv:n.offload_kqv,n_batch:n.n_batch,pooling_type:n.pooling_type,rope_scaling_type:n.rope_scaling_type,rope_freq_base:n.rope_freq_base,rope_freq_scale:n.rope_freq_scale,yarn_ext_factor:n.yarn_ext_factor,yarn_attn_factor:n.yarn_attn_factor,yarn_beta_fast:n.yarn_beta_fast,yarn_beta_slow:n.yarn_beta_slow,yarn_orig_ctx:n.yarn_orig_ctx,cache_type_k:n.cache_type_k,cache_type_v:n.cache_type_v,n_parallel:1,kv_unified:!1,flash_attn:n.flash_attn,swa_full:n.swa_full,chat_template:n.chat_template,jinja:n.jinja,reasoning:n.reasoning,image_min_tokens:n.image_min_tokens,image_max_tokens:n.image_max_tokens,warmup:n.warmup,no_kv_offload:n.no_kv_offload,mmproj_offload:n.mmproj_offload,cont_batching:n.cont_batching,n_keep:n.n_keep,ctx_shift:n.ctx_shift,cache_idle_slots:n.cache_idle_slots,n_cache_reuse:n.n_cache_reuse,lora_paths:(d=n.lora_adapters)==null?void 0:d.map(y=>y.path),lora_scales:(h=n.lora_adapters)==null?void 0:h.map(y=>y.scale??1),lora_init_without_apply:n.lora_init_without_apply,spec_draft_model:n.spec_draft_model,spec_draft_ngl:n.spec_draft_ngl,spec_draft_n_max:n.spec_draft_n_max,spec_draft_n_min:n.spec_draft_n_min,spec_draft_p_min:n.spec_draft_p_min,spec_draft_threads:n.spec_draft_threads,spec_draft_threads_batch:n.spec_draft_threads_batch,kv_overrides_keys:n.kv_overrides?Object.keys(n.kv_overrides):void 0,kv_overrides_vals:n.kv_overrides?Object.values(n.kv_overrides):void 0,reasoning_budget_tokens:n.reasoning_budget_tokens,reasoning_budget_message:n.reasoning_budget_message,reasoning_format:n.reasoning_format,skip_chat_parsing:n.skip_chat_parsing,prefill_assistant:n.prefill_assistant}),p={...c,metadata:{}};for(let y=0;y<c.metadata_key.length;y++)p.metadata[c.metadata_key[y]]=c.metadata_val[y];this.seed=n.seed,this.bosToken=p.token_bos,this.eosToken=p.token_eos,this.eotToken=p.token_eot,this.useEmbeddings=!!n.embeddings,this.useRerank=n.pooling_type=="rank",this.metadata={hparams:{nVocab:p.n_vocab,nCtxTrain:p.n_ctx_train,nEmbd:p.n_embd,nLayer:p.n_layer},meta:p.metadata},this.hasEncoder=!!p.has_encoder,this.decoderStartToken=p.token_decoder_start,this.addBosToken=p.add_bos_token,this.addEosToken=p.add_eos_token,this.chatTemplate=p.metadata["tokenizer.chat_template"],this.loadedContextInfo=p,this.eogTokens=new Set(p.list_tokens_eog),this.mediaMarker=p.media_marker,this.chatTemplateKwargs=n.default_template_kwargs??{},this.logger().debug({loadedCtxInfo:p})}getLoadedContextInfo(){if(this.checkModelLoaded(),!this.loadedContextInfo)throw new ye("Loaded context info is not available");return{...this.loadedContextInfo}}async createEmbedding(t){if(this.checkModelLoaded(),!this.useEmbeddings)throw new ye("Embeddings is not enabled. Please set it via LoadModelParams.embeddings");if(!(await this.proxy.wllamaAction("embedding",{_name:"embd_req",data_json:JSON.stringify(t),files:[]})).success)throw new ye("Model failed to start inference","inference_error");return await this.getResponse(t,!1)}async createRerank(t){if(this.checkModelLoaded(),!this.useEmbeddings||!this.useRerank)throw new ye("Rerank is not enabled. Please set it via LoadModelParams: embeddings = true and pooling_type = rank");const n=t.top_n??t.documents.length;let r=0;const i=[];for(let a=0;a<t.documents.length;a++){if(!(await this.proxy.wllamaAction("rerank",{_name:"rrnk_req",data_json:JSON.stringify({query:t.query,document:t.documents[a]})})).success)throw new ye("Model failed to start reranking","inference_error");const{score:s,tokens_evaluated:l}=await this.getRerankResult();r+=l,i.push({index:a,score:s})}return i.sort((a,o)=>o.score-a.score),{model:this.getModelMetadata().meta["general.name"]??"",object:"list",usage:{prompt_tokens:r,total_tokens:r},results:i.slice(0,n).map(({index:a,score:o})=>({index:a,relevance_score:o}))}}async createChatCompletion(t){if(Object.keys(this.chatTemplateKwargs).length>0&&(t={...t,chat_template_kwargs:{...this.chatTemplateKwargs,...t.chat_template_kwargs??{}}}),t.stream&&t.onData)await this.createCompletionImpl(t);else return t.stream?await this.createCompletionGenerator(t):await this.createCompletionImpl({...t,stream:!1})}async createCompletion(t){if(t.stream&&t.onData)await this.createCompletionImpl(t);else return t.stream?await this.createCompletionGenerator(t):await this.createCompletionImpl({...t,stream:!1})}async createCompletionImpl(t){this.checkModelLoaded();const n=!!t.stream,r=!!t.messages,i={};this.seed!==void 0&&(i.seed=this.seed);let a=[];if(r){const s=this.prepareMultimodalInput(t);t=s.params,a=s.files}if(!(await this.proxy.wllamaAction("completion",{_name:"cmpl_req",is_chat:r,data_json:JSON.stringify({...t,...i}),files:a.map(s=>new Uint8Array(s))})).success)throw new ye("Model failed to start inference","inference_error");return await this.getResponse(t,n)}createCompletionGenerator(t){return new Promise(n=>{const r=$0(i=>{this.createCompletionImpl({...t,onData:a=>i(a)}).then(()=>i(void 0,!0)).catch(a=>i(void 0,!1,a))});n(r())})}supportInputModality(t){if(this.checkModelLoaded(),t==="image")return!!this.loadedContextInfo.has_image_input;if(t==="audio")return!!this.loadedContextInfo.has_audio_input;throw new ye("Unsupported modality: "+t,"unknown_error")}async exit(){var t;await((t=this.proxy)==null?void 0:t.wllamaExit()),this.proxy=null}async testBackendOps(t=[]){if(!this.pathConfig.default)throw new ye('"default" is missing from pathConfig',"load_error");if(!await Id())throw new ye("Multi-threading is required to run backend ops tests, but it is not supported in the current environment.");const n=new Nd(this.getWorkerResources(),0,this.config.suppressNativeLog??!1,this.logger());try{await n.moduleInit([]);const r=await n.wllamaStart();if(!r.success)throw new ye(`Error while calling start function, result = ${r}`);const i=await n.wllamaAction("test_backend_ops",{_name:"tbop_req",args:["test-backend-ops",...t]});return{retcode:i.retcode,success:i.success}}finally{await n.wllamaExit()}}async _getDebugInfo(){return this.checkModelLoaded(),await this.proxy.wllamaDebug()}jsonDecode(t){try{return JSON.parse(t)}catch{throw this.logger().error("Failed to parse JSON:",t),new ye("Failed to parse model output","inference_error")}}prepareMultimodalInput(t){const n=t.messages,r=[],i=[];for(const a of n)if(Array.isArray(a.content)){const o=[];for(const s of a.content)if(s.type==="text")o.push(s);else{if(!this.mediaMarker)throw new ye("Media marker is undefined","inference_error");i.push(s.data),o.push({type:"text",text:this.mediaMarker})}r.push({...a,content:o})}else r.push(a);return{params:{...t,messages:r},files:i}}async getRerankResult(){for(;;){const t=await this.proxy.wllamaAction("get_result",{_name:"gres_req"}),n=t.data_json;if(n&&n.length>0){if(t.is_error){const r=this.jsonDecode(n);throw new ye(r.message||"Unknown reranking error","inference_error")}return this.jsonDecode(n)}if(!t.has_more)break}throw new ye("No reranking result received","inference_error")}async getResponse(t,n){var i,a;let r=null;for(;;){if((i=t.abortSignal)!=null&&i.aborted)throw new wb;const o=await this.proxy.wllamaAction("get_result",{_name:"gres_req"}),s=o.data_json;if(!s||s.length===0){if(o.has_more)continue;break}if(s=="null")continue;let l=this.jsonDecode(s);if(r=l,o.is_error)throw this.logger().error("Model returned an error:",l),new ye(l.message||"Unknown inference error","inference_error");if(n){Array.isArray(l)||(l=[l]);for(const u of l)(a=t.onData)==null||a.call(t,u),r=u}if(!o.has_more)break}return r}getWorkerResources(){const t={wasmPath:Md(this.pathConfig.default),compat:!1};return eb()&&(this.compat?(this.compat.worker===Gs.worker&&this.compat.wasm===Gs.wasm&&(this.logger().warn("Compatibility mode is activated, using resources from CDN. To use local resources, please refer to @wllama/wllama-compat package."),this.logger().warn("IMPORTANT: Performance will be significantly degraded in compatibility mode.")),t.wasmPath=Md(this.compat.wasm),t.jsPath=this.compat.worker,t.compat=!0):this.logger().warn("Not using compat mode"+(js()?" (expected on Firefox - WebGPU will be disabled)":""))),js()&&(t.compat?this.logger().warn('Using compat mode on Firefox, performance will be significantly degraded; Consider enabling "javascript.options.wasm_js_promise_integration" in "about:config".'):Oc()||this.logger().warn('WebGPU is disabled on Firefox due to missing JSPI support. Please consider enabling compat mode, or enabling "javascript.options.wasm_js_promise_integration" in "about:config".')),t}}const vb=""+new URL("wllama-m-NqGU8W.wasm",import.meta.url).href,bb="@wllama/wllama",kb="3.5.1",xb="WebAssembly binding for llama.cpp - Enabling on-browser LLM inference",Sb="index.js",Pb="module",Eb={example:"examples"},Cb={serve:"node ./scripts/http_server.js","serve:mt":"MULTITHREAD=1 node ./scripts/http_server.js",clean:"rm -rf ./esm && rm -rf ./docs && rm -rf ./wasm","build:worker":"./scripts/build_worker.sh","build:glue":"node ./cpp/generate_glue_prototype.js","build:wasm":"./scripts/build_wasm.sh && npm run build:glue","build:test":"WLLAMA_TEST_BACKEND=1 npm run build:wasm","build:tsup":"tsup src/index.ts --format cjs,esm --clean","build:minified":"terser esm/index.js -o esm/index.min.js --compress --mangle --source-map","build:typedef":"tsc --emitDeclarationOnly --declaration -p tsconfig.build.json",build:"npm run clean && npm run build:worker && npm run build:tsup && npm run build:minified && npm run build:typedef && ./scripts/post_build.sh && npm run docs",docs:"typedoc --tsconfig tsconfig.build.json src/index.ts",upload:"npm run format && npm run build && node scripts/check_package_size.js && npm publish --access public && (cd compat && npm publish --access public)",format:"prettier --write .",test:"vitest","test:auto":"AUTO=1 vitest","test:firefox":"BROWSER=firefox vitest","test:safari":"BROWSER=safari vitest","test:wgpu":"WEBGPU=1 vitest"},Ab={type:"git",url:"git+https://github.com/ngxson/wllama.git"},Fb=["wasm","webassembly","llama","llm","ai","rag","embeddings","generation"],Tb="Xuan Son NGUYEN <contact@ngxson.com>",Mb="MIT",_b={url:"https://github.com/ngxson/wllama/issues"},Ib="https://github.com/ngxson/wllama#readme",Nb={"@playwright/test":"^1.60.0","@vitest/browser":"^2.1.6",express:"^4.18.3","mime-types":"^2.1.35",playwright:"^1.59.1",prettier:"^3.3.3",terser:"^5.39.0",tsup:"^8.4.0",typedoc:"^0.27.2",typescript:"^5.4.2",webdriverio:"^9.4.1"},Rb={trailingComma:"es5",tabWidth:2,semi:!0,singleQuote:!0,bracketSameLine:!1},Lb={name:bb,version:kb,description:xb,main:Sb,type:Pb,directories:Eb,scripts:Cb,repository:Ab,keywords:Fb,author:Tb,license:Mb,bugs:_b,homepage:Ib,devDependencies:Nb,prettier:Rb},Ob="default",Db=Lb.version,Ub={default:vb},zb=null,jb=2*1024*1024*1024,Bb=[{url:"https://huggingface.co/LiquidAI/LFM2.5-VL-450M-GGUF/resolve/main/LFM2.5-VL-450M-Q4_0.gguf",mmprojUrl:"https://huggingface.co/LiquidAI/LFM2.5-VL-450M-GGUF/resolve/main/mmproj-LFM2.5-VL-450m-Q8_0.gguf",size:566231040,modalities:["image"]},{url:"https://huggingface.co/LiquidAI/LFM2-700M-GGUF/resolve/main/LFM2-700M-Q4_K_M.gguf",size:468624320},{url:"https://huggingface.co/LiquidAI/LFM2-1.2B-GGUF/resolve/main/LFM2-1.2B-Q4_K_M.gguf",size:730893248},{url:"https://huggingface.co/unsloth/Qwen3-0.6B-GGUF/resolve/main/Qwen3-0.6B-Q8_0.gguf",size:639447744},{url:"https://huggingface.co/unsloth/Qwen3-1.7B-GGUF/resolve/main/Qwen3-1.7B-Q4_K_M.gguf",size:1107409472},{url:"https://huggingface.co/ggml-org/SmolLM3-3B-GGUF/resolve/main/SmolLM3-Q4_K_M.gguf",size:1915305312},{url:"https://huggingface.co/ngxson/SmolLM2-360M-Instruct-Q8_0-GGUF/resolve/main/smollm2-360m-instruct-q8_0.gguf",size:386404992},{url:"https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct-GGUF/resolve/main/qwen2.5-0.5b-instruct-q8_0.gguf",size:675710816},{url:"https://huggingface.co/hugging-quants/Llama-3.2-1B-Instruct-Q4_K_M-GGUF/resolve/main/llama-3.2-1b-instruct-q4_k_m.gguf",size:807690656},{url:"https://huggingface.co/bartowski/DeepSeek-R1-Distill-Qwen-1.5B-GGUF/resolve/main/DeepSeek-R1-Distill-Qwen-1.5B-Q3_K_M.gguf",size:924456032},{url:"https://huggingface.co/ngxson/wllama-split-models/resolve/main/qwen2-1_5b-instruct-q4_k_m-00001-of-00004.gguf",size:986046272},{url:"https://huggingface.co/ngxson/SmolLM2-1.7B-Instruct-Q4_K_M-GGUF/resolve/main/smollm2-1.7b-instruct-q4_k_m.gguf",size:1055609536},{url:"https://huggingface.co/ngxson/wllama-split-models/resolve/main/gemma-2-2b-it-abliterated-Q4_K_M-00001-of-00004.gguf",size:1708583264},{url:"https://huggingface.co/ngxson/wllama-split-models/resolve/main/neuralreyna-mini-1.8b-v0.3.q4_k_m-00001-of-00005.gguf",size:1217753472},{url:"https://huggingface.co/ngxson/wllama-split-models/resolve/main/Phi-3.1-mini-128k-instruct-Q3_K_M-00001-of-00008.gguf",size:1955478176},{url:"https://huggingface.co/ngxson/wllama-split-models/resolve/main/meta-llama-3.1-8b-instruct-abliterated.Q2_K-00001-of-00014.gguf",size:3179133600},{url:"https://huggingface.co/ngxson/wllama-split-models/resolve/main/Meta-Llama-3.1-8B-Instruct-Q2_K-00001-of-00014.gguf",size:3179138048}],Ug={nThreads:-1,nContext:4096,nPredict:4096,nBatch:128,temperature:.2,ttsThreads:-1,sttThreads:-1,vadThreads:-1};class Yr{constructor(t,n,r,i,a,o){this.state=Te.NOT_DOWNLOADED,this.downloadPercent=-1,this.url=t,this.mmprojUrl=a,this.size=n,this.isUserAdded=r,this.modalities=o,this.state=i?Te.READY:Te.NOT_DOWNLOADED,this.cachedModel=i}get hfModel(){const t=this.url.replace(/https:\/\/(huggingface.co|hf.co)\/+/,"").split("/");return`${t[0]}/${t[1]}`}get hfPath(){return this.url.replace(/https:\/\/(huggingface.co|hf.co)\/+/,"").split("/").slice(4).join("/")}clone(t){const n=new Yr(this.url,this.size,this.isUserAdded,this.cachedModel,this.mmprojUrl,this.modalities);return n.state=t.state??this.state,n.downloadPercent=t.downloadPercent??this.downloadPercent,n}}function cu(e){return $t.load("custom_models",[]).map(n=>{const r=e.find(i=>i.url===n.url);return new Yr(n.url,n.size,!0,r,n.mmprojUrl)})}function Od(e){const t=e.filter(n=>n.isUserAdded).map(n=>({url:n.url,size:n.size,mmprojUrl:n.mmprojUrl}));$t.save("custom_models",t)}function Vb(e){return Bb.map(t=>{const n=e.find(r=>r.url===t.url);return new Yr(t.url,t.size,!1,n,t.mmprojUrl,t.modalities)})}function Hb(e){return[...cu(e),...Vb(e)]}const Wb=new Uint8Array([71,71,85,70]);async function Gb(e){const t=e.replace(/\?.*/,""),n=await fetch(t,{headers:{Range:`bytes=0-${2*1024*1024}`}});if(n.ok){const r=await n.arrayBuffer();if(!qb(new Uint8Array(r.slice(0,4)),Wb))throw new Error("Not a valid gguf file: not starting with GGUF magic number")}else throw new Error(`Fetch error with status code = ${n.status}`);return new Yr(t,await Kb(t),!0,void 0)}const qb=(e,t)=>{for(let n=0;n<t.length;n++)if(t[n]!==e[n])return!1;return!0},Kb=async e=>{const t=Xb(e),n=await Promise.all(t.map(async r=>{const i=await fetch(r,{method:"HEAD"});if(i.ok){const a=i.headers.get("Content-Length");return a?parseInt(a):0}else throw new Error(`Fetch error with status code = ${i.status}`)}));return Qb(n)},Xb=e=>{const t=/(?<baseURL>.*)-(?<current>\d{5})-of-(?<total>\d{5})\.gguf$/,n=e.match(t);if(!n||!n.groups||Object.keys(n.groups).length!==3)return[e];const{baseURL:r,total:i}=n.groups;return Array.from({length:Number(i)},(o,s)=>(s+1).toString().padStart(5,"0")).map(o=>`${r}-${o}-of-${i}.gguf`)},Qb=e=>e.reduce((t,n)=>t+n,0);window._exportModelList=function(){const t=$t.load("custom_models",[]).map(n=>(delete n.userAdded,n));console.log(JSON.stringify(t,null,2))};const Dc="remoteLlm",fu="noHwAccel",Jb=()=>{try{const e=localStorage.getItem(Dc);if(!e)return null;const t=JSON.parse(e);return t!=null&&t.baseUrl?t:null}catch{return null}},Zb=e=>{localStorage.setItem(Dc,JSON.stringify(e))},Yb=()=>{localStorage.removeItem(Dc)},zg=()=>{try{return localStorage.getItem(fu)==="1"}catch{return!1}},$b=e=>{try{e?localStorage.setItem(fu,"1"):localStorage.removeItem(fu)}catch{}},jg=T.createContext({}),Bg=()=>{const e=new yb(Ub,{logger:At});return e.setCompat(zb),e},qs=new Zn;let pn=Bg(),hr=!1;const Dd=()=>{pn=Bg()},ek=async(e,t,n,r)=>{var p,d,h;const i=r.signal;let o=e.baseUrl.trim().replace(/\/+$/,"");/\/chat\/completions$/i.test(o)||(o+=/\/v\d+$/i.test(o)?"/chat/completions":"/v1/chat/completions");const s=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json",...e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{}},body:JSON.stringify({model:e.model||"gpt-4o-mini",messages:t.map(y=>({role:y.role==="assistant"?"assistant":"user",content:y.content})),stream:!0}),signal:i});if(!s.ok||!s.body)throw new Error(`Remote LLM error: HTTP ${s.status}`);const l=s.body.getReader(),u=new TextDecoder;let f="",c="";for(;;){if(hr||Q.signal.aborted){r.abort();break}const{done:y,value:E}=await l.read();if(y)break;f+=u.decode(E,{stream:!0});const m=f.split(`
|
| 726 |
`);f=m.pop()??"";for(const g of m){const w=g.trim();if(!w.startsWith("data:"))continue;const P=w.slice(5).trim();if(P==="[DONE]")return;try{const x=(h=(d=(p=JSON.parse(P).choices)==null?void 0:p[0])==null?void 0:d.delta)==null?void 0:h.content;typeof x=="string"&&x&&(c+=x,n(c))}catch{}}}},tk=({children:e})=>{const[t,n]=T.useState(!1),[r,i]=T.useState(-1),[a,o]=T.useState(m0()),[vm,svm]=T.useState(!1),ctl=T.useRef(null),[s,l]=T.useState([]),[u,f]=T.useState(!1),[c,p]=T.useState(),[d,h]=T.useState($t.load("params",Ug)),[y,E]=T.useState({}),[m,g]=T.useState(),[w,P]=T.useState(Jb()),[C,x]=T.useState(null),A=!!(w!=null&&w.baseUrl),M=async()=>{l(await qs.getModels())};p0(M);const R=T.useMemo(()=>{const U=Hb(s);for(const z of U)z.downloadPercent=y[z.url]??-1,z.downloadPercent>=0&&(z.state=Te.DOWNLOADING),(m==null?void 0:m.url)===z.url&&(z.state=m.state);return U},[s,y,m]),S=T.useMemo(()=>R.some(U=>U.state===Te.DOWNLOADING),[R]),_=T.useMemo(()=>u||(m==null?void 0:m.state)===Te.LOADING,[m,u]),L=(U,z=-1)=>{z<0?E(Q=>{const se={...Q};return delete se[U],se}):E(Q=>({...Q,[U]:z}))},W=async U=>{if(!(S||m||_)){L(U.url,0);try{await qs.downloadModel({url:U.url,mmprojUrl:U.mmprojUrl},{progressCallback(z){L(U.url,z.loaded/z.total)}}),L(U.url,-1),await M()}catch(z){alert((z==null?void 0:z.message)||"unknown error while downloading model")}}},G=async U=>{S||m||_||U.cachedModel&&(await U.cachedModel.remove(),await M())},q=async()=>{S||m||_||(await qs.clear(),await M())},ae=async U=>{if(!(S||m||_)){if(A){alert("Remote LLM provider is active — clear it first to load a local model.");return}if(!U.cachedModel)throw new Error("Model is not in cache");g(U.clone({state:Te.LOADING}));try{await pn.loadModel(U.cachedModel,{n_threads:d.nThreads>0?d.nThreads:void 0,n_gpu_layers:zg()?0:99999,n_ctx:d.nContext,n_batch:d.nBatch}),g(U.clone({state:Te.LOADED})),p({isMultithread:pn.isMultithread(),hasChatTemplate:!!pn.getChatTemplate(),supportsImage:pn.supportInputModality("image"),supportsAudio:pn.supportInputModality("audio")})}catch(z){Dd(),alert(`Failed to load model: ${z.message??"Unknown error"}`),g(void 0)}}},ne=async()=>{m&&(await pn.exit(),Dd(),g(void 0),p(void 0))},O=async(U,z)=>{var Pe,Re;n(!0),hr=!1;const Q=new AbortController;ctl.current=Q;if(w!=null&&w.baseUrl){x(null);try{await ek(w,U,z,Q)}catch(Fe){Q.signal.aborted||(console.error("[llm] remote completion failed:",Fe),x((Fe==null?void 0:Fe.message)||"Remote LLM request failed"))}ctl.current===Q&&(ctl.current=null),hr=!1,n(!1);return}if(S||!m||_)return;n(!1),n(!0);let se="";try{const Fe=await pn.createChatCompletion({messages:U.map(Ze=>Ze.mediaData?{role:Ze.role,content:[{type:Ze.mediaData.type,data:Ze.mediaData.data},{type:"text",text:Ze.content}]}:{role:Ze.role,content:Ze.content}),max_tokens:d.nPredict,temperature:d.temperature,stream:!0,abortSignal:Q.signal});for await(const Ze of Fe){if(hr||Q.signal.aborted){Q.abort();break}const Un=(Re=(Pe=Ze.choices[0])==null?void 0:Pe.delta)==null?void 0:Re.content;Un&&(se+=Un,z(se))}}catch{}hr=!1,n(!1),ctl.current===Q&&(ctl.current=null)},V=()=>{hr=!0;const c=ctl.current;c&&c.abort()},b=U=>{Zb(U),P(U),x(null),m&&ne()},K=()=>{Yb(),P(null),x(null)},ie=(U,z)=>{o(U),i(z??-1),U===ve.MODEL&&$t.save("welcome",!1)},k=U=>{$t.save("params",U),h(U)},he=async(U,z)=>{f(!0);try{const Q=await Gb(U);if(R.some(Pe=>Pe.url===Q.url))throw new Error("Model with the same URL already exist");const se=cu(s);Od([...se,new Yr(Q.url,Q.size,!0,void 0,z)]),await M()}catch(Q){throw f(!1),Q}f(!1)},Ge=async U=>{if(f(!0),U.isUserAdded){const Q=cu(s).filter(se=>se.url!==U.url);Od(Q),await M()}else throw new Error("Cannot remove non-user-added model");f(!1)};return v.jsx(jg.Provider,{value:{models:R,isDownloading:S,isLoadingModel:_,downloadModel:W,removeCachedModel:G,removeAllCachedModels:q,loadedModel:m,loadModel:ae,unloadModel:ne,remoteConfig:w,isRemote:A,remoteError:C,setRemoteConfig:b,clearRemoteConfig:K,currParams:d,setParams:k,createCompletion:O,stopCompletion:V,isGenerating:t,currentConvId:r,navigateTo:ie,currScreen:a,addCustomModel:he,removeCustomModel:Ge,currRuntimeInfo:c,voiceMode:vm,setVoiceMode:svm},children:e})},Wt=()=>T.useContext(jg),Vg=T.createContext({}),nk="/vad/silero-vad.js",rk="/vad/silero-vad.wasm",ik="/vad/mic-processor.js",ak=.5,ok=.35,sk=8,lk=.5,uk=e=>{let t=0;for(const i of e)t+=i.length;const n=new Float32Array(t);let r=0;for(const i of e)n.set(i,r),r+=i.length;return n},ck=(e,t)=>{let n=0;for(let r=e.length-1;r>=0;r--)if(n+=e[r].length,n>=t&&r>0){e.splice(0,r);return}};let Ud=null;const fk=()=>(Ud??(Ud=import(nk).then(e=>e.default({locateFile:()=>rk}))),Ud);class dk{constructor(t,n){if(this.inputPointer=0,this.inputCapacity=0,this.outputPointer=0,this.outputCapacity=0,this.module=t,this.handle=t._wasm_vad_create(n),!this.handle)throw new Error("Could not create the Silero VAD model.");this.windowSamples=t._wasm_vad_source_window_samples(this.handle)}push(t){const n=Math.floor((t.length+this.windowSamples-1)/this.windowSamples)+1;this.ensureInputCapacity(t.length),this.ensureOutputCapacity(n),this.module.HEAPF32.set(t,this.inputPointer>>>2);const r=this.module._wasm_vad_push(this.handle,this.inputPointer,t.length,this.outputPointer,n);if(r<0)throw new Error(`VAD inference failed with bridge error ${r}.`);return Array.from(this.module.HEAPF32.subarray(this.outputPointer>>>2,(this.outputPointer>>>2)+r))}destroy(){this.inputPointer&&this.module._free(this.inputPointer),this.outputPointer&&this.module._free(this.outputPointer),this.handle&&this.module._wasm_vad_destroy(this.handle),this.handle=0}ensureInputCapacity(t){if(t<=this.inputCapacity)return;const n=this.module._malloc(t*Float32Array.BYTES_PER_ELEMENT);if(!n)throw new Error("Could not allocate WASM input buffer.");this.inputPointer&&this.module._free(this.inputPointer),this.inputPointer=n,this.inputCapacity=t}ensureOutputCapacity(t){if(t<=this.outputCapacity)return;const n=this.module._malloc(t*Float32Array.BYTES_PER_ELEMENT);if(!n)throw new Error("Could not allocate WASM output buffer.");this.outputPointer&&this.module._free(this.outputPointer),this.outputPointer=n,this.outputCapacity=t}}const pk=({children:e})=>{const{stop:t}=Ag(),{stopCompletion:n}=Wt(),[r,i]=T.useState("idle"),[a,o]=T.useState(null),s=T.useRef(t),l=T.useRef(n);T.useEffect(()=>{s.current=t},[t]),T.useEffect(()=>{l.current=n},[n]);const u=T.useRef(null),f=T.useRef(null),c=T.useRef(null),p=T.useRef(null),d=T.useRef(null),h=T.useRef(null),y=T.useRef(null),E=T.useRef(!1),m=T.useRef(!1),g=T.useRef(0),w=T.useRef([]),P=T.useRef([]),C=T.useRef(0),x=T.useRef(new Set),A=T.useCallback(L=>(x.current.add(L),()=>{x.current.delete(L)}),[]),M=T.useCallback(L=>{for(const W of L)if(!m.current)W>=ak&&(m.current=!0,g.current=0,P.current=[...w.current],i("speaking"),s.current(),l.current());else if(W<ok){if(g.current+=1,g.current>=sk){m.current=!1,g.current=0,i("listening");const G=uk(P.current);P.current=[];const q=C.current;G.length>0&&q>0&&x.current.forEach(ae=>{try{ae(G,q)}catch(ne){console.error("[vad] utterance handler failed:",ne)}})}}else g.current=0},[]),R=T.useCallback(()=>{E.current=!1,m.current=!1,g.current=0,w.current=[],P.current=[],C.current=0,h.current&&(h.current.port.onmessage=null,h.current.disconnect(),h.current=null),y.current&&(y.current.disconnect(),y.current=null),d.current&&(d.current.disconnect(),d.current=null),p.current&&(p.current.getTracks().forEach(L=>L.stop()),p.current=null),c.current&&(c.current.close().catch(()=>{}),c.current=null),f.current&&(f.current.destroy(),f.current=null),i("idle")},[]),S=T.useCallback(async()=>{if(!E.current){o(null),i("loading");try{const L=u.current??(u.current=await fk()),W=await navigator.mediaDevices.getUserMedia({audio:{channelCount:1,echoCancellation:!1,noiseSuppression:!1,autoGainControl:!1}});p.current=W;const G=new AudioContext({latencyHint:"interactive"});c.current=G,await G.audioWorklet.addModule(ik),await G.resume(),C.current=Math.round(G.sampleRate);const q=new dk(L,Math.round(G.sampleRate));f.current=q;const ae=G.createMediaStreamSource(W);d.current=ae;const ne=new AudioWorkletNode(G,"mic-processor",{numberOfInputs:1,numberOfOutputs:1,outputChannelCount:[1],channelCount:1});h.current=ne;const O=G.createGain();O.gain.value=0,y.current=O,ne.port.onmessage=({data:V})=>{try{w.current.push(V),ck(w.current,Math.round(C.current*lk)),m.current&&P.current.push(V),M(q.push(V))}catch(b){console.error("[vad] inference failed:",b),R()}},ae.connect(ne),ne.connect(O),O.connect(G.destination),m.current=!1,g.current=0,E.current=!0,i("listening")}catch(L){R(),o((L==null?void 0:L.message)??"Microphone / VAD failed to start")}}},[M,R]);T.useEffect(()=>()=>R(),[]);const _=T.useMemo(()=>({status:r,error:a,start:S,stop:R,onUtterance:A}),[r,a,S,R,A]);return v.jsx(Vg.Provider,{value:_,children:e})},mk=()=>T.useContext(Vg),zd=()=>{};let Uc={},Hg={},Wg=null,Gg={mark:zd,measure:zd};try{typeof window<"u"&&(Uc=window),typeof document<"u"&&(Hg=document),typeof MutationObserver<"u"&&(Wg=MutationObserver),typeof performance<"u"&&(Gg=performance)}catch{}const{userAgent:jd=""}=Uc.navigator||{},_n=Uc,me=Hg,Bd=Wg,Ia=Gg;_n.document;const ln=!!me.documentElement&&!!me.head&&typeof me.addEventListener=="function"&&typeof me.createElement=="function",qg=~jd.indexOf("MSIE")||~jd.indexOf("Trident/");var we="classic",Kg="duotone",ct="sharp",ft="sharp-duotone",hk=[we,Kg,ct,ft],gk={classic:{900:"fas",400:"far",normal:"far",300:"fal",100:"fat"},sharp:{900:"fass",400:"fasr",300:"fasl",100:"fast"},"sharp-duotone":{900:"fasds"}},Vd={kit:{fak:"kit","fa-kit":"kit"},"kit-duotone":{fakd:"kit-duotone","fa-kit-duotone":"kit-duotone"}},wk=["kit"],yk=/fa(s|r|l|t|d|b|k|kd|ss|sr|sl|st|sds)?[\-\ ]/,vk=/Font ?Awesome ?([56 ]*)(Solid|Regular|Light|Thin|Duotone|Brands|Free|Pro|Sharp Duotone|Sharp|Kit)?.*/i,bk={"Font Awesome 5 Free":{900:"fas",400:"far"},"Font Awesome 5 Pro":{900:"fas",400:"far",normal:"far",300:"fal"},"Font Awesome 5 Brands":{400:"fab",normal:"fab"},"Font Awesome 5 Duotone":{900:"fad"}},kk={"Font Awesome 6 Free":{900:"fas",400:"far"},"Font Awesome 6 Pro":{900:"fas",400:"far",normal:"far",300:"fal",100:"fat"},"Font Awesome 6 Brands":{400:"fab",normal:"fab"},"Font Awesome 6 Duotone":{900:"fad"},"Font Awesome 6 Sharp":{900:"fass",400:"fasr",normal:"fasr",300:"fasl",100:"fast"},"Font Awesome 6 Sharp Duotone":{900:"fasds"}},xk={classic:{"fa-brands":"fab","fa-duotone":"fad","fa-light":"fal","fa-regular":"far","fa-solid":"fas","fa-thin":"fat"},sharp:{"fa-solid":"fass","fa-regular":"fasr","fa-light":"fasl","fa-thin":"fast"},"sharp-duotone":{"fa-solid":"fasds"}},Sk={classic:["fas","far","fal","fat"],sharp:["fass","fasr","fasl","fast"],"sharp-duotone":["fasds"]},Pk={classic:{fab:"fa-brands",fad:"fa-duotone",fal:"fa-light",far:"fa-regular",fas:"fa-solid",fat:"fa-thin"},sharp:{fass:"fa-solid",fasr:"fa-regular",fasl:"fa-light",fast:"fa-thin"},"sharp-duotone":{fasds:"fa-solid"}},Ek={classic:{solid:"fas",regular:"far",light:"fal",thin:"fat",duotone:"fad",brands:"fab"},sharp:{solid:"fass",regular:"fasr",light:"fasl",thin:"fast"},"sharp-duotone":{solid:"fasds"}},Xg={classic:{fa:"solid",fas:"solid","fa-solid":"solid",far:"regular","fa-regular":"regular",fal:"light","fa-light":"light",fat:"thin","fa-thin":"thin",fad:"duotone","fa-duotone":"duotone",fab:"brands","fa-brands":"brands"},sharp:{fa:"solid",fass:"solid","fa-solid":"solid",fasr:"regular","fa-regular":"regular",fasl:"light","fa-light":"light",fast:"thin","fa-thin":"thin"},"sharp-duotone":{fa:"solid",fasds:"solid","fa-solid":"solid"}},Ck=["solid","regular","light","thin","duotone","brands"],Qg=[1,2,3,4,5,6,7,8,9,10],Ak=Qg.concat([11,12,13,14,15,16,17,18,19,20]),bi={GROUP:"duotone-group",SWAP_OPACITY:"swap-opacity",PRIMARY:"primary",SECONDARY:"secondary"},Fk=[...Object.keys(Sk),...Ck,"2xs","xs","sm","lg","xl","2xl","beat","border","fade","beat-fade","bounce","flip-both","flip-horizontal","flip-vertical","flip","fw","inverse","layers-counter","layers-text","layers","li","pull-left","pull-right","pulse","rotate-180","rotate-270","rotate-90","rotate-by","shake","spin-pulse","spin-reverse","spin","stack-1x","stack-2x","stack","ul",bi.GROUP,bi.SWAP_OPACITY,bi.PRIMARY,bi.SECONDARY].concat(Qg.map(e=>"".concat(e,"x"))).concat(Ak.map(e=>"w-".concat(e))),Tk={"Font Awesome Kit":{400:"fak",normal:"fak"},"Font Awesome Kit Duotone":{400:"fakd",normal:"fakd"}},Mk={kit:{"fa-kit":"fak"},"kit-duotone":{"fa-kit-duotone":"fakd"}},_k={kit:{fak:"fa-kit"},"kit-duotone":{fakd:"fa-kit-duotone"}},Hd={kit:{kit:"fak"},"kit-duotone":{"kit-duotone":"fakd"}};const an="___FONT_AWESOME___",du=16,Jg="fa",Zg="svg-inline--fa",ar="data-fa-i2svg",pu="data-fa-pseudo-element",Ik="data-fa-pseudo-element-pending",zc="data-prefix",jc="data-icon",Wd="fontawesome-i2svg",Nk="async",Rk=["HTML","HEAD","STYLE","SCRIPT"],Yg=(()=>{try{return!0}catch{return!1}})(),$g=[we,ct,ft];function sa(e){return new Proxy(e,{get(t,n){return n in t?t[n]:t[we]}})}const ew={...Xg};ew[we]={...Xg[we],...Vd.kit,...Vd["kit-duotone"]};const Yn=sa(ew),mu={...Ek};mu[we]={...mu[we],...Hd.kit,...Hd["kit-duotone"]};const Yi=sa(mu),hu={...Pk};hu[we]={...hu[we],..._k.kit};const $n=sa(hu),gu={...xk};gu[we]={...gu[we],...Mk.kit};const Lk=sa(gu),Ok=yk,tw="fa-layers-text",Dk=vk,Uk={...gk};sa(Uk);const zk=["class","data-prefix","data-icon","data-fa-transform","data-fa-mask"],Ks=bi,qr=new Set;Object.keys(Yi[we]).map(qr.add.bind(qr));Object.keys(Yi[ct]).map(qr.add.bind(qr));Object.keys(Yi[ft]).map(qr.add.bind(qr));const jk=[...wk,...Fk],_i=_n.FontAwesomeConfig||{};function Bk(e){var t=me.querySelector("script["+e+"]");if(t)return t.getAttribute(e)}function Vk(e){return e===""?!0:e==="false"?!1:e==="true"?!0:e}me&&typeof me.querySelector=="function"&&[["data-family-prefix","familyPrefix"],["data-css-prefix","cssPrefix"],["data-family-default","familyDefault"],["data-style-default","styleDefault"],["data-replacement-class","replacementClass"],["data-auto-replace-svg","autoReplaceSvg"],["data-auto-add-css","autoAddCss"],["data-auto-a11y","autoA11y"],["data-search-pseudo-elements","searchPseudoElements"],["data-observe-mutations","observeMutations"],["data-mutate-approach","mutateApproach"],["data-keep-original-source","keepOriginalSource"],["data-measure-performance","measurePerformance"],["data-show-missing-icons","showMissingIcons"]].forEach(t=>{let[n,r]=t;const i=Vk(Bk(n));i!=null&&(_i[r]=i)});const nw={styleDefault:"solid",familyDefault:"classic",cssPrefix:Jg,replacementClass:Zg,autoReplaceSvg:!0,autoAddCss:!0,autoA11y:!0,searchPseudoElements:!1,observeMutations:!0,mutateApproach:"async",keepOriginalSource:!0,measurePerformance:!1,showMissingIcons:!0};_i.familyPrefix&&(_i.cssPrefix=_i.familyPrefix);const Kr={...nw,..._i};Kr.autoReplaceSvg||(Kr.observeMutations=!1);const B={};Object.keys(nw).forEach(e=>{Object.defineProperty(B,e,{enumerable:!0,set:function(t){Kr[e]=t,Ii.forEach(n=>n(B))},get:function(){return Kr[e]}})});Object.defineProperty(B,"familyPrefix",{enumerable:!0,set:function(e){Kr.cssPrefix=e,Ii.forEach(t=>t(B))},get:function(){return Kr.cssPrefix}});_n.FontAwesomeConfig=B;const Ii=[];function Hk(e){return Ii.push(e),()=>{Ii.splice(Ii.indexOf(e),1)}}const fn=du,zt={size:16,x:0,y:0,rotate:0,flipX:!1,flipY:!1};function Wk(e){if(!e||!ln)return;const t=me.createElement("style");t.setAttribute("type","text/css"),t.innerHTML=e;const n=me.head.childNodes;let r=null;for(let i=n.length-1;i>-1;i--){const a=n[i],o=(a.tagName||"").toUpperCase();["STYLE","LINK"].indexOf(o)>-1&&(r=a)}return me.head.insertBefore(t,r),e}const Gk="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";function $i(){let e=12,t="";for(;e-- >0;)t+=Gk[Math.random()*62|0];return t}function $r(e){const t=[];for(let n=(e||[]).length>>>0;n--;)t[n]=e[n];return t}function Bc(e){return e.classList?$r(e.classList):(e.getAttribute("class")||"").split(" ").filter(t=>t)}function rw(e){return"".concat(e).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}function qk(e){return Object.keys(e||{}).reduce((t,n)=>t+"".concat(n,'="').concat(rw(e[n]),'" '),"").trim()}function $o(e){return Object.keys(e||{}).reduce((t,n)=>t+"".concat(n,": ").concat(e[n].trim(),";"),"")}function Vc(e){return e.size!==zt.size||e.x!==zt.x||e.y!==zt.y||e.rotate!==zt.rotate||e.flipX||e.flipY}function Kk(e){let{transform:t,containerWidth:n,iconWidth:r}=e;const i={transform:"translate(".concat(n/2," 256)")},a="translate(".concat(t.x*32,", ").concat(t.y*32,") "),o="scale(".concat(t.size/16*(t.flipX?-1:1),", ").concat(t.size/16*(t.flipY?-1:1),") "),s="rotate(".concat(t.rotate," 0 0)"),l={transform:"".concat(a," ").concat(o," ").concat(s)},u={transform:"translate(".concat(r/2*-1," -256)")};return{outer:i,inner:l,path:u}}function Xk(e){let{transform:t,width:n=du,height:r=du,startCentered:i=!1}=e,a="";return i&&qg?a+="translate(".concat(t.x/fn-n/2,"em, ").concat(t.y/fn-r/2,"em) "):i?a+="translate(calc(-50% + ".concat(t.x/fn,"em), calc(-50% + ").concat(t.y/fn,"em)) "):a+="translate(".concat(t.x/fn,"em, ").concat(t.y/fn,"em) "),a+="scale(".concat(t.size/fn*(t.flipX?-1:1),", ").concat(t.size/fn*(t.flipY?-1:1),") "),a+="rotate(".concat(t.rotate,"deg) "),a}var Qk=`:root, :host {
|
| 727 |
--fa-font-solid: normal 900 1em/1 "Font Awesome 6 Free";
|
| 728 |
--fa-font-regular: normal 400 1em/1 "Font Awesome 6 Free";
|
|
|
|
| 722 |
|
| 723 |
`);this.worker=Rg(a),this.worker.onmessage=this.onRecvMsg.bind(this),this.worker.onerror=this.logger.error;const o=await this.pushTask({verb:"module.init",args:[new Blob([n],{type:"text/javascript"}),this.useAsyncFile],callbackId:this.taskId++}),s=[];for(const l of t){const u=!this.useAsyncFile,f=await this.fileAlloc(l.name,l.blob.size,u);s.push({id:f,...l}),this.useAsyncFile&&this.fileBlobs.set(l.name,l.blob)}return this.useAsyncFile||await Promise.all(s.map(l=>this.fileWrite(l.id,l.blob))),o}async wllamaStart(){const t=await this.pushTask({verb:"wllama.start",args:[],callbackId:this.taskId++});return this.parseResult(t)}async wllamaAction(t,n){const r=B0(n),i=await this.pushTask({verb:"wllama.action",args:[t,r],callbackId:this.taskId++});return j0(i)}async wllamaExit(){this.worker&&this.worker.terminate()}async wllamaDebug(){const t=await this.pushTask({verb:"wllama.debug",args:[],callbackId:this.taskId++});return JSON.parse(t)}async fileAlloc(t,n,r){return(await this.pushTask({verb:"fs.alloc",args:[t,n,r],callbackId:this.taskId++})).fileId}async fileWrite(t,n){const r=n.stream().getReader();let i=0;for(;;){const{done:a,value:o}=await r.read();if(a)break;const s=o.byteLength;await this.pushTask({verb:"fs.write",args:[t,o,i],callbackId:this.taskId++},[o.buffer]),i+=s}}async fileReadResponse(t,n,r){var i;try{const a=this.fileBlobs.get(t);if(!a)throw new Error(`blob not found for name="${t}"`);const s=await a.slice(n,n+r).arrayBuffer();this.worker.postMessage({verb:"fs.read_res",args:[s]},{transfer:[s]})}catch(a){this.logger.error("fileReadResponse failed, terminating worker:",a),(i=this.worker)==null||i.terminate(),this.worker=void 0,this.abort(`File read failed: ${a}`,a.stack||"")}}parseResult(t){const n=JSON.parse(t);if(n&&n.error)throw new Ld("Unknown error, please see console.log","");return n}pushTask(t,n){return new Promise((r,i)=>{this.taskQueue.push({resolve:r,reject:i,param:t,buffers:n}),this.runTaskLoop()})}async runTaskLoop(){if(!this.busy){for(this.busy=!0;;){const t=this.taskQueue.shift();if(!t)break;this.resultQueue.push(t),this.worker.postMessage(t.param,Ng()?void 0:{transfer:t.buffers??[]})}this.busy=!1}}onRecvMsg(t){if(!t.data)return;const{verb:n,args:r}=t.data,i=this.resources.compat;if(n&&n.startsWith("console.")){if(this.suppressNativeLog)return;n.endsWith("debug")&&this.logger.debug(...r),n.endsWith("log")&&this.logger.log(...r),n.endsWith("warn")&&this.logger.warn(...r),n.endsWith("error")&&this.logger.error(...r);return}else if(n==="signal.abort"){const[l,u,f,c]=r;c&&this.logger.error(c),(async()=>{let p="",d=u.replace("Build with -sASSERTIONS for more info.","");l==="abort"?(d=`(ABORT) ${d}`,p=f.replace(/\|/g,`
|
| 724 |
`)):l==="exception"&&(p=f);const h=await _g.decodeStackTrace(p,i);this.logger.error(`Stack trace (${l}):
|
| 725 |
+
`+h),this.abort(d,h)})();return}if(n===ab){const[l,u,f]=r;this.fileReadResponse(l,u,f).catch(()=>{});return}const{callbackId:a,result:o,err:s}=t.data;if(a){const l=this.resultQueue.findIndex(u=>u.param.callbackId===a);if(l!==-1){const u=this.resultQueue.splice(l,1)[0];s?u.reject(s):u.resolve(o)}else this.logger.error(`Cannot find waiting task with callbackId = ${a}`)}}abort(t,n){const r=new Ld(t.length==0?"(unknown error)":t,n);for(;this.resultQueue.length>0;){const i=this.resultQueue.pop();if(!i)break;i.reject(r)}for(;this.taskQueue.length>0;){const i=this.taskQueue.pop();if(!i)break;i.reject(r)}}}const lu="https://huggingface.co",sb=["Q4_K_M","Q8_0"];async function lb(e,t){const n=`${lu}/api/models/${e}/tree/main?recursive=true`,r={Accept:"application/json"};t&&(r.Authorization=`Bearer ${t}`);const i=await fetch(n,{headers:r});if(!i.ok){let a=i.statusText;try{a=(await i.json()).error??a}catch{}throw new Error(`HF API error (${i.status}): ${a}`)}return i.json()}function Bs(e,t){const n=t.match(/^(.+)-(\d{5})-of-(\d{5})\.gguf$/i);if(!n)return t;const r=`${n[1]}-00001-of-${n[3]}.gguf`;return e.some(i=>i.path===r)?r:t}function Rd(e,t,n){const r=e.filter(i=>{if(i.type!=="file"||!i.path.toLowerCase().endsWith(".gguf"))return!1;const a=i.path.toLowerCase().includes("mmproj");return n?a:!a});if(r.length===0)return null;if(t){const i=t.toUpperCase(),a=r.find(o=>o.path.toUpperCase().includes(i));return a?Bs(r,a.path):null}for(const i of sb){const a=r.find(o=>o.path.toUpperCase().includes(i));if(a)return Bs(r,a.path)}return Bs(r,r[0].path)}async function ub(e){const{repo:t,file:n,quant:r,mmprojFile:i,mmprojQuant:a,hfToken:o}=e,s=await lb(t,o),l=n??Rd(s,r,!1);if(!l)throw new Error(`No GGUF file found in repo "${t}"`);const u={url:`${lu}/${t}/resolve/main/${l}`};if(i||a!==void 0){const f=i??Rd(s,a,!0);f&&(u.mmprojUrl=`${lu}/${t}/resolve/main/${f}`)}if(o){const f=new URLSearchParams({token:o});u.url+=`?${f}`,u.mmprojUrl&&(u.mmprojUrl+=`?${f}`)}return u}async function cb(e,t){if(!e.includes("/resolve/"))return;const n=e.replace("/resolve/","/raw/");try{const i=(await fetch(n,{headers:t}).then(a=>a.text())).match(/^oid sha256:([0-9a-f]{64})$/m);return i?i[1]:void 0}catch{return}}class fb{isSupported(){var t;return typeof navigator<"u"&&"storage"in navigator&&!!((t=navigator.storage)!=null&&t.getDirectory)}async read(t){try{return await(await(await _a()).getFileHandle(t)).getFile()}catch{return null}}async write(t,n){const r=await db(t);await r.truncate(0);const i=n.getReader();try{for(;;){const{done:a,value:o}=await i.read();if(a)break;await r.write(o)}}finally{await r.close()}}async getSize(t){try{return(await(await(await _a()).getFileHandle(t)).getFile()).size}catch{return-1}}async list(){const t=await _a(),n=[];for await(const[r,i]of t.entries())if(i.kind==="file"){const a=await i.getFile();n.push({key:r,size:a.size})}return n}async delete(t){try{await(await _a()).removeEntry(t)}catch(n){if((n==null?void 0:n.name)!=="NotFoundError")throw n}}}async function _a(){return(await navigator.storage.getDirectory()).getDirectoryHandle("cache",{create:!0})}async function db(e){const t=Rg(rb);let n,r;t.onmessage=a=>{a.data.ok?n(null):a.data.err&&r(a.data.err)},t.onerror=a=>r==null?void 0:r(a.message??a);const i=a=>new Promise((o,s)=>{n=o,r=s,t.postMessage(a,Ng()?void 0:{transfer:"buf"in a&&a.buf?[a.buf.buffer]:[]})});return await i({action:"open",filename:e}),{truncate:async()=>{},write:a=>i({action:"write",buf:a}),close:async()=>{await i({action:"close"}),t.terminate()}}}function Vs(e){return{algorithm:"SHA-256",value:e}}class pb{isSupported(){return typeof navigator<"u"&&"crossOriginStorage"in navigator}async read(t){try{return(await navigator.crossOriginStorage.requestFileHandle(Vs(t))).getFile()}catch{return null}}async write(t,n){const i=await(await navigator.crossOriginStorage.requestFileHandle(Vs(t),{create:!0})).createWritable(),a=n.getReader();try{for(;;){const{done:o,value:s}=await a.read();if(o)break;await i.write(s)}}finally{await i.close()}}async getSize(t){try{return(await(await navigator.crossOriginStorage.requestFileHandle(Vs(t))).getFile()).size}catch{return-1}}async list(){throw new Error("not implemented")}async delete(t){throw new Error("not implemented")}}class mb{constructor(){this.cos=new pb,this.priv=new fb}isSupported(){return this.priv.isSupported()}async read(t,n){if(n!=null&&n.sha256&&this.cos.isSupported()){const r=await this.cos.read(n.sha256);if(r)return r}return this.priv.read(t)}async write(t,n,r){r!=null&&r.sha256&&this.cos.isSupported()?await this.cos.write(r.sha256,n):await this.priv.write(t,n)}async getSize(t,n){if(n!=null&&n.sha256&&this.cos.isSupported()){const r=await this.cos.getSize(n.sha256);if(r!==-1)return r}return this.priv.getSize(t)}async list(){return this.priv.list()}async delete(t){return this.priv.delete(t)}}const pr="__metadata__",hb="polyfill_for_older_version";function Hs(e){if(e&&e.sha256)return{sha256:e.sha256}}class Og{constructor(t=[new mb]){for(const n of t)if(n.isSupported()){this.sb=n;return}throw new Error("No supported storage backend found")}async getNameFromURL(t){return Ws(t,"")}async write(t,n,r){await this.sb.write(t,n),await this.writeMetadata(t,r)}async download(t,n={}){const r=await Ws(t,""),i=await cb(t,n.headers??{}),a=i?{sha256:i}:void 0;if(a&&await this.sb.getSize(r,a)!==-1){if(!await this.getMetadata(r)){const y=await fetch(t,{method:"HEAD",...n.headers?{headers:n.headers}:{}}),E=y.headers.get("content-length"),m=(y.headers.get("etag")||"").replace(/[^A-Za-z0-9]/g,"");await this.writeMetadata(r,{originalURL:t,originalSize:parseInt(E??"0",10),etag:m,sha256:i,...n.metadataAdditional??{}})}return}const o=await fetch(t,{...n.headers?{headers:n.headers}:{},...n.signal?{signal:n.signal}:{}});if(!o.ok||!o.body)throw new Error(`Failed to fetch ${t}: HTTP ${o.status}`);const s=o.headers.get("content-length"),l=(o.headers.get("etag")||"").replace(/[^A-Za-z0-9]/g,""),u=parseInt(s??"0",10),f=n.progressCallback;let c=0,p=0;const d=new TransformStream({transform(y,E){if(c+=y.byteLength,f){const m=Date.now();m-p>100&&(p=m,f({loaded:c,total:u}))}E.enqueue(y)},flush(){f==null||f({loaded:c,total:u||c})}}),h={originalURL:t,originalSize:u,etag:l,...n.metadataAdditional??{}};i&&(h.sha256=i),await this.sb.write(r,o.body.pipeThrough(d),a),await this.writeMetadata(r,h)}async open(t){const n=Hs(await this.getMetadata(t)),r=await this.sb.read(t,n);if(r)return r;const i=await Ws(t,""),a=Hs(await this.getMetadata(i));return this.sb.read(i,a)}async getSize(t){const n=Hs(await this.getMetadata(t));return this.sb.getSize(t,n)}async getMetadata(t){const n=await this.sb.read(`${pr}${t}`),r=await this.sb.getSize(t);if(!n)return r>0?{etag:hb,originalSize:r,originalURL:""}:null;try{return await new Response(n).json()}catch{return null}}async list(){const t=await this.sb.list(),n={};for(const{key:i}of t)if(i.startsWith(pr)){const a=await this.sb.read(i);if(a){const o=await new Response(a).json().catch(()=>null);n[i.slice(pr.length)]=o}}const r=[];for(const{key:i,size:a}of t)i.startsWith(pr)||r.push({name:i,size:a,metadata:n[i]||{originalSize:a,originalURL:"",etag:""}});return r}async clear(){await this.deleteMany(()=>!0)}async delete(t){const n=await this.getNameFromURL(t);await this.deleteMany(r=>r.name===t||r.name===n)}async deleteMany(t){const n=await this.list();for(const r of n)t(r)&&(await this.sb.delete(r.name),await this.sb.delete(`${pr}${r.name}`))}async writeMetadata(t,n){const r=new Blob([JSON.stringify(n)],{type:"text/plain"});await this.sb.write(`${pr}${t}`,r.stream())}}async function Ws(e,t){const n=await crypto.subtle.digest("SHA-1",new TextEncoder().encode(e)),i=Array.from(new Uint8Array(n)).map(a=>a.toString(16).padStart(2,"0")).join("");return`${t}${i}_${e.split("/").pop()}`}const gb=3;class uu{constructor(t,n,r,i){this.modelManager=t,this.url=n,this.mmprojUrl=r,i?(this.files=this.getAllFiles(i),this.size=zs(this.files.map(a=>a.metadata.originalSize))):(this.files=[],this.size=0)}async open(){if(this.size===-1)throw new ye("Model is deleted from the cache; Call ModelManager.downloadModel to re-download the model","load_error");const t=[];for(const n of this.files){const r=await this.modelManager.cacheManager.open(n.name);if(!r)throw new Error(`Failed to open file ${n.name}; Hint: the model may be invalid, please refresh it`);t.push(r)}return t}validate(){let t=Zn.parseModelUrl(this.url).length;if(this.mmprojUrl&&(t+=1),this.size===-1)return"deleted";if(this.size<16||this.files.length!==t)return"invalid";for(const n of this.files)if(!n.metadata||n.metadata.originalSize!==n.size)return"invalid";return"valid"}async refresh(t={}){const n=Zn.parseModelUrl(this.url);this.mmprojUrl&&n.push(this.mmprojUrl);const r=n.map((u,f)=>({url:u,index:f}));this.modelManager.logger.debug("Downloading model files:",n);const i=this.modelManager.params.parallelDownloads??gb,a=await this.getTotalDownloadSize(n),o=[],s=async()=>{for(;r.length>0;){const u=r.shift();if(!u)break;await this.modelManager.cacheManager.download(u.url,{...t,metadataAdditional:{originalURL:u.url,mmprojURL:this.mmprojUrl},progressCallback:({loaded:f})=>{var c;o[u.index]=f,(c=t.progressCallback)==null||c.call(t,{loaded:zs(o),total:a})}})}},l=[];for(let u=0;u<i;u++)l.push(s()),o.push(0);await Promise.all(l),this.files=this.getAllFiles(await this.modelManager.cacheManager.list()),this.size=this.files.reduce((u,f)=>u+f.metadata.originalSize,0)}async remove(){this.files=this.getAllFiles(await this.modelManager.cacheManager.list()),await this.modelManager.cacheManager.deleteMany(t=>!!this.files.find(n=>n.name===t.name)),this.size=-1}getAllFiles(t){const n=new Set(Zn.parseModelUrl(this.url));this.mmprojUrl&&n.add(this.mmprojUrl);const r=[];for(const i of n){const a=t.find(o=>o.metadata.originalURL===i);if(!a)throw new Error(`Model file not found: ${i}`);r.push(a)}return r.sort((i,a)=>i.metadata.originalURL.localeCompare(a.metadata.originalURL)),r}async getTotalDownloadSize(t){const r=(await Promise.all(t.map(i=>fetch(i,{method:"HEAD"})))).map(i=>Number(i.headers.get("content-length")||"0"));return zs(r)}}class Zn{constructor(t={}){this.cacheManager=t.cacheManager||new Og,this.params=t,this.logger=t.logger||console}static parseModelUrl(t){if(Array.isArray(t))return t;const n=/-(\d{5})-of-(\d{5})\.gguf(?:\?.*)?$/,r=t.match(/\.gguf(\?.*)?$/),i=(r==null?void 0:r[1])??"",a=t.match(n);if(!a)return[t];const o=t.replace(n,""),s=a[2];return Array.from({length:Number(s)},(u,f)=>(f+1).toString().padStart(5,"0")).map(u=>`${o}-${u}-of-${s}.gguf${i}`)}async getModels(t={}){const n=await this.cacheManager.list();let r=[];for(const i of n){const a=Zn.parseModelUrl(i.metadata.originalURL),o=i.metadata.mmprojURL;(a.length===1||a[0]===i.metadata.originalURL)&&r.push(new uu(this,i.metadata.originalURL,o,n))}return t.includeInvalid||(r=r.filter(i=>i.validate()==="valid")),r}async downloadModel(t,n={}){const r=Yo(t)?{url:t}:t;if(!Ig(r.url))throw new ye(`Invalid model URL: ${r.url}; URL must ends with ".gguf"`,"download_error");const i=new uu(this,r.url,r.mmprojUrl);return i.validate()!=="valid"&&await i.refresh(n),i}async getModelOrDownload(t,n={}){var a;const i=(await this.getModels()).find(o=>o.url===t.url);return i?((a=n.progressCallback)==null||a.call(n,{loaded:i.size,total:i.size}),i):this.downloadModel(t,n)}async clear(){await this.cacheManager.clear()}}var Dg=(e=>(e[e.DEBUG=1]="DEBUG",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e))(Dg||{});const Gs={worker:"https://cdn.jsdelivr.net/npm/@wllama/wllama-compat@3.5.1/wasm/wllama.js",wasm:"https://cdn.jsdelivr.net/npm/@wllama/wllama-compat@3.5.1/wasm/wllama.wasm"};class ye extends Error{constructor(t,n="unknown_error"){super(t),this.type=n}}class wb extends Error{constructor(){super("Operation aborted"),this.name="AbortError"}}class Ld extends Error{constructor(t,n){super(t),this.name="RuntimeError",this.stack=n}}class yb{constructor(t,n={}){if(this.compat=null,this.proxy=null,this.useMultiThread=!1,this.nbThreads=1,this.useEmbeddings=!1,this.useRerank=!1,this.loadedContextInfo=null,this.seed=void 0,this.bosToken=-1,this.eosToken=-1,this.eotToken=-1,this.eogTokens=new Set,this.addBosToken=!1,this.addEosToken=!1,this.hasEncoder=!1,this.decoderStartToken=-1,this.chatTemplateKwargs={},Z0(),!t)throw new ye("AssetsPathConfig is required");this.pathConfig=t,this.config=n,this.cacheManager=n.cacheManager??new Og,this.modelManager=n.modelManager??new Zn({cacheManager:this.cacheManager,logger:n.logger??console,parallelDownloads:n.parallelDownloads,allowOffline:n.allowOffline}),this.setCompat("default")}logger(){return this.config.logger??console}checkModelLoaded(){if(!this.isModelLoaded())throw new ye("loadModel() is not yet called","model_not_loaded")}static getLibllamaVersion(){return tb}setCompat(t,n="safari"){if(n==="safari"&&js()){this.compat=null;return}this.compat=t==="default"?Gs:t}isModelLoaded(){return!!this.proxy&&!!this.metadata}getBOS(){return this.bosToken}getEOS(){return this.eosToken}getEOT(){return this.eotToken}isTokenEOG(t){return t===this.eosToken||t===this.eotToken||this.eogTokens.has(t)}getDecoderStartToken(){return this.decoderStartToken}getModelMetadata(){return this.checkModelLoaded(),this.metadata}isMultithread(){return this.checkModelLoaded(),this.useMultiThread}getNumThreads(){return this.checkModelLoaded(),this.useMultiThread?this.nbThreads:1}isEncoderDecoderArchitecture(){return this.checkModelLoaded(),this.hasEncoder}mustAddBosToken(){return this.checkModelLoaded(),this.addBosToken}mustAddEosToken(){return this.checkModelLoaded(),this.addEosToken}getChatTemplate(){return this.checkModelLoaded(),this.chatTemplate??null}isSupportWebGPU(){return Q0()}async loadModelFromUrl(t,n={}){const r=Yo(t)?{url:t}:t,o=await(n.useCache??!0?await this.modelManager.getModelOrDownload(r,n):await this.modelManager.downloadModel(r,n)).open();return await this.loadModel(o,n)}async loadModelFromHF(t,n={}){const r=await ub(t);return await this.loadModelFromUrl(r,n)}async loadModel(t,n={}){var d,h;const r=t instanceof uu?await t.open():[...t];if(r.some(y=>y.size===0))throw new ye("Input model (or splits) must be non-empty Blob or File","load_error");if(!this.pathConfig.default)throw new ye('"default" is missing from pathConfig',"load_error");if(this.proxy)throw new ye("Module is already initialized","load_error");const i=await Id(),a=Math.floor((navigator.hardwareConcurrency||1)/2),o=n.n_threads??a;this.nbThreads=o,this.useMultiThread=i&&o>1;const s=this.getWorkerResources();this.proxy=new Nd(s,this.useMultiThread?o:0,this.config.suppressNativeLog??!1,this.logger());let l=n.log_level??Dg.INFO;this.config.suppressNativeLog&&(l=9999);const u=await q0(r);await this.proxy.moduleInit(u.all),this.logger().debug("Calling wllamaStart...");const f=await this.proxy.wllamaStart();if(!f.success)throw new ye(`Error while calling start function, result = ${f}`);this.logger().debug("Loading model...");const c=await this.proxy.wllamaAction("load",{_name:"load_req",log_level:l,use_mmap:!Lg(s.compat),use_mlock:!1,n_gpu_layers:n.n_gpu_layers??99999,n_ctx:n.n_ctx??1024,n_threads:this.useMultiThread?o:1,n_ctx_auto:!1,mmproj_path:u.mmproj?`/models/${Qa}`:void 0,model_paths:u.llm.map(y=>`models/${y.name}`),embeddings:n.embeddings,offload_kqv:n.offload_kqv,n_batch:n.n_batch,pooling_type:n.pooling_type,rope_scaling_type:n.rope_scaling_type,rope_freq_base:n.rope_freq_base,rope_freq_scale:n.rope_freq_scale,yarn_ext_factor:n.yarn_ext_factor,yarn_attn_factor:n.yarn_attn_factor,yarn_beta_fast:n.yarn_beta_fast,yarn_beta_slow:n.yarn_beta_slow,yarn_orig_ctx:n.yarn_orig_ctx,cache_type_k:n.cache_type_k,cache_type_v:n.cache_type_v,n_parallel:1,kv_unified:!1,flash_attn:n.flash_attn,swa_full:n.swa_full,chat_template:n.chat_template,jinja:n.jinja,reasoning:n.reasoning,image_min_tokens:n.image_min_tokens,image_max_tokens:n.image_max_tokens,warmup:n.warmup,no_kv_offload:n.no_kv_offload,mmproj_offload:n.mmproj_offload,cont_batching:n.cont_batching,n_keep:n.n_keep,ctx_shift:n.ctx_shift,cache_idle_slots:n.cache_idle_slots,n_cache_reuse:n.n_cache_reuse,lora_paths:(d=n.lora_adapters)==null?void 0:d.map(y=>y.path),lora_scales:(h=n.lora_adapters)==null?void 0:h.map(y=>y.scale??1),lora_init_without_apply:n.lora_init_without_apply,spec_draft_model:n.spec_draft_model,spec_draft_ngl:n.spec_draft_ngl,spec_draft_n_max:n.spec_draft_n_max,spec_draft_n_min:n.spec_draft_n_min,spec_draft_p_min:n.spec_draft_p_min,spec_draft_threads:n.spec_draft_threads,spec_draft_threads_batch:n.spec_draft_threads_batch,kv_overrides_keys:n.kv_overrides?Object.keys(n.kv_overrides):void 0,kv_overrides_vals:n.kv_overrides?Object.values(n.kv_overrides):void 0,reasoning_budget_tokens:n.reasoning_budget_tokens,reasoning_budget_message:n.reasoning_budget_message,reasoning_format:n.reasoning_format,skip_chat_parsing:n.skip_chat_parsing,prefill_assistant:n.prefill_assistant}),p={...c,metadata:{}};for(let y=0;y<c.metadata_key.length;y++)p.metadata[c.metadata_key[y]]=c.metadata_val[y];this.seed=n.seed,this.bosToken=p.token_bos,this.eosToken=p.token_eos,this.eotToken=p.token_eot,this.useEmbeddings=!!n.embeddings,this.useRerank=n.pooling_type=="rank",this.metadata={hparams:{nVocab:p.n_vocab,nCtxTrain:p.n_ctx_train,nEmbd:p.n_embd,nLayer:p.n_layer},meta:p.metadata},this.hasEncoder=!!p.has_encoder,this.decoderStartToken=p.token_decoder_start,this.addBosToken=p.add_bos_token,this.addEosToken=p.add_eos_token,this.chatTemplate=p.metadata["tokenizer.chat_template"],this.loadedContextInfo=p,this.eogTokens=new Set(p.list_tokens_eog),this.mediaMarker=p.media_marker,this.chatTemplateKwargs=n.default_template_kwargs??{},this.logger().debug({loadedCtxInfo:p})}getLoadedContextInfo(){if(this.checkModelLoaded(),!this.loadedContextInfo)throw new ye("Loaded context info is not available");return{...this.loadedContextInfo}}async createEmbedding(t){if(this.checkModelLoaded(),!this.useEmbeddings)throw new ye("Embeddings is not enabled. Please set it via LoadModelParams.embeddings");if(!(await this.proxy.wllamaAction("embedding",{_name:"embd_req",data_json:JSON.stringify(t),files:[]})).success)throw new ye("Model failed to start inference","inference_error");return await this.getResponse(t,!1)}async createRerank(t){if(this.checkModelLoaded(),!this.useEmbeddings||!this.useRerank)throw new ye("Rerank is not enabled. Please set it via LoadModelParams: embeddings = true and pooling_type = rank");const n=t.top_n??t.documents.length;let r=0;const i=[];for(let a=0;a<t.documents.length;a++){if(!(await this.proxy.wllamaAction("rerank",{_name:"rrnk_req",data_json:JSON.stringify({query:t.query,document:t.documents[a]})})).success)throw new ye("Model failed to start reranking","inference_error");const{score:s,tokens_evaluated:l}=await this.getRerankResult();r+=l,i.push({index:a,score:s})}return i.sort((a,o)=>o.score-a.score),{model:this.getModelMetadata().meta["general.name"]??"",object:"list",usage:{prompt_tokens:r,total_tokens:r},results:i.slice(0,n).map(({index:a,score:o})=>({index:a,relevance_score:o}))}}async createChatCompletion(t){if(Object.keys(this.chatTemplateKwargs).length>0&&(t={...t,chat_template_kwargs:{...this.chatTemplateKwargs,...t.chat_template_kwargs??{}}}),t.stream&&t.onData)await this.createCompletionImpl(t);else return t.stream?await this.createCompletionGenerator(t):await this.createCompletionImpl({...t,stream:!1})}async createCompletion(t){if(t.stream&&t.onData)await this.createCompletionImpl(t);else return t.stream?await this.createCompletionGenerator(t):await this.createCompletionImpl({...t,stream:!1})}async createCompletionImpl(t){this.checkModelLoaded();const n=!!t.stream,r=!!t.messages,i={};this.seed!==void 0&&(i.seed=this.seed);let a=[];if(r){const s=this.prepareMultimodalInput(t);t=s.params,a=s.files}if(!(await this.proxy.wllamaAction("completion",{_name:"cmpl_req",is_chat:r,data_json:JSON.stringify({...t,...i}),files:a.map(s=>new Uint8Array(s))})).success)throw new ye("Model failed to start inference","inference_error");return await this.getResponse(t,n)}createCompletionGenerator(t){return new Promise(n=>{const r=$0(i=>{this.createCompletionImpl({...t,onData:a=>i(a)}).then(()=>i(void 0,!0)).catch(a=>i(void 0,!1,a))});n(r())})}supportInputModality(t){if(this.checkModelLoaded(),t==="image")return!!this.loadedContextInfo.has_image_input;if(t==="audio")return!!this.loadedContextInfo.has_audio_input;throw new ye("Unsupported modality: "+t,"unknown_error")}async exit(){var t;await((t=this.proxy)==null?void 0:t.wllamaExit()),this.proxy=null}async testBackendOps(t=[]){if(!this.pathConfig.default)throw new ye('"default" is missing from pathConfig',"load_error");if(!await Id())throw new ye("Multi-threading is required to run backend ops tests, but it is not supported in the current environment.");const n=new Nd(this.getWorkerResources(),0,this.config.suppressNativeLog??!1,this.logger());try{await n.moduleInit([]);const r=await n.wllamaStart();if(!r.success)throw new ye(`Error while calling start function, result = ${r}`);const i=await n.wllamaAction("test_backend_ops",{_name:"tbop_req",args:["test-backend-ops",...t]});return{retcode:i.retcode,success:i.success}}finally{await n.wllamaExit()}}async _getDebugInfo(){return this.checkModelLoaded(),await this.proxy.wllamaDebug()}jsonDecode(t){try{return JSON.parse(t)}catch{throw this.logger().error("Failed to parse JSON:",t),new ye("Failed to parse model output","inference_error")}}prepareMultimodalInput(t){const n=t.messages,r=[],i=[];for(const a of n)if(Array.isArray(a.content)){const o=[];for(const s of a.content)if(s.type==="text")o.push(s);else{if(!this.mediaMarker)throw new ye("Media marker is undefined","inference_error");i.push(s.data),o.push({type:"text",text:this.mediaMarker})}r.push({...a,content:o})}else r.push(a);return{params:{...t,messages:r},files:i}}async getRerankResult(){for(;;){const t=await this.proxy.wllamaAction("get_result",{_name:"gres_req"}),n=t.data_json;if(n&&n.length>0){if(t.is_error){const r=this.jsonDecode(n);throw new ye(r.message||"Unknown reranking error","inference_error")}return this.jsonDecode(n)}if(!t.has_more)break}throw new ye("No reranking result received","inference_error")}async getResponse(t,n){var i,a;let r=null;for(;;){if((i=t.abortSignal)!=null&&i.aborted)throw new wb;const o=await this.proxy.wllamaAction("get_result",{_name:"gres_req"}),s=o.data_json;if(!s||s.length===0){if(o.has_more)continue;break}if(s=="null")continue;let l=this.jsonDecode(s);if(r=l,o.is_error)throw this.logger().error("Model returned an error:",l),new ye(l.message||"Unknown inference error","inference_error");if(n){Array.isArray(l)||(l=[l]);for(const u of l)(a=t.onData)==null||a.call(t,u),r=u}if(!o.has_more)break}return r}getWorkerResources(){const t={wasmPath:Md(this.pathConfig.default),compat:!1};return eb()&&(this.compat?(this.compat.worker===Gs.worker&&this.compat.wasm===Gs.wasm&&(this.logger().warn("Compatibility mode is activated, using resources from CDN. To use local resources, please refer to @wllama/wllama-compat package."),this.logger().warn("IMPORTANT: Performance will be significantly degraded in compatibility mode.")),t.wasmPath=Md(this.compat.wasm),t.jsPath=this.compat.worker,t.compat=!0):this.logger().warn("Not using compat mode"+(js()?" (expected on Firefox - WebGPU will be disabled)":""))),js()&&(t.compat?this.logger().warn('Using compat mode on Firefox, performance will be significantly degraded; Consider enabling "javascript.options.wasm_js_promise_integration" in "about:config".'):Oc()||this.logger().warn('WebGPU is disabled on Firefox due to missing JSPI support. Please consider enabling compat mode, or enabling "javascript.options.wasm_js_promise_integration" in "about:config".')),t}}const vb=""+new URL("wllama-m-NqGU8W.wasm",import.meta.url).href,bb="@wllama/wllama",kb="3.5.1",xb="WebAssembly binding for llama.cpp - Enabling on-browser LLM inference",Sb="index.js",Pb="module",Eb={example:"examples"},Cb={serve:"node ./scripts/http_server.js","serve:mt":"MULTITHREAD=1 node ./scripts/http_server.js",clean:"rm -rf ./esm && rm -rf ./docs && rm -rf ./wasm","build:worker":"./scripts/build_worker.sh","build:glue":"node ./cpp/generate_glue_prototype.js","build:wasm":"./scripts/build_wasm.sh && npm run build:glue","build:test":"WLLAMA_TEST_BACKEND=1 npm run build:wasm","build:tsup":"tsup src/index.ts --format cjs,esm --clean","build:minified":"terser esm/index.js -o esm/index.min.js --compress --mangle --source-map","build:typedef":"tsc --emitDeclarationOnly --declaration -p tsconfig.build.json",build:"npm run clean && npm run build:worker && npm run build:tsup && npm run build:minified && npm run build:typedef && ./scripts/post_build.sh && npm run docs",docs:"typedoc --tsconfig tsconfig.build.json src/index.ts",upload:"npm run format && npm run build && node scripts/check_package_size.js && npm publish --access public && (cd compat && npm publish --access public)",format:"prettier --write .",test:"vitest","test:auto":"AUTO=1 vitest","test:firefox":"BROWSER=firefox vitest","test:safari":"BROWSER=safari vitest","test:wgpu":"WEBGPU=1 vitest"},Ab={type:"git",url:"git+https://github.com/ngxson/wllama.git"},Fb=["wasm","webassembly","llama","llm","ai","rag","embeddings","generation"],Tb="Xuan Son NGUYEN <contact@ngxson.com>",Mb="MIT",_b={url:"https://github.com/ngxson/wllama/issues"},Ib="https://github.com/ngxson/wllama#readme",Nb={"@playwright/test":"^1.60.0","@vitest/browser":"^2.1.6",express:"^4.18.3","mime-types":"^2.1.35",playwright:"^1.59.1",prettier:"^3.3.3",terser:"^5.39.0",tsup:"^8.4.0",typedoc:"^0.27.2",typescript:"^5.4.2",webdriverio:"^9.4.1"},Rb={trailingComma:"es5",tabWidth:2,semi:!0,singleQuote:!0,bracketSameLine:!1},Lb={name:bb,version:kb,description:xb,main:Sb,type:Pb,directories:Eb,scripts:Cb,repository:Ab,keywords:Fb,author:Tb,license:Mb,bugs:_b,homepage:Ib,devDependencies:Nb,prettier:Rb},Ob="default",Db=Lb.version,Ub={default:vb},zb=null,jb=2*1024*1024*1024,Bb=[{url:"https://huggingface.co/LiquidAI/LFM2.5-VL-450M-GGUF/resolve/main/LFM2.5-VL-450M-Q4_0.gguf",mmprojUrl:"https://huggingface.co/LiquidAI/LFM2.5-VL-450M-GGUF/resolve/main/mmproj-LFM2.5-VL-450m-Q8_0.gguf",size:566231040,modalities:["image"]},{url:"https://huggingface.co/LiquidAI/LFM2-700M-GGUF/resolve/main/LFM2-700M-Q4_K_M.gguf",size:468624320},{url:"https://huggingface.co/LiquidAI/LFM2-1.2B-GGUF/resolve/main/LFM2-1.2B-Q4_K_M.gguf",size:730893248},{url:"https://huggingface.co/unsloth/Qwen3-0.6B-GGUF/resolve/main/Qwen3-0.6B-Q8_0.gguf",size:639447744},{url:"https://huggingface.co/unsloth/Qwen3-1.7B-GGUF/resolve/main/Qwen3-1.7B-Q4_K_M.gguf",size:1107409472},{url:"https://huggingface.co/ggml-org/SmolLM3-3B-GGUF/resolve/main/SmolLM3-Q4_K_M.gguf",size:1915305312},{url:"https://huggingface.co/ngxson/SmolLM2-360M-Instruct-Q8_0-GGUF/resolve/main/smollm2-360m-instruct-q8_0.gguf",size:386404992},{url:"https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct-GGUF/resolve/main/qwen2.5-0.5b-instruct-q8_0.gguf",size:675710816},{url:"https://huggingface.co/hugging-quants/Llama-3.2-1B-Instruct-Q4_K_M-GGUF/resolve/main/llama-3.2-1b-instruct-q4_k_m.gguf",size:807690656},{url:"https://huggingface.co/bartowski/DeepSeek-R1-Distill-Qwen-1.5B-GGUF/resolve/main/DeepSeek-R1-Distill-Qwen-1.5B-Q3_K_M.gguf",size:924456032},{url:"https://huggingface.co/ngxson/wllama-split-models/resolve/main/qwen2-1_5b-instruct-q4_k_m-00001-of-00004.gguf",size:986046272},{url:"https://huggingface.co/ngxson/SmolLM2-1.7B-Instruct-Q4_K_M-GGUF/resolve/main/smollm2-1.7b-instruct-q4_k_m.gguf",size:1055609536},{url:"https://huggingface.co/ngxson/wllama-split-models/resolve/main/gemma-2-2b-it-abliterated-Q4_K_M-00001-of-00004.gguf",size:1708583264},{url:"https://huggingface.co/ngxson/wllama-split-models/resolve/main/neuralreyna-mini-1.8b-v0.3.q4_k_m-00001-of-00005.gguf",size:1217753472},{url:"https://huggingface.co/ngxson/wllama-split-models/resolve/main/Phi-3.1-mini-128k-instruct-Q3_K_M-00001-of-00008.gguf",size:1955478176},{url:"https://huggingface.co/ngxson/wllama-split-models/resolve/main/meta-llama-3.1-8b-instruct-abliterated.Q2_K-00001-of-00014.gguf",size:3179133600},{url:"https://huggingface.co/ngxson/wllama-split-models/resolve/main/Meta-Llama-3.1-8B-Instruct-Q2_K-00001-of-00014.gguf",size:3179138048}],Ug={nThreads:-1,nContext:4096,nPredict:4096,nBatch:128,temperature:.2,ttsThreads:-1,sttThreads:-1,vadThreads:-1};class Yr{constructor(t,n,r,i,a,o){this.state=Te.NOT_DOWNLOADED,this.downloadPercent=-1,this.url=t,this.mmprojUrl=a,this.size=n,this.isUserAdded=r,this.modalities=o,this.state=i?Te.READY:Te.NOT_DOWNLOADED,this.cachedModel=i}get hfModel(){const t=this.url.replace(/https:\/\/(huggingface.co|hf.co)\/+/,"").split("/");return`${t[0]}/${t[1]}`}get hfPath(){return this.url.replace(/https:\/\/(huggingface.co|hf.co)\/+/,"").split("/").slice(4).join("/")}clone(t){const n=new Yr(this.url,this.size,this.isUserAdded,this.cachedModel,this.mmprojUrl,this.modalities);return n.state=t.state??this.state,n.downloadPercent=t.downloadPercent??this.downloadPercent,n}}function cu(e){return $t.load("custom_models",[]).map(n=>{const r=e.find(i=>i.url===n.url);return new Yr(n.url,n.size,!0,r,n.mmprojUrl)})}function Od(e){const t=e.filter(n=>n.isUserAdded).map(n=>({url:n.url,size:n.size,mmprojUrl:n.mmprojUrl}));$t.save("custom_models",t)}function Vb(e){return Bb.map(t=>{const n=e.find(r=>r.url===t.url);return new Yr(t.url,t.size,!1,n,t.mmprojUrl,t.modalities)})}function Hb(e){return[...cu(e),...Vb(e)]}const Wb=new Uint8Array([71,71,85,70]);async function Gb(e){const t=e.replace(/\?.*/,""),n=await fetch(t,{headers:{Range:`bytes=0-${2*1024*1024}`}});if(n.ok){const r=await n.arrayBuffer();if(!qb(new Uint8Array(r.slice(0,4)),Wb))throw new Error("Not a valid gguf file: not starting with GGUF magic number")}else throw new Error(`Fetch error with status code = ${n.status}`);return new Yr(t,await Kb(t),!0,void 0)}const qb=(e,t)=>{for(let n=0;n<t.length;n++)if(t[n]!==e[n])return!1;return!0},Kb=async e=>{const t=Xb(e),n=await Promise.all(t.map(async r=>{const i=await fetch(r,{method:"HEAD"});if(i.ok){const a=i.headers.get("Content-Length");return a?parseInt(a):0}else throw new Error(`Fetch error with status code = ${i.status}`)}));return Qb(n)},Xb=e=>{const t=/(?<baseURL>.*)-(?<current>\d{5})-of-(?<total>\d{5})\.gguf$/,n=e.match(t);if(!n||!n.groups||Object.keys(n.groups).length!==3)return[e];const{baseURL:r,total:i}=n.groups;return Array.from({length:Number(i)},(o,s)=>(s+1).toString().padStart(5,"0")).map(o=>`${r}-${o}-of-${i}.gguf`)},Qb=e=>e.reduce((t,n)=>t+n,0);window._exportModelList=function(){const t=$t.load("custom_models",[]).map(n=>(delete n.userAdded,n));console.log(JSON.stringify(t,null,2))};const Dc="remoteLlm",fu="noHwAccel",Jb=()=>{try{const e=localStorage.getItem(Dc);if(!e)return null;const t=JSON.parse(e);return t!=null&&t.baseUrl?t:null}catch{return null}},Zb=e=>{localStorage.setItem(Dc,JSON.stringify(e))},Yb=()=>{localStorage.removeItem(Dc)},zg=()=>{try{return localStorage.getItem(fu)==="1"}catch{return!1}},$b=e=>{try{e?localStorage.setItem(fu,"1"):localStorage.removeItem(fu)}catch{}},jg=T.createContext({}),Bg=()=>{const e=new yb(Ub,{logger:At});return e.setCompat(zb),e},qs=new Zn;let pn=Bg(),hr=!1;const Dd=()=>{pn=Bg()},ek=async(e,t,n,r)=>{var p,d,h;const i=r.signal;let o=e.baseUrl.trim().replace(/\/+$/,"");/\/chat\/completions$/i.test(o)||(o+=/\/v\d+$/i.test(o)?"/chat/completions":"/v1/chat/completions");const s=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json",...e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{}},body:JSON.stringify({model:e.model||"gpt-4o-mini",messages:t.map(y=>({role:y.role==="assistant"?"assistant":"user",content:y.content})),stream:!0}),signal:i});if(!s.ok||!s.body)throw new Error(`Remote LLM error: HTTP ${s.status}`);const l=s.body.getReader(),u=new TextDecoder;let f="",c="";for(;;){if(hr||r.signal.aborted){r.abort();break}const{done:y,value:E}=await l.read();if(y)break;f+=u.decode(E,{stream:!0});const m=f.split(`
|
| 726 |
`);f=m.pop()??"";for(const g of m){const w=g.trim();if(!w.startsWith("data:"))continue;const P=w.slice(5).trim();if(P==="[DONE]")return;try{const x=(h=(d=(p=JSON.parse(P).choices)==null?void 0:p[0])==null?void 0:d.delta)==null?void 0:h.content;typeof x=="string"&&x&&(c+=x,n(c))}catch{}}}},tk=({children:e})=>{const[t,n]=T.useState(!1),[r,i]=T.useState(-1),[a,o]=T.useState(m0()),[vm,svm]=T.useState(!1),ctl=T.useRef(null),[s,l]=T.useState([]),[u,f]=T.useState(!1),[c,p]=T.useState(),[d,h]=T.useState($t.load("params",Ug)),[y,E]=T.useState({}),[m,g]=T.useState(),[w,P]=T.useState(Jb()),[C,x]=T.useState(null),A=!!(w!=null&&w.baseUrl),M=async()=>{l(await qs.getModels())};p0(M);const R=T.useMemo(()=>{const U=Hb(s);for(const z of U)z.downloadPercent=y[z.url]??-1,z.downloadPercent>=0&&(z.state=Te.DOWNLOADING),(m==null?void 0:m.url)===z.url&&(z.state=m.state);return U},[s,y,m]),S=T.useMemo(()=>R.some(U=>U.state===Te.DOWNLOADING),[R]),_=T.useMemo(()=>u||(m==null?void 0:m.state)===Te.LOADING,[m,u]),L=(U,z=-1)=>{z<0?E(Q=>{const se={...Q};return delete se[U],se}):E(Q=>({...Q,[U]:z}))},W=async U=>{if(!(S||m||_)){L(U.url,0);try{await qs.downloadModel({url:U.url,mmprojUrl:U.mmprojUrl},{progressCallback(z){L(U.url,z.loaded/z.total)}}),L(U.url,-1),await M()}catch(z){alert((z==null?void 0:z.message)||"unknown error while downloading model")}}},G=async U=>{S||m||_||U.cachedModel&&(await U.cachedModel.remove(),await M())},q=async()=>{S||m||_||(await qs.clear(),await M())},ae=async U=>{if(!(S||m||_)){if(A){alert("Remote LLM provider is active — clear it first to load a local model.");return}if(!U.cachedModel)throw new Error("Model is not in cache");g(U.clone({state:Te.LOADING}));try{await pn.loadModel(U.cachedModel,{n_threads:d.nThreads>0?d.nThreads:void 0,n_gpu_layers:zg()?0:99999,n_ctx:d.nContext,n_batch:d.nBatch}),g(U.clone({state:Te.LOADED})),p({isMultithread:pn.isMultithread(),hasChatTemplate:!!pn.getChatTemplate(),supportsImage:pn.supportInputModality("image"),supportsAudio:pn.supportInputModality("audio")})}catch(z){Dd(),alert(`Failed to load model: ${z.message??"Unknown error"}`),g(void 0)}}},ne=async()=>{m&&(await pn.exit(),Dd(),g(void 0),p(void 0))},O=async(U,z)=>{var Pe,Re;n(!0),hr=!1;const Q=new AbortController;ctl.current=Q;if(w!=null&&w.baseUrl){x(null);try{await ek(w,U,z,Q)}catch(Fe){Q.signal.aborted||(console.error("[llm] remote completion failed:",Fe),x((Fe==null?void 0:Fe.message)||"Remote LLM request failed"))}ctl.current===Q&&(ctl.current=null),hr=!1,n(!1);return}if(S||!m||_)return;n(!1),n(!0);let se="";try{const Fe=await pn.createChatCompletion({messages:U.map(Ze=>Ze.mediaData?{role:Ze.role,content:[{type:Ze.mediaData.type,data:Ze.mediaData.data},{type:"text",text:Ze.content}]}:{role:Ze.role,content:Ze.content}),max_tokens:d.nPredict,temperature:d.temperature,stream:!0,abortSignal:Q.signal});for await(const Ze of Fe){if(hr||Q.signal.aborted){Q.abort();break}const Un=(Re=(Pe=Ze.choices[0])==null?void 0:Pe.delta)==null?void 0:Re.content;Un&&(se+=Un,z(se))}}catch{}hr=!1,n(!1),ctl.current===Q&&(ctl.current=null)},V=()=>{hr=!0;const c=ctl.current;c&&c.abort()},b=U=>{Zb(U),P(U),x(null),m&&ne()},K=()=>{Yb(),P(null),x(null)},ie=(U,z)=>{o(U),i(z??-1),U===ve.MODEL&&$t.save("welcome",!1)},k=U=>{$t.save("params",U),h(U)},he=async(U,z)=>{f(!0);try{const Q=await Gb(U);if(R.some(Pe=>Pe.url===Q.url))throw new Error("Model with the same URL already exist");const se=cu(s);Od([...se,new Yr(Q.url,Q.size,!0,void 0,z)]),await M()}catch(Q){throw f(!1),Q}f(!1)},Ge=async U=>{if(f(!0),U.isUserAdded){const Q=cu(s).filter(se=>se.url!==U.url);Od(Q),await M()}else throw new Error("Cannot remove non-user-added model");f(!1)};return v.jsx(jg.Provider,{value:{models:R,isDownloading:S,isLoadingModel:_,downloadModel:W,removeCachedModel:G,removeAllCachedModels:q,loadedModel:m,loadModel:ae,unloadModel:ne,remoteConfig:w,isRemote:A,remoteError:C,setRemoteConfig:b,clearRemoteConfig:K,currParams:d,setParams:k,createCompletion:O,stopCompletion:V,isGenerating:t,currentConvId:r,navigateTo:ie,currScreen:a,addCustomModel:he,removeCustomModel:Ge,currRuntimeInfo:c,voiceMode:vm,setVoiceMode:svm},children:e})},Wt=()=>T.useContext(jg),Vg=T.createContext({}),nk="/vad/silero-vad.js",rk="/vad/silero-vad.wasm",ik="/vad/mic-processor.js",ak=.5,ok=.35,sk=8,lk=.5,uk=e=>{let t=0;for(const i of e)t+=i.length;const n=new Float32Array(t);let r=0;for(const i of e)n.set(i,r),r+=i.length;return n},ck=(e,t)=>{let n=0;for(let r=e.length-1;r>=0;r--)if(n+=e[r].length,n>=t&&r>0){e.splice(0,r);return}};let Ud=null;const fk=()=>(Ud??(Ud=import(nk).then(e=>e.default({locateFile:()=>rk}))),Ud);class dk{constructor(t,n){if(this.inputPointer=0,this.inputCapacity=0,this.outputPointer=0,this.outputCapacity=0,this.module=t,this.handle=t._wasm_vad_create(n),!this.handle)throw new Error("Could not create the Silero VAD model.");this.windowSamples=t._wasm_vad_source_window_samples(this.handle)}push(t){const n=Math.floor((t.length+this.windowSamples-1)/this.windowSamples)+1;this.ensureInputCapacity(t.length),this.ensureOutputCapacity(n),this.module.HEAPF32.set(t,this.inputPointer>>>2);const r=this.module._wasm_vad_push(this.handle,this.inputPointer,t.length,this.outputPointer,n);if(r<0)throw new Error(`VAD inference failed with bridge error ${r}.`);return Array.from(this.module.HEAPF32.subarray(this.outputPointer>>>2,(this.outputPointer>>>2)+r))}destroy(){this.inputPointer&&this.module._free(this.inputPointer),this.outputPointer&&this.module._free(this.outputPointer),this.handle&&this.module._wasm_vad_destroy(this.handle),this.handle=0}ensureInputCapacity(t){if(t<=this.inputCapacity)return;const n=this.module._malloc(t*Float32Array.BYTES_PER_ELEMENT);if(!n)throw new Error("Could not allocate WASM input buffer.");this.inputPointer&&this.module._free(this.inputPointer),this.inputPointer=n,this.inputCapacity=t}ensureOutputCapacity(t){if(t<=this.outputCapacity)return;const n=this.module._malloc(t*Float32Array.BYTES_PER_ELEMENT);if(!n)throw new Error("Could not allocate WASM output buffer.");this.outputPointer&&this.module._free(this.outputPointer),this.outputPointer=n,this.outputCapacity=t}}const pk=({children:e})=>{const{stop:t}=Ag(),{stopCompletion:n}=Wt(),[r,i]=T.useState("idle"),[a,o]=T.useState(null),s=T.useRef(t),l=T.useRef(n);T.useEffect(()=>{s.current=t},[t]),T.useEffect(()=>{l.current=n},[n]);const u=T.useRef(null),f=T.useRef(null),c=T.useRef(null),p=T.useRef(null),d=T.useRef(null),h=T.useRef(null),y=T.useRef(null),E=T.useRef(!1),m=T.useRef(!1),g=T.useRef(0),w=T.useRef([]),P=T.useRef([]),C=T.useRef(0),x=T.useRef(new Set),A=T.useCallback(L=>(x.current.add(L),()=>{x.current.delete(L)}),[]),M=T.useCallback(L=>{for(const W of L)if(!m.current)W>=ak&&(m.current=!0,g.current=0,P.current=[...w.current],i("speaking"),s.current(),l.current());else if(W<ok){if(g.current+=1,g.current>=sk){m.current=!1,g.current=0,i("listening");const G=uk(P.current);P.current=[];const q=C.current;G.length>0&&q>0&&x.current.forEach(ae=>{try{ae(G,q)}catch(ne){console.error("[vad] utterance handler failed:",ne)}})}}else g.current=0},[]),R=T.useCallback(()=>{E.current=!1,m.current=!1,g.current=0,w.current=[],P.current=[],C.current=0,h.current&&(h.current.port.onmessage=null,h.current.disconnect(),h.current=null),y.current&&(y.current.disconnect(),y.current=null),d.current&&(d.current.disconnect(),d.current=null),p.current&&(p.current.getTracks().forEach(L=>L.stop()),p.current=null),c.current&&(c.current.close().catch(()=>{}),c.current=null),f.current&&(f.current.destroy(),f.current=null),i("idle")},[]),S=T.useCallback(async()=>{if(!E.current){o(null),i("loading");try{const L=u.current??(u.current=await fk()),W=await navigator.mediaDevices.getUserMedia({audio:{channelCount:1,echoCancellation:!1,noiseSuppression:!1,autoGainControl:!1}});p.current=W;const G=new AudioContext({latencyHint:"interactive"});c.current=G,await G.audioWorklet.addModule(ik),await G.resume(),C.current=Math.round(G.sampleRate);const q=new dk(L,Math.round(G.sampleRate));f.current=q;const ae=G.createMediaStreamSource(W);d.current=ae;const ne=new AudioWorkletNode(G,"mic-processor",{numberOfInputs:1,numberOfOutputs:1,outputChannelCount:[1],channelCount:1});h.current=ne;const O=G.createGain();O.gain.value=0,y.current=O,ne.port.onmessage=({data:V})=>{try{w.current.push(V),ck(w.current,Math.round(C.current*lk)),m.current&&P.current.push(V),M(q.push(V))}catch(b){console.error("[vad] inference failed:",b),R()}},ae.connect(ne),ne.connect(O),O.connect(G.destination),m.current=!1,g.current=0,E.current=!0,i("listening")}catch(L){R(),o((L==null?void 0:L.message)??"Microphone / VAD failed to start")}}},[M,R]);T.useEffect(()=>()=>R(),[]);const _=T.useMemo(()=>({status:r,error:a,start:S,stop:R,onUtterance:A}),[r,a,S,R,A]);return v.jsx(Vg.Provider,{value:_,children:e})},mk=()=>T.useContext(Vg),zd=()=>{};let Uc={},Hg={},Wg=null,Gg={mark:zd,measure:zd};try{typeof window<"u"&&(Uc=window),typeof document<"u"&&(Hg=document),typeof MutationObserver<"u"&&(Wg=MutationObserver),typeof performance<"u"&&(Gg=performance)}catch{}const{userAgent:jd=""}=Uc.navigator||{},_n=Uc,me=Hg,Bd=Wg,Ia=Gg;_n.document;const ln=!!me.documentElement&&!!me.head&&typeof me.addEventListener=="function"&&typeof me.createElement=="function",qg=~jd.indexOf("MSIE")||~jd.indexOf("Trident/");var we="classic",Kg="duotone",ct="sharp",ft="sharp-duotone",hk=[we,Kg,ct,ft],gk={classic:{900:"fas",400:"far",normal:"far",300:"fal",100:"fat"},sharp:{900:"fass",400:"fasr",300:"fasl",100:"fast"},"sharp-duotone":{900:"fasds"}},Vd={kit:{fak:"kit","fa-kit":"kit"},"kit-duotone":{fakd:"kit-duotone","fa-kit-duotone":"kit-duotone"}},wk=["kit"],yk=/fa(s|r|l|t|d|b|k|kd|ss|sr|sl|st|sds)?[\-\ ]/,vk=/Font ?Awesome ?([56 ]*)(Solid|Regular|Light|Thin|Duotone|Brands|Free|Pro|Sharp Duotone|Sharp|Kit)?.*/i,bk={"Font Awesome 5 Free":{900:"fas",400:"far"},"Font Awesome 5 Pro":{900:"fas",400:"far",normal:"far",300:"fal"},"Font Awesome 5 Brands":{400:"fab",normal:"fab"},"Font Awesome 5 Duotone":{900:"fad"}},kk={"Font Awesome 6 Free":{900:"fas",400:"far"},"Font Awesome 6 Pro":{900:"fas",400:"far",normal:"far",300:"fal",100:"fat"},"Font Awesome 6 Brands":{400:"fab",normal:"fab"},"Font Awesome 6 Duotone":{900:"fad"},"Font Awesome 6 Sharp":{900:"fass",400:"fasr",normal:"fasr",300:"fasl",100:"fast"},"Font Awesome 6 Sharp Duotone":{900:"fasds"}},xk={classic:{"fa-brands":"fab","fa-duotone":"fad","fa-light":"fal","fa-regular":"far","fa-solid":"fas","fa-thin":"fat"},sharp:{"fa-solid":"fass","fa-regular":"fasr","fa-light":"fasl","fa-thin":"fast"},"sharp-duotone":{"fa-solid":"fasds"}},Sk={classic:["fas","far","fal","fat"],sharp:["fass","fasr","fasl","fast"],"sharp-duotone":["fasds"]},Pk={classic:{fab:"fa-brands",fad:"fa-duotone",fal:"fa-light",far:"fa-regular",fas:"fa-solid",fat:"fa-thin"},sharp:{fass:"fa-solid",fasr:"fa-regular",fasl:"fa-light",fast:"fa-thin"},"sharp-duotone":{fasds:"fa-solid"}},Ek={classic:{solid:"fas",regular:"far",light:"fal",thin:"fat",duotone:"fad",brands:"fab"},sharp:{solid:"fass",regular:"fasr",light:"fasl",thin:"fast"},"sharp-duotone":{solid:"fasds"}},Xg={classic:{fa:"solid",fas:"solid","fa-solid":"solid",far:"regular","fa-regular":"regular",fal:"light","fa-light":"light",fat:"thin","fa-thin":"thin",fad:"duotone","fa-duotone":"duotone",fab:"brands","fa-brands":"brands"},sharp:{fa:"solid",fass:"solid","fa-solid":"solid",fasr:"regular","fa-regular":"regular",fasl:"light","fa-light":"light",fast:"thin","fa-thin":"thin"},"sharp-duotone":{fa:"solid",fasds:"solid","fa-solid":"solid"}},Ck=["solid","regular","light","thin","duotone","brands"],Qg=[1,2,3,4,5,6,7,8,9,10],Ak=Qg.concat([11,12,13,14,15,16,17,18,19,20]),bi={GROUP:"duotone-group",SWAP_OPACITY:"swap-opacity",PRIMARY:"primary",SECONDARY:"secondary"},Fk=[...Object.keys(Sk),...Ck,"2xs","xs","sm","lg","xl","2xl","beat","border","fade","beat-fade","bounce","flip-both","flip-horizontal","flip-vertical","flip","fw","inverse","layers-counter","layers-text","layers","li","pull-left","pull-right","pulse","rotate-180","rotate-270","rotate-90","rotate-by","shake","spin-pulse","spin-reverse","spin","stack-1x","stack-2x","stack","ul",bi.GROUP,bi.SWAP_OPACITY,bi.PRIMARY,bi.SECONDARY].concat(Qg.map(e=>"".concat(e,"x"))).concat(Ak.map(e=>"w-".concat(e))),Tk={"Font Awesome Kit":{400:"fak",normal:"fak"},"Font Awesome Kit Duotone":{400:"fakd",normal:"fakd"}},Mk={kit:{"fa-kit":"fak"},"kit-duotone":{"fa-kit-duotone":"fakd"}},_k={kit:{fak:"fa-kit"},"kit-duotone":{fakd:"fa-kit-duotone"}},Hd={kit:{kit:"fak"},"kit-duotone":{"kit-duotone":"fakd"}};const an="___FONT_AWESOME___",du=16,Jg="fa",Zg="svg-inline--fa",ar="data-fa-i2svg",pu="data-fa-pseudo-element",Ik="data-fa-pseudo-element-pending",zc="data-prefix",jc="data-icon",Wd="fontawesome-i2svg",Nk="async",Rk=["HTML","HEAD","STYLE","SCRIPT"],Yg=(()=>{try{return!0}catch{return!1}})(),$g=[we,ct,ft];function sa(e){return new Proxy(e,{get(t,n){return n in t?t[n]:t[we]}})}const ew={...Xg};ew[we]={...Xg[we],...Vd.kit,...Vd["kit-duotone"]};const Yn=sa(ew),mu={...Ek};mu[we]={...mu[we],...Hd.kit,...Hd["kit-duotone"]};const Yi=sa(mu),hu={...Pk};hu[we]={...hu[we],..._k.kit};const $n=sa(hu),gu={...xk};gu[we]={...gu[we],...Mk.kit};const Lk=sa(gu),Ok=yk,tw="fa-layers-text",Dk=vk,Uk={...gk};sa(Uk);const zk=["class","data-prefix","data-icon","data-fa-transform","data-fa-mask"],Ks=bi,qr=new Set;Object.keys(Yi[we]).map(qr.add.bind(qr));Object.keys(Yi[ct]).map(qr.add.bind(qr));Object.keys(Yi[ft]).map(qr.add.bind(qr));const jk=[...wk,...Fk],_i=_n.FontAwesomeConfig||{};function Bk(e){var t=me.querySelector("script["+e+"]");if(t)return t.getAttribute(e)}function Vk(e){return e===""?!0:e==="false"?!1:e==="true"?!0:e}me&&typeof me.querySelector=="function"&&[["data-family-prefix","familyPrefix"],["data-css-prefix","cssPrefix"],["data-family-default","familyDefault"],["data-style-default","styleDefault"],["data-replacement-class","replacementClass"],["data-auto-replace-svg","autoReplaceSvg"],["data-auto-add-css","autoAddCss"],["data-auto-a11y","autoA11y"],["data-search-pseudo-elements","searchPseudoElements"],["data-observe-mutations","observeMutations"],["data-mutate-approach","mutateApproach"],["data-keep-original-source","keepOriginalSource"],["data-measure-performance","measurePerformance"],["data-show-missing-icons","showMissingIcons"]].forEach(t=>{let[n,r]=t;const i=Vk(Bk(n));i!=null&&(_i[r]=i)});const nw={styleDefault:"solid",familyDefault:"classic",cssPrefix:Jg,replacementClass:Zg,autoReplaceSvg:!0,autoAddCss:!0,autoA11y:!0,searchPseudoElements:!1,observeMutations:!0,mutateApproach:"async",keepOriginalSource:!0,measurePerformance:!1,showMissingIcons:!0};_i.familyPrefix&&(_i.cssPrefix=_i.familyPrefix);const Kr={...nw,..._i};Kr.autoReplaceSvg||(Kr.observeMutations=!1);const B={};Object.keys(nw).forEach(e=>{Object.defineProperty(B,e,{enumerable:!0,set:function(t){Kr[e]=t,Ii.forEach(n=>n(B))},get:function(){return Kr[e]}})});Object.defineProperty(B,"familyPrefix",{enumerable:!0,set:function(e){Kr.cssPrefix=e,Ii.forEach(t=>t(B))},get:function(){return Kr.cssPrefix}});_n.FontAwesomeConfig=B;const Ii=[];function Hk(e){return Ii.push(e),()=>{Ii.splice(Ii.indexOf(e),1)}}const fn=du,zt={size:16,x:0,y:0,rotate:0,flipX:!1,flipY:!1};function Wk(e){if(!e||!ln)return;const t=me.createElement("style");t.setAttribute("type","text/css"),t.innerHTML=e;const n=me.head.childNodes;let r=null;for(let i=n.length-1;i>-1;i--){const a=n[i],o=(a.tagName||"").toUpperCase();["STYLE","LINK"].indexOf(o)>-1&&(r=a)}return me.head.insertBefore(t,r),e}const Gk="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";function $i(){let e=12,t="";for(;e-- >0;)t+=Gk[Math.random()*62|0];return t}function $r(e){const t=[];for(let n=(e||[]).length>>>0;n--;)t[n]=e[n];return t}function Bc(e){return e.classList?$r(e.classList):(e.getAttribute("class")||"").split(" ").filter(t=>t)}function rw(e){return"".concat(e).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}function qk(e){return Object.keys(e||{}).reduce((t,n)=>t+"".concat(n,'="').concat(rw(e[n]),'" '),"").trim()}function $o(e){return Object.keys(e||{}).reduce((t,n)=>t+"".concat(n,": ").concat(e[n].trim(),";"),"")}function Vc(e){return e.size!==zt.size||e.x!==zt.x||e.y!==zt.y||e.rotate!==zt.rotate||e.flipX||e.flipY}function Kk(e){let{transform:t,containerWidth:n,iconWidth:r}=e;const i={transform:"translate(".concat(n/2," 256)")},a="translate(".concat(t.x*32,", ").concat(t.y*32,") "),o="scale(".concat(t.size/16*(t.flipX?-1:1),", ").concat(t.size/16*(t.flipY?-1:1),") "),s="rotate(".concat(t.rotate," 0 0)"),l={transform:"".concat(a," ").concat(o," ").concat(s)},u={transform:"translate(".concat(r/2*-1," -256)")};return{outer:i,inner:l,path:u}}function Xk(e){let{transform:t,width:n=du,height:r=du,startCentered:i=!1}=e,a="";return i&&qg?a+="translate(".concat(t.x/fn-n/2,"em, ").concat(t.y/fn-r/2,"em) "):i?a+="translate(calc(-50% + ".concat(t.x/fn,"em), calc(-50% + ").concat(t.y/fn,"em)) "):a+="translate(".concat(t.x/fn,"em, ").concat(t.y/fn,"em) "),a+="scale(".concat(t.size/fn*(t.flipX?-1:1),", ").concat(t.size/fn*(t.flipY?-1:1),") "),a+="rotate(".concat(t.rotate,"deg) "),a}var Qk=`:root, :host {
|
| 727 |
--fa-font-solid: normal 900 1em/1 "Font Awesome 6 Free";
|
| 728 |
--fa-font-regular: normal 400 1em/1 "Font Awesome 6 Free";
|