@fugood/buttress-server-poc 2.23.0-beta.34 → 2.23.0-beta.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/sample-iq9-cpu.toml +4 -2
- package/config/sample.toml +1 -0
- package/lib/index.js +1 -1
- package/package.json +3 -3
|
@@ -15,13 +15,15 @@ cache_dir = "./.buttress-cache"
|
|
|
15
15
|
# huggingface_token = "hf_xx"
|
|
16
16
|
|
|
17
17
|
# Global model params
|
|
18
|
-
|
|
18
|
+
n_batch = 512
|
|
19
|
+
n_ubatch = 512
|
|
20
|
+
flash_attn_type = "on"
|
|
19
21
|
cache_type_k = "f16"
|
|
20
22
|
cache_type_v = "f16"
|
|
21
23
|
cpu_mask = "0xfc"
|
|
22
24
|
cpu_strict = true
|
|
23
25
|
n_threads = 6
|
|
24
|
-
|
|
26
|
+
kv_unified = true
|
|
25
27
|
|
|
26
28
|
# Session state cache for ggml-llm (saves KV cache to disk for prompt reuse)
|
|
27
29
|
[runtime.session_cache]
|
package/config/sample.toml
CHANGED
package/lib/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createRequire as e}from"node:module";const t=e(import.meta.url);import{initTRPC as n}from"@trpc/server";import{z as o}from"zod";import{gguf as r}from"@huggingface/gguf";import{getBackendDevicesInfo as a,isLibVariantAvailable as i,loadModel as s}from"@fugood/llama.node";import{initWhisper as l}from"@fugood/whisper.node";import{default as c}from"@iarna/toml";var u,d,p={285:e=>{e.exports=function(e,t){if("string"==typeof e)return i(e);if("number"==typeof e)return a(e,t);return null},e.exports.format=a,e.exports.parse=i;var t=/\B(?=(\d{3})+(?!\d))/g,n=/(?:\.0*|(\.[^0]+)0+)$/,o={b:1,kb:1024,mb:1<<20,gb:1<<30,tb:Math.pow(1024,4),pb:Math.pow(1024,5)},r=/^((-|\+)?(\d+(?:\.\d+)?)) *(kb|mb|gb|tb|pb)$/i;function a(e,r){if(!Number.isFinite(e))return null;var a=Math.abs(e),i=r&&r.thousandsSeparator||"",s=r&&r.unitSeparator||"",l=r&&void 0!==r.decimalPlaces?r.decimalPlaces:2,c=Boolean(r&&r.fixedDecimals),u=r&&r.unit||"";u&&o[u.toLowerCase()]||(u=a>=o.pb?"PB":a>=o.tb?"TB":a>=o.gb?"GB":a>=o.mb?"MB":a>=o.kb?"KB":"B");var d=(e/o[u.toLowerCase()]).toFixed(l);return c||(d=d.replace(n,"$1")),i&&(d=d.split(".").map(function(e,n){return 0===n?e.replace(t,i):e}).join(".")),d+s+u}function i(e){if("number"==typeof e&&!isNaN(e))return e;if("string"!=typeof e)return null;var t,n=r.exec(e),a="b";return n?(t=parseFloat(n[1]),a=n[4].toLowerCase()):(t=parseInt(e,10),a="b"),isNaN(t)?null:Math.floor(o[a]*t)}}},m={};function f(e){var t=m[e];if(void 0!==t)return t.exports;var n=m[e]={exports:{}};return p[e](n,n.exports,f),n.exports}d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if("object"==typeof e&&e){if(4&t&&e.__esModule)return e;if(16&t&&"function"==typeof e.then)return e}var n=Object.create(null);f.r(n);var o={};u=u||[null,d({}),d([]),d(d)];for(var r=2&t&&e;("object"==typeof r||"function"==typeof r)&&!~u.indexOf(r);r=d(r))Object.getOwnPropertyNames(r).forEach(t=>o[t]=()=>e[t]);return o.default=()=>e,f.d(n,o),n},f.d=(e,t)=>{for(var n in t)f.o(t,n)&&!f.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},f.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var h={};f.r(h),f.d(h,{finalizeGenerator:()=>ur,generatorRegistry:()=>ir,getCapabilities:()=>Qo,getModelIdentifier:()=>mr,ggmlLlm:()=>dr,ggmlStt:()=>pr,globalDownloadManager:()=>sr,showModelsTable:()=>nr,showSttModelsTable:()=>rr,startGenerator:()=>cr,startModelDownload:()=>hr,status:()=>fr,testGgmlLlmCapabilities:()=>or,testGgmlSttCapabilities:()=>ar});const y=t("node:fs/promises"),g=t("node:path"),b=t("node:url"),w={PARSE_ERROR:-32700,BAD_REQUEST:-32600,INTERNAL_SERVER_ERROR:-32603,NOT_IMPLEMENTED:-32603,BAD_GATEWAY:-32603,SERVICE_UNAVAILABLE:-32603,GATEWAY_TIMEOUT:-32603,UNAUTHORIZED:-32001,PAYMENT_REQUIRED:-32002,FORBIDDEN:-32003,NOT_FOUND:-32004,METHOD_NOT_SUPPORTED:-32005,TIMEOUT:-32008,CONFLICT:-32009,PRECONDITION_FAILED:-32012,PAYLOAD_TOO_LARGE:-32013,UNSUPPORTED_MEDIA_TYPE:-32015,UNPROCESSABLE_CONTENT:-32022,PRECONDITION_REQUIRED:-32028,TOO_MANY_REQUESTS:-32029,CLIENT_CLOSED_REQUEST:-32099},v={[-32700]:"PARSE_ERROR",[-32600]:"BAD_REQUEST",[-32603]:"INTERNAL_SERVER_ERROR",[-32001]:"UNAUTHORIZED",[-32002]:"PAYMENT_REQUIRED",[-32003]:"FORBIDDEN",[-32004]:"NOT_FOUND",[-32005]:"METHOD_NOT_SUPPORTED",[-32008]:"TIMEOUT",[-32009]:"CONFLICT",[-32012]:"PRECONDITION_FAILED",[-32013]:"PAYLOAD_TOO_LARGE",[-32015]:"UNSUPPORTED_MEDIA_TYPE",[-32022]:"UNPROCESSABLE_CONTENT",[-32028]:"PRECONDITION_REQUIRED",[-32029]:"TOO_MANY_REQUESTS",[-32099]:"CLIENT_CLOSED_REQUEST"};function _(e){return!!e&&!Array.isArray(e)&&"object"==typeof e}const x="function"==typeof Symbol&&!!Symbol.asyncIterator;function S(e){return x&&_(e)&&Symbol.asyncIterator in e}const C=e=>e();function k(e){return e}var T=Object.create,M=Object.defineProperty,E=Object.getOwnPropertyDescriptor,$=Object.getOwnPropertyNames,B=Object.getPrototypeOf,I=Object.prototype.hasOwnProperty,O=(e,t)=>function(){return t||(0,e[$(e)[0]])((t={exports:{}}).exports,t),t.exports},N=(e,t,n)=>(n=null!=e?T(B(e)):{},((e,t,n,o)=>{if(t&&"object"==typeof t||"function"==typeof t)for(var r,a=$(t),i=0,s=a.length;i<s;i++)r=a[i],I.call(e,r)||r===n||M(e,r,{get:(e=>t[e]).bind(null,r),enumerable:!(o=E(t,r))||o.enumerable});return e})(!t&&e&&e.__esModule?n:M(n,"default",{value:e,enumerable:!0}),e));const P={PARSE_ERROR:400,BAD_REQUEST:400,UNAUTHORIZED:401,PAYMENT_REQUIRED:402,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_SUPPORTED:405,TIMEOUT:408,CONFLICT:409,PRECONDITION_FAILED:412,PAYLOAD_TOO_LARGE:413,UNSUPPORTED_MEDIA_TYPE:415,UNPROCESSABLE_CONTENT:422,PRECONDITION_REQUIRED:428,TOO_MANY_REQUESTS:429,CLIENT_CLOSED_REQUEST:499,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504};function q(e){var t;return null!==(t=P[e])&&void 0!==t?t:500}function z(e){return q(e.code)}var D=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/typeof.js"(e,t){function n(e){return t.exports=n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t.exports.__esModule=!0,t.exports.default=t.exports,n(e)}t.exports=n,t.exports.__esModule=!0,t.exports.default=t.exports}}),A=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPrimitive.js"(e,t){var n=D().default;t.exports=function(e,t){if("object"!=n(e)||!e)return e;var o=e[Symbol.toPrimitive];if(void 0!==o){var r=o.call(e,t||"default");if("object"!=n(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)},t.exports.__esModule=!0,t.exports.default=t.exports}}),F=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPropertyKey.js"(e,t){var n=D().default,o=A();t.exports=function(e){var t=o(e,"string");return"symbol"==n(t)?t:t+""},t.exports.__esModule=!0,t.exports.default=t.exports}}),R=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js"(e,t){var n=F();t.exports=function(e,t,o){return(t=n(t))in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e},t.exports.__esModule=!0,t.exports.default=t.exports}}),U=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/objectSpread2.js"(e,t){var n=R();function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,o)}return n}t.exports=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach(function(t){n(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e},t.exports.__esModule=!0,t.exports.default=t.exports}}),j=N(U(),1);function L(e){const{path:t,error:n,config:o}=e,{code:r}=e.error,a={message:n.message,code:w[r],data:{code:r,httpStatus:z(n)}};return o.isDev&&"string"==typeof e.error.stack&&(a.data.stack=e.error.stack),"string"==typeof t&&(a.data.path=t),o.errorFormatter((0,j.default)((0,j.default)({},e),{},{shape:a}))}var G=N(R(),1),H=class extends Error{};function J(e){if(e instanceof V)return e;if(e instanceof Error&&"TRPCError"===e.name)return e;const t=new V({code:"INTERNAL_SERVER_ERROR",cause:e});return e instanceof Error&&e.stack&&(t.stack=e.stack),t}var V=class extends Error{constructor(e){var t,n,o;const r=function(e){if(e instanceof Error)return e;const t=typeof e;return"undefined"!==t&&"function"!==t&&null!==e?"object"!==t?new Error(String(e)):_(e)?Object.assign(new H,e):void 0:void 0}(e.cause);super(null!==(t=null!==(n=e.message)&&void 0!==n?n:null==r?void 0:r.message)&&void 0!==t?t:e.code,{cause:r}),(0,G.default)(this,"cause",void 0),(0,G.default)(this,"code",void 0),this.code=e.code,this.name="TRPCError",null!==(o=this.cause)&&void 0!==o||(this.cause=r)}},K=N(U(),1);function Y(e,t){return"error"in t?(0,K.default)((0,K.default)({},t),{},{error:e.transformer.output.serialize(t.error)}):"data"in t.result?(0,K.default)((0,K.default)({},t),{},{result:(0,K.default)((0,K.default)({},t.result),{},{data:e.transformer.output.serialize(t.result.data)})}):t}function W(e,t){return Array.isArray(t)?t.map(t=>Y(e,t)):Y(e,t)}Error;N(U(),1);async function Q(e,t){const{_def:n}=e;let o=n.procedures[t];for(;!o;){const e=Object.keys(n.lazy).find(e=>t.startsWith(e));if(!e)return null;const r=n.lazy[e];await r.load(),o=n.procedures[t]}return o}const Z=Symbol();function X(e){return Array.isArray(e)&&e[2]===Z}function ee(e){return"object"==typeof e&&null!==e&&"subscribe"in e}function te(e){const t={subscribe(t){let n=null,o=!1,r=!1,a=!1;function i(){null!==n?r||(r=!0,"function"==typeof n?n():n&&n.unsubscribe()):a=!0}return n=e({next(e){var n;o||null===(n=t.next)||void 0===n||n.call(t,e)},error(e){var n;o||(o=!0,null===(n=t.error)||void 0===n||n.call(t,e),i())},complete(){var e;o||(o=!0,null===(e=t.complete)||void 0===e||e.call(t),i())}}),a&&i(),{unsubscribe:i}},pipe:(...e)=>e.reduce(ne,t)};return t}function ne(e,t){return t(e)}function oe(e,t){const n=function(e,t){let n=null;const o=()=>{null==n||n.unsubscribe(),n=null,t.removeEventListener("abort",o)};return new ReadableStream({start(r){n=e.subscribe({next(e){r.enqueue({ok:!0,value:e})},error(e){r.enqueue({ok:!1,error:e}),r.close()},complete(){r.close()}}),t.aborted?o():t.addEventListener("abort",o,{once:!0})},cancel(){o()}})}(e,t),o=n.getReader(),r={async next(){const e=await o.read();if(e.done)return{value:void 0,done:!0};const{value:t}=e;if(!t.ok)throw t.error;return{value:t.value,done:!1}},return:async()=>(await o.cancel(),{value:void 0,done:!0})};return{[Symbol.asyncIterator]:()=>r}}function re(e){let t;try{t=JSON.parse(e)}catch(e){throw new V({code:"PARSE_ERROR",message:"Not JSON-parsable query params",cause:e})}return function(e){try{if(null===e)return null;if(!_(e))throw new Error("Expected object");const t=Object.entries(e).filter(([e,t])=>"string"!=typeof t);if(t.length>0)throw new Error(`Expected connectionParams to be string values. Got ${t.map(([e,t])=>`${e}: ${typeof t}`).join(", ")}`);return e}catch(e){throw new V({code:"PARSE_ERROR",message:"Invalid connection params shape",cause:e})}}(t)}var ae=N(U(),1);function ie(e){let t=null;const n=Symbol.for("@trpc/server/http/memo");let o=n;return{read:async()=>{var r;return o!==n||(null!==(r=t)&&void 0!==r||(t=e().catch(e=>{if(e instanceof V)throw e;throw new V({code:"BAD_REQUEST",message:e instanceof Error?e.message:"Invalid input",cause:e})})),o=await t,t=null),o},result:()=>o!==n?o:void 0}}const se={isMatch(e){var t;return!!(null===(t=e.headers.get("content-type"))||void 0===t?void 0:t.startsWith("application/json"))},async parse(e){var t;const{req:n}=e,o="1"===e.searchParams.get("batch"),r=o?e.path.split(","):[e.path],a=ie(async()=>{let t;if("GET"===n.method){const n=e.searchParams.get("input");n&&(t=JSON.parse(n))}else t=await n.json();if(void 0===t)return{};if(!o)return{0:e.router._def._config.transformer.input.deserialize(t)};if(!_(t))throw new V({code:"BAD_REQUEST",message:'"input" needs to be an object when doing a batch call'});const a={};for(const n of r.keys()){const o=t[n];void 0!==o&&(a[n]=e.router._def._config.transformer.input.deserialize(o))}return a}),i=await Promise.all(r.map(async(t,n)=>{const o=await Q(e.router,t);return{path:t,procedure:o,getRawInput:async()=>{let t=(await a.read())[n];if("subscription"===(null==o?void 0:o._def.type)){var r,i;const n=null!==(r=null!==(i=e.headers.get("last-event-id"))&&void 0!==i?i:e.searchParams.get("lastEventId"))&&void 0!==r?r:e.searchParams.get("Last-Event-Id");if(n)if(_(t))t=(0,ae.default)((0,ae.default)({},t),{},{lastEventId:n});else{var s;null!==(s=t)&&void 0!==s||(t={lastEventId:n})}}return t},result:()=>{var e;return null===(e=a.result())||void 0===e?void 0:e[n]}}})),s=new Set(i.map(e=>{var t;return null===(t=e.procedure)||void 0===t?void 0:t._def.type}).filter(Boolean));if(s.size>1)throw new V({code:"BAD_REQUEST",message:`Cannot mix procedure types in call: ${Array.from(s).join(", ")}`});const l=null!==(t=s.values().next().value)&&void 0!==t?t:"unknown",c=e.searchParams.get("connectionParams");return{isBatchCall:o,accept:n.headers.get("trpc-accept"),calls:i,type:l,connectionParams:null===c?null:re(c),signal:n.signal,url:e.url}}},le=[se,{isMatch(e){var t;return!!(null===(t=e.headers.get("content-type"))||void 0===t?void 0:t.startsWith("multipart/form-data"))},async parse(e){const{req:t}=e;if("POST"!==t.method)throw new V({code:"METHOD_NOT_SUPPORTED",message:"Only POST requests are supported for multipart/form-data requests"});const n=ie(async()=>await t.formData()),o=await Q(e.router,e.path);return{accept:null,calls:[{path:e.path,getRawInput:n.read,result:n.result,procedure:o}],isBatchCall:!1,type:"mutation",connectionParams:null,signal:t.signal,url:e.url}}},{isMatch(e){var t;return!!(null===(t=e.headers.get("content-type"))||void 0===t?void 0:t.startsWith("application/octet-stream"))},async parse(e){const{req:t}=e;if("POST"!==t.method)throw new V({code:"METHOD_NOT_SUPPORTED",message:"Only POST requests are supported for application/octet-stream requests"});const n=ie(async()=>t.body);return{calls:[{path:e.path,getRawInput:n.read,result:n.result,procedure:await Q(e.router,e.path)}],isBatchCall:!1,accept:null,type:"mutation",connectionParams:null,signal:t.signal,url:e.url}}}];async function ce(e){const t=function(e){const t=le.find(t=>t.isMatch(e));if(t)return t;if(!t&&"GET"===e.method)return se;throw new V({code:"UNSUPPORTED_MEDIA_TYPE",message:e.headers.has("content-type")?`Unsupported content-type "${e.headers.get("content-type")}`:"Missing content-type header"})}(e.req);return await t.parse(e)}function ue(e){return _(e)&&"AbortError"===e.name}function de(e="AbortError"){throw new DOMException(e,"AbortError")}function pe(e){return"[object Object]"===Object.prototype.toString.call(e)}var me=N(R(),1);let fe;const he=new WeakMap,ye=()=>{};fe=Symbol.toStringTag;var ge,be,we,ve,_e=class e{constructor(e){(0,me.default)(this,"promise",void 0),(0,me.default)(this,"subscribers",[]),(0,me.default)(this,"settlement",null),(0,me.default)(this,fe,"Unpromise"),this.promise="function"==typeof e?new Promise(e):e;const t=this.promise.then(e=>{const{subscribers:t}=this;this.subscribers=null,this.settlement={status:"fulfilled",value:e},null==t||t.forEach(({resolve:t})=>{t(e)})});"catch"in t&&t.catch(e=>{const{subscribers:t}=this;this.subscribers=null,this.settlement={status:"rejected",reason:e},null==t||t.forEach(({reject:t})=>{t(e)})})}subscribe(){let e,t;const{settlement:n}=this;if(null===n){if(null===this.subscribers)throw new Error("Unpromise settled but still has subscribers");const n=function(){let e,t;const n=new Promise((n,o)=>{e=n,t=o});return{promise:n,resolve:e,reject:t}}();this.subscribers=(o=this.subscribers,r=n,[...o,r]),e=n.promise,t=()=>{null!==this.subscribers&&(this.subscribers=function(e,t){const n=e.indexOf(t);return-1!==n?function(e,t){return[...e.slice(0,t),...e.slice(t+1)]}(e,n):e}(this.subscribers,n))}}else{const{status:o}=n;e="fulfilled"===o?Promise.resolve(n.value):Promise.reject(n.reason),t=ye}var o,r;return Object.assign(e,{unsubscribe:t})}then(e,t){const n=this.subscribe(),{unsubscribe:o}=n;return Object.assign(n.then(e,t),{unsubscribe:o})}catch(e){const t=this.subscribe(),{unsubscribe:n}=t;return Object.assign(t.catch(e),{unsubscribe:n})}finally(e){const t=this.subscribe(),{unsubscribe:n}=t;return Object.assign(t.finally(e),{unsubscribe:n})}static proxy(t){const n=e.getSubscribablePromise(t);return void 0!==n?n:e.createSubscribablePromise(t)}static createSubscribablePromise(t){const n=new e(t);return he.set(t,n),he.set(n,n),n}static getSubscribablePromise(e){return he.get(e)}static resolve(t){const n="object"==typeof t&&null!==t&&"then"in t&&"function"==typeof t.then?t:Promise.resolve(t);return e.proxy(n).subscribe()}static async any(t){const n=(Array.isArray(t)?t:[...t]).map(e.resolve);try{return await Promise.any(n)}finally{n.forEach(({unsubscribe:e})=>{e()})}}static async race(t){const n=(Array.isArray(t)?t:[...t]).map(e.resolve);try{return await Promise.race(n)}finally{n.forEach(({unsubscribe:e})=>{e()})}}static async raceReferences(e){const t=e.map(xe);try{return await Promise.race(t)}finally{for(const e of t)e.unsubscribe()}}};function xe(e){return _e.proxy(e).then(()=>[e])}function Se(e,t){const n=e,o=n[Symbol.dispose];return n[Symbol.dispose]=()=>{t(),null==o||o()},n}function Ce(e,t){const n=e,o=n[Symbol.asyncDispose];return n[Symbol.asyncDispose]=async()=>{await t(),await(null==o?void 0:o())},n}null!==(be=(ge=Symbol).dispose)&&void 0!==be||(ge.dispose=Symbol()),null!==(ve=(we=Symbol).asyncDispose)&&void 0!==ve||(we.asyncDispose=Symbol());const ke=Symbol();function Te(e){let t=null;return Se({start(){if(t)throw new Error("Timer already started");return new Promise(n=>{t=setTimeout(()=>n(ke),e)})}},()=>{t&&clearTimeout(t)})}var Me=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/usingCtx.js"(e,t){t.exports=function(){var e="function"==typeof SuppressedError?SuppressedError:function(e,t){var n=Error();return n.name="SuppressedError",n.error=e,n.suppressed=t,n},t={},n=[];function o(e,t){if(null!=t){if(Object(t)!==t)throw new TypeError("using declarations can only be used with objects, functions, null, or undefined.");if(e)var o=t[Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose")];if(void 0===o&&(o=t[Symbol.dispose||Symbol.for("Symbol.dispose")],e))var r=o;if("function"!=typeof o)throw new TypeError("Object is not disposable.");r&&(o=function(){try{r.call(t)}catch(e){return Promise.reject(e)}}),n.push({v:t,d:o,a:e})}else e&&n.push({d:t,a:e});return t}return{e:t,u:o.bind(null,!1),a:o.bind(null,!0),d:function(){var o,r=this.e,a=0;function i(){for(;o=n.pop();)try{if(!o.a&&1===a)return a=0,n.push(o),Promise.resolve().then(i);if(o.d){var e=o.d.call(o.v);if(o.a)return a|=2,Promise.resolve(e).then(i,s)}else a|=1}catch(e){return s(e)}if(1===a)return r!==t?Promise.reject(r):Promise.resolve();if(r!==t)throw r}function s(n){return r=r!==t?new e(n,r):n,i()}return i()}}},t.exports.__esModule=!0,t.exports.default=t.exports}}),Ee=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/OverloadYield.js"(e,t){t.exports=function(e,t){this.v=e,this.k=t},t.exports.__esModule=!0,t.exports.default=t.exports}}),$e=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/awaitAsyncGenerator.js"(e,t){var n=Ee();t.exports=function(e){return new n(e,0)},t.exports.__esModule=!0,t.exports.default=t.exports}}),Be=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/wrapAsyncGenerator.js"(e,t){var n=Ee();function o(e){var t,o;function r(t,o){try{var i=e[t](o),s=i.value,l=s instanceof n;Promise.resolve(l?s.v:s).then(function(n){if(l){var o="return"===t?"return":"next";if(!s.k||n.done)return r(o,n);n=e[o](n).value}a(i.done?"return":"normal",n)},function(e){r("throw",e)})}catch(e){a("throw",e)}}function a(e,n){switch(e){case"return":t.resolve({value:n,done:!0});break;case"throw":t.reject(n);break;default:t.resolve({value:n,done:!1})}(t=t.next)?r(t.key,t.arg):o=null}this._invoke=function(e,n){return new Promise(function(a,i){var s={key:e,arg:n,resolve:a,reject:i,next:null};o?o=o.next=s:(t=o=s,r(e,n))})},"function"!=typeof e.return&&(this.return=void 0)}o.prototype["function"==typeof Symbol&&Symbol.asyncIterator||"@@asyncIterator"]=function(){return this},o.prototype.next=function(e){return this._invoke("next",e)},o.prototype.throw=function(e){return this._invoke("throw",e)},o.prototype.return=function(e){return this._invoke("return",e)},t.exports=function(e){return function(){return new o(e.apply(this,arguments))}},t.exports.__esModule=!0,t.exports.default=t.exports}}),Ie=N(Me(),1),Oe=N($e(),1),Ne=N(Be(),1);function Pe(e){const t=e[Symbol.asyncIterator]();return t[Symbol.asyncDispose]?t:Ce(t,async()=>{var e;await(null===(e=t.return)||void 0===e?void 0:e.call(t))})}function qe(){return(qe=(0,Ne.default)(function*(e,t){try{var n=(0,Ie.default)();const o=n.a(Pe(e)),r=n.u(Te(t.maxDurationMs)).start();let a;for(;;){if(a=yield(0,Oe.default)(_e.race([o.next(),r])),a===ke&&de(),a.done)return a;yield a.value,a=null}}catch(e){n.e=e}finally{yield(0,Oe.default)(n.d())}})).apply(this,arguments)}function ze(){return(ze=(0,Ne.default)(function*(e,t){try{var n=(0,Ie.default)();const o=n.a(Pe(e));let r;const a=n.u(Te(t.gracePeriodMs));let i=t.count,s=new Promise(()=>{});for(;;){if(r=yield(0,Oe.default)(_e.race([o.next(),s])),r===ke&&de(),r.done)return r.value;yield r.value,0===--i&&(s=a.start()),r=null}}catch(e){n.e=e}finally{yield(0,Oe.default)(n.d())}})).apply(this,arguments)}function De(){let e,t;return{promise:new Promise((n,o)=>{e=n,t=o}),resolve:e,reject:t}}var Ae=N(Me(),1),Fe=N($e(),1),Re=N(Be(),1);function Ue(){let e="idle",t=De();const n=[],o=new Set,r=[];function a(n){if("pending"!==e)return;const a=function(e,t){const n=e[Symbol.asyncIterator]();let o="idle";function r(){o="done",t=()=>{}}return{pull:function(){"idle"===o&&(o="pending",n.next().then(e=>{if(e.done)return o="done",t({status:"return",value:e.value}),void r();o="idle",t({status:"yield",value:e.value})}).catch(e=>{t({status:"error",error:e}),r()}))},destroy:async()=>{var e;r(),await(null===(e=n.return)||void 0===e?void 0:e.call(n))}}}(n,n=>{if("pending"===e){switch(n.status){case"yield":r.push([a,n]);break;case"return":o.delete(a);break;case"error":r.push([a,n]),o.delete(a)}t.resolve()}});o.add(a),a.pull()}return{add(t){switch(e){case"idle":n.push(t);break;case"pending":a(t)}},[Symbol.asyncIterator]:()=>(0,Re.default)(function*(){try{var i=(0,Ae.default)();if("idle"!==e)throw new Error("Cannot iterate twice");e="pending";i.a(Ce({},async()=>{e="done";const n=[];if(await Promise.all(Array.from(o.values()).map(async e=>{try{await e.destroy()}catch(e){n.push(e)}})),r.length=0,o.clear(),t.resolve(),n.length>0)throw new AggregateError(n)}));for(;n.length>0;)a(n.shift());for(;o.size>0;){for(yield(0,Fe.default)(t.promise);r.length>0;){const[e,t]=r.shift();switch(t.status){case"yield":yield t.value,e.pull();break;case"error":throw t.error}}t=De()}}catch(e){i.e=e}finally{yield(0,Fe.default)(i.d())}})()}}function je(e){const t=e[Symbol.asyncIterator]();return new ReadableStream({async cancel(){var e;await(null===(e=t.return)||void 0===e?void 0:e.call(t))},async pull(e){const n=await t.next();n.done?e.close():e.enqueue(n.value)}})}var Le=N(Me(),1),Ge=N($e(),1),He=N(Be(),1);const Je=Symbol("ping");function Ve(e,t){return Ke.apply(this,arguments)}function Ke(){return(Ke=(0,He.default)(function*(e,t){try{var n=(0,Le.default)();const r=n.a(Pe(e));let a,i=r.next();for(;;)try{var o=(0,Le.default)();const e=o.u(Te(t));if(a=yield(0,Ge.default)(_e.race([i,e.start()])),a===ke){yield Je;continue}if(a.done)return a.value;i=r.next(),yield a.value,a=null}catch(e){o.e=e}finally{o.d()}}catch(e){n.e=e}finally{yield(0,Ge.default)(n.d())}})).apply(this,arguments)}var Ye=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/asyncIterator.js"(e,t){function n(e){function t(e){if(Object(e)!==e)return Promise.reject(new TypeError(e+" is not an object."));var t=e.done;return Promise.resolve(e.value).then(function(e){return{value:e,done:t}})}return(n=function(e){this.s=e,this.n=e.next}).prototype={s:null,n:null,next:function(){return t(this.n.apply(this.s,arguments))},return:function(e){var n=this.s.return;return void 0===n?Promise.resolve({value:e,done:!0}):t(n.apply(this.s,arguments))},throw:function(e){var n=this.s.return;return void 0===n?Promise.reject(e):t(n.apply(this.s,arguments))}},new n(e)}t.exports=function(e){var t,o,r,a=2;for("undefined"!=typeof Symbol&&(o=Symbol.asyncIterator,r=Symbol.iterator);a--;){if(o&&null!=(t=e[o]))return t.call(e);if(r&&null!=(t=e[r]))return new n(t.call(e));o="@@asyncIterator",r="@@iterator"}throw new TypeError("Object is not async iterable")},t.exports.__esModule=!0,t.exports.default=t.exports}}),We=N($e(),1),Qe=N(Be(),1),Ze=N(Me(),1),Xe=N(Ye(),1);function et(e){return(_(e)||"function"==typeof e)&&"function"==typeof(null==e?void 0:e.then)&&"function"==typeof(null==e?void 0:e.catch)}var tt=class extends Error{constructor(e){super("Max depth reached at path: "+e.join(".")),this.path=e}};function nt(){return nt=(0,Qe.default)(function*(e){const{data:t}=e;let n=0;const o=Ue();function r(e){const t=n++,r=e(t);return o.add(r),t}function a(t,n){return r(function(){var o=(0,Qe.default)(function*(o){const r=s(n);r&&(t.catch(t=>{var o;null===(o=e.onError)||void 0===o||o.call(e,{error:t,path:n})}),t=Promise.reject(r));try{const e=yield(0,We.default)(t);yield[o,0,c(e,n)]}catch(t){var a,i;null===(a=e.onError)||void 0===a||a.call(e,{error:t,path:n}),yield[o,1,null===(i=e.formatError)||void 0===i?void 0:i.call(e,{error:t,path:n})]}});return function(e){return o.apply(this,arguments)}}())}function i(t,n){return r(function(){var o=(0,Qe.default)(function*(o){try{var r=(0,Ze.default)();const l=s(n);if(l)throw l;const u=r.a(Pe(t));try{for(;;){const e=yield(0,We.default)(u.next());if(e.done){yield[o,0,c(e.value,n)];break}yield[o,1,c(e.value,n)]}}catch(t){var a,i;null===(a=e.onError)||void 0===a||a.call(e,{error:t,path:n}),yield[o,2,null===(i=e.formatError)||void 0===i?void 0:i.call(e,{error:t,path:n})]}}catch(e){r.e=e}finally{yield(0,We.default)(r.d())}});return function(e){return o.apply(this,arguments)}}())}function s(t){return e.maxDepth&&t.length>e.maxDepth?new tt(t):null}function l(t,n){if(et(t))return[0,a(t,n)];if(S(t)){if(e.maxDepth&&n.length>=e.maxDepth)throw new Error("Max depth reached");return[1,i(t,n)]}return null}function c(e,t){if(void 0===e)return[[]];const n=l(e,t);if(n)return[[0],[null,...n]];if(!1===pe(o=e)||void 0!==(r=o.constructor)&&(!1===pe(a=r.prototype)||!1===a.hasOwnProperty("isPrototypeOf")))return[[e]];var o,r,a;const i={},s=[];for(const[n,o]of Object.entries(e)){const e=l(o,[...t,n]);e?(i[n]=0,s.push([n,...e])):i[n]=o}return[[i],...s]}const u={};for(const[e,n]of Object.entries(t))u[e]=c(n,[e]);yield u;let d=o;e.pingMs&&(d=Ve(o,e.pingMs));var p,m=!1,f=!1;try{for(var h,y=(0,Xe.default)(d);m=!(h=yield(0,We.default)(y.next())).done;m=!1){const e=h.value;yield e}}catch(e){f=!0,p=e}finally{try{m&&null!=y.return&&(yield(0,We.default)(y.return()))}finally{if(f)throw p}}}),nt.apply(this,arguments)}function ot(e){let t=je(function(e){return nt.apply(this,arguments)}(e));const{serialize:n}=e;return n&&(t=t.pipeThrough(new TransformStream({transform(e,t){e===Je?t.enqueue(Je):t.enqueue(n(e))}}))),t.pipeThrough(new TransformStream({transform(e,t){e===Je?t.enqueue(" "):t.enqueue(JSON.stringify(e)+"\n")}})).pipeThrough(new TextEncoderStream)}Error;var rt=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/asyncGeneratorDelegate.js"(e,t){var n=Ee();t.exports=function(e){var t={},o=!1;function r(t,r){return o=!0,r=new Promise(function(n){n(e[t](r))}),{done:!1,value:new n(r,1)}}return t["undefined"!=typeof Symbol&&Symbol.iterator||"@@iterator"]=function(){return this},t.next=function(e){return o?(o=!1,e):r("next",e)},"function"==typeof e.throw&&(t.throw=function(e){if(o)throw o=!1,e;return r("throw",e)}),"function"==typeof e.return&&(t.return=function(e){return o?(o=!1,e):r("return",e)}),t},t.exports.__esModule=!0,t.exports.default=t.exports}}),at=N(Ye(),1),it=N($e(),1),st=N(Be(),1),lt=N(rt(),1);N(Me(),1);const ct="ping",ut="serialized-error",dt="connected",pt="return";function mt(e){var t,n,o,r,a;const{serialize:i=k}=e,s={enabled:null!==(t=null===(n=e.ping)||void 0===n?void 0:n.enabled)&&void 0!==t&&t,intervalMs:null!==(o=null===(r=e.ping)||void 0===r?void 0:r.intervalMs)&&void 0!==o?o:1e3},l=null!==(a=e.client)&&void 0!==a?a:{};if(s.enabled&&l.reconnectAfterInactivityMs&&s.intervalMs>l.reconnectAfterInactivityMs)throw new Error(`Ping interval must be less than client reconnect interval to prevent unnecessary reconnection - ping.intervalMs: ${s.intervalMs} client.reconnectAfterInactivityMs: ${l.reconnectAfterInactivityMs}`);function c(){return c=(0,st.default)(function*(){yield{event:dt,data:JSON.stringify(l)};let t,n,o=e.data;e.emitAndEndImmediately&&(o=function(e,t){return ze.apply(this,arguments)}(o,{count:1,gracePeriodMs:1})),e.maxDurationMs&&e.maxDurationMs>0&&e.maxDurationMs!==1/0&&(o=function(e,t){return qe.apply(this,arguments)}(o,{maxDurationMs:e.maxDurationMs})),s.enabled&&s.intervalMs!==1/0&&s.intervalMs>0&&(o=Ve(o,s.intervalMs));var r,a=!1,c=!1;try{for(var u,d=(0,at.default)(o);a=!(u=yield(0,it.default)(d.next())).done;a=!1)t=u.value,t!==Je?(n=X(t)?{id:t[0],data:t[1]}:{data:t},n.data=JSON.stringify(i(n.data)),yield n,t=null,n=null):yield{event:ct,data:""}}catch(e){c=!0,r=e}finally{try{a&&null!=d.return&&(yield(0,it.default)(d.return()))}finally{if(c)throw r}}}),c.apply(this,arguments)}function u(){return u=(0,st.default)(function*(){try{yield*(0,lt.default)((0,at.default)(function(){return c.apply(this,arguments)}())),yield{event:pt,data:""}}catch(o){var t,n;if(ue(o))return;const r=J(o),a=null!==(t=null===(n=e.formatError)||void 0===n?void 0:n.call(e,{error:r}))&&void 0!==t?t:null;yield{event:ut,data:JSON.stringify(i(a))}}}),u.apply(this,arguments)}const d=je(function(){return u.apply(this,arguments)}());return d.pipeThrough(new TransformStream({transform(e,t){"event"in e&&t.enqueue(`event: ${e.event}\n`),"data"in e&&t.enqueue(`data: ${e.data}\n`),"id"in e&&t.enqueue(`id: ${e.id}\n`),"comment"in e&&t.enqueue(`: ${e.comment}\n`),t.enqueue("\n\n")}})).pipeThrough(new TextEncoderStream)}const ft={"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform","X-Accel-Buffering":"no",Connection:"keep-alive"};var ht=N(Be(),1),yt=N(U(),1);function gt(e){return C((0,ht.default)(function*(){throw e}))}const bt={mutation:["POST"],query:["GET"],subscription:["GET"]},wt={mutation:["POST"],query:["GET","POST"],subscription:["GET","POST"]};function vt(e){var t,n,o;const{ctx:r,info:a,responseMeta:i,untransformedJSON:s,errors:l=[],headers:c}=e;let u=s?function(e){const t=Array.isArray(e)?e:[e],n=new Set(t.map(e=>{var t;return"error"in e&&_(e.error.data)?"number"==typeof(null===(t=e.error.data)||void 0===t?void 0:t.httpStatus)?e.error.data.httpStatus:q(v[e.error.code]):200}));return 1!==n.size?207:n.values().next().value}(s):200;const d=!s,p=d?[]:Array.isArray(s)?s:[s],m=null!==(t=null==i?void 0:i({ctx:r,info:a,paths:null==a?void 0:a.calls.map(e=>e.path),data:p,errors:l,eagerGeneration:d,type:null!==(n=null==a||null===(o=a.calls.find(e=>{var t;return null===(t=e.procedure)||void 0===t?void 0:t._def.type}))||void 0===o||null===(o=o.procedure)||void 0===o?void 0:o._def.type)&&void 0!==n?n:"unknown"}))&&void 0!==t?t:{};if(m.headers)if(m.headers instanceof Headers)for(const[e,t]of m.headers.entries())c.append(e,t);else for(const[e,t]of Object.entries(m.headers))if(Array.isArray(t))for(const n of t)c.append(e,n);else"string"==typeof t&&c.set(e,t);return m.status&&(u=m.status),{status:u}}function _t(e){return!!_(e)&&(!!S(e)||(Object.values(e).some(et)||Object.values(e).some(S)))}async function xt(e){var t,n,o,r,a,i;const{router:s,req:l}=e,c=new Headers([["vary","trpc-accept"]]),u=s._def._config,d=new URL(l.url);if("HEAD"===l.method)return new Response(null,{status:204});const p=null===(t=null!==(n=e.allowBatching)&&void 0!==n?n:null===(o=e.batching)||void 0===o?void 0:o.enabled)||void 0===t||t,m=null!==(r=e.allowMethodOverride)&&void 0!==r&&r&&"POST"===l.method,f=await C(async()=>{try{return[void 0,await ce({req:l,path:decodeURIComponent(e.path),router:s,searchParams:d.searchParams,headers:e.req.headers,url:d})]}catch(e){return[J(e),void 0]}}),h=C(()=>{let t;return{valueOrUndefined:()=>{if(t)return t[1]},value:()=>{const[e,n]=t;if(e)throw e;return n},create:async n=>{if(t)throw new Error("This should only be called once - report a bug in tRPC");try{const o=await e.createContext({info:n});t=[void 0,o]}catch(e){t=[J(e),void 0]}}}}),y=m?wt:bt,g="application/jsonl"===l.headers.get("trpc-accept"),b=null===(a=null===(i=u.sse)||void 0===i?void 0:i.enabled)||void 0===a||a;try{const[t,n]=f;if(t)throw t;if(n.isBatchCall&&!p)throw new V({code:"BAD_REQUEST",message:"Batching is not enabled on the server"});if(g&&!n.isBatchCall)throw new V({message:"Streaming requests must be batched (you can do a batch of 1)",code:"BAD_REQUEST"});await h.create(n);const o=n.calls.map(async t=>{const o=t.procedure;try{if(e.error)throw e.error;if(!o)throw new V({code:"NOT_FOUND",message:`No procedure found on path "${t.path}"`});if(!y[o._def.type].includes(l.method))throw new V({code:"METHOD_NOT_SUPPORTED",message:`Unsupported ${l.method}-request to ${o._def.type} procedure at path "${t.path}"`});if("subscription"===o._def.type&&n.isBatchCall)throw new V({code:"BAD_REQUEST",message:"Cannot batch subscription calls"});return[void 0,{data:await o({path:t.path,getRawInput:t.getRawInput,ctx:h.value(),type:o._def.type,signal:e.req.signal})}]}catch(n){var r,a,i;const o=J(n),s=t.result();return null===(r=e.onError)||void 0===r||r.call(e,{error:o,path:t.path,input:s,ctx:h.valueOrUndefined(),type:null!==(a=null===(i=t.procedure)||void 0===i?void 0:i._def.type)&&void 0!==a?a:"unknown",req:e.req}),[o,void 0]}});if(!n.isBatchCall){const[t]=n.calls,[r,a]=await o[0];switch(n.type){case"unknown":case"mutation":case"query":{if(c.set("content-type","application/json"),_t(null==a?void 0:a.data))throw new V({code:"UNSUPPORTED_MEDIA_TYPE",message:"Cannot use stream-like response in non-streaming request - use httpBatchStreamLink"});const o=r?{error:L({config:u,ctx:h.valueOrUndefined(),error:r,input:t.result(),path:t.path,type:n.type})}:{result:{data:a.data}},i=vt({ctx:h.valueOrUndefined(),info:n,responseMeta:e.responseMeta,errors:r?[r]:[],headers:c,untransformedJSON:[o]});return new Response(JSON.stringify(W(u,o)),{status:i.status,headers:c})}case"subscription":{const o=C(()=>{if(r)return gt(r);if(!b)return gt(new V({code:"METHOD_NOT_SUPPORTED",message:'Missing experimental flag "sseSubscriptions"'}));if(!ee(a.data)&&!S(a.data))return gt(new V({message:`Subscription ${t.path} did not return an observable or a AsyncGenerator`,code:"INTERNAL_SERVER_ERROR"}));return ee(a.data)?oe(a.data,e.req.signal):a.data}),i=mt((0,yt.default)((0,yt.default)({},u.sse),{},{data:o,serialize:e=>u.transformer.output.serialize(e),formatError(n){var o,r,a;const i=J(n.error),s=null==t?void 0:t.result(),l=null==t?void 0:t.path,c=null!==(o=null==t||null===(r=t.procedure)||void 0===r?void 0:r._def.type)&&void 0!==o?o:"unknown";null===(a=e.onError)||void 0===a||a.call(e,{error:i,path:l,input:s,ctx:h.valueOrUndefined(),req:e.req,type:c});return L({config:u,ctx:h.valueOrUndefined(),error:i,input:s,path:l,type:c})}}));for(const[e,t]of Object.entries(ft))c.set(e,t);const s=vt({ctx:h.valueOrUndefined(),info:n,responseMeta:e.responseMeta,errors:[],headers:c,untransformedJSON:null});return new Response(i,{headers:c,status:s.status})}}}if("application/jsonl"===n.accept){c.set("content-type","application/json"),c.set("transfer-encoding","chunked");const t=vt({ctx:h.valueOrUndefined(),info:n,responseMeta:e.responseMeta,errors:[],headers:c,untransformedJSON:null}),r=ot((0,yt.default)((0,yt.default)({},u.jsonl),{},{maxDepth:1/0,data:o.map(async t=>{const[o,r]=await t,a=n.calls[0];var i,s;if(o)return{error:L({config:u,ctx:h.valueOrUndefined(),error:o,input:a.result(),path:a.path,type:null!==(i=null===(s=a.procedure)||void 0===s?void 0:s._def.type)&&void 0!==i?i:"unknown"})};const l=ee(r.data)?oe(r.data,e.req.signal):Promise.resolve(r.data);return{result:Promise.resolve({data:l})}}),serialize:e=>u.transformer.output.serialize(e),onError:t=>{var o,r;null===(o=e.onError)||void 0===o||o.call(e,{error:J(t),path:void 0,input:void 0,ctx:h.valueOrUndefined(),req:e.req,type:null!==(r=null==n?void 0:n.type)&&void 0!==r?r:"unknown"})},formatError(e){var t,o;const r=null==n?void 0:n.calls[e.path[0]],a=J(e.error),i=null==r?void 0:r.result(),s=null==r?void 0:r.path,l=null!==(t=null==r||null===(o=r.procedure)||void 0===o?void 0:o._def.type)&&void 0!==t?t:"unknown";return L({config:u,ctx:h.valueOrUndefined(),error:a,input:i,path:s,type:l})}}));return new Response(r,{headers:c,status:t.status})}c.set("content-type","application/json");const r=(await Promise.all(o)).map(e=>{const[t,n]=e;return t?e:_t(n.data)?[new V({code:"UNSUPPORTED_MEDIA_TYPE",message:"Cannot use stream-like response in non-streaming request - use httpBatchStreamLink"}),void 0]:e}),a=r.map(([e,t],o)=>{const r=n.calls[o];var a,i;return e?{error:L({config:u,ctx:h.valueOrUndefined(),error:e,input:r.result(),path:r.path,type:null!==(a=null===(i=r.procedure)||void 0===i?void 0:i._def.type)&&void 0!==a?a:"unknown"})}:{result:{data:t.data}}}),i=r.map(([e])=>e).filter(Boolean),s=vt({ctx:h.valueOrUndefined(),info:n,responseMeta:e.responseMeta,untransformedJSON:a,errors:i,headers:c});return new Response(JSON.stringify(W(u,a)),{status:s.status,headers:c})}catch(t){var w;const[n,o]=f,r=h.valueOrUndefined(),{error:a,untransformedJSON:i,body:s}=function(e,t){const{router:n,req:o,onError:r}=t.opts,a=J(e);null==r||r({error:a,path:t.path,input:t.input,ctx:t.ctx,type:t.type,req:o});const i={error:L({config:n._def._config,error:a,type:t.type,path:t.path,input:t.input,ctx:t.ctx})},s=W(n._def._config,i);return{error:a,untransformedJSON:i,body:JSON.stringify(s)}}(t,{opts:e,ctx:h.valueOrUndefined(),type:null!==(w=null==o?void 0:o.type)&&void 0!==w?w:"unknown"}),l=vt({ctx:r,info:o,responseMeta:e.responseMeta,untransformedJSON:i,errors:[a],headers:c});return new Response(s,{status:l.status,headers:c})}}function St(e){try{var t,n;const o=e.headers[":scheme"]&&"https"===e.headers[":scheme"]||e.socket&&"encrypted"in e.socket&&e.socket.encrypted?"https:":"http:",r=null!==(t=null!==(n=e.headers.host)&&void 0!==n?n:e.headers[":authority"])&&void 0!==t?t:"localhost";return new URL(e.url,`${o}//${r}`)}catch(e){throw new V({code:"BAD_REQUEST",message:"Invalid URL",cause:e})}}function Ct(e){const t=new Headers;for(const n in e){const o=e[n];if("string"!=typeof n||!n.startsWith(":"))if(Array.isArray(o))for(const e of o)t.append(n,e);else null!=o&&t.append(n,o)}return t}function kt(e,t,n){const o=new AbortController,r=()=>{t.off("close",r),e.off("aborted",r),o.abort()};t.once("close",r),e.once("aborted",r);const a=St(e),i={headers:Ct(e.headers),method:e.method,signal:o.signal};"GET"!==e.method&&"HEAD"!==e.method&&(i.body=function(e,t){if("body"in e){if(void 0===e.body)return;return"string"==typeof e.body?e.body:JSON.stringify(e.body)}let n=0,o=!1;return new ReadableStream({start(r){const a=s=>{n+=s.length,!t.maxBodySize||n<=t.maxBodySize?r.enqueue(new Uint8Array(s.buffer,s.byteOffset,s.byteLength)):(r.error(new V({code:"PAYLOAD_TOO_LARGE"})),o=!0,e.off("data",a),e.off("end",i))},i=()=>{o||(o=!0,e.off("data",a),e.off("end",i),r.close())};e.on("data",a),e.on("end",i)},cancel(){e.destroy()}})}(e,n),i.duplex="half");return new Request(a,i)}async function Tt(e){const{res:t}=e;try{const n=new WritableStream({async write(e){var n;await async function(e,t){!1===e.write(t)&&await new Promise((t,n)=>{const o=e=>{n(e),a()},r=()=>{t(),a()},a=()=>{e.off("error",o),e.off("drain",r)};e.once("error",o),e.once("drain",r)})}(t,e),null===(n=t.flush)||void 0===n||n.call(t)}});await e.body.pipeTo(n,{signal:e.signal})}catch(e){if(ue(e))return;throw e}}var Mt=N(U(),1);function Et(e){return t=>{var n;const{res:o,req:r}=e,a=J(t),i=L({config:e.router._def._config,error:a,type:"unknown",path:void 0,input:void 0,ctx:void 0});null===(n=e.onError)||void 0===n||n.call(e,{req:r,error:a,type:"unknown",path:void 0,input:void 0,ctx:void 0});const s=W(e.router._def._config,{error:i});o.statusCode=i.data.httpStatus,o.end(JSON.stringify(s))}}async function $t(e){return new Promise(t=>{var n;const o=null!==(n=e.middleware)&&void 0!==n?n:(e,t,n)=>n();return e.res.once("finish",()=>{t()}),o(e.req,e.res,t=>{C(async()=>{var n;const o=kt(e.req,e.res,{maxBodySize:null!==(n=e.maxBodySize)&&void 0!==n?n:null}),r=await xt((0,Mt.default)((0,Mt.default)({},e),{},{req:o,error:t?J(t):null,createContext:async t=>{var n;return await(null===(n=e.createContext)||void 0===n?void 0:n.call(e,(0,Mt.default)((0,Mt.default)({},e),t)))},onError(t){var n;null==e||null===(n=e.onError)||void 0===n||n.call(e,(0,Mt.default)((0,Mt.default)({},t),{},{req:e.req}))}}));await async function(e){const{response:t,rawResponse:n}=e;200===n.statusCode&&(n.statusCode=t.status);for(const[e,o]of t.headers)n.setHeader(e,o);try{t.body&&await Tt({res:n,signal:e.request.signal,body:t.body})}catch(e){throw n.headersSent||(n.statusCode=500),e}finally{n.end()}}({request:o,response:r,rawResponse:e.res})}).catch(Et(e))})})}const Bt=t("http");var It=N(U(),1);function Ot(e){var t;const n=(null!==(t=e.basePath)&&void 0!==t?t:"/").length;return(t,o)=>{let r="";C(async()=>{const a=St(t);r=a.pathname.slice(n),await $t((0,It.default)((0,It.default)({},e),{},{req:t,res:o,path:r}))}).catch(Et((0,It.default)({req:t,res:o,path:r},e)))}}function Nt(e){return Bt.createServer(function(e){return Ot(e)}(e))}const Pt=t("node:os"),qt=t("node:crypto"),zt=1024**3,Dt=(e,t,n)=>Math.min(Math.max(e,t),n),At=e=>e?40:0,Ft=(e=0)=>{if(!e)return 0;return Dt(e/(12*zt)*20,0,20)},Rt=(e=0)=>{if(!e)return 0;return Dt(e/(32*zt)*10,0,10)},Ut=e=>e?10:0,jt=(e="default",t=null)=>{const n=String(e).toLowerCase();if(!n)return 0;if(n.includes("cuda"))return 20;if(n.includes("vulkan"))return 10;if(n.includes("default")){return"darwin"===t||"ios"===t?15:5}return 0},Lt=({platform:e,variant:t,hasGpu:n,gpuUsableBytes:o=0,cpuUsableBytes:r=0,ok:a=!0}={})=>{if(!a)return 0;const i=At(n)+jt(t,e)+Ft(o),s=Rt(r),l=Ut(a);return Math.min(100,Math.round(i+s+l))},Gt=["cuda","vulkan","snapdragon","default"],Ht=e=>e||0===e?Array.isArray(e)?e.filter(e=>null!=e):[e]:[],Jt=e=>e&&String(e).trim().toLowerCase()||null,Vt=(e={})=>{const t=String(e.type||e.deviceType||e.kind||"").toLowerCase();return!!t.includes("gpu")||(!!t.includes("cuda")||(!!t.includes("metal")||(!!t.includes("vulkan")||!!t.includes("snapdragon"))))},Kt=({platform:e,totalMemoryInBytes:t,variant:n,devices:o,gpuMemoryFraction:r,cpuMemoryFraction:a,ok:i,error:s})=>{const l=(e=>Array.isArray(e)?e.map(e=>({...e})):[])(((e,t)=>"snapdragon"===e?t.filter(e=>"GPUOpenCL"!==e.deviceName):t)(n,o)),c=l.some(Vt),u=l.filter(e=>Vt(e)&&Number.isFinite(Number(e.maxMemorySize))).reduce((e,t)=>e+t.maxMemorySize,0),d=t,p=c?Math.floor(u*r):0,m=d?Math.floor(d*a):0,f={platform:e,variant:n,hasGpu:c,gpuUsableBytes:p,cpuUsableBytes:m,ok:i},h=Lt(f),y=i?(({platform:e,variant:t,hasGpu:n,gpuUsableBytes:o=0,cpuUsableBytes:r=0,ok:a=!0}={})=>({gpuPresence:At(n),variant:jt(t,e),gpuMemory:Ft(o),cpuMemory:Rt(r),availability:Ut(a)}))(f):null;return{platform:e,ok:i,variant:n,hasGpu:c,devices:l,gpuTotalBytes:u,gpuUsableBytes:p,cpuTotalBytes:d,cpuUsableBytes:m,score:h,breakdown:y,error:s,timestamp:(new Date).toISOString()}},Yt=({device:e,modelBytes:t=0,kvCacheBytes:n=0}={})=>{if(!e)return{totalRequiredBytes:t+n,fitsInGpu:!1,fitsInCpu:!1,limiting:"unknown-device"};const o=Math.max(0,Number(t)||0)+Math.max(0,Number(n)||0),r=e.hasGpu&&o>0&&o<=e.gpuUsableBytes,a=o>0&&o<=e.cpuUsableBytes;let i="ok";return!r&&e.hasGpu&&(i="gpu-memory"),a||(i=r?"cpu-memory":"insufficient-memory"),{totalRequiredBytes:o,fitsInGpu:r,fitsInCpu:a,limiting:i}},Wt=async({platform:e,variant:t=null,preferVariants:n=[],variantPreference:o=[],gpuMemoryFraction:r=.85,cpuMemoryFraction:a=.5,includeBreakdown:i=!1,totalMemoryInBytes:s,modelBytes:l=null,kvCacheBytes:c=null,limitedKvCacheBytes:u=null,dependencies:d={},defaultVariants:p=Gt}={})=>{const{getBackendDevicesInfo:m,isLibVariantAvailable:f}=d;if("function"!=typeof m||"function"!=typeof f)throw new TypeError("GGML capability detection requires getBackendDevicesInfo and isLibVariantAvailable functions");const h=(({variant:e,preferVariants:t=[],variantPreference:n=[],defaultVariants:o=Gt}={})=>{const r=[];e&&r.push(e),r.push(...Ht(t)),r.push(...Ht(n)),r.push(...o);const a=r.map(Jt).filter(Boolean);return Array.from(new Set(a))})({variant:t,preferVariants:n,variantPreference:o,defaultVariants:p}),y=[];for(const t of h)try{if(!await f(t))throw new Error(`Variant ${t} not available on this platform`);const n=await m(t);y.push(Kt({platform:e,totalMemoryInBytes:s,variant:t,devices:n,gpuMemoryFraction:r,cpuMemoryFraction:a,ok:!0}))}catch(n){const o=n instanceof Error?n.message:String(n);y.push(Kt({platform:e,totalMemoryInBytes:s,variant:t,devices:[],gpuMemoryFraction:r,cpuMemoryFraction:a,ok:!1,error:o}))}const g=y.filter(e=>e.ok)[0]||null,b={ok:Boolean(g),selected:g?{...g,breakdown:i?g.breakdown:void 0}:null,attempts:y};if(!i&&b.selected&&delete b.selected.breakdown,!b||!l&&!c)return b;const w=e=>{if(!e)return e;const t=Yt({device:e,modelBytes:l||0,kvCacheBytes:c||0});let n=null;return null!=u&&u!==c&&(n=Yt({device:e,modelBytes:l||0,kvCacheBytes:u})),{...e,fit:t,...n&&{limitedFit:n}}};return b.selected=w(b.selected),b.attempts=Array.isArray(b.attempts)?b.attempts.map(w):b.attempts,b},Qt="ggml-llm",Zt=["cuda","vulkan","default"],Xt=new Map([[Qt,Wt],["ggml-stt",async({platform:e,variant:t=null,preferVariants:n=[],variantPreference:o=[],gpuMemoryFraction:r=.85,cpuMemoryFraction:a=.5,includeBreakdown:i=!1,totalMemoryInBytes:s,modelBytes:l=null,processingBytes:c=null,kvCacheBytes:u=null,dependencies:d={}}={})=>{const p=o&&o.length>0?o:Zt;return Wt({platform:e,variant:t,preferVariants:n,variantPreference:p,gpuMemoryFraction:r,cpuMemoryFraction:a,includeBreakdown:i,totalMemoryInBytes:s,modelBytes:l,kvCacheBytes:c??u,dependencies:d,defaultVariants:Zt})}]]),en=async({platform:e,totalMemoryInBytes:t,backend:n=Qt,dependencies:o,...r}={})=>{const a=Xt.get(n);if(!a)throw new Error(`No capability detector registered for backend "${n}"`);return await a({...r,dependencies:o,totalMemoryInBytes:t,platform:e})},tn={f16:2,f32:4,q8_0:1,q6_k:.75,q5_k:.625,q5_k_m:.625,q5_k_s:.625,q5_1:.625,q5_0:.625,q4_k:.5,q4_k_m:.5,q4_k_s:.5,q4_1:.5,q4_0:.5,iq4_nl:.5},nn=e=>{const t=e?String(e).toLowerCase():"f16";return tn[t]||tn.f16},on=({modelBytes:e=0,audioLengthSeconds:t=30,sampleRate:n=16e3,bytesPerSample:o=4}={})=>{const r=Math.max(0,Number(e)||0),a=Math.max(0,Math.floor(Math.max(0,t)*n*o)),i=1048576,s=1024*i;let l,c,u;l=r<200*i?120*i:r<500*i?140*i:r<2*s?150*i:160*i,c=r<200*i?70*i:r<500*i?135*i:220*i,u=r<100*i?20*i:r<200*i?30*i:r<500*i?85*i:r<2*s?215*i:360*i;const d=l+c+u;return{modelBytes:r,audioBufferBytes:a,processingBufferBytes:d,totalBytes:r+d+a}},rn=e=>e?String(e).trim().toLowerCase():null,an=({arch:e,nLayer:t=0})=>({arch:rn(e),enabled:!1,window:null,pattern:null,denseFirst:!1,type:null,kvLayers:Math.max(0,Math.floor(Number(t)||0)),swaLayers:0}),sn=new Map([["llama4",({nSwa:e})=>{if(0===e)return{enabled:!1};return{enabled:!0,window:e&&e>0?e:8192,pattern:4,type:"chunked"}}],["afmoe",({nSwa:e})=>!e||e<=0?{enabled:!1}:{enabled:!0,window:e,pattern:4,type:"standard"}],["phi3",()=>({enabled:!1})],["gemma2",({nSwa:e})=>{const t=e&&e>0?e:4096;return t?{enabled:!0,window:t,pattern:2,type:"standard"}:{enabled:!1}}],["gemma3",({nSwa:e})=>!e||e<=0?{enabled:!1}:{enabled:!0,window:e,pattern:6,type:"standard"}],["gemma3n",({nLayer:e,nSwa:t})=>!t||t<=0?{enabled:!1}:{enabled:!0,window:t,pattern:5,type:"standard",kvLayers:Math.min(20,e)}],["gemma-embedding",({nSwa:e})=>!e||e<=0?{enabled:!1}:{enabled:!0,window:e,pattern:6,type:"symmetric"}],["cohere2",({nSwa:e})=>!e||e<=0?{enabled:!1}:{enabled:!0,window:e,pattern:4,type:"standard"}],["olmo2",({nSwa:e})=>!e||e<=0?{enabled:!1}:{enabled:!0,window:e,pattern:4,type:"standard"}],["exaone4",({nLayer:e,nSwa:t})=>{let n=null;return t&&t>0?n=t:e>=64&&(n=4096),n?{enabled:!0,window:n,pattern:4,type:"standard"}:{enabled:!1}}],["gpt-oss",({nSwa:e})=>!e||e<=0?{enabled:!1}:{enabled:!0,window:e,pattern:2,type:"standard"}],["smallthinker",({nSwa:e})=>!e||e<=0?{enabled:!1}:{enabled:!0,window:4096,pattern:4,denseFirst:!0,type:"standard"}]]),ln=({arch:e,metadata:t={},nLayer:n=0}={})=>{const o=rn(e||t["general.architecture"]),r=Math.max(0,Math.floor(Number(n)||0)),a=((e={},t=null)=>{if(!e)return null;const n=rn(t),o=n?`${n}.attention.sliding_window`:null,r=(o&&null!=e[o]?e[o]:null)??e["llama.attention.sliding_window"];if(null==r)return null;const a=Number(r);return Number.isFinite(a)?a:null})(t,o),i=o?sn.get(o):null;if(!i)return an({arch:o,nLayer:n});const s=i({nLayer:r,nSwa:a,metadata:t});if(!s||!s.enabled||!s.window||s.window<=0)return an({arch:o,nLayer:n});const l=Math.max(0,Math.floor(Number(s.pattern)||0)),c=null!=s.kvLayers&&Number.isFinite(Number(s.kvLayers))?Number(s.kvLayers):r,u=Math.max(0,Math.floor(c)),d=((e=0,t=0,n=!1)=>{const o=Math.max(0,Math.floor(Number(e)||0)),r=Math.max(0,Math.floor(Number(t)||0));if(!o||1===r)return 0;if(r<=0)return o;const a=Math.max(0,r-1),i=o%r;return Math.floor(o/r)*a+(n?Math.max(0,i-1):Math.min(i,a))})(u,l,Boolean(s.denseFirst));return{arch:o,enabled:d>0,window:s.window,pattern:l,denseFirst:Boolean(s.denseFirst),type:s.type||"standard",kvLayers:u,swaLayers:d}},cn=(e={})=>{const t=e["general.architecture"],n=(t,n=null)=>{const o=e[t],r=Number(o);return Number.isFinite(r)?r:n},o=t?n(`${t}.context_length`,n("llama.context_length")):null,r=t?n(`${t}.block_count`,n("llama.block_count")):null,a=t?n(`${t}.embedding_length`,n("llama.embedding_length")):null,i=t?n(`${t}.attention.head_count`,n("llama.attention.head_count")):null;return{arch:t,nCtxTrain:o,nLayer:r,nEmbd:a,nHead:i,nHeadKv:t?n(`${t}.attention.head_count_kv`,n("llama.attention.head_count_kv",i)):null,nEmbdHeadK:t?n(`${t}.attention.key_length`,n("llama.attention.key_length")):null,nEmbdHeadV:t?n(`${t}.attention.value_length`,n("llama.attention.value_length")):null,quantVersion:e["general.quantization_version"]||null,fileType:e["general.file_type"]||null}},un=({layerCount:e,headKvCount:t,embdHeadKCount:n,embdHeadVCount:o,cacheTypes:r,swaConfig:a,kvUnified:i=!1,nParallel:s=1,swaFull:l=!1})=>{const c=a?.window&&i?Math.max(1,Number(s)||1):1;return i=>((e,t,n,o,r,a={},{totalLayers:i=null,swaLayers:s=0,swaContext:l=null,swaContextMultiplier:c=1,swaAdditionalTokens:u=0,swaFull:d=!1}={})=>{if(!(e&&t&&n&&o&&r))return 0;const p=Number(null!=i&&void 0!==i?i:e),m=Math.max(0,Math.floor(p));if(!m)return 0;const f=nn(a.k),h=nn(a.v),y=Number(n)*(Number(o)*f+Number(r)*h);if(!y)return 0;const g=Math.max(0,Number(t)||0),b=Math.min(m,Math.max(0,Math.floor(Number(s)||0))),w=Math.max(0,m-b),v=(null!=l&&Number.isFinite(Number(l))?Math.max(0,Number(l)):g)*Math.max(1,Number(c)||1)+Math.max(0,Number(u)||0),_=d?g:Math.min(g,v),x=w*g+b*Math.max(0,Math.floor(_));return Math.round(y*x)})(e,i,t,n,o,r,{totalLayers:e,swaLayers:a?.swaLayers||0,swaContext:a?.window,swaFull:l,swaContextMultiplier:c})},dn=({maxCtx:e,availableMemory:t,modelBytes:n,kvBytesForCtx:o})=>{const r=Math.max(1,Math.floor(Number(e)||0));if(!o||t<=n)return r;let a=1,i=r,s=r;for(;a<=i;){const e=Math.floor((a+i)/2);n+o(e)<=t?(s=e,a=e+1):i=e-1}return s};var pn=f(285);const mn=t("node:stream/web");var fn=f.t(mn,2);const hn=t("node:events"),yn=new hn.EventEmitter;yn.setMaxListeners(100);const gn=(e,t,n)=>{e.push({...t,timestamp:t.timestamp||(new Date).toISOString()}),e.length>n&&e.shift()};class bn{constructor(e=9999){this.maxEntries=e,this.modelLoads=[],this.completions=[],this.transcriptions=[]}addModelLoad(e){gn(this.modelLoads,e,this.maxEntries),yn.emit("status:modelLoad",e),yn.emit("status:change",{type:"modelLoad",entry:e})}addCompletion(e){gn(this.completions,e,this.maxEntries),yn.emit("status:completion",e),yn.emit("status:change",{type:"completion",entry:e})}addTranscription(e){gn(this.transcriptions,e,this.maxEntries),yn.emit("status:transcription",e),yn.emit("status:change",{type:"transcription",entry:e})}getModelLoadHistory(){return[...this.modelLoads].reverse()}getCompletionHistory(){return[...this.completions].reverse()}getTranscriptionHistory(){return[...this.transcriptions].reverse()}clear(){this.modelLoads=[],this.completions=[],this.transcriptions=[]}}const wn=new bn,vn=new bn;let _n=0;function xn(e){const t=t=>e(t);return yn.on("status:change",t),()=>yn.off("status:change",t)}function Sn(e){const t=[];return{generators:Array.from(e.entries()).filter(([,e])=>"ggml-llm"===e.type).map(([e,n])=>{const{instance:o}=n;let r=[];return o.contexts&&(r=Array.from(o.contexts.entries()).map(([n,o])=>{const r={key:n,refCount:o.refCount,hasModel:Boolean(o.context)},a=o.context.parallel.getStatus();return r.parallelStatus=a,t.push({generatorId:e,contextKey:n,...a}),r})),{id:e,type:n.type,refCount:n.refCount,repoId:o.info?.model?.repoId||null,quantization:o.info?.model?.quantization||null,variant:o.info?.runtime?.variant||null,nCtx:o.info?.runtime?.n_ctx||null,nParallel:o.info?.runtime?.n_parallel||null,contexts:r}}),parallelStatuses:t,history:{modelLoads:wn.getModelLoadHistory(),completions:wn.getCompletionHistory()}}}function Cn(e){return{generators:Array.from(e.entries()).filter(([,e])=>"ggml-stt"===e.type).map(([e,t])=>{const{instance:n}=t,o=n.getStatus?.()||{},r=o.queueStatus||{processing:!1,queuedCount:0};return{id:e,type:t.type,refCount:t.refCount,repoId:n.info?.model?.repoId||null,quantization:n.info?.model?.quantization||null,variant:n.info?.runtime?.variant||null,hasContext:o.hasContext||!1,contextRefCount:o.contextRefCount||0,queueStatus:r}}),history:{modelLoads:vn.getModelLoadHistory(),transcriptions:vn.getTranscriptionHistory()}}}const kn="undefined"!=typeof globalThis&&globalThis.ReadableStream&&globalThis.WritableStream?{ReadableStream:globalThis.ReadableStream,WritableStream:globalThis.WritableStream}:fn,{ReadableStream:Tn,WritableStream:Mn}=kn,En=new TextEncoder,$n=(e={},t={})=>(Object.entries(t||{}).forEach(([t,n])=>{n&&"object"==typeof n&&!Array.isArray(n)?(e[t]&&"object"==typeof e[t]||(e[t]={}),$n(e[t],n)):e[t]=n}),e),Bn="https://huggingface.co",In="https://huggingface.co/api",On=g.join(Pt.homedir(),".buttress","models"),Nn=["mxfp4","q8_0","q6_k","q6","q5_k_m","q5_k_s","q5_k","q5_1","q5_0","q4_k_m","q4_k_s","q4_k","q4_1","q4_0","q3","q2"],Pn=.5,qn={backend:{type:"ggml-llm",variant:null,variant_preference:["cuda","vulkan","snapdragon","default"],gpu_memory_fraction:.85,cpu_memory_fraction:Pn},model:{repo_id:null,revision:"main",filename:null,url:null,quantization:null,preferred_quantizations:[],n_ctx:null,n_gpu_layers:"auto",n_parallel:4,n_batch:2048,flash_attn:"auto",cache_type_k:"f16",cache_type_v:"f16",ctx_shift:!1,kv_unified:!1,swa_full:!1,allow_local_file:!1,local_path:null,api_base:In,base_url:Bn},runtime:{cache_dir:On,prefer_variants:[],huggingface_token:process.env.HUGGINGFACE_TOKEN||null,http_headers:{},session_cache:{enabled:!0,max_size_bytes:10737418240,max_entries:1e3},context_release_delay_ms:1e4}},zn=(e,t=[])=>e||0===e?Array.isArray(e)?e.filter(e=>null!=e):[e]:[...t],Dn=e=>{if(!e)return null;const t=String(e).toLowerCase();return["cuda","vulkan","snapdragon","default"].includes(t)?t:null},An=(e={})=>{const t=JSON.parse(JSON.stringify(qn));if($n(t,e),t.backend.variant=Dn(t.backend.variant),t.backend.variant_preference=Array.from(new Set(zn(t.backend.variant_preference).map(Dn).filter(Boolean))),0===t.backend.variant_preference.length&&(t.backend.variant_preference=["cuda","vulkan","snapdragon","default"]),t.runtime.prefer_variants=Array.from(new Set(zn(t.runtime.prefer_variants).map(Dn).filter(Boolean))),t.model.preferred_quantizations=Array.from(new Set(zn(t.model.preferred_quantizations||t.model.quantizations).map(e=>e?String(e).toLowerCase():null).filter(Boolean))),t.model.quantization){const e=String(t.model.quantization).toLowerCase();t.model.preferred_quantizations.includes(e)||t.model.preferred_quantizations.unshift(e)}return t.model.n_parallel=Math.max(1,Number(t.model.n_parallel)||4),t.model.n_batch=Math.max(1,Number(t.model.n_batch)||512),t.model.base_url=t.model.base_url||Bn,t.model.api_base=t.model.api_base||In,t.runtime.cache_dir=t.runtime.cache_dir?g.resolve(t.runtime.cache_dir):On,t.runtime.session_cache={...qn.runtime.session_cache,...t.runtime.session_cache||{}},t.runtime.context_release_delay_ms=Math.max(0,Number(t.runtime.context_release_delay_ms)||qn.runtime.context_release_delay_ms),t},Fn=e=>{const t=e.toLowerCase();return Nn.find(e=>t.includes(e))||null},Rn=async e=>{await(0,y.mkdir)(e,{recursive:!0})},Un=(e,t,n=On)=>{const o=(0,qt.createHash)("sha256").update(e).digest("hex");return g.join(((e=On)=>g.join(e,".metadata-cache"))(n),t,`${o}.json`)},jn=async(e,t,n=On)=>{try{const o=Un(e,t,n),r=await(0,y.readFile)(o,"utf-8");return console.log(`[Cache] Hit ${t} cache:`,g.basename(o)),JSON.parse(r,(e,t)=>"string"==typeof t&&t.startsWith("__bigint__")?BigInt(t.slice(10)):t)}catch(e){return null}},Ln=async(e,t,n,o=On)=>{try{const r=Un(e,t,o);await Rn(g.dirname(r)),await(0,y.writeFile)(r,JSON.stringify(n,(e,t)=>"bigint"==typeof t?`__bigint__${t.toString()}`:t),"utf-8"),console.log(`[Cache] Wrote ${t} cache:`,g.basename(r))}catch(e){console.warn(`[Cache] Failed to write ${t} cache:`,e.message)}},Gn=(e=On)=>g.join(e,".session-state-cache"),Hn=(e=On)=>g.join(Gn(e),"cache-map.json"),Jn=(e=On)=>g.join(Gn(e),"temp"),Vn=(e=On)=>g.join(Gn(e),"states"),Kn=async(e,t=On)=>{const n=Hn(t),o=`${n}.tmp.${Date.now()}`;try{await Rn(g.dirname(n)),await(0,y.writeFile)(o,JSON.stringify(e,null,2),"utf-8"),await(0,y.rename)(o,n)}catch(e){throw await(0,y.unlink)(o).catch(()=>{}),e}},Yn=(e,t,n)=>{const o=Object.values(n.entries);console.log(`[SessionCache] Finding match for promptText (${e.length} chars)`),console.log(`[SessionCache] Checking ${o.length} cache entries`);const r=o.filter(e=>{return n=e.metadata,o=t,n.modelPath===o.modelPath&&n.variant===o.variant&&n.n_gpu_layers===o.n_gpu_layers&&n.n_ctx>=o.n_ctx&&n.cacheTypeK===o.cacheTypeK&&n.cacheTypeV===o.cacheTypeV;var n,o}).reduce((t,n)=>{const o=((e,t)=>{const n=Math.min(e.length,t.length);let o=0;for(;o<n&&e[o]===t[o];)o+=1;return o})(e,n.fullText);return o>=100&&o>t.prefixLen?{entry:n,prefixLen:o}:t},{entry:null,prefixLen:0});return r.entry?(console.log(`[SessionCache] Prefix match found: ${r.entry.id} (${r.prefixLen}/${r.entry.fullText.length} chars)`),{entry:r.entry,prefixLength:r.prefixLen}):(console.log("[SessionCache] No match found"),null)};class Wn{constructor(e,t){this.config=e,this.plan=t,this.baseDir=e.runtime.cache_dir,this.enabled=!1!==e.runtime.session_cache?.enabled,this.maxSizeBytes=((e,t)=>{if(null==e)return t;if("number"==typeof e)return e;if("string"==typeof e){const n=pn.parse(e);return null!=n?n:t}return t})(e.runtime.session_cache?.max_size_bytes,10737418240),this.maxEntries=e.runtime.session_cache?.max_entries||1e3,this.metadata={variant:t.info?.runtime?.variant||null,n_gpu_layers:t.info?.runtime?.n_gpu_layers||0,n_ctx:t.info?.runtime?.n_ctx||0,modelPath:t.localPath,cacheTypeK:t.info?.runtime?.cache_type_k||"f16",cacheTypeV:t.info?.runtime?.cache_type_v||"f16"},this.cacheMap=null,this.initialized=!1}async initialize(){if(this.enabled&&!this.initialized)try{await Rn(Gn(this.baseDir)),await Rn(Jn(this.baseDir)),await Rn(Vn(this.baseDir)),this.cacheMap=await(async(e=On)=>{try{const t=Hn(e),n=await(0,y.readFile)(t,"utf-8"),o=JSON.parse(n);return o.entries&&"object"==typeof o.entries?o:{version:1,entries:{},totalSize:0}}catch{return{version:1,entries:{},totalSize:0}}})(this.baseDir),this.initialized=!0,console.log(`[SessionCache] Initialized with ${Object.keys(this.cacheMap.entries).length} entries`)}catch(e){console.warn(`[SessionCache] Failed to initialize: ${e.message}`),this.enabled=!1}}async findMatchingEntry(e){if(!this.enabled||!this.cacheMap)return null;const t=Yn(e,this.metadata,this.cacheMap);if(t){const{entry:e}=t;return await(async e=>{try{return await(0,y.stat)(e),!0}catch{return!1}})(e.stateFilePath)?(e.lastAccessedAt=(new Date).toISOString(),await Kn(this.cacheMap,this.baseDir).catch(()=>{}),{entry:e}):(console.log(`[SessionCache] Removing stale entry: ${e.id}`),delete this.cacheMap.entries[e.id],this.cacheMap.totalSize-=e.stateFileSize||0,await Kn(this.cacheMap,this.baseDir).catch(()=>{}),null)}return null}async prepareCompletionOptions(e,t){if(!this.enabled)return{options:e,cacheEntry:null,promptPrefix:null};const n=await this.findMatchingEntry(t);if(n){const{entry:t}=n;console.log(`[SessionCache] Found matching entry: ${t.id} (${t.fullText.length} chars, loadStateSize=${t.loadStateSize})`);return{options:{...e,load_state_path:t.stateFilePath},cacheEntry:t,promptPrefix:t.fullText}}return{options:e,cacheEntry:null,promptPrefix:null}}async saveCompletionState(e,t,n,o=0){if(!this.enabled)return null;const r=((e,t)=>{const n=JSON.stringify({text:e,model:t.modelPath,variant:t.variant,n_gpu_layers:t.n_gpu_layers,n_ctx:t.n_ctx});return(0,qt.createHash)("sha256").update(n).digest("hex").slice(0,24)})(e,this.metadata);if(this.cacheMap.entries[r])return console.log(`[SessionCache] Entry already exists for prompt: ${r}`),await(0,y.unlink)(n).catch(()=>{}),this.cacheMap.entries[r];const a=e+t,i=((e,t=On)=>g.join(Vn(t),`${e}.bin`))(r,this.baseDir);try{await Rn(g.dirname(i)),await(0,y.rename)(n,i);const s=await(0,y.stat)(i),l={id:r,promptText:e,completionText:t,fullText:a,promptTokenCount:o,stateFilePath:i,stateFileSize:s.size,metadata:{...this.metadata},createdAt:(new Date).toISOString(),lastAccessedAt:(new Date).toISOString()};return this.cacheMap.entries[r]=l,this.cacheMap.totalSize+=s.size,await(async(e,t,n)=>{const o=Object.values(e.entries).sort((e,t)=>new Date(e.lastAccessedAt)-new Date(t.lastAccessedAt));let r=e.totalSize,a=Object.keys(e.entries).length;const i=o.filter(e=>(r>t||a>n)&&(r-=e.stateFileSize||0,a-=1,!0));return await Promise.all(i.map(async t=>{await(0,y.unlink)(t.stateFilePath).catch(()=>{}),delete e.entries[t.id],console.log(`[SessionCache] Evicted entry: ${t.id}`)})),e.totalSize=Math.max(0,r),i.map(e=>e.id)})(this.cacheMap,this.maxSizeBytes,this.maxEntries),await Kn(this.cacheMap,this.baseDir),console.log(`[SessionCache] Saved entry: ${r} (${s.size} bytes)`),l}catch(e){return console.warn(`[SessionCache] Failed to save state: ${e.message}`),await(0,y.unlink)(n).catch(()=>{}),null}}async generateTempStatePath(){return await Rn(Jn(this.baseDir)),((e=On)=>{const t=`${Date.now()}-${Math.random().toString(36).slice(2,10)}`;return g.join(Jn(e),`${t}.bin`)})(this.baseDir)}async cleanup(){await(async(e=On)=>{const t=Jn(e);try{const e=await(0,y.readdir)(t),n=Date.now(),o=36e5;await Promise.all(e.map(async e=>{const r=g.join(t,e),a=await(0,y.stat)(r).catch(()=>null);a&&n-a.mtimeMs>o&&(await(0,y.unlink)(r).catch(()=>{}),console.log(`[SessionCache] Cleaned up temp file: ${e}`))}))}catch{}})(this.baseDir)}}const Qn=async(e,t={})=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");const n=await fetch(e,t);if(!n.ok){const t=await n.text().catch(()=>"");throw new Error(`Failed to fetch ${e}: ${n.status} ${n.statusText} ${t}`.trim())}return n.json()},Zn=async(e,t={})=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");const n=await fetch(e,{...t,method:"HEAD"});if(!n.ok)throw new Error(`Failed to fetch headers for ${e}: ${n.status} ${n.statusText}`);return n},Xn=async(e,t,n=On)=>{const o=JSON.stringify({url:e,headers:t}),a=await jn(o,"range-metadata",n);if(a)return a;const i=!/^https?:/i.test(e),{metadata:s}=await r(e,{fetch,additionalFetchHeaders:t,allowLocalFile:i});return await Ln(o,"range-metadata",s,n),s},eo=(e,t)=>{if(e.model.local_path)return g.resolve(e.model.local_path);const n=t.repoId.split("/"),o=g.join(e.runtime.cache_dir,...n,t.revision);return g.join(o,t.filename)},to=async(e,t)=>{try{const n=await(0,y.stat)(e);return!t||n.size===t}catch(e){return!1}},no=async(e,t,n,o,r)=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");await Rn(g.dirname(n));const a=await fetch(e,{headers:t});if(!a.ok||!a.body)throw new Error(`Failed to download ${e}: ${a.status} ${a.statusText}`);const i=await(0,y.open)(n,"w"),s=Number(a.headers.get("content-length"))||o||0;let l=0,c=.05;try{await a.body.pipeTo(new Mn({async write(e){if(await i.write(e),l+=e.byteLength,"function"==typeof r&&s>0){const e=Math.min(1,l/s);for(;e>=c;)r(c),c+=.05}},async close(){await i.close(),"function"==typeof r&&r(1)},async abort(e){throw await i.close().catch(()=>{}),await(0,y.unlink)(n).catch(()=>{}),e}}))}catch(e){throw await i.close().catch(()=>{}),await(0,y.unlink)(n).catch(()=>{}),e}if(o){const e=await(0,y.stat)(n);if(e.size!==o)throw await(0,y.unlink)(n).catch(()=>{}),new Error(`Downloaded file size mismatch, expected ${o} got ${e.size}`)}},oo=async e=>{const t=e.model.repo_id||e.model.repository||e.model.model;if(!t)throw new Error("`model.repo_id` is required in Buttress backend config");const n=e.model.revision||"main",o=e.runtime.cache_dir,r=JSON.stringify({repoId:t,revision:n,filename:e.model.filename,url:e.model.url,quantization:e.model.quantization,preferred_quantizations:e.model.preferred_quantizations}),a=await jn(r,"artifact-info",o);if(a)return a;const i={...e.runtime.http_headers||{}};if(e.runtime.huggingface_token&&(i.Authorization=`Bearer ${e.runtime.huggingface_token}`),e.model.url){const a=await Zn(e.model.url,{headers:i}),s=Number(a.headers.get("content-length"))||null,l={repoId:t,revision:n,filename:e.model.filename||e.model.url.split("/").pop(),url:e.model.url,size:s,headers:i};return await Ln(r,"artifact-info",l,o),l}let{filename:s}=e.model,l=e.model.quantization&&String(e.model.quantization).toLowerCase();const c=await Qn(`${e.model.api_base}/models/${t}?revision=${n}&blobs=true`,{headers:i}),u=(c?.siblings||c?.files||[]).map(e=>e.rfilename||e.path||e.filename).filter(e=>"string"==typeof e&&e.endsWith(".gguf"));if(0===u.length)throw new Error(`No GGUF artifacts found in repo ${t}`);const d=e.model.preferred_quantizations.length>0?e.model.preferred_quantizations:Nn;if(s)l||(l=Fn(s));else{const e=(()=>{const e=d.find(e=>u.find(t=>t.toLowerCase().includes(e)));if(e)return{filename:u.find(t=>t.toLowerCase().includes(e)),quantization:e};return null})()||{filename:u[0],quantization:null},{filename:t,quantization:n}=e;s=t,l=n||Fn(s)}const p=`${e.model.base_url.replace(/\/+$/,"")}/${t}/resolve/${n}/${s}`,m=/-(\d{5})-of-(\d{5})\.gguf$/,f=s.match(m);let h=null;if(f){const[,,o]=f,r=await Qn(`${e.model.api_base}/models/${t}?revision=${n}&blobs=true`,{headers:i}),a=r?.siblings||r?.files||[],l=Number(o);h=0;for(let e=1;e<=l;e+=1){const t=String(e).padStart(5,"0"),n=s.replace(m,`-${t}-of-${o}.gguf`),r=a.find(e=>(e.rfilename||e.path||e.filename)===n),i=Number(r?.size);Number.isFinite(i)&&i>0&&(h+=i)}}else{const e=await Zn(p,{headers:i});h=Number(e.headers.get("content-length"))||null}const y={repoId:t,revision:n,filename:s,url:p,size:h,quantization:l,headers:i,isSplit:Boolean(f),splitCount:f?Number(f[2]):0};return await Ln(r,"artifact-info",y,o),y},ro=async(e,{modelBytes:t=null,kvCacheBytes:n=null}={})=>{const o=(e=>{const t=[];return e.backend.variant&&t.push(e.backend.variant),e.runtime.prefer_variants.length>0&&t.push(...e.runtime.prefer_variants),t.push(...e.backend.variant_preference),t.push("default"),Array.from(new Set(t.map(Dn).filter(Boolean)))})(e),[r,...s]=o,l=null!=e.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.gpu_memory_fraction))):qn.backend.gpu_memory_fraction||1,c=null!=e.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.cpu_memory_fraction))):Pn,u=await en({platform:process.platform,totalMemoryInBytes:Pt.totalmem(),backend:"ggml-llm",variant:r||null,preferVariants:s,gpuMemoryFraction:l,cpuMemoryFraction:c,dependencies:{getBackendDevicesInfo:a,isLibVariantAvailable:i},modelBytes:t,kvCacheBytes:n}),d=e=>({...e,devices:Array.isArray(e.devices)?e.devices:[],ok:e.ok,hasGpu:Boolean(e.hasGpu),totalMemory:e.gpuTotalBytes||e.totalMemory||0,error:e.ok?null:new Error(e.error||`Variant ${e.variant} not available on this platform`)});if(!u.ok||!u.selected){const e=(u.attempts||[]).map(e=>`${e.variant}: ${e.error||"unknown error"}`).join("; ");throw new Error(`Unable to initialize any backend variant (${o.join(", ")}). Errors: ${e}`)}const p=(u.attempts||[]).map(d);return{selected:d(u.selected),attempts:p}},ao=async e=>{const t=await oo(e),n=await Xn(t.url,t.headers,e.runtime.cache_dir),{arch:o,nCtxTrain:r,nLayer:a,nEmbd:i,nHead:s,nHeadKv:l,nEmbdHeadK:c,nEmbdHeadV:u,quantVersion:d,fileType:p}=cn(n),m=Number.isFinite(Number(a))?Number(a):0,f=Number.isFinite(Number(i))?Number(i):0,h=Number.isFinite(Number(s))?Number(s):0,y=Number.isFinite(Number(l))?Number(l):h,g=h>0&&f>0?f/h:128,b=null!=c&&Number.isFinite(Number(c))?Number(c):g,w=null!=u&&Number.isFinite(Number(u))?Number(u):g,v=ln({arch:o,metadata:n,nLayer:m}),_=v&&Number.isFinite(Number(v.kvLayers))?Number(v.kvLayers):m,x=Math.max(0,Math.floor(Number(_)||0)),S=e.model.n_ctx?Number(e.model.n_ctx):null;let C=S||r||4096;const k=[],T=[];let M=!0;if(S&&r&&S>r){M=!1;const e=`Requested context length (${S}) exceeds model training context (${r})`;k.push(e),T.push(e),C=r}S&&!r&&k.push("Model metadata missing training context length, using requested value");const E={k:e.model.cache_type_k,v:e.model.cache_type_v},$=t.size>0?t.size:0,B=un({layerCount:x,headKvCount:y,embdHeadKCount:b,embdHeadVCount:w,cacheTypes:E,swaConfig:v,kvUnified:e.model.kv_unified,nParallel:e.model.n_parallel,swaFull:e.model.swa_full}),I=B(C),O=await ro(e,{modelBytes:$,kvCacheBytes:I}),N=O.selected.totalMemory||0,P=N*(e.backend.gpu_memory_fraction||1),q=null!=e.backend.cpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.cpu_memory_fraction))):Pn,z=Math.max(0,Pt.totalmem()*q),D=O.selected.hasGpu?P:z,A=dn({maxCtx:C,availableMemory:D,modelBytes:$,kvBytesForCtx:B});if(!S&&A){const e=r?Math.min(A,r):A,t=Math.max(32,e);t<C&&k.push(`Context length capped to ${t} by memory limits`),C=t}C>A&&(C=A);const F=Math.floor(A);console.log(`[buttress] Memory-limited context length: ${F}`);const R=B(C),U=$+R,j=m?$/(m+1):$;let L,G=0;O.selected.hasGpu&&j>0&&(G=Math.min(m+1,Math.max(0,Math.floor(P/j)))),console.log(`[buttress] Auto GPU layer capacity (${O.selected.variant}): ${G}/${m+1}`),L="auto"===e.model.n_gpu_layers||null==e.model.n_gpu_layers?G:Math.max(0,Math.min(Number(e.model.n_gpu_layers)||0,m+1));const H=(()=>{const t=e.model.flash_attn&&String(e.model.flash_attn).toLowerCase();return"on"===t||"off"===t?t:O.selected.hasGpu?"auto":"off"})(),J=e.runtime.cache_dir,V=eo(e,t),K=await to(V,t.size),Y={ok:M,backend:"ggml-llm",warnings:k,errors:T,model:{repoId:t.repoId,revision:t.revision,filename:t.filename,quantization:t.quantization,url:t.url,sizeBytes:t.size,metadata:{architecture:o,n_ctx_train:r,n_layer:m,n_embd:f,quantization_version:d,file_type:p,kv_layer_count:x,swa:v?.enabled?{window:v.window,pattern:v.pattern,dense_first:v.denseFirst,type:v.type,layers:v.swaLayers}:null}},runtime:{variant:O.selected.variant,n_ctx:C,requested_ctx:S,n_gpu_layers:L,n_parallel:e.model.n_parallel,n_batch:e.model.n_batch,flash_attn_type:H,cache_type_k:E.k,cache_type_v:E.v,ctx_shift:e.model.ctx_shift,kv_unified:e.model.kv_unified,swa_full:e.model.swa_full,estimated_max_n_ctx:F,auto_gpu_layers:G},resources:{modelBytes:$,kvCacheBytes:R,totalEstimatedBytes:U,gpuCapacityBytes:N,gpuUsableBytes:P,cpuUsableBytes:z,fit:O.selected.fit},devices:{selected:O.selected,attempts:O.attempts},download:{cacheDir:J,localPath:V,exists:K},timestamp:(new Date).toISOString()};return{config:e,info:Y,artifact:t,metadata:{arch:o,nCtxTrain:r,nLayer:m,nEmbd:f},devices:O,cacheTypes:E,localPath:V,localExists:K}},io=(e,t)=>`event: ${e}\ndata: ${null==t?"":JSON.stringify(t)}\n\n`,so=(e,t,n=null,o=null)=>{let r;const a=Date.now();let i=0;return new Tn({async start(s){try{const l=await e.parallel.completion(t,(e,t)=>{t&&(t.token&&(i+=1),s.enqueue(En.encode(io("token",{requestId:e,...t}))))}),{requestId:c}=l;r=l.stop;const u=await l.promise;console.log("[Completion] Result:",u),s.enqueue(En.encode(io("result",{requestId:c,...u}))),s.close();const d=Date.now()-a,p=u.timings||{};wn.addCompletion({id:`completion-${c}`,generatorId:n,requestId:c,repoId:o?.repoId||null,quantization:o?.quantization||null,variant:o?.variant||null,promptTokens:p.prompt_n??0,tokensGenerated:p.predicted_n??i,tokensPerSecond:p.predicted_per_second??0,promptPerSecond:p.prompt_per_second??0,durationMs:d,success:!0,interrupted:u.interrupted||!1,contextFull:u.context_full||u.contextFull||!1})}catch(e){s.enqueue(En.encode(io("error",{message:e?.message||String(e)}))),s.error(e),wn.addCompletion({id:`completion-${Date.now()}`,generatorId:n,repoId:o?.repoId||null,quantization:o?.quantization||null,variant:o?.variant||null,durationMs:Date.now()-a,tokensGenerated:i,success:!1,error:e?.message||String(e)})}},cancel(){r&&r()}})},lo=(e,t,n,o,r,a,i=null,s=null)=>{let l,c="",u=!1;const d=Date.now();let p=0;return new Tn({async start(m){try{const f=await e.parallel.completion(t,(e,t)=>{t&&(t.token&&(c+=t.token,p+=1),m.enqueue(En.encode(io("token",{requestId:e,...t}))))}),{requestId:h}=f;l=f.stop;const g=await f.promise;g.text?c=g.text:g.content&&(c=g.content),u=!g.interrupted&&!g.context_full,console.log("[Completion] Result:",g),m.enqueue(En.encode(io("result",{requestId:h,...g}))),m.close();const b=Date.now()-d,w=g.timings||{};wn.addCompletion({id:`completion-${h}`,generatorId:i,requestId:h,repoId:s?.repoId||null,quantization:s?.quantization||null,variant:s?.variant||null,promptTokens:w.prompt_n??a??0,tokensGenerated:w.predicted_n??p,tokensPerSecond:w.predicted_per_second??0,promptPerSecond:w.prompt_per_second??0,durationMs:b,success:!0,interrupted:g.interrupted||!1,contextFull:g.context_full||g.contextFull||!1,usedCache:Boolean(t.load_state_path)}),u&&n.enabled&&c?n.saveCompletionState(o,c,r,a).catch(e=>{console.warn("[SessionCache] Save failed:",e.message)}):r&&(0,y.unlink)(r).catch(()=>{})}catch(e){m.enqueue(En.encode(io("error",{message:e?.message||String(e)}))),m.error(e),wn.addCompletion({id:`completion-${Date.now()}`,generatorId:i,repoId:s?.repoId||null,quantization:s?.quantization||null,variant:s?.variant||null,durationMs:Date.now()-d,tokensGenerated:p,success:!1,error:e?.message||String(e)}),(0,y.unlink)(r).catch(()=>{})}},cancel(){l&&l(),(0,y.unlink)(r).catch(()=>{})}})},co=e=>{const t={model:e.plan.localPath,runtime:e.plan.info.runtime};return(0,qt.createHash)("sha256").update(JSON.stringify(t)).digest("hex").slice(0,24)},uo=async(e,t)=>{const n=co(e);let o=e.contexts.get(n);if(o&&!o.released)return o.releaseTimer&&(clearTimeout(o.releaseTimer),o.releaseTimer=null,console.log(`[Context] Cancelled pending release for context "${n}"`)),o.refCount+=1,console.log(`[Context] Reusing existing context "${n}", refCount=${o.refCount}`),await o.ready,"function"==typeof t&&t(1),o;o?console.log(`[Context] Record exists but released=${o.released}, creating new context`):console.log(`[Context] No existing record for "${n}", creating new context`),o={key:n,refCount:1,ready:null,released:!1},e.contexts.set(n,o),o.ready=(async()=>{const r=Date.now(),a=await(async(e,t,n,o=null)=>{const{config:r,localPath:a,artifact:i}=e;if(e.localExists&&!t.has(a))return e.info.download.exists=!0,"function"==typeof n&&n(.5),a;if(r.model.local_path&&!r.model.allow_local_file)throw new Error("Local model path provided but `model.allow_local_file` is not enabled");const s=a;if(o){const t=o.getDownload(s);if(t){console.log(`[ensureModelFile] Waiting for global download: ${i.repoId}`);try{if(await t,await to(a,i.size))return e.localExists=!0,e.info.download.exists=!0,"function"==typeof n&&n(.5),a}catch(e){console.warn(`[ensureModelFile] Global download failed, will retry: ${e.message}`)}}}t.has(s)||t.set(s,(async()=>{if(i.isSplit&&i.splitCount>0){const e=/-(\d{5})-of-(\d{5})\.gguf$/,t=g.dirname(a),o=i.splitCount;let s=0;for(let a=1;a<=o;a+=1){const l=String(a).padStart(5,"0"),c=i.filename.replace(e,`-${l}-of-${String(o).padStart(5,"0")}.gguf`),u=`${r.model.base_url.replace(/\/+$/,"")}/${i.repoId}/resolve/${i.revision}/${c}`,d=g.join(t,c);await to(d)||await no(u,i.headers,d,null,e=>{if(e>=0&&Number.isFinite(e)){const t=(s+e)/o,r=Math.round(100*t);console.log(`Downloading model splits: ${Math.min(100,r)}%`),"function"==typeof n&&n(.5*t)}}),s+=1}}else console.log("Downloading model: 0%"),await no(i.url,i.headers,a,i.size,e=>{if(e>=0&&Number.isFinite(e)){const t=Math.round(100*e);console.log(`Downloading model: ${Math.min(100,t)}%`),"function"==typeof n&&n(.5*e)}});e.localExists=!0,e.info.download.exists=!0})());try{await t.get(s)}finally{t.delete(s)}return a})(e.plan,e.downloads,t,e.globalDownloadManager);"function"==typeof t&&t(.5);const i={model:a,n_threads:e.plan.info.runtime.n_threads,use_mmap:e.plan.info.runtime.use_mmap,use_mlock:e.plan.info.runtime.use_mlock,cpu_mask:e.plan.info.runtime.cpu_mask,cpu_strict:e.plan.info.runtime.cpu_strict,devices:e.plan.info.runtime.devices,n_ctx:e.plan.info.runtime.n_ctx,n_gpu_layers:e.plan.info.runtime.n_gpu_layers,n_parallel:e.plan.info.runtime.n_parallel,n_batch:e.plan.info.runtime.n_batch,flash_attn_type:e.plan.info.runtime.flash_attn_type,ctx_shift:e.plan.info.runtime.ctx_shift,kv_unified:e.plan.info.runtime.kv_unified,swa_full:e.plan.info.runtime.swa_full,lib_variant:e.plan.info.runtime.variant};let l;"off"!==e.plan.info.runtime.flash_attn_type&&(i.cache_type_k=e.plan.info.runtime.cache_type_k,i.cache_type_v=e.plan.info.runtime.cache_type_v),console.log("[Context] Load Options:",i);try{if(l=await s(i,e=>{"function"==typeof t&&(t(.5+.25*e),e%5==0&&console.log("[Context] Load Model Progress:",e))}),e.plan.info.runtime.n_parallel){if(!await l.parallel.enable({n_parallel:e.plan.info.runtime.n_parallel,n_batch:e.plan.info.runtime.n_batch}))throw new Error("Failed to enable parallel decoding mode for context")}return"function"==typeof t&&t(1),o.context=l,o.modelInfo=l.getModelInfo(),wn.addModelLoad({id:`${e.id}-${n}`,generatorId:e.id,contextKey:n,repoId:e.plan.info.model?.repoId||null,quantization:e.plan.info.model?.quantization||null,variant:e.plan.info.runtime?.variant||null,nCtx:e.plan.info.runtime?.n_ctx||null,nGpuLayers:e.plan.info.runtime?.n_gpu_layers||null,durationMs:Date.now()-r,success:!0}),o}catch(t){if(wn.addModelLoad({id:`${e.id}-${n}`,generatorId:e.id,contextKey:n,repoId:e.plan.info.model?.repoId||null,quantization:e.plan.info.model?.quantization||null,variant:e.plan.info.runtime?.variant||null,durationMs:Date.now()-r,success:!1,error:t?.message||String(t)}),l)try{l.release()}catch(e){}throw t}})();try{return await o.ready,o}catch(t){throw e.contexts.delete(n),t}},po=async(e,t,n=!1)=>{if(t.released)return!1;if(!n&&t.refCount>0)return!1;t.released=!0,e.contexts.delete(t.key);try{t.context?.parallel?.disable?.()}catch(e){}return await(t.context?.release?.()),!0},mo=async(e,t,n=!1)=>{if(t.releaseTimer&&(clearTimeout(t.releaseTimer),t.releaseTimer=null),n)t.refCount=0;else if(t.refCount=Math.max(0,t.refCount-1),t.refCount>0)return!1;const o=e.config.runtime.context_release_delay_ms;return n||o<=0?po(e,t):(console.log(`[Context] Scheduling release in ${o}ms for context "${t.key}"`),t.releaseTimer=setTimeout(async()=>{t.releaseTimer=null,t.refCount>0?console.log(`[Context] Release cancelled, refCount=${t.refCount} for context "${t.key}"`):(console.log(`[Context] Releasing context "${t.key}" after ${o}ms delay`),await po(e,t))},o),!0)};async function fo(e,t,n={}){const{globalDownloadManager:o=null}=n,r=An(t),a=await ao(r),i=new Wn(r,a);await i.initialize();const s={id:e,type:"ggml-llm",config:r,plan:a,info:a.info,contexts:new Map,downloads:new Map,globalDownloadManager:o,sessionCache:i,finalized:!1};return{id:e,type:"ggml-llm",info:a.info,contexts:s.contexts,initContext:async(e={})=>{const{onProgress:t}=e,n=await uo(s,t);return{modelInfo:n.modelInfo?{...n.modelInfo}:null,runtime:{...s.plan.info.runtime},download:{...s.plan.info.download}}},completion:async(e={})=>{const{options:t={},useCache:n=!0}=e,o=co(s),r=s.contexts.get(o);if(!r)throw new Error(`Context "${o}" not initialized`);await r.ready;let a=t.prompt||"";if(!a&&t.messages){const e=await r.context.getFormattedChat(t.messages,t.chat_template||t.chatTemplate,{jinja:t.jinja??!0,tools:t.tools,parallel_tool_calls:t.parallel_tool_calls,tool_choice:t.tool_choice,enable_thinking:t.enable_thinking,add_generation_prompt:t.add_generation_prompt,now:t.now,chat_template_kwargs:t.chat_template_kwargs});a=e?.prompt||e||""}if(n&&s.sessionCache.enabled&&a){const{options:e}=await s.sessionCache.prepareCompletionOptions(t,a),n=await s.sessionCache.generateTempStatePath(),o=await r.context.tokenize(a),i=o?.tokens?.length||0,l={...e,save_state_path:n,save_state_size:i};console.log(`[SessionCache] save_state_size=${i} (prompt tokens)`);const c={repoId:s.plan.info.model?.repoId||null,quantization:s.plan.info.model?.quantization||null,variant:s.plan.info.runtime?.variant||null};return lo(r.context,l,s.sessionCache,a,n,i,s.id,c)}const i={repoId:s.plan.info.model?.repoId||null,quantization:s.plan.info.model?.quantization||null,variant:s.plan.info.runtime?.variant||null};return so(r.context,t,s.id,i)},tokenize:async(e={})=>{const{text:t="",params:n={}}=e,o=co(s),r=s.contexts.get(o);if(!r)throw new Error(`Context "${o}" not initialized`);await r.ready;const a=await r.context.tokenize(t,n);if(!a)return{tokens:[]};const i=Array.from(a.tokens??[]).map(e=>Number(e));return{...a,tokens:i}},detokenize:async(e={})=>{const{tokens:t=[]}=e,n=co(s),o=s.contexts.get(n);if(!o)throw new Error(`Context "${n}" not initialized`);await o.ready;const r=t.map(e=>Number(e));return o.context.detokenize(r)},applyChatTemplate:async(e={})=>{const{messages:t=[],template:n,params:o}=e,r=co(s),a=s.contexts.get(r);if(!a)throw new Error(`Context "${r}" not initialized`);return await a.ready,await a.context.getFormattedChat(t,n,o)},releaseContext:async()=>{if(s.finalized)return!1;const e=co(s),t=s.contexts.get(e);return!!t&&mo(s,t,!1)},finalize:async()=>{if(s.finalized)return;s.finalized=!0;const e=Array.from(s.contexts.values()),t=e.map(e=>e.released||e.releaseTimer?Promise.resolve(!1):(e.refCount=Math.max(0,e.refCount-1),e.refCount>0?Promise.resolve(!1):po(s,e)));await Promise.allSettled(t);(0===e.length||e.every(e=>e.released))&&await s.sessionCache.cleanup()},getStatus:()=>{const e=[],t=Array.from(s.contexts.entries()).map(([t,n])=>{const o={key:t,refCount:n.refCount,hasModel:Boolean(n.context)},r=n.context.parallel.getStatus();return o.parallelStatus=r,e.push({contextKey:t,...r}),o});return{id:s.id,type:s.type,repoId:s.plan.info.model?.repoId||null,quantization:s.plan.info.model?.quantization||null,variant:s.plan.info.runtime?.variant||null,nCtx:s.plan.info.runtime?.n_ctx||null,nParallel:s.plan.info.runtime?.n_parallel||null,contexts:t,parallelStatuses:e}},subscribeParallelStatus:e=>{const t=Array.from(s.contexts.entries()).map(([t,n])=>n.context.parallel.subscribeToStatus(n=>{e({contextKey:t,...n})}));return{remove:()=>{t.forEach(e=>{e?.remove&&e.remove()})}}},hasPendingReleases:()=>Array.from(s.contexts.values()).some(e=>!e.released&&(e.releaseTimer||e.refCount>0)),resetFinalized:()=>{s.finalized=!1}}}const ho=e=>{const t=An(e);return t.model.repo_id||t.model.repository||t.model.model||null};async function yo(e,t,n={}){const{onProgress:o,onComplete:r,onError:a}=n;try{const n=An(e),i=await oo(n),s=eo(n,i),{repoId:l}=i;if(await to(s,i.size))return console.log(`[Download] Model already exists: ${l} at ${s}`),"function"==typeof r&&r({localPath:s,repoId:l,alreadyExists:!0}),{started:!1,localPath:s,repoId:l,alreadyExists:!0};const c=t.getDownload(s);if(c)return console.log(`[Download] Already downloading: ${l}`),c.then(()=>{"function"==typeof r&&r({localPath:s,repoId:l,joinedExisting:!0})}).catch(e=>{"function"==typeof a&&a(e)}),{started:!1,localPath:s,repoId:l,alreadyDownloading:!0};console.log(`[Download] Starting download: ${l}`);const u=(async()=>{try{if(i.isSplit&&i.splitCount>0){const e=/-(\d{5})-of-(\d{5})\.gguf$/,t=g.dirname(s),r=i.splitCount;let a=0;for(let s=1;s<=r;s+=1){const c=String(s).padStart(5,"0"),u=i.filename.replace(e,`-${c}-of-${String(r).padStart(5,"0")}.gguf`),d=`${n.model.base_url.replace(/\/+$/,"")}/${i.repoId}/resolve/${i.revision}/${u}`,p=g.join(t,u);await to(p)||await no(d,i.headers,p,null,e=>{if(e>=0&&Number.isFinite(e)){const t=(a+e)/r;console.log(`[Download] ${l}: ${Math.round(100*t)}%`),"function"==typeof o&&o(t)}}),a+=1}}else await no(i.url,i.headers,s,i.size,e=>{e>=0&&Number.isFinite(e)&&(console.log(`[Download] ${l}: ${Math.round(100*e)}%`),"function"==typeof o&&o(e))});console.log(`[Download] Completed: ${l}`),"function"==typeof r&&r({localPath:s,repoId:l})}catch(e){throw console.error(`[Download] Failed: ${l}`,e.message),"function"==typeof a&&a(e),e}finally{t.deleteDownload(s)}})();return t.setDownload(s,u),{started:!0,localPath:s,repoId:l}}catch(e){return console.error("[Download] Failed to start download:",e.message),"function"==typeof a&&a(e),{started:!1,localPath:null,repoId:null,error:e.message}}}const go=e=>e?"number"==typeof e.score&&Number.isFinite(e.score)?Number(e.score):Lt(e):0;async function bo(e=null,t={}){const{threshold:n=1.1,includeBreakdown:o=!1,config:r,...s}=t;let l=null,c=null,u=null,d=null,p=null,m=null;if(r)try{const{modelBytes:e,kvCacheBytes:t,limitedKvCacheBytes:n,memoryLimitedCtx:o,kvInfo:a,quantization:i}=await async function(e){const t=An(e),n=await oo(t),o=await Xn(n.url,n.headers,t.runtime.cache_dir),{arch:r,nCtxTrain:a,nLayer:i,nEmbd:s,nHead:l,nHeadKv:c,nEmbdHeadK:u,nEmbdHeadV:d,quantVersion:p,fileType:m}=cn(o),f=Number.isFinite(Number(i))?Number(i):0,h=Number.isFinite(Number(s))?Number(s):0,y=Number.isFinite(Number(l))?Number(l):0,g=Number.isFinite(Number(c))?Number(c):y,b=y>0&&h>0?h/y:128,w=null!=u&&Number.isFinite(Number(u))?Number(u):b,v=null!=d&&Number.isFinite(Number(d))?Number(d):b,_=ln({arch:r,metadata:o,nLayer:f}),x=_&&Number.isFinite(Number(_.kvLayers))?Number(_.kvLayers):f,S=Math.max(0,Math.floor(Number(x)||0)),C=(t.model.n_ctx?Number(t.model.n_ctx):null)||a||4096,k={k:t.model.cache_type_k,v:t.model.cache_type_v},T=n.size>0?n.size:0,M=un({layerCount:S,headKvCount:g,embdHeadKCount:w,embdHeadVCount:v,cacheTypes:k,swaConfig:_,kvUnified:t.model.kv_unified,nParallel:t.model.n_parallel,swaFull:t.model.swa_full}),E=null!=t.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(t.backend.gpu_memory_fraction))):qn.backend.gpu_memory_fraction||1,$=null!=t.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(t.backend.cpu_memory_fraction))):Pn,B=M(C),I=await ro(t,{modelBytes:T,kvCacheBytes:B}),O=(I.selected.totalMemory||0)*E,N=Math.max(0,Pt.totalmem()*$),P=I.selected.hasGpu?O:N,q=dn({maxCtx:C,availableMemory:P,modelBytes:T,kvBytesForCtx:M}),z=M(C),D=M(q);return{kvInfo:{nCtxTrain:a,nLayer:f,nEmbd:h,nHeadKv:g,nEmbdHeadK:w,nEmbdHeadV:v,nHeadCount:y,nHeadKvCount:g,kvLayerCount:S,swa:_?.enabled?{window:_.window,pattern:_.pattern,denseFirst:_.denseFirst,type:_.type,layers:_.swaLayers}:null},modelBytes:T,kvCacheBytes:z,limitedKvCacheBytes:D,memoryLimitedCtx:q,quantization:{name:n.quantization||null,fileType:m,version:p}}}(r);l=e,c=t,u=n,d=o,p=a,m=i}catch(e){}const f=null!=r?.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(r.backend.gpu_memory_fraction))):void 0,h=null!=r?.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(r.backend.cpu_memory_fraction))):void 0,y=await en({...s,platform:process.platform,totalMemoryInBytes:Pt.totalmem(),backend:"ggml-llm",includeBreakdown:o,gpuMemoryFraction:f,cpuMemoryFraction:h,dependencies:{getBackendDevicesInfo:a,isLibVariantAvailable:i},modelBytes:l,kvCacheBytes:c,limitedKvCacheBytes:u}),g=y.selected,b=go(g);g.modelBytes=l||null,g.kvCacheBytes=c||null,g.memoryLimitedCtx=d||null,g.limitedKvCacheBytes=u||null,g.kvInfo=p||null,g.quantization=m||null;let w=null,v=null;if(e){const t=go(e);v={...e,score:t};let o="buttress",r="buttress-higher-score";if(y.ok)if(t||0===t){const e=v.fit,a=v.limitedFit,i=g?.fit,s=g?.limitedFit,l=e?.fitsInGpu||e?.fitsInCpu||a?.fitsInGpu||a?.fitsInCpu,c=i?.fitsInGpu||i?.fitsInCpu||s?.fitsInGpu||s?.fitsInCpu;l&&!c?(o="local",r="client-fits-in-memory"):c&&!l?(o="buttress",r="buttress-fits-in-memory"):t>b*n?(o="local",r="client-better"):b>t*n?(o="buttress",r="buttress-better"):(o="either",r="comparable-scores")}else o="buttress",r="missing-client-score";else o="local",r="buttress-unavailable";w={buttressScore:b,clientScore:t,threshold:n,recommendation:o,reason:r}}y.ok||w||(w={buttressScore:b,clientScore:e?.score??null,threshold:n,recommendation:"local",reason:"buttress-unavailable"});let _=null;return r&&(_={repoId:r.model?.repo_id||null,quantization:r.model?.quantization||null,nCtx:r.model?.n_ctx||null,cacheKType:r.model?.cache_type_k||"f16",cacheVType:r.model?.cache_type_v||"f16"}),{type:"ggml-llm",timestamp:(new Date).toISOString(),buttress:y,client:v,comparison:w,modelConfig:_}}const{WritableStream:wo}="undefined"!=typeof globalThis&&globalThis.ReadableStream&&globalThis.WritableStream?{ReadableStream:globalThis.ReadableStream,WritableStream:globalThis.WritableStream}:fn,vo=(e={},t={})=>(Object.entries(t||{}).forEach(([t,n])=>{n&&"object"==typeof n&&!Array.isArray(n)?(e[t]&&"object"==typeof e[t]||(e[t]={}),vo(e[t],n)):e[t]=n}),e),_o="https://huggingface.co",xo="https://huggingface.co/api",So=g.join(Pt.homedir(),".buttress","models"),Co=["cuda","vulkan","default"],ko=["q8_0","q5_1","q5_0","q4_1","q4_0"],To="fp16",Mo={backend:{type:"ggml-stt",variant:null,variant_preference:Co,gpu_memory_fraction:.85,cpu_memory_fraction:.5},model:{repo_id:"BricksDisplay/whisper-ggml",revision:"main",filename:null,url:null,quantization:null,preferred_quantizations:["q8_0",To,"q5_1"],allow_local_file:!1,local_path:null,api_base:xo,base_url:_o,use_gpu:!0,use_flash_attn:"auto"},runtime:{cache_dir:So,prefer_variants:[],huggingface_token:process.env.HUGGINGFACE_TOKEN||null,http_headers:{},max_threads:null,context_release_delay_ms:1e4}},Eo=(e,t=[])=>e||0===e?Array.isArray(e)?e.filter(e=>null!=e):[e]:[...t],$o=e=>{if(!e)return null;const t=String(e).toLowerCase();return["cuda","vulkan","default"].includes(t)?t:null},Bo=(e={})=>{const t=JSON.parse(JSON.stringify(Mo));if(vo(t,e),t.backend.variant=$o(t.backend.variant),t.backend.variant_preference=Array.from(new Set(Eo(t.backend.variant_preference||Co).map($o).filter(Boolean))),0===t.backend.variant_preference.length&&(t.backend.variant_preference=[...Co]),t.runtime.prefer_variants=Array.from(new Set(Eo(t.runtime.prefer_variants).map($o).filter(Boolean))),t.model.preferred_quantizations=Array.from(new Set(Eo(t.model.preferred_quantizations||t.model.quantizations).map(e=>e?String(e).toLowerCase():null).filter(Boolean))),t.model.quantization){const e=String(t.model.quantization).toLowerCase();t.model.preferred_quantizations.includes(e)||t.model.preferred_quantizations.unshift(e)}return t.model.base_url=t.model.base_url||_o,t.model.api_base=t.model.api_base||xo,t.runtime.cache_dir=t.runtime.cache_dir?g.resolve(t.runtime.cache_dir):So,t.runtime.context_release_delay_ms=Math.max(0,Number(t.runtime.context_release_delay_ms)||Mo.runtime.context_release_delay_ms),t},Io=e=>{const t=e.toLowerCase();return ko.find(e=>t.includes(e))||null},Oo=async e=>{await(0,y.mkdir)(e,{recursive:!0})},No=(e,t,n=So)=>{const o=(0,qt.createHash)("sha256").update(e).digest("hex");return g.join(((e=So)=>g.join(e,".metadata-cache"))(n),t,`${o}.json`)},Po=async(e,t,n,o=So)=>{try{const r=No(e,t,o);await Oo(g.dirname(r)),await(0,y.writeFile)(r,JSON.stringify(n),"utf-8")}catch(e){}},qo=async(e,t={})=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");const n=await fetch(e,{...t,method:"HEAD"});if(!n.ok)throw new Error(`Failed to fetch headers for ${e}: ${n.status} ${n.statusText}`);return n},zo=(e,t)=>{if(e.model.local_path)return g.resolve(e.model.local_path);const n=t.repoId.split("/"),o=g.join(e.runtime.cache_dir,...n,t.revision);return g.join(o,t.filename)},Do=async(e,t)=>{try{const n=await(0,y.stat)(e);return!t||n.size===t}catch(e){return!1}},Ao=async(e,t,n,o,r)=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");await Oo(g.dirname(n));const a=await fetch(e,{headers:t});if(!a.ok||!a.body)throw new Error(`Failed to download ${e}: ${a.status} ${a.statusText}`);const i=await(0,y.open)(n,"w"),s=Number(a.headers.get("content-length"))||o||0;let l=0,c=.05;try{await a.body.pipeTo(new wo({async write(e){if(await i.write(e),l+=e.byteLength,"function"==typeof r&&s>0){const e=Math.min(1,l/s);for(;e>=c;)r(c),c+=.05}},async close(){await i.close(),"function"==typeof r&&r(1)},async abort(e){throw await i.close().catch(()=>{}),await(0,y.unlink)(n).catch(()=>{}),e}}))}catch(e){throw await i.close().catch(()=>{}),await(0,y.unlink)(n).catch(()=>{}),e}if(o){const e=await(0,y.stat)(n);if(e.size!==o)throw await(0,y.unlink)(n).catch(()=>{}),new Error(`Downloaded file size mismatch, expected ${o} got ${e.size}`)}},Fo=async e=>{const t=e.model.repo_id||e.model.repository||e.model.model;if(!t)throw new Error("`model.repo_id` is required in Buttress backend config");const n=e.model.revision||"main",o=e.runtime.cache_dir,r=JSON.stringify({repoId:t,revision:n,filename:e.model.filename,url:e.model.url,quantization:e.model.quantization,preferred_quantizations:e.model.preferred_quantizations}),a=await(async(e,t,n=So)=>{try{const o=No(e,t,n),r=await(0,y.readFile)(o,"utf-8");return JSON.parse(r)}catch(e){return null}})(r,"artifact-info",o);if(a)return a;const i={...e.runtime.http_headers||{}};if(e.runtime.huggingface_token&&(i.Authorization=`Bearer ${e.runtime.huggingface_token}`),e.model.url){const a=await qo(e.model.url,{headers:i}),s=Number(a.headers.get("content-length"))||null,l=e.model.filename||e.model.url.split("/").pop(),c={repoId:t,revision:n,filename:l,url:e.model.url,size:s,quantization:Io(l||""),headers:i};return await Po(r,"artifact-info",c,o),c}let{filename:s}=e.model,l=e.model.quantization&&String(e.model.quantization).toLowerCase();const c=await(async(e,t={})=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");const n=await fetch(e,t);if(!n.ok){const t=await n.text().catch(()=>"");throw new Error(`Failed to fetch ${e}: ${n.status} ${n.statusText} ${t}`.trim())}return n.json()})(`${e.model.api_base}/models/${t}?revision=${n}&blobs=true`,{headers:i}),u=(c?.siblings||c?.files||[]).map(e=>e.rfilename||e.path||e.filename).filter(e=>"string"==typeof e&&e.endsWith(".bin"));if(0===u.length)throw new Error(`No model artifacts found in repo ${t}`);const d=e.model.preferred_quantizations.length>0?e.model.preferred_quantizations:ko;if(s)l||(l=Io(s));else{const e=(()=>{for(const e of d)if(e===To){const e=u.find(e=>{const t=e.toLowerCase();return!ko.some(e=>t.includes(e))});if(e)return{filename:e,quantization:null}}else{const t=u.find(t=>t.toLowerCase().includes(e));if(t)return{filename:t,quantization:e}}return null})()||{filename:u[0],quantization:null},{filename:t,quantization:n}=e;s=t,l=n||Io(s)}const p=`${e.model.base_url.replace(/\/+$/,"")}/${t}/resolve/${n}/${s}`,m=await qo(p,{headers:i}),f={repoId:t,revision:n,filename:s,url:p,size:Number(m.headers.get("content-length"))||null,quantization:l,headers:i,isSplit:!1,splitCount:0};return await Po(r,"artifact-info",f,o),f},Ro=async(e,{modelBytes:t=null,processingBytes:n=null}={})=>{const o=(e=>{const t=[];return e.backend.variant&&t.push(e.backend.variant),e.runtime.prefer_variants.length>0&&t.push(...e.runtime.prefer_variants),t.push(...e.backend.variant_preference),t.push("default"),Array.from(new Set(t.map($o).filter(Boolean)))})(e),[r,...s]=o,l=null!=e.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.gpu_memory_fraction))):Mo.backend.gpu_memory_fraction||1,c=null!=e.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.cpu_memory_fraction))):.5,u=await en({platform:process.platform,totalMemoryInBytes:Pt.totalmem(),backend:"ggml-stt",variant:r||null,preferVariants:s,variantPreference:e.backend.variant_preference,gpuMemoryFraction:l,cpuMemoryFraction:c,dependencies:{getBackendDevicesInfo:a,isLibVariantAvailable:i},modelBytes:t,kvCacheBytes:n}),d=e=>({...e,devices:Array.isArray(e.devices)?e.devices:[],ok:e.ok,hasGpu:Boolean(e.hasGpu),totalMemory:e.gpuTotalBytes||e.totalMemory||0,error:e.ok?null:new Error(e.error||`Variant ${e.variant} not available on this platform`)});if(!u.ok||!u.selected){const e=(u.attempts||[]).map(e=>`${e.variant}: ${e.error||"unknown error"}`).join("; ");throw new Error(`Unable to initialize any backend variant (${o.join(", ")}). Errors: ${e}`)}const p=(u.attempts||[]).map(d);return{selected:d(u.selected),attempts:p}},Uo=async e=>{const t=await Fo(e),n=on({modelBytes:t.size>0?t.size:0}),o=await Ro(e,{modelBytes:n.modelBytes,processingBytes:n.processingBufferBytes});let r=o.selected.hasGpu&&(void 0===o.selected.fit?.fitsInGpu||o.selected.fit.fitsInGpu);!1===e.model.use_gpu&&(r=!1);const a=e.model.use_flash_attn&&String(e.model.use_flash_attn).toLowerCase();let i;i="on"===a||"true"===a||"off"!==a&&"false"!==a&&r;const s=e.runtime.cache_dir,l=zo(e,t),c=await Do(l,t.size);return{config:e,info:{ok:!0,backend:"ggml-stt",model:{repoId:t.repoId,revision:t.revision,filename:t.filename,quantization:t.quantization,url:t.url,sizeBytes:t.size},runtime:{variant:o.selected.variant,use_gpu:r,use_flash_attn:i,max_threads:e.runtime.max_threads?Number(e.runtime.max_threads):null},resources:{...n,gpuCapacityBytes:o.selected.gpuTotalBytes,gpuUsableBytes:o.selected.gpuUsableBytes,cpuUsableBytes:o.selected.cpuUsableBytes,fit:o.selected.fit},devices:{selected:o.selected,attempts:o.attempts},download:{cacheDir:s,localPath:l,exists:c},timestamp:(new Date).toISOString()},artifact:t,memory:n,devices:o,localPath:l,localExists:c}};class jo{constructor(){this.queue=[],this.processing=!1,this.currentTaskId=null}async enqueue(e,t=null){return new Promise((n,o)=>{this.queue.push({task:e,resolve:n,reject:o,taskId:t}),this.processNext()})}async processNext(){if(this.processing||0===this.queue.length)return;this.processing=!0;const{task:e,resolve:t,reject:n,taskId:o}=this.queue.shift();this.currentTaskId=o;try{t(await e())}catch(e){n(e)}finally{this.processing=!1,this.currentTaskId=null,this.processNext()}}getStatus(){return{processing:this.processing,queuedCount:this.queue.length,currentTaskId:this.currentTaskId}}}const Lo=e=>{if(!e)return null;if(e instanceof ArrayBuffer)return e;if(ArrayBuffer.isView(e))return e.buffer;if("string"==typeof e){const t=e.startsWith("data:")?e.split(",")[1]||"":e,n=Buffer.from(t,"base64");return n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength)}throw new Error("Unsupported audioData format, expected base64 string or ArrayBuffer")},Go=async(e,t)=>{if(e.contextRecord&&!e.contextRecord.released)return e.contextRecord.releaseTimer&&(clearTimeout(e.contextRecord.releaseTimer),e.contextRecord.releaseTimer=null,console.log("[Context] Cancelled pending STT release")),e.contextRecord.refCount+=1,console.log(`[Context] Reusing existing STT context, refCount=${e.contextRecord.refCount}`),await e.contextRecord.ready,"function"==typeof t&&t(1),e.contextRecord;e.contextRecord?console.log(`[Context] STT record exists but released=${e.contextRecord.released}, creating new context`):console.log("[Context] No existing STT record, creating new context");const n={refCount:1,ready:null,released:!1};e.contextRecord=n,n.ready=(async()=>{const o=Date.now();try{const r=await(async(e,t,n,o=null)=>{const{localPath:r,artifact:a,config:i}=e;if(e.localExists)return"function"==typeof n&&n(1),r;if(o){const t=o.getDownload(r);if(t){console.log(`[ensureModelFile] Waiting for global STT download: ${a.repoId}`);try{if(await t,await Do(r,a.size))return e.localExists=!0,e.info.download.exists=!0,"function"==typeof n&&n(1),r}catch(e){console.warn(`[ensureModelFile] Global STT download failed, will retry: ${e.message}`)}}}const s=t.get(r);if(s)return await s,"function"==typeof n&&n(1),r;const l=(async()=>{if(i.model.allow_local_file){if(!await Do(r,a.size))throw new Error(`Local model file not found: ${r}`);return r}return await Ao(a.url,a.headers,r,a.size,n),r})();t.set(r,l);try{return await l,r}finally{t.delete(r)}})(e.plan,e.downloads,t,e.globalDownloadManager),a=await l({filePath:r,useFlashAttn:"on"===e.plan.info.runtime.flash_attn_type,useGpu:e.plan.info.runtime.n_gpu_layers>0,nThreads:e.plan.info.runtime.n_threads},e.plan.info.runtime.variant);n.context=a;try{n.modelInfo=await a.getModelInfo()}catch(e){n.modelInfo=null}return vn.addModelLoad({id:e.id,generatorId:e.id,repoId:e.plan.info.model?.repoId||null,quantization:e.plan.info.model?.quantization||null,variant:e.plan.info.runtime?.variant||null,useGpu:e.plan.info.runtime?.use_gpu||!1,durationMs:Date.now()-o,success:!0}),n}catch(t){throw vn.addModelLoad({id:e.id,generatorId:e.id,repoId:e.plan.info.model?.repoId||null,quantization:e.plan.info.model?.quantization||null,variant:e.plan.info.runtime?.variant||null,durationMs:Date.now()-o,success:!1,error:t?.message||String(t)}),t}})();try{return await n.ready,"function"==typeof t&&t(1),n}catch(t){throw e.contextRecord=null,t}},Ho=async(e,t,n=!1)=>!t.released&&(!(!n&&t.refCount>0)&&(t.released=!0,e.contextRecord=null,await(t.context?.release?.()),!0)),Jo=async(e,t,n=!1)=>{if(t.releaseTimer&&(clearTimeout(t.releaseTimer),t.releaseTimer=null),n)t.refCount=0;else if(t.refCount=Math.max(0,t.refCount-1),t.refCount>0)return!1;const o=e.config.runtime.context_release_delay_ms;return n||o<=0?Ho(e,t):(console.log(`[Context] Scheduling STT release in ${o}ms`),t.releaseTimer=setTimeout(async()=>{t.releaseTimer=null,t.refCount>0?console.log(`[Context] STT release cancelled, refCount=${t.refCount}`):(console.log(`[Context] Releasing STT context after ${o}ms delay`),await Ho(e,t))},o),!0)};async function Vo(e,t,n={}){const{globalDownloadManager:o=null}=n,r=Bo(t),a=await Uo(r),i={id:e,type:"ggml-stt",config:r,plan:a,info:a.info,contextRecord:null,downloads:new Map,globalDownloadManager:o,queue:new jo,finalized:!1},s=async(e={})=>{const{audioPath:t,audioData:n,options:o={}}=e,r=await Go(i),a={...o};i.plan.info.runtime.max_threads&&null==a.maxThreads&&(a.maxThreads=i.plan.info.runtime.max_threads);const s=`transcription-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,l=Date.now();return i.queue.enqueue(async()=>{await r.ready;try{let e;if(n){const t=Lo(n),{promise:o}=r.context.transcribeData(t,a);e=await o}else{if(!t)throw new Error("audioPath or audioData is required for transcription");const n=g.resolve(t),{promise:o}=r.context.transcribe(n,a);e=await o}return vn.addTranscription({id:s,generatorId:i.id,repoId:i.plan.info.model?.repoId||null,quantization:i.plan.info.model?.quantization||null,variant:i.plan.info.runtime?.variant||null,durationMs:Date.now()-l,segmentCount:e?.segments?.length||0,textLength:e?.text?.length||0,success:!0}),e}catch(e){throw vn.addTranscription({id:s,generatorId:i.id,repoId:i.plan.info.model?.repoId||null,quantization:i.plan.info.model?.quantization||null,variant:i.plan.info.runtime?.variant||null,durationMs:Date.now()-l,success:!1,error:e?.message||String(e)}),e}},s)};return{id:e,type:"ggml-stt",info:a.info,queue:i.queue,initContext:async(e={})=>{const{onProgress:t}=e,n=await Go(i,t);return{modelInfo:n.modelInfo?{...n.modelInfo}:null,runtime:{...i.plan.info.runtime},download:{...i.plan.info.download}}},transcribe:async(e={})=>s(e),transcribeData:async(e={})=>s(e),releaseContext:async()=>{if(i.finalized)return!1;const e=i.contextRecord;return!!e&&Jo(i,e)},finalize:async()=>{if(i.finalized)return;i.finalized=!0;const e=i.contextRecord;e&&(e.released||e.releaseTimer||(e.refCount=Math.max(0,e.refCount-1),e.refCount>0||await Ho(i,e)))},getStatus:()=>({id:i.id,type:i.type,repoId:i.plan.info.model?.repoId||null,quantization:i.plan.info.model?.quantization||null,variant:i.plan.info.runtime?.variant||null,hasContext:Boolean(i.contextRecord?.context),contextRefCount:i.contextRecord?.refCount||0,queueStatus:i.queue.getStatus()}),hasPendingReleases:()=>{const e=i.contextRecord;return!!e&&(!e.released&&(e.releaseTimer||e.refCount>0))},resetFinalized:()=>{i.finalized=!1}}}const Ko=e=>{const t=Bo(e);return t.model.repo_id||t.model.repository||t.model.model||null};async function Yo(e,t,n={}){const{onProgress:o,onComplete:r,onError:a}=n;try{const n=Bo(e),i=await Fo(n),s=zo(n,i),{repoId:l}=i;if(await Do(s,i.size))return console.log(`[Download] STT model already exists: ${l} at ${s}`),"function"==typeof r&&r({localPath:s,repoId:l,alreadyExists:!0}),{started:!1,localPath:s,repoId:l,alreadyExists:!0};const c=t.getDownload(s);if(c)return console.log(`[Download] Already downloading STT model: ${l}`),c.then(()=>{"function"==typeof r&&r({localPath:s,repoId:l,joinedExisting:!0})}).catch(e=>{"function"==typeof a&&a(e)}),{started:!1,localPath:s,repoId:l,alreadyDownloading:!0};console.log(`[Download] Starting STT model download: ${l}`);const u=(async()=>{try{await Ao(i.url,i.headers,s,i.size,e=>{e>=0&&Number.isFinite(e)&&(console.log(`[Download] ${l}: ${Math.round(100*e)}%`),"function"==typeof o&&o(e))}),console.log(`[Download] Completed STT model: ${l}`),"function"==typeof r&&r({localPath:s,repoId:l})}catch(e){throw console.error(`[Download] Failed STT model: ${l}`,e.message),"function"==typeof a&&a(e),e}finally{t.deleteDownload(s)}})();return t.setDownload(s,u),{started:!0,localPath:s,repoId:l}}catch(e){return console.error("[Download] Failed to start STT download:",e.message),"function"==typeof a&&a(e),{started:!1,localPath:null,repoId:null,error:e.message}}}const Wo=e=>e?"number"==typeof e.score&&Number.isFinite(e.score)?Number(e.score):Lt(e):0;async function Qo(e,t=null,n={}){if("ggml-llm"===e)return bo(t,n);if("ggml-stt"===e)return async function(e=null,t={}){const{threshold:n=1.1,includeBreakdown:o=!1,config:r,...s}=t;let l=null,c=null,u=null;if(r)try{const e=Bo(r),t=await Fo(e);l=t.size??null,({processingBufferBytes:c}=on({modelBytes:l})),u=t.quantization||null}catch(e){}const d=null!=r?.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(r.backend.gpu_memory_fraction))):void 0,p=null!=r?.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(r.backend.cpu_memory_fraction))):void 0,m=await en({...s,platform:process.platform,totalMemoryInBytes:Pt.totalmem(),backend:"ggml-stt",includeBreakdown:o,gpuMemoryFraction:d,cpuMemoryFraction:p,dependencies:{getBackendDevicesInfo:a,isLibVariantAvailable:i},modelBytes:l,kvCacheBytes:c}),f=m.selected,h=Wo(f);f&&(f.modelBytes=l||null,f.processingBytes=c||null,f.quantization=u||null);let y=null,g=null;if(e){const t=Wo(e);g={...e,score:t};let o="buttress",r="buttress-higher-score";if(m.ok)if(t||0===t)if(e.fit&&f?.fit){const a=e.fit.fitsInGpu||e.fit.fitsInCpu,i=f.fit.fitsInGpu||f.fit.fitsInCpu;a&&!i?(o="local",r="client-fits-in-memory"):i&&!a?(o="buttress",r="buttress-fits-in-memory"):t>h*n?(o="local",r="client-better"):h>t*n?(o="buttress",r="buttress-better"):(o="either",r="comparable-scores")}else t>h*n?(o="local",r="client-better"):h>t*n?(o="buttress",r="buttress-better"):(o="either",r="comparable-scores");else o="buttress",r="missing-client-score";else o="local",r="buttress-unavailable";y={buttressScore:h,clientScore:t,threshold:n,recommendation:o,reason:r}}m.ok||y||(y={buttressScore:h,clientScore:e?.score??null,threshold:n,recommendation:"local",reason:"buttress-unavailable"});let b=null;return r&&(b={repoId:r.model?.repo_id||null,quantization:r.model?.quantization||null,filename:r.model?.filename||null}),{type:"ggml-stt",timestamp:(new Date).toISOString(),buttress:m,client:g,comparison:y,modelConfig:b}}(t,n);throw new Error(`Unknown backend type: ${e}`)}const Zo=t("node:fs"),Xo=t("node:child_process"),er=JSON.parse('{"UU":"@fugood/buttress-backend-core","rE":"2.23.0-beta.34"}'),tr=e=>{if(!e)return{repoId:null,filename:null};const[t,n]=e.split(":");return{repoId:t,filename:n||null}};async function nr({modelIds:e=[],defaultConfig:t=null}={}){const n=[];console.log(`${er.UU} v${er.rE}`),console.log("Generating model capabilities comparison...\n"),n.push(`${er.UU} v${er.rE}`),n.push("## Model Capabilities Comparison\n"),e&&0!==e.length||(console.error("Error: No model IDs provided"),process.exit(1));try{const o=(e={},t={})=>{const n=Array.isArray(e)?[...e]:{...e};return Object.entries(t||{}).forEach(([e,t])=>{t&&"object"==typeof t&&!Array.isArray(t)?n[e]=o(n[e]||{},t):n[e]=t}),n},r=t||{},{server:a,generators:i=[],...s}=r,l=e=>o(JSON.parse(JSON.stringify(s)),e||{}),u=e=>{if(Array.isArray(i)&&i.length>0){const t=i.filter(e=>"ggml-llm"===e?.type);if(t.length>0&&e){const n=t.find(t=>t.model?.repo_id===e);if(n)return l(n)}}return Object.keys(s).length>0?l({}):null},d=[];for(let t=0;t<e.length;t+=1){const n=e[t];console.log(`[${t+1}/${e.length}] Analyzing ${n}...`);let o=u(n);o={...o||{},model:{...s.runtime,...o?.model||{},repo_id:n}};const r=await Qo("ggml-llm",null,{config:o,includeBreakdown:!0});d.push({modelId:n,capabilities:r,modelInfo:r.buttress?.selected||null,modelConfig:r.modelConfig||null})}const p=e=>e?(e/1024/1024/1024).toFixed(2):"N/A",m=e=>e?"✅":"🚫";n.push("| Model ID | Quantization | Size (GB) | Context Size | KV Cache Size (GB) | Total Required Memory (GB) | Fits GPU (Full) | Fits CPU (Full) |"),n.push("|----------|--------------|-----------|--------------|--------------------|-----------------------------|-----------------|-----------------|"),d.forEach(({modelId:e,modelInfo:t,modelConfig:o})=>{const r=t?.quantization?.name?.toUpperCase()||"N/A",a=p(t?.modelBytes),i=o?.nCtx||t?.kvInfo?.nCtxTrain||"N/A",s=un(t),l=Number(i),c=t?.kvCacheBytes||(s&&Number.isFinite(l)&&l>0?s(l):s&&s(t?.kvInfo?.nCtxTrain||0))||null,u=p(c),d=p(t?.modelBytes&&c?t.modelBytes+c:t?.fit?.totalRequiredBytes),f=m(t?.fit?.fitsInGpu),h=m(t?.fit?.fitsInCpu);n.push(`| ${e} | ${r} | ${a} | ${i} | ${u} | ${d} | ${f} | ${h} |`);if((null!=t?.memoryLimitedCtx||null!=t?.limitedFit)&&(!t?.fit?.fitsInGpu||!t?.fit?.fitsInCpu)){const e=t?.memoryLimitedCtx||i,o=Number(e),r=t?.limitedKvCacheBytes||s&&Number.isFinite(o)&&o>0&&s(o)||null,l=p(r),c=p(t?.modelBytes&&r?t.modelBytes+r:t?.limitedFit?.totalRequiredBytes),f=m(t?.limitedFit?.fitsInGpu),h=m(t?.limitedFit?.fitsInCpu);(e!==i||l!==u||c!==d)&&n.push(`| ↳ Limited | - | ${a} | ${e} | ${l} | ${c} | ${f} | ${h} |`)}}),n.push("\n---"),n.push("\n### System Information");let f=null;if("win32"!==process.platform)try{f=(0,Xo.execSync)("uname -a",{encoding:"utf8"}).trim()}catch{}if(f?n.push(`- **System:** ${f}`):(n.push(`- **Hostname:** ${Pt.hostname()}`),n.push(`- **OS:** ${Pt.type()} ${Pt.release()}`)),n.push(`- **Platform:** ${process.platform}`),n.push(`- **CPU Cores:** ${Pt.cpus().length}`),n.push(`- **Total System Memory:** ${(Pt.totalmem()/1024/1024/1024).toFixed(2)} GB`),d.length>0){const e=d[0].capabilities,t=e.buttress?.selected;if(t){const e=t.cpuTotalBytes>0?(t.cpuUsableBytes/t.cpuTotalBytes*100).toFixed(0):0;if(n.push(`- **Usable CPU Memory:** ${(t.cpuUsableBytes/1024/1024/1024).toFixed(2)} GB (${e}% of ${(t.cpuTotalBytes/1024/1024/1024).toFixed(2)} GB)`),t.hasGpu){const e=t.devices.filter(e=>"gpu"===e.type);if(e.length>0){const o=e[0];n.push(`- **GPU Backend:** ${o.backend}`),n.push(`- **GPU Name:** ${o.deviceName}`),n.push(`- **GPU Total Memory:** ${(o.maxMemorySize/1024/1024/1024).toFixed(2)} GB`);const r=t.gpuTotalBytes>0?(t.gpuUsableBytes/t.gpuTotalBytes*100).toFixed(0):0;n.push(`- **GPU Usable Memory:** ${(t.gpuUsableBytes/1024/1024/1024).toFixed(2)} GB (${r}% of ${(t.gpuTotalBytes/1024/1024/1024).toFixed(2)} GB)`)}}else n.push("- **GPU:** Not available")}}n.push("\n### Command Used");const h=process.argv.slice(2).join(" ");if(n.push(`\`\`\`bash\n${process.argv[0]} ${process.argv[1]} ${h}\n\`\`\``),n.push("\n### Package Information"),n.push(`- **Name:** ${er.UU}`),n.push(`- **Version:** ${er.rE}`),er.description&&n.push(`- **Description:** ${er.description}`),t&&Object.keys(t).length>0){n.push("\n### Configuration"),n.push("<details>"),n.push("<summary>Click to expand TOML configuration</summary>"),n.push("\n```toml");try{const e=c.stringify(t);n.push(e)}catch(e){n.push("# Error serializing config"),n.push(JSON.stringify(t,null,2))}n.push("```"),n.push("</details>")}const y=`ggml-llm-model-capabilities-${(new Date).toISOString().replace(/[.:]/g,"-").split("T")[0]}.md`,b=g.join(process.cwd(),y);Zo.writeFileSync(b,n.join("\n"),"utf8"),console.log(`\nModel capabilities table saved to: ${b}`),process.exit(0)}catch(e){console.error("Failed to generate model table:",e.message),process.exit(1)}}async function or({modelId:e=null,defaultConfig:t=null}={}){console.log(`${er.UU} v${er.rE}`),console.log("Testing capabilities for backend: ggml-llm"),e&&console.log(`Model: ${e}`),console.log("--------------------------------");try{const n=t||{},{server:o,generators:r=[],...a}=n,i=(e={},t={})=>{const n=Array.isArray(e)?[...e]:{...e};return Object.entries(t||{}).forEach(([e,t])=>{t&&"object"==typeof t&&!Array.isArray(t)?n[e]=i(n[e]||{},t):n[e]=t}),n},s=e=>i(JSON.parse(JSON.stringify(a)),e||{});let l=(e=>{if(Array.isArray(r)&&r.length>0){const t=r.filter(e=>"ggml-llm"===e?.type);if(t.length>0&&e){const n=t.find(t=>t.model?.repo_id===e);if(n)return s(n)}}return Object.keys(a).length>0?s({}):null})(e);e&&(l={...l||{},model:{...l?.model||{},repo_id:e}});const c=await Qo("ggml-llm",null,{config:l,includeBreakdown:!0}),u=c.buttress?.selected||null,d=c.modelConfig||null;if(e||d?.repoId){console.log("\n=== Model Information ===");const t=e||d?.repoId;console.log(`Repository ID: ${t}`),d?.quantization&&console.log(`Quantization: ${d.quantization}`),d?.nCtx&&console.log(`Context Length: ${d.nCtx}`),u?.quantization?.name&&console.log(`Model Quantization: ${u.quantization.name.toUpperCase()}`);const n=d?.cache_type_k||"f16",o=d?.cache_type_v||"f16";if(console.log(`KV Cache Type: K=${n}, V=${o}`),u?.modelBytes&&u?.kvCacheBytes){if(console.log(`Model Size: ${(u.modelBytes/1024/1024/1024).toFixed(2)} GB`),u.kvInfo?console.log(`KV Cache Size: ${(u.kvCacheBytes/1024/1024/1024).toFixed(2)} GB (KV info: ${JSON.stringify(u.kvInfo)})`):console.log(`KV Cache Size: ${(u.kvCacheBytes/1024/1024/1024).toFixed(2)} GB`),console.log(`Total Required Memory: ${((u.modelBytes+u.kvCacheBytes)/1024/1024/1024).toFixed(2)} GB`),null!=u.memoryLimitedCtx){const e=u.memoryLimitedCtx,t=u.kvInfo?.nCtxTrain;t?console.log(`\nMemory-Limited Context: ${e} (Train: ${t})`):console.log(`\nMemory-Limited Context: ${e}`),null!=u.limitedKvCacheBytes&&console.log(`Limited KV Cache Size: ${(u.limitedKvCacheBytes/1024/1024/1024).toFixed(2)} GB`)}}else if(c.buttress?.selected?.fit){const{totalRequiredBytes:e}=c.buttress.selected.fit;console.log(`Total Required Memory: ${(e/1024/1024/1024).toFixed(2)} GB`)}}if(c.buttress?.selected){const{selected:e}=c.buttress;console.log("\n=== Hardware Information ===");let t=null;if("win32"!==process.platform)try{t=(0,Xo.execSync)("uname -a",{encoding:"utf8"}).trim()}catch{}t?console.log(`System: ${t}`):(console.log(`Hostname: ${Pt.hostname()}`),console.log(`OS: ${Pt.type()} ${Pt.release()}`)),console.log(`Platform: ${e.platform}`),console.log(`CPU Cores: ${Pt.cpus().length}`),console.log(`Total System Memory: ${(Pt.totalmem()/1024/1024/1024).toFixed(2)} GB`);const n=e.cpuTotalBytes>0?(e.cpuUsableBytes/e.cpuTotalBytes*100).toFixed(0):0;if(console.log(`Usable CPU Memory: ${(e.cpuUsableBytes/1024/1024/1024).toFixed(2)} GB (${n}% of ${(e.cpuTotalBytes/1024/1024/1024).toFixed(2)} GB)`),e.hasGpu){console.log("\n--- GPU Details ---");e.devices.filter(e=>"gpu"===e.type).forEach(t=>{console.log(`GPU Backend: ${t.backend}`),console.log(`GPU Name: ${t.deviceName}`),console.log(`GPU Total Memory: ${(t.maxMemorySize/1024/1024/1024).toFixed(2)} GB`);const n=e.gpuTotalBytes>0?(e.gpuUsableBytes/e.gpuTotalBytes*100).toFixed(0):0;console.log(`GPU Usable Memory: ${(e.gpuUsableBytes/1024/1024/1024).toFixed(2)} GB (${n}% of ${(e.gpuTotalBytes/1024/1024/1024).toFixed(2)} GB)`),t.metadata&&(t.metadata.hasBFloat16&&console.log("Supports BFloat16: Yes"),t.metadata.hasUnifiedMemory&&console.log("Unified Memory: Yes"))})}else console.log("GPU: Not available");console.log(`\nBackend Variant: ${e.variant}`),console.log(`Performance Score: ${e.score}`),e.fit&&(console.log("\n--- Model Fit Analysis ---"),console.log("Fits in GPU: "+(e.fit.fitsInGpu?"Yes":"No")),console.log("Fits in CPU: "+(e.fit.fitsInCpu?"Yes":"No")),console.log(`Limiting Factor: ${e.fit.limiting}`),e.limitedFit&&(console.log("\n--- Memory-Limited Fit Analysis ---"),console.log(`Limited Total Required: ${(e.limitedFit.totalRequiredBytes/1024/1024/1024).toFixed(2)} GB`),console.log("Fits in GPU (Limited): "+(e.limitedFit.fitsInGpu?"Yes":"No")),console.log("Fits in CPU (Limited): "+(e.limitedFit.fitsInCpu?"Yes":"No")),console.log(`Limiting Factor (Limited): ${e.limitedFit.limiting}`)))}console.log("\n=== Full Capabilities JSON ==="),console.log(JSON.stringify(c,null,2)),process.exit(0)}catch(e){console.error("Failed to get capabilities:",e.message),process.exit(1)}}async function rr({modelIds:e=[],defaultConfig:t=null}={}){const n=[];console.log(`${er.UU} v${er.rE}`),console.log("Generating STT model capabilities comparison...\n"),n.push(`${er.UU} v${er.rE}`),n.push("## STT Model Capabilities Comparison\n"),e&&0!==e.length||(console.error("Error: No model IDs provided"),process.exit(1));try{const o=(e={},t={})=>{const n=Array.isArray(e)?[...e]:{...e};return Object.entries(t||{}).forEach(([e,t])=>{t&&"object"==typeof t&&!Array.isArray(t)?n[e]=o(n[e]||{},t):n[e]=t}),n},r=t||{},{server:a,generators:i=[],...s}=r,l=e=>o(JSON.parse(JSON.stringify(s)),e||{}),u=e=>{if(Array.isArray(i)&&i.length>0){const t=i.filter(e=>"ggml-stt"===e?.type);if(t.length>0&&e){const n=t.find(t=>t.model?.repo_id===e);if(n)return l(n)}}return Object.keys(s).length>0?l({}):null},d=[];for(let t=0;t<e.length;t+=1){const n=e[t],{repoId:o,filename:r}=tr(n);console.log(`[${t+1}/${e.length}] Analyzing ${n}...`);let a=u(o);a={...a||{},model:{...a?.model||{},repo_id:o,...r&&{filename:r}}};const i=await Qo("ggml-stt",null,{config:a,includeBreakdown:!0});d.push({modelId:n,repoId:o,filename:r,capabilities:i,modelInfo:i.buttress?.selected||null,modelConfig:i.modelConfig||null})}const p=e=>e?(e/1024/1024).toFixed(1):"N/A",m=e=>e?"✅":"🚫";n.push("| Model | Size (MB) | Processing Buffer (MB) | Total Required (MB) | Fits GPU | Fits CPU |"),n.push("|-------|-----------|------------------------|---------------------|----------|----------|"),d.forEach(({modelId:e,modelInfo:t})=>{const o=p(t?.modelBytes),r=p(t?.processingBytes||t?.kvCacheBytes),a=p(t?.fit?.totalRequiredBytes),i=m(t?.fit?.fitsInGpu),s=m(t?.fit?.fitsInCpu);n.push(`| ${e} | ${o} | ${r} | ${a} | ${i} | ${s} |`)}),n.push("\n---"),n.push("\n### System Information");let f=null;if("win32"!==process.platform)try{f=(0,Xo.execSync)("uname -a",{encoding:"utf8"}).trim()}catch{}if(f?n.push(`- **System:** ${f}`):(n.push(`- **Hostname:** ${Pt.hostname()}`),n.push(`- **OS:** ${Pt.type()} ${Pt.release()}`)),n.push(`- **Platform:** ${process.platform}`),n.push(`- **CPU Cores:** ${Pt.cpus().length}`),n.push(`- **Total System Memory:** ${(Pt.totalmem()/1024/1024/1024).toFixed(2)} GB`),d.length>0){const e=d[0].capabilities,t=e.buttress?.selected;if(t){const e=t.cpuTotalBytes>0?(t.cpuUsableBytes/t.cpuTotalBytes*100).toFixed(0):0;if(n.push(`- **Usable CPU Memory:** ${(t.cpuUsableBytes/1024/1024/1024).toFixed(2)} GB (${e}% of ${(t.cpuTotalBytes/1024/1024/1024).toFixed(2)} GB)`),t.hasGpu){const e=t.devices.filter(e=>"gpu"===e.type);if(e.length>0){const o=e[0];n.push(`- **GPU Backend:** ${o.backend}`),n.push(`- **GPU Name:** ${o.deviceName}`),n.push(`- **GPU Total Memory:** ${(o.maxMemorySize/1024/1024/1024).toFixed(2)} GB`);const r=t.gpuTotalBytes>0?(t.gpuUsableBytes/t.gpuTotalBytes*100).toFixed(0):0;n.push(`- **GPU Usable Memory:** ${(t.gpuUsableBytes/1024/1024/1024).toFixed(2)} GB (${r}% of ${(t.gpuTotalBytes/1024/1024/1024).toFixed(2)} GB)`)}}else n.push("- **GPU:** Not available")}}n.push("\n### Command Used");const h=process.argv.slice(2).join(" ");if(n.push(`\`\`\`bash\n${process.argv[0]} ${process.argv[1]} ${h}\n\`\`\``),n.push("\n### Package Information"),n.push(`- **Name:** ${er.UU}`),n.push(`- **Version:** ${er.rE}`),er.description&&n.push(`- **Description:** ${er.description}`),t&&Object.keys(t).length>0){n.push("\n### Configuration"),n.push("<details>"),n.push("<summary>Click to expand TOML configuration</summary>"),n.push("\n```toml");try{const e=c.stringify(t);n.push(e)}catch(e){n.push("# Error serializing config"),n.push(JSON.stringify(t,null,2))}n.push("```"),n.push("</details>")}const y=`ggml-stt-model-capabilities-${(new Date).toISOString().replace(/[.:]/g,"-").split("T")[0]}.md`,b=g.join(process.cwd(),y);Zo.writeFileSync(b,n.join("\n"),"utf8"),console.log(`\nSTT model capabilities table saved to: ${b}`),process.exit(0)}catch(e){console.error("Failed to generate STT model table:",e.message),process.exit(1)}}async function ar({modelId:e=null,defaultConfig:t=null}={}){console.log(`${er.UU} v${er.rE}`),console.log("Testing capabilities for backend: ggml-stt"),e&&console.log(`Model: ${e}`),console.log("--------------------------------");try{const{repoId:n,filename:o}=tr(e),r=t||{},{server:a,generators:i=[],...s}=r,l=(e={},t={})=>{const n=Array.isArray(e)?[...e]:{...e};return Object.entries(t||{}).forEach(([e,t])=>{t&&"object"==typeof t&&!Array.isArray(t)?n[e]=l(n[e]||{},t):n[e]=t}),n},c=e=>l(JSON.parse(JSON.stringify(s)),e||{});let u=(e=>{if(Array.isArray(i)&&i.length>0){const t=i.filter(e=>"ggml-stt"===e?.type);if(t.length>0&&e){const n=t.find(t=>t.model?.repo_id===e);if(n)return c(n)}}return Object.keys(s).length>0?c({}):null})(n);n&&(u={...u||{},model:{...s.runtime,...u?.model||{},repo_id:n,...o&&{filename:o}}});const d=await Qo("ggml-stt",null,{config:u,includeBreakdown:!0}),p=d.buttress?.selected||null,m=d.modelConfig||null;if(n||m?.repoId){console.log("\n=== Model Information ===");const e=n||m?.repoId;console.log(`Repository ID: ${e}`),o&&console.log(`Filename: ${o}`),p?.modelBytes&&console.log(`Model Size: ${(p.modelBytes/1024/1024).toFixed(1)} MB`);const t=p?.processingBytes||p?.kvCacheBytes;if(t&&console.log(`Processing Buffer: ${(t/1024/1024).toFixed(1)} MB`),p?.modelBytes&&t)console.log(`Total Required Memory: ${((p.modelBytes+t)/1024/1024).toFixed(1)} MB`);else if(d.buttress?.selected?.fit){const{totalRequiredBytes:e}=d.buttress.selected.fit;console.log(`Total Required Memory: ${(e/1024/1024).toFixed(1)} MB`)}}if(d.buttress?.selected){const{selected:e}=d.buttress;console.log("\n=== Hardware Information ===");let t=null;if("win32"!==process.platform)try{t=(0,Xo.execSync)("uname -a",{encoding:"utf8"}).trim()}catch{}t?console.log(`System: ${t}`):(console.log(`Hostname: ${Pt.hostname()}`),console.log(`OS: ${Pt.type()} ${Pt.release()}`)),console.log(`Platform: ${e.platform}`),console.log(`CPU Cores: ${Pt.cpus().length}`),console.log(`Total System Memory: ${(Pt.totalmem()/1024/1024/1024).toFixed(2)} GB`);const n=e.cpuTotalBytes>0?(e.cpuUsableBytes/e.cpuTotalBytes*100).toFixed(0):0;if(console.log(`Usable CPU Memory: ${(e.cpuUsableBytes/1024/1024/1024).toFixed(2)} GB (${n}% of ${(e.cpuTotalBytes/1024/1024/1024).toFixed(2)} GB)`),e.hasGpu){console.log("\n--- GPU Details ---");e.devices.filter(e=>"gpu"===e.type).forEach(t=>{console.log(`GPU Backend: ${t.backend}`),console.log(`GPU Name: ${t.deviceName}`),console.log(`GPU Total Memory: ${(t.maxMemorySize/1024/1024/1024).toFixed(2)} GB`);const n=e.gpuTotalBytes>0?(e.gpuUsableBytes/e.gpuTotalBytes*100).toFixed(0):0;console.log(`GPU Usable Memory: ${(e.gpuUsableBytes/1024/1024/1024).toFixed(2)} GB (${n}% of ${(e.gpuTotalBytes/1024/1024/1024).toFixed(2)} GB)`),t.metadata&&(t.metadata.hasBFloat16&&console.log("Supports BFloat16: Yes"),t.metadata.hasUnifiedMemory&&console.log("Unified Memory: Yes"))})}else console.log("GPU: Not available");console.log(`\nBackend Variant: ${e.variant}`),console.log(`Performance Score: ${e.score}`),e.fit&&(console.log("\n--- Model Fit Analysis ---"),console.log("Fits in GPU: "+(e.fit.fitsInGpu?"Yes":"No")),console.log("Fits in CPU: "+(e.fit.fitsInCpu?"Yes":"No")),console.log(`Limiting Factor: ${e.fit.limiting}`))}console.log("\n=== Full Capabilities JSON ==="),console.log(JSON.stringify(d,null,2)),process.exit(0)}catch(e){console.error("Failed to get capabilities:",e.message),process.exit(1)}}const ir=new Map,sr={downloads:new Map,getDownload(e){return this.downloads.get(e)||null},setDownload(e,t){this.downloads.set(e,t)},deleteDownload(e){this.downloads.delete(e)},isDownloading(e){return this.downloads.has(e)},getActiveDownloads(){return Array.from(this.downloads.entries()).map(([e,t])=>({localPath:e,promise:t}))}},lr=(e,t)=>{const n=(e=>{const t=ir.get(e);if(!t)throw new Error(`Unknown generator id "${e}"`);return t})(e);if(n.type!==t)throw new Error(`Generator "${e}" does not support ${t} backend`);return n.instance};async function cr(e,t){const n={"ggml-llm":{create:fo,getId:ho},"ggml-stt":{create:Vo,getId:Ko}}[e];if(!n)throw new Error(`Unsupported backend type: ${e}`);const o=n.getId(t);if(!o)throw new Error("Buttress generator config missing repo identifier");const r=`${e}:${o}`,a=ir.get(r);if(a)return a.refCount+=1,a.instance.resetFinalized?.(),{id:a.id,info:a.instance.info};const i=await n.create(r,t,{globalDownloadManager:sr}),s={id:r,type:i.type,instance:i,refCount:1};return ir.set(r,s),{id:r,info:i.info}}async function ur(e){const t=ir.get(e);if(!t)return!1;if(t.refCount-=1,t.refCount<=0){await t.instance.finalize();(t.instance.hasPendingReleases?.()??!1)||ir.delete(e)}return!0}const dr={initContext:async(e,t)=>lr(e,"ggml-llm").initContext(t),completion:async(e,t)=>lr(e,"ggml-llm").completion(t),tokenize:async(e,t)=>lr(e,"ggml-llm").tokenize(t),detokenize:async(e,t)=>lr(e,"ggml-llm").detokenize(t),applyChatTemplate:async(e,t)=>lr(e,"ggml-llm").applyChatTemplate(t),releaseContext:async(e,t)=>lr(e,"ggml-llm").releaseContext(t)},pr={initContext:async(e,t)=>lr(e,"ggml-stt").initContext(t),transcribe:async(e,t)=>lr(e,"ggml-stt").transcribe(t),transcribeData:async(e,t)=>lr(e,"ggml-stt").transcribeData(t),releaseContext:async(e,t)=>lr(e,"ggml-stt").releaseContext(t)};function mr(e,t){return"ggml-llm"===e?ho(t):"ggml-stt"===e?Ko(t):null}const fr={getFullStatus:()=>function(e){return{timestamp:(new Date).toISOString(),ggmlLlm:Sn(e),ggmlStt:Cn(e)}}(ir),getGgmlLlmStatus:()=>Sn(ir),getGgmlSttStatus:()=>Cn(ir),subscribeToStatus:xn,subscribeToStatusWithId:function(e){return _n+=1,{subscriberId:_n,unsubscribe:xn(e)}},llmStatusTracker:wn,sttStatusTracker:vn,statusEmitter:yn};async function hr(e,t,n={}){const o={"ggml-llm":yo,"ggml-stt":Yo}[e];return o?o(t,sr,n):{started:!1,localPath:null,repoId:null,error:`Unknown backend type: ${e}`}}const{version:yr,name:gr}={version:"2.23.0-beta.34",name:"@fugood/buttress-server-poc"},br=async()=>{const e=`https://registry.npmjs.org/${gr}/latest`;try{const t=new AbortController,n=setTimeout(()=>t.abort(),3e3),o=await fetch(e,{headers:{Accept:"application/json"},signal:t.signal});if(clearTimeout(n),!o.ok)return null;return(await o.json()).version||null}catch{return null}},wr=(e,t)=>{if(!t)return!1;const n=e.split(/[.-]/),o=t.split(/[.-]/);for(let e=0;e<Math.max(n.length,o.length);e+=1){const t=parseInt(n[e])||0,r=parseInt(o[e])||0;if(r>t)return!0;if(r<t)return!1}return!1},vr=async()=>{try{const e=await br();e&&wr(yr,e)&&(e=>{console.log(""),console.log("[33mâ•─────────────────────────────────────────────────╮[0m"),console.log("[33m│[0m Update available! [2m%s[0m → [32m%s[0m",yr.padEnd(12),e.padEnd(12),"[33m│[0m"),console.log("[33m│[0m [33m│[0m"),console.log("[33m│[0m Run to upgrade: [33m│[0m"),console.log("[33m│[0m [36mnpm install -g %s[0m [33m│[0m",gr.padEnd(27)),console.log("[33m╰─────────────────────────────────────────────────╯[0m"),console.log("")})(e)}catch(e){}},_r=n.create(),xr=e=>{const{status:t}=e;return _r.router({getStatus:_r.procedure.query(()=>(console.log("[Status] Get full status"),t.getFullStatus())),getLlmStatus:_r.procedure.query(()=>(console.log("[Status] Get LLM status"),t.getGgmlLlmStatus())),getSttStatus:_r.procedure.query(()=>(console.log("[Status] Get STT status"),t.getGgmlSttStatus())),subscribe:_r.procedure.subscription(()=>te(n=>{console.log("[Status] Client subscribed to status changes");const{generatorRegistry:o}=e,r=[],a=(e,o)=>{if("ggml-llm"===o.type&&o.instance?.subscribeParallelStatus){const a=o.instance.subscribeParallelStatus(o=>{n.next({type:"parallelStatus",generatorId:e,data:o,fullStatus:t.getFullStatus()})});r.push({id:e,sub:a})}};Array.from(o.entries()).forEach(([e,t])=>{a(e,t)}),n.next({type:"initial",data:t.getFullStatus()});const i=t.subscribeToStatus(e=>{if("modelLoad"===e.type&&e.entry?.generatorId){const t=o.get(e.entry.generatorId);t&&a(e.entry.generatorId,t)}n.next({type:"change",data:e,fullStatus:t.getFullStatus()})});return()=>{console.log("[Status] Client unsubscribed from status changes"),r.forEach(({sub:e})=>e?.remove?.()),i()}}))})},Sr=new TextDecoder,Cr=(e,t)=>{if(!t||"*"===t)return"*";const n=e?.headers?.origin||"";return(Array.isArray(t)?t:[t]).includes(n)?n:""},kr=(e,t,n,o,r)=>{const a=Cr(e,r),i={"Content-Type":"application/json"};a&&(i["Access-Control-Allow-Origin"]=a),t.writeHead(n,i),t.end(JSON.stringify(o))},Tr=(e,t)=>{e.write(`data: ${JSON.stringify(t)}\n\n`)},Mr=(e,t)=>{const n=e.split("\n\n"),o=n.pop()||"";return n.forEach(e=>{if(!e.trim())return;const n=e.match(/^event:\s*(.+)$/m),o=e.match(/^data:\s*(.+)$/m);if(!n||!o)return;const r=n[1];let a;try{a=JSON.parse(o[1])}catch{return}t(r,a)}),o},Er=({backend:e,defaultConfig:t})=>{const n=t?.openai_compat?.cors_allowed_origins,o=new Map,r=async(e,t)=>{const n=e.getReader();let o="";try{let e=!1;for(;!e;){const{value:r,done:a}=await n.read();if(e=a,e)break;o+=Sr.decode(r,{stream:!0}),o=Mr(o,(e,n)=>{"token"===e&&t.onToken?t.onToken(n):"result"===e&&t.onResult?t.onResult(n):"error"===e&&t.onError&&t.onError(n)})}}finally{n.cancel().catch(()=>{})}},a=async(a,i)=>{let s;try{s=await(e=>new Promise((t,n)=>{let o="";e.on("data",e=>{o+=e.toString()}),e.on("end",()=>{try{t(o?JSON.parse(o):{})}catch(e){n(new Error("Invalid JSON body"))}}),e.on("error",n)}))(a)}catch(e){return void kr(a,i,400,{error:{message:e.message,type:"invalid_request_error"}},n)}const{messages:l=[],stream:c=!1,model:u,tools:d,temperature:p,stop:m}=s,f=s.top_p,h=s.max_tokens,y=s.presence_penalty,g=s.frequency_penalty,b=s.tool_choice,w=s.stream_options;if(l&&0!==l.length)try{const s=await(async n=>{const r=(t?.generators||[]).filter(e=>"ggml-llm"===e.type);if(0===r.length)throw new Error('No ggml-llm generator configured. Add a [[generators]] with type = "ggml-llm" to your config.');let a=r[0],i=n||a.model?.repo_id;if(n){const e=r.find(e=>e.model?.repo_id===n);e&&(a=e)}else i=a.model?.repo_id;const s=i,l=o.get(s);if(l?.initialized)return l;const{generators:c,server:u,...d}=t||{},p={...d,...a,model:{...a.model,repo_id:i}};console.log(`[OpenAI] Creating generator for ${s}`);const{id:m}=await e.startGenerator("ggml-llm",p),f={id:m,config:p,repoId:i,initialized:!1};return o.set(s,f),await e.ggmlLlm.initContext(m,{}),f.initialized=!0,console.log(`[OpenAI] Generator ready: ${s}`),f})(u),v=`chatcmpl-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,_=Math.floor(Date.now()/1e3),x=s.repoId||"ggml-llm",S={reasoning_format:"auto",messages:l,jinja:!0,add_generation_prompt:!0};null!=p&&(S.temperature=p),null!=f&&(S.top_p=f),null!=h&&(S.n_predict=h),null!=m&&(S.stop=Array.isArray(m)?m:[m]),null!=y&&(S.presence_penalty=y),null!=g&&(S.frequency_penalty=g),null!=d&&(S.tools=d),null!=b&&(S.tool_choice=b);const C=await e.ggmlLlm.completion(s.id,{options:S});if(c){const e=Cr(a,n),t={"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"};e&&(t["Access-Control-Allow-Origin"]=e),i.writeHead(200,t);const o=!0===w?.include_usage;let s="",l="";const c=new Map,u=new Map;await r(C,{onToken:e=>{const t={};if(null!=e.content){const n=e.content;n.length>s.length&&(t.content=n.slice(s.length),s=n)}if(null!=e.reasoning_content){const n=e.reasoning_content;n.length>l.length&&(t.reasoning_content=n.slice(l.length),l=n)}if(null!=e.tool_calls&&e.tool_calls.length>0){const n=[];e.tool_calls.forEach((e,t)=>{const o={index:t};u.has(t)||(u.set(t,e.id||`call_${v}_${t}`),o.id=u.get(t),o.type="function");const r=e.function?.arguments||"",a=c.get(t)||"",i={};!c.has(t)&&e.function?.name&&(i.name=e.function.name),r.length>a.length&&(i.arguments=r.slice(a.length),c.set(t,r)),Object.keys(i).length>0?(o.function=i,n.push(o)):o.id&&(o.function={name:e.function?.name||"",arguments:""},n.push(o))}),n.length>0&&(t.tool_calls=n)}Object.keys(t).length>0&&Tr(i,{id:v,object:"chat.completion.chunk",created:_,model:x,choices:[{index:0,delta:t,finish_reason:null}]})},onResult:e=>{const t={id:v,object:"chat.completion.chunk",created:_,model:x,choices:[{index:0,delta:{},finish_reason:e.interrupted?"length":"stop"}]};o&&(t.usage={prompt_tokens:e.prompt_tokens||e.promptTokens||0,completion_tokens:e.tokens_predicted||e.tokensPredicted||0,total_tokens:(e.prompt_tokens||e.promptTokens||0)+(e.tokens_predicted||e.tokensPredicted||0)}),Tr(i,t)},onError:e=>{Tr(i,{error:{message:e.message,type:"server_error"}})}}),i.write("data: [DONE]\n\n"),i.end()}else{let e="",t=null,o=null,s="stop",l={prompt_tokens:0,completion_tokens:0,total_tokens:0};await r(C,{onToken:t=>{null!=t.content?e+=t.content:null!=t.token&&(e+=t.token)},onResult:n=>{n.text?e=n.text:n.content&&(e=n.content),n.reasoning_content&&(t=n.reasoning_content),n.tool_calls&&n.tool_calls.length>0?(o=n.tool_calls.map((e,t)=>({id:e.id||`call_${v}_${t}`,type:"function",function:{name:e.function?.name||"",arguments:e.function?.arguments||""}})),s="tool_calls"):s=n.interrupted?"length":"stop",l={prompt_tokens:n.prompt_tokens||n.promptTokens||0,completion_tokens:n.tokens_predicted||n.tokensPredicted||0,total_tokens:(n.prompt_tokens||n.promptTokens||0)+(n.tokens_predicted||n.tokensPredicted||0)}},onError:e=>{throw new Error(e.message)}});const c={role:"assistant",content:e||null};t&&(c.reasoning_content=t),o&&(c.tool_calls=o),kr(a,i,200,{id:v,object:"chat.completion",created:_,model:x,choices:[{index:0,message:c,finish_reason:s}],usage:l},n)}}catch(e){console.error("[OpenAI] Chat completion error:",e),kr(a,i,500,{error:{message:e.message||"Internal server error",type:"server_error"}},n)}else kr(a,i,400,{error:{message:"messages is required and must not be empty",type:"invalid_request_error"}},n)};return async(e,o,r)=>{if("OPTIONS"===e.method){const t=Cr(e,n),r={"Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"86400"};return t&&(r["Access-Control-Allow-Origin"]=t),o.writeHead(204,r),o.end(),!0}const{pathname:i}=r;return"/oai-compat/v1/models"===i&&"GET"===e.method?(await(async(e,o)=>{const r=(t?.generators||[]).filter(e=>"ggml-llm"===e.type).map(e=>({id:e.model?.repo_id||"ggml-llm",object:"model",created:Math.floor(Date.now()/1e3),owned_by:"local"}));0===r.length&&r.push({id:"ggml-llm",object:"model",created:Math.floor(Date.now()/1e3),owned_by:"local"}),kr(e,o,200,{object:"list",data:r},n)})(e,o),!0):"/oai-compat/v1/chat/completions"===i&&"POST"===e.method&&(await a(e,o),!0)}},$r=g.dirname((0,b.fileURLToPath)(import.meta.url)),Br=new TextDecoder,Ir=n.context().create({sse:{ping:{enabled:!0,intervalMs:3e4},maxDurationMs:18e5,client:{reconnectAfterInactivityMs:3e5}}}),Or=o.record(o.any()).optional(),Nr=o.object({id:o.string()}),Pr=o.object({id:o.string(),property:o.any().optional()}),qr=new Map,zr=o.object({type:o.string(),config:Or}),Dr=o.object({type:o.string().optional().default("ggml-llm"),config:Or,currentClientCapabilities:o.record(o.any()).optional(),options:o.record(o.any()).optional()}).optional(),Ar=(e={},t={})=>{const n=Array.isArray(e)?[...e]:{...e};return Object.entries(t||{}).forEach(([e,t])=>{t&&"object"==typeof t&&!Array.isArray(t)?n[e]=Ar(n[e]||{},t):n[e]=t}),n},Fr=e=>e&&"object"==typeof e?JSON.parse(JSON.stringify(e)):null,Rr=(e,t)=>{const n=Fr(e)||{},o=Fr(t)||{};return Ar(n,o)},Ur=(e=h,{defaultConfig:t}={})=>{const n=Fr(t)||{},r=Array.isArray(n.generators)?n.generators:[],{server:a,generators:i,...s}=n,l=e=>Ar(JSON.parse(JSON.stringify(s)),e||{}),c=(e,t)=>{if(r.length>0){const n=r.filter(t=>t?.type===e);if(n.length>0&&t){const e=n.find(e=>e.model?.repo_id===t);if(e)return l(e)}}return Object.keys(s).length>0?l({}):null};return Ir.router({getCapabilities:Ir.procedure.input(Dr).query(async({input:t})=>{console.log("[Server] Get Capabilities:",t);const n=t||{type:"ggml-llm"},{type:o="ggml-llm",config:r,currentClientCapabilities:a=null,options:i={}}=n,s=Fr(r),l=e.getModelIdentifier(o,s),u=c(o,l),d=Rr(u,r);if(0===Object.keys(d).length)throw new Error("Buttress server missing generator configuration");return d.backend=d.backend||{},d.backend.type||(d.backend.type=o),e.getCapabilities(o,a,{...i,config:d})}),startGenerator:Ir.procedure.input(zr).mutation(async({input:t})=>{console.log("[Server] Start Generator:",t);const{type:n,config:o}=t,r=Fr(o),a=e.getModelIdentifier(n,r),i=c(n,a),s=Rr(i,o);if(0===Object.keys(s).length)throw new Error("Buttress server missing generator configuration");return s.backend=s.backend||{},s.backend.type||(s.backend.type=n),e.startGenerator(n,s)}),finalizeGenerator:Ir.procedure.input(Nr).mutation(async({input:t})=>(console.log("[Server] Finalize Generator:",t),e.finalizeGenerator(t.id))),ggmlLlm:Ir.router({initContext:Ir.procedure.input(Pr).subscription(({input:t})=>te(n=>{console.log("[Server] Init Context:",t);let o=!0;return(async()=>{try{const r={...t.property,onProgress:e=>{o&&n.next({progress:e})}};await new Promise(e=>setTimeout(e));const a=await e.ggmlLlm.initContext(t.id,r);if(o){const{download:e,...t}=a||{};n.next({result:t}),n.complete()}}catch(e){o&&n.error(e)}})(),()=>{o=!1}})),createCompletion:Ir.procedure.input(Pr).mutation(async({input:t})=>{console.log("[Server] createCompletion:",t);const n=`completion-${Date.now()}-${Math.random().toString(36).slice(2,9)}`;try{const o=await e.ggmlLlm.completion(t.id,t.property);if(!o)throw new Error("Failed to create completion stream");return qr.set(n,{stream:o,cancel:null,generatorId:t.id}),{completionId:n}}catch(e){throw console.error("[Server] createCompletion error:",e),e}}),completion:Ir.procedure.input(Pr).subscription(({input:e})=>te(t=>{const n=e.property;console.log("[Server] completion subscription:",n);const o=qr.get(n);if(!o)return t.error(new Error(`Unknown completion ID: ${n}`)),()=>{};const{stream:r}=o,a=((e,t)=>{const n=e.getReader();let o=!0;return(async()=>{try{for(;o;){const{value:e,done:r}=await n.read();if(r||!o)break;if(e){const n=Br.decode(e,{stream:!0});t.next(n)}}t.complete()}catch(e){t.error(e)}finally{n.cancel().catch(()=>{})}})(),()=>{o=!1,n.cancel().catch(()=>{})}})(r,t);return o.cancel=a,()=>{console.log("[Server] completion subscription closed:",n),a(),qr.delete(n)}})),cancelCompletion:Ir.procedure.input(Pr).mutation(async({input:e})=>{const t=e.property;console.log("[Server] cancelCompletion:",t);const n=qr.get(t);return n?(n.cancel&&n.cancel(),qr.delete(t),{success:!0}):{success:!1,error:"Unknown completion ID"}}),tokenize:Ir.procedure.input(Pr).mutation(async({input:t})=>(console.log("[Server] Tokenize:",t),e.ggmlLlm.tokenize(t.id,t.property))),detokenize:Ir.procedure.input(Pr).mutation(async({input:t})=>(console.log("[Server] Detokenize:",t),e.ggmlLlm.detokenize(t.id,t.property))),applyChatTemplate:Ir.procedure.input(Pr).mutation(async({input:t})=>(console.log("[Server] Apply Chat Template:",t),e.ggmlLlm.applyChatTemplate(t.id,t.property))),releaseContext:Ir.procedure.input(Pr).mutation(async({input:t})=>(console.log("[Server] Release Context:",t),e.ggmlLlm.releaseContext(t.id,t.property)))}),ggmlStt:Ir.router({initContext:Ir.procedure.input(Pr).subscription(({input:t})=>te(n=>{console.log("[Server] Init STT Context:",t);let o=!0;return(async()=>{try{const r={...t.property,onProgress:e=>{o&&n.next({progress:e})}};await new Promise(e=>setTimeout(e));const a=await e.ggmlStt.initContext(t.id,r);if(o){const{download:e,...t}=a||{};n.next({result:t}),n.complete()}}catch(e){o&&n.error(e)}})(),()=>{o=!1}})),transcribeData:Ir.procedure.input(o.instanceof(FormData)).mutation(async({input:t})=>{const n=t,o=n.get("id"),r=n.get("options"),a=n.get("audioData"),i=r?JSON.parse(r):{};let s;if(a instanceof Blob||a&&"function"==typeof a.arrayBuffer){const e=await a.arrayBuffer();s=Buffer.from(e)}else s=Buffer.isBuffer(a)?a:a instanceof ArrayBuffer?Buffer.from(a):a;return console.log("[Server] Transcribe Data:",{id:o,audioDataLength:s?.length||0,options:i}),e.ggmlStt.transcribeData(o,{audioData:s,options:i})}),releaseContext:Ir.procedure.input(Pr).mutation(async({input:t})=>(console.log("[Server] Release STT Context:",t),e.ggmlStt.releaseContext(t.id,t.property)))}),status:xr(e)})},jr=({backend:e=h,router:t,createContext:n=()=>({}),defaultConfig:o,maxBodySize:r=104857600,enableOpenAICompat:a="1"===process.env.ENABLE_OPENAI_COMPAT_ENDPOINT}={})=>{const i=t||Ur(e,{defaultConfig:o}),s=a?Er({backend:e,defaultConfig:o}):null;return{server:Nt({router:i,createContext:n,basePath:"/trpc/",maxBodySize:r,middleware:async(e,t,n)=>{const o=e.headers["content-length"],r=e.headers["content-type"];console.log(`[Request] ${e.method} ${e.url} content-length=${o} content-type=${r}`);const a=new URL(e.url,`http://${e.headers.host}`);if("/status"!==a.pathname&&"/status/"!==a.pathname){if(s&&a.pathname.startsWith("/oai-compat/"))try{if(await s(e,t,a))return}catch(e){return console.error("[OpenAI] Handler error:",e),t.writeHead(500,{"Content-Type":"application/json"}),void t.end(JSON.stringify({error:{message:e.message,type:"server_error"}}))}n()}else(async e=>{try{const t=g.join($r,"..","public","status.html"),n=await(0,y.readFile)(t,"utf-8");return e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(n),!0}catch(t){return e.writeHead(404,{"Content-Type":"text/plain"}),e.end("Status page not found"),!0}})(t)}}),router:i,backend:e,openaiEnabled:a}},Lr=async({port:e=2080,backend:t,router:n,createContext:o,defaultConfig:r,maxBodySize:a,enableOpenAICompat:i}={})=>{const{server:s,router:l,backend:c,openaiEnabled:u}=jr({backend:t,router:n,createContext:o,defaultConfig:r,maxBodySize:a,enableOpenAICompat:i});return s.server&&(void 0!==s.server.headersTimeout&&(s.server.headersTimeout=0),void 0!==s.server.requestTimeout&&(s.server.requestTimeout=0),void 0!==s.server.timeout&&(s.server.timeout=0)),await new Promise(t=>s.listen(e,t)),console.log(`[Server] Status page available at http://localhost:${e}/status`),{server:s,router:l,port:e,backend:c,openaiEnabled:u}},{testGgmlLlmCapabilities:Gr,testGgmlSttCapabilities:Hr,showModelsTable:Jr,showSttModelsTable:Vr,startModelDownload:Kr,globalDownloadManager:Yr}=h;export{vr as checkAndNotifyUpdates,br as checkForUpdates,wr as compareVersions,Ur as createRouter,jr as createServer,yr as currentVersion,Yr as globalDownloadManager,Jr as showModelsTable,Vr as showSttModelsTable,Kr as startModelDownload,Lr as startServer,Gr as testGgmlLlmCapabilities,Hr as testGgmlSttCapabilities};
|
|
1
|
+
import{createRequire as e}from"node:module";const t=e(import.meta.url);import{initTRPC as n}from"@trpc/server";import{z as r}from"zod";import{gguf as o}from"@huggingface/gguf";import{getBackendDevicesInfo as a,isLibVariantAvailable as i,loadModel as s}from"@fugood/llama.node";import{initWhisper as l}from"@fugood/whisper.node";import{default as c}from"@iarna/toml";var u,d,p={285:e=>{e.exports=function(e,t){if("string"==typeof e)return i(e);if("number"==typeof e)return a(e,t);return null},e.exports.format=a,e.exports.parse=i;var t=/\B(?=(\d{3})+(?!\d))/g,n=/(?:\.0*|(\.[^0]+)0+)$/,r={b:1,kb:1024,mb:1<<20,gb:1<<30,tb:Math.pow(1024,4),pb:Math.pow(1024,5)},o=/^((-|\+)?(\d+(?:\.\d+)?)) *(kb|mb|gb|tb|pb)$/i;function a(e,o){if(!Number.isFinite(e))return null;var a=Math.abs(e),i=o&&o.thousandsSeparator||"",s=o&&o.unitSeparator||"",l=o&&void 0!==o.decimalPlaces?o.decimalPlaces:2,c=Boolean(o&&o.fixedDecimals),u=o&&o.unit||"";u&&r[u.toLowerCase()]||(u=a>=r.pb?"PB":a>=r.tb?"TB":a>=r.gb?"GB":a>=r.mb?"MB":a>=r.kb?"KB":"B");var d=(e/r[u.toLowerCase()]).toFixed(l);return c||(d=d.replace(n,"$1")),i&&(d=d.split(".").map(function(e,n){return 0===n?e.replace(t,i):e}).join(".")),d+s+u}function i(e){if("number"==typeof e&&!isNaN(e))return e;if("string"!=typeof e)return null;var t,n=o.exec(e),a="b";return n?(t=parseFloat(n[1]),a=n[4].toLowerCase()):(t=parseInt(e,10),a="b"),isNaN(t)?null:Math.floor(r[a]*t)}}},m={};function f(e){var t=m[e];if(void 0!==t)return t.exports;var n=m[e]={exports:{}};return p[e](n,n.exports,f),n.exports}d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if("object"==typeof e&&e){if(4&t&&e.__esModule)return e;if(16&t&&"function"==typeof e.then)return e}var n=Object.create(null);f.r(n);var r={};u=u||[null,d({}),d([]),d(d)];for(var o=2&t&&e;("object"==typeof o||"function"==typeof o)&&!~u.indexOf(o);o=d(o))Object.getOwnPropertyNames(o).forEach(t=>r[t]=()=>e[t]);return r.default=()=>e,f.d(n,r),n},f.d=(e,t)=>{for(var n in t)f.o(t,n)&&!f.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},f.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var h={};f.r(h),f.d(h,{finalizeGenerator:()=>uo,generatorRegistry:()=>io,getCapabilities:()=>Qr,getModelIdentifier:()=>fo,ggmlLlm:()=>po,ggmlStt:()=>mo,globalDownloadManager:()=>so,showModelsTable:()=>no,showSttModelsTable:()=>oo,startGenerator:()=>co,startModelDownload:()=>yo,status:()=>ho,testGgmlLlmCapabilities:()=>ro,testGgmlSttCapabilities:()=>ao});const y=t("node:fs/promises"),g=t("node:path"),b=t("node:url"),w={PARSE_ERROR:-32700,BAD_REQUEST:-32600,INTERNAL_SERVER_ERROR:-32603,NOT_IMPLEMENTED:-32603,BAD_GATEWAY:-32603,SERVICE_UNAVAILABLE:-32603,GATEWAY_TIMEOUT:-32603,UNAUTHORIZED:-32001,PAYMENT_REQUIRED:-32002,FORBIDDEN:-32003,NOT_FOUND:-32004,METHOD_NOT_SUPPORTED:-32005,TIMEOUT:-32008,CONFLICT:-32009,PRECONDITION_FAILED:-32012,PAYLOAD_TOO_LARGE:-32013,UNSUPPORTED_MEDIA_TYPE:-32015,UNPROCESSABLE_CONTENT:-32022,PRECONDITION_REQUIRED:-32028,TOO_MANY_REQUESTS:-32029,CLIENT_CLOSED_REQUEST:-32099},v={[-32700]:"PARSE_ERROR",[-32600]:"BAD_REQUEST",[-32603]:"INTERNAL_SERVER_ERROR",[-32001]:"UNAUTHORIZED",[-32002]:"PAYMENT_REQUIRED",[-32003]:"FORBIDDEN",[-32004]:"NOT_FOUND",[-32005]:"METHOD_NOT_SUPPORTED",[-32008]:"TIMEOUT",[-32009]:"CONFLICT",[-32012]:"PRECONDITION_FAILED",[-32013]:"PAYLOAD_TOO_LARGE",[-32015]:"UNSUPPORTED_MEDIA_TYPE",[-32022]:"UNPROCESSABLE_CONTENT",[-32028]:"PRECONDITION_REQUIRED",[-32029]:"TOO_MANY_REQUESTS",[-32099]:"CLIENT_CLOSED_REQUEST"};function _(e){return!!e&&!Array.isArray(e)&&"object"==typeof e}const x="function"==typeof Symbol&&!!Symbol.asyncIterator;function S(e){return x&&_(e)&&Symbol.asyncIterator in e}const k=e=>e();function C(e){return e}var M=Object.create,T=Object.defineProperty,E=Object.getOwnPropertyDescriptor,$=Object.getOwnPropertyNames,B=Object.getPrototypeOf,I=Object.prototype.hasOwnProperty,O=(e,t)=>function(){return t||(0,e[$(e)[0]])((t={exports:{}}).exports,t),t.exports},N=(e,t,n)=>(n=null!=e?M(B(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(var o,a=$(t),i=0,s=a.length;i<s;i++)o=a[i],I.call(e,o)||o===n||T(e,o,{get:(e=>t[e]).bind(null,o),enumerable:!(r=E(t,o))||r.enumerable});return e})(!t&&e&&e.__esModule?n:T(n,"default",{value:e,enumerable:!0}),e));const P={PARSE_ERROR:400,BAD_REQUEST:400,UNAUTHORIZED:401,PAYMENT_REQUIRED:402,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_SUPPORTED:405,TIMEOUT:408,CONFLICT:409,PRECONDITION_FAILED:412,PAYLOAD_TOO_LARGE:413,UNSUPPORTED_MEDIA_TYPE:415,UNPROCESSABLE_CONTENT:422,PRECONDITION_REQUIRED:428,TOO_MANY_REQUESTS:429,CLIENT_CLOSED_REQUEST:499,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504};function q(e){var t;return null!==(t=P[e])&&void 0!==t?t:500}function z(e){return q(e.code)}var D=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/typeof.js"(e,t){function n(e){return t.exports=n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t.exports.__esModule=!0,t.exports.default=t.exports,n(e)}t.exports=n,t.exports.__esModule=!0,t.exports.default=t.exports}}),A=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPrimitive.js"(e,t){var n=D().default;t.exports=function(e,t){if("object"!=n(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var o=r.call(e,t||"default");if("object"!=n(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)},t.exports.__esModule=!0,t.exports.default=t.exports}}),R=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPropertyKey.js"(e,t){var n=D().default,r=A();t.exports=function(e){var t=r(e,"string");return"symbol"==n(t)?t:t+""},t.exports.__esModule=!0,t.exports.default=t.exports}}),F=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js"(e,t){var n=R();t.exports=function(e,t,r){return(t=n(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e},t.exports.__esModule=!0,t.exports.default=t.exports}}),j=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/objectSpread2.js"(e,t){var n=F();function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}t.exports=function(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?r(Object(o),!0).forEach(function(t){n(e,t,o[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):r(Object(o)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))})}return e},t.exports.__esModule=!0,t.exports.default=t.exports}}),U=N(j(),1);function L(e){const{path:t,error:n,config:r}=e,{code:o}=e.error,a={message:n.message,code:w[o],data:{code:o,httpStatus:z(n)}};return r.isDev&&"string"==typeof e.error.stack&&(a.data.stack=e.error.stack),"string"==typeof t&&(a.data.path=t),r.errorFormatter((0,U.default)((0,U.default)({},e),{},{shape:a}))}var G=N(F(),1),H=class extends Error{};function J(e){if(e instanceof V)return e;if(e instanceof Error&&"TRPCError"===e.name)return e;const t=new V({code:"INTERNAL_SERVER_ERROR",cause:e});return e instanceof Error&&e.stack&&(t.stack=e.stack),t}var V=class extends Error{constructor(e){var t,n,r;const o=function(e){if(e instanceof Error)return e;const t=typeof e;return"undefined"!==t&&"function"!==t&&null!==e?"object"!==t?new Error(String(e)):_(e)?Object.assign(new H,e):void 0:void 0}(e.cause);super(null!==(t=null!==(n=e.message)&&void 0!==n?n:null==o?void 0:o.message)&&void 0!==t?t:e.code,{cause:o}),(0,G.default)(this,"cause",void 0),(0,G.default)(this,"code",void 0),this.code=e.code,this.name="TRPCError",null!==(r=this.cause)&&void 0!==r||(this.cause=o)}},K=N(j(),1);function Y(e,t){return"error"in t?(0,K.default)((0,K.default)({},t),{},{error:e.transformer.output.serialize(t.error)}):"data"in t.result?(0,K.default)((0,K.default)({},t),{},{result:(0,K.default)((0,K.default)({},t.result),{},{data:e.transformer.output.serialize(t.result.data)})}):t}function W(e,t){return Array.isArray(t)?t.map(t=>Y(e,t)):Y(e,t)}Error;N(j(),1);async function Q(e,t){const{_def:n}=e;let r=n.procedures[t];for(;!r;){const e=Object.keys(n.lazy).find(e=>t.startsWith(e));if(!e)return null;const o=n.lazy[e];await o.load(),r=n.procedures[t]}return r}const Z=Symbol();function X(e){return Array.isArray(e)&&e[2]===Z}function ee(e){return"object"==typeof e&&null!==e&&"subscribe"in e}function te(e){const t={subscribe(t){let n=null,r=!1,o=!1,a=!1;function i(){null!==n?o||(o=!0,"function"==typeof n?n():n&&n.unsubscribe()):a=!0}return n=e({next(e){var n;r||null===(n=t.next)||void 0===n||n.call(t,e)},error(e){var n;r||(r=!0,null===(n=t.error)||void 0===n||n.call(t,e),i())},complete(){var e;r||(r=!0,null===(e=t.complete)||void 0===e||e.call(t),i())}}),a&&i(),{unsubscribe:i}},pipe:(...e)=>e.reduce(ne,t)};return t}function ne(e,t){return t(e)}function re(e,t){const n=function(e,t){let n=null;const r=()=>{null==n||n.unsubscribe(),n=null,t.removeEventListener("abort",r)};return new ReadableStream({start(o){n=e.subscribe({next(e){o.enqueue({ok:!0,value:e})},error(e){o.enqueue({ok:!1,error:e}),o.close()},complete(){o.close()}}),t.aborted?r():t.addEventListener("abort",r,{once:!0})},cancel(){r()}})}(e,t),r=n.getReader(),o={async next(){const e=await r.read();if(e.done)return{value:void 0,done:!0};const{value:t}=e;if(!t.ok)throw t.error;return{value:t.value,done:!1}},return:async()=>(await r.cancel(),{value:void 0,done:!0})};return{[Symbol.asyncIterator]:()=>o}}function oe(e){let t;try{t=JSON.parse(e)}catch(e){throw new V({code:"PARSE_ERROR",message:"Not JSON-parsable query params",cause:e})}return function(e){try{if(null===e)return null;if(!_(e))throw new Error("Expected object");const t=Object.entries(e).filter(([e,t])=>"string"!=typeof t);if(t.length>0)throw new Error(`Expected connectionParams to be string values. Got ${t.map(([e,t])=>`${e}: ${typeof t}`).join(", ")}`);return e}catch(e){throw new V({code:"PARSE_ERROR",message:"Invalid connection params shape",cause:e})}}(t)}var ae=N(j(),1);function ie(e){let t=null;const n=Symbol.for("@trpc/server/http/memo");let r=n;return{read:async()=>{var o;return r!==n||(null!==(o=t)&&void 0!==o||(t=e().catch(e=>{if(e instanceof V)throw e;throw new V({code:"BAD_REQUEST",message:e instanceof Error?e.message:"Invalid input",cause:e})})),r=await t,t=null),r},result:()=>r!==n?r:void 0}}const se={isMatch(e){var t;return!!(null===(t=e.headers.get("content-type"))||void 0===t?void 0:t.startsWith("application/json"))},async parse(e){var t;const{req:n}=e,r="1"===e.searchParams.get("batch"),o=r?e.path.split(","):[e.path],a=ie(async()=>{let t;if("GET"===n.method){const n=e.searchParams.get("input");n&&(t=JSON.parse(n))}else t=await n.json();if(void 0===t)return{};if(!r)return{0:e.router._def._config.transformer.input.deserialize(t)};if(!_(t))throw new V({code:"BAD_REQUEST",message:'"input" needs to be an object when doing a batch call'});const a={};for(const n of o.keys()){const r=t[n];void 0!==r&&(a[n]=e.router._def._config.transformer.input.deserialize(r))}return a}),i=await Promise.all(o.map(async(t,n)=>{const r=await Q(e.router,t);return{path:t,procedure:r,getRawInput:async()=>{let t=(await a.read())[n];if("subscription"===(null==r?void 0:r._def.type)){var o,i;const n=null!==(o=null!==(i=e.headers.get("last-event-id"))&&void 0!==i?i:e.searchParams.get("lastEventId"))&&void 0!==o?o:e.searchParams.get("Last-Event-Id");if(n)if(_(t))t=(0,ae.default)((0,ae.default)({},t),{},{lastEventId:n});else{var s;null!==(s=t)&&void 0!==s||(t={lastEventId:n})}}return t},result:()=>{var e;return null===(e=a.result())||void 0===e?void 0:e[n]}}})),s=new Set(i.map(e=>{var t;return null===(t=e.procedure)||void 0===t?void 0:t._def.type}).filter(Boolean));if(s.size>1)throw new V({code:"BAD_REQUEST",message:`Cannot mix procedure types in call: ${Array.from(s).join(", ")}`});const l=null!==(t=s.values().next().value)&&void 0!==t?t:"unknown",c=e.searchParams.get("connectionParams");return{isBatchCall:r,accept:n.headers.get("trpc-accept"),calls:i,type:l,connectionParams:null===c?null:oe(c),signal:n.signal,url:e.url}}},le=[se,{isMatch(e){var t;return!!(null===(t=e.headers.get("content-type"))||void 0===t?void 0:t.startsWith("multipart/form-data"))},async parse(e){const{req:t}=e;if("POST"!==t.method)throw new V({code:"METHOD_NOT_SUPPORTED",message:"Only POST requests are supported for multipart/form-data requests"});const n=ie(async()=>await t.formData()),r=await Q(e.router,e.path);return{accept:null,calls:[{path:e.path,getRawInput:n.read,result:n.result,procedure:r}],isBatchCall:!1,type:"mutation",connectionParams:null,signal:t.signal,url:e.url}}},{isMatch(e){var t;return!!(null===(t=e.headers.get("content-type"))||void 0===t?void 0:t.startsWith("application/octet-stream"))},async parse(e){const{req:t}=e;if("POST"!==t.method)throw new V({code:"METHOD_NOT_SUPPORTED",message:"Only POST requests are supported for application/octet-stream requests"});const n=ie(async()=>t.body);return{calls:[{path:e.path,getRawInput:n.read,result:n.result,procedure:await Q(e.router,e.path)}],isBatchCall:!1,accept:null,type:"mutation",connectionParams:null,signal:t.signal,url:e.url}}}];async function ce(e){const t=function(e){const t=le.find(t=>t.isMatch(e));if(t)return t;if(!t&&"GET"===e.method)return se;throw new V({code:"UNSUPPORTED_MEDIA_TYPE",message:e.headers.has("content-type")?`Unsupported content-type "${e.headers.get("content-type")}`:"Missing content-type header"})}(e.req);return await t.parse(e)}function ue(e){return _(e)&&"AbortError"===e.name}function de(e="AbortError"){throw new DOMException(e,"AbortError")}function pe(e){return"[object Object]"===Object.prototype.toString.call(e)}var me=N(F(),1);let fe;const he=new WeakMap,ye=()=>{};fe=Symbol.toStringTag;var ge,be,we,ve,_e=class e{constructor(e){(0,me.default)(this,"promise",void 0),(0,me.default)(this,"subscribers",[]),(0,me.default)(this,"settlement",null),(0,me.default)(this,fe,"Unpromise"),this.promise="function"==typeof e?new Promise(e):e;const t=this.promise.then(e=>{const{subscribers:t}=this;this.subscribers=null,this.settlement={status:"fulfilled",value:e},null==t||t.forEach(({resolve:t})=>{t(e)})});"catch"in t&&t.catch(e=>{const{subscribers:t}=this;this.subscribers=null,this.settlement={status:"rejected",reason:e},null==t||t.forEach(({reject:t})=>{t(e)})})}subscribe(){let e,t;const{settlement:n}=this;if(null===n){if(null===this.subscribers)throw new Error("Unpromise settled but still has subscribers");const n=function(){let e,t;const n=new Promise((n,r)=>{e=n,t=r});return{promise:n,resolve:e,reject:t}}();this.subscribers=(r=this.subscribers,o=n,[...r,o]),e=n.promise,t=()=>{null!==this.subscribers&&(this.subscribers=function(e,t){const n=e.indexOf(t);return-1!==n?function(e,t){return[...e.slice(0,t),...e.slice(t+1)]}(e,n):e}(this.subscribers,n))}}else{const{status:r}=n;e="fulfilled"===r?Promise.resolve(n.value):Promise.reject(n.reason),t=ye}var r,o;return Object.assign(e,{unsubscribe:t})}then(e,t){const n=this.subscribe(),{unsubscribe:r}=n;return Object.assign(n.then(e,t),{unsubscribe:r})}catch(e){const t=this.subscribe(),{unsubscribe:n}=t;return Object.assign(t.catch(e),{unsubscribe:n})}finally(e){const t=this.subscribe(),{unsubscribe:n}=t;return Object.assign(t.finally(e),{unsubscribe:n})}static proxy(t){const n=e.getSubscribablePromise(t);return void 0!==n?n:e.createSubscribablePromise(t)}static createSubscribablePromise(t){const n=new e(t);return he.set(t,n),he.set(n,n),n}static getSubscribablePromise(e){return he.get(e)}static resolve(t){const n="object"==typeof t&&null!==t&&"then"in t&&"function"==typeof t.then?t:Promise.resolve(t);return e.proxy(n).subscribe()}static async any(t){const n=(Array.isArray(t)?t:[...t]).map(e.resolve);try{return await Promise.any(n)}finally{n.forEach(({unsubscribe:e})=>{e()})}}static async race(t){const n=(Array.isArray(t)?t:[...t]).map(e.resolve);try{return await Promise.race(n)}finally{n.forEach(({unsubscribe:e})=>{e()})}}static async raceReferences(e){const t=e.map(xe);try{return await Promise.race(t)}finally{for(const e of t)e.unsubscribe()}}};function xe(e){return _e.proxy(e).then(()=>[e])}function Se(e,t){const n=e,r=n[Symbol.dispose];return n[Symbol.dispose]=()=>{t(),null==r||r()},n}function ke(e,t){const n=e,r=n[Symbol.asyncDispose];return n[Symbol.asyncDispose]=async()=>{await t(),await(null==r?void 0:r())},n}null!==(be=(ge=Symbol).dispose)&&void 0!==be||(ge.dispose=Symbol()),null!==(ve=(we=Symbol).asyncDispose)&&void 0!==ve||(we.asyncDispose=Symbol());const Ce=Symbol();function Me(e){let t=null;return Se({start(){if(t)throw new Error("Timer already started");return new Promise(n=>{t=setTimeout(()=>n(Ce),e)})}},()=>{t&&clearTimeout(t)})}var Te=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/usingCtx.js"(e,t){t.exports=function(){var e="function"==typeof SuppressedError?SuppressedError:function(e,t){var n=Error();return n.name="SuppressedError",n.error=e,n.suppressed=t,n},t={},n=[];function r(e,t){if(null!=t){if(Object(t)!==t)throw new TypeError("using declarations can only be used with objects, functions, null, or undefined.");if(e)var r=t[Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose")];if(void 0===r&&(r=t[Symbol.dispose||Symbol.for("Symbol.dispose")],e))var o=r;if("function"!=typeof r)throw new TypeError("Object is not disposable.");o&&(r=function(){try{o.call(t)}catch(e){return Promise.reject(e)}}),n.push({v:t,d:r,a:e})}else e&&n.push({d:t,a:e});return t}return{e:t,u:r.bind(null,!1),a:r.bind(null,!0),d:function(){var r,o=this.e,a=0;function i(){for(;r=n.pop();)try{if(!r.a&&1===a)return a=0,n.push(r),Promise.resolve().then(i);if(r.d){var e=r.d.call(r.v);if(r.a)return a|=2,Promise.resolve(e).then(i,s)}else a|=1}catch(e){return s(e)}if(1===a)return o!==t?Promise.reject(o):Promise.resolve();if(o!==t)throw o}function s(n){return o=o!==t?new e(n,o):n,i()}return i()}}},t.exports.__esModule=!0,t.exports.default=t.exports}}),Ee=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/OverloadYield.js"(e,t){t.exports=function(e,t){this.v=e,this.k=t},t.exports.__esModule=!0,t.exports.default=t.exports}}),$e=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/awaitAsyncGenerator.js"(e,t){var n=Ee();t.exports=function(e){return new n(e,0)},t.exports.__esModule=!0,t.exports.default=t.exports}}),Be=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/wrapAsyncGenerator.js"(e,t){var n=Ee();function r(e){var t,r;function o(t,r){try{var i=e[t](r),s=i.value,l=s instanceof n;Promise.resolve(l?s.v:s).then(function(n){if(l){var r="return"===t?"return":"next";if(!s.k||n.done)return o(r,n);n=e[r](n).value}a(i.done?"return":"normal",n)},function(e){o("throw",e)})}catch(e){a("throw",e)}}function a(e,n){switch(e){case"return":t.resolve({value:n,done:!0});break;case"throw":t.reject(n);break;default:t.resolve({value:n,done:!1})}(t=t.next)?o(t.key,t.arg):r=null}this._invoke=function(e,n){return new Promise(function(a,i){var s={key:e,arg:n,resolve:a,reject:i,next:null};r?r=r.next=s:(t=r=s,o(e,n))})},"function"!=typeof e.return&&(this.return=void 0)}r.prototype["function"==typeof Symbol&&Symbol.asyncIterator||"@@asyncIterator"]=function(){return this},r.prototype.next=function(e){return this._invoke("next",e)},r.prototype.throw=function(e){return this._invoke("throw",e)},r.prototype.return=function(e){return this._invoke("return",e)},t.exports=function(e){return function(){return new r(e.apply(this,arguments))}},t.exports.__esModule=!0,t.exports.default=t.exports}}),Ie=N(Te(),1),Oe=N($e(),1),Ne=N(Be(),1);function Pe(e){const t=e[Symbol.asyncIterator]();return t[Symbol.asyncDispose]?t:ke(t,async()=>{var e;await(null===(e=t.return)||void 0===e?void 0:e.call(t))})}function qe(){return(qe=(0,Ne.default)(function*(e,t){try{var n=(0,Ie.default)();const r=n.a(Pe(e)),o=n.u(Me(t.maxDurationMs)).start();let a;for(;;){if(a=yield(0,Oe.default)(_e.race([r.next(),o])),a===Ce&&de(),a.done)return a;yield a.value,a=null}}catch(e){n.e=e}finally{yield(0,Oe.default)(n.d())}})).apply(this,arguments)}function ze(){return(ze=(0,Ne.default)(function*(e,t){try{var n=(0,Ie.default)();const r=n.a(Pe(e));let o;const a=n.u(Me(t.gracePeriodMs));let i=t.count,s=new Promise(()=>{});for(;;){if(o=yield(0,Oe.default)(_e.race([r.next(),s])),o===Ce&&de(),o.done)return o.value;yield o.value,0===--i&&(s=a.start()),o=null}}catch(e){n.e=e}finally{yield(0,Oe.default)(n.d())}})).apply(this,arguments)}function De(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}}var Ae=N(Te(),1),Re=N($e(),1),Fe=N(Be(),1);function je(){let e="idle",t=De();const n=[],r=new Set,o=[];function a(n){if("pending"!==e)return;const a=function(e,t){const n=e[Symbol.asyncIterator]();let r="idle";function o(){r="done",t=()=>{}}return{pull:function(){"idle"===r&&(r="pending",n.next().then(e=>{if(e.done)return r="done",t({status:"return",value:e.value}),void o();r="idle",t({status:"yield",value:e.value})}).catch(e=>{t({status:"error",error:e}),o()}))},destroy:async()=>{var e;o(),await(null===(e=n.return)||void 0===e?void 0:e.call(n))}}}(n,n=>{if("pending"===e){switch(n.status){case"yield":o.push([a,n]);break;case"return":r.delete(a);break;case"error":o.push([a,n]),r.delete(a)}t.resolve()}});r.add(a),a.pull()}return{add(t){switch(e){case"idle":n.push(t);break;case"pending":a(t)}},[Symbol.asyncIterator]:()=>(0,Fe.default)(function*(){try{var i=(0,Ae.default)();if("idle"!==e)throw new Error("Cannot iterate twice");e="pending";i.a(ke({},async()=>{e="done";const n=[];if(await Promise.all(Array.from(r.values()).map(async e=>{try{await e.destroy()}catch(e){n.push(e)}})),o.length=0,r.clear(),t.resolve(),n.length>0)throw new AggregateError(n)}));for(;n.length>0;)a(n.shift());for(;r.size>0;){for(yield(0,Re.default)(t.promise);o.length>0;){const[e,t]=o.shift();switch(t.status){case"yield":yield t.value,e.pull();break;case"error":throw t.error}}t=De()}}catch(e){i.e=e}finally{yield(0,Re.default)(i.d())}})()}}function Ue(e){const t=e[Symbol.asyncIterator]();return new ReadableStream({async cancel(){var e;await(null===(e=t.return)||void 0===e?void 0:e.call(t))},async pull(e){const n=await t.next();n.done?e.close():e.enqueue(n.value)}})}var Le=N(Te(),1),Ge=N($e(),1),He=N(Be(),1);const Je=Symbol("ping");function Ve(e,t){return Ke.apply(this,arguments)}function Ke(){return(Ke=(0,He.default)(function*(e,t){try{var n=(0,Le.default)();const o=n.a(Pe(e));let a,i=o.next();for(;;)try{var r=(0,Le.default)();const e=r.u(Me(t));if(a=yield(0,Ge.default)(_e.race([i,e.start()])),a===Ce){yield Je;continue}if(a.done)return a.value;i=o.next(),yield a.value,a=null}catch(e){r.e=e}finally{r.d()}}catch(e){n.e=e}finally{yield(0,Ge.default)(n.d())}})).apply(this,arguments)}var Ye=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/asyncIterator.js"(e,t){function n(e){function t(e){if(Object(e)!==e)return Promise.reject(new TypeError(e+" is not an object."));var t=e.done;return Promise.resolve(e.value).then(function(e){return{value:e,done:t}})}return(n=function(e){this.s=e,this.n=e.next}).prototype={s:null,n:null,next:function(){return t(this.n.apply(this.s,arguments))},return:function(e){var n=this.s.return;return void 0===n?Promise.resolve({value:e,done:!0}):t(n.apply(this.s,arguments))},throw:function(e){var n=this.s.return;return void 0===n?Promise.reject(e):t(n.apply(this.s,arguments))}},new n(e)}t.exports=function(e){var t,r,o,a=2;for("undefined"!=typeof Symbol&&(r=Symbol.asyncIterator,o=Symbol.iterator);a--;){if(r&&null!=(t=e[r]))return t.call(e);if(o&&null!=(t=e[o]))return new n(t.call(e));r="@@asyncIterator",o="@@iterator"}throw new TypeError("Object is not async iterable")},t.exports.__esModule=!0,t.exports.default=t.exports}}),We=N($e(),1),Qe=N(Be(),1),Ze=N(Te(),1),Xe=N(Ye(),1);function et(e){return(_(e)||"function"==typeof e)&&"function"==typeof(null==e?void 0:e.then)&&"function"==typeof(null==e?void 0:e.catch)}var tt=class extends Error{constructor(e){super("Max depth reached at path: "+e.join(".")),this.path=e}};function nt(){return nt=(0,Qe.default)(function*(e){const{data:t}=e;let n=0;const r=je();function o(e){const t=n++,o=e(t);return r.add(o),t}function a(t,n){return o(function(){var r=(0,Qe.default)(function*(r){const o=s(n);o&&(t.catch(t=>{var r;null===(r=e.onError)||void 0===r||r.call(e,{error:t,path:n})}),t=Promise.reject(o));try{const e=yield(0,We.default)(t);yield[r,0,c(e,n)]}catch(t){var a,i;null===(a=e.onError)||void 0===a||a.call(e,{error:t,path:n}),yield[r,1,null===(i=e.formatError)||void 0===i?void 0:i.call(e,{error:t,path:n})]}});return function(e){return r.apply(this,arguments)}}())}function i(t,n){return o(function(){var r=(0,Qe.default)(function*(r){try{var o=(0,Ze.default)();const l=s(n);if(l)throw l;const u=o.a(Pe(t));try{for(;;){const e=yield(0,We.default)(u.next());if(e.done){yield[r,0,c(e.value,n)];break}yield[r,1,c(e.value,n)]}}catch(t){var a,i;null===(a=e.onError)||void 0===a||a.call(e,{error:t,path:n}),yield[r,2,null===(i=e.formatError)||void 0===i?void 0:i.call(e,{error:t,path:n})]}}catch(e){o.e=e}finally{yield(0,We.default)(o.d())}});return function(e){return r.apply(this,arguments)}}())}function s(t){return e.maxDepth&&t.length>e.maxDepth?new tt(t):null}function l(t,n){if(et(t))return[0,a(t,n)];if(S(t)){if(e.maxDepth&&n.length>=e.maxDepth)throw new Error("Max depth reached");return[1,i(t,n)]}return null}function c(e,t){if(void 0===e)return[[]];const n=l(e,t);if(n)return[[0],[null,...n]];if(!1===pe(r=e)||void 0!==(o=r.constructor)&&(!1===pe(a=o.prototype)||!1===a.hasOwnProperty("isPrototypeOf")))return[[e]];var r,o,a;const i={},s=[];for(const[n,r]of Object.entries(e)){const e=l(r,[...t,n]);e?(i[n]=0,s.push([n,...e])):i[n]=r}return[[i],...s]}const u={};for(const[e,n]of Object.entries(t))u[e]=c(n,[e]);yield u;let d=r;e.pingMs&&(d=Ve(r,e.pingMs));var p,m=!1,f=!1;try{for(var h,y=(0,Xe.default)(d);m=!(h=yield(0,We.default)(y.next())).done;m=!1){const e=h.value;yield e}}catch(e){f=!0,p=e}finally{try{m&&null!=y.return&&(yield(0,We.default)(y.return()))}finally{if(f)throw p}}}),nt.apply(this,arguments)}function rt(e){let t=Ue(function(e){return nt.apply(this,arguments)}(e));const{serialize:n}=e;return n&&(t=t.pipeThrough(new TransformStream({transform(e,t){e===Je?t.enqueue(Je):t.enqueue(n(e))}}))),t.pipeThrough(new TransformStream({transform(e,t){e===Je?t.enqueue(" "):t.enqueue(JSON.stringify(e)+"\n")}})).pipeThrough(new TextEncoderStream)}Error;var ot=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/asyncGeneratorDelegate.js"(e,t){var n=Ee();t.exports=function(e){var t={},r=!1;function o(t,o){return r=!0,o=new Promise(function(n){n(e[t](o))}),{done:!1,value:new n(o,1)}}return t["undefined"!=typeof Symbol&&Symbol.iterator||"@@iterator"]=function(){return this},t.next=function(e){return r?(r=!1,e):o("next",e)},"function"==typeof e.throw&&(t.throw=function(e){if(r)throw r=!1,e;return o("throw",e)}),"function"==typeof e.return&&(t.return=function(e){return r?(r=!1,e):o("return",e)}),t},t.exports.__esModule=!0,t.exports.default=t.exports}}),at=N(Ye(),1),it=N($e(),1),st=N(Be(),1),lt=N(ot(),1);N(Te(),1);const ct="ping",ut="serialized-error",dt="connected",pt="return";function mt(e){var t,n,r,o,a;const{serialize:i=C}=e,s={enabled:null!==(t=null===(n=e.ping)||void 0===n?void 0:n.enabled)&&void 0!==t&&t,intervalMs:null!==(r=null===(o=e.ping)||void 0===o?void 0:o.intervalMs)&&void 0!==r?r:1e3},l=null!==(a=e.client)&&void 0!==a?a:{};if(s.enabled&&l.reconnectAfterInactivityMs&&s.intervalMs>l.reconnectAfterInactivityMs)throw new Error(`Ping interval must be less than client reconnect interval to prevent unnecessary reconnection - ping.intervalMs: ${s.intervalMs} client.reconnectAfterInactivityMs: ${l.reconnectAfterInactivityMs}`);function c(){return c=(0,st.default)(function*(){yield{event:dt,data:JSON.stringify(l)};let t,n,r=e.data;e.emitAndEndImmediately&&(r=function(e,t){return ze.apply(this,arguments)}(r,{count:1,gracePeriodMs:1})),e.maxDurationMs&&e.maxDurationMs>0&&e.maxDurationMs!==1/0&&(r=function(e,t){return qe.apply(this,arguments)}(r,{maxDurationMs:e.maxDurationMs})),s.enabled&&s.intervalMs!==1/0&&s.intervalMs>0&&(r=Ve(r,s.intervalMs));var o,a=!1,c=!1;try{for(var u,d=(0,at.default)(r);a=!(u=yield(0,it.default)(d.next())).done;a=!1)t=u.value,t!==Je?(n=X(t)?{id:t[0],data:t[1]}:{data:t},n.data=JSON.stringify(i(n.data)),yield n,t=null,n=null):yield{event:ct,data:""}}catch(e){c=!0,o=e}finally{try{a&&null!=d.return&&(yield(0,it.default)(d.return()))}finally{if(c)throw o}}}),c.apply(this,arguments)}function u(){return u=(0,st.default)(function*(){try{yield*(0,lt.default)((0,at.default)(function(){return c.apply(this,arguments)}())),yield{event:pt,data:""}}catch(r){var t,n;if(ue(r))return;const o=J(r),a=null!==(t=null===(n=e.formatError)||void 0===n?void 0:n.call(e,{error:o}))&&void 0!==t?t:null;yield{event:ut,data:JSON.stringify(i(a))}}}),u.apply(this,arguments)}const d=Ue(function(){return u.apply(this,arguments)}());return d.pipeThrough(new TransformStream({transform(e,t){"event"in e&&t.enqueue(`event: ${e.event}\n`),"data"in e&&t.enqueue(`data: ${e.data}\n`),"id"in e&&t.enqueue(`id: ${e.id}\n`),"comment"in e&&t.enqueue(`: ${e.comment}\n`),t.enqueue("\n\n")}})).pipeThrough(new TextEncoderStream)}const ft={"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform","X-Accel-Buffering":"no",Connection:"keep-alive"};var ht=N(Be(),1),yt=N(j(),1);function gt(e){return k((0,ht.default)(function*(){throw e}))}const bt={mutation:["POST"],query:["GET"],subscription:["GET"]},wt={mutation:["POST"],query:["GET","POST"],subscription:["GET","POST"]};function vt(e){var t,n,r;const{ctx:o,info:a,responseMeta:i,untransformedJSON:s,errors:l=[],headers:c}=e;let u=s?function(e){const t=Array.isArray(e)?e:[e],n=new Set(t.map(e=>{var t;return"error"in e&&_(e.error.data)?"number"==typeof(null===(t=e.error.data)||void 0===t?void 0:t.httpStatus)?e.error.data.httpStatus:q(v[e.error.code]):200}));return 1!==n.size?207:n.values().next().value}(s):200;const d=!s,p=d?[]:Array.isArray(s)?s:[s],m=null!==(t=null==i?void 0:i({ctx:o,info:a,paths:null==a?void 0:a.calls.map(e=>e.path),data:p,errors:l,eagerGeneration:d,type:null!==(n=null==a||null===(r=a.calls.find(e=>{var t;return null===(t=e.procedure)||void 0===t?void 0:t._def.type}))||void 0===r||null===(r=r.procedure)||void 0===r?void 0:r._def.type)&&void 0!==n?n:"unknown"}))&&void 0!==t?t:{};if(m.headers)if(m.headers instanceof Headers)for(const[e,t]of m.headers.entries())c.append(e,t);else for(const[e,t]of Object.entries(m.headers))if(Array.isArray(t))for(const n of t)c.append(e,n);else"string"==typeof t&&c.set(e,t);return m.status&&(u=m.status),{status:u}}function _t(e){return!!_(e)&&(!!S(e)||(Object.values(e).some(et)||Object.values(e).some(S)))}async function xt(e){var t,n,r,o,a,i;const{router:s,req:l}=e,c=new Headers([["vary","trpc-accept"]]),u=s._def._config,d=new URL(l.url);if("HEAD"===l.method)return new Response(null,{status:204});const p=null===(t=null!==(n=e.allowBatching)&&void 0!==n?n:null===(r=e.batching)||void 0===r?void 0:r.enabled)||void 0===t||t,m=null!==(o=e.allowMethodOverride)&&void 0!==o&&o&&"POST"===l.method,f=await k(async()=>{try{return[void 0,await ce({req:l,path:decodeURIComponent(e.path),router:s,searchParams:d.searchParams,headers:e.req.headers,url:d})]}catch(e){return[J(e),void 0]}}),h=k(()=>{let t;return{valueOrUndefined:()=>{if(t)return t[1]},value:()=>{const[e,n]=t;if(e)throw e;return n},create:async n=>{if(t)throw new Error("This should only be called once - report a bug in tRPC");try{const r=await e.createContext({info:n});t=[void 0,r]}catch(e){t=[J(e),void 0]}}}}),y=m?wt:bt,g="application/jsonl"===l.headers.get("trpc-accept"),b=null===(a=null===(i=u.sse)||void 0===i?void 0:i.enabled)||void 0===a||a;try{const[t,n]=f;if(t)throw t;if(n.isBatchCall&&!p)throw new V({code:"BAD_REQUEST",message:"Batching is not enabled on the server"});if(g&&!n.isBatchCall)throw new V({message:"Streaming requests must be batched (you can do a batch of 1)",code:"BAD_REQUEST"});await h.create(n);const r=n.calls.map(async t=>{const r=t.procedure;try{if(e.error)throw e.error;if(!r)throw new V({code:"NOT_FOUND",message:`No procedure found on path "${t.path}"`});if(!y[r._def.type].includes(l.method))throw new V({code:"METHOD_NOT_SUPPORTED",message:`Unsupported ${l.method}-request to ${r._def.type} procedure at path "${t.path}"`});if("subscription"===r._def.type&&n.isBatchCall)throw new V({code:"BAD_REQUEST",message:"Cannot batch subscription calls"});return[void 0,{data:await r({path:t.path,getRawInput:t.getRawInput,ctx:h.value(),type:r._def.type,signal:e.req.signal})}]}catch(n){var o,a,i;const r=J(n),s=t.result();return null===(o=e.onError)||void 0===o||o.call(e,{error:r,path:t.path,input:s,ctx:h.valueOrUndefined(),type:null!==(a=null===(i=t.procedure)||void 0===i?void 0:i._def.type)&&void 0!==a?a:"unknown",req:e.req}),[r,void 0]}});if(!n.isBatchCall){const[t]=n.calls,[o,a]=await r[0];switch(n.type){case"unknown":case"mutation":case"query":{if(c.set("content-type","application/json"),_t(null==a?void 0:a.data))throw new V({code:"UNSUPPORTED_MEDIA_TYPE",message:"Cannot use stream-like response in non-streaming request - use httpBatchStreamLink"});const r=o?{error:L({config:u,ctx:h.valueOrUndefined(),error:o,input:t.result(),path:t.path,type:n.type})}:{result:{data:a.data}},i=vt({ctx:h.valueOrUndefined(),info:n,responseMeta:e.responseMeta,errors:o?[o]:[],headers:c,untransformedJSON:[r]});return new Response(JSON.stringify(W(u,r)),{status:i.status,headers:c})}case"subscription":{const r=k(()=>{if(o)return gt(o);if(!b)return gt(new V({code:"METHOD_NOT_SUPPORTED",message:'Missing experimental flag "sseSubscriptions"'}));if(!ee(a.data)&&!S(a.data))return gt(new V({message:`Subscription ${t.path} did not return an observable or a AsyncGenerator`,code:"INTERNAL_SERVER_ERROR"}));return ee(a.data)?re(a.data,e.req.signal):a.data}),i=mt((0,yt.default)((0,yt.default)({},u.sse),{},{data:r,serialize:e=>u.transformer.output.serialize(e),formatError(n){var r,o,a;const i=J(n.error),s=null==t?void 0:t.result(),l=null==t?void 0:t.path,c=null!==(r=null==t||null===(o=t.procedure)||void 0===o?void 0:o._def.type)&&void 0!==r?r:"unknown";null===(a=e.onError)||void 0===a||a.call(e,{error:i,path:l,input:s,ctx:h.valueOrUndefined(),req:e.req,type:c});return L({config:u,ctx:h.valueOrUndefined(),error:i,input:s,path:l,type:c})}}));for(const[e,t]of Object.entries(ft))c.set(e,t);const s=vt({ctx:h.valueOrUndefined(),info:n,responseMeta:e.responseMeta,errors:[],headers:c,untransformedJSON:null});return new Response(i,{headers:c,status:s.status})}}}if("application/jsonl"===n.accept){c.set("content-type","application/json"),c.set("transfer-encoding","chunked");const t=vt({ctx:h.valueOrUndefined(),info:n,responseMeta:e.responseMeta,errors:[],headers:c,untransformedJSON:null}),o=rt((0,yt.default)((0,yt.default)({},u.jsonl),{},{maxDepth:1/0,data:r.map(async t=>{const[r,o]=await t,a=n.calls[0];var i,s;if(r)return{error:L({config:u,ctx:h.valueOrUndefined(),error:r,input:a.result(),path:a.path,type:null!==(i=null===(s=a.procedure)||void 0===s?void 0:s._def.type)&&void 0!==i?i:"unknown"})};const l=ee(o.data)?re(o.data,e.req.signal):Promise.resolve(o.data);return{result:Promise.resolve({data:l})}}),serialize:e=>u.transformer.output.serialize(e),onError:t=>{var r,o;null===(r=e.onError)||void 0===r||r.call(e,{error:J(t),path:void 0,input:void 0,ctx:h.valueOrUndefined(),req:e.req,type:null!==(o=null==n?void 0:n.type)&&void 0!==o?o:"unknown"})},formatError(e){var t,r;const o=null==n?void 0:n.calls[e.path[0]],a=J(e.error),i=null==o?void 0:o.result(),s=null==o?void 0:o.path,l=null!==(t=null==o||null===(r=o.procedure)||void 0===r?void 0:r._def.type)&&void 0!==t?t:"unknown";return L({config:u,ctx:h.valueOrUndefined(),error:a,input:i,path:s,type:l})}}));return new Response(o,{headers:c,status:t.status})}c.set("content-type","application/json");const o=(await Promise.all(r)).map(e=>{const[t,n]=e;return t?e:_t(n.data)?[new V({code:"UNSUPPORTED_MEDIA_TYPE",message:"Cannot use stream-like response in non-streaming request - use httpBatchStreamLink"}),void 0]:e}),a=o.map(([e,t],r)=>{const o=n.calls[r];var a,i;return e?{error:L({config:u,ctx:h.valueOrUndefined(),error:e,input:o.result(),path:o.path,type:null!==(a=null===(i=o.procedure)||void 0===i?void 0:i._def.type)&&void 0!==a?a:"unknown"})}:{result:{data:t.data}}}),i=o.map(([e])=>e).filter(Boolean),s=vt({ctx:h.valueOrUndefined(),info:n,responseMeta:e.responseMeta,untransformedJSON:a,errors:i,headers:c});return new Response(JSON.stringify(W(u,a)),{status:s.status,headers:c})}catch(t){var w;const[n,r]=f,o=h.valueOrUndefined(),{error:a,untransformedJSON:i,body:s}=function(e,t){const{router:n,req:r,onError:o}=t.opts,a=J(e);null==o||o({error:a,path:t.path,input:t.input,ctx:t.ctx,type:t.type,req:r});const i={error:L({config:n._def._config,error:a,type:t.type,path:t.path,input:t.input,ctx:t.ctx})},s=W(n._def._config,i);return{error:a,untransformedJSON:i,body:JSON.stringify(s)}}(t,{opts:e,ctx:h.valueOrUndefined(),type:null!==(w=null==r?void 0:r.type)&&void 0!==w?w:"unknown"}),l=vt({ctx:o,info:r,responseMeta:e.responseMeta,untransformedJSON:i,errors:[a],headers:c});return new Response(s,{status:l.status,headers:c})}}function St(e){try{var t,n;const r=e.headers[":scheme"]&&"https"===e.headers[":scheme"]||e.socket&&"encrypted"in e.socket&&e.socket.encrypted?"https:":"http:",o=null!==(t=null!==(n=e.headers.host)&&void 0!==n?n:e.headers[":authority"])&&void 0!==t?t:"localhost";return new URL(e.url,`${r}//${o}`)}catch(e){throw new V({code:"BAD_REQUEST",message:"Invalid URL",cause:e})}}function kt(e){const t=new Headers;for(const n in e){const r=e[n];if("string"!=typeof n||!n.startsWith(":"))if(Array.isArray(r))for(const e of r)t.append(n,e);else null!=r&&t.append(n,r)}return t}function Ct(e,t,n){const r=new AbortController,o=()=>{t.off("close",o),e.off("aborted",o),r.abort()};t.once("close",o),e.once("aborted",o);const a=St(e),i={headers:kt(e.headers),method:e.method,signal:r.signal};"GET"!==e.method&&"HEAD"!==e.method&&(i.body=function(e,t){if("body"in e){if(void 0===e.body)return;return"string"==typeof e.body?e.body:JSON.stringify(e.body)}let n=0,r=!1;return new ReadableStream({start(o){const a=s=>{n+=s.length,!t.maxBodySize||n<=t.maxBodySize?o.enqueue(new Uint8Array(s.buffer,s.byteOffset,s.byteLength)):(o.error(new V({code:"PAYLOAD_TOO_LARGE"})),r=!0,e.off("data",a),e.off("end",i))},i=()=>{r||(r=!0,e.off("data",a),e.off("end",i),o.close())};e.on("data",a),e.on("end",i)},cancel(){e.destroy()}})}(e,n),i.duplex="half");return new Request(a,i)}async function Mt(e){const{res:t}=e;try{const n=new WritableStream({async write(e){var n;await async function(e,t){!1===e.write(t)&&await new Promise((t,n)=>{const r=e=>{n(e),a()},o=()=>{t(),a()},a=()=>{e.off("error",r),e.off("drain",o)};e.once("error",r),e.once("drain",o)})}(t,e),null===(n=t.flush)||void 0===n||n.call(t)}});await e.body.pipeTo(n,{signal:e.signal})}catch(e){if(ue(e))return;throw e}}var Tt=N(j(),1);function Et(e){return t=>{var n;const{res:r,req:o}=e,a=J(t),i=L({config:e.router._def._config,error:a,type:"unknown",path:void 0,input:void 0,ctx:void 0});null===(n=e.onError)||void 0===n||n.call(e,{req:o,error:a,type:"unknown",path:void 0,input:void 0,ctx:void 0});const s=W(e.router._def._config,{error:i});r.statusCode=i.data.httpStatus,r.end(JSON.stringify(s))}}async function $t(e){return new Promise(t=>{var n;const r=null!==(n=e.middleware)&&void 0!==n?n:(e,t,n)=>n();return e.res.once("finish",()=>{t()}),r(e.req,e.res,t=>{k(async()=>{var n;const r=Ct(e.req,e.res,{maxBodySize:null!==(n=e.maxBodySize)&&void 0!==n?n:null}),o=await xt((0,Tt.default)((0,Tt.default)({},e),{},{req:r,error:t?J(t):null,createContext:async t=>{var n;return await(null===(n=e.createContext)||void 0===n?void 0:n.call(e,(0,Tt.default)((0,Tt.default)({},e),t)))},onError(t){var n;null==e||null===(n=e.onError)||void 0===n||n.call(e,(0,Tt.default)((0,Tt.default)({},t),{},{req:e.req}))}}));await async function(e){const{response:t,rawResponse:n}=e;200===n.statusCode&&(n.statusCode=t.status);for(const[e,r]of t.headers)n.setHeader(e,r);try{t.body&&await Mt({res:n,signal:e.request.signal,body:t.body})}catch(e){throw n.headersSent||(n.statusCode=500),e}finally{n.end()}}({request:r,response:o,rawResponse:e.res})}).catch(Et(e))})})}const Bt=t("http");var It=N(j(),1);function Ot(e){var t;const n=(null!==(t=e.basePath)&&void 0!==t?t:"/").length;return(t,r)=>{let o="";k(async()=>{const a=St(t);o=a.pathname.slice(n),await $t((0,It.default)((0,It.default)({},e),{},{req:t,res:r,path:o}))}).catch(Et((0,It.default)({req:t,res:r,path:o},e)))}}function Nt(e){return Bt.createServer(function(e){return Ot(e)}(e))}const Pt=t("node:os"),qt=t("node:crypto"),zt=1024**3,Dt=(e,t,n)=>Math.min(Math.max(e,t),n),At=e=>e?40:0,Rt=(e=0)=>{if(!e)return 0;return Dt(e/(12*zt)*20,0,20)},Ft=(e=0)=>{if(!e)return 0;return Dt(e/(32*zt)*10,0,10)},jt=e=>e?10:0,Ut=(e="default",t=null)=>{const n=String(e).toLowerCase();if(!n)return 0;if(n.includes("cuda"))return 20;if(n.includes("vulkan"))return 10;if(n.includes("default")){return"darwin"===t||"ios"===t?15:5}return 0},Lt=({platform:e,variant:t,hasGpu:n,gpuUsableBytes:r=0,cpuUsableBytes:o=0,ok:a=!0}={})=>{if(!a)return 0;const i=At(n)+Ut(t,e)+Rt(r),s=Ft(o),l=jt(a);return Math.min(100,Math.round(i+s+l))},Gt=["cuda","vulkan","snapdragon","default"],Ht=e=>e||0===e?Array.isArray(e)?e.filter(e=>null!=e):[e]:[],Jt=e=>e&&String(e).trim().toLowerCase()||null,Vt=(e={})=>{const t=String(e.type||e.deviceType||e.kind||"").toLowerCase();return!!t.includes("gpu")||(!!t.includes("cuda")||(!!t.includes("metal")||(!!t.includes("vulkan")||!!t.includes("snapdragon"))))},Kt=({platform:e,totalMemoryInBytes:t,variant:n,devices:r,gpuMemoryFraction:o,cpuMemoryFraction:a,ok:i,error:s})=>{const l=(e=>Array.isArray(e)?e.map(e=>({...e})):[])(((e,t)=>"snapdragon"===e?t.filter(e=>"GPUOpenCL"!==e.deviceName):t)(n,r)),c=l.some(Vt),u=l.filter(e=>Vt(e)&&Number.isFinite(Number(e.maxMemorySize))).reduce((e,t)=>e+t.maxMemorySize,0),d=t,p=c?Math.floor(u*o):0,m=d?Math.floor(d*a):0,f={platform:e,variant:n,hasGpu:c,gpuUsableBytes:p,cpuUsableBytes:m,ok:i},h=Lt(f),y=i?(({platform:e,variant:t,hasGpu:n,gpuUsableBytes:r=0,cpuUsableBytes:o=0,ok:a=!0}={})=>({gpuPresence:At(n),variant:Ut(t,e),gpuMemory:Rt(r),cpuMemory:Ft(o),availability:jt(a)}))(f):null;return{platform:e,ok:i,variant:n,hasGpu:c,devices:l,gpuTotalBytes:u,gpuUsableBytes:p,cpuTotalBytes:d,cpuUsableBytes:m,score:h,breakdown:y,error:s,timestamp:(new Date).toISOString()}},Yt=({device:e,modelBytes:t=0,kvCacheBytes:n=0}={})=>{if(!e)return{totalRequiredBytes:t+n,fitsInGpu:!1,fitsInCpu:!1,limiting:"unknown-device"};const r=Math.max(0,Number(t)||0)+Math.max(0,Number(n)||0),o=e.hasGpu&&r>0&&r<=e.gpuUsableBytes,a=r>0&&r<=e.cpuUsableBytes;let i="ok";return!o&&e.hasGpu&&(i="gpu-memory"),a||(i=o?"cpu-memory":"insufficient-memory"),{totalRequiredBytes:r,fitsInGpu:o,fitsInCpu:a,limiting:i}},Wt=async({platform:e,variant:t=null,preferVariants:n=[],variantPreference:r=[],gpuMemoryFraction:o=.85,cpuMemoryFraction:a=.5,includeBreakdown:i=!1,totalMemoryInBytes:s,modelBytes:l=null,kvCacheBytes:c=null,limitedKvCacheBytes:u=null,dependencies:d={},defaultVariants:p=Gt}={})=>{const{getBackendDevicesInfo:m,isLibVariantAvailable:f}=d;if("function"!=typeof m||"function"!=typeof f)throw new TypeError("GGML capability detection requires getBackendDevicesInfo and isLibVariantAvailable functions");const h=(({variant:e,preferVariants:t=[],variantPreference:n=[],defaultVariants:r=Gt}={})=>{const o=[];e&&o.push(e),o.push(...Ht(t)),o.push(...Ht(n)),o.push(...r);const a=o.map(Jt).filter(Boolean);return Array.from(new Set(a))})({variant:t,preferVariants:n,variantPreference:r,defaultVariants:p}),y=[];for(const t of h)try{if(!await f(t))throw new Error(`Variant ${t} not available on this platform`);const n=await m(t);y.push(Kt({platform:e,totalMemoryInBytes:s,variant:t,devices:n,gpuMemoryFraction:o,cpuMemoryFraction:a,ok:!0}))}catch(n){const r=n instanceof Error?n.message:String(n);y.push(Kt({platform:e,totalMemoryInBytes:s,variant:t,devices:[],gpuMemoryFraction:o,cpuMemoryFraction:a,ok:!1,error:r}))}const g=y.filter(e=>e.ok)[0]||null,b={ok:Boolean(g),selected:g?{...g,breakdown:i?g.breakdown:void 0}:null,attempts:y};if(!i&&b.selected&&delete b.selected.breakdown,!b||!l&&!c)return b;const w=e=>{if(!e)return e;const t=Yt({device:e,modelBytes:l||0,kvCacheBytes:c||0});let n=null;return null!=u&&u!==c&&(n=Yt({device:e,modelBytes:l||0,kvCacheBytes:u})),{...e,fit:t,...n&&{limitedFit:n}}};return b.selected=w(b.selected),b.attempts=Array.isArray(b.attempts)?b.attempts.map(w):b.attempts,b},Qt="ggml-llm",Zt=["cuda","vulkan","default"],Xt=new Map([[Qt,Wt],["ggml-stt",async({platform:e,variant:t=null,preferVariants:n=[],variantPreference:r=[],gpuMemoryFraction:o=.85,cpuMemoryFraction:a=.5,includeBreakdown:i=!1,totalMemoryInBytes:s,modelBytes:l=null,processingBytes:c=null,kvCacheBytes:u=null,dependencies:d={}}={})=>{const p=r&&r.length>0?r:Zt;return Wt({platform:e,variant:t,preferVariants:n,variantPreference:p,gpuMemoryFraction:o,cpuMemoryFraction:a,includeBreakdown:i,totalMemoryInBytes:s,modelBytes:l,kvCacheBytes:c??u,dependencies:d,defaultVariants:Zt})}]]),en=async({platform:e,totalMemoryInBytes:t,backend:n=Qt,dependencies:r,...o}={})=>{const a=Xt.get(n);if(!a)throw new Error(`No capability detector registered for backend "${n}"`);return await a({...o,dependencies:r,totalMemoryInBytes:t,platform:e})},tn={f16:2,f32:4,q8_0:1,q6_k:.75,q5_k:.625,q5_k_m:.625,q5_k_s:.625,q5_1:.625,q5_0:.625,q4_k:.5,q4_k_m:.5,q4_k_s:.5,q4_1:.5,q4_0:.5,iq4_nl:.5},nn=e=>{const t=e?String(e).toLowerCase():"f16";return tn[t]||tn.f16},rn=({modelBytes:e=0,audioLengthSeconds:t=30,sampleRate:n=16e3,bytesPerSample:r=4}={})=>{const o=Math.max(0,Number(e)||0),a=Math.max(0,Math.floor(Math.max(0,t)*n*r)),i=1048576,s=1024*i;let l,c,u;l=o<200*i?120*i:o<500*i?140*i:o<2*s?150*i:160*i,c=o<200*i?70*i:o<500*i?135*i:220*i,u=o<100*i?20*i:o<200*i?30*i:o<500*i?85*i:o<2*s?215*i:360*i;const d=l+c+u;return{modelBytes:o,audioBufferBytes:a,processingBufferBytes:d,totalBytes:o+d+a}},on=e=>e?String(e).trim().toLowerCase():null,an=({arch:e,nLayer:t=0})=>({arch:on(e),enabled:!1,window:null,pattern:null,denseFirst:!1,type:null,kvLayers:Math.max(0,Math.floor(Number(t)||0)),swaLayers:0}),sn=new Map([["llama4",({nSwa:e})=>{if(0===e)return{enabled:!1};return{enabled:!0,window:e&&e>0?e:8192,pattern:4,type:"chunked"}}],["afmoe",({nSwa:e})=>!e||e<=0?{enabled:!1}:{enabled:!0,window:e,pattern:4,type:"standard"}],["phi3",()=>({enabled:!1})],["gemma2",({nSwa:e})=>{const t=e&&e>0?e:4096;return t?{enabled:!0,window:t,pattern:2,type:"standard"}:{enabled:!1}}],["gemma3",({nSwa:e})=>!e||e<=0?{enabled:!1}:{enabled:!0,window:e,pattern:6,type:"standard"}],["gemma3n",({nLayer:e,nSwa:t})=>!t||t<=0?{enabled:!1}:{enabled:!0,window:t,pattern:5,type:"standard",kvLayers:Math.min(20,e)}],["gemma-embedding",({nSwa:e})=>!e||e<=0?{enabled:!1}:{enabled:!0,window:e,pattern:6,type:"symmetric"}],["cohere2",({nSwa:e})=>!e||e<=0?{enabled:!1}:{enabled:!0,window:e,pattern:4,type:"standard"}],["olmo2",({nSwa:e})=>!e||e<=0?{enabled:!1}:{enabled:!0,window:e,pattern:4,type:"standard"}],["exaone4",({nLayer:e,nSwa:t})=>{let n=null;return t&&t>0?n=t:e>=64&&(n=4096),n?{enabled:!0,window:n,pattern:4,type:"standard"}:{enabled:!1}}],["gpt-oss",({nSwa:e})=>!e||e<=0?{enabled:!1}:{enabled:!0,window:e,pattern:2,type:"standard"}],["smallthinker",({nSwa:e})=>!e||e<=0?{enabled:!1}:{enabled:!0,window:4096,pattern:4,denseFirst:!0,type:"standard"}]]),ln=({arch:e,metadata:t={},nLayer:n=0}={})=>{const r=on(e||t["general.architecture"]),o=Math.max(0,Math.floor(Number(n)||0)),a=((e={},t=null)=>{if(!e)return null;const n=on(t),r=n?`${n}.attention.sliding_window`:null,o=(r&&null!=e[r]?e[r]:null)??e["llama.attention.sliding_window"];if(null==o)return null;const a=Number(o);return Number.isFinite(a)?a:null})(t,r),i=r?sn.get(r):null;if(!i)return an({arch:r,nLayer:n});const s=i({nLayer:o,nSwa:a,metadata:t});if(!s||!s.enabled||!s.window||s.window<=0)return an({arch:r,nLayer:n});const l=Math.max(0,Math.floor(Number(s.pattern)||0)),c=null!=s.kvLayers&&Number.isFinite(Number(s.kvLayers))?Number(s.kvLayers):o,u=Math.max(0,Math.floor(c)),d=((e=0,t=0,n=!1)=>{const r=Math.max(0,Math.floor(Number(e)||0)),o=Math.max(0,Math.floor(Number(t)||0));if(!r||1===o)return 0;if(o<=0)return r;const a=Math.max(0,o-1),i=r%o;return Math.floor(r/o)*a+(n?Math.max(0,i-1):Math.min(i,a))})(u,l,Boolean(s.denseFirst));return{arch:r,enabled:d>0,window:s.window,pattern:l,denseFirst:Boolean(s.denseFirst),type:s.type||"standard",kvLayers:u,swaLayers:d}},cn=(e={})=>{const t=e["general.architecture"],n=(t,n=null)=>{const r=e[t],o=Number(r);return Number.isFinite(o)?o:n},r=t?n(`${t}.context_length`,n("llama.context_length")):null,o=t?n(`${t}.block_count`,n("llama.block_count")):null,a=t?n(`${t}.embedding_length`,n("llama.embedding_length")):null,i=t?n(`${t}.attention.head_count`,n("llama.attention.head_count")):null;return{arch:t,nCtxTrain:r,nLayer:o,nEmbd:a,nHead:i,nHeadKv:t?n(`${t}.attention.head_count_kv`,n("llama.attention.head_count_kv",i)):null,nEmbdHeadK:t?n(`${t}.attention.key_length`,n("llama.attention.key_length")):null,nEmbdHeadV:t?n(`${t}.attention.value_length`,n("llama.attention.value_length")):null,quantVersion:e["general.quantization_version"]||null,fileType:e["general.file_type"]||null}},un=({layerCount:e,headKvCount:t,embdHeadKCount:n,embdHeadVCount:r,cacheTypes:o,swaConfig:a,kvUnified:i=!1,nParallel:s=1,swaFull:l=!1})=>{const c=a?.window&&i?Math.max(1,Number(s)||1):1;return i=>((e,t,n,r,o,a={},{totalLayers:i=null,swaLayers:s=0,swaContext:l=null,swaContextMultiplier:c=1,swaAdditionalTokens:u=0,swaFull:d=!1}={})=>{if(!(e&&t&&n&&r&&o))return 0;const p=Number(null!=i&&void 0!==i?i:e),m=Math.max(0,Math.floor(p));if(!m)return 0;const f=nn(a.k),h=nn(a.v),y=Number(n)*(Number(r)*f+Number(o)*h);if(!y)return 0;const g=Math.max(0,Number(t)||0),b=Math.min(m,Math.max(0,Math.floor(Number(s)||0))),w=Math.max(0,m-b),v=(null!=l&&Number.isFinite(Number(l))?Math.max(0,Number(l)):g)*Math.max(1,Number(c)||1)+Math.max(0,Number(u)||0),_=d?g:Math.min(g,v),x=w*g+b*Math.max(0,Math.floor(_));return Math.round(y*x)})(e,i,t,n,r,o,{totalLayers:e,swaLayers:a?.swaLayers||0,swaContext:a?.window,swaFull:l,swaContextMultiplier:c})},dn=({maxCtx:e,availableMemory:t,modelBytes:n,kvBytesForCtx:r})=>{const o=Math.max(1,Math.floor(Number(e)||0));if(!r||t<=n)return o;let a=1,i=o,s=o;for(;a<=i;){const e=Math.floor((a+i)/2);n+r(e)<=t?(s=e,a=e+1):i=e-1}return s};var pn=f(285);const mn=t("node:stream/web");var fn=f.t(mn,2);const hn=t("node:events"),yn=new hn.EventEmitter;yn.setMaxListeners(100);const gn=(e,t,n)=>{e.push({...t,timestamp:t.timestamp||(new Date).toISOString()}),e.length>n&&e.shift()};class bn{constructor(e=9999){this.maxEntries=e,this.modelLoads=[],this.completions=[],this.transcriptions=[]}addModelLoad(e){gn(this.modelLoads,e,this.maxEntries),yn.emit("status:modelLoad",e),yn.emit("status:change",{type:"modelLoad",entry:e})}addCompletion(e){gn(this.completions,e,this.maxEntries),yn.emit("status:completion",e),yn.emit("status:change",{type:"completion",entry:e})}addTranscription(e){gn(this.transcriptions,e,this.maxEntries),yn.emit("status:transcription",e),yn.emit("status:change",{type:"transcription",entry:e})}getModelLoadHistory(){return[...this.modelLoads].reverse()}getCompletionHistory(){return[...this.completions].reverse()}getTranscriptionHistory(){return[...this.transcriptions].reverse()}clear(){this.modelLoads=[],this.completions=[],this.transcriptions=[]}}const wn=new bn,vn=new bn;let _n=0;function xn(e){const t=t=>e(t);return yn.on("status:change",t),()=>yn.off("status:change",t)}function Sn(e){const t=[];return{generators:Array.from(e.entries()).filter(([,e])=>"ggml-llm"===e.type).map(([e,n])=>{const{instance:r}=n;let o=[];return r.contexts&&(o=Array.from(r.contexts.entries()).map(([n,r])=>{const o={key:n,refCount:r.refCount,hasModel:Boolean(r.context)},a=r.context.parallel.getStatus();return o.parallelStatus=a,t.push({generatorId:e,contextKey:n,...a}),o})),{id:e,type:n.type,refCount:n.refCount,repoId:r.info?.model?.repoId||null,quantization:r.info?.model?.quantization||null,variant:r.info?.runtime?.variant||null,nCtx:r.info?.runtime?.n_ctx||null,nParallel:r.info?.runtime?.n_parallel||null,contexts:o}}),parallelStatuses:t,history:{modelLoads:wn.getModelLoadHistory(),completions:wn.getCompletionHistory()}}}function kn(e){return{generators:Array.from(e.entries()).filter(([,e])=>"ggml-stt"===e.type).map(([e,t])=>{const{instance:n}=t,r=n.getStatus?.()||{},o=r.queueStatus||{processing:!1,queuedCount:0};return{id:e,type:t.type,refCount:t.refCount,repoId:n.info?.model?.repoId||null,quantization:n.info?.model?.quantization||null,variant:n.info?.runtime?.variant||null,hasContext:r.hasContext||!1,contextRefCount:r.contextRefCount||0,queueStatus:o}}),history:{modelLoads:vn.getModelLoadHistory(),transcriptions:vn.getTranscriptionHistory()}}}const Cn="undefined"!=typeof globalThis&&globalThis.ReadableStream&&globalThis.WritableStream?{ReadableStream:globalThis.ReadableStream,WritableStream:globalThis.WritableStream}:fn,{ReadableStream:Mn,WritableStream:Tn}=Cn,En=new TextEncoder,$n=(e={},t={})=>(Object.entries(t||{}).forEach(([t,n])=>{n&&"object"==typeof n&&!Array.isArray(n)?(e[t]&&"object"==typeof e[t]||(e[t]={}),$n(e[t],n)):e[t]=n}),e),Bn="https://huggingface.co",In="https://huggingface.co/api",On=g.join(Pt.homedir(),".buttress","models"),Nn=["mxfp4","q8_0","q6_k","q6","q5_k_m","q5_k_s","q5_k","q5_1","q5_0","q4_k_m","q4_k_s","q4_k","q4_1","q4_0","q3","q2"],Pn=.5,qn={backend:{type:"ggml-llm",variant:null,variant_preference:["cuda","vulkan","snapdragon","default"],gpu_memory_fraction:.85,cpu_memory_fraction:Pn},model:{repo_id:null,revision:"main",filename:null,url:null,quantization:null,preferred_quantizations:[],n_ctx:null,n_gpu_layers:"auto",allow_local_file:!1,local_path:null,api_base:In,base_url:Bn},runtime:{cache_dir:On,prefer_variants:[],huggingface_token:process.env.HUGGINGFACE_TOKEN||null,http_headers:{},session_cache:{enabled:!0,max_size_bytes:10737418240,max_entries:1e3},context_release_delay_ms:1e4}},zn=(e,t=[])=>e||0===e?Array.isArray(e)?e.filter(e=>null!=e):[e]:[...t],Dn=e=>{if(!e)return null;const t=String(e).toLowerCase();return["cuda","vulkan","snapdragon","default"].includes(t)?t:null},An=(e={})=>{const t=JSON.parse(JSON.stringify(qn));if($n(t,e),t.backend.variant=Dn(t.backend.variant),t.backend.variant_preference=Array.from(new Set(zn(t.backend.variant_preference).map(Dn).filter(Boolean))),0===t.backend.variant_preference.length&&(t.backend.variant_preference=["cuda","vulkan","snapdragon","default"]),t.runtime.prefer_variants=Array.from(new Set(zn(t.runtime.prefer_variants).map(Dn).filter(Boolean))),t.model.preferred_quantizations=Array.from(new Set(zn(t.model.preferred_quantizations||t.model.quantizations).map(e=>e?String(e).toLowerCase():null).filter(Boolean))),t.model.quantization){const e=String(t.model.quantization).toLowerCase();t.model.preferred_quantizations.includes(e)||t.model.preferred_quantizations.unshift(e)}return t.model.n_parallel=Math.max(1,Number(t.model.n_parallel)||4),t.model.n_batch=Math.max(1,Number(t.model.n_batch)||512),t.model.base_url=t.model.base_url||Bn,t.model.api_base=t.model.api_base||In,t.runtime.cache_dir=t.runtime.cache_dir?g.resolve(t.runtime.cache_dir):On,t.runtime.session_cache={...qn.runtime.session_cache,...t.runtime.session_cache||{}},t.runtime.context_release_delay_ms=Math.max(0,Number(t.runtime.context_release_delay_ms)||qn.runtime.context_release_delay_ms),t},Rn=e=>{const t=e.toLowerCase();return Nn.find(e=>t.includes(e))||null},Fn=async e=>{await(0,y.mkdir)(e,{recursive:!0})},jn=(e,t,n=On)=>{const r=(0,qt.createHash)("sha256").update(e).digest("hex");return g.join(((e=On)=>g.join(e,".metadata-cache"))(n),t,`${r}.json`)},Un=async(e,t,n=On)=>{try{const r=jn(e,t,n),o=await(0,y.readFile)(r,"utf-8");return console.log(`[Cache] Hit ${t} cache:`,g.basename(r)),JSON.parse(o,(e,t)=>"string"==typeof t&&t.startsWith("__bigint__")?BigInt(t.slice(10)):t)}catch(e){return null}},Ln=async(e,t,n,r=On)=>{try{const o=jn(e,t,r);await Fn(g.dirname(o)),await(0,y.writeFile)(o,JSON.stringify(n,(e,t)=>"bigint"==typeof t?`__bigint__${t.toString()}`:t),"utf-8"),console.log(`[Cache] Wrote ${t} cache:`,g.basename(o))}catch(e){console.warn(`[Cache] Failed to write ${t} cache:`,e.message)}},Gn=(e=On)=>g.join(e,".session-state-cache"),Hn=(e=On)=>g.join(Gn(e),"cache-map.json"),Jn=(e=On)=>g.join(Gn(e),"temp"),Vn=(e=On)=>g.join(Gn(e),"states"),Kn=async(e,t=On)=>{const n=Hn(t),r=`${n}.tmp.${Date.now()}`;try{await Fn(g.dirname(n)),await(0,y.writeFile)(r,JSON.stringify(e,null,2),"utf-8"),await(0,y.rename)(r,n)}catch(e){throw await(0,y.unlink)(r).catch(()=>{}),e}},Yn=(e,t,n)=>{const r=Object.values(n.entries);console.log(`[SessionCache] Finding match for promptText (${e.length} chars)`),console.log(`[SessionCache] Checking ${r.length} cache entries`);const o=r.filter(e=>{return n=e.metadata,r=t,n.modelPath===r.modelPath&&n.variant===r.variant&&n.n_gpu_layers===r.n_gpu_layers&&n.n_ctx>=r.n_ctx&&n.cacheTypeK===r.cacheTypeK&&n.cacheTypeV===r.cacheTypeV;var n,r}).reduce((t,n)=>{const r=((e,t)=>{const n=Math.min(e.length,t.length);let r=0;for(;r<n&&e[r]===t[r];)r+=1;return r})(e,n.fullText);return r>=100&&r>t.prefixLen?{entry:n,prefixLen:r}:t},{entry:null,prefixLen:0});return o.entry?(console.log(`[SessionCache] Prefix match found: ${o.entry.id} (${o.prefixLen}/${o.entry.fullText.length} chars)`),{entry:o.entry,prefixLength:o.prefixLen}):(console.log("[SessionCache] No match found"),null)};class Wn{constructor(e,t){this.config=e,this.plan=t,this.baseDir=e.runtime.cache_dir,this.enabled=!1!==e.runtime.session_cache?.enabled,this.maxSizeBytes=((e,t)=>{if(null==e)return t;if("number"==typeof e)return e;if("string"==typeof e){const n=pn.parse(e);return null!=n?n:t}return t})(e.runtime.session_cache?.max_size_bytes,10737418240),this.maxEntries=e.runtime.session_cache?.max_entries||1e3,this.metadata={variant:t.info?.runtime?.variant||null,n_gpu_layers:t.info?.runtime?.n_gpu_layers||0,n_ctx:t.info?.runtime?.n_ctx||0,modelPath:t.localPath,cacheTypeK:t.info?.runtime?.cache_type_k||"f16",cacheTypeV:t.info?.runtime?.cache_type_v||"f16"},this.cacheMap=null,this.initialized=!1}async initialize(){if(this.enabled&&!this.initialized)try{await Fn(Gn(this.baseDir)),await Fn(Jn(this.baseDir)),await Fn(Vn(this.baseDir)),this.cacheMap=await(async(e=On)=>{try{const t=Hn(e),n=await(0,y.readFile)(t,"utf-8"),r=JSON.parse(n);return r.entries&&"object"==typeof r.entries?r:{version:1,entries:{},totalSize:0}}catch{return{version:1,entries:{},totalSize:0}}})(this.baseDir),this.initialized=!0,console.log(`[SessionCache] Initialized with ${Object.keys(this.cacheMap.entries).length} entries`)}catch(e){console.warn(`[SessionCache] Failed to initialize: ${e.message}`),this.enabled=!1}}async findMatchingEntry(e){if(!this.enabled||!this.cacheMap)return null;const t=Yn(e,this.metadata,this.cacheMap);if(t){const{entry:e}=t;return await(async e=>{try{return await(0,y.stat)(e),!0}catch{return!1}})(e.stateFilePath)?(e.lastAccessedAt=(new Date).toISOString(),await Kn(this.cacheMap,this.baseDir).catch(()=>{}),{entry:e}):(console.log(`[SessionCache] Removing stale entry: ${e.id}`),delete this.cacheMap.entries[e.id],this.cacheMap.totalSize-=e.stateFileSize||0,await Kn(this.cacheMap,this.baseDir).catch(()=>{}),null)}return null}async prepareCompletionOptions(e,t){if(!this.enabled)return{options:e,cacheEntry:null,promptPrefix:null};const n=await this.findMatchingEntry(t);if(n){const{entry:t}=n;console.log(`[SessionCache] Found matching entry: ${t.id} (${t.fullText.length} chars, loadStateSize=${t.loadStateSize})`);return{options:{...e,load_state_path:t.stateFilePath},cacheEntry:t,promptPrefix:t.fullText}}return{options:e,cacheEntry:null,promptPrefix:null}}async saveCompletionState(e,t,n,r=0){if(!this.enabled)return null;const o=((e,t)=>{const n=JSON.stringify({text:e,model:t.modelPath,variant:t.variant,n_gpu_layers:t.n_gpu_layers,n_ctx:t.n_ctx});return(0,qt.createHash)("sha256").update(n).digest("hex").slice(0,24)})(e,this.metadata);if(this.cacheMap.entries[o])return console.log(`[SessionCache] Entry already exists for prompt: ${o}`),await(0,y.unlink)(n).catch(()=>{}),this.cacheMap.entries[o];const a=e+t,i=((e,t=On)=>g.join(Vn(t),`${e}.bin`))(o,this.baseDir);try{await Fn(g.dirname(i)),await(0,y.rename)(n,i);const s=await(0,y.stat)(i),l={id:o,promptText:e,completionText:t,fullText:a,promptTokenCount:r,stateFilePath:i,stateFileSize:s.size,metadata:{...this.metadata},createdAt:(new Date).toISOString(),lastAccessedAt:(new Date).toISOString()};return this.cacheMap.entries[o]=l,this.cacheMap.totalSize+=s.size,await(async(e,t,n)=>{const r=Object.values(e.entries).sort((e,t)=>new Date(e.lastAccessedAt)-new Date(t.lastAccessedAt));let o=e.totalSize,a=Object.keys(e.entries).length;const i=r.filter(e=>(o>t||a>n)&&(o-=e.stateFileSize||0,a-=1,!0));return await Promise.all(i.map(async t=>{await(0,y.unlink)(t.stateFilePath).catch(()=>{}),delete e.entries[t.id],console.log(`[SessionCache] Evicted entry: ${t.id}`)})),e.totalSize=Math.max(0,o),i.map(e=>e.id)})(this.cacheMap,this.maxSizeBytes,this.maxEntries),await Kn(this.cacheMap,this.baseDir),console.log(`[SessionCache] Saved entry: ${o} (${s.size} bytes)`),l}catch(e){return console.warn(`[SessionCache] Failed to save state: ${e.message}`),await(0,y.unlink)(n).catch(()=>{}),null}}async generateTempStatePath(){return await Fn(Jn(this.baseDir)),((e=On)=>{const t=`${Date.now()}-${Math.random().toString(36).slice(2,10)}`;return g.join(Jn(e),`${t}.bin`)})(this.baseDir)}async cleanup(){await(async(e=On)=>{const t=Jn(e);try{const e=await(0,y.readdir)(t),n=Date.now(),r=36e5;await Promise.all(e.map(async e=>{const o=g.join(t,e),a=await(0,y.stat)(o).catch(()=>null);a&&n-a.mtimeMs>r&&(await(0,y.unlink)(o).catch(()=>{}),console.log(`[SessionCache] Cleaned up temp file: ${e}`))}))}catch{}})(this.baseDir)}}const Qn=async(e,t={})=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");const n=await fetch(e,t);if(!n.ok){const t=await n.text().catch(()=>"");throw new Error(`Failed to fetch ${e}: ${n.status} ${n.statusText} ${t}`.trim())}return n.json()},Zn=async(e,t={})=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");const n=await fetch(e,{...t,method:"HEAD"});if(!n.ok)throw new Error(`Failed to fetch headers for ${e}: ${n.status} ${n.statusText}`);return n},Xn=async(e,t,n=On)=>{const r=JSON.stringify({url:e,headers:t}),a=await Un(r,"range-metadata",n);if(a)return a;const i=!/^https?:/i.test(e),{metadata:s}=await o(e,{fetch,additionalFetchHeaders:t,allowLocalFile:i});return await Ln(r,"range-metadata",s,n),s},er=(e,t)=>{if(e.model.local_path)return g.resolve(e.model.local_path);const n=t.repoId.split("/"),r=g.join(e.runtime.cache_dir,...n,t.revision);return g.join(r,t.filename)},tr=async(e,t)=>{try{const n=await(0,y.stat)(e);return!t||n.size===t}catch(e){return!1}},nr=async(e,t,n,r,o)=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");await Fn(g.dirname(n));const a=await fetch(e,{headers:t});if(!a.ok||!a.body)throw new Error(`Failed to download ${e}: ${a.status} ${a.statusText}`);const i=await(0,y.open)(n,"w"),s=Number(a.headers.get("content-length"))||r||0;let l=0,c=.05;try{await a.body.pipeTo(new Tn({async write(e){if(await i.write(e),l+=e.byteLength,"function"==typeof o&&s>0){const e=Math.min(1,l/s);for(;e>=c;)o(c),c+=.05}},async close(){await i.close(),"function"==typeof o&&o(1)},async abort(e){throw await i.close().catch(()=>{}),await(0,y.unlink)(n).catch(()=>{}),e}}))}catch(e){throw await i.close().catch(()=>{}),await(0,y.unlink)(n).catch(()=>{}),e}if(r){const e=await(0,y.stat)(n);if(e.size!==r)throw await(0,y.unlink)(n).catch(()=>{}),new Error(`Downloaded file size mismatch, expected ${r} got ${e.size}`)}},rr=async e=>{const t=e.model.repo_id||e.model.repository||e.model.model;if(!t)throw new Error("`model.repo_id` is required in Buttress backend config");const n=e.model.revision||"main",r=e.runtime.cache_dir,o=JSON.stringify({repoId:t,revision:n,filename:e.model.filename,url:e.model.url,quantization:e.model.quantization,preferred_quantizations:e.model.preferred_quantizations}),a=await Un(o,"artifact-info",r);if(a)return a;const i={...e.runtime.http_headers||{}};if(e.runtime.huggingface_token&&(i.Authorization=`Bearer ${e.runtime.huggingface_token}`),e.model.url){const a=await Zn(e.model.url,{headers:i}),s=Number(a.headers.get("content-length"))||null,l={repoId:t,revision:n,filename:e.model.filename||e.model.url.split("/").pop(),url:e.model.url,size:s,headers:i};return await Ln(o,"artifact-info",l,r),l}let{filename:s}=e.model,l=e.model.quantization&&String(e.model.quantization).toLowerCase();const c=await Qn(`${e.model.api_base}/models/${t}?revision=${n}&blobs=true`,{headers:i}),u=(c?.siblings||c?.files||[]).map(e=>e.rfilename||e.path||e.filename).filter(e=>"string"==typeof e&&e.endsWith(".gguf"));if(0===u.length)throw new Error(`No GGUF artifacts found in repo ${t}`);const d=e.model.preferred_quantizations.length>0?e.model.preferred_quantizations:Nn;if(s)l||(l=Rn(s));else{const e=(()=>{const e=d.find(e=>u.find(t=>t.toLowerCase().includes(e)));if(e)return{filename:u.find(t=>t.toLowerCase().includes(e)),quantization:e};return null})()||{filename:u[0],quantization:null},{filename:t,quantization:n}=e;s=t,l=n||Rn(s)}const p=`${e.model.base_url.replace(/\/+$/,"")}/${t}/resolve/${n}/${s}`,m=/-(\d{5})-of-(\d{5})\.gguf$/,f=s.match(m);let h=null;if(f){const[,,r]=f,o=await Qn(`${e.model.api_base}/models/${t}?revision=${n}&blobs=true`,{headers:i}),a=o?.siblings||o?.files||[],l=Number(r);h=0;for(let e=1;e<=l;e+=1){const t=String(e).padStart(5,"0"),n=s.replace(m,`-${t}-of-${r}.gguf`),o=a.find(e=>(e.rfilename||e.path||e.filename)===n),i=Number(o?.size);Number.isFinite(i)&&i>0&&(h+=i)}}else{const e=await Zn(p,{headers:i});h=Number(e.headers.get("content-length"))||null}const y={repoId:t,revision:n,filename:s,url:p,size:h,quantization:l,headers:i,isSplit:Boolean(f),splitCount:f?Number(f[2]):0};return await Ln(o,"artifact-info",y,r),y},or=async(e,{modelBytes:t=null,kvCacheBytes:n=null}={})=>{const r=(e=>{const t=[];return e.backend.variant&&t.push(e.backend.variant),e.runtime.prefer_variants.length>0&&t.push(...e.runtime.prefer_variants),t.push(...e.backend.variant_preference),t.push("default"),Array.from(new Set(t.map(Dn).filter(Boolean)))})(e),[o,...s]=r,l=null!=e.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.gpu_memory_fraction))):qn.backend.gpu_memory_fraction||1,c=null!=e.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.cpu_memory_fraction))):Pn,u=await en({platform:process.platform,totalMemoryInBytes:Pt.totalmem(),backend:"ggml-llm",variant:o||null,preferVariants:s,gpuMemoryFraction:l,cpuMemoryFraction:c,dependencies:{getBackendDevicesInfo:a,isLibVariantAvailable:i},modelBytes:t,kvCacheBytes:n}),d=e=>({...e,devices:Array.isArray(e.devices)?e.devices:[],ok:e.ok,hasGpu:Boolean(e.hasGpu),totalMemory:e.gpuTotalBytes||e.totalMemory||0,error:e.ok?null:new Error(e.error||`Variant ${e.variant} not available on this platform`)});if(!u.ok||!u.selected){const e=(u.attempts||[]).map(e=>`${e.variant}: ${e.error||"unknown error"}`).join("; ");throw new Error(`Unable to initialize any backend variant (${r.join(", ")}). Errors: ${e}`)}const p=(u.attempts||[]).map(d);return{selected:d(u.selected),attempts:p}},ar=async e=>{const t=await rr(e),n=await Xn(t.url,t.headers,e.runtime.cache_dir),{arch:r,nCtxTrain:o,nLayer:a,nEmbd:i,nHead:s,nHeadKv:l,nEmbdHeadK:c,nEmbdHeadV:u,quantVersion:d,fileType:p}=cn(n),m=Number.isFinite(Number(a))?Number(a):0,f=Number.isFinite(Number(i))?Number(i):0,h=Number.isFinite(Number(s))?Number(s):0,y=Number.isFinite(Number(l))?Number(l):h,g=h>0&&f>0?f/h:128,b=null!=c&&Number.isFinite(Number(c))?Number(c):g,w=null!=u&&Number.isFinite(Number(u))?Number(u):g,v=ln({arch:r,metadata:n,nLayer:m}),_=v&&Number.isFinite(Number(v.kvLayers))?Number(v.kvLayers):m,x=Math.max(0,Math.floor(Number(_)||0)),S={use_mmap:e.model.use_mmap??e.runtime.use_mmap,use_mlock:e.model.use_mlock??e.runtime.use_mlock,n_threads:e.model.n_threads??e.runtime.n_threads,n_ctx:e.model.n_ctx??e.runtime.n_ctx,n_batch:e.model.n_batch??e.runtime.n_batch,n_ubatch:e.model.n_ubatch??e.runtime.n_ubatch,n_cpu_moe:e.model.n_cpu_moe??e.runtime.n_cpu_moe,n_parallel:e.model.n_parallel??e.runtime.n_parallel,cpu_mask:e.model.cpu_mask??e.runtime.cpu_mask,cpu_strict:e.model.cpu_strict??e.runtime.cpu_strict,devices:e.model.devices??e.runtime.devices,n_gpu_layers:e.model.n_gpu_layers??e.runtime.n_gpu_layers,flash_attn_type:e.model.flash_attn_type??e.runtime.flash_attn_type,cache_type_k:e.model.cache_type_k??e.runtime.cache_type_k,cache_type_v:e.model.cache_type_v??e.runtime.cache_type_v,kv_unified:e.model.kv_unified??e.runtime.kv_unified,swa_full:e.model.swa_full??e.runtime.swa_full,ctx_shift:e.model.ctx_shift??e.runtime.ctx_shift},k=S.n_ctx?Number(S.n_ctx):null;let C=k||o||4096;const M=[],T=[];let E=!0;if(k&&o&&k>o){E=!1;const e=`Requested context length (${k}) exceeds model training context (${o})`;M.push(e),T.push(e),C=o}k&&!o&&M.push("Model metadata missing training context length, using requested value");const $={k:S.cache_type_k,v:S.cache_type_v},B=t.size>0?t.size:0,I=un({layerCount:x,headKvCount:y,embdHeadKCount:b,embdHeadVCount:w,cacheTypes:$,swaConfig:v,kvUnified:S.kv_unified,nParallel:S.n_parallel,swaFull:S.swa_full}),O=I(C),N=await or(e,{modelBytes:B,kvCacheBytes:O}),P=N.selected.totalMemory||0,q=P*(e.backend.gpu_memory_fraction||1),z=null!=e.backend.cpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.cpu_memory_fraction))):Pn,D=Math.max(0,Pt.totalmem()*z),A=N.selected.hasGpu?q:D,R=dn({maxCtx:C,availableMemory:A,modelBytes:B,kvBytesForCtx:I});if(!k&&R){const e=o?Math.min(R,o):R,t=Math.max(32,e);t<C&&M.push(`Context length capped to ${t} by memory limits`),C=t}C>R&&(C=R);const F=Math.floor(R);console.log(`[buttress] Memory-limited context length: ${F}`);const j=I(C),U=B+j,L=m?B/(m+1):B;let G,H=0;N.selected.hasGpu&&L>0&&(H=Math.min(m+1,Math.max(0,Math.floor(q/L)))),console.log(`[buttress] Auto GPU layer capacity (${N.selected.variant}): ${H}/${m+1}`),G="auto"===S.n_gpu_layers||null==S.n_gpu_layers?H:Math.max(0,Math.min(Number(S.n_gpu_layers)||0,m+1));const J=(()=>{const e=S.flash_attn_type&&String(S.flash_attn_type).toLowerCase();return"on"===e||"off"===e?e:N.selected.hasGpu?"auto":"off"})(),V=e.runtime.cache_dir,K=er(e,t),Y=await tr(K,t.size);return{config:e,info:{ok:E,backend:"ggml-llm",warnings:M,errors:T,model:{repoId:t.repoId,revision:t.revision,filename:t.filename,quantization:t.quantization,url:t.url,sizeBytes:t.size,metadata:{architecture:r,n_ctx_train:o,n_layer:m,n_embd:f,quantization_version:d,file_type:p,kv_layer_count:x,swa:v?.enabled?{window:v.window,pattern:v.pattern,dense_first:v.denseFirst,type:v.type,layers:v.swaLayers}:null}},runtime:{...S,variant:N.selected.variant,n_ctx:C,requested_ctx:k,n_gpu_layers:G,auto_gpu_layers:H,flash_attn_type:J,cache_type_k:$.k,cache_type_v:$.v,estimated_max_n_ctx:F},resources:{modelBytes:B,kvCacheBytes:j,totalEstimatedBytes:U,gpuCapacityBytes:P,gpuUsableBytes:q,cpuUsableBytes:D,fit:N.selected.fit},devices:{selected:N.selected,attempts:N.attempts},download:{cacheDir:V,localPath:K,exists:Y},timestamp:(new Date).toISOString()},artifact:t,metadata:{arch:r,nCtxTrain:o,nLayer:m,nEmbd:f},devices:N,cacheTypes:$,localPath:K,localExists:Y}},ir=(e,t)=>`event: ${e}\ndata: ${null==t?"":JSON.stringify(t)}\n\n`,sr=(e,t,n=null,r=null)=>{let o;const a=Date.now();let i=0;return new Mn({async start(s){try{const l=await e.parallel.completion(t,(e,t)=>{t&&(t.token&&(i+=1),s.enqueue(En.encode(ir("token",{requestId:e,...t}))))}),{requestId:c}=l;o=l.stop;const u=await l.promise;console.log("[Completion] Result:",u),s.enqueue(En.encode(ir("result",{requestId:c,...u}))),s.close();const d=Date.now()-a,p=u.timings||{};wn.addCompletion({id:`completion-${c}`,generatorId:n,requestId:c,repoId:r?.repoId||null,quantization:r?.quantization||null,variant:r?.variant||null,promptTokens:p.prompt_n??0,tokensGenerated:p.predicted_n??i,tokensPerSecond:p.predicted_per_second??0,promptPerSecond:p.prompt_per_second??0,durationMs:d,success:!0,interrupted:u.interrupted||!1,contextFull:u.context_full||u.contextFull||!1})}catch(e){s.enqueue(En.encode(ir("error",{message:e?.message||String(e)}))),s.error(e),wn.addCompletion({id:`completion-${Date.now()}`,generatorId:n,repoId:r?.repoId||null,quantization:r?.quantization||null,variant:r?.variant||null,durationMs:Date.now()-a,tokensGenerated:i,success:!1,error:e?.message||String(e)})}},cancel(){o&&o()}})},lr=(e,t,n,r,o,a,i=null,s=null)=>{let l,c="",u=!1;const d=Date.now();let p=0;return new Mn({async start(m){try{const f=await e.parallel.completion(t,(e,t)=>{t&&(t.token&&(c+=t.token,p+=1),m.enqueue(En.encode(ir("token",{requestId:e,...t}))))}),{requestId:h}=f;l=f.stop;const g=await f.promise;g.text?c=g.text:g.content&&(c=g.content),u=!g.interrupted&&!g.context_full,console.log("[Completion] Result:",g),m.enqueue(En.encode(ir("result",{requestId:h,...g}))),m.close();const b=Date.now()-d,w=g.timings||{};wn.addCompletion({id:`completion-${h}`,generatorId:i,requestId:h,repoId:s?.repoId||null,quantization:s?.quantization||null,variant:s?.variant||null,promptTokens:w.prompt_n??a??0,tokensGenerated:w.predicted_n??p,tokensPerSecond:w.predicted_per_second??0,promptPerSecond:w.prompt_per_second??0,durationMs:b,success:!0,interrupted:g.interrupted||!1,contextFull:g.context_full||g.contextFull||!1,usedCache:Boolean(t.load_state_path)}),u&&n.enabled&&c?n.saveCompletionState(r,c,o,a).catch(e=>{console.warn("[SessionCache] Save failed:",e.message)}):o&&(0,y.unlink)(o).catch(()=>{})}catch(e){m.enqueue(En.encode(ir("error",{message:e?.message||String(e)}))),m.error(e),wn.addCompletion({id:`completion-${Date.now()}`,generatorId:i,repoId:s?.repoId||null,quantization:s?.quantization||null,variant:s?.variant||null,durationMs:Date.now()-d,tokensGenerated:p,success:!1,error:e?.message||String(e)}),(0,y.unlink)(o).catch(()=>{})}},cancel(){l&&l(),(0,y.unlink)(o).catch(()=>{})}})},cr=e=>{const t={model:e.plan.localPath,runtime:e.plan.info.runtime};return(0,qt.createHash)("sha256").update(JSON.stringify(t)).digest("hex").slice(0,24)},ur=async(e,t)=>{const n=cr(e);let r=e.contexts.get(n);if(r&&!r.released)return r.releaseTimer&&(clearTimeout(r.releaseTimer),r.releaseTimer=null,console.log(`[Context] Cancelled pending release for context "${n}"`)),r.releaseRequested=!1,r.refCount+=1,console.log(`[Context] Reusing existing context "${n}", refCount=${r.refCount}`),"function"==typeof t&&t(0),r.context||await r.ready,"function"==typeof t&&t(1),r;r?console.log(`[Context] Record exists but released=${r.released}, creating new context`):console.log(`[Context] No existing record for "${n}", creating new context`),r={key:n,refCount:1,ready:null,released:!1},e.contexts.set(n,r),r.ready=(async()=>{const o=Date.now(),a=await(async(e,t,n,r=null)=>{const{config:o,localPath:a,artifact:i}=e;if(e.localExists&&!t.has(a))return e.info.download.exists=!0,"function"==typeof n&&n(.5),a;if(o.model.local_path&&!o.model.allow_local_file)throw new Error("Local model path provided but `model.allow_local_file` is not enabled");const s=a;if(r){const t=r.getDownload(s);if(t){console.log(`[ensureModelFile] Waiting for global download: ${i.repoId}`);try{if(await t,await tr(a,i.size))return e.localExists=!0,e.info.download.exists=!0,"function"==typeof n&&n(.5),a}catch(e){console.warn(`[ensureModelFile] Global download failed, will retry: ${e.message}`)}}}t.has(s)||t.set(s,(async()=>{if(i.isSplit&&i.splitCount>0){const e=/-(\d{5})-of-(\d{5})\.gguf$/,t=g.dirname(a),r=i.splitCount;let s=0;for(let a=1;a<=r;a+=1){const l=String(a).padStart(5,"0"),c=i.filename.replace(e,`-${l}-of-${String(r).padStart(5,"0")}.gguf`),u=`${o.model.base_url.replace(/\/+$/,"")}/${i.repoId}/resolve/${i.revision}/${c}`,d=g.join(t,c);await tr(d)||await nr(u,i.headers,d,null,e=>{if(e>=0&&Number.isFinite(e)){const t=(s+e)/r,o=Math.round(100*t);console.log(`Downloading model splits: ${Math.min(100,o)}%`),"function"==typeof n&&n(.5*t)}}),s+=1}}else console.log("Downloading model: 0%"),await nr(i.url,i.headers,a,i.size,e=>{if(e>=0&&Number.isFinite(e)){const t=Math.round(100*e);console.log(`Downloading model: ${Math.min(100,t)}%`),"function"==typeof n&&n(.5*e)}});e.localExists=!0,e.info.download.exists=!0})());try{await t.get(s)}finally{t.delete(s)}return a})(e.plan,e.downloads,t,e.globalDownloadManager);"function"==typeof t&&t(.5);const i={model:a,n_threads:e.plan.info.runtime.n_threads,use_mmap:e.plan.info.runtime.use_mmap,use_mlock:e.plan.info.runtime.use_mlock,cpu_mask:e.plan.info.runtime.cpu_mask,cpu_strict:e.plan.info.runtime.cpu_strict,devices:e.plan.info.runtime.devices,n_ctx:e.plan.info.runtime.n_ctx,n_gpu_layers:e.plan.info.runtime.n_gpu_layers,n_parallel:e.plan.info.runtime.n_parallel,n_batch:e.plan.info.runtime.n_batch,n_ubatch:e.plan.info.runtime.n_ubatch,n_cpu_moe:e.plan.info.runtime.n_cpu_moe,flash_attn_type:e.plan.info.runtime.flash_attn_type,ctx_shift:e.plan.info.runtime.ctx_shift,kv_unified:e.plan.info.runtime.kv_unified,swa_full:e.plan.info.runtime.swa_full,lib_variant:e.plan.info.runtime.variant};let l;"off"!==e.plan.info.runtime.flash_attn_type&&(i.cache_type_k=e.plan.info.runtime.cache_type_k,i.cache_type_v=e.plan.info.runtime.cache_type_v),console.log("[Context] Load Options:",i);try{if(l=await s(i,e=>{"function"==typeof t&&(t(.5+.25*e),e%5==0&&console.log("[Context] Load Model Progress:",e))}),e.plan.info.runtime.n_parallel){if(!await l.parallel.enable({n_parallel:e.plan.info.runtime.n_parallel,n_batch:e.plan.info.runtime.n_batch}))throw new Error("Failed to enable parallel decoding mode for context")}return"function"==typeof t&&t(1),r.context=l,r.modelInfo=l.getModelInfo(),wn.addModelLoad({id:`${e.id}-${n}`,generatorId:e.id,contextKey:n,repoId:e.plan.info.model?.repoId||null,quantization:e.plan.info.model?.quantization||null,variant:e.plan.info.runtime?.variant||null,nCtx:e.plan.info.runtime?.n_ctx||null,nGpuLayers:e.plan.info.runtime?.n_gpu_layers||null,durationMs:Date.now()-o,success:!0}),r}catch(t){if(wn.addModelLoad({id:`${e.id}-${n}`,generatorId:e.id,contextKey:n,repoId:e.plan.info.model?.repoId||null,quantization:e.plan.info.model?.quantization||null,variant:e.plan.info.runtime?.variant||null,durationMs:Date.now()-o,success:!1,error:t?.message||String(t)}),l)try{l.release()}catch(e){}throw t}})();try{return await r.ready,r}catch(t){throw e.contexts.delete(n),t}},dr=async(e,t,n=!1)=>{if(t.released)return!1;if(!n&&t.refCount>0)return!1;t.released=!0,e.contexts.delete(t.key);try{t.context?.parallel?.disable?.()}catch(e){}return await(t.context?.release?.()),!0},pr=async(e,t,n=!1)=>{if(t.releaseRequested=!0,t.releaseTimer&&(clearTimeout(t.releaseTimer),t.releaseTimer=null),n)t.refCount=0;else if(t.refCount=Math.max(0,t.refCount-1),t.refCount>0)return t.releaseRequested=!1,!1;const r=e.config.runtime.context_release_delay_ms;if("number"!=typeof r||!Number.isFinite(r))return dr(e,t);const o=Math.max(0,Math.floor(r));return n||o<=0?dr(e,t):(console.log(`[Context] Scheduling release in ${o}ms for context "${t.key}"`),t.releaseTimer=setTimeout(async()=>{if(t.releaseTimer=null,t.refCount>0)return console.log(`[Context] Release cancelled, refCount=${t.refCount} for context "${t.key}"`),void(t.releaseRequested=!1);console.log(`[Context] Releasing context "${t.key}" after ${o}ms delay`),await dr(e,t)},o),!0)};async function mr(e,t,n={}){const{globalDownloadManager:r=null}=n,o=An(t),a=await ar(o),i=new Wn(o,a);await i.initialize();const s={id:e,type:"ggml-llm",config:o,plan:a,info:a.info,contexts:new Map,downloads:new Map,globalDownloadManager:r,sessionCache:i,finalized:!1};return{id:e,type:"ggml-llm",info:a.info,contexts:s.contexts,initContext:async(e={})=>{const{onProgress:t}=e,n=await ur(s,t);return{modelInfo:n.modelInfo?{...n.modelInfo}:null,runtime:{...s.plan.info.runtime},download:{...s.plan.info.download}}},completion:async(e={})=>{const{options:t={},useCache:n=!0}=e,r=cr(s),o=s.contexts.get(r);if(!o)throw new Error(`Context "${r}" not initialized`);await o.ready;let a=t.prompt||"";if(!a&&t.messages){const e=await o.context.getFormattedChat(t.messages,t.chat_template||t.chatTemplate,{jinja:t.jinja??!0,tools:t.tools,parallel_tool_calls:t.parallel_tool_calls,tool_choice:t.tool_choice,enable_thinking:t.enable_thinking,add_generation_prompt:t.add_generation_prompt,now:t.now,chat_template_kwargs:t.chat_template_kwargs});a=e?.prompt||e||""}if(n&&s.sessionCache.enabled&&a){const{options:e}=await s.sessionCache.prepareCompletionOptions(t,a),n=await s.sessionCache.generateTempStatePath(),r=await o.context.tokenize(a),i=r?.tokens?.length||0,l={...e,save_state_path:n,save_state_size:i};console.log(`[SessionCache] save_state_size=${i} (prompt tokens)`);const c={repoId:s.plan.info.model?.repoId||null,quantization:s.plan.info.model?.quantization||null,variant:s.plan.info.runtime?.variant||null};return lr(o.context,l,s.sessionCache,a,n,i,s.id,c)}const i={repoId:s.plan.info.model?.repoId||null,quantization:s.plan.info.model?.quantization||null,variant:s.plan.info.runtime?.variant||null};return sr(o.context,t,s.id,i)},tokenize:async(e={})=>{const{text:t="",params:n={}}=e,r=cr(s),o=s.contexts.get(r);if(!o)throw new Error(`Context "${r}" not initialized`);await o.ready;const a=await o.context.tokenize(t,n);if(!a)return{tokens:[]};const i=Array.from(a.tokens??[]).map(e=>Number(e));return{...a,tokens:i}},detokenize:async(e={})=>{const{tokens:t=[]}=e,n=cr(s),r=s.contexts.get(n);if(!r)throw new Error(`Context "${n}" not initialized`);await r.ready;const o=t.map(e=>Number(e));return r.context.detokenize(o)},applyChatTemplate:async(e={})=>{const{messages:t=[],template:n,params:r}=e,o=cr(s),a=s.contexts.get(o);if(!a)throw new Error(`Context "${o}" not initialized`);return await a.ready,await a.context.getFormattedChat(t,n,r)},releaseContext:async()=>{if(s.finalized)return!1;const e=cr(s),t=s.contexts.get(e);return!!t&&pr(s,t,!1)},finalize:async()=>{if(s.finalized)return;s.finalized=!0;const e=Array.from(s.contexts.values()),t=e.map(e=>e.released||e.releaseRequested||e.releaseTimer?Promise.resolve(!1):(e.refCount=Math.max(0,e.refCount-1),e.refCount>0?Promise.resolve(!1):dr(s,e)));await Promise.allSettled(t);(0===e.length||e.every(e=>e.released))&&await s.sessionCache.cleanup()},getStatus:()=>{const e=[],t=Array.from(s.contexts.entries()).map(([t,n])=>{const r={key:t,refCount:n.refCount,hasModel:Boolean(n.context)},o=n.context.parallel.getStatus();return r.parallelStatus=o,e.push({contextKey:t,...o}),r});return{id:s.id,type:s.type,repoId:s.plan.info.model?.repoId||null,quantization:s.plan.info.model?.quantization||null,variant:s.plan.info.runtime?.variant||null,nCtx:s.plan.info.runtime?.n_ctx||null,nParallel:s.plan.info.runtime?.n_parallel||null,contexts:t,parallelStatuses:e}},subscribeParallelStatus:e=>{const t=Array.from(s.contexts.entries()).map(([t,n])=>n.context.parallel.subscribeToStatus(n=>{e({contextKey:t,...n})}));return{remove:()=>{t.forEach(e=>{e?.remove&&e.remove()})}}},hasPendingReleases:()=>Array.from(s.contexts.values()).some(e=>!e.released&&(e.releaseRequested||e.releaseTimer||e.refCount>0)),resetFinalized:()=>{s.finalized=!1}}}const fr=e=>{const t=An(e);return t.model.repo_id||t.model.repository||t.model.model||null};async function hr(e,t,n={}){const{onProgress:r,onComplete:o,onError:a}=n;try{const n=An(e),i=await rr(n),s=er(n,i),{repoId:l}=i;if(await tr(s,i.size))return console.log(`[Download] Model already exists: ${l} at ${s}`),"function"==typeof o&&o({localPath:s,repoId:l,alreadyExists:!0}),{started:!1,localPath:s,repoId:l,alreadyExists:!0};const c=t.getDownload(s);if(c)return console.log(`[Download] Already downloading: ${l}`),c.then(()=>{"function"==typeof o&&o({localPath:s,repoId:l,joinedExisting:!0})}).catch(e=>{"function"==typeof a&&a(e)}),{started:!1,localPath:s,repoId:l,alreadyDownloading:!0};console.log(`[Download] Starting download: ${l}`);const u=(async()=>{try{if(i.isSplit&&i.splitCount>0){const e=/-(\d{5})-of-(\d{5})\.gguf$/,t=g.dirname(s),o=i.splitCount;let a=0;for(let s=1;s<=o;s+=1){const c=String(s).padStart(5,"0"),u=i.filename.replace(e,`-${c}-of-${String(o).padStart(5,"0")}.gguf`),d=`${n.model.base_url.replace(/\/+$/,"")}/${i.repoId}/resolve/${i.revision}/${u}`,p=g.join(t,u);await tr(p)||await nr(d,i.headers,p,null,e=>{if(e>=0&&Number.isFinite(e)){const t=(a+e)/o;console.log(`[Download] ${l}: ${Math.round(100*t)}%`),"function"==typeof r&&r(t)}}),a+=1}}else await nr(i.url,i.headers,s,i.size,e=>{e>=0&&Number.isFinite(e)&&(console.log(`[Download] ${l}: ${Math.round(100*e)}%`),"function"==typeof r&&r(e))});console.log(`[Download] Completed: ${l}`),"function"==typeof o&&o({localPath:s,repoId:l})}catch(e){throw console.error(`[Download] Failed: ${l}`,e.message),"function"==typeof a&&a(e),e}finally{t.deleteDownload(s)}})();return t.setDownload(s,u),{started:!0,localPath:s,repoId:l}}catch(e){return console.error("[Download] Failed to start download:",e.message),"function"==typeof a&&a(e),{started:!1,localPath:null,repoId:null,error:e.message}}}const yr=e=>e?"number"==typeof e.score&&Number.isFinite(e.score)?Number(e.score):Lt(e):0;async function gr(e=null,t={}){const{threshold:n=1.1,includeBreakdown:r=!1,config:o,...s}=t;let l=null,c=null,u=null,d=null,p=null,m=null;if(o)try{const{modelBytes:e,kvCacheBytes:t,limitedKvCacheBytes:n,memoryLimitedCtx:r,kvInfo:a,quantization:i}=await async function(e){const t=An(e),n=await rr(t),r=await Xn(n.url,n.headers,t.runtime.cache_dir),{arch:o,nCtxTrain:a,nLayer:i,nEmbd:s,nHead:l,nHeadKv:c,nEmbdHeadK:u,nEmbdHeadV:d,quantVersion:p,fileType:m}=cn(r),f=Number.isFinite(Number(i))?Number(i):0,h=Number.isFinite(Number(s))?Number(s):0,y=Number.isFinite(Number(l))?Number(l):0,g=Number.isFinite(Number(c))?Number(c):y,b=y>0&&h>0?h/y:128,w=null!=u&&Number.isFinite(Number(u))?Number(u):b,v=null!=d&&Number.isFinite(Number(d))?Number(d):b,_=ln({arch:o,metadata:r,nLayer:f}),x=_&&Number.isFinite(Number(_.kvLayers))?Number(_.kvLayers):f,S=Math.max(0,Math.floor(Number(x)||0)),k=(t.model.n_ctx?Number(t.model.n_ctx):null)||a||4096,C={k:t.model.cache_type_k,v:t.model.cache_type_v},M=n.size>0?n.size:0,T=un({layerCount:S,headKvCount:g,embdHeadKCount:w,embdHeadVCount:v,cacheTypes:C,swaConfig:_,kvUnified:t.model.kv_unified,nParallel:t.model.n_parallel,swaFull:t.model.swa_full}),E=null!=t.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(t.backend.gpu_memory_fraction))):qn.backend.gpu_memory_fraction||1,$=null!=t.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(t.backend.cpu_memory_fraction))):Pn,B=T(k),I=await or(t,{modelBytes:M,kvCacheBytes:B}),O=(I.selected.totalMemory||0)*E,N=Math.max(0,Pt.totalmem()*$),P=I.selected.hasGpu?O:N,q=dn({maxCtx:k,availableMemory:P,modelBytes:M,kvBytesForCtx:T}),z=T(k),D=T(q);return{kvInfo:{nCtxTrain:a,nLayer:f,nEmbd:h,nHeadKv:g,nEmbdHeadK:w,nEmbdHeadV:v,nHeadCount:y,nHeadKvCount:g,kvLayerCount:S,swa:_?.enabled?{window:_.window,pattern:_.pattern,denseFirst:_.denseFirst,type:_.type,layers:_.swaLayers}:null},modelBytes:M,kvCacheBytes:z,limitedKvCacheBytes:D,memoryLimitedCtx:q,quantization:{name:n.quantization||null,fileType:m,version:p}}}(o);l=e,c=t,u=n,d=r,p=a,m=i}catch(e){}const f=null!=o?.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(o.backend.gpu_memory_fraction))):void 0,h=null!=o?.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(o.backend.cpu_memory_fraction))):void 0,y=await en({...s,platform:process.platform,totalMemoryInBytes:Pt.totalmem(),backend:"ggml-llm",includeBreakdown:r,gpuMemoryFraction:f,cpuMemoryFraction:h,dependencies:{getBackendDevicesInfo:a,isLibVariantAvailable:i},modelBytes:l,kvCacheBytes:c,limitedKvCacheBytes:u}),g=y.selected,b=yr(g);g.modelBytes=l||null,g.kvCacheBytes=c||null,g.memoryLimitedCtx=d||null,g.limitedKvCacheBytes=u||null,g.kvInfo=p||null,g.quantization=m||null;let w=null,v=null;if(e){const t=yr(e);v={...e,score:t};let r="buttress",o="buttress-higher-score";if(y.ok)if(t||0===t){const e=v.fit,a=v.limitedFit,i=g?.fit,s=g?.limitedFit,l=e?.fitsInGpu||e?.fitsInCpu||a?.fitsInGpu||a?.fitsInCpu,c=i?.fitsInGpu||i?.fitsInCpu||s?.fitsInGpu||s?.fitsInCpu;l&&!c?(r="local",o="client-fits-in-memory"):c&&!l?(r="buttress",o="buttress-fits-in-memory"):t>b*n?(r="local",o="client-better"):b>t*n?(r="buttress",o="buttress-better"):(r="either",o="comparable-scores")}else r="buttress",o="missing-client-score";else r="local",o="buttress-unavailable";w={buttressScore:b,clientScore:t,threshold:n,recommendation:r,reason:o}}y.ok||w||(w={buttressScore:b,clientScore:e?.score??null,threshold:n,recommendation:"local",reason:"buttress-unavailable"});let _=null;return o&&(_={repoId:o.model?.repo_id||null,quantization:o.model?.quantization||null,nCtx:o.model?.n_ctx||null,cacheKType:o.model?.cache_type_k||"f16",cacheVType:o.model?.cache_type_v||"f16"}),{type:"ggml-llm",timestamp:(new Date).toISOString(),buttress:y,client:v,comparison:w,modelConfig:_}}const{WritableStream:br}="undefined"!=typeof globalThis&&globalThis.ReadableStream&&globalThis.WritableStream?{ReadableStream:globalThis.ReadableStream,WritableStream:globalThis.WritableStream}:fn,wr=(e={},t={})=>(Object.entries(t||{}).forEach(([t,n])=>{n&&"object"==typeof n&&!Array.isArray(n)?(e[t]&&"object"==typeof e[t]||(e[t]={}),wr(e[t],n)):e[t]=n}),e),vr="https://huggingface.co",_r="https://huggingface.co/api",xr=g.join(Pt.homedir(),".buttress","models"),Sr=["cuda","vulkan","default"],kr=["q8_0","q5_1","q5_0","q4_1","q4_0"],Cr="fp16",Mr={backend:{type:"ggml-stt",variant:null,variant_preference:Sr,gpu_memory_fraction:.85,cpu_memory_fraction:.5},model:{repo_id:"BricksDisplay/whisper-ggml",revision:"main",filename:null,url:null,quantization:null,preferred_quantizations:["q8_0",Cr,"q5_1"],allow_local_file:!1,local_path:null,api_base:_r,base_url:vr,use_gpu:!0,use_flash_attn:"auto"},runtime:{cache_dir:xr,prefer_variants:[],huggingface_token:process.env.HUGGINGFACE_TOKEN||null,http_headers:{},max_threads:null,context_release_delay_ms:1e4}},Tr=(e,t=[])=>e||0===e?Array.isArray(e)?e.filter(e=>null!=e):[e]:[...t],Er=e=>{if(!e)return null;const t=String(e).toLowerCase();return["cuda","vulkan","default"].includes(t)?t:null},$r=(e={})=>{const t=JSON.parse(JSON.stringify(Mr));if(wr(t,e),t.backend.variant=Er(t.backend.variant),t.backend.variant_preference=Array.from(new Set(Tr(t.backend.variant_preference||Sr).map(Er).filter(Boolean))),0===t.backend.variant_preference.length&&(t.backend.variant_preference=[...Sr]),t.runtime.prefer_variants=Array.from(new Set(Tr(t.runtime.prefer_variants).map(Er).filter(Boolean))),t.model.preferred_quantizations=Array.from(new Set(Tr(t.model.preferred_quantizations||t.model.quantizations).map(e=>e?String(e).toLowerCase():null).filter(Boolean))),t.model.quantization){const e=String(t.model.quantization).toLowerCase();t.model.preferred_quantizations.includes(e)||t.model.preferred_quantizations.unshift(e)}return t.model.base_url=t.model.base_url||vr,t.model.api_base=t.model.api_base||_r,t.runtime.cache_dir=t.runtime.cache_dir?g.resolve(t.runtime.cache_dir):xr,t.runtime.context_release_delay_ms=Math.max(0,Number(t.runtime.context_release_delay_ms)||Mr.runtime.context_release_delay_ms),t},Br=e=>{const t=e.toLowerCase();return kr.find(e=>t.includes(e))||null},Ir=async e=>{await(0,y.mkdir)(e,{recursive:!0})},Or=(e,t,n=xr)=>{const r=(0,qt.createHash)("sha256").update(e).digest("hex");return g.join(((e=xr)=>g.join(e,".metadata-cache"))(n),t,`${r}.json`)},Nr=async(e,t,n,r=xr)=>{try{const o=Or(e,t,r);await Ir(g.dirname(o)),await(0,y.writeFile)(o,JSON.stringify(n),"utf-8")}catch(e){}},Pr=async(e,t={})=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");const n=await fetch(e,{...t,method:"HEAD"});if(!n.ok)throw new Error(`Failed to fetch headers for ${e}: ${n.status} ${n.statusText}`);return n},qr=(e,t)=>{if(e.model.local_path)return g.resolve(e.model.local_path);const n=t.repoId.split("/"),r=g.join(e.runtime.cache_dir,...n,t.revision);return g.join(r,t.filename)},zr=async(e,t)=>{try{const n=await(0,y.stat)(e);return!t||n.size===t}catch(e){return!1}},Dr=async(e,t,n,r,o)=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");await Ir(g.dirname(n));const a=await fetch(e,{headers:t});if(!a.ok||!a.body)throw new Error(`Failed to download ${e}: ${a.status} ${a.statusText}`);const i=await(0,y.open)(n,"w"),s=Number(a.headers.get("content-length"))||r||0;let l=0,c=.05;try{await a.body.pipeTo(new br({async write(e){if(await i.write(e),l+=e.byteLength,"function"==typeof o&&s>0){const e=Math.min(1,l/s);for(;e>=c;)o(c),c+=.05}},async close(){await i.close(),"function"==typeof o&&o(1)},async abort(e){throw await i.close().catch(()=>{}),await(0,y.unlink)(n).catch(()=>{}),e}}))}catch(e){throw await i.close().catch(()=>{}),await(0,y.unlink)(n).catch(()=>{}),e}if(r){const e=await(0,y.stat)(n);if(e.size!==r)throw await(0,y.unlink)(n).catch(()=>{}),new Error(`Downloaded file size mismatch, expected ${r} got ${e.size}`)}},Ar=async e=>{const t=e.model.repo_id||e.model.repository||e.model.model;if(!t)throw new Error("`model.repo_id` is required in Buttress backend config");const n=e.model.revision||"main",r=e.runtime.cache_dir,o=JSON.stringify({repoId:t,revision:n,filename:e.model.filename,url:e.model.url,quantization:e.model.quantization,preferred_quantizations:e.model.preferred_quantizations}),a=await(async(e,t,n=xr)=>{try{const r=Or(e,t,n),o=await(0,y.readFile)(r,"utf-8");return JSON.parse(o)}catch(e){return null}})(o,"artifact-info",r);if(a)return a;const i={...e.runtime.http_headers||{}};if(e.runtime.huggingface_token&&(i.Authorization=`Bearer ${e.runtime.huggingface_token}`),e.model.url){const a=await Pr(e.model.url,{headers:i}),s=Number(a.headers.get("content-length"))||null,l=e.model.filename||e.model.url.split("/").pop(),c={repoId:t,revision:n,filename:l,url:e.model.url,size:s,quantization:Br(l||""),headers:i};return await Nr(o,"artifact-info",c,r),c}let{filename:s}=e.model,l=e.model.quantization&&String(e.model.quantization).toLowerCase();const c=await(async(e,t={})=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");const n=await fetch(e,t);if(!n.ok){const t=await n.text().catch(()=>"");throw new Error(`Failed to fetch ${e}: ${n.status} ${n.statusText} ${t}`.trim())}return n.json()})(`${e.model.api_base}/models/${t}?revision=${n}&blobs=true`,{headers:i}),u=(c?.siblings||c?.files||[]).map(e=>e.rfilename||e.path||e.filename).filter(e=>"string"==typeof e&&e.endsWith(".bin"));if(0===u.length)throw new Error(`No model artifacts found in repo ${t}`);const d=e.model.preferred_quantizations.length>0?e.model.preferred_quantizations:kr;if(s)l||(l=Br(s));else{const e=(()=>{for(const e of d)if(e===Cr){const e=u.find(e=>{const t=e.toLowerCase();return!kr.some(e=>t.includes(e))});if(e)return{filename:e,quantization:null}}else{const t=u.find(t=>t.toLowerCase().includes(e));if(t)return{filename:t,quantization:e}}return null})()||{filename:u[0],quantization:null},{filename:t,quantization:n}=e;s=t,l=n||Br(s)}const p=`${e.model.base_url.replace(/\/+$/,"")}/${t}/resolve/${n}/${s}`,m=await Pr(p,{headers:i}),f={repoId:t,revision:n,filename:s,url:p,size:Number(m.headers.get("content-length"))||null,quantization:l,headers:i,isSplit:!1,splitCount:0};return await Nr(o,"artifact-info",f,r),f},Rr=async(e,{modelBytes:t=null,processingBytes:n=null}={})=>{const r=(e=>{const t=[];return e.backend.variant&&t.push(e.backend.variant),e.runtime.prefer_variants.length>0&&t.push(...e.runtime.prefer_variants),t.push(...e.backend.variant_preference),t.push("default"),Array.from(new Set(t.map(Er).filter(Boolean)))})(e),[o,...s]=r,l=null!=e.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.gpu_memory_fraction))):Mr.backend.gpu_memory_fraction||1,c=null!=e.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.cpu_memory_fraction))):.5,u=await en({platform:process.platform,totalMemoryInBytes:Pt.totalmem(),backend:"ggml-stt",variant:o||null,preferVariants:s,variantPreference:e.backend.variant_preference,gpuMemoryFraction:l,cpuMemoryFraction:c,dependencies:{getBackendDevicesInfo:a,isLibVariantAvailable:i},modelBytes:t,kvCacheBytes:n}),d=e=>({...e,devices:Array.isArray(e.devices)?e.devices:[],ok:e.ok,hasGpu:Boolean(e.hasGpu),totalMemory:e.gpuTotalBytes||e.totalMemory||0,error:e.ok?null:new Error(e.error||`Variant ${e.variant} not available on this platform`)});if(!u.ok||!u.selected){const e=(u.attempts||[]).map(e=>`${e.variant}: ${e.error||"unknown error"}`).join("; ");throw new Error(`Unable to initialize any backend variant (${r.join(", ")}). Errors: ${e}`)}const p=(u.attempts||[]).map(d);return{selected:d(u.selected),attempts:p}},Fr=async e=>{const t=await Ar(e),n=rn({modelBytes:t.size>0?t.size:0}),r=await Rr(e,{modelBytes:n.modelBytes,processingBytes:n.processingBufferBytes});let o=r.selected.hasGpu&&(void 0===r.selected.fit?.fitsInGpu||r.selected.fit.fitsInGpu);!1===e.model.use_gpu&&(o=!1);const a=e.model.use_flash_attn&&String(e.model.use_flash_attn).toLowerCase();let i;i="on"===a||"true"===a||"off"!==a&&"false"!==a&&o;const s=e.runtime.cache_dir,l=qr(e,t),c=await zr(l,t.size);return{config:e,info:{ok:!0,backend:"ggml-stt",model:{repoId:t.repoId,revision:t.revision,filename:t.filename,quantization:t.quantization,url:t.url,sizeBytes:t.size},runtime:{variant:r.selected.variant,use_gpu:o,use_flash_attn:i,max_threads:e.runtime.max_threads?Number(e.runtime.max_threads):null},resources:{...n,gpuCapacityBytes:r.selected.gpuTotalBytes,gpuUsableBytes:r.selected.gpuUsableBytes,cpuUsableBytes:r.selected.cpuUsableBytes,fit:r.selected.fit},devices:{selected:r.selected,attempts:r.attempts},download:{cacheDir:s,localPath:l,exists:c},timestamp:(new Date).toISOString()},artifact:t,memory:n,devices:r,localPath:l,localExists:c}};class jr{constructor(){this.queue=[],this.processing=!1,this.currentTaskId=null}async enqueue(e,t=null){return new Promise((n,r)=>{this.queue.push({task:e,resolve:n,reject:r,taskId:t}),this.processNext()})}async processNext(){if(this.processing||0===this.queue.length)return;this.processing=!0;const{task:e,resolve:t,reject:n,taskId:r}=this.queue.shift();this.currentTaskId=r;try{t(await e())}catch(e){n(e)}finally{this.processing=!1,this.currentTaskId=null,this.processNext()}}getStatus(){return{processing:this.processing,queuedCount:this.queue.length,currentTaskId:this.currentTaskId}}}const Ur=e=>{if(!e)return null;if(e instanceof ArrayBuffer)return e;if(ArrayBuffer.isView(e))return e.buffer;if("string"==typeof e){const t=e.startsWith("data:")?e.split(",")[1]||"":e,n=Buffer.from(t,"base64");return n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength)}throw new Error("Unsupported audioData format, expected base64 string or ArrayBuffer")},Lr=async(e,t)=>{if(e.contextRecord&&!e.contextRecord.released)return e.contextRecord.releaseTimer&&(clearTimeout(e.contextRecord.releaseTimer),e.contextRecord.releaseTimer=null,console.log("[Context] Cancelled pending STT release")),e.contextRecord.releaseRequested=!1,e.contextRecord.refCount+=1,console.log(`[Context] Reusing existing STT context, refCount=${e.contextRecord.refCount}`),"function"==typeof t&&t(0),e.contextRecord.context||await e.contextRecord.ready,"function"==typeof t&&t(1),e.contextRecord;e.contextRecord?console.log(`[Context] STT record exists but released=${e.contextRecord.released}, creating new context`):console.log("[Context] No existing STT record, creating new context");const n={refCount:1,ready:null,released:!1};e.contextRecord=n,n.ready=(async()=>{const r=Date.now();try{"function"==typeof t&&t(0);const o=await(async(e,t,n,r=null)=>{const{localPath:o,artifact:a,config:i}=e;if(e.localExists)return"function"==typeof n&&n(1),o;if(r){const t=r.getDownload(o);if(t){console.log(`[ensureModelFile] Waiting for global STT download: ${a.repoId}`);try{if(await t,await zr(o,a.size))return e.localExists=!0,e.info.download.exists=!0,"function"==typeof n&&n(1),o}catch(e){console.warn(`[ensureModelFile] Global STT download failed, will retry: ${e.message}`)}}}const s=t.get(o);if(s)return await s,"function"==typeof n&&n(1),o;const l=(async()=>{if(i.model.allow_local_file){if(!await zr(o,a.size))throw new Error(`Local model file not found: ${o}`);return o}return await Dr(a.url,a.headers,o,a.size,n),o})();t.set(o,l);try{return await l,o}finally{t.delete(o)}})(e.plan,e.downloads,t,e.globalDownloadManager);"function"==typeof t&&t(.5);const a=await l({filePath:o,useFlashAttn:"on"===e.plan.info.runtime.flash_attn_type,useGpu:e.plan.info.runtime.n_gpu_layers>0,nThreads:e.plan.info.runtime.n_threads},e.plan.info.runtime.variant);"function"==typeof t&&t(1),n.context=a;try{n.modelInfo=a.getModelInfo()}catch(e){n.modelInfo=null}return vn.addModelLoad({id:e.id,generatorId:e.id,repoId:e.plan.info.model?.repoId||null,quantization:e.plan.info.model?.quantization||null,variant:e.plan.info.runtime?.variant||null,useGpu:e.plan.info.runtime?.use_gpu||!1,durationMs:Date.now()-r,success:!0}),n}catch(t){throw vn.addModelLoad({id:e.id,generatorId:e.id,repoId:e.plan.info.model?.repoId||null,quantization:e.plan.info.model?.quantization||null,variant:e.plan.info.runtime?.variant||null,durationMs:Date.now()-r,success:!1,error:t?.message||String(t)}),t}})();try{return await n.ready,"function"==typeof t&&t(1),n}catch(t){throw e.contextRecord=null,t}},Gr=async(e,t,n=!1)=>!t.released&&(!(!n&&t.refCount>0)&&(t.released=!0,e.contextRecord=null,await(t.context?.release?.()),!0)),Hr=async(e,t,n=!1)=>{if(t.releaseRequested=!0,t.releaseTimer&&(clearTimeout(t.releaseTimer),t.releaseTimer=null),n)t.refCount=0;else if(t.refCount=Math.max(0,t.refCount-1),t.refCount>0)return t.releaseRequested=!1,!1;const r=e.config.runtime.context_release_delay_ms;if("number"!=typeof r||!Number.isFinite(r))return Gr(e,t);const o=Math.max(0,Math.floor(r));return n||o<=0?Gr(e,t):(console.log(`[Context] Scheduling STT release in ${o}ms`),t.releaseTimer=setTimeout(async()=>{if(t.releaseTimer=null,t.refCount>0)return console.log(`[Context] STT release cancelled, refCount=${t.refCount}`),void(t.releaseRequested=!1);console.log(`[Context] Releasing STT context after ${o}ms delay`),await Gr(e,t)},o),!0)};async function Jr(e,t,n={}){const{globalDownloadManager:r=null}=n,o=$r(t),a=await Fr(o),i={id:e,type:"ggml-stt",config:o,plan:a,info:a.info,contextRecord:null,downloads:new Map,globalDownloadManager:r,queue:new jr,finalized:!1},s=async(e={})=>{const{audioPath:t,audioData:n,options:r={}}=e,o=i.contextRecord;if(!o)throw new Error("Context not initialized");const a={...r};i.plan.info.runtime.max_threads&&null==a.maxThreads&&(a.maxThreads=i.plan.info.runtime.max_threads);const s=`transcription-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,l=Date.now();return i.queue.enqueue(async()=>{await o.ready;try{let e;if(n){const t=Ur(n),{promise:r}=o.context.transcribeData(t,a);e=await r}else{if(!t)throw new Error("audioPath or audioData is required for transcription");const n=g.resolve(t),{promise:r}=o.context.transcribe(n,a);e=await r}return vn.addTranscription({id:s,generatorId:i.id,repoId:i.plan.info.model?.repoId||null,quantization:i.plan.info.model?.quantization||null,variant:i.plan.info.runtime?.variant||null,durationMs:Date.now()-l,segmentCount:e?.segments?.length||0,textLength:e?.text?.length||0,success:!0}),e}catch(e){throw vn.addTranscription({id:s,generatorId:i.id,repoId:i.plan.info.model?.repoId||null,quantization:i.plan.info.model?.quantization||null,variant:i.plan.info.runtime?.variant||null,durationMs:Date.now()-l,success:!1,error:e?.message||String(e)}),e}},s)};return{id:e,type:"ggml-stt",info:a.info,queue:i.queue,initContext:async(e={})=>{const{onProgress:t}=e;try{const e=await Lr(i,t);return{modelInfo:e.modelInfo&&"object"==typeof e.modelInfo?{...e.modelInfo}:null,runtime:{...i.plan.info.runtime},download:{...i.plan.info.download}}}catch(e){throw console.error("[Context] Error initializing context:",e),e}},transcribe:async(e={})=>s(e),transcribeData:async(e={})=>s(e),releaseContext:async()=>{if(i.finalized)return!1;const e=i.contextRecord;return!!e&&Hr(i,e)},finalize:async()=>{if(i.finalized)return;i.finalized=!0;const e=i.contextRecord;e&&(e.released||e.releaseRequested||e.releaseTimer||(e.refCount=Math.max(0,e.refCount-1),e.refCount>0||await Gr(i,e)))},getStatus:()=>({id:i.id,type:i.type,repoId:i.plan.info.model?.repoId||null,quantization:i.plan.info.model?.quantization||null,variant:i.plan.info.runtime?.variant||null,hasContext:Boolean(i.contextRecord?.context),contextRefCount:i.contextRecord?.refCount||0,queueStatus:i.queue.getStatus()}),hasPendingReleases:()=>{const e=i.contextRecord;return!!e&&(!e.released&&(e.releaseRequested||e.releaseTimer||e.refCount>0))},resetFinalized:()=>{i.finalized=!1}}}const Vr=["large-v3-turbo","distil-large-v3","large-v3","large-v2","large-v1","large","distil-medium","medium.en","medium","small.en-tdrz","distil-small.en","small.en","small","base.en","base","tiny.en","tiny"],Kr=e=>{const t=$r(e),n=t.model.repo_id||t.model.repository||t.model.model||null;if(!n)return null;const r=(e=>{if(!e)return null;const t=e.toLowerCase();return Vr.find(e=>t.includes(e))||null})(t.model.filename);return r?`${n}:${r}`:n};async function Yr(e,t,n={}){const{onProgress:r,onComplete:o,onError:a}=n;try{const n=$r(e),i=await Ar(n),s=qr(n,i),{repoId:l}=i;if(await zr(s,i.size))return console.log(`[Download] STT model already exists: ${l} at ${s}`),"function"==typeof o&&o({localPath:s,repoId:l,alreadyExists:!0}),{started:!1,localPath:s,repoId:l,alreadyExists:!0};const c=t.getDownload(s);if(c)return console.log(`[Download] Already downloading STT model: ${l}`),c.then(()=>{"function"==typeof o&&o({localPath:s,repoId:l,joinedExisting:!0})}).catch(e=>{"function"==typeof a&&a(e)}),{started:!1,localPath:s,repoId:l,alreadyDownloading:!0};console.log(`[Download] Starting STT model download: ${l}`);const u=(async()=>{try{await Dr(i.url,i.headers,s,i.size,e=>{e>=0&&Number.isFinite(e)&&(console.log(`[Download] ${l}: ${Math.round(100*e)}%`),"function"==typeof r&&r(e))}),console.log(`[Download] Completed STT model: ${l}`),"function"==typeof o&&o({localPath:s,repoId:l})}catch(e){throw console.error(`[Download] Failed STT model: ${l}`,e.message),"function"==typeof a&&a(e),e}finally{t.deleteDownload(s)}})();return t.setDownload(s,u),{started:!0,localPath:s,repoId:l}}catch(e){return console.error("[Download] Failed to start STT download:",e.message),"function"==typeof a&&a(e),{started:!1,localPath:null,repoId:null,error:e.message}}}const Wr=e=>e?"number"==typeof e.score&&Number.isFinite(e.score)?Number(e.score):Lt(e):0;async function Qr(e,t=null,n={}){if("ggml-llm"===e)return gr(t,n);if("ggml-stt"===e)return async function(e=null,t={}){const{threshold:n=1.1,includeBreakdown:r=!1,config:o,...s}=t;let l=null,c=null,u=null;if(o)try{const e=$r(o),t=await Ar(e);l=t.size??null,({processingBufferBytes:c}=rn({modelBytes:l})),u=t.quantization||null}catch(e){}const d=null!=o?.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(o.backend.gpu_memory_fraction))):void 0,p=null!=o?.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(o.backend.cpu_memory_fraction))):void 0,m=await en({...s,platform:process.platform,totalMemoryInBytes:Pt.totalmem(),backend:"ggml-stt",includeBreakdown:r,gpuMemoryFraction:d,cpuMemoryFraction:p,dependencies:{getBackendDevicesInfo:a,isLibVariantAvailable:i},modelBytes:l,kvCacheBytes:c}),f=m.selected,h=Wr(f);f&&(f.modelBytes=l||null,f.processingBytes=c||null,f.quantization=u||null);let y=null,g=null;if(e){const t=Wr(e);g={...e,score:t};let r="buttress",o="buttress-higher-score";if(m.ok)if(t||0===t)if(e.fit&&f?.fit){const a=e.fit.fitsInGpu||e.fit.fitsInCpu,i=f.fit.fitsInGpu||f.fit.fitsInCpu;a&&!i?(r="local",o="client-fits-in-memory"):i&&!a?(r="buttress",o="buttress-fits-in-memory"):t>h*n?(r="local",o="client-better"):h>t*n?(r="buttress",o="buttress-better"):(r="either",o="comparable-scores")}else t>h*n?(r="local",o="client-better"):h>t*n?(r="buttress",o="buttress-better"):(r="either",o="comparable-scores");else r="buttress",o="missing-client-score";else r="local",o="buttress-unavailable";y={buttressScore:h,clientScore:t,threshold:n,recommendation:r,reason:o}}m.ok||y||(y={buttressScore:h,clientScore:e?.score??null,threshold:n,recommendation:"local",reason:"buttress-unavailable"});let b=null;return o&&(b={repoId:o.model?.repo_id||null,quantization:o.model?.quantization||null,filename:o.model?.filename||null}),{type:"ggml-stt",timestamp:(new Date).toISOString(),buttress:m,client:g,comparison:y,modelConfig:b}}(t,n);throw new Error(`Unknown backend type: ${e}`)}const Zr=t("node:fs"),Xr=t("node:child_process"),eo=JSON.parse('{"UU":"@fugood/buttress-backend-core","rE":"2.23.0-beta.36"}'),to=e=>{if(!e)return{repoId:null,filename:null};const[t,n]=e.split(":");return{repoId:t,filename:n||null}};async function no({modelIds:e=[],defaultConfig:t=null}={}){const n=[];console.log(`${eo.UU} v${eo.rE}`),console.log("Generating model capabilities comparison...\n"),n.push(`${eo.UU} v${eo.rE}`),n.push("## Model Capabilities Comparison\n"),e&&0!==e.length||(console.error("Error: No model IDs provided"),process.exit(1));try{const r=(e={},t={})=>{const n=Array.isArray(e)?[...e]:{...e};return Object.entries(t||{}).forEach(([e,t])=>{t&&"object"==typeof t&&!Array.isArray(t)?n[e]=r(n[e]||{},t):n[e]=t}),n},o=t||{},{server:a,generators:i=[],...s}=o,l=e=>r(JSON.parse(JSON.stringify(s)),e||{}),u=e=>{if(Array.isArray(i)&&i.length>0){const t=i.filter(e=>"ggml-llm"===e?.type);if(t.length>0&&e){const n=t.find(t=>t.model?.repo_id===e);if(n)return l(n)}}return Object.keys(s).length>0?l({}):null},d=[];for(let t=0;t<e.length;t+=1){const n=e[t];console.log(`[${t+1}/${e.length}] Analyzing ${n}...`);let r=u(n);r={...r||{},model:{...s.runtime,...r?.model||{},repo_id:n}};const o=await Qr("ggml-llm",null,{config:r,includeBreakdown:!0});d.push({modelId:n,capabilities:o,modelInfo:o.buttress?.selected||null,modelConfig:o.modelConfig||null})}const p=e=>e?(e/1024/1024/1024).toFixed(2):"N/A",m=e=>e?"✅":"🚫";n.push("| Model ID | Quantization | Size (GB) | Context Size | KV Cache Size (GB) | Total Required Memory (GB) | Fits GPU (Full) | Fits CPU (Full) |"),n.push("|----------|--------------|-----------|--------------|--------------------|-----------------------------|-----------------|-----------------|"),d.forEach(({modelId:e,modelInfo:t,modelConfig:r})=>{const o=t?.quantization?.name?.toUpperCase()||"N/A",a=p(t?.modelBytes),i=r?.nCtx||t?.kvInfo?.nCtxTrain||"N/A",s=un(t),l=Number(i),c=t?.kvCacheBytes||(s&&Number.isFinite(l)&&l>0?s(l):s&&s(t?.kvInfo?.nCtxTrain||0))||null,u=p(c),d=p(t?.modelBytes&&c?t.modelBytes+c:t?.fit?.totalRequiredBytes),f=m(t?.fit?.fitsInGpu),h=m(t?.fit?.fitsInCpu);n.push(`| ${e} | ${o} | ${a} | ${i} | ${u} | ${d} | ${f} | ${h} |`);if((null!=t?.memoryLimitedCtx||null!=t?.limitedFit)&&(!t?.fit?.fitsInGpu||!t?.fit?.fitsInCpu)){const e=t?.memoryLimitedCtx||i,r=Number(e),o=t?.limitedKvCacheBytes||s&&Number.isFinite(r)&&r>0&&s(r)||null,l=p(o),c=p(t?.modelBytes&&o?t.modelBytes+o:t?.limitedFit?.totalRequiredBytes),f=m(t?.limitedFit?.fitsInGpu),h=m(t?.limitedFit?.fitsInCpu);(e!==i||l!==u||c!==d)&&n.push(`| ↳ Limited | - | ${a} | ${e} | ${l} | ${c} | ${f} | ${h} |`)}}),n.push("\n---"),n.push("\n### System Information");let f=null;if("win32"!==process.platform)try{f=(0,Xr.execSync)("uname -a",{encoding:"utf8"}).trim()}catch{}if(f?n.push(`- **System:** ${f}`):(n.push(`- **Hostname:** ${Pt.hostname()}`),n.push(`- **OS:** ${Pt.type()} ${Pt.release()}`)),n.push(`- **Platform:** ${process.platform}`),n.push(`- **CPU Cores:** ${Pt.cpus().length}`),n.push(`- **Total System Memory:** ${(Pt.totalmem()/1024/1024/1024).toFixed(2)} GB`),d.length>0){const e=d[0].capabilities,t=e.buttress?.selected;if(t){const e=t.cpuTotalBytes>0?(t.cpuUsableBytes/t.cpuTotalBytes*100).toFixed(0):0;if(n.push(`- **Usable CPU Memory:** ${(t.cpuUsableBytes/1024/1024/1024).toFixed(2)} GB (${e}% of ${(t.cpuTotalBytes/1024/1024/1024).toFixed(2)} GB)`),t.hasGpu){const e=t.devices.filter(e=>"gpu"===e.type);if(e.length>0){const r=e[0];n.push(`- **GPU Backend:** ${r.backend}`),n.push(`- **GPU Name:** ${r.deviceName}`),n.push(`- **GPU Total Memory:** ${(r.maxMemorySize/1024/1024/1024).toFixed(2)} GB`);const o=t.gpuTotalBytes>0?(t.gpuUsableBytes/t.gpuTotalBytes*100).toFixed(0):0;n.push(`- **GPU Usable Memory:** ${(t.gpuUsableBytes/1024/1024/1024).toFixed(2)} GB (${o}% of ${(t.gpuTotalBytes/1024/1024/1024).toFixed(2)} GB)`)}}else n.push("- **GPU:** Not available")}}n.push("\n### Command Used");const h=process.argv.slice(2).join(" ");if(n.push(`\`\`\`bash\n${process.argv[0]} ${process.argv[1]} ${h}\n\`\`\``),n.push("\n### Package Information"),n.push(`- **Name:** ${eo.UU}`),n.push(`- **Version:** ${eo.rE}`),eo.description&&n.push(`- **Description:** ${eo.description}`),t&&Object.keys(t).length>0){n.push("\n### Configuration"),n.push("<details>"),n.push("<summary>Click to expand TOML configuration</summary>"),n.push("\n```toml");try{const e=c.stringify(t);n.push(e)}catch(e){n.push("# Error serializing config"),n.push(JSON.stringify(t,null,2))}n.push("```"),n.push("</details>")}const y=`ggml-llm-model-capabilities-${(new Date).toISOString().replace(/[.:]/g,"-").split("T")[0]}.md`,b=g.join(process.cwd(),y);Zr.writeFileSync(b,n.join("\n"),"utf8"),console.log(`\nModel capabilities table saved to: ${b}`),process.exit(0)}catch(e){console.error("Failed to generate model table:",e.message),process.exit(1)}}async function ro({modelId:e=null,defaultConfig:t=null}={}){console.log(`${eo.UU} v${eo.rE}`),console.log("Testing capabilities for backend: ggml-llm"),e&&console.log(`Model: ${e}`),console.log("--------------------------------");try{const n=t||{},{server:r,generators:o=[],...a}=n,i=(e={},t={})=>{const n=Array.isArray(e)?[...e]:{...e};return Object.entries(t||{}).forEach(([e,t])=>{t&&"object"==typeof t&&!Array.isArray(t)?n[e]=i(n[e]||{},t):n[e]=t}),n},s=e=>i(JSON.parse(JSON.stringify(a)),e||{});let l=(e=>{if(Array.isArray(o)&&o.length>0){const t=o.filter(e=>"ggml-llm"===e?.type);if(t.length>0&&e){const n=t.find(t=>t.model?.repo_id===e);if(n)return s(n)}}return Object.keys(a).length>0?s({}):null})(e);e&&(l={...l||{},model:{...l?.model||{},repo_id:e}});const c=await Qr("ggml-llm",null,{config:l,includeBreakdown:!0}),u=c.buttress?.selected||null,d=c.modelConfig||null;if(e||d?.repoId){console.log("\n=== Model Information ===");const t=e||d?.repoId;console.log(`Repository ID: ${t}`),d?.quantization&&console.log(`Quantization: ${d.quantization}`),d?.nCtx&&console.log(`Context Length: ${d.nCtx}`),u?.quantization?.name&&console.log(`Model Quantization: ${u.quantization.name.toUpperCase()}`);const n=d?.cache_type_k||"f16",r=d?.cache_type_v||"f16";if(console.log(`KV Cache Type: K=${n}, V=${r}`),u?.modelBytes&&u?.kvCacheBytes){if(console.log(`Model Size: ${(u.modelBytes/1024/1024/1024).toFixed(2)} GB`),u.kvInfo?console.log(`KV Cache Size: ${(u.kvCacheBytes/1024/1024/1024).toFixed(2)} GB (KV info: ${JSON.stringify(u.kvInfo)})`):console.log(`KV Cache Size: ${(u.kvCacheBytes/1024/1024/1024).toFixed(2)} GB`),console.log(`Total Required Memory: ${((u.modelBytes+u.kvCacheBytes)/1024/1024/1024).toFixed(2)} GB`),null!=u.memoryLimitedCtx){const e=u.memoryLimitedCtx,t=u.kvInfo?.nCtxTrain;t?console.log(`\nMemory-Limited Context: ${e} (Train: ${t})`):console.log(`\nMemory-Limited Context: ${e}`),null!=u.limitedKvCacheBytes&&console.log(`Limited KV Cache Size: ${(u.limitedKvCacheBytes/1024/1024/1024).toFixed(2)} GB`)}}else if(c.buttress?.selected?.fit){const{totalRequiredBytes:e}=c.buttress.selected.fit;console.log(`Total Required Memory: ${(e/1024/1024/1024).toFixed(2)} GB`)}}if(c.buttress?.selected){const{selected:e}=c.buttress;console.log("\n=== Hardware Information ===");let t=null;if("win32"!==process.platform)try{t=(0,Xr.execSync)("uname -a",{encoding:"utf8"}).trim()}catch{}t?console.log(`System: ${t}`):(console.log(`Hostname: ${Pt.hostname()}`),console.log(`OS: ${Pt.type()} ${Pt.release()}`)),console.log(`Platform: ${e.platform}`),console.log(`CPU Cores: ${Pt.cpus().length}`),console.log(`Total System Memory: ${(Pt.totalmem()/1024/1024/1024).toFixed(2)} GB`);const n=e.cpuTotalBytes>0?(e.cpuUsableBytes/e.cpuTotalBytes*100).toFixed(0):0;if(console.log(`Usable CPU Memory: ${(e.cpuUsableBytes/1024/1024/1024).toFixed(2)} GB (${n}% of ${(e.cpuTotalBytes/1024/1024/1024).toFixed(2)} GB)`),e.hasGpu){console.log("\n--- GPU Details ---");e.devices.filter(e=>"gpu"===e.type).forEach(t=>{console.log(`GPU Backend: ${t.backend}`),console.log(`GPU Name: ${t.deviceName}`),console.log(`GPU Total Memory: ${(t.maxMemorySize/1024/1024/1024).toFixed(2)} GB`);const n=e.gpuTotalBytes>0?(e.gpuUsableBytes/e.gpuTotalBytes*100).toFixed(0):0;console.log(`GPU Usable Memory: ${(e.gpuUsableBytes/1024/1024/1024).toFixed(2)} GB (${n}% of ${(e.gpuTotalBytes/1024/1024/1024).toFixed(2)} GB)`),t.metadata&&(t.metadata.hasBFloat16&&console.log("Supports BFloat16: Yes"),t.metadata.hasUnifiedMemory&&console.log("Unified Memory: Yes"))})}else console.log("GPU: Not available");console.log(`\nBackend Variant: ${e.variant}`),console.log(`Performance Score: ${e.score}`),e.fit&&(console.log("\n--- Model Fit Analysis ---"),console.log("Fits in GPU: "+(e.fit.fitsInGpu?"Yes":"No")),console.log("Fits in CPU: "+(e.fit.fitsInCpu?"Yes":"No")),console.log(`Limiting Factor: ${e.fit.limiting}`),e.limitedFit&&(console.log("\n--- Memory-Limited Fit Analysis ---"),console.log(`Limited Total Required: ${(e.limitedFit.totalRequiredBytes/1024/1024/1024).toFixed(2)} GB`),console.log("Fits in GPU (Limited): "+(e.limitedFit.fitsInGpu?"Yes":"No")),console.log("Fits in CPU (Limited): "+(e.limitedFit.fitsInCpu?"Yes":"No")),console.log(`Limiting Factor (Limited): ${e.limitedFit.limiting}`)))}console.log("\n=== Full Capabilities JSON ==="),console.log(JSON.stringify(c,null,2)),process.exit(0)}catch(e){console.error("Failed to get capabilities:",e.message),process.exit(1)}}async function oo({modelIds:e=[],defaultConfig:t=null}={}){const n=[];console.log(`${eo.UU} v${eo.rE}`),console.log("Generating STT model capabilities comparison...\n"),n.push(`${eo.UU} v${eo.rE}`),n.push("## STT Model Capabilities Comparison\n"),e&&0!==e.length||(console.error("Error: No model IDs provided"),process.exit(1));try{const r=(e={},t={})=>{const n=Array.isArray(e)?[...e]:{...e};return Object.entries(t||{}).forEach(([e,t])=>{t&&"object"==typeof t&&!Array.isArray(t)?n[e]=r(n[e]||{},t):n[e]=t}),n},o=t||{},{server:a,generators:i=[],...s}=o,l=e=>r(JSON.parse(JSON.stringify(s)),e||{}),u=e=>{if(Array.isArray(i)&&i.length>0){const t=i.filter(e=>"ggml-stt"===e?.type);if(t.length>0&&e){const n=t.find(t=>t.model?.repo_id===e);if(n)return l(n)}}return Object.keys(s).length>0?l({}):null},d=[];for(let t=0;t<e.length;t+=1){const n=e[t],{repoId:r,filename:o}=to(n);console.log(`[${t+1}/${e.length}] Analyzing ${n}...`);let a=u(r);a={...a||{},model:{...a?.model||{},repo_id:r,...o&&{filename:o}}};const i=await Qr("ggml-stt",null,{config:a,includeBreakdown:!0});d.push({modelId:n,repoId:r,filename:o,capabilities:i,modelInfo:i.buttress?.selected||null,modelConfig:i.modelConfig||null})}const p=e=>e?(e/1024/1024).toFixed(1):"N/A",m=e=>e?"✅":"🚫";n.push("| Model | Size (MB) | Processing Buffer (MB) | Total Required (MB) | Fits GPU | Fits CPU |"),n.push("|-------|-----------|------------------------|---------------------|----------|----------|"),d.forEach(({modelId:e,modelInfo:t})=>{const r=p(t?.modelBytes),o=p(t?.processingBytes||t?.kvCacheBytes),a=p(t?.fit?.totalRequiredBytes),i=m(t?.fit?.fitsInGpu),s=m(t?.fit?.fitsInCpu);n.push(`| ${e} | ${r} | ${o} | ${a} | ${i} | ${s} |`)}),n.push("\n---"),n.push("\n### System Information");let f=null;if("win32"!==process.platform)try{f=(0,Xr.execSync)("uname -a",{encoding:"utf8"}).trim()}catch{}if(f?n.push(`- **System:** ${f}`):(n.push(`- **Hostname:** ${Pt.hostname()}`),n.push(`- **OS:** ${Pt.type()} ${Pt.release()}`)),n.push(`- **Platform:** ${process.platform}`),n.push(`- **CPU Cores:** ${Pt.cpus().length}`),n.push(`- **Total System Memory:** ${(Pt.totalmem()/1024/1024/1024).toFixed(2)} GB`),d.length>0){const e=d[0].capabilities,t=e.buttress?.selected;if(t){const e=t.cpuTotalBytes>0?(t.cpuUsableBytes/t.cpuTotalBytes*100).toFixed(0):0;if(n.push(`- **Usable CPU Memory:** ${(t.cpuUsableBytes/1024/1024/1024).toFixed(2)} GB (${e}% of ${(t.cpuTotalBytes/1024/1024/1024).toFixed(2)} GB)`),t.hasGpu){const e=t.devices.filter(e=>"gpu"===e.type);if(e.length>0){const r=e[0];n.push(`- **GPU Backend:** ${r.backend}`),n.push(`- **GPU Name:** ${r.deviceName}`),n.push(`- **GPU Total Memory:** ${(r.maxMemorySize/1024/1024/1024).toFixed(2)} GB`);const o=t.gpuTotalBytes>0?(t.gpuUsableBytes/t.gpuTotalBytes*100).toFixed(0):0;n.push(`- **GPU Usable Memory:** ${(t.gpuUsableBytes/1024/1024/1024).toFixed(2)} GB (${o}% of ${(t.gpuTotalBytes/1024/1024/1024).toFixed(2)} GB)`)}}else n.push("- **GPU:** Not available")}}n.push("\n### Command Used");const h=process.argv.slice(2).join(" ");if(n.push(`\`\`\`bash\n${process.argv[0]} ${process.argv[1]} ${h}\n\`\`\``),n.push("\n### Package Information"),n.push(`- **Name:** ${eo.UU}`),n.push(`- **Version:** ${eo.rE}`),eo.description&&n.push(`- **Description:** ${eo.description}`),t&&Object.keys(t).length>0){n.push("\n### Configuration"),n.push("<details>"),n.push("<summary>Click to expand TOML configuration</summary>"),n.push("\n```toml");try{const e=c.stringify(t);n.push(e)}catch(e){n.push("# Error serializing config"),n.push(JSON.stringify(t,null,2))}n.push("```"),n.push("</details>")}const y=`ggml-stt-model-capabilities-${(new Date).toISOString().replace(/[.:]/g,"-").split("T")[0]}.md`,b=g.join(process.cwd(),y);Zr.writeFileSync(b,n.join("\n"),"utf8"),console.log(`\nSTT model capabilities table saved to: ${b}`),process.exit(0)}catch(e){console.error("Failed to generate STT model table:",e.message),process.exit(1)}}async function ao({modelId:e=null,defaultConfig:t=null}={}){console.log(`${eo.UU} v${eo.rE}`),console.log("Testing capabilities for backend: ggml-stt"),e&&console.log(`Model: ${e}`),console.log("--------------------------------");try{const{repoId:n,filename:r}=to(e),o=t||{},{server:a,generators:i=[],...s}=o,l=(e={},t={})=>{const n=Array.isArray(e)?[...e]:{...e};return Object.entries(t||{}).forEach(([e,t])=>{t&&"object"==typeof t&&!Array.isArray(t)?n[e]=l(n[e]||{},t):n[e]=t}),n},c=e=>l(JSON.parse(JSON.stringify(s)),e||{});let u=(e=>{if(Array.isArray(i)&&i.length>0){const t=i.filter(e=>"ggml-stt"===e?.type);if(t.length>0&&e){const n=t.find(t=>t.model?.repo_id===e);if(n)return c(n)}}return Object.keys(s).length>0?c({}):null})(n);n&&(u={...u||{},model:{...s.runtime,...u?.model||{},repo_id:n,...r&&{filename:r}}});const d=await Qr("ggml-stt",null,{config:u,includeBreakdown:!0}),p=d.buttress?.selected||null,m=d.modelConfig||null;if(n||m?.repoId){console.log("\n=== Model Information ===");const e=n||m?.repoId;console.log(`Repository ID: ${e}`),r&&console.log(`Filename: ${r}`),p?.modelBytes&&console.log(`Model Size: ${(p.modelBytes/1024/1024).toFixed(1)} MB`);const t=p?.processingBytes||p?.kvCacheBytes;if(t&&console.log(`Processing Buffer: ${(t/1024/1024).toFixed(1)} MB`),p?.modelBytes&&t)console.log(`Total Required Memory: ${((p.modelBytes+t)/1024/1024).toFixed(1)} MB`);else if(d.buttress?.selected?.fit){const{totalRequiredBytes:e}=d.buttress.selected.fit;console.log(`Total Required Memory: ${(e/1024/1024).toFixed(1)} MB`)}}if(d.buttress?.selected){const{selected:e}=d.buttress;console.log("\n=== Hardware Information ===");let t=null;if("win32"!==process.platform)try{t=(0,Xr.execSync)("uname -a",{encoding:"utf8"}).trim()}catch{}t?console.log(`System: ${t}`):(console.log(`Hostname: ${Pt.hostname()}`),console.log(`OS: ${Pt.type()} ${Pt.release()}`)),console.log(`Platform: ${e.platform}`),console.log(`CPU Cores: ${Pt.cpus().length}`),console.log(`Total System Memory: ${(Pt.totalmem()/1024/1024/1024).toFixed(2)} GB`);const n=e.cpuTotalBytes>0?(e.cpuUsableBytes/e.cpuTotalBytes*100).toFixed(0):0;if(console.log(`Usable CPU Memory: ${(e.cpuUsableBytes/1024/1024/1024).toFixed(2)} GB (${n}% of ${(e.cpuTotalBytes/1024/1024/1024).toFixed(2)} GB)`),e.hasGpu){console.log("\n--- GPU Details ---");e.devices.filter(e=>"gpu"===e.type).forEach(t=>{console.log(`GPU Backend: ${t.backend}`),console.log(`GPU Name: ${t.deviceName}`),console.log(`GPU Total Memory: ${(t.maxMemorySize/1024/1024/1024).toFixed(2)} GB`);const n=e.gpuTotalBytes>0?(e.gpuUsableBytes/e.gpuTotalBytes*100).toFixed(0):0;console.log(`GPU Usable Memory: ${(e.gpuUsableBytes/1024/1024/1024).toFixed(2)} GB (${n}% of ${(e.gpuTotalBytes/1024/1024/1024).toFixed(2)} GB)`),t.metadata&&(t.metadata.hasBFloat16&&console.log("Supports BFloat16: Yes"),t.metadata.hasUnifiedMemory&&console.log("Unified Memory: Yes"))})}else console.log("GPU: Not available");console.log(`\nBackend Variant: ${e.variant}`),console.log(`Performance Score: ${e.score}`),e.fit&&(console.log("\n--- Model Fit Analysis ---"),console.log("Fits in GPU: "+(e.fit.fitsInGpu?"Yes":"No")),console.log("Fits in CPU: "+(e.fit.fitsInCpu?"Yes":"No")),console.log(`Limiting Factor: ${e.fit.limiting}`))}console.log("\n=== Full Capabilities JSON ==="),console.log(JSON.stringify(d,null,2)),process.exit(0)}catch(e){console.error("Failed to get capabilities:",e.message),process.exit(1)}}const io=new Map,so={downloads:new Map,getDownload(e){return this.downloads.get(e)||null},setDownload(e,t){this.downloads.set(e,t)},deleteDownload(e){this.downloads.delete(e)},isDownloading(e){return this.downloads.has(e)},getActiveDownloads(){return Array.from(this.downloads.entries()).map(([e,t])=>({localPath:e,promise:t}))}},lo=(e,t)=>{const n=(e=>{const t=io.get(e);if(!t)throw new Error(`Unknown generator id "${e}"`);return t})(e);if(n.type!==t)throw new Error(`Generator "${e}" does not support ${t} backend`);return n.instance};async function co(e,t){const n={"ggml-llm":{create:mr,getId:fr},"ggml-stt":{create:Jr,getId:Kr}}[e];if(!n)throw new Error(`Unsupported backend type: ${e}`);const r=n.getId(t);if(!r)throw new Error("Buttress generator config missing repo identifier");const o=`${e}:${r}`,a=io.get(o);if(a)return a.refCount+=1,a.instance.resetFinalized?.(),{id:a.id,info:a.instance.info};const i=await n.create(o,t,{globalDownloadManager:so}),s={id:o,type:i.type,instance:i,refCount:1};return io.set(o,s),{id:o,info:i.info}}async function uo(e){const t=io.get(e);if(!t)return!1;if(t.refCount-=1,t.refCount<=0){await t.instance.finalize();(t.instance.hasPendingReleases?.()??!1)||io.delete(e)}return!0}const po={initContext:async(e,t)=>lo(e,"ggml-llm").initContext(t),completion:async(e,t)=>lo(e,"ggml-llm").completion(t),tokenize:async(e,t)=>lo(e,"ggml-llm").tokenize(t),detokenize:async(e,t)=>lo(e,"ggml-llm").detokenize(t),applyChatTemplate:async(e,t)=>lo(e,"ggml-llm").applyChatTemplate(t),releaseContext:async(e,t)=>lo(e,"ggml-llm").releaseContext(t)},mo={initContext:async(e,t)=>lo(e,"ggml-stt").initContext(t),transcribe:async(e,t)=>lo(e,"ggml-stt").transcribe(t),transcribeData:async(e,t)=>lo(e,"ggml-stt").transcribeData(t),releaseContext:async(e,t)=>lo(e,"ggml-stt").releaseContext(t)};function fo(e,t){return"ggml-llm"===e?fr(t):"ggml-stt"===e?Kr(t):null}const ho={getFullStatus:()=>function(e){return{timestamp:(new Date).toISOString(),ggmlLlm:Sn(e),ggmlStt:kn(e)}}(io),getGgmlLlmStatus:()=>Sn(io),getGgmlSttStatus:()=>kn(io),subscribeToStatus:xn,subscribeToStatusWithId:function(e){return _n+=1,{subscriberId:_n,unsubscribe:xn(e)}},llmStatusTracker:wn,sttStatusTracker:vn,statusEmitter:yn};async function yo(e,t,n={}){const r={"ggml-llm":hr,"ggml-stt":Yr}[e];return r?r(t,so,n):{started:!1,localPath:null,repoId:null,error:`Unknown backend type: ${e}`}}const{version:go,name:bo}={version:"2.23.0-beta.36",name:"@fugood/buttress-server-poc"},wo=async()=>{const e=`https://registry.npmjs.org/${bo}/latest`;try{const t=new AbortController,n=setTimeout(()=>t.abort(),3e3),r=await fetch(e,{headers:{Accept:"application/json"},signal:t.signal});if(clearTimeout(n),!r.ok)return null;return(await r.json()).version||null}catch{return null}},vo=(e,t)=>{if(!t)return!1;const n=e.split(/[.-]/),r=t.split(/[.-]/);for(let e=0;e<Math.max(n.length,r.length);e+=1){const t=parseInt(n[e])||0,o=parseInt(r[e])||0;if(o>t)return!0;if(o<t)return!1}return!1},_o=async()=>{try{const e=await wo();e&&vo(go,e)&&(e=>{console.log(""),console.log("[33mâ•─────────────────────────────────────────────────╮[0m"),console.log("[33m│[0m Update available! [2m%s[0m → [32m%s[0m",go.padEnd(12),e.padEnd(12),"[33m│[0m"),console.log("[33m│[0m [33m│[0m"),console.log("[33m│[0m Run to upgrade: [33m│[0m"),console.log("[33m│[0m [36mnpm install -g %s[0m [33m│[0m",bo.padEnd(27)),console.log("[33m╰─────────────────────────────────────────────────╯[0m"),console.log("")})(e)}catch(e){}},xo=n.create(),So=e=>{const{status:t}=e;return xo.router({getStatus:xo.procedure.query(()=>(console.log("[Status] Get full status"),t.getFullStatus())),getLlmStatus:xo.procedure.query(()=>(console.log("[Status] Get LLM status"),t.getGgmlLlmStatus())),getSttStatus:xo.procedure.query(()=>(console.log("[Status] Get STT status"),t.getGgmlSttStatus())),subscribe:xo.procedure.subscription(()=>te(n=>{console.log("[Status] Client subscribed to status changes");const{generatorRegistry:r}=e,o=[],a=(e,r)=>{if("ggml-llm"===r.type&&r.instance?.subscribeParallelStatus){const a=r.instance.subscribeParallelStatus(r=>{n.next({type:"parallelStatus",generatorId:e,data:r,fullStatus:t.getFullStatus()})});o.push({id:e,sub:a})}};Array.from(r.entries()).forEach(([e,t])=>{a(e,t)}),n.next({type:"initial",data:t.getFullStatus()});const i=t.subscribeToStatus(e=>{if("modelLoad"===e.type&&e.entry?.generatorId){const t=r.get(e.entry.generatorId);t&&a(e.entry.generatorId,t)}n.next({type:"change",data:e,fullStatus:t.getFullStatus()})});return()=>{console.log("[Status] Client unsubscribed from status changes"),o.forEach(({sub:e})=>e?.remove?.()),i()}}))})},ko=new TextDecoder,Co=(e,t)=>{if(!t||"*"===t)return"*";const n=e?.headers?.origin||"";return(Array.isArray(t)?t:[t]).includes(n)?n:""},Mo=(e,t,n,r,o)=>{const a=Co(e,o),i={"Content-Type":"application/json"};a&&(i["Access-Control-Allow-Origin"]=a),t.writeHead(n,i),t.end(JSON.stringify(r))},To=(e,t)=>{e.write(`data: ${JSON.stringify(t)}\n\n`)},Eo=(e,t)=>{const n=e.split("\n\n"),r=n.pop()||"";return n.forEach(e=>{if(!e.trim())return;const n=e.match(/^event:\s*(.+)$/m),r=e.match(/^data:\s*(.+)$/m);if(!n||!r)return;const o=n[1];let a;try{a=JSON.parse(r[1])}catch{return}t(o,a)}),r},$o=({backend:e,defaultConfig:t})=>{const n=t?.openai_compat?.cors_allowed_origins,r=new Map,o=async(e,t)=>{const n=e.getReader();let r="";try{let e=!1;for(;!e;){const{value:o,done:a}=await n.read();if(e=a,e)break;r+=ko.decode(o,{stream:!0}),r=Eo(r,(e,n)=>{"token"===e&&t.onToken?t.onToken(n):"result"===e&&t.onResult?t.onResult(n):"error"===e&&t.onError&&t.onError(n)})}}finally{n.cancel().catch(()=>{})}},a=async(a,i)=>{let s;try{s=await(e=>new Promise((t,n)=>{let r="";e.on("data",e=>{r+=e.toString()}),e.on("end",()=>{try{t(r?JSON.parse(r):{})}catch(e){n(new Error("Invalid JSON body"))}}),e.on("error",n)}))(a)}catch(e){return void Mo(a,i,400,{error:{message:e.message,type:"invalid_request_error"}},n)}const{messages:l=[],stream:c=!1,model:u,tools:d,temperature:p,stop:m}=s,f=s.top_p,h=s.max_tokens,y=s.presence_penalty,g=s.frequency_penalty,b=s.tool_choice,w=s.stream_options;if(l&&0!==l.length)try{const s=await(async n=>{const o=(t?.generators||[]).filter(e=>"ggml-llm"===e.type);if(0===o.length)throw new Error('No ggml-llm generator configured. Add a [[generators]] with type = "ggml-llm" to your config.');let a=o[0],i=n||a.model?.repo_id;if(n){const e=o.find(e=>e.model?.repo_id===n);e&&(a=e)}else i=a.model?.repo_id;const s=i,l=r.get(s);if(l?.initialized)return l;const{generators:c,server:u,...d}=t||{},p={...d,...a,model:{...a.model,repo_id:i}};console.log(`[OpenAI] Creating generator for ${s}`);const{id:m}=await e.startGenerator("ggml-llm",p),f={id:m,config:p,repoId:i,initialized:!1};return r.set(s,f),await e.ggmlLlm.initContext(m,{}),f.initialized=!0,console.log(`[OpenAI] Generator ready: ${s}`),f})(u),v=`chatcmpl-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,_=Math.floor(Date.now()/1e3),x=s.repoId||"ggml-llm",S={reasoning_format:"auto",messages:l,jinja:!0,add_generation_prompt:!0};null!=p&&(S.temperature=p),null!=f&&(S.top_p=f),null!=h&&(S.n_predict=h),null!=m&&(S.stop=Array.isArray(m)?m:[m]),null!=y&&(S.presence_penalty=y),null!=g&&(S.frequency_penalty=g),null!=d&&(S.tools=d),null!=b&&(S.tool_choice=b);const k=await e.ggmlLlm.completion(s.id,{options:S});if(c){const e=Co(a,n),t={"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"};e&&(t["Access-Control-Allow-Origin"]=e),i.writeHead(200,t);const r=!0===w?.include_usage;let s="",l="";const c=new Map,u=new Map;await o(k,{onToken:e=>{const t={};if(null!=e.content){const n=e.content;n.length>s.length&&(t.content=n.slice(s.length),s=n)}if(null!=e.reasoning_content){const n=e.reasoning_content;n.length>l.length&&(t.reasoning_content=n.slice(l.length),l=n)}if(null!=e.tool_calls&&e.tool_calls.length>0){const n=[];e.tool_calls.forEach((e,t)=>{const r={index:t};u.has(t)||(u.set(t,e.id||`call_${v}_${t}`),r.id=u.get(t),r.type="function");const o=e.function?.arguments||"",a=c.get(t)||"",i={};!c.has(t)&&e.function?.name&&(i.name=e.function.name),o.length>a.length&&(i.arguments=o.slice(a.length),c.set(t,o)),Object.keys(i).length>0?(r.function=i,n.push(r)):r.id&&(r.function={name:e.function?.name||"",arguments:""},n.push(r))}),n.length>0&&(t.tool_calls=n)}Object.keys(t).length>0&&To(i,{id:v,object:"chat.completion.chunk",created:_,model:x,choices:[{index:0,delta:t,finish_reason:null}]})},onResult:e=>{const t={id:v,object:"chat.completion.chunk",created:_,model:x,choices:[{index:0,delta:{},finish_reason:e.interrupted?"length":"stop"}]};r&&(t.usage={prompt_tokens:e.prompt_tokens||e.promptTokens||0,completion_tokens:e.tokens_predicted||e.tokensPredicted||0,total_tokens:(e.prompt_tokens||e.promptTokens||0)+(e.tokens_predicted||e.tokensPredicted||0)}),To(i,t)},onError:e=>{To(i,{error:{message:e.message,type:"server_error"}})}}),i.write("data: [DONE]\n\n"),i.end()}else{let e="",t=null,r=null,s="stop",l={prompt_tokens:0,completion_tokens:0,total_tokens:0};await o(k,{onToken:t=>{null!=t.content?e+=t.content:null!=t.token&&(e+=t.token)},onResult:n=>{n.text?e=n.text:n.content&&(e=n.content),n.reasoning_content&&(t=n.reasoning_content),n.tool_calls&&n.tool_calls.length>0?(r=n.tool_calls.map((e,t)=>({id:e.id||`call_${v}_${t}`,type:"function",function:{name:e.function?.name||"",arguments:e.function?.arguments||""}})),s="tool_calls"):s=n.interrupted?"length":"stop",l={prompt_tokens:n.prompt_tokens||n.promptTokens||0,completion_tokens:n.tokens_predicted||n.tokensPredicted||0,total_tokens:(n.prompt_tokens||n.promptTokens||0)+(n.tokens_predicted||n.tokensPredicted||0)}},onError:e=>{throw new Error(e.message)}});const c={role:"assistant",content:e||null};t&&(c.reasoning_content=t),r&&(c.tool_calls=r),Mo(a,i,200,{id:v,object:"chat.completion",created:_,model:x,choices:[{index:0,message:c,finish_reason:s}],usage:l},n)}}catch(e){console.error("[OpenAI] Chat completion error:",e),Mo(a,i,500,{error:{message:e.message||"Internal server error",type:"server_error"}},n)}else Mo(a,i,400,{error:{message:"messages is required and must not be empty",type:"invalid_request_error"}},n)};return async(e,r,o)=>{if("OPTIONS"===e.method){const t=Co(e,n),o={"Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"86400"};return t&&(o["Access-Control-Allow-Origin"]=t),r.writeHead(204,o),r.end(),!0}const{pathname:i}=o;return"/oai-compat/v1/models"===i&&"GET"===e.method?(await(async(e,r)=>{const o=(t?.generators||[]).filter(e=>"ggml-llm"===e.type).map(e=>({id:e.model?.repo_id||"ggml-llm",object:"model",created:Math.floor(Date.now()/1e3),owned_by:"local"}));0===o.length&&o.push({id:"ggml-llm",object:"model",created:Math.floor(Date.now()/1e3),owned_by:"local"}),Mo(e,r,200,{object:"list",data:o},n)})(e,r),!0):"/oai-compat/v1/chat/completions"===i&&"POST"===e.method&&(await a(e,r),!0)}},Bo=g.dirname((0,b.fileURLToPath)(import.meta.url)),Io=new TextDecoder,Oo=n.context().create({sse:{ping:{enabled:!0,intervalMs:3e4},maxDurationMs:18e5,client:{reconnectAfterInactivityMs:3e5}}}),No=r.record(r.any()).optional(),Po=r.object({id:r.string()}),qo=r.object({id:r.string(),property:r.any().optional()}),zo=new Map,Do=r.object({type:r.string(),config:No}),Ao=r.object({type:r.string().optional().default("ggml-llm"),config:No,currentClientCapabilities:r.record(r.any()).optional(),options:r.record(r.any()).optional()}).optional(),Ro=(e={},t={})=>{const n=Array.isArray(e)?[...e]:{...e};return Object.entries(t||{}).forEach(([e,t])=>{t&&"object"==typeof t&&!Array.isArray(t)?n[e]=Ro(n[e]||{},t):n[e]=t}),n},Fo=e=>e&&"object"==typeof e?JSON.parse(JSON.stringify(e)):null,jo=(e,t)=>{const n=Fo(e)||{},r=Fo(t)||{};return Ro(n,r)},Uo=(e=h,{defaultConfig:t}={})=>{const n=Fo(t)||{},o=Array.isArray(n.generators)?n.generators:[],{server:a,generators:i,...s}=n,l=e=>Ro(JSON.parse(JSON.stringify(s)),e||{}),c=(t,n)=>{if(o.length>0){const r=o.filter(e=>e?.type===t);if(r.length>0&&n){const o=r.find(r=>e.getModelIdentifier(t,r)===n);if(o)return l(o)}}return Object.keys(s).length>0?l({}):null};return Oo.router({getCapabilities:Oo.procedure.input(Ao).query(async({input:t})=>{console.log("[Server] Get Capabilities:",t);const n=t||{type:"ggml-llm"},{type:r="ggml-llm",config:o,currentClientCapabilities:a=null,options:i={}}=n,s=Fo(o),l=e.getModelIdentifier(r,s),u=c(r,l),d=jo(u,o);if(0===Object.keys(d).length)throw new Error("Buttress server missing generator configuration");return d.backend=d.backend||{},d.backend.type||(d.backend.type=r),e.getCapabilities(r,a,{...i,config:d})}),startGenerator:Oo.procedure.input(Do).mutation(async({input:t})=>{console.log("[Server] Start Generator:",t);const{type:n,config:r}=t,o=Fo(r),a=e.getModelIdentifier(n,o),i=c(n,a),s=jo(i,r);if(0===Object.keys(s).length)throw new Error("Buttress server missing generator configuration");return s.backend=s.backend||{},s.backend.type||(s.backend.type=n),e.startGenerator(n,s)}),finalizeGenerator:Oo.procedure.input(Po).mutation(async({input:t})=>(console.log("[Server] Finalize Generator:",t),e.finalizeGenerator(t.id))),ggmlLlm:Oo.router({initContext:Oo.procedure.input(qo).subscription(({input:t})=>te(n=>{console.log("[Server] Init Context:",t);let r=!0;return(async()=>{try{const o={...t.property,onProgress:e=>{r&&n.next({progress:e})}};await new Promise(e=>setTimeout(e));const a=await e.ggmlLlm.initContext(t.id,o);if(r){const{download:e,...t}=a||{};n.next({result:t}),n.complete()}}catch(e){r&&n.error(e)}})(),()=>{r=!1}})),createCompletion:Oo.procedure.input(qo).mutation(async({input:t})=>{console.log("[Server] createCompletion:",t);const n=`completion-${Date.now()}-${Math.random().toString(36).slice(2,9)}`;try{const r=await e.ggmlLlm.completion(t.id,t.property);if(!r)throw new Error("Failed to create completion stream");return zo.set(n,{stream:r,cancel:null,generatorId:t.id}),{completionId:n}}catch(e){throw console.error("[Server] createCompletion error:",e),e}}),completion:Oo.procedure.input(qo).subscription(({input:e})=>te(t=>{const n=e.property;console.log("[Server] completion subscription:",n);const r=zo.get(n);if(!r)return t.error(new Error(`Unknown completion ID: ${n}`)),()=>{};const{stream:o}=r,a=((e,t)=>{const n=e.getReader();let r=!0;return(async()=>{try{for(;r;){const{value:e,done:o}=await n.read();if(o||!r)break;if(e){const n=Io.decode(e,{stream:!0});t.next(n)}}t.complete()}catch(e){t.error(e)}finally{n.cancel().catch(()=>{})}})(),()=>{r=!1,n.cancel().catch(()=>{})}})(o,t);return r.cancel=a,()=>{console.log("[Server] completion subscription closed:",n),a(),zo.delete(n)}})),cancelCompletion:Oo.procedure.input(qo).mutation(async({input:e})=>{const t=e.property;console.log("[Server] cancelCompletion:",t);const n=zo.get(t);return n?(n.cancel&&n.cancel(),zo.delete(t),{success:!0}):{success:!1,error:"Unknown completion ID"}}),tokenize:Oo.procedure.input(qo).mutation(async({input:t})=>(console.log("[Server] Tokenize:",t),e.ggmlLlm.tokenize(t.id,t.property))),detokenize:Oo.procedure.input(qo).mutation(async({input:t})=>(console.log("[Server] Detokenize:",t),e.ggmlLlm.detokenize(t.id,t.property))),applyChatTemplate:Oo.procedure.input(qo).mutation(async({input:t})=>(console.log("[Server] Apply Chat Template:",t),e.ggmlLlm.applyChatTemplate(t.id,t.property))),releaseContext:Oo.procedure.input(qo).mutation(async({input:t})=>(console.log("[Server] Release Context:",t),e.ggmlLlm.releaseContext(t.id,t.property)))}),ggmlStt:Oo.router({initContext:Oo.procedure.input(qo).subscription(({input:t})=>te(n=>{console.log("[Server] Init STT Context:",t);let r=!0;return(async()=>{try{const o={...t.property,onProgress:e=>{r&&n.next({progress:e})}};await new Promise(e=>setTimeout(e));const a=await e.ggmlStt.initContext(t.id,o);if(r){const{download:e,...t}=a||{};n.next({result:t}),n.complete()}}catch(e){r&&n.error(e)}})(),()=>{r=!1}})),transcribeData:Oo.procedure.input(r.instanceof(FormData)).mutation(async({input:t})=>{const n=t,r=n.get("id"),o=n.get("options"),a=n.get("audioData"),i=o?JSON.parse(o):{};let s;if(a instanceof Blob||a&&"function"==typeof a.arrayBuffer){const e=await a.arrayBuffer();s=Buffer.from(e)}else s=Buffer.isBuffer(a)?a:a instanceof ArrayBuffer?Buffer.from(a):a;return console.log("[Server] Transcribe Data:",{id:r,audioDataLength:s?.length||0,options:i}),e.ggmlStt.transcribeData(r,{audioData:s,options:i})}),releaseContext:Oo.procedure.input(qo).mutation(async({input:t})=>(console.log("[Server] Release STT Context:",t),e.ggmlStt.releaseContext(t.id,t.property)))}),status:So(e)})},Lo=({backend:e=h,router:t,createContext:n=()=>({}),defaultConfig:r,maxBodySize:o=104857600,enableOpenAICompat:a="1"===process.env.ENABLE_OPENAI_COMPAT_ENDPOINT}={})=>{const i=t||Uo(e,{defaultConfig:r}),s=a?$o({backend:e,defaultConfig:r}):null;return{server:Nt({router:i,createContext:n,basePath:"/trpc/",maxBodySize:o,middleware:async(e,t,n)=>{const r=e.headers["content-length"],o=e.headers["content-type"];console.log(`[Request] ${e.method} ${e.url} content-length=${r} content-type=${o}`);const a=new URL(e.url,`http://${e.headers.host}`);if("/status"!==a.pathname&&"/status/"!==a.pathname){if(s&&a.pathname.startsWith("/oai-compat/"))try{if(await s(e,t,a))return}catch(e){return console.error("[OpenAI] Handler error:",e),t.writeHead(500,{"Content-Type":"application/json"}),void t.end(JSON.stringify({error:{message:e.message,type:"server_error"}}))}n()}else(async e=>{try{const t=g.join(Bo,"..","public","status.html"),n=await(0,y.readFile)(t,"utf-8");return e.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),e.end(n),!0}catch(t){return e.writeHead(404,{"Content-Type":"text/plain"}),e.end("Status page not found"),!0}})(t)}}),router:i,backend:e,openaiEnabled:a}},Go=async({port:e=2080,backend:t,router:n,createContext:r,defaultConfig:o,maxBodySize:a,enableOpenAICompat:i}={})=>{const{server:s,router:l,backend:c,openaiEnabled:u}=Lo({backend:t,router:n,createContext:r,defaultConfig:o,maxBodySize:a,enableOpenAICompat:i});return s.server&&(void 0!==s.server.headersTimeout&&(s.server.headersTimeout=0),void 0!==s.server.requestTimeout&&(s.server.requestTimeout=0),void 0!==s.server.timeout&&(s.server.timeout=0)),await new Promise(t=>s.listen(e,t)),console.log(`[Server] Status page available at http://localhost:${e}/status`),{server:s,router:l,port:e,backend:c,openaiEnabled:u}},{testGgmlLlmCapabilities:Ho,testGgmlSttCapabilities:Jo,showModelsTable:Vo,showSttModelsTable:Ko,startModelDownload:Yo,globalDownloadManager:Wo}=h;export{_o as checkAndNotifyUpdates,wo as checkForUpdates,vo as compareVersions,Uo as createRouter,Lo as createServer,go as currentVersion,Wo as globalDownloadManager,Vo as showModelsTable,Ko as showSttModelsTable,Yo as startModelDownload,Go as startServer,Ho as testGgmlLlmCapabilities,Jo as testGgmlSttCapabilities};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fugood/buttress-server-poc",
|
|
3
|
-
"version": "2.23.0-beta.
|
|
3
|
+
"version": "2.23.0-beta.36",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"files": [
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"scripts": {
|
|
16
16
|
"build": "webpack --config webpack.config.js",
|
|
17
17
|
"prepack": "bun run build",
|
|
18
|
-
"start": "
|
|
18
|
+
"start": "bun bin/start.mjs"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"@fugood/llama.node": "^1.4.10",
|
|
@@ -29,5 +29,5 @@
|
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"terser-webpack-plugin": "^5.0.3"
|
|
31
31
|
},
|
|
32
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "49dddd0ee4868267cf168de0e7fbecdada6eb1b4"
|
|
33
33
|
}
|