@fugood/buttress-server-poc 2.23.0-beta.31 → 2.23.0-beta.32
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/bin/start.mjs +1 -1
- package/config/sample-iq9-cpu.toml +9 -1
- package/config/sample.toml +12 -0
- package/lib/index.js +1 -1
- package/package.json +3 -2
package/bin/start.mjs
CHANGED
|
@@ -116,7 +116,7 @@ const DEFAULT_TEST_GGML_LLM_MODELS = [
|
|
|
116
116
|
'ggml-org/gpt-oss-20b-GGUF',
|
|
117
117
|
'ggml-org/gpt-oss-120b-GGUF',
|
|
118
118
|
'unsloth/Nemotron-3-Nano-30B-A3B-GGUF',
|
|
119
|
-
'unsloth/Qwen3-
|
|
119
|
+
'unsloth/Qwen3-30B-A3B-Instruct-2507-GGUF',
|
|
120
120
|
'bartowski/Mistral-Nemo-Instruct-2407-GGUF',
|
|
121
121
|
'mistralai/Magistral-Small-2509-GGUF',
|
|
122
122
|
'mistralai/Ministral-3-14B-Reasoning-2512-GGUF',
|
|
@@ -18,6 +18,10 @@ cache_dir = "./.buttress-cache"
|
|
|
18
18
|
flash_attn_type = "on"
|
|
19
19
|
cache_type_k = "q8_0"
|
|
20
20
|
cache_type_v = "q8_0"
|
|
21
|
+
cpu_mask = "0xfc"
|
|
22
|
+
cpu_strict = true
|
|
23
|
+
n_threads = 6
|
|
24
|
+
devices = ["CPU"]
|
|
21
25
|
|
|
22
26
|
# Session state cache for ggml-llm (saves KV cache to disk for prompt reuse)
|
|
23
27
|
[runtime.session_cache]
|
|
@@ -28,6 +32,7 @@ max_entries = 1000
|
|
|
28
32
|
[[generators]]
|
|
29
33
|
type = "ggml-llm"
|
|
30
34
|
[generators.backend]
|
|
35
|
+
variant = "default"
|
|
31
36
|
variant_preference = ["default"]
|
|
32
37
|
gpu_memory_fraction = 0.8
|
|
33
38
|
cpu_memory_fraction = 0.8
|
|
@@ -39,17 +44,19 @@ n_ctx = 51200
|
|
|
39
44
|
[[generators]]
|
|
40
45
|
type = "ggml-llm"
|
|
41
46
|
[generators.backend]
|
|
47
|
+
variant = "default"
|
|
42
48
|
variant_preference = ["default"]
|
|
43
49
|
gpu_memory_fraction = 0.8
|
|
44
50
|
cpu_memory_fraction = 0.8
|
|
45
51
|
[generators.model]
|
|
46
|
-
repo_id = "unsloth/Qwen3-
|
|
52
|
+
repo_id = "unsloth/Qwen3-30B-A3B-Instruct-2507-GGUF"
|
|
47
53
|
quantization = "q4_0"
|
|
48
54
|
n_ctx = 51200
|
|
49
55
|
|
|
50
56
|
[[generators]]
|
|
51
57
|
type = "ggml-llm"
|
|
52
58
|
[generators.backend]
|
|
59
|
+
variant = "default"
|
|
53
60
|
variant_preference = ["default"]
|
|
54
61
|
gpu_memory_fraction = 0.8
|
|
55
62
|
cpu_memory_fraction = 0.8
|
|
@@ -62,6 +69,7 @@ n_ctx = 51200
|
|
|
62
69
|
[[generators]]
|
|
63
70
|
type = "ggml-stt"
|
|
64
71
|
[generators.backend]
|
|
72
|
+
variant = "default"
|
|
65
73
|
variant_preference = ["default"]
|
|
66
74
|
[generators.model]
|
|
67
75
|
repo_id = "BricksDisplay/whisper-ggml"
|
package/config/sample.toml
CHANGED
|
@@ -45,6 +45,18 @@ gpu_memory_fraction = 0.95
|
|
|
45
45
|
repo_id = "ggml-org/gpt-oss-120b-GGUF"
|
|
46
46
|
quantization = "mxfp4"
|
|
47
47
|
|
|
48
|
+
[[generators]]
|
|
49
|
+
type = "ggml-llm"
|
|
50
|
+
[generators.backend]
|
|
51
|
+
variant = "default"
|
|
52
|
+
variant_preference = ["cuda", "vulkan", "snapdragon", "default"]
|
|
53
|
+
gpu_memory_fraction = 0.8
|
|
54
|
+
cpu_memory_fraction = 0.8
|
|
55
|
+
[generators.model]
|
|
56
|
+
repo_id = "unsloth/Qwen3-30B-A3B-Instruct-2507-GGUF"
|
|
57
|
+
quantization = "q4_0"
|
|
58
|
+
n_ctx = 51200
|
|
59
|
+
|
|
48
60
|
[[generators]]
|
|
49
61
|
type = "ggml-llm"
|
|
50
62
|
[generators.backend]
|
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 r}from"zod";import{gguf as o}from"@huggingface/gguf";import{getBackendDevicesInfo as a,isLibVariantAvailable as s,loadModel as i}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 s(e);if("number"==typeof e)return a(e,t);return null},e.exports.format=a,e.exports.parse=s;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),s=o&&o.thousandsSeparator||"",i=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")),s&&(d=d.split(".").map(function(e,n){return 0===n?e.replace(t,s):e}).join(".")),d+i+u}function s(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:()=>to,generatorRegistry:()=>Zr,getCapabilities:()=>Lr,getModelIdentifier:()=>oo,ggmlLlm:()=>no,ggmlStt:()=>ro,showModelsTable:()=>Kr,showSttModelsTable:()=>Wr,startGenerator:()=>eo,status:()=>ao,testGgmlLlmCapabilities:()=>Yr,testGgmlSttCapabilities:()=>Qr});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 E=Object.create,M=Object.defineProperty,B=Object.getOwnPropertyDescriptor,T=Object.getOwnPropertyNames,$=Object.getPrototypeOf,O=Object.prototype.hasOwnProperty,N=(e,t)=>function(){return t||(0,e[T(e)[0]])((t={exports:{}}).exports,t),t.exports},I=(e,t,n)=>(n=null!=e?E($(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(var o,a=T(t),s=0,i=a.length;s<i;s++)o=a[s],O.call(e,o)||o===n||M(e,o,{get:(e=>t[e]).bind(null,o),enumerable:!(r=B(t,o))||r.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 A(e){var t;return null!==(t=P[e])&&void 0!==t?t:500}function q(e){return A(e.code)}var z=N({"../../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}}),F=N({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPrimitive.js"(e,t){var n=z().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}}),U=N({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPropertyKey.js"(e,t){var n=z().default,r=F();t.exports=function(e){var t=r(e,"string");return"symbol"==n(t)?t:t+""},t.exports.__esModule=!0,t.exports.default=t.exports}}),j=N({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js"(e,t){var n=U();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}}),D=N({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/objectSpread2.js"(e,t){var n=j();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}}),R=I(D(),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:q(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,R.default)((0,R.default)({},e),{},{shape:a}))}var G=I(j(),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=I(D(),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;I(D(),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 s(){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),s())},complete(){var e;r||(r=!0,null===(e=t.complete)||void 0===e||e.call(t),s())}}),a&&s(),{unsubscribe:s}},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=I(D(),1);function se(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 ie={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=se(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}),s=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,s;const n=null!==(o=null!==(s=e.headers.get("last-event-id"))&&void 0!==s?s: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 i;null!==(i=t)&&void 0!==i||(t={lastEventId:n})}}return t},result:()=>{var e;return null===(e=a.result())||void 0===e?void 0:e[n]}}})),i=new Set(s.map(e=>{var t;return null===(t=e.procedure)||void 0===t?void 0:t._def.type}).filter(Boolean));if(i.size>1)throw new V({code:"BAD_REQUEST",message:`Cannot mix procedure types in call: ${Array.from(i).join(", ")}`});const l=null!==(t=i.values().next().value)&&void 0!==t?t:"unknown",c=e.searchParams.get("connectionParams");return{isBatchCall:r,accept:n.headers.get("trpc-accept"),calls:s,type:l,connectionParams:null===c?null:oe(c),signal:n.signal,url:e.url}}},le=[ie,{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=se(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=se(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 ie;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=I(j(),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 Ee(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 Me=N({"../../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 s(){for(;r=n.pop();)try{if(!r.a&&1===a)return a=0,n.push(r),Promise.resolve().then(s);if(r.d){var e=r.d.call(r.v);if(r.a)return a|=2,Promise.resolve(e).then(s,i)}else a|=1}catch(e){return i(e)}if(1===a)return o!==t?Promise.reject(o):Promise.resolve();if(o!==t)throw o}function i(n){return o=o!==t?new e(n,o):n,s()}return s()}}},t.exports.__esModule=!0,t.exports.default=t.exports}}),Be=N({"../../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}}),Te=N({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/awaitAsyncGenerator.js"(e,t){var n=Be();t.exports=function(e){return new n(e,0)},t.exports.__esModule=!0,t.exports.default=t.exports}}),$e=N({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/wrapAsyncGenerator.js"(e,t){var n=Be();function r(e){var t,r;function o(t,r){try{var s=e[t](r),i=s.value,l=i instanceof n;Promise.resolve(l?i.v:i).then(function(n){if(l){var r="return"===t?"return":"next";if(!i.k||n.done)return o(r,n);n=e[r](n).value}a(s.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,s){var i={key:e,arg:n,resolve:a,reject:s,next:null};r?r=r.next=i:(t=r=i,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}}),Oe=I(Me(),1),Ne=I(Te(),1),Ie=I($e(),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 Ae(){return(Ae=(0,Ie.default)(function*(e,t){try{var n=(0,Oe.default)();const r=n.a(Pe(e)),o=n.u(Ee(t.maxDurationMs)).start();let a;for(;;){if(a=yield(0,Ne.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,Ne.default)(n.d())}})).apply(this,arguments)}function qe(){return(qe=(0,Ie.default)(function*(e,t){try{var n=(0,Oe.default)();const r=n.a(Pe(e));let o;const a=n.u(Ee(t.gracePeriodMs));let s=t.count,i=new Promise(()=>{});for(;;){if(o=yield(0,Ne.default)(_e.race([r.next(),i])),o===Ce&&de(),o.done)return o.value;yield o.value,0===--s&&(i=a.start()),o=null}}catch(e){n.e=e}finally{yield(0,Ne.default)(n.d())}})).apply(this,arguments)}function ze(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}}var Fe=I(Me(),1),Ue=I(Te(),1),je=I($e(),1);function De(){let e="idle",t=ze();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,je.default)(function*(){try{var s=(0,Fe.default)();if("idle"!==e)throw new Error("Cannot iterate twice");e="pending";s.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,Ue.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=ze()}}catch(e){s.e=e}finally{yield(0,Ue.default)(s.d())}})()}}function Re(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=I(Me(),1),Ge=I(Te(),1),He=I($e(),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,s=o.next();for(;;)try{var r=(0,Le.default)();const e=r.u(Ee(t));if(a=yield(0,Ge.default)(_e.race([s,e.start()])),a===Ce){yield Je;continue}if(a.done)return a.value;s=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=N({"../../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=I(Te(),1),Qe=I($e(),1),Ze=I(Me(),1),Xe=I(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=De();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=i(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,s;null===(a=e.onError)||void 0===a||a.call(e,{error:t,path:n}),yield[r,1,null===(s=e.formatError)||void 0===s?void 0:s.call(e,{error:t,path:n})]}});return function(e){return r.apply(this,arguments)}}())}function s(t,n){return o(function(){var r=(0,Qe.default)(function*(r){try{var o=(0,Ze.default)();const l=i(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,s;null===(a=e.onError)||void 0===a||a.call(e,{error:t,path:n}),yield[r,2,null===(s=e.formatError)||void 0===s?void 0:s.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 i(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,s(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 s={},i=[];for(const[n,r]of Object.entries(e)){const e=l(r,[...t,n]);e?(s[n]=0,i.push([n,...e])):s[n]=r}return[[s],...i]}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=Re(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=N({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/asyncGeneratorDelegate.js"(e,t){var n=Be();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=I(Ye(),1),st=I(Te(),1),it=I($e(),1),lt=I(ot(),1);I(Me(),1);const ct="ping",ut="serialized-error",dt="connected",pt="return";function mt(e){var t,n,r,o,a;const{serialize:s=C}=e,i={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(i.enabled&&l.reconnectAfterInactivityMs&&i.intervalMs>l.reconnectAfterInactivityMs)throw new Error(`Ping interval must be less than client reconnect interval to prevent unnecessary reconnection - ping.intervalMs: ${i.intervalMs} client.reconnectAfterInactivityMs: ${l.reconnectAfterInactivityMs}`);function c(){return c=(0,it.default)(function*(){yield{event:dt,data:JSON.stringify(l)};let t,n,r=e.data;e.emitAndEndImmediately&&(r=function(e,t){return qe.apply(this,arguments)}(r,{count:1,gracePeriodMs:1})),e.maxDurationMs&&e.maxDurationMs>0&&e.maxDurationMs!==1/0&&(r=function(e,t){return Ae.apply(this,arguments)}(r,{maxDurationMs:e.maxDurationMs})),i.enabled&&i.intervalMs!==1/0&&i.intervalMs>0&&(r=Ve(r,i.intervalMs));var o,a=!1,c=!1;try{for(var u,d=(0,at.default)(r);a=!(u=yield(0,st.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(s(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,st.default)(d.return()))}finally{if(c)throw o}}}),c.apply(this,arguments)}function u(){return u=(0,it.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(s(a))}}}),u.apply(this,arguments)}const d=Re(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=I($e(),1),yt=I(D(),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:s,untransformedJSON:i,errors:l=[],headers:c}=e;let u=i?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:A(v[e.error.code]):200}));return 1!==n.size?207:n.values().next().value}(i):200;const d=!i,p=d?[]:Array.isArray(i)?i:[i],m=null!==(t=null==s?void 0:s({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,s;const{router:i,req:l}=e,c=new Headers([["vary","trpc-accept"]]),u=i._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:i,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===(s=u.sse)||void 0===s?void 0:s.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,s;const r=J(n),i=t.result();return null===(o=e.onError)||void 0===o||o.call(e,{error:r,path:t.path,input:i,ctx:h.valueOrUndefined(),type:null!==(a=null===(s=t.procedure)||void 0===s?void 0:s._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}},s=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:s.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}),s=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 s=J(n.error),i=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:s,path:l,input:i,ctx:h.valueOrUndefined(),req:e.req,type:c});return L({config:u,ctx:h.valueOrUndefined(),error:s,input:i,path:l,type:c})}}));for(const[e,t]of Object.entries(ft))c.set(e,t);const i=vt({ctx:h.valueOrUndefined(),info:n,responseMeta:e.responseMeta,errors:[],headers:c,untransformedJSON:null});return new Response(s,{headers:c,status:i.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 s,i;if(r)return{error:L({config:u,ctx:h.valueOrUndefined(),error:r,input:a.result(),path:a.path,type:null!==(s=null===(i=a.procedure)||void 0===i?void 0:i._def.type)&&void 0!==s?s:"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),s=null==o?void 0:o.result(),i=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:s,path:i,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,s;return e?{error:L({config:u,ctx:h.valueOrUndefined(),error:e,input:o.result(),path:o.path,type:null!==(a=null===(s=o.procedure)||void 0===s?void 0:s._def.type)&&void 0!==a?a:"unknown"})}:{result:{data:t.data}}}),s=o.map(([e])=>e).filter(Boolean),i=vt({ctx:h.valueOrUndefined(),info:n,responseMeta:e.responseMeta,untransformedJSON:a,errors:s,headers:c});return new Response(JSON.stringify(W(u,a)),{status:i.status,headers:c})}catch(t){var w;const[n,r]=f,o=h.valueOrUndefined(),{error:a,untransformedJSON:s,body:i}=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 s={error:L({config:n._def._config,error:a,type:t.type,path:t.path,input:t.input,ctx:t.ctx})},i=W(n._def._config,s);return{error:a,untransformedJSON:s,body:JSON.stringify(i)}}(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:s,errors:[a],headers:c});return new Response(i,{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),s={headers:kt(e.headers),method:e.method,signal:r.signal};"GET"!==e.method&&"HEAD"!==e.method&&(s.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=i=>{n+=i.length,!t.maxBodySize||n<=t.maxBodySize?o.enqueue(new Uint8Array(i.buffer,i.byteOffset,i.byteLength)):(o.error(new V({code:"PAYLOAD_TOO_LARGE"})),r=!0,e.off("data",a),e.off("end",s))},s=()=>{r||(r=!0,e.off("data",a),e.off("end",s),o.close())};e.on("data",a),e.on("end",s)},cancel(){e.destroy()}})}(e,n),s.duplex="half");return new Request(a,s)}async function Et(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 Mt=I(D(),1);function Bt(e){return t=>{var n;const{res:r,req:o}=e,a=J(t),s=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 i=W(e.router._def._config,{error:s});r.statusCode=s.data.httpStatus,r.end(JSON.stringify(i))}}async function Tt(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,Mt.default)((0,Mt.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,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,r]of t.headers)n.setHeader(e,r);try{t.body&&await Et({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(Bt(e))})})}const $t=t("http");var Ot=I(D(),1);function Nt(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 Tt((0,Ot.default)((0,Ot.default)({},e),{},{req:t,res:r,path:o}))}).catch(Bt((0,Ot.default)({req:t,res:r,path:o},e)))}}function It(e){return $t.createServer(function(e){return Nt(e)}(e))}const Pt=t("node:os"),At=t("node:crypto"),qt=1024**3,zt=(e,t,n)=>Math.min(Math.max(e,t),n),Ft=e=>e?40:0,Ut=(e=0)=>{if(!e)return 0;return zt(e/(12*qt)*20,0,20)},jt=(e=0)=>{if(!e)return 0;return zt(e/(32*qt)*10,0,10)},Dt=e=>e?10:0,Rt=(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 s=Ft(n)+Rt(t,e)+Ut(r),i=jt(o),l=Dt(a);return Math.min(100,Math.round(s+i+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:s,error:i})=>{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:s},h=Lt(f),y=s?(({platform:e,variant:t,hasGpu:n,gpuUsableBytes:r=0,cpuUsableBytes:o=0,ok:a=!0}={})=>({gpuPresence:Ft(n),variant:Rt(t,e),gpuMemory:Ut(r),cpuMemory:jt(o),availability:Dt(a)}))(f):null;return{platform:e,ok:s,variant:n,hasGpu:c,devices:l,gpuTotalBytes:u,gpuUsableBytes:p,cpuTotalBytes:d,cpuUsableBytes:m,score:h,breakdown:y,error:i,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 s="ok";return!o&&e.hasGpu&&(s="gpu-memory"),a||(s=o?"cpu-memory":"insufficient-memory"),{totalRequiredBytes:r,fitsInGpu:o,fitsInCpu:a,limiting:s}},Wt=async({platform:e,variant:t=null,preferVariants:n=[],variantPreference:r=[],gpuMemoryFraction:o=.85,cpuMemoryFraction:a=.5,includeBreakdown:s=!1,totalMemoryInBytes:i,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:i,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:i,variant:t,devices:[],gpuMemoryFraction:o,cpuMemoryFraction:a,ok:!1,error:r}))}const g=y.filter(e=>e.ok),b=g.find(e=>e.hasGpu)||g.find(e=>"default"===e.variant)||g[0]||null,w={ok:Boolean(b),selected:b?{...b,breakdown:s?b.breakdown:void 0}:null,attempts:y};if(!s&&w.selected&&delete w.selected.breakdown,!w||!l&&!c)return w;const v=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 w.selected=v(w.selected),w.attempts=Array.isArray(w.attempts)?w.attempts.map(v):w.attempts,w},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:s=!1,totalMemoryInBytes:i,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:s,totalMemoryInBytes:i,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)),s=1048576,i=1024*s;let l,c,u;l=o<200*s?120*s:o<500*s?140*s:o<2*i?150*s:160*s,c=o<200*s?70*s:o<500*s?135*s:220*s,u=o<100*s?20*s:o<200*s?30*s:o<500*s?85*s:o<2*i?215*s:360*s;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),s=r?sn.get(r):null;if(!s)return an({arch:r,nLayer:n});const i=s({nLayer:o,nSwa:a,metadata:t});if(!i||!i.enabled||!i.window||i.window<=0)return an({arch:r,nLayer:n});const l=Math.max(0,Math.floor(Number(i.pattern)||0)),c=null!=i.kvLayers&&Number.isFinite(Number(i.kvLayers))?Number(i.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),s=r%o;return Math.floor(r/o)*a+(n?Math.max(0,s-1):Math.min(s,a))})(u,l,Boolean(i.denseFirst));return{arch:r,enabled:d>0,window:i.window,pattern:l,denseFirst:Boolean(i.denseFirst),type:i.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,s=t?n(`${t}.attention.head_count`,n("llama.attention.head_count")):null;return{arch:t,nCtxTrain:r,nLayer:o,nEmbd:a,nHead:s,nHeadKv:t?n(`${t}.attention.head_count_kv`,n("llama.attention.head_count_kv",s)):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:s=!1,nParallel:i=1,swaFull:l=!1})=>{const c=a?.window&&s?Math.max(1,Number(i)||1):1;return s=>((e,t,n,r,o,a={},{totalLayers:s=null,swaLayers:i=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!=s&&void 0!==s?s: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(i)||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,s,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,s=o,i=o;for(;a<=s;){const e=Math.floor((a+s)/2);n+r(e)<=t?(i=e,a=e+1):s=e-1}return i};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.queue?.getStatus?.()||{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:Boolean(n.contextRecord?.context),contextRefCount:n.contextRecord?.refCount||0,queueStatus:r}}),history:{modelLoads:vn.getModelLoadHistory(),transcriptions:vn.getTranscriptionHistory()}}}const Cn="undefined"!=typeof globalThis&&globalThis.ReadableStream&&globalThis.WritableStream?{ReadableStream:globalThis.ReadableStream,WritableStream:globalThis.WritableStream}:fn,{ReadableStream:En,WritableStream:Mn}=Cn,Bn=new TextEncoder,Tn=(e={},t={})=>(Object.entries(t||{}).forEach(([t,n])=>{n&&"object"==typeof n&&!Array.isArray(n)?(e[t]&&"object"==typeof e[t]||(e[t]={}),Tn(e[t],n)):e[t]=n}),e),$n="https://huggingface.co",On="https://huggingface.co/api",Nn=g.join(Pt.homedir(),".buttress","models"),In=["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,An={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:On,base_url:$n},runtime:{cache_dir:Nn,prefer_variants:[],huggingface_token:process.env.HUGGINGFACE_TOKEN||null,http_headers:{},session_cache:{enabled:!0,max_size_bytes:10737418240,max_entries:1e3}}},qn=(e,t=[])=>e||0===e?Array.isArray(e)?e.filter(e=>null!=e):[e]:[...t],zn=e=>{if(!e)return null;const t=String(e).toLowerCase();return["cuda","vulkan","snapdragon","default"].includes(t)?t:null},Fn=(e={})=>{const t=JSON.parse(JSON.stringify(An));if(Tn(t,e),t.backend.variant=zn(t.backend.variant),t.backend.variant_preference=Array.from(new Set(qn(t.backend.variant_preference).map(zn).filter(Boolean))),0===t.backend.variant_preference.length&&(t.backend.variant_preference=["cuda","vulkan","snapdragon","default"]),t.runtime.prefer_variants=Array.from(new Set(qn(t.runtime.prefer_variants).map(zn).filter(Boolean))),t.model.preferred_quantizations=Array.from(new Set(qn(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||$n,t.model.api_base=t.model.api_base||On,t.runtime.cache_dir=t.runtime.cache_dir?g.resolve(t.runtime.cache_dir):Nn,t.runtime.session_cache={...An.runtime.session_cache,...t.runtime.session_cache||{}},t},Un=e=>{const t=e.toLowerCase();return In.find(e=>t.includes(e))||null},jn=async e=>{await(0,y.mkdir)(e,{recursive:!0})},Dn=(e,t,n=Nn)=>{const r=(0,At.createHash)("sha256").update(e).digest("hex");return g.join(((e=Nn)=>g.join(e,".metadata-cache"))(n),t,`${r}.json`)},Rn=async(e,t,n=Nn)=>{try{const r=Dn(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=Nn)=>{try{const o=Dn(e,t,r);await jn(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=Nn)=>g.join(e,".session-state-cache"),Hn=(e=Nn)=>g.join(Gn(e),"cache-map.json"),Jn=(e=Nn)=>g.join(Gn(e),"temp"),Vn=(e=Nn)=>g.join(Gn(e),"states"),Kn=async(e,t=Nn)=>{const n=Hn(t),r=`${n}.tmp.${Date.now()}`;try{await jn(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 jn(Gn(this.baseDir)),await jn(Jn(this.baseDir)),await jn(Vn(this.baseDir)),this.cacheMap=await(async(e=Nn)=>{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,At.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,s=((e,t=Nn)=>g.join(Vn(t),`${e}.bin`))(o,this.baseDir);try{await jn(g.dirname(s)),await(0,y.rename)(n,s);const i=await(0,y.stat)(s),l={id:o,promptText:e,completionText:t,fullText:a,promptTokenCount:r,stateFilePath:s,stateFileSize:i.size,metadata:{...this.metadata},createdAt:(new Date).toISOString(),lastAccessedAt:(new Date).toISOString()};return this.cacheMap.entries[o]=l,this.cacheMap.totalSize+=i.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 s=r.filter(e=>(o>t||a>n)&&(o-=e.stateFileSize||0,a-=1,!0));return await Promise.all(s.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),s.map(e=>e.id)})(this.cacheMap,this.maxSizeBytes,this.maxEntries),await Kn(this.cacheMap,this.baseDir),console.log(`[SessionCache] Saved entry: ${o} (${i.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 jn(Jn(this.baseDir)),((e=Nn)=>{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=Nn)=>{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=Nn)=>{const r=JSON.stringify({url:e,headers:t}),a=await Rn(r,"range-metadata",n);if(a)return a;const s=!/^https?:/i.test(e),{metadata:i}=await o(e,{fetch,additionalFetchHeaders:t,allowLocalFile:s});return await Ln(r,"range-metadata",i,n),i},er=async(e,t)=>{try{const n=await(0,y.stat)(e);return!t||n.size===t}catch(e){return!1}},tr=async(e,t,n,r,o)=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");await jn(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 s=await(0,y.open)(n,"w"),i=Number(a.headers.get("content-length"))||r||0;let l=0,c=.05;try{await a.body.pipeTo(new Mn({async write(e){if(await s.write(e),l+=e.byteLength,"function"==typeof o&&i>0){const e=Math.min(1,l/i);for(;e>=c;)o(c),c+=.05}},async close(){await s.close(),"function"==typeof o&&o(1)},async abort(e){throw await s.close().catch(()=>{}),await(0,y.unlink)(n).catch(()=>{}),e}}))}catch(e){throw await s.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}`)}},nr=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 Rn(o,"artifact-info",r);if(a)return a;const s={...e.runtime.http_headers||{}};if(e.runtime.huggingface_token&&(s.Authorization=`Bearer ${e.runtime.huggingface_token}`),e.model.url){const a=await Zn(e.model.url,{headers:s}),i=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:i,headers:s};return await Ln(o,"artifact-info",l,r),l}let{filename:i}=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:s}),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:In;if(i)l||(l=Un(i));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;i=t,l=n||Un(i)}const p=`${e.model.base_url.replace(/\/+$/,"")}/${t}/resolve/${n}/${i}`,m=/-(\d{5})-of-(\d{5})\.gguf$/,f=i.match(m);let h=null;if(f){const[,,r]=f,o=await Qn(`${e.model.api_base}/models/${t}?revision=${n}&blobs=true`,{headers:s}),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=i.replace(m,`-${t}-of-${r}.gguf`),o=a.find(e=>(e.rfilename||e.path||e.filename)===n),s=Number(o?.size);Number.isFinite(s)&&s>0&&(h+=s)}}else{const e=await Zn(p,{headers:s});h=Number(e.headers.get("content-length"))||null}const y={repoId:t,revision:n,filename:i,url:p,size:h,quantization:l,headers:s,isSplit:Boolean(f),splitCount:f?Number(f[2]):0};return await Ln(o,"artifact-info",y,r),y},rr=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(zn).filter(Boolean)))})(e),[o,...i]=r,l=null!=e.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.gpu_memory_fraction))):An.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:i,gpuMemoryFraction:l,cpuMemoryFraction:c,dependencies:{getBackendDevicesInfo:a,isLibVariantAvailable:s},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}},or=async e=>{const t=await nr(e),n=await Xn(t.url,t.headers,e.runtime.cache_dir),{arch:r,nCtxTrain:o,nLayer:a,nEmbd:s,nHead:i,nHeadKv:l,nEmbdHeadK:c,nEmbdHeadV:u,quantVersion:d,fileType:p}=cn(n),m=Number.isFinite(Number(a))?Number(a):0,f=Number.isFinite(Number(s))?Number(s):0,h=Number.isFinite(Number(i))?Number(i):0,y=Number.isFinite(Number(l))?Number(l):h,b=h>0&&f>0?f/h:128,w=null!=c&&Number.isFinite(Number(c))?Number(c):b,v=null!=u&&Number.isFinite(Number(u))?Number(u):b,_=ln({arch:r,metadata:n,nLayer:m}),x=_&&Number.isFinite(Number(_.kvLayers))?Number(_.kvLayers):m,S=Math.max(0,Math.floor(Number(x)||0)),k=e.model.n_ctx?Number(e.model.n_ctx):null;let C=k||o||4096;const E=[],M=[];let B=!0;if(k&&o&&k>o){B=!1;const e=`Requested context length (${k}) exceeds model training context (${o})`;E.push(e),M.push(e),C=o}k&&!o&&E.push("Model metadata missing training context length, using requested value");const T={k:e.model.cache_type_k,v:e.model.cache_type_v},$=t.size>0?t.size:0,O=un({layerCount:S,headKvCount:y,embdHeadKCount:w,embdHeadVCount:v,cacheTypes:T,swaConfig:_,kvUnified:e.model.kv_unified,nParallel:e.model.n_parallel,swaFull:e.model.swa_full}),N=O(C),I=await rr(e,{modelBytes:$,kvCacheBytes:N}),P=I.selected.totalMemory||0,A=P*(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),F=I.selected.hasGpu?A:z,U=dn({maxCtx:C,availableMemory:F,modelBytes:$,kvBytesForCtx:O});if(!k&&U){const e=o?Math.min(U,o):U,t=Math.max(32,e);t<C&&E.push(`Context length capped to ${t} by memory limits`),C=t}C>U&&(C=U);const j=Math.floor(U);console.log(`[buttress] Memory-limited context length: ${j}`);const D=O(C),R=$+D,L=m?$/(m+1):$;let G,H=0;I.selected.hasGpu&&L>0&&(H=Math.min(m+1,Math.max(0,Math.floor(A/L)))),console.log(`[buttress] Auto GPU layer capacity (${I.selected.variant}): ${H}/${m+1}`),G="auto"===e.model.n_gpu_layers||null==e.model.n_gpu_layers?H:Math.max(0,Math.min(Number(e.model.n_gpu_layers)||0,m+1));const J=(()=>{const t=e.model.flash_attn&&String(e.model.flash_attn).toLowerCase();return"on"===t||"off"===t?t:I.selected.hasGpu?"auto":"off"})(),V=e.runtime.cache_dir,K=((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)})(e,t),Y=await er(K,t.size),W={ok:B,backend:"ggml-llm",warnings:E,errors:M,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:S,swa:_?.enabled?{window:_.window,pattern:_.pattern,dense_first:_.denseFirst,type:_.type,layers:_.swaLayers}:null}},runtime:{variant:I.selected.variant,n_ctx:C,requested_ctx:k,n_gpu_layers:G,n_parallel:e.model.n_parallel,n_batch:e.model.n_batch,flash_attn_type:J,cache_type_k:T.k,cache_type_v:T.v,ctx_shift:e.model.ctx_shift,kv_unified:e.model.kv_unified,swa_full:e.model.swa_full,estimated_max_n_ctx:j,auto_gpu_layers:H},resources:{modelBytes:$,kvCacheBytes:D,totalEstimatedBytes:R,gpuCapacityBytes:P,gpuUsableBytes:A,cpuUsableBytes:z,fit:I.selected.fit},devices:{selected:I.selected,attempts:I.attempts},download:{cacheDir:V,localPath:K,exists:Y},timestamp:(new Date).toISOString()};return{config:e,info:W,artifact:t,metadata:{arch:r,nCtxTrain:o,nLayer:m,nEmbd:f},devices:I,cacheTypes:T,localPath:K,localExists:Y}},ar=(e,t)=>`event: ${e}\ndata: ${null==t?"":JSON.stringify(t)}\n\n`,sr=(e,t,n=null)=>{let r;const o=Date.now();let a=0;return new En({async start(s){try{const i=await e.parallel.completion(t,(e,t)=>{t&&(t.token&&(a+=1),s.enqueue(Bn.encode(ar("token",{requestId:e,...t}))))}),{requestId:l}=i;r=i.stop;const c=await i.promise;console.log("[Completion] Result:",c),s.enqueue(Bn.encode(ar("result",{requestId:l,...c}))),s.close();const u=Date.now()-o;wn.addCompletion({id:`completion-${l}`,generatorId:n,requestId:l,promptTokens:c.prompt_tokens||c.promptTokens||0,tokensGenerated:c.tokens_predicted||c.tokensPredicted||a,tokensPerSecond:c.tokens_per_second||c.tokensPerSecond||(u>0?a/u*1e3:0),durationMs:u,success:!0,interrupted:c.interrupted||!1,contextFull:c.context_full||c.contextFull||!1})}catch(e){s.enqueue(Bn.encode(ar("error",{message:e?.message||String(e)}))),s.error(e),wn.addCompletion({id:`completion-${Date.now()}`,generatorId:n,durationMs:Date.now()-o,tokensGenerated:a,success:!1,error:e?.message||String(e)})}},cancel(){r&&r()}})},ir=(e,t,n,r,o,a,s=null)=>{let i,l="",c=!1;const u=Date.now();let d=0;return new En({async start(p){try{const m=await e.parallel.completion(t,(e,t)=>{t&&(t.token&&(l+=t.token,d+=1),p.enqueue(Bn.encode(ar("token",{requestId:e,...t}))))}),{requestId:f}=m;i=m.stop;const h=await m.promise;h.text?l=h.text:h.content&&(l=h.content),c=!h.interrupted&&!h.context_full,console.log("[Completion] Result:",h),p.enqueue(Bn.encode(ar("result",{requestId:f,...h}))),p.close();const g=Date.now()-u;wn.addCompletion({id:`completion-${f}`,generatorId:s,requestId:f,promptTokens:h.prompt_tokens||h.promptTokens||a||0,tokensGenerated:h.tokens_predicted||h.tokensPredicted||d,tokensPerSecond:h.tokens_per_second||h.tokensPerSecond||(g>0?d/g*1e3:0),durationMs:g,success:!0,interrupted:h.interrupted||!1,contextFull:h.context_full||h.contextFull||!1,usedCache:Boolean(t.load_state_path)}),c&&n.enabled&&l?n.saveCompletionState(r,l,o,a).catch(e=>{console.warn("[SessionCache] Save failed:",e.message)}):o&&(0,y.unlink)(o).catch(()=>{})}catch(e){p.enqueue(Bn.encode(ar("error",{message:e?.message||String(e)}))),p.error(e),wn.addCompletion({id:`completion-${Date.now()}`,generatorId:s,durationMs:Date.now()-u,tokensGenerated:d,success:!1,error:e?.message||String(e)}),(0,y.unlink)(o).catch(()=>{})}},cancel(){i&&i(),(0,y.unlink)(o).catch(()=>{})}})},lr=e=>{const t={model:e.plan.localPath,runtime:e.plan.info.runtime};return(0,At.createHash)("sha256").update(JSON.stringify(t)).digest("hex").slice(0,24)},cr=async(e,t)=>{const n=lr(e);let r=e.contexts.get(n);if(r)return r.refCount+=1,await r.ready,"function"==typeof t&&t(1),r;r={key:n,refCount:1},r.ready=(async()=>{const o=Date.now(),a=await(async(e,t,n)=>{const{config:r,localPath:o,artifact:a}=e;if(e.localExists&&!t.has(o))return e.info.download.exists=!0,"function"==typeof n&&n(.5),o;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=o;t.has(s)||t.set(s,(async()=>{if(a.isSplit&&a.splitCount>0){const e=/-(\d{5})-of-(\d{5})\.gguf$/,t=g.dirname(o),s=a.splitCount;let i=0;for(let o=1;o<=s;o+=1){const l=String(o).padStart(5,"0"),c=a.filename.replace(e,`-${l}-of-${String(s).padStart(5,"0")}.gguf`),u=`${r.model.base_url.replace(/\/+$/,"")}/${a.repoId}/resolve/${a.revision}/${c}`,d=g.join(t,c);await er(d)||await tr(u,a.headers,d,null,e=>{if(e>=0&&Number.isFinite(e)){const t=(i+e)/s,r=Math.round(100*t);console.log(`Downloading model splits: ${Math.min(100,r)}%`),"function"==typeof n&&n(.5*t)}}),i+=1}}else console.log("Downloading model: 0%"),await tr(a.url,a.headers,o,a.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 o})(e.plan,e.downloads,t);"function"==typeof t&&t(.5);const s={model:a,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&&(s.cache_type_k=e.plan.info.runtime.cache_type_k,s.cache_type_v=e.plan.info.runtime.cache_type_v),console.log("[Context] Load Options:",s);try{if(l=await i(s,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}})(),e.contexts.set(n,r);try{return await r.ready,r}catch(t){throw e.contexts.delete(n),t}},ur=async(e,t,n=!1)=>{if(n)t.refCount=0;else if(t.refCount=Math.max(0,t.refCount-1),t.refCount>0)return!1;e.contexts.delete(t.key);try{t.context?.parallel?.disable?.()}catch(e){}return await(t.context?.release?.()),!0};async function dr(e,t){const n=Fn(t),r=await or(n),o=new Wn(n,r);await o.initialize();const a={id:e,type:"ggml-llm",config:n,plan:r,info:r.info,contexts:new Map,downloads:new Map,sessionCache:o};return{id:e,type:"ggml-llm",info:r.info,contexts:a.contexts,initContext:async(e={})=>{const{onProgress:t}=e,n=await cr(a,t);return{modelInfo:n.modelInfo?{...n.modelInfo}:null,runtime:{...a.plan.info.runtime},download:{...a.plan.info.download}}},completion:async(e={})=>{const{options:t={},useCache:n=!0}=e,r=lr(a),o=a.contexts.get(r);if(!o)throw new Error(`Context "${r}" not initialized`);await o.ready;let s=t.prompt||"";if(!s&&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});s=e?.prompt||e||""}if(n&&a.sessionCache.enabled&&s){const{options:e}=await a.sessionCache.prepareCompletionOptions(t,s),n=await a.sessionCache.generateTempStatePath(),r=await o.context.tokenize(s),i=r?.tokens?.length||0,l={...e,save_state_path:n,save_state_size:i};return console.log(`[SessionCache] save_state_size=${i} (prompt tokens)`),ir(o.context,l,a.sessionCache,s,n,i,a.id)}return sr(o.context,t,a.id)},tokenize:async(e={})=>{const{text:t="",params:n={}}=e,r=lr(a),o=a.contexts.get(r);if(!o)throw new Error(`Context "${r}" not initialized`);await o.ready;const s=await o.context.tokenize(t,n);if(!s)return{tokens:[]};const i=Array.from(s.tokens??[]).map(e=>Number(e));return{...s,tokens:i}},detokenize:async(e={})=>{const{tokens:t=[]}=e,n=lr(a),r=a.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=lr(a),s=a.contexts.get(o);if(!s)throw new Error(`Context "${o}" not initialized`);return await s.ready,await s.context.getFormattedChat(t,n,r)},releaseContext:async(e={})=>{const t=lr(a),n=a.contexts.get(t);return!!n&&ur(a,n,Boolean(e.force))},finalize:async()=>{const e=Array.from(a.contexts.values()).map(e=>ur(a,e,!0));await Promise.allSettled(e),await a.sessionCache.cleanup()},getStatus:()=>{const e=[],t=Array.from(a.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:a.id,type:a.type,repoId:a.plan.info.model?.repoId||null,quantization:a.plan.info.model?.quantization||null,variant:a.plan.info.runtime?.variant||null,nCtx:a.plan.info.runtime?.n_ctx||null,nParallel:a.plan.info.runtime?.n_parallel||null,contexts:t,parallelStatuses:e}},subscribeParallelStatus:e=>{const t=Array.from(a.contexts.entries()).map(([t,n])=>n.context.parallel.subscribeToStatus(n=>{e({contextKey:t,...n})}));return{remove:()=>{t.forEach(e=>{e?.remove&&e.remove()})}}}}}const pr=e=>{const t=Fn(e);return t.model.repo_id||t.model.repository||t.model.model||null};const mr=e=>e?"number"==typeof e.score&&Number.isFinite(e.score)?Number(e.score):Lt(e):0;async function fr(e=null,t={}){const{threshold:n=1.1,includeBreakdown:r=!1,config:o,...i}=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:s}=await async function(e){const t=Fn(e),n=await nr(t),r=await Xn(n.url,n.headers,t.runtime.cache_dir),{arch:o,nCtxTrain:a,nLayer:s,nEmbd:i,nHead:l,nHeadKv:c,nEmbdHeadK:u,nEmbdHeadV:d,quantVersion:p,fileType:m}=cn(r),f=Number.isFinite(Number(s))?Number(s):0,h=Number.isFinite(Number(i))?Number(i):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},E=n.size>0?n.size:0,M=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}),B=null!=t.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(t.backend.gpu_memory_fraction))):An.backend.gpu_memory_fraction||1,T=null!=t.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(t.backend.cpu_memory_fraction))):Pn,$=M(k),O=await rr(t,{modelBytes:E,kvCacheBytes:$}),N=(O.selected.totalMemory||0)*B,I=Math.max(0,Pt.totalmem()*T),P=O.selected.hasGpu?N:I,A=dn({maxCtx:k,availableMemory:P,modelBytes:E,kvBytesForCtx:M}),q=M(k),z=M(A);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:E,kvCacheBytes:q,limitedKvCacheBytes:z,memoryLimitedCtx:A,quantization:{name:n.quantization||null,fileType:m,version:p}}}(o);l=e,c=t,u=n,d=r,p=a,m=s}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({...i,platform:process.platform,totalMemoryInBytes:Pt.totalmem(),backend:"ggml-llm",includeBreakdown:r,gpuMemoryFraction:f,cpuMemoryFraction:h,dependencies:{getBackendDevicesInfo:a,isLibVariantAvailable:s},modelBytes:l,kvCacheBytes:c,limitedKvCacheBytes:u}),g=y.selected,b=mr(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=mr(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,s=g?.fit,i=g?.limitedFit,l=e?.fitsInGpu||e?.fitsInCpu||a?.fitsInGpu||a?.fitsInCpu,c=s?.fitsInGpu||s?.fitsInCpu||i?.fitsInGpu||i?.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:hr}="undefined"!=typeof globalThis&&globalThis.ReadableStream&&globalThis.WritableStream?{ReadableStream:globalThis.ReadableStream,WritableStream:globalThis.WritableStream}:fn,yr=(e={},t={})=>(Object.entries(t||{}).forEach(([t,n])=>{n&&"object"==typeof n&&!Array.isArray(n)?(e[t]&&"object"==typeof e[t]||(e[t]={}),yr(e[t],n)):e[t]=n}),e),gr="https://huggingface.co",br="https://huggingface.co/api",wr=g.join(Pt.homedir(),".buttress","models"),vr=["cuda","vulkan","default"],_r=["q8_0","q5_1","q5_0","q4_1","q4_0","base"],xr={backend:{type:"ggml-stt",variant:null,variant_preference:vr,gpu_memory_fraction:.85,cpu_memory_fraction:.5},model:{repo_id:"BricksDisplay/whisper-ggml",revision:"main",filename:null,url:null,quantization:null,preferred_quantizations:["q5_1","q8_0","base"],allow_local_file:!1,local_path:null,api_base:br,base_url:gr,use_gpu:!0,use_flash_attn:"auto"},runtime:{cache_dir:wr,prefer_variants:[],huggingface_token:process.env.HUGGINGFACE_TOKEN||null,http_headers:{},max_threads:null}},Sr=(e,t=[])=>e||0===e?Array.isArray(e)?e.filter(e=>null!=e):[e]:[...t],kr=e=>{if(!e)return null;const t=String(e).toLowerCase();return["cuda","vulkan","default"].includes(t)?t:null},Cr=(e={})=>{const t=JSON.parse(JSON.stringify(xr));if(yr(t,e),t.backend.variant=kr(t.backend.variant),t.backend.variant_preference=Array.from(new Set(Sr(t.backend.variant_preference||vr).map(kr).filter(Boolean))),0===t.backend.variant_preference.length&&(t.backend.variant_preference=[...vr]),t.runtime.prefer_variants=Array.from(new Set(Sr(t.runtime.prefer_variants).map(kr).filter(Boolean))),t.model.preferred_quantizations=Array.from(new Set(Sr(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||gr,t.model.api_base=t.model.api_base||br,t.runtime.cache_dir=t.runtime.cache_dir?g.resolve(t.runtime.cache_dir):wr,t},Er=e=>{const t=e.toLowerCase();return _r.find(e=>t.includes(e))||null},Mr=async e=>{await(0,y.mkdir)(e,{recursive:!0})},Br=(e,t,n=wr)=>{const r=(0,At.createHash)("sha256").update(e).digest("hex");return g.join(((e=wr)=>g.join(e,".metadata-cache"))(n),t,`${r}.json`)},Tr=async(e,t,n,r=wr)=>{try{const o=Br(e,t,r);await Mr(g.dirname(o)),await(0,y.writeFile)(o,JSON.stringify(n),"utf-8")}catch(e){}},$r=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},Or=async(e,t)=>{try{const n=await(0,y.stat)(e);return!t||n.size===t}catch(e){return!1}},Nr=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=wr)=>{try{const r=Br(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 s={...e.runtime.http_headers||{}};if(e.runtime.huggingface_token&&(s.Authorization=`Bearer ${e.runtime.huggingface_token}`),e.model.url){const a=await $r(e.model.url,{headers:s}),i=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:i,quantization:Er(l||""),headers:s};return await Tr(o,"artifact-info",c,r),c}let{filename:i}=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:s}),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:_r;if(i)l||(l=Er(i));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;i=t,l=n||Er(i)}const p=`${e.model.base_url.replace(/\/+$/,"")}/${t}/resolve/${n}/${i}`,m=await $r(p,{headers:s}),f={repoId:t,revision:n,filename:i,url:p,size:Number(m.headers.get("content-length"))||null,quantization:l,headers:s,isSplit:!1,splitCount:0};return await Tr(o,"artifact-info",f,r),f},Ir=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(kr).filter(Boolean)))})(e),[o,...i]=r,l=null!=e.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.gpu_memory_fraction))):xr.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:i,variantPreference:e.backend.variant_preference,gpuMemoryFraction:l,cpuMemoryFraction:c,dependencies:{getBackendDevicesInfo:a,isLibVariantAvailable:s},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}},Pr=async e=>{const t=await Nr(e),n=rn({modelBytes:t.size>0?t.size:0}),r=await Ir(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 s;s="on"===a||"true"===a||"off"!==a&&"false"!==a&&o;const i=e.runtime.cache_dir,l=((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)})(e,t),c=await Or(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:s,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:i,localPath:l,exists:c},timestamp:(new Date).toISOString()},artifact:t,memory:n,devices:r,localPath:l,localExists:c}},Ar=async(e,t,n)=>{const{localPath:r,artifact:o,config:a}=e;if(e.localExists)return"function"==typeof n&&n(1),r;const s=t.get(r);if(s)return await s,"function"==typeof n&&n(1),r;const i=(async()=>{if(a.model.allow_local_file){if(!await Or(r,o.size))throw new Error(`Local model file not found: ${r}`);return r}return await(async(e,t,n,r,o)=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");await Mr(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 s=await(0,y.open)(n,"w"),i=Number(a.headers.get("content-length"))||r||0;let l=0,c=.05;try{await a.body.pipeTo(new hr({async write(e){if(await s.write(e),l+=e.byteLength,"function"==typeof o&&i>0){const e=Math.min(1,l/i);for(;e>=c;)o(c),c+=.05}},async close(){await s.close(),"function"==typeof o&&o(1)},async abort(e){throw await s.close().catch(()=>{}),await(0,y.unlink)(n).catch(()=>{}),e}}))}catch(e){throw await s.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}`)}})(o.url,o.headers,r,o.size,n),r})();t.set(r,i);try{return await i,r}finally{t.delete(r)}};class qr{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 zr=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")},Fr=async(e,t)=>{if(e.contextRecord)return e.contextRecord.refCount+=1,await e.contextRecord.ready,"function"==typeof t&&t(1),e.contextRecord;const n={refCount:1};n.ready=(async()=>{const r=Date.now();try{const o=await Ar(e.plan,e.downloads,t),a=await l({filePath:o,useFlashAttn:e.plan.info.runtime.use_flash_attn,useGpu:e.plan.info.runtime.use_gpu},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()-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}})(),e.contextRecord=n;try{return await n.ready,"function"==typeof t&&t(1),n}catch(t){throw e.contextRecord=null,t}},Ur=async(e,t,n=!1)=>{if(n)t.refCount=0;else if(t.refCount=Math.max(0,t.refCount-1),t.refCount>0)return!1;return e.contextRecord=null,await(t.context?.release?.()),!0};async function jr(e,t){const n=await Pr(Cr(t)),r={id:e,type:"ggml-stt",config:t,plan:n,info:n.info,contextRecord:null,downloads:new Map,queue:new qr},o=async(e={})=>{const{audioPath:t,audioData:n,options:o={}}=e,a=await Fr(r),s={...o};r.plan.info.runtime.max_threads&&null==s.maxThreads&&(s.maxThreads=r.plan.info.runtime.max_threads);const i=`transcription-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,l=Date.now();return r.queue.enqueue(async()=>{await a.ready;try{let e;if(n){const t=zr(n),{promise:r}=a.context.transcribeData(t,s);e=await r}else{if(!t)throw new Error("audioPath or audioData is required for transcription");const n=g.resolve(t),{promise:r}=a.context.transcribe(n,s);e=await r}return vn.addTranscription({id:i,generatorId:r.id,durationMs:Date.now()-l,segmentCount:e?.segments?.length||0,textLength:e?.text?.length||0,success:!0}),e}catch(e){throw vn.addTranscription({id:i,generatorId:r.id,durationMs:Date.now()-l,success:!1,error:e?.message||String(e)}),e}},i)};return{id:e,type:"ggml-stt",info:n.info,queue:r.queue,initContext:async(e={})=>{const{onProgress:t}=e,n=await Fr(r,t);return{modelInfo:n.modelInfo?{...n.modelInfo}:null,runtime:{...r.plan.info.runtime},download:{...r.plan.info.download}}},transcribe:async(e={})=>o(e),transcribeData:async(e={})=>o(e),releaseContext:async(e={})=>{const t=r.contextRecord;return!!t&&Ur(r,t,Boolean(e.force))},finalize:async()=>{r.contextRecord&&await Ur(r,r.contextRecord,!0)},getStatus:()=>({id:r.id,type:r.type,repoId:r.plan.info.model?.repoId||null,quantization:r.plan.info.model?.quantization||null,variant:r.plan.info.runtime?.variant||null,hasContext:Boolean(r.contextRecord?.context),contextRefCount:r.contextRecord?.refCount||0,queueStatus:r.queue.getStatus()})}}const Dr=e=>{const t=Cr(e);return t.model.repo_id||t.model.repository||t.model.model||null},Rr=e=>e?"number"==typeof e.score&&Number.isFinite(e.score)?Number(e.score):Lt(e):0;async function Lr(e,t=null,n={}){if("ggml-llm"===e)return fr(t,n);if("ggml-stt"===e)return async function(e=null,t={}){const{threshold:n=1.1,includeBreakdown:r=!1,config:o,...i}=t;let l=null,c=null,u=null;if(o)try{const e=Cr(o),t=await Nr(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({...i,platform:process.platform,totalMemoryInBytes:Pt.totalmem(),backend:"ggml-stt",includeBreakdown:r,gpuMemoryFraction:d,cpuMemoryFraction:p,dependencies:{getBackendDevicesInfo:a,isLibVariantAvailable:s},modelBytes:l,kvCacheBytes:c}),f=m.selected,h=Rr(f);f&&(f.modelBytes=l||null,f.processingBytes=c||null,f.quantization=u||null);let y=null,g=null;if(e){const t=Rr(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,s=f.fit.fitsInGpu||f.fit.fitsInCpu;a&&!s?(r="local",o="client-fits-in-memory"):s&&!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 Gr=t("node:fs"),Hr=t("node:child_process"),Jr=JSON.parse('{"UU":"@fugood/buttress-backend-core","rE":"2.23.0-beta.31"}'),Vr=e=>{if(!e)return{repoId:null,filename:null};const[t,n]=e.split(":");return{repoId:t,filename:n||null}};async function Kr({modelIds:e=[],defaultConfig:t=null}={}){const n=[];console.log(`${Jr.UU} v${Jr.rE}`),console.log("Generating model capabilities comparison...\n"),n.push(`${Jr.UU} v${Jr.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:s=[],...i}=o,l=e=>r(JSON.parse(JSON.stringify(i)),e||{}),u=e=>{if(Array.isArray(s)&&s.length>0){const t=s.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(i).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:{...i.runtime,...r?.model||{},repo_id:n}};const o=await Lr("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),s=r?.nCtx||t?.kvInfo?.nCtxTrain||"N/A",i=un(t),l=Number(s),c=t?.kvCacheBytes||(i&&Number.isFinite(l)&&l>0?i(l):i&&i(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} | ${s} | ${u} | ${d} | ${f} | ${h} |`);if((null!=t?.memoryLimitedCtx||null!=t?.limitedFit)&&(!t?.fit?.fitsInGpu||!t?.fit?.fitsInCpu)){const e=t?.memoryLimitedCtx||s,r=Number(e),o=t?.limitedKvCacheBytes||i&&Number.isFinite(r)&&r>0&&i(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!==s||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,Hr.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:** ${Jr.UU}`),n.push(`- **Version:** ${Jr.rE}`),Jr.description&&n.push(`- **Description:** ${Jr.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);Gr.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 Yr({modelId:e=null,defaultConfig:t=null}={}){console.log(`${Jr.UU} v${Jr.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,s=(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]=s(n[e]||{},t):n[e]=t}),n},i=e=>s(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 i(n)}}return Object.keys(a).length>0?i({}):null})(e);e&&(l={...l||{},model:{...l?.model||{},repo_id:e}});const c=await Lr("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,Hr.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 Wr({modelIds:e=[],defaultConfig:t=null}={}){const n=[];console.log(`${Jr.UU} v${Jr.rE}`),console.log("Generating STT model capabilities comparison...\n"),n.push(`${Jr.UU} v${Jr.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:s=[],...i}=o,l=e=>r(JSON.parse(JSON.stringify(i)),e||{}),u=e=>{if(Array.isArray(s)&&s.length>0){const t=s.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(i).length>0?l({}):null},d=[];for(let t=0;t<e.length;t+=1){const n=e[t],{repoId:r,filename:o}=Vr(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 s=await Lr("ggml-stt",null,{config:a,includeBreakdown:!0});d.push({modelId:n,repoId:r,filename:o,capabilities:s,modelInfo:s.buttress?.selected||null,modelConfig:s.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),s=m(t?.fit?.fitsInGpu),i=m(t?.fit?.fitsInCpu);n.push(`| ${e} | ${r} | ${o} | ${a} | ${s} | ${i} |`)}),n.push("\n---"),n.push("\n### System Information");let f=null;if("win32"!==process.platform)try{f=(0,Hr.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:** ${Jr.UU}`),n.push(`- **Version:** ${Jr.rE}`),Jr.description&&n.push(`- **Description:** ${Jr.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);Gr.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 Qr({modelId:e=null,defaultConfig:t=null}={}){console.log(`${Jr.UU} v${Jr.rE}`),console.log("Testing capabilities for backend: ggml-stt"),e&&console.log(`Model: ${e}`),console.log("--------------------------------");try{const{repoId:n,filename:r}=Vr(e),o=t||{},{server:a,generators:s=[],...i}=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(i)),e||{});let u=(e=>{if(Array.isArray(s)&&s.length>0){const t=s.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(i).length>0?c({}):null})(n);n&&(u={...u||{},model:{...i.runtime,...u?.model||{},repo_id:n,...r&&{filename:r}}});const d=await Lr("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,Hr.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 Zr=new Map,Xr=(e,t)=>{const n=(e=>{const t=Zr.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 eo(e,t){const n={"ggml-llm":{create:dr,getId:pr},"ggml-stt":{create:jr,getId:Dr}}[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=Zr.get(o);if(a)return a.refCount+=1,{id:a.id,info:a.instance.info};const s=await n.create(o,t),i={id:o,type:s.type,instance:s,refCount:1};return Zr.set(o,i),{id:o,info:s.info}}async function to(e){const t=Zr.get(e);return!!t&&(t.refCount-=1,t.refCount<=0&&(await t.instance.finalize(),Zr.delete(e)),!0)}const no={initContext:async(e,t)=>Xr(e,"ggml-llm").initContext(t),completion:async(e,t)=>Xr(e,"ggml-llm").completion(t),tokenize:async(e,t)=>Xr(e,"ggml-llm").tokenize(t),detokenize:async(e,t)=>Xr(e,"ggml-llm").detokenize(t),applyChatTemplate:async(e,t)=>Xr(e,"ggml-llm").applyChatTemplate(t),releaseContext:async(e,t)=>Xr(e,"ggml-llm").releaseContext(t)},ro={initContext:async(e,t)=>Xr(e,"ggml-stt").initContext(t),transcribe:async(e,t)=>Xr(e,"ggml-stt").transcribe(t),transcribeData:async(e,t)=>Xr(e,"ggml-stt").transcribeData(t),releaseContext:async(e,t)=>Xr(e,"ggml-stt").releaseContext(t)};function oo(e,t){return"ggml-llm"===e?pr(t):"ggml-stt"===e?Dr(t):null}const ao={getFullStatus:()=>function(e){return{timestamp:(new Date).toISOString(),ggmlLlm:Sn(e),ggmlStt:kn(e)}}(Zr),getGgmlLlmStatus:()=>Sn(Zr),getGgmlSttStatus:()=>kn(Zr),subscribeToStatus:xn,subscribeToStatusWithId:function(e){return _n+=1,{subscriberId:_n,unsubscribe:xn(e)}},llmStatusTracker:wn,sttStatusTracker:vn,statusEmitter:yn},{version:so,name:io}={version:"2.23.0-beta.31",name:"@fugood/buttress-server-poc"},lo=async()=>{const e=`https://registry.npmjs.org/${io}/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}},co=(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},uo=async()=>{try{const e=await lo();e&&co(so,e)&&(e=>{console.log(""),console.log("[33mâ•─────────────────────────────────────────────────╮[0m"),console.log("[33m│[0m Update available! [2m%s[0m → [32m%s[0m",so.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",io.padEnd(27)),console.log("[33m╰─────────────────────────────────────────────────╯[0m"),console.log("")})(e)}catch(e){}},po=n.create(),mo=e=>{const{status:t}=e;return po.router({getStatus:po.procedure.query(()=>(console.log("[Status] Get full status"),t.getFullStatus())),getLlmStatus:po.procedure.query(()=>(console.log("[Status] Get LLM status"),t.getGgmlLlmStatus())),getSttStatus:po.procedure.query(()=>(console.log("[Status] Get STT status"),t.getGgmlSttStatus())),subscribe:po.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 s=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?.()),s()}}))})},fo=new TextDecoder,ho=(e,t,n)=>{e.writeHead(t,{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"}),e.end(JSON.stringify(n))},yo=(e,t)=>{e.write(`data: ${JSON.stringify(t)}\n\n`)},go=(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},bo=({backend:e,defaultConfig:t})=>{const n=new Map,r=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+=fo.decode(o,{stream:!0}),r=go(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(()=>{})}},o=async(o,a)=>{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)}))(o)}catch(e){return void ho(a,400,{error:{message:e.message,type:"invalid_request_error"}})}const{messages:i=[],stream:l=!1,model:c,tools:u,temperature:d,stop:p}=s,m=s.top_p,f=s.max_tokens,h=s.presence_penalty,y=s.frequency_penalty,g=s.tool_choice,b=s.stream_options;if(i&&0!==i.length)try{const o=await(async r=>{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],s=r||a.model?.repo_id;if(r){const e=o.find(e=>e.model?.repo_id===r);e&&(a=e)}else s=a.model?.repo_id;const i=s,l=n.get(i);if(l?.initialized)return l;const{generators:c,server:u,...d}=t||{},p={...d,...a,model:{...a.model,repo_id:s}};console.log(`[OpenAI] Creating generator for ${i}`);const{id:m}=await e.startGenerator("ggml-llm",p),f={id:m,config:p,repoId:s,initialized:!1};return n.set(i,f),await e.ggmlLlm.initContext(m,{}),f.initialized=!0,console.log(`[OpenAI] Generator ready: ${i}`),f})(c),s=`chatcmpl-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,w=Math.floor(Date.now()/1e3),v=o.repoId||"ggml-llm",_={reasoning_format:"auto",messages:i,jinja:!0,add_generation_prompt:!0};null!=d&&(_.temperature=d),null!=m&&(_.top_p=m),null!=f&&(_.n_predict=f),null!=p&&(_.stop=Array.isArray(p)?p:[p]),null!=h&&(_.presence_penalty=h),null!=y&&(_.frequency_penalty=y),null!=u&&(_.tools=u),null!=g&&(_.tool_choice=g);const x=await e.ggmlLlm.completion(o.id,{options:_});if(l){a.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","Access-Control-Allow-Origin":"*"});const e=!0===b?.include_usage;let t="",n="";const o=new Map,i=new Map;await r(x,{onToken:e=>{const r={};if(null!=e.content){const n=e.content;n.length>t.length&&(r.content=n.slice(t.length),t=n)}if(null!=e.reasoning_content){const t=e.reasoning_content;t.length>n.length&&(r.reasoning_content=t.slice(n.length),n=t)}if(null!=e.tool_calls&&e.tool_calls.length>0){const t=[];e.tool_calls.forEach((e,n)=>{const r={index:n};i.has(n)||(i.set(n,e.id||`call_${s}_${n}`),r.id=i.get(n),r.type="function");const a=e.function?.arguments||"",l=o.get(n)||"",c={};!o.has(n)&&e.function?.name&&(c.name=e.function.name),a.length>l.length&&(c.arguments=a.slice(l.length),o.set(n,a)),Object.keys(c).length>0?(r.function=c,t.push(r)):r.id&&(r.function={name:e.function?.name||"",arguments:""},t.push(r))}),t.length>0&&(r.tool_calls=t)}Object.keys(r).length>0&&yo(a,{id:s,object:"chat.completion.chunk",created:w,model:v,choices:[{index:0,delta:r,finish_reason:null}]})},onResult:t=>{const n={id:s,object:"chat.completion.chunk",created:w,model:v,choices:[{index:0,delta:{},finish_reason:t.interrupted?"length":"stop"}]};e&&(n.usage={prompt_tokens:t.prompt_tokens||t.promptTokens||0,completion_tokens:t.tokens_predicted||t.tokensPredicted||0,total_tokens:(t.prompt_tokens||t.promptTokens||0)+(t.tokens_predicted||t.tokensPredicted||0)}),yo(a,n)},onError:e=>{yo(a,{error:{message:e.message,type:"server_error"}})}}),a.write("data: [DONE]\n\n"),a.end()}else{let e="",t=null,n=null,o="stop",i={prompt_tokens:0,completion_tokens:0,total_tokens:0};await r(x,{onToken:t=>{null!=t.content?e+=t.content:null!=t.token&&(e+=t.token)},onResult:r=>{r.text?e=r.text:r.content&&(e=r.content),r.reasoning_content&&(t=r.reasoning_content),r.tool_calls&&r.tool_calls.length>0?(n=r.tool_calls.map((e,t)=>({id:e.id||`call_${s}_${t}`,type:"function",function:{name:e.function?.name||"",arguments:e.function?.arguments||""}})),o="tool_calls"):o=r.interrupted?"length":"stop",i={prompt_tokens:r.prompt_tokens||r.promptTokens||0,completion_tokens:r.tokens_predicted||r.tokensPredicted||0,total_tokens:(r.prompt_tokens||r.promptTokens||0)+(r.tokens_predicted||r.tokensPredicted||0)}},onError:e=>{throw new Error(e.message)}});const l={role:"assistant",content:e||null};t&&(l.reasoning_content=t),n&&(l.tool_calls=n),ho(a,200,{id:s,object:"chat.completion",created:w,model:v,choices:[{index:0,message:l,finish_reason:o}],usage:i})}}catch(e){console.error("[OpenAI] Chat completion error:",e),ho(a,500,{error:{message:e.message||"Internal server error",type:"server_error"}})}else ho(a,400,{error:{message:"messages is required and must not be empty",type:"invalid_request_error"}})};return async(e,n,r)=>{if("OPTIONS"===e.method)return n.writeHead(204,{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"86400"}),n.end(),!0;const{pathname:a}=r;return"/oai-compat/v1/models"===a&&"GET"===e.method?(await(async(e,n)=>{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"}),ho(n,200,{object:"list",data:r})})(0,n),!0):"/oai-compat/v1/chat/completions"===a&&"POST"===e.method&&(await o(e,n),!0)}},wo=g.dirname((0,b.fileURLToPath)("file:///Users/jhen/workspace/mybigday-bricks/buttress/buttress-server-poc/src/index.js")),vo=new TextDecoder,_o=n.context().create(),xo=r.record(r.any()).optional(),So=r.object({id:r.string()}),ko=r.object({id:r.string(),property:r.any().optional()}),Co=new Map,Eo=r.object({type:r.string(),config:xo}),Mo=r.object({type:r.string().optional().default("ggml-llm"),config:xo,currentClientCapabilities:r.record(r.any()).optional(),options:r.record(r.any()).optional()}).optional(),Bo=(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]=Bo(n[e]||{},t):n[e]=t}),n},To=e=>e&&"object"==typeof e?JSON.parse(JSON.stringify(e)):null,$o=(e,t)=>{const n=To(e)||{},r=To(t)||{};return Bo(n,r)},Oo=(e=h,{defaultConfig:t}={})=>{const n=To(t)||{},o=Array.isArray(n.generators)?n.generators:[],{server:a,generators:s,...i}=n,l=e=>Bo(JSON.parse(JSON.stringify(i)),e||{}),c=(e,t)=>{if(o.length>0){const n=o.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(i).length>0?l({}):null};return _o.router({getCapabilities:_o.procedure.input(Mo).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:s={}}=n,i=To(o),l=e.getModelIdentifier(r,i),u=c(r,l),d=$o(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,{...s,config:d})}),startGenerator:_o.procedure.input(Eo).mutation(async({input:t})=>{console.log("[Server] Start Generator:",t);const{type:n,config:r}=t,o=To(r),a=e.getModelIdentifier(n,o),s=c(n,a),i=$o(s,r);if(0===Object.keys(i).length)throw new Error("Buttress server missing generator configuration");return i.backend=i.backend||{},i.backend.type||(i.backend.type=n),e.startGenerator(n,i)}),finalizeGenerator:_o.procedure.input(So).mutation(async({input:t})=>(console.log("[Server] Finalize Generator:",t),e.finalizeGenerator(t.id))),ggmlLlm:_o.router({initContext:_o.procedure.input(ko).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:_o.procedure.input(ko).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 Co.set(n,{stream:r,cancel:null,generatorId:t.id}),{completionId:n}}catch(e){throw console.error("[Server] createCompletion error:",e),e}}),completion:_o.procedure.input(ko).subscription(({input:e})=>te(t=>{const n=e.property;console.log("[Server] completion subscription:",n);const r=Co.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=vo.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(),Co.delete(n)}})),cancelCompletion:_o.procedure.input(ko).mutation(async({input:e})=>{const t=e.property;console.log("[Server] cancelCompletion:",t);const n=Co.get(t);return n?(n.cancel&&n.cancel(),Co.delete(t),{success:!0}):{success:!1,error:"Unknown completion ID"}}),tokenize:_o.procedure.input(ko).mutation(async({input:t})=>(console.log("[Server] Tokenize:",t),e.ggmlLlm.tokenize(t.id,t.property))),detokenize:_o.procedure.input(ko).mutation(async({input:t})=>(console.log("[Server] Detokenize:",t),e.ggmlLlm.detokenize(t.id,t.property))),applyChatTemplate:_o.procedure.input(ko).mutation(async({input:t})=>(console.log("[Server] Apply Chat Template:",t),e.ggmlLlm.applyChatTemplate(t.id,t.property))),releaseContext:_o.procedure.input(ko).mutation(async({input:t})=>(console.log("[Server] Release Context:",t),e.ggmlLlm.releaseContext(t.id,t.property)))}),ggmlStt:_o.router({initContext:_o.procedure.input(ko).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:_o.procedure.input(r.instanceof(FormData)).mutation(async({input:t})=>{const n=t,r=n.get("id"),o=n.get("options"),a=n.get("audioData"),s=o?JSON.parse(o):{};let i;if(a instanceof Blob||a&&"function"==typeof a.arrayBuffer){const e=await a.arrayBuffer();i=Buffer.from(e)}else i=Buffer.isBuffer(a)?a:a instanceof ArrayBuffer?Buffer.from(a):a;return console.log("[Server] Transcribe Data:",{id:r,audioDataLength:i?.length||0,options:s}),e.ggmlStt.transcribeData(r,{audioData:i,options:s})}),releaseContext:_o.procedure.input(ko).mutation(async({input:t})=>(console.log("[Server] Release STT Context:",t),e.ggmlStt.releaseContext(t.id,t.property)))}),status:mo(e)})},No=({backend:e=h,router:t,createContext:n=()=>({}),defaultConfig:r,maxBodySize:o=104857600,enableOpenAICompat:a="1"===process.env.ENABLE_OPENAI_COMPAT_ENDPOINT}={})=>{const s=t||Oo(e,{defaultConfig:r}),i=a?bo({backend:e,defaultConfig:r}):null;return{server:It({router:s,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(i&&a.pathname.startsWith("/oai-compat/"))try{if(await i(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(wo,"..","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:s,backend:e,openaiEnabled:a}},Io=async({port:e=2080,backend:t,router:n,createContext:r,defaultConfig:o,maxBodySize:a,enableOpenAICompat:s}={})=>{const{server:i,router:l,backend:c,openaiEnabled:u}=No({backend:t,router:n,createContext:r,defaultConfig:o,maxBodySize:a,enableOpenAICompat:s});return await new Promise(t=>i.listen(e,t)),console.log(`[Server] Status page available at http://localhost:${e}/status`),{server:i,router:l,port:e,backend:c,openaiEnabled:u}},{testGgmlLlmCapabilities:Po,testGgmlSttCapabilities:Ao,showModelsTable:qo,showSttModelsTable:zo}=h;export{uo as checkAndNotifyUpdates,lo as checkForUpdates,co as compareVersions,Oo as createRouter,No as createServer,so as currentVersion,qo as showModelsTable,zo as showSttModelsTable,Io as startServer,Po as testGgmlLlmCapabilities,Ao 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:()=>to,generatorRegistry:()=>Zr,getCapabilities:()=>Lr,getModelIdentifier:()=>oo,ggmlLlm:()=>no,ggmlStt:()=>ro,showModelsTable:()=>Kr,showSttModelsTable:()=>Wr,startGenerator:()=>eo,status:()=>ao,testGgmlLlmCapabilities:()=>Yr,testGgmlSttCapabilities:()=>Qr});const y=t("node:fs/promises"),g=t("node:path"),b=t("node:url"),v={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},w={[-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 E=Object.create,M=Object.defineProperty,T=Object.getOwnPropertyDescriptor,B=Object.getOwnPropertyNames,$=Object.getPrototypeOf,O=Object.prototype.hasOwnProperty,N=(e,t)=>function(){return t||(0,e[B(e)[0]])((t={exports:{}}).exports,t),t.exports},I=(e,t,n)=>(n=null!=e?E($(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(var o,a=B(t),i=0,s=a.length;i<s;i++)o=a[i],O.call(e,o)||o===n||M(e,o,{get:(e=>t[e]).bind(null,o),enumerable:!(r=T(t,o))||r.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 A(e){return q(e.code)}var z=N({"../../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}}),F=N({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPrimitive.js"(e,t){var n=z().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}}),U=N({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPropertyKey.js"(e,t){var n=z().default,r=F();t.exports=function(e){var t=r(e,"string");return"symbol"==n(t)?t:t+""},t.exports.__esModule=!0,t.exports.default=t.exports}}),j=N({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js"(e,t){var n=U();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}}),D=N({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/objectSpread2.js"(e,t){var n=j();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}}),R=I(D(),1);function L(e){const{path:t,error:n,config:r}=e,{code:o}=e.error,a={message:n.message,code:v[o],data:{code:o,httpStatus:A(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,R.default)((0,R.default)({},e),{},{shape:a}))}var G=I(j(),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=I(D(),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;I(D(),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=I(D(),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=I(j(),1);let fe;const he=new WeakMap,ye=()=>{};fe=Symbol.toStringTag;var ge,be,ve,we,_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!==(we=(ve=Symbol).asyncDispose)&&void 0!==we||(ve.asyncDispose=Symbol());const Ce=Symbol();function Ee(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 Me=N({"../../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}}),Te=N({"../../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}}),Be=N({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/awaitAsyncGenerator.js"(e,t){var n=Te();t.exports=function(e){return new n(e,0)},t.exports.__esModule=!0,t.exports.default=t.exports}}),$e=N({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/wrapAsyncGenerator.js"(e,t){var n=Te();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}}),Oe=I(Me(),1),Ne=I(Be(),1),Ie=I($e(),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,Ie.default)(function*(e,t){try{var n=(0,Oe.default)();const r=n.a(Pe(e)),o=n.u(Ee(t.maxDurationMs)).start();let a;for(;;){if(a=yield(0,Ne.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,Ne.default)(n.d())}})).apply(this,arguments)}function Ae(){return(Ae=(0,Ie.default)(function*(e,t){try{var n=(0,Oe.default)();const r=n.a(Pe(e));let o;const a=n.u(Ee(t.gracePeriodMs));let i=t.count,s=new Promise(()=>{});for(;;){if(o=yield(0,Ne.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,Ne.default)(n.d())}})).apply(this,arguments)}function ze(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}}var Fe=I(Me(),1),Ue=I(Be(),1),je=I($e(),1);function De(){let e="idle",t=ze();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,je.default)(function*(){try{var i=(0,Fe.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,Ue.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=ze()}}catch(e){i.e=e}finally{yield(0,Ue.default)(i.d())}})()}}function Re(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=I(Me(),1),Ge=I(Be(),1),He=I($e(),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(Ee(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=N({"../../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=I(Be(),1),Qe=I($e(),1),Ze=I(Me(),1),Xe=I(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=De();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=Re(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=N({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/asyncGeneratorDelegate.js"(e,t){var n=Te();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=I(Ye(),1),it=I(Be(),1),st=I($e(),1),lt=I(ot(),1);I(Me(),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 Ae.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=Re(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=I($e(),1),yt=I(D(),1);function gt(e){return k((0,ht.default)(function*(){throw e}))}const bt={mutation:["POST"],query:["GET"],subscription:["GET"]},vt={mutation:["POST"],query:["GET","POST"],subscription:["GET","POST"]};function wt(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(w[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?vt: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=wt({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=wt({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=wt({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=wt({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 v;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!==(v=null==r?void 0:r.type)&&void 0!==v?v:"unknown"}),l=wt({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 Et(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 Mt=I(D(),1);function Tt(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 Bt(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,Mt.default)((0,Mt.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,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,r]of t.headers)n.setHeader(e,r);try{t.body&&await Et({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(Tt(e))})})}const $t=t("http");var Ot=I(D(),1);function Nt(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 Bt((0,Ot.default)((0,Ot.default)({},e),{},{req:t,res:r,path:o}))}).catch(Tt((0,Ot.default)({req:t,res:r,path:o},e)))}}function It(e){return $t.createServer(function(e){return Nt(e)}(e))}const Pt=t("node:os"),qt=t("node:crypto"),At=1024**3,zt=(e,t,n)=>Math.min(Math.max(e,t),n),Ft=e=>e?40:0,Ut=(e=0)=>{if(!e)return 0;return zt(e/(12*At)*20,0,20)},jt=(e=0)=>{if(!e)return 0;return zt(e/(32*At)*10,0,10)},Dt=e=>e?10:0,Rt=(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=Ft(n)+Rt(t,e)+Ut(r),s=jt(o),l=Dt(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:Ft(n),variant:Rt(t,e),gpuMemory:Ut(r),cpuMemory:jt(o),availability:Dt(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 v=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=v(b.selected),b.attempts=Array.isArray(b.attempts)?b.attempts.map(v):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))),v=Math.max(0,m-b),w=(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,w),x=v*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 vn=new bn,wn=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:vn.getModelLoadHistory(),completions:vn.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:wn.getModelLoadHistory(),transcriptions:wn.getTranscriptionHistory()}}}const Cn="undefined"!=typeof globalThis&&globalThis.ReadableStream&&globalThis.WritableStream?{ReadableStream:globalThis.ReadableStream,WritableStream:globalThis.WritableStream}:fn,{ReadableStream:En,WritableStream:Mn}=Cn,Tn=new TextEncoder,Bn=(e={},t={})=>(Object.entries(t||{}).forEach(([t,n])=>{n&&"object"==typeof n&&!Array.isArray(n)?(e[t]&&"object"==typeof e[t]||(e[t]={}),Bn(e[t],n)):e[t]=n}),e),$n="https://huggingface.co",On="https://huggingface.co/api",Nn=g.join(Pt.homedir(),".buttress","models"),In=["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:On,base_url:$n},runtime:{cache_dir:Nn,prefer_variants:[],huggingface_token:process.env.HUGGINGFACE_TOKEN||null,http_headers:{},session_cache:{enabled:!0,max_size_bytes:10737418240,max_entries:1e3}}},An=(e,t=[])=>e||0===e?Array.isArray(e)?e.filter(e=>null!=e):[e]:[...t],zn=e=>{if(!e)return null;const t=String(e).toLowerCase();return["cuda","vulkan","snapdragon","default"].includes(t)?t:null},Fn=(e={})=>{const t=JSON.parse(JSON.stringify(qn));if(Bn(t,e),t.backend.variant=zn(t.backend.variant),t.backend.variant_preference=Array.from(new Set(An(t.backend.variant_preference).map(zn).filter(Boolean))),0===t.backend.variant_preference.length&&(t.backend.variant_preference=["cuda","vulkan","snapdragon","default"]),t.runtime.prefer_variants=Array.from(new Set(An(t.runtime.prefer_variants).map(zn).filter(Boolean))),t.model.preferred_quantizations=Array.from(new Set(An(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||$n,t.model.api_base=t.model.api_base||On,t.runtime.cache_dir=t.runtime.cache_dir?g.resolve(t.runtime.cache_dir):Nn,t.runtime.session_cache={...qn.runtime.session_cache,...t.runtime.session_cache||{}},t},Un=e=>{const t=e.toLowerCase();return In.find(e=>t.includes(e))||null},jn=async e=>{await(0,y.mkdir)(e,{recursive:!0})},Dn=(e,t,n=Nn)=>{const r=(0,qt.createHash)("sha256").update(e).digest("hex");return g.join(((e=Nn)=>g.join(e,".metadata-cache"))(n),t,`${r}.json`)},Rn=async(e,t,n=Nn)=>{try{const r=Dn(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=Nn)=>{try{const o=Dn(e,t,r);await jn(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=Nn)=>g.join(e,".session-state-cache"),Hn=(e=Nn)=>g.join(Gn(e),"cache-map.json"),Jn=(e=Nn)=>g.join(Gn(e),"temp"),Vn=(e=Nn)=>g.join(Gn(e),"states"),Kn=async(e,t=Nn)=>{const n=Hn(t),r=`${n}.tmp.${Date.now()}`;try{await jn(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 jn(Gn(this.baseDir)),await jn(Jn(this.baseDir)),await jn(Vn(this.baseDir)),this.cacheMap=await(async(e=Nn)=>{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=Nn)=>g.join(Vn(t),`${e}.bin`))(o,this.baseDir);try{await jn(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 jn(Jn(this.baseDir)),((e=Nn)=>{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=Nn)=>{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=Nn)=>{const r=JSON.stringify({url:e,headers:t}),a=await Rn(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=async(e,t)=>{try{const n=await(0,y.stat)(e);return!t||n.size===t}catch(e){return!1}},tr=async(e,t,n,r,o)=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");await jn(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 Mn({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}`)}},nr=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 Rn(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:In;if(s)l||(l=Un(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||Un(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},rr=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(zn).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}},or=async e=>{const t=await nr(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,b=h>0&&f>0?f/h:128,v=null!=c&&Number.isFinite(Number(c))?Number(c):b,w=null!=u&&Number.isFinite(Number(u))?Number(u):b,_=ln({arch:r,metadata:n,nLayer:m}),x=_&&Number.isFinite(Number(_.kvLayers))?Number(_.kvLayers):m,S=Math.max(0,Math.floor(Number(x)||0)),k=e.model.n_ctx?Number(e.model.n_ctx):null;let C=k||o||4096;const E=[],M=[];let T=!0;if(k&&o&&k>o){T=!1;const e=`Requested context length (${k}) exceeds model training context (${o})`;E.push(e),M.push(e),C=o}k&&!o&&E.push("Model metadata missing training context length, using requested value");const B={k:e.model.cache_type_k,v:e.model.cache_type_v},$=t.size>0?t.size:0,O=un({layerCount:S,headKvCount:y,embdHeadKCount:v,embdHeadVCount:w,cacheTypes:B,swaConfig:_,kvUnified:e.model.kv_unified,nParallel:e.model.n_parallel,swaFull:e.model.swa_full}),N=O(C),I=await rr(e,{modelBytes:$,kvCacheBytes:N}),P=I.selected.totalMemory||0,q=P*(e.backend.gpu_memory_fraction||1),A=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()*A),F=I.selected.hasGpu?q:z,U=dn({maxCtx:C,availableMemory:F,modelBytes:$,kvBytesForCtx:O});if(!k&&U){const e=o?Math.min(U,o):U,t=Math.max(32,e);t<C&&E.push(`Context length capped to ${t} by memory limits`),C=t}C>U&&(C=U);const j=Math.floor(U);console.log(`[buttress] Memory-limited context length: ${j}`);const D=O(C),R=$+D,L=m?$/(m+1):$;let G,H=0;I.selected.hasGpu&&L>0&&(H=Math.min(m+1,Math.max(0,Math.floor(q/L)))),console.log(`[buttress] Auto GPU layer capacity (${I.selected.variant}): ${H}/${m+1}`),G="auto"===e.model.n_gpu_layers||null==e.model.n_gpu_layers?H:Math.max(0,Math.min(Number(e.model.n_gpu_layers)||0,m+1));const J=(()=>{const t=e.model.flash_attn&&String(e.model.flash_attn).toLowerCase();return"on"===t||"off"===t?t:I.selected.hasGpu?"auto":"off"})(),V=e.runtime.cache_dir,K=((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)})(e,t),Y=await er(K,t.size),W={ok:T,backend:"ggml-llm",warnings:E,errors:M,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:S,swa:_?.enabled?{window:_.window,pattern:_.pattern,dense_first:_.denseFirst,type:_.type,layers:_.swaLayers}:null}},runtime:{variant:I.selected.variant,n_ctx:C,requested_ctx:k,n_gpu_layers:G,n_parallel:e.model.n_parallel,n_batch:e.model.n_batch,flash_attn_type:J,cache_type_k:B.k,cache_type_v:B.v,ctx_shift:e.model.ctx_shift,kv_unified:e.model.kv_unified,swa_full:e.model.swa_full,estimated_max_n_ctx:j,auto_gpu_layers:H},resources:{modelBytes:$,kvCacheBytes:D,totalEstimatedBytes:R,gpuCapacityBytes:P,gpuUsableBytes:q,cpuUsableBytes:z,fit:I.selected.fit},devices:{selected:I.selected,attempts:I.attempts},download:{cacheDir:V,localPath:K,exists:Y},timestamp:(new Date).toISOString()};return{config:e,info:W,artifact:t,metadata:{arch:r,nCtxTrain:o,nLayer:m,nEmbd:f},devices:I,cacheTypes:B,localPath:K,localExists:Y}},ar=(e,t)=>`event: ${e}\ndata: ${null==t?"":JSON.stringify(t)}\n\n`,ir=(e,t,n=null)=>{let r;const o=Date.now();let a=0;return new En({async start(i){try{const s=await e.parallel.completion(t,(e,t)=>{t&&(t.token&&(a+=1),i.enqueue(Tn.encode(ar("token",{requestId:e,...t}))))}),{requestId:l}=s;r=s.stop;const c=await s.promise;console.log("[Completion] Result:",c),i.enqueue(Tn.encode(ar("result",{requestId:l,...c}))),i.close();const u=Date.now()-o,d=c.timings||{};vn.addCompletion({id:`completion-${l}`,generatorId:n,requestId:l,promptTokens:d.prompt_n??0,tokensGenerated:d.predicted_n??a,tokensPerSecond:d.predicted_per_second??0,promptPerSecond:d.prompt_per_second??0,durationMs:u,success:!0,interrupted:c.interrupted||!1,contextFull:c.context_full||c.contextFull||!1})}catch(e){i.enqueue(Tn.encode(ar("error",{message:e?.message||String(e)}))),i.error(e),vn.addCompletion({id:`completion-${Date.now()}`,generatorId:n,durationMs:Date.now()-o,tokensGenerated:a,success:!1,error:e?.message||String(e)})}},cancel(){r&&r()}})},sr=(e,t,n,r,o,a,i=null)=>{let s,l="",c=!1;const u=Date.now();let d=0;return new En({async start(p){try{const m=await e.parallel.completion(t,(e,t)=>{t&&(t.token&&(l+=t.token,d+=1),p.enqueue(Tn.encode(ar("token",{requestId:e,...t}))))}),{requestId:f}=m;s=m.stop;const h=await m.promise;h.text?l=h.text:h.content&&(l=h.content),c=!h.interrupted&&!h.context_full,console.log("[Completion] Result:",h),p.enqueue(Tn.encode(ar("result",{requestId:f,...h}))),p.close();const g=Date.now()-u,b=h.timings||{};vn.addCompletion({id:`completion-${f}`,generatorId:i,requestId:f,promptTokens:b.prompt_n??a??0,tokensGenerated:b.predicted_n??d,tokensPerSecond:b.predicted_per_second??0,promptPerSecond:b.prompt_per_second??0,durationMs:g,success:!0,interrupted:h.interrupted||!1,contextFull:h.context_full||h.contextFull||!1,usedCache:Boolean(t.load_state_path)}),c&&n.enabled&&l?n.saveCompletionState(r,l,o,a).catch(e=>{console.warn("[SessionCache] Save failed:",e.message)}):o&&(0,y.unlink)(o).catch(()=>{})}catch(e){p.enqueue(Tn.encode(ar("error",{message:e?.message||String(e)}))),p.error(e),vn.addCompletion({id:`completion-${Date.now()}`,generatorId:i,durationMs:Date.now()-u,tokensGenerated:d,success:!1,error:e?.message||String(e)}),(0,y.unlink)(o).catch(()=>{})}},cancel(){s&&s(),(0,y.unlink)(o).catch(()=>{})}})},lr=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)},cr=async(e,t)=>{const n=lr(e);let r=e.contexts.get(n);if(r)return r.refCount+=1,await r.ready,"function"==typeof t&&t(1),r;r={key:n,refCount:1},r.ready=(async()=>{const o=Date.now(),a=await(async(e,t,n)=>{const{config:r,localPath:o,artifact:a}=e;if(e.localExists&&!t.has(o))return e.info.download.exists=!0,"function"==typeof n&&n(.5),o;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 i=o;t.has(i)||t.set(i,(async()=>{if(a.isSplit&&a.splitCount>0){const e=/-(\d{5})-of-(\d{5})\.gguf$/,t=g.dirname(o),i=a.splitCount;let s=0;for(let o=1;o<=i;o+=1){const l=String(o).padStart(5,"0"),c=a.filename.replace(e,`-${l}-of-${String(i).padStart(5,"0")}.gguf`),u=`${r.model.base_url.replace(/\/+$/,"")}/${a.repoId}/resolve/${a.revision}/${c}`,d=g.join(t,c);await er(d)||await tr(u,a.headers,d,null,e=>{if(e>=0&&Number.isFinite(e)){const t=(s+e)/i,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 tr(a.url,a.headers,o,a.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(i)}finally{t.delete(i)}return o})(e.plan,e.downloads,t);"function"==typeof t&&t(.5);const i={model:a,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),r.context=l,r.modelInfo=l.getModelInfo(),vn.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(vn.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}})(),e.contexts.set(n,r);try{return await r.ready,r}catch(t){throw e.contexts.delete(n),t}},ur=async(e,t,n=!1)=>{if(n)t.refCount=0;else if(t.refCount=Math.max(0,t.refCount-1),t.refCount>0)return!1;e.contexts.delete(t.key);try{t.context?.parallel?.disable?.()}catch(e){}return await(t.context?.release?.()),!0};async function dr(e,t){const n=Fn(t),r=await or(n),o=new Wn(n,r);await o.initialize();const a={id:e,type:"ggml-llm",config:n,plan:r,info:r.info,contexts:new Map,downloads:new Map,sessionCache:o};return{id:e,type:"ggml-llm",info:r.info,contexts:a.contexts,initContext:async(e={})=>{const{onProgress:t}=e,n=await cr(a,t);return{modelInfo:n.modelInfo?{...n.modelInfo}:null,runtime:{...a.plan.info.runtime},download:{...a.plan.info.download}}},completion:async(e={})=>{const{options:t={},useCache:n=!0}=e,r=lr(a),o=a.contexts.get(r);if(!o)throw new Error(`Context "${r}" not initialized`);await o.ready;let i=t.prompt||"";if(!i&&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});i=e?.prompt||e||""}if(n&&a.sessionCache.enabled&&i){const{options:e}=await a.sessionCache.prepareCompletionOptions(t,i),n=await a.sessionCache.generateTempStatePath(),r=await o.context.tokenize(i),s=r?.tokens?.length||0,l={...e,save_state_path:n,save_state_size:s};return console.log(`[SessionCache] save_state_size=${s} (prompt tokens)`),sr(o.context,l,a.sessionCache,i,n,s,a.id)}return ir(o.context,t,a.id)},tokenize:async(e={})=>{const{text:t="",params:n={}}=e,r=lr(a),o=a.contexts.get(r);if(!o)throw new Error(`Context "${r}" not initialized`);await o.ready;const i=await o.context.tokenize(t,n);if(!i)return{tokens:[]};const s=Array.from(i.tokens??[]).map(e=>Number(e));return{...i,tokens:s}},detokenize:async(e={})=>{const{tokens:t=[]}=e,n=lr(a),r=a.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=lr(a),i=a.contexts.get(o);if(!i)throw new Error(`Context "${o}" not initialized`);return await i.ready,await i.context.getFormattedChat(t,n,r)},releaseContext:async(e={})=>{const t=lr(a),n=a.contexts.get(t);return!!n&&ur(a,n,Boolean(e.force))},finalize:async()=>{const e=Array.from(a.contexts.values()).map(e=>ur(a,e,!0));await Promise.allSettled(e),await a.sessionCache.cleanup()},getStatus:()=>{const e=[],t=Array.from(a.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:a.id,type:a.type,repoId:a.plan.info.model?.repoId||null,quantization:a.plan.info.model?.quantization||null,variant:a.plan.info.runtime?.variant||null,nCtx:a.plan.info.runtime?.n_ctx||null,nParallel:a.plan.info.runtime?.n_parallel||null,contexts:t,parallelStatuses:e}},subscribeParallelStatus:e=>{const t=Array.from(a.contexts.entries()).map(([t,n])=>n.context.parallel.subscribeToStatus(n=>{e({contextKey:t,...n})}));return{remove:()=>{t.forEach(e=>{e?.remove&&e.remove()})}}}}}const pr=e=>{const t=Fn(e);return t.model.repo_id||t.model.repository||t.model.model||null};const mr=e=>e?"number"==typeof e.score&&Number.isFinite(e.score)?Number(e.score):Lt(e):0;async function fr(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=Fn(e),n=await nr(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,v=null!=u&&Number.isFinite(Number(u))?Number(u):b,w=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},E=n.size>0?n.size:0,M=un({layerCount:S,headKvCount:g,embdHeadKCount:v,embdHeadVCount:w,cacheTypes:C,swaConfig:_,kvUnified:t.model.kv_unified,nParallel:t.model.n_parallel,swaFull:t.model.swa_full}),T=null!=t.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(t.backend.gpu_memory_fraction))):qn.backend.gpu_memory_fraction||1,B=null!=t.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(t.backend.cpu_memory_fraction))):Pn,$=M(k),O=await rr(t,{modelBytes:E,kvCacheBytes:$}),N=(O.selected.totalMemory||0)*T,I=Math.max(0,Pt.totalmem()*B),P=O.selected.hasGpu?N:I,q=dn({maxCtx:k,availableMemory:P,modelBytes:E,kvBytesForCtx:M}),A=M(k),z=M(q);return{kvInfo:{nCtxTrain:a,nLayer:f,nEmbd:h,nHeadKv:g,nEmbdHeadK:v,nEmbdHeadV:w,nHeadCount:y,nHeadKvCount:g,kvLayerCount:S,swa:_?.enabled?{window:_.window,pattern:_.pattern,denseFirst:_.denseFirst,type:_.type,layers:_.swaLayers}:null},modelBytes:E,kvCacheBytes:A,limitedKvCacheBytes:z,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=mr(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 v=null,w=null;if(e){const t=mr(e);w={...e,score:t};let r="buttress",o="buttress-higher-score";if(y.ok)if(t||0===t){const e=w.fit,a=w.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";v={buttressScore:b,clientScore:t,threshold:n,recommendation:r,reason:o}}y.ok||v||(v={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:w,comparison:v,modelConfig:_}}const{WritableStream:hr}="undefined"!=typeof globalThis&&globalThis.ReadableStream&&globalThis.WritableStream?{ReadableStream:globalThis.ReadableStream,WritableStream:globalThis.WritableStream}:fn,yr=(e={},t={})=>(Object.entries(t||{}).forEach(([t,n])=>{n&&"object"==typeof n&&!Array.isArray(n)?(e[t]&&"object"==typeof e[t]||(e[t]={}),yr(e[t],n)):e[t]=n}),e),gr="https://huggingface.co",br="https://huggingface.co/api",vr=g.join(Pt.homedir(),".buttress","models"),wr=["cuda","vulkan","default"],_r=["q8_0","q5_1","q5_0","q4_1","q4_0","base"],xr={backend:{type:"ggml-stt",variant:null,variant_preference:wr,gpu_memory_fraction:.85,cpu_memory_fraction:.5},model:{repo_id:"BricksDisplay/whisper-ggml",revision:"main",filename:null,url:null,quantization:null,preferred_quantizations:["q5_1","q8_0","base"],allow_local_file:!1,local_path:null,api_base:br,base_url:gr,use_gpu:!0,use_flash_attn:"auto"},runtime:{cache_dir:vr,prefer_variants:[],huggingface_token:process.env.HUGGINGFACE_TOKEN||null,http_headers:{},max_threads:null}},Sr=(e,t=[])=>e||0===e?Array.isArray(e)?e.filter(e=>null!=e):[e]:[...t],kr=e=>{if(!e)return null;const t=String(e).toLowerCase();return["cuda","vulkan","default"].includes(t)?t:null},Cr=(e={})=>{const t=JSON.parse(JSON.stringify(xr));if(yr(t,e),t.backend.variant=kr(t.backend.variant),t.backend.variant_preference=Array.from(new Set(Sr(t.backend.variant_preference||wr).map(kr).filter(Boolean))),0===t.backend.variant_preference.length&&(t.backend.variant_preference=[...wr]),t.runtime.prefer_variants=Array.from(new Set(Sr(t.runtime.prefer_variants).map(kr).filter(Boolean))),t.model.preferred_quantizations=Array.from(new Set(Sr(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||gr,t.model.api_base=t.model.api_base||br,t.runtime.cache_dir=t.runtime.cache_dir?g.resolve(t.runtime.cache_dir):vr,t},Er=e=>{const t=e.toLowerCase();return _r.find(e=>t.includes(e))||null},Mr=async e=>{await(0,y.mkdir)(e,{recursive:!0})},Tr=(e,t,n=vr)=>{const r=(0,qt.createHash)("sha256").update(e).digest("hex");return g.join(((e=vr)=>g.join(e,".metadata-cache"))(n),t,`${r}.json`)},Br=async(e,t,n,r=vr)=>{try{const o=Tr(e,t,r);await Mr(g.dirname(o)),await(0,y.writeFile)(o,JSON.stringify(n),"utf-8")}catch(e){}},$r=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},Or=async(e,t)=>{try{const n=await(0,y.stat)(e);return!t||n.size===t}catch(e){return!1}},Nr=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=vr)=>{try{const r=Tr(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 $r(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:Er(l||""),headers:i};return await Br(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:_r;if(s)l||(l=Er(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||Er(s)}const p=`${e.model.base_url.replace(/\/+$/,"")}/${t}/resolve/${n}/${s}`,m=await $r(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 Br(o,"artifact-info",f,r),f},Ir=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(kr).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))):xr.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}},Pr=async e=>{const t=await Nr(e),n=rn({modelBytes:t.size>0?t.size:0}),r=await Ir(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=((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)})(e,t),c=await Or(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}},qr=async(e,t,n)=>{const{localPath:r,artifact:o,config:a}=e;if(e.localExists)return"function"==typeof n&&n(1),r;const i=t.get(r);if(i)return await i,"function"==typeof n&&n(1),r;const s=(async()=>{if(a.model.allow_local_file){if(!await Or(r,o.size))throw new Error(`Local model file not found: ${r}`);return r}return await(async(e,t,n,r,o)=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");await Mr(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 hr({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}`)}})(o.url,o.headers,r,o.size,n),r})();t.set(r,s);try{return await s,r}finally{t.delete(r)}};class Ar{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 zr=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")},Fr=async(e,t)=>{if(e.contextRecord)return e.contextRecord.refCount+=1,await e.contextRecord.ready,"function"==typeof t&&t(1),e.contextRecord;const n={refCount:1};n.ready=(async()=>{const r=Date.now();try{const o=await qr(e.plan,e.downloads,t),a=await l({filePath:o,useFlashAttn:e.plan.info.runtime.use_flash_attn,useGpu:e.plan.info.runtime.use_gpu},e.plan.info.runtime.variant);n.context=a;try{n.modelInfo=await a.getModelInfo()}catch(e){n.modelInfo=null}return wn.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 wn.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}})(),e.contextRecord=n;try{return await n.ready,"function"==typeof t&&t(1),n}catch(t){throw e.contextRecord=null,t}},Ur=async(e,t,n=!1)=>{if(n)t.refCount=0;else if(t.refCount=Math.max(0,t.refCount-1),t.refCount>0)return!1;return e.contextRecord=null,await(t.context?.release?.()),!0};async function jr(e,t){const n=await Pr(Cr(t)),r={id:e,type:"ggml-stt",config:t,plan:n,info:n.info,contextRecord:null,downloads:new Map,queue:new Ar},o=async(e={})=>{const{audioPath:t,audioData:n,options:o={}}=e,a=await Fr(r),i={...o};r.plan.info.runtime.max_threads&&null==i.maxThreads&&(i.maxThreads=r.plan.info.runtime.max_threads);const s=`transcription-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,l=Date.now();return r.queue.enqueue(async()=>{await a.ready;try{let e;if(n){const t=zr(n),{promise:r}=a.context.transcribeData(t,i);e=await r}else{if(!t)throw new Error("audioPath or audioData is required for transcription");const n=g.resolve(t),{promise:r}=a.context.transcribe(n,i);e=await r}return wn.addTranscription({id:s,generatorId:r.id,durationMs:Date.now()-l,segmentCount:e?.segments?.length||0,textLength:e?.text?.length||0,success:!0}),e}catch(e){throw wn.addTranscription({id:s,generatorId:r.id,durationMs:Date.now()-l,success:!1,error:e?.message||String(e)}),e}},s)};return{id:e,type:"ggml-stt",info:n.info,queue:r.queue,initContext:async(e={})=>{const{onProgress:t}=e,n=await Fr(r,t);return{modelInfo:n.modelInfo?{...n.modelInfo}:null,runtime:{...r.plan.info.runtime},download:{...r.plan.info.download}}},transcribe:async(e={})=>o(e),transcribeData:async(e={})=>o(e),releaseContext:async(e={})=>{const t=r.contextRecord;return!!t&&Ur(r,t,Boolean(e.force))},finalize:async()=>{r.contextRecord&&await Ur(r,r.contextRecord,!0)},getStatus:()=>({id:r.id,type:r.type,repoId:r.plan.info.model?.repoId||null,quantization:r.plan.info.model?.quantization||null,variant:r.plan.info.runtime?.variant||null,hasContext:Boolean(r.contextRecord?.context),contextRefCount:r.contextRecord?.refCount||0,queueStatus:r.queue.getStatus()})}}const Dr=e=>{const t=Cr(e);return t.model.repo_id||t.model.repository||t.model.model||null},Rr=e=>e?"number"==typeof e.score&&Number.isFinite(e.score)?Number(e.score):Lt(e):0;async function Lr(e,t=null,n={}){if("ggml-llm"===e)return fr(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=Cr(o),t=await Nr(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=Rr(f);f&&(f.modelBytes=l||null,f.processingBytes=c||null,f.quantization=u||null);let y=null,g=null;if(e){const t=Rr(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 Gr=t("node:fs"),Hr=t("node:child_process"),Jr=JSON.parse('{"UU":"@fugood/buttress-backend-core","rE":"2.23.0-beta.32"}'),Vr=e=>{if(!e)return{repoId:null,filename:null};const[t,n]=e.split(":");return{repoId:t,filename:n||null}};async function Kr({modelIds:e=[],defaultConfig:t=null}={}){const n=[];console.log(`${Jr.UU} v${Jr.rE}`),console.log("Generating model capabilities comparison...\n"),n.push(`${Jr.UU} v${Jr.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 Lr("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,Hr.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:** ${Jr.UU}`),n.push(`- **Version:** ${Jr.rE}`),Jr.description&&n.push(`- **Description:** ${Jr.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);Gr.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 Yr({modelId:e=null,defaultConfig:t=null}={}){console.log(`${Jr.UU} v${Jr.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 Lr("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,Hr.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 Wr({modelIds:e=[],defaultConfig:t=null}={}){const n=[];console.log(`${Jr.UU} v${Jr.rE}`),console.log("Generating STT model capabilities comparison...\n"),n.push(`${Jr.UU} v${Jr.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}=Vr(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 Lr("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,Hr.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:** ${Jr.UU}`),n.push(`- **Version:** ${Jr.rE}`),Jr.description&&n.push(`- **Description:** ${Jr.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);Gr.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 Qr({modelId:e=null,defaultConfig:t=null}={}){console.log(`${Jr.UU} v${Jr.rE}`),console.log("Testing capabilities for backend: ggml-stt"),e&&console.log(`Model: ${e}`),console.log("--------------------------------");try{const{repoId:n,filename:r}=Vr(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 Lr("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,Hr.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 Zr=new Map,Xr=(e,t)=>{const n=(e=>{const t=Zr.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 eo(e,t){const n={"ggml-llm":{create:dr,getId:pr},"ggml-stt":{create:jr,getId:Dr}}[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=Zr.get(o);if(a)return a.refCount+=1,{id:a.id,info:a.instance.info};const i=await n.create(o,t),s={id:o,type:i.type,instance:i,refCount:1};return Zr.set(o,s),{id:o,info:i.info}}async function to(e){const t=Zr.get(e);return!!t&&(t.refCount-=1,t.refCount<=0&&(await t.instance.finalize(),Zr.delete(e)),!0)}const no={initContext:async(e,t)=>Xr(e,"ggml-llm").initContext(t),completion:async(e,t)=>Xr(e,"ggml-llm").completion(t),tokenize:async(e,t)=>Xr(e,"ggml-llm").tokenize(t),detokenize:async(e,t)=>Xr(e,"ggml-llm").detokenize(t),applyChatTemplate:async(e,t)=>Xr(e,"ggml-llm").applyChatTemplate(t),releaseContext:async(e,t)=>Xr(e,"ggml-llm").releaseContext(t)},ro={initContext:async(e,t)=>Xr(e,"ggml-stt").initContext(t),transcribe:async(e,t)=>Xr(e,"ggml-stt").transcribe(t),transcribeData:async(e,t)=>Xr(e,"ggml-stt").transcribeData(t),releaseContext:async(e,t)=>Xr(e,"ggml-stt").releaseContext(t)};function oo(e,t){return"ggml-llm"===e?pr(t):"ggml-stt"===e?Dr(t):null}const ao={getFullStatus:()=>function(e){return{timestamp:(new Date).toISOString(),ggmlLlm:Sn(e),ggmlStt:kn(e)}}(Zr),getGgmlLlmStatus:()=>Sn(Zr),getGgmlSttStatus:()=>kn(Zr),subscribeToStatus:xn,subscribeToStatusWithId:function(e){return _n+=1,{subscriberId:_n,unsubscribe:xn(e)}},llmStatusTracker:vn,sttStatusTracker:wn,statusEmitter:yn},{version:io,name:so}={version:"2.23.0-beta.32",name:"@fugood/buttress-server-poc"},lo=async()=>{const e=`https://registry.npmjs.org/${so}/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}},co=(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},uo=async()=>{try{const e=await lo();e&&co(io,e)&&(e=>{console.log(""),console.log("[33mâ•─────────────────────────────────────────────────╮[0m"),console.log("[33m│[0m Update available! [2m%s[0m → [32m%s[0m",io.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",so.padEnd(27)),console.log("[33m╰─────────────────────────────────────────────────╯[0m"),console.log("")})(e)}catch(e){}},po=n.create(),mo=e=>{const{status:t}=e;return po.router({getStatus:po.procedure.query(()=>(console.log("[Status] Get full status"),t.getFullStatus())),getLlmStatus:po.procedure.query(()=>(console.log("[Status] Get LLM status"),t.getGgmlLlmStatus())),getSttStatus:po.procedure.query(()=>(console.log("[Status] Get STT status"),t.getGgmlSttStatus())),subscribe:po.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()}}))})},fo=new TextDecoder,ho=(e,t,n)=>{e.writeHead(t,{"Content-Type":"application/json","Access-Control-Allow-Origin":"*"}),e.end(JSON.stringify(n))},yo=(e,t)=>{e.write(`data: ${JSON.stringify(t)}\n\n`)},go=(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},bo=({backend:e,defaultConfig:t})=>{const n=new Map,r=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+=fo.decode(o,{stream:!0}),r=go(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(()=>{})}},o=async(o,a)=>{let i;try{i=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)}))(o)}catch(e){return void ho(a,400,{error:{message:e.message,type:"invalid_request_error"}})}const{messages:s=[],stream:l=!1,model:c,tools:u,temperature:d,stop:p}=i,m=i.top_p,f=i.max_tokens,h=i.presence_penalty,y=i.frequency_penalty,g=i.tool_choice,b=i.stream_options;if(s&&0!==s.length)try{const o=await(async r=>{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=r||a.model?.repo_id;if(r){const e=o.find(e=>e.model?.repo_id===r);e&&(a=e)}else i=a.model?.repo_id;const s=i,l=n.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 n.set(s,f),await e.ggmlLlm.initContext(m,{}),f.initialized=!0,console.log(`[OpenAI] Generator ready: ${s}`),f})(c),i=`chatcmpl-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,v=Math.floor(Date.now()/1e3),w=o.repoId||"ggml-llm",_={reasoning_format:"auto",messages:s,jinja:!0,add_generation_prompt:!0};null!=d&&(_.temperature=d),null!=m&&(_.top_p=m),null!=f&&(_.n_predict=f),null!=p&&(_.stop=Array.isArray(p)?p:[p]),null!=h&&(_.presence_penalty=h),null!=y&&(_.frequency_penalty=y),null!=u&&(_.tools=u),null!=g&&(_.tool_choice=g);const x=await e.ggmlLlm.completion(o.id,{options:_});if(l){a.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","Access-Control-Allow-Origin":"*"});const e=!0===b?.include_usage;let t="",n="";const o=new Map,s=new Map;await r(x,{onToken:e=>{const r={};if(null!=e.content){const n=e.content;n.length>t.length&&(r.content=n.slice(t.length),t=n)}if(null!=e.reasoning_content){const t=e.reasoning_content;t.length>n.length&&(r.reasoning_content=t.slice(n.length),n=t)}if(null!=e.tool_calls&&e.tool_calls.length>0){const t=[];e.tool_calls.forEach((e,n)=>{const r={index:n};s.has(n)||(s.set(n,e.id||`call_${i}_${n}`),r.id=s.get(n),r.type="function");const a=e.function?.arguments||"",l=o.get(n)||"",c={};!o.has(n)&&e.function?.name&&(c.name=e.function.name),a.length>l.length&&(c.arguments=a.slice(l.length),o.set(n,a)),Object.keys(c).length>0?(r.function=c,t.push(r)):r.id&&(r.function={name:e.function?.name||"",arguments:""},t.push(r))}),t.length>0&&(r.tool_calls=t)}Object.keys(r).length>0&&yo(a,{id:i,object:"chat.completion.chunk",created:v,model:w,choices:[{index:0,delta:r,finish_reason:null}]})},onResult:t=>{const n={id:i,object:"chat.completion.chunk",created:v,model:w,choices:[{index:0,delta:{},finish_reason:t.interrupted?"length":"stop"}]};e&&(n.usage={prompt_tokens:t.prompt_tokens||t.promptTokens||0,completion_tokens:t.tokens_predicted||t.tokensPredicted||0,total_tokens:(t.prompt_tokens||t.promptTokens||0)+(t.tokens_predicted||t.tokensPredicted||0)}),yo(a,n)},onError:e=>{yo(a,{error:{message:e.message,type:"server_error"}})}}),a.write("data: [DONE]\n\n"),a.end()}else{let e="",t=null,n=null,o="stop",s={prompt_tokens:0,completion_tokens:0,total_tokens:0};await r(x,{onToken:t=>{null!=t.content?e+=t.content:null!=t.token&&(e+=t.token)},onResult:r=>{r.text?e=r.text:r.content&&(e=r.content),r.reasoning_content&&(t=r.reasoning_content),r.tool_calls&&r.tool_calls.length>0?(n=r.tool_calls.map((e,t)=>({id:e.id||`call_${i}_${t}`,type:"function",function:{name:e.function?.name||"",arguments:e.function?.arguments||""}})),o="tool_calls"):o=r.interrupted?"length":"stop",s={prompt_tokens:r.prompt_tokens||r.promptTokens||0,completion_tokens:r.tokens_predicted||r.tokensPredicted||0,total_tokens:(r.prompt_tokens||r.promptTokens||0)+(r.tokens_predicted||r.tokensPredicted||0)}},onError:e=>{throw new Error(e.message)}});const l={role:"assistant",content:e||null};t&&(l.reasoning_content=t),n&&(l.tool_calls=n),ho(a,200,{id:i,object:"chat.completion",created:v,model:w,choices:[{index:0,message:l,finish_reason:o}],usage:s})}}catch(e){console.error("[OpenAI] Chat completion error:",e),ho(a,500,{error:{message:e.message||"Internal server error",type:"server_error"}})}else ho(a,400,{error:{message:"messages is required and must not be empty",type:"invalid_request_error"}})};return async(e,n,r)=>{if("OPTIONS"===e.method)return n.writeHead(204,{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"86400"}),n.end(),!0;const{pathname:a}=r;return"/oai-compat/v1/models"===a&&"GET"===e.method?(await(async(e,n)=>{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"}),ho(n,200,{object:"list",data:r})})(0,n),!0):"/oai-compat/v1/chat/completions"===a&&"POST"===e.method&&(await o(e,n),!0)}},vo=g.dirname((0,b.fileURLToPath)(import.meta.url)),wo=new TextDecoder,_o=n.context().create({sse:{ping:{enabled:!0,intervalMs:3e4},maxDurationMs:18e5,client:{reconnectAfterInactivityMs:3e5}}}),xo=r.record(r.any()).optional(),So=r.object({id:r.string()}),ko=r.object({id:r.string(),property:r.any().optional()}),Co=new Map,Eo=r.object({type:r.string(),config:xo}),Mo=r.object({type:r.string().optional().default("ggml-llm"),config:xo,currentClientCapabilities:r.record(r.any()).optional(),options:r.record(r.any()).optional()}).optional(),To=(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]=To(n[e]||{},t):n[e]=t}),n},Bo=e=>e&&"object"==typeof e?JSON.parse(JSON.stringify(e)):null,$o=(e,t)=>{const n=Bo(e)||{},r=Bo(t)||{};return To(n,r)},Oo=(e=h,{defaultConfig:t}={})=>{const n=Bo(t)||{},o=Array.isArray(n.generators)?n.generators:[],{server:a,generators:i,...s}=n,l=e=>To(JSON.parse(JSON.stringify(s)),e||{}),c=(e,t)=>{if(o.length>0){const n=o.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 _o.router({getCapabilities:_o.procedure.input(Mo).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=Bo(o),l=e.getModelIdentifier(r,s),u=c(r,l),d=$o(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:_o.procedure.input(Eo).mutation(async({input:t})=>{console.log("[Server] Start Generator:",t);const{type:n,config:r}=t,o=Bo(r),a=e.getModelIdentifier(n,o),i=c(n,a),s=$o(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:_o.procedure.input(So).mutation(async({input:t})=>(console.log("[Server] Finalize Generator:",t),e.finalizeGenerator(t.id))),ggmlLlm:_o.router({initContext:_o.procedure.input(ko).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:_o.procedure.input(ko).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 Co.set(n,{stream:r,cancel:null,generatorId:t.id}),{completionId:n}}catch(e){throw console.error("[Server] createCompletion error:",e),e}}),completion:_o.procedure.input(ko).subscription(({input:e})=>te(t=>{const n=e.property;console.log("[Server] completion subscription:",n);const r=Co.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=wo.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(),Co.delete(n)}})),cancelCompletion:_o.procedure.input(ko).mutation(async({input:e})=>{const t=e.property;console.log("[Server] cancelCompletion:",t);const n=Co.get(t);return n?(n.cancel&&n.cancel(),Co.delete(t),{success:!0}):{success:!1,error:"Unknown completion ID"}}),tokenize:_o.procedure.input(ko).mutation(async({input:t})=>(console.log("[Server] Tokenize:",t),e.ggmlLlm.tokenize(t.id,t.property))),detokenize:_o.procedure.input(ko).mutation(async({input:t})=>(console.log("[Server] Detokenize:",t),e.ggmlLlm.detokenize(t.id,t.property))),applyChatTemplate:_o.procedure.input(ko).mutation(async({input:t})=>(console.log("[Server] Apply Chat Template:",t),e.ggmlLlm.applyChatTemplate(t.id,t.property))),releaseContext:_o.procedure.input(ko).mutation(async({input:t})=>(console.log("[Server] Release Context:",t),e.ggmlLlm.releaseContext(t.id,t.property)))}),ggmlStt:_o.router({initContext:_o.procedure.input(ko).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:_o.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:_o.procedure.input(ko).mutation(async({input:t})=>(console.log("[Server] Release STT Context:",t),e.ggmlStt.releaseContext(t.id,t.property)))}),status:mo(e)})},No=({backend:e=h,router:t,createContext:n=()=>({}),defaultConfig:r,maxBodySize:o=104857600,enableOpenAICompat:a="1"===process.env.ENABLE_OPENAI_COMPAT_ENDPOINT}={})=>{const i=t||Oo(e,{defaultConfig:r}),s=a?bo({backend:e,defaultConfig:r}):null;return{server:It({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(vo,"..","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}},Io=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}=No({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:Po,testGgmlSttCapabilities:qo,showModelsTable:Ao,showSttModelsTable:zo}=h;export{uo as checkAndNotifyUpdates,lo as checkForUpdates,co as compareVersions,Oo as createRouter,No as createServer,io as currentVersion,Ao as showModelsTable,zo as showSttModelsTable,Io as startServer,Po as testGgmlLlmCapabilities,qo 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.32",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"files": [
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"@fugood/llama.node": "^1.4.10",
|
|
22
|
+
"@fugood/whisper.node": "^1.0.11",
|
|
22
23
|
"@huggingface/gguf": "^0.3.2",
|
|
23
24
|
"@iarna/toml": "^3.0.0",
|
|
24
25
|
"@trpc/server": "^11.6.0",
|
|
@@ -28,5 +29,5 @@
|
|
|
28
29
|
"devDependencies": {
|
|
29
30
|
"terser-webpack-plugin": "^5.0.3"
|
|
30
31
|
},
|
|
31
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "46ce7c41468b88fec1d9428e27c7d9a7b8613ab5"
|
|
32
33
|
}
|