@fugood/buttress-server-poc 2.23.0-beta.22 → 2.23.0-beta.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -40,6 +40,7 @@ log_level = "info"
40
40
  [runtime]
41
41
  cache_dir = "~/.buttress/models"
42
42
 
43
+ # GGML LLM generator
43
44
  [[generators]]
44
45
  type = "ggml-llm"
45
46
  [generators.backend]
@@ -48,6 +49,15 @@ variant_preference = ["cuda", "vulkan", "default"]
48
49
  repo_id = "ggml-org/gpt-oss-20b-GGUF"
49
50
  quantization = "mxfp4"
50
51
  n_ctx = 12800
52
+
53
+ # GGML STT (Speech-to-Text) generator
54
+ [[generators]]
55
+ type = "ggml-stt"
56
+ [generators.backend]
57
+ variant_preference = ["coreml", "default"]
58
+ [generators.model]
59
+ repo_id = "BricksDisplay/whisper-ggml"
60
+ filename = "ggml-small.bin"
51
61
  ```
52
62
 
53
63
  ### Programmatic Usage
@@ -103,4 +113,41 @@ Port can be configured via multiple sources (highest priority first):
103
113
 
104
114
  1. **Command-line flag**: `--port 3000`
105
115
  2. **Config file**: `[server] port = 2080`
106
- 4. **Default**: `2080`
116
+ 3. **Default**: `2080`
117
+
118
+ ## CLI Reference
119
+
120
+ ```
121
+ bricks-buttress-poc v2.23.0-beta.22
122
+
123
+ Buttress server for remote inference with GGML backends.
124
+
125
+ Usage:
126
+ bricks-buttress-poc [options]
127
+
128
+ Options:
129
+ -h, --help Show this help message
130
+ -v, --version Show version number
131
+ -p, --port <port> Port to listen on (default: 2080)
132
+ -c, --config <path|toml> Path to TOML config file or inline TOML string
133
+
134
+ Testing Options:
135
+ --test-caps <backend> Test model capabilities (ggml-llm or ggml-stt)
136
+ --test-caps-model-id <id> Model ID to test (used with --test-caps)
137
+ --test-models <ids> Comma-separated list of model IDs to test
138
+ --test-models-default Test default set of models
139
+
140
+ Note: --test-models and --test-models-default output a markdown report
141
+ file (e.g., ggml-llm-model-capabilities-YYYY-MM-DD.md)
142
+
143
+ Environment Variables:
144
+ BUTTRESS_PORT Port to listen on (overridden by --port)
145
+ NODE_ENV Set to 'development' for dev mode
146
+
147
+ Examples:
148
+ bricks-buttress-poc
149
+ bricks-buttress-poc --port 3000
150
+ bricks-buttress-poc --config ./config.toml
151
+ bricks-buttress-poc --test-caps ggml-llm --test-models-default
152
+ bricks-buttress-poc --test-caps ggml-stt --test-caps-model-id BricksDisplay/whisper-ggml:ggml-small.bin
153
+ ```
package/bin/start.mjs CHANGED
@@ -19,6 +19,45 @@ if (process.argv.includes('--version') || process.argv.includes('-v')) {
19
19
  process.exit(0)
20
20
  }
21
21
 
22
+ // Handle --help/-h flag
23
+ if (process.argv.includes('--help') || process.argv.includes('-h')) {
24
+ console.log(`
25
+ bricks-buttress-poc v${pkg.version}
26
+
27
+ Buttress server for remote inference with GGML backends.
28
+
29
+ Usage:
30
+ bricks-buttress-poc [options]
31
+
32
+ Options:
33
+ -h, --help Show this help message
34
+ -v, --version Show version number
35
+ -p, --port <port> Port to listen on (default: 2080)
36
+ -c, --config <path|toml> Path to TOML config file or inline TOML string
37
+
38
+ Testing Options:
39
+ --test-caps <backend> Test model capabilities (ggml-llm or ggml-stt)
40
+ --test-caps-model-id <id> Model ID to test (used with --test-caps)
41
+ --test-models <ids> Comma-separated list of model IDs to test
42
+ --test-models-default Test default set of models
43
+
44
+ Note: --test-models and --test-models-default output a markdown report
45
+ file (e.g., ggml-llm-model-capabilities-YYYY-MM-DD.md)
46
+
47
+ Environment Variables:
48
+ BUTTRESS_PORT Port to listen on (overridden by --port)
49
+ NODE_ENV Set to 'development' for dev mode
50
+
51
+ Examples:
52
+ bricks-buttress-poc
53
+ bricks-buttress-poc --port 3000
54
+ bricks-buttress-poc --config ./config.toml
55
+ bricks-buttress-poc --test-caps ggml-llm --test-models-default
56
+ bricks-buttress-poc --test-caps ggml-stt --test-caps-model-id BricksDisplay/whisper-ggml:ggml-small.bin
57
+ `)
58
+ process.exit(0)
59
+ }
60
+
22
61
  const portArgIndex = process.argv.findIndex((arg) => arg === '--port' || arg === '-p')
23
62
  const portValue = portArgIndex >= 0 ? Number(process.argv[portArgIndex + 1]) : undefined
24
63
 
@@ -62,11 +101,17 @@ if (configInput) {
62
101
  }
63
102
  }
64
103
 
65
- const { testGgmlLlmCapabilities, showModelsTable, startServer, checkAndNotifyUpdates } =
66
- serverModule
104
+ const {
105
+ testGgmlLlmCapabilities,
106
+ testGgmlSttCapabilities,
107
+ showModelsTable,
108
+ showSttModelsTable,
109
+ startServer,
110
+ checkAndNotifyUpdates,
111
+ } = serverModule
67
112
 
68
113
  // Default models for --test-models-default
69
- const DEFAULT_TEST_MODELS = [
114
+ const DEFAULT_TEST_GGML_LLM_MODELS = [
70
115
  'ggml-org/gpt-oss-20b-GGUF',
71
116
  'ggml-org/gpt-oss-120b-GGUF',
72
117
  'unsloth/Qwen3-VL-30B-A3B-Instruct-GGUF',
@@ -78,12 +123,22 @@ const DEFAULT_TEST_MODELS = [
78
123
  'unsloth/phi-4-GGUF',
79
124
  ]
80
125
 
126
+ const DEFAULT_TEST_GGML_STT_MODELS = [
127
+ 'BricksDisplay/whisper-ggml:ggml-small.bin',
128
+ 'BricksDisplay/whisper-ggml:ggml-small-q8_0.bin',
129
+ 'BricksDisplay/whisper-ggml:ggml-medium.bin',
130
+ 'BricksDisplay/whisper-ggml:ggml-medium-q8_0.bin',
131
+ 'BricksDisplay/whisper-ggml:ggml-large-v3-turbo.bin',
132
+ 'BricksDisplay/whisper-ggml:ggml-large-v3-turbo-q8_0.bin',
133
+ 'BricksDisplay/whisper-ggml:ggml-large-v3.bin',
134
+ ]
135
+
81
136
  // Handle --test-caps flag
82
137
  const testCapsArgIndex = process.argv.findIndex((arg) => arg === '--test-caps')
83
138
  if (testCapsArgIndex >= 0) {
84
139
  const backendType = process.argv[testCapsArgIndex + 1] || 'ggml-llm'
85
- if (backendType !== 'ggml-llm') {
86
- console.error('Only ggml-llm backend is supported for testing capabilities')
140
+ if (backendType !== 'ggml-llm' && backendType !== 'ggml-stt') {
141
+ console.error('Only ggml-llm and ggml-stt backends are supported for testing capabilities')
87
142
  process.exit(1)
88
143
  }
89
144
 
@@ -91,7 +146,40 @@ if (testCapsArgIndex >= 0) {
91
146
  const testModelsArgIndex = process.argv.findIndex((arg) => arg === '--test-models')
92
147
  const hasTestModelsDefault = process.argv.includes('--test-models-default')
93
148
 
94
- if (testModelsArgIndex >= 0) {
149
+ if (backendType === 'ggml-stt') {
150
+ // STT backend
151
+ if (testModelsArgIndex >= 0) {
152
+ const modelIdsInput = process.argv[testModelsArgIndex + 1]
153
+ if (!modelIdsInput) {
154
+ console.error('Error: --test-models requires a comma-separated list of model IDs')
155
+ process.exit(1)
156
+ }
157
+ const modelIds = modelIdsInput.split(',').map((id) => id.trim())
158
+
159
+ await showSttModelsTable({
160
+ modelIds,
161
+ defaultConfig,
162
+ })
163
+ } else if (hasTestModelsDefault) {
164
+ await showSttModelsTable({
165
+ modelIds: DEFAULT_TEST_GGML_STT_MODELS,
166
+ defaultConfig,
167
+ })
168
+ } else {
169
+ // Single model test
170
+ const testCapsModelIdArgIndex = process.argv.findIndex(
171
+ (arg) => arg === '--test-caps-model-id',
172
+ )
173
+ const modelId =
174
+ testCapsModelIdArgIndex >= 0 ? process.argv[testCapsModelIdArgIndex + 1] : null
175
+
176
+ await testGgmlSttCapabilities({
177
+ modelId,
178
+ defaultConfig,
179
+ })
180
+ }
181
+ } else if (testModelsArgIndex >= 0) {
182
+ // LLM backend with custom models
95
183
  const modelIdsInput = process.argv[testModelsArgIndex + 1]
96
184
  if (!modelIdsInput) {
97
185
  console.error('Error: --test-models requires a comma-separated list of model IDs')
@@ -103,15 +191,14 @@ if (testCapsArgIndex >= 0) {
103
191
  modelIds,
104
192
  defaultConfig,
105
193
  })
106
- // Exit after showing table - process.exit is called inside showModelsTable
107
194
  } else if (hasTestModelsDefault) {
195
+ // LLM backend with default models
108
196
  await showModelsTable({
109
- modelIds: DEFAULT_TEST_MODELS,
197
+ modelIds: DEFAULT_TEST_GGML_LLM_MODELS,
110
198
  defaultConfig,
111
199
  })
112
- // Exit after showing table - process.exit is called inside showModelsTable
113
200
  } else {
114
- // Single model test
201
+ // LLM backend single model test
115
202
  const testCapsModelIdArgIndex = process.argv.findIndex((arg) => arg === '--test-caps-model-id')
116
203
  const modelId = testCapsModelIdArgIndex >= 0 ? process.argv[testCapsModelIdArgIndex + 1] : null
117
204
 
@@ -119,7 +206,6 @@ if (testCapsArgIndex >= 0) {
119
206
  modelId,
120
207
  defaultConfig,
121
208
  })
122
- // Exit after test - process.exit is called inside testGgmlLlmCapabilities
123
209
  }
124
210
  }
125
211
 
@@ -48,3 +48,23 @@ variant_preference = ["default"]
48
48
  [generators.model]
49
49
  n_ctx = 12800
50
50
  repo_id = "unsloth/gemma-3-12b-it-GGUF"
51
+
52
+ # Speech-to-Text (STT) generators
53
+ [[generators]]
54
+ type = "ggml-stt"
55
+ [generators.backend]
56
+ variant_preference = ["cuda", "vulkan", "default"]
57
+ [generators.model]
58
+ repo_id = "BricksDisplay/whisper-ggml"
59
+ filename = "ggml-small-q8_0.bin"
60
+ use_gpu = true
61
+
62
+ [[generators]]
63
+ type = "ggml-stt"
64
+ [generators.backend]
65
+ variant_preference = ["cuda", "vulkan", "default"]
66
+ [generators.model]
67
+ repo_id = "BricksDisplay/whisper-ggml"
68
+ filename = "ggml-large-v3-turbo-q8_0.bin"
69
+ use_gpu = true
70
+ use_flash_attn = true
package/lib/index.js CHANGED
@@ -1 +1 @@
1
- import*as e from"@trpc/server";import{createRequire as t}from"node:module";import*as n from"zod";import*as r from"@huggingface/gguf";import*as o from"@fugood/llama.node";import*as a from"@iarna/toml";var i,s,l={},u={};function c(e){var t=u[e];if(void 0!==t)return t.exports;var n=u[e]={exports:{}};return l[e](n,n.exports,c),n.exports}s=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,c.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);c.r(n);var r={};i=i||[null,s({}),s([]),s(s)];for(var o=2&t&&e;"object"==typeof o&&!~i.indexOf(o);o=s(o))Object.getOwnPropertyNames(o).forEach((t=>r[t]=()=>e[t]));return r.default=()=>e,c.d(n,r),n},c.d=(e,t)=>{for(var n in t)c.o(t,n)&&!c.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},c.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),c.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var d={};c.r(d),c.d(d,{finalizeGenerator:()=>er,getCapabilities:()=>tr,getModelIdentifier:()=>rr,ggmlLlm:()=>nr,startGenerator:()=>Xn});const p=(e=>{var t={};return c.d(t,e),t})({initTRPC:()=>e.initTRPC}),f={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},m={[-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"};f.BAD_GATEWAY,f.SERVICE_UNAVAILABLE,f.GATEWAY_TIMEOUT,f.INTERNAL_SERVER_ERROR;function y(e){return!!e&&!Array.isArray(e)&&"object"==typeof e}const h="function"==typeof Symbol&&!!Symbol.asyncIterator;function b(e){return h&&y(e)&&Symbol.asyncIterator in e}const g=e=>e();function v(e){return e}var w=Object.create,_=Object.defineProperty,x=Object.getOwnPropertyDescriptor,E=Object.getOwnPropertyNames,S=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty,O=(e,t)=>function(){return t||(0,e[E(e)[0]])((t={exports:{}}).exports,t),t.exports},C=(e,t,n)=>(n=null!=e?w(S(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(var o,a=E(t),i=0,s=a.length;i<s;i++)o=a[i],k.call(e,o)||o===n||_(e,o,{get:(e=>t[e]).bind(null,o),enumerable:!(r=x(t,o))||r.enumerable});return e})(!t&&e&&e.__esModule?n:_(n,"default",{value:e,enumerable:!0}),e));const M={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 N(e){var t;return null!==(t=M[e])&&void 0!==t?t:500}function T(e){return N(e.code)}var B=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/typeof.js"(e,t){function n(e){return t.exports=n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t.exports.__esModule=!0,t.exports.default=t.exports,n(e)}t.exports=n,t.exports.__esModule=!0,t.exports.default=t.exports}}),P=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPrimitive.js"(e,t){var n=B().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}}),$=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPropertyKey.js"(e,t){var n=B().default,r=P();t.exports=function(e){var t=r(e,"string");return"symbol"==n(t)?t:t+""},t.exports.__esModule=!0,t.exports.default=t.exports}}),I=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js"(e,t){var n=$();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}}),A=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/objectSpread2.js"(e,t){var n=I();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=C(A(),1);function U(e){const{path:t,error:n,config:r}=e,{code:o}=e.error,a={message:n.message,code:f[o],data:{code:o,httpStatus:T(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 j=C(I(),1),q=class extends Error{};function L(e){if(e instanceof F)return e;if(e instanceof Error&&"TRPCError"===e.name)return e;const t=new F({code:"INTERNAL_SERVER_ERROR",cause:e});return e instanceof Error&&e.stack&&(t.stack=e.stack),t}var F=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)):y(e)?Object.assign(new q,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,j.default)(this,"cause",void 0),(0,j.default)(this,"code",void 0),this.code=e.code,this.name="TRPCError",null!==(r=this.cause)&&void 0!==r||(this.cause=o)}},D=C(A(),1);function z(e,t){return"error"in t?(0,D.default)((0,D.default)({},t),{},{error:e.transformer.output.serialize(t.error)}):"data"in t.result?(0,D.default)((0,D.default)({},t),{},{result:(0,D.default)((0,D.default)({},t.result),{},{data:e.transformer.output.serialize(t.result.data)})}):t}function G(e,t){return Array.isArray(t)?t.map((t=>z(e,t))):z(e,t)}Error;C(A(),1);async function H(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 V=Symbol();function J(e){return Array.isArray(e)&&e[2]===V}function K(e){return"object"==typeof e&&null!==e&&"subscribe"in e}function Y(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(Q,t)};return t}function Q(e,t){return t(e)}function W(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 Z(e){let t;try{t=JSON.parse(e)}catch(e){throw new F({code:"PARSE_ERROR",message:"Not JSON-parsable query params",cause:e})}return function(e){try{if(null===e)return null;if(!y(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 F({code:"PARSE_ERROR",message:"Invalid connection params shape",cause:e})}}(t)}var X=C(A(),1);function ee(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 F)throw e;throw new F({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 te={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=ee((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(!y(t))throw new F({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 H(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(y(t))t=(0,X.default)((0,X.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 F({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",u=e.searchParams.get("connectionParams");return{isBatchCall:r,accept:n.headers.get("trpc-accept"),calls:i,type:l,connectionParams:null===u?null:Z(u),signal:n.signal,url:e.url}}},ne=[te,{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 F({code:"METHOD_NOT_SUPPORTED",message:"Only POST requests are supported for multipart/form-data requests"});const n=ee((async()=>await t.formData())),r=await H(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 F({code:"METHOD_NOT_SUPPORTED",message:"Only POST requests are supported for application/octet-stream requests"});const n=ee((async()=>t.body));return{calls:[{path:e.path,getRawInput:n.read,result:n.result,procedure:await H(e.router,e.path)}],isBatchCall:!1,accept:null,type:"mutation",connectionParams:null,signal:t.signal,url:e.url}}}];async function re(e){const t=function(e){const t=ne.find((t=>t.isMatch(e)));if(t)return t;if(!t&&"GET"===e.method)return te;throw new F({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 oe(e){return y(e)&&"AbortError"===e.name}function ae(e="AbortError"){throw new DOMException(e,"AbortError")}function ie(e){return"[object Object]"===Object.prototype.toString.call(e)}var se=C(I(),1);let le;const ue=new WeakMap,ce=()=>{};le=Symbol.toStringTag;var de,pe,fe,me,ye=class e{constructor(e){(0,se.default)(this,"promise",void 0),(0,se.default)(this,"subscribers",[]),(0,se.default)(this,"settlement",null),(0,se.default)(this,le,"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=ce}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 ue.set(t,n),ue.set(n,n),n}static getSubscribablePromise(e){return ue.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(he);try{return await Promise.race(t)}finally{for(const e of t)e.unsubscribe()}}};function he(e){return ye.proxy(e).then((()=>[e]))}function be(e,t){const n=e,r=n[Symbol.dispose];return n[Symbol.dispose]=()=>{t(),null==r||r()},n}function ge(e,t){const n=e,r=n[Symbol.asyncDispose];return n[Symbol.asyncDispose]=async()=>{await t(),await(null==r?void 0:r())},n}null!==(pe=(de=Symbol).dispose)&&void 0!==pe||(de.dispose=Symbol()),null!==(me=(fe=Symbol).asyncDispose)&&void 0!==me||(fe.asyncDispose=Symbol());const ve=Symbol();function we(e){let t=null;return be({start(){if(t)throw new Error("Timer already started");return new Promise((n=>{t=setTimeout((()=>n(ve)),e)}))}},(()=>{t&&clearTimeout(t)}))}var _e=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/usingCtx.js"(e,t){t.exports=function(){var e="function"==typeof SuppressedError?SuppressedError:function(e,t){var n=Error();return n.name="SuppressedError",n.error=e,n.suppressed=t,n},t={},n=[];function r(e,t){if(null!=t){if(Object(t)!==t)throw new TypeError("using declarations can only be used with objects, functions, null, or undefined.");if(e)var r=t[Symbol.asyncDispose||Symbol.for("Symbol.asyncDispose")];if(void 0===r&&(r=t[Symbol.dispose||Symbol.for("Symbol.dispose")],e))var o=r;if("function"!=typeof r)throw new TypeError("Object is not disposable.");o&&(r=function(){try{o.call(t)}catch(e){return Promise.reject(e)}}),n.push({v:t,d:r,a:e})}else e&&n.push({d:t,a:e});return t}return{e:t,u:r.bind(null,!1),a:r.bind(null,!0),d:function(){var r,o=this.e,a=0;function i(){for(;r=n.pop();)try{if(!r.a&&1===a)return a=0,n.push(r),Promise.resolve().then(i);if(r.d){var e=r.d.call(r.v);if(r.a)return a|=2,Promise.resolve(e).then(i,s)}else a|=1}catch(e){return s(e)}if(1===a)return o!==t?Promise.reject(o):Promise.resolve();if(o!==t)throw o}function s(n){return o=o!==t?new e(n,o):n,i()}return i()}}},t.exports.__esModule=!0,t.exports.default=t.exports}}),xe=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/OverloadYield.js"(e,t){t.exports=function(e,t){this.v=e,this.k=t},t.exports.__esModule=!0,t.exports.default=t.exports}}),Ee=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/awaitAsyncGenerator.js"(e,t){var n=xe();t.exports=function(e){return new n(e,0)},t.exports.__esModule=!0,t.exports.default=t.exports}}),Se=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/wrapAsyncGenerator.js"(e,t){var n=xe();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}}),ke=C(_e(),1),Oe=C(Ee(),1),Ce=C(Se(),1);function Me(e){const t=e[Symbol.asyncIterator]();return t[Symbol.asyncDispose]?t:ge(t,(async()=>{var e;await(null===(e=t.return)||void 0===e?void 0:e.call(t))}))}function Ne(){return(Ne=(0,Ce.default)((function*(e,t){try{var n=(0,ke.default)();const r=n.a(Me(e)),o=n.u(we(t.maxDurationMs)).start();let a;for(;;){if(a=yield(0,Oe.default)(ye.race([r.next(),o])),a===ve&&ae(),a.done)return a;yield a.value,a=null}}catch(e){n.e=e}finally{yield(0,Oe.default)(n.d())}}))).apply(this,arguments)}function Te(){return(Te=(0,Ce.default)((function*(e,t){try{var n=(0,ke.default)();const r=n.a(Me(e));let o;const a=n.u(we(t.gracePeriodMs));let i=t.count,s=new Promise((()=>{}));for(;;){if(o=yield(0,Oe.default)(ye.race([r.next(),s])),o===ve&&ae(),o.done)return o.value;yield o.value,0==--i&&(s=a.start()),o=null}}catch(e){n.e=e}finally{yield(0,Oe.default)(n.d())}}))).apply(this,arguments)}function Be(){let e,t;return{promise:new Promise(((n,r)=>{e=n,t=r})),resolve:e,reject:t}}var Pe=C(_e(),1),$e=C(Ee(),1),Ie=C(Se(),1);function Ae(){let e="idle",t=Be();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,Ie.default)((function*(){try{var i=(0,Pe.default)();if("idle"!==e)throw new Error("Cannot iterate twice");e="pending";i.a(ge({},(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,$e.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=Be()}}catch(e){i.e=e}finally{yield(0,$e.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 Ue=C(_e(),1),je=C(Ee(),1),qe=C(Se(),1);const Le=Symbol("ping");function Fe(e,t){return De.apply(this,arguments)}function De(){return(De=(0,qe.default)((function*(e,t){try{var n=(0,Ue.default)();const o=n.a(Me(e));let a,i=o.next();for(;;)try{var r=(0,Ue.default)();const e=r.u(we(t));if(a=yield(0,je.default)(ye.race([i,e.start()])),a===ve){yield Le;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,je.default)(n.d())}}))).apply(this,arguments)}var ze=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/asyncIterator.js"(e,t){function n(e){function t(e){if(Object(e)!==e)return Promise.reject(new TypeError(e+" is not an object."));var t=e.done;return Promise.resolve(e.value).then((function(e){return{value:e,done:t}}))}return(n=function(e){this.s=e,this.n=e.next}).prototype={s:null,n:null,next:function(){return t(this.n.apply(this.s,arguments))},return:function(e){var n=this.s.return;return void 0===n?Promise.resolve({value:e,done:!0}):t(n.apply(this.s,arguments))},throw:function(e){var n=this.s.return;return void 0===n?Promise.reject(e):t(n.apply(this.s,arguments))}},new n(e)}t.exports=function(e){var t,r,o,a=2;for("undefined"!=typeof Symbol&&(r=Symbol.asyncIterator,o=Symbol.iterator);a--;){if(r&&null!=(t=e[r]))return t.call(e);if(o&&null!=(t=e[o]))return new n(t.call(e));r="@@asyncIterator",o="@@iterator"}throw new TypeError("Object is not async iterable")},t.exports.__esModule=!0,t.exports.default=t.exports}}),Ge=C(Ee(),1),He=C(Se(),1),Ve=C(_e(),1),Je=C(ze(),1);const Ke=0,Ye=1,Qe=0,We=1,Ze=0,Xe=1,et=2;function tt(e){return(y(e)||"function"==typeof e)&&"function"==typeof(null==e?void 0:e.then)&&"function"==typeof(null==e?void 0:e.catch)}var nt=class extends Error{constructor(e){super("Max depth reached at path: "+e.join(".")),this.path=e}};function rt(){return rt=(0,He.default)((function*(e){const{data:t}=e;let n=0;const r=0,o=Ae();function a(e){const t=n++,r=e(t);return o.add(r),t}function i(t,n){return a(function(){var r=(0,He.default)((function*(r){const o=l(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,Ge.default)(t);yield[r,Qe,c(e,n)]}catch(t){var a,i;null===(a=e.onError)||void 0===a||a.call(e,{error:t,path:n}),yield[r,We,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 s(t,n){return a(function(){var r=(0,He.default)((function*(r){try{var o=(0,Ve.default)();const s=l(n);if(s)throw s;const u=o.a(Me(t));try{for(;;){const e=yield(0,Ge.default)(u.next());if(e.done){yield[r,Ze,c(e.value,n)];break}yield[r,Xe,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,et,null===(i=e.formatError)||void 0===i?void 0:i.call(e,{error:t,path:n})]}}catch(e){o.e=e}finally{yield(0,Ge.default)(o.d())}}));return function(e){return r.apply(this,arguments)}}())}function l(t){return e.maxDepth&&t.length>e.maxDepth?new nt(t):null}function u(t,n){if(tt(t))return[Ke,i(t,n)];if(b(t)){if(e.maxDepth&&n.length>=e.maxDepth)throw new Error("Max depth reached");return[Ye,s(t,n)]}return null}function c(e,t){if(void 0===e)return[[]];const n=u(e,t);if(n)return[[r],[null,...n]];if(!1===ie(o=e)||void 0!==(a=o.constructor)&&(!1===ie(i=a.prototype)||!1===i.hasOwnProperty("isPrototypeOf")))return[[e]];var o,a,i;const s={},l=[];for(const[n,o]of Object.entries(e)){const e=u(o,[...t,n]);e?(s[n]=r,l.push([n,...e])):s[n]=o}return[[s],...l]}const d={};for(const[e,n]of Object.entries(t))d[e]=c(n,[e]);yield d;let p=o;e.pingMs&&(p=Fe(o,e.pingMs));var f,m=!1,y=!1;try{for(var h,g=(0,Je.default)(p);m=!(h=yield(0,Ge.default)(g.next())).done;m=!1){const e=h.value;yield e}}catch(e){y=!0,f=e}finally{try{m&&null!=g.return&&(yield(0,Ge.default)(g.return()))}finally{if(y)throw f}}})),rt.apply(this,arguments)}function ot(e){let t=Re(function(e){return rt.apply(this,arguments)}(e));const{serialize:n}=e;return n&&(t=t.pipeThrough(new TransformStream({transform(e,t){e===Le?t.enqueue(Le):t.enqueue(n(e))}}))),t.pipeThrough(new TransformStream({transform(e,t){e===Le?t.enqueue(" "):t.enqueue(JSON.stringify(e)+"\n")}})).pipeThrough(new TextEncoderStream)}Error;var at=O({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/asyncGeneratorDelegate.js"(e,t){var n=xe();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}}),it=C(ze(),1),st=C(Ee(),1),lt=C(Se(),1),ut=C(at(),1);C(_e(),1);const ct="ping",dt="serialized-error",pt="connected",ft="return";function mt(e){var t,n,r,o,a;const{serialize:i=v}=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 u(){return u=(0,lt.default)((function*(){yield{event:pt,data:JSON.stringify(l)};let t,n,r=e.data;e.emitAndEndImmediately&&(r=function(e,t){return Te.apply(this,arguments)}(r,{count:1,gracePeriodMs:1})),e.maxDurationMs&&e.maxDurationMs>0&&e.maxDurationMs!==1/0&&(r=function(e,t){return Ne.apply(this,arguments)}(r,{maxDurationMs:e.maxDurationMs})),s.enabled&&s.intervalMs!==1/0&&s.intervalMs>0&&(r=Fe(r,s.intervalMs));var o,a=!1,u=!1;try{for(var c,d=(0,it.default)(r);a=!(c=yield(0,st.default)(d.next())).done;a=!1)t=c.value,t!==Le?(n=J(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){u=!0,o=e}finally{try{a&&null!=d.return&&(yield(0,st.default)(d.return()))}finally{if(u)throw o}}})),u.apply(this,arguments)}function c(){return c=(0,lt.default)((function*(){try{yield*(0,ut.default)((0,it.default)(function(){return u.apply(this,arguments)}())),yield{event:ft,data:""}}catch(r){var t,n;if(oe(r))return;const o=L(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:dt,data:JSON.stringify(i(a))}}})),c.apply(this,arguments)}const d=Re(function(){return c.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 yt={"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform","X-Accel-Buffering":"no",Connection:"keep-alive"};var ht=C(Se(),1),bt=C(A(),1);function gt(e){return g((0,ht.default)((function*(){throw e})))}const vt={mutation:["POST"],query:["GET"],subscription:["GET"]},wt={mutation:["POST"],query:["GET","POST"],subscription:["GET","POST"]};function _t(e){var t,n,r;const{ctx:o,info:a,responseMeta:i,untransformedJSON:s,errors:l=[],headers:u}=e;let c=s?function(e){const t=Array.isArray(e)?e:[e],n=new Set(t.map((e=>{var t;return"error"in e&&y(e.error.data)?"number"==typeof(null===(t=e.error.data)||void 0===t?void 0:t.httpStatus)?e.error.data.httpStatus:N(m[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],f=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(f.headers)if(f.headers instanceof Headers)for(const[e,t]of f.headers.entries())u.append(e,t);else for(const[e,t]of Object.entries(f.headers))if(Array.isArray(t))for(const n of t)u.append(e,n);else"string"==typeof t&&u.set(e,t);return f.status&&(c=f.status),{status:c}}function xt(e){return!!y(e)&&(!!b(e)||(Object.values(e).some(tt)||Object.values(e).some(b)))}async function Et(e){var t,n,r,o,a,i;const{router:s,req:l}=e,u=new Headers([["vary","trpc-accept"]]),c=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,f=null!==(o=e.allowMethodOverride)&&void 0!==o&&o&&"POST"===l.method,m=await g((async()=>{try{return[void 0,await re({req:l,path:decodeURIComponent(e.path),router:s,searchParams:d.searchParams,headers:e.req.headers,url:d})]}catch(e){return[L(e),void 0]}})),y=g((()=>{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=[L(e),void 0]}}}})),h=f?wt:vt,v="application/jsonl"===l.headers.get("trpc-accept"),w=null===(a=null===(i=c.sse)||void 0===i?void 0:i.enabled)||void 0===a||a;try{const[t,n]=m;if(t)throw t;if(n.isBatchCall&&!p)throw new F({code:"BAD_REQUEST",message:"Batching is not enabled on the server"});if(v&&!n.isBatchCall)throw new F({message:"Streaming requests must be batched (you can do a batch of 1)",code:"BAD_REQUEST"});await y.create(n);const r=n.calls.map((async t=>{const r=t.procedure;try{if(e.error)throw e.error;if(!r)throw new F({code:"NOT_FOUND",message:`No procedure found on path "${t.path}"`});if(!h[r._def.type].includes(l.method))throw new F({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 F({code:"BAD_REQUEST",message:"Cannot batch subscription calls"});return[void 0,{data:await r({path:t.path,getRawInput:t.getRawInput,ctx:y.value(),type:r._def.type,signal:e.req.signal})}]}catch(n){var o,a,i;const r=L(n),s=t.result();return null===(o=e.onError)||void 0===o||o.call(e,{error:r,path:t.path,input:s,ctx:y.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(u.set("content-type","application/json"),xt(null==a?void 0:a.data))throw new F({code:"UNSUPPORTED_MEDIA_TYPE",message:"Cannot use stream-like response in non-streaming request - use httpBatchStreamLink"});const r=o?{error:U({config:c,ctx:y.valueOrUndefined(),error:o,input:t.result(),path:t.path,type:n.type})}:{result:{data:a.data}},i=_t({ctx:y.valueOrUndefined(),info:n,responseMeta:e.responseMeta,errors:o?[o]:[],headers:u,untransformedJSON:[r]});return new Response(JSON.stringify(G(c,r)),{status:i.status,headers:u})}case"subscription":{const r=g((()=>{if(o)return gt(o);if(!w)return gt(new F({code:"METHOD_NOT_SUPPORTED",message:'Missing experimental flag "sseSubscriptions"'}));if(!K(a.data)&&!b(a.data))return gt(new F({message:`Subscription ${t.path} did not return an observable or a AsyncGenerator`,code:"INTERNAL_SERVER_ERROR"}));return K(a.data)?W(a.data,e.req.signal):a.data})),i=mt((0,bt.default)((0,bt.default)({},c.sse),{},{data:r,serialize:e=>c.transformer.output.serialize(e),formatError(n){var r,o,a;const i=L(n.error),s=null==t?void 0:t.result(),l=null==t?void 0:t.path,u=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:y.valueOrUndefined(),req:e.req,type:u});return U({config:c,ctx:y.valueOrUndefined(),error:i,input:s,path:l,type:u})}}));for(const[e,t]of Object.entries(yt))u.set(e,t);const s=_t({ctx:y.valueOrUndefined(),info:n,responseMeta:e.responseMeta,errors:[],headers:u,untransformedJSON:null});return new Response(i,{headers:u,status:s.status})}}}if("application/jsonl"===n.accept){u.set("content-type","application/json"),u.set("transfer-encoding","chunked");const t=_t({ctx:y.valueOrUndefined(),info:n,responseMeta:e.responseMeta,errors:[],headers:u,untransformedJSON:null}),o=ot((0,bt.default)((0,bt.default)({},c.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:U({config:c,ctx:y.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=K(o.data)?W(o.data,e.req.signal):Promise.resolve(o.data);return{result:Promise.resolve({data:l})}})),serialize:e=>c.transformer.output.serialize(e),onError:t=>{var r,o;null===(r=e.onError)||void 0===r||r.call(e,{error:L(t),path:void 0,input:void 0,ctx:y.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=L(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 U({config:c,ctx:y.valueOrUndefined(),error:a,input:i,path:s,type:l})}}));return new Response(o,{headers:u,status:t.status})}u.set("content-type","application/json");const o=(await Promise.all(r)).map((e=>{const[t,n]=e;return t?e:xt(n.data)?[new F({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:U({config:c,ctx:y.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=_t({ctx:y.valueOrUndefined(),info:n,responseMeta:e.responseMeta,untransformedJSON:a,errors:i,headers:u});return new Response(JSON.stringify(G(c,a)),{status:s.status,headers:u})}catch(t){var _;const[n,r]=m,o=y.valueOrUndefined(),{error:a,untransformedJSON:i,body:s}=function(e,t){const{router:n,req:r,onError:o}=t.opts,a=L(e);null==o||o({error:a,path:t.path,input:t.input,ctx:t.ctx,type:t.type,req:r});const i={error:U({config:n._def._config,error:a,type:t.type,path:t.path,input:t.input,ctx:t.ctx})},s=G(n._def._config,i);return{error:a,untransformedJSON:i,body:JSON.stringify(s)}}(t,{opts:e,ctx:y.valueOrUndefined(),type:null!==(_=null==r?void 0:r.type)&&void 0!==_?_:"unknown"}),l=_t({ctx:o,info:r,responseMeta:e.responseMeta,untransformedJSON:i,errors:[a],headers:u});return new Response(s,{status:l.status,headers:u})}}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 F({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 Ot(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 F({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 Ct(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(oe(e))return;throw e}}var Mt=C(A(),1);function Nt(e){return t=>{var n;const{res:r,req:o}=e,a=L(t),i=U({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=G(e.router._def._config,{error:i});r.statusCode=i.data.httpStatus,r.end(JSON.stringify(s))}}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=>{g((async()=>{var n;const r=Ot(e.req,e.res,{maxBodySize:null!==(n=e.maxBodySize)&&void 0!==n?n:null}),o=await Et((0,Mt.default)((0,Mt.default)({},e),{},{req:r,error:t?L(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 Ct({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(Nt(e))}))}))}const Bt=t(import.meta.url)("http");var Pt=C(A(),1);function $t(e){var t;const n=(null!==(t=e.basePath)&&void 0!==t?t:"/").length;return(t,r)=>{let o="";g((async()=>{const a=St(t);o=a.pathname.slice(n),await Tt((0,Pt.default)((0,Pt.default)({},e),{},{req:t,res:r,path:o}))})).catch(Nt((0,Pt.default)({req:t,res:r,path:o},e)))}}function It(e){return Bt.createServer(function(e){return $t(e)}(e))}const At=(e=>{var t={};return c.d(t,e),t})({z:()=>n.z}),Rt=t(import.meta.url)("node:path"),Ut=t(import.meta.url)("node:os"),jt=t(import.meta.url)("node:fs/promises"),qt=t(import.meta.url)("node:crypto");const Lt=(e=>{var t={};return c.d(t,e),t})({gguf:()=>r.gguf});const Ft=(e=>{var t={};return c.d(t,e),t})({getBackendDevicesInfo:()=>o.getBackendDevicesInfo,isLibVariantAvailable:()=>o.isLibVariantAvailable,loadModel:()=>o.loadModel}),Dt=(e,t,n)=>Math.min(Math.max(e,t),n),zt=e=>e?40:0,Gt=(e=0)=>{if(!e)return 0;return Dt(e/12884901888*20,0,20)},Ht=(e=0)=>{if(!e)return 0;return Dt(e/34359738368*10,0,10)},Vt=e=>e?10:0,Jt=(e="default",t=null)=>{const n=String(e).toLowerCase();if(!n)return 0;if(n.includes("cuda"))return 20;if(n.includes("vulkan"))return 10;if(n.includes("default")){return"darwin"===t||"ios"===t?15:5}return 0},Kt=({platform:e,variant:t,hasGpu:n,gpuUsableBytes:r=0,cpuUsableBytes:o=0,ok:a=!0}={})=>{if(!a)return 0;const i=zt(n)+Jt(t,e)+Gt(r),s=Ht(o),l=Vt(a);return Math.min(100,Math.round(i+s+l))},Yt=["cuda","vulkan","snapdragon","default"],Qt=e=>e||0===e?Array.isArray(e)?e.filter((e=>null!=e)):[e]:[],Wt=e=>e&&String(e).trim().toLowerCase()||null,Zt=(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"))))},Xt=({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)),u=l.some(Zt),c=l.filter((e=>Zt(e)&&Number.isFinite(Number(e.maxMemorySize)))).reduce(((e,t)=>e+t.maxMemorySize),0),d=t,p=u?Math.floor(c*o):0,f=d?Math.floor(d*a):0,m={platform:e,variant:n,hasGpu:u,gpuUsableBytes:p,cpuUsableBytes:f,ok:i},y=Kt(m),h=i?(({platform:e,variant:t,hasGpu:n,gpuUsableBytes:r=0,cpuUsableBytes:o=0,ok:a=!0}={})=>({gpuPresence:zt(n),variant:Jt(t,e),gpuMemory:Gt(r),cpuMemory:Ht(o),availability:Vt(a)}))(m):null;return{platform:e,ok:i,variant:n,hasGpu:u,devices:l,gpuTotalBytes:c,gpuUsableBytes:p,cpuTotalBytes:d,cpuUsableBytes:f,score:y,breakdown:h,error:s,timestamp:(new Date).toISOString()}},en=({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}},tn="ggml-llm",nn=new Map([[tn,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:u=null,limitedKvCacheBytes:c=null,dependencies:d={}}={})=>{const{getBackendDevicesInfo:p,isLibVariantAvailable:f}=d;if("function"!=typeof p||"function"!=typeof f)throw new TypeError("GGML capability detection requires getBackendDevicesInfo and isLibVariantAvailable functions");const m=(({variant:e,preferVariants:t=[],variantPreference:n=[]}={})=>{const r=[];e&&r.push(e),r.push(...Qt(t)),r.push(...Qt(n)),r.push(...Yt);const o=r.map(Wt).filter(Boolean);return Array.from(new Set(o))})({variant:t,preferVariants:n,variantPreference:r}),y=[];for(const t of m)try{if(!await f(t))throw new Error(`Variant ${t} not available on this platform`);const n=await p(t);y.push(Xt({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(Xt({platform:e,totalMemoryInBytes:s,variant:t,devices:[],gpuMemoryFraction:o,cpuMemoryFraction:a,ok:!1,error:r}))}const h=y.filter((e=>e.ok)),b=h.find((e=>e.hasGpu))||h.find((e=>"default"===e.variant))||h[0]||null,g={ok:Boolean(b),selected:b?{...b,breakdown:i?b.breakdown:void 0}:null,attempts:y};if(!i&&g.selected&&delete g.selected.breakdown,!g||!l&&!u)return g;const v=e=>{if(!e)return e;const t=en({device:e,modelBytes:l||0,kvCacheBytes:u||0});let n=null;return null!=c&&c!==u&&(n=en({device:e,modelBytes:l||0,kvCacheBytes:c})),{...e,fit:t,...n&&{limitedFit:n}}};return g.selected=v(g.selected),g.attempts=Array.isArray(g.attempts)?g.attempts.map(v):g.attempts,g}]]),rn=async({platform:e,totalMemoryInBytes:t,backend:n=tn,dependencies:r,...o}={})=>{const a=nn.get(n);if(!a)throw new Error(`No capability detector registered for backend "${n}"`);return await a({...o,dependencies:r,totalMemoryInBytes:t,platform:e})},on={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},an=e=>{const t=e?String(e).toLowerCase():"f16";return on[t]||on.f16},sn=e=>e?String(e).trim().toLowerCase():null,ln=({arch:e,nLayer:t=0})=>({arch:sn(e),enabled:!1,window:null,pattern:null,denseFirst:!1,type:null,kvLayers:Math.max(0,Math.floor(Number(t)||0)),swaLayers:0}),un=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"}]]),cn=({arch:e,metadata:t={},nLayer:n=0}={})=>{const r=sn(e||t["general.architecture"]),o=Math.max(0,Math.floor(Number(n)||0)),a=((e={},t=null)=>{if(!e)return null;const n=sn(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?un.get(r):null;if(!i)return ln({arch:r,nLayer:n});const s=i({nLayer:o,nSwa:a,metadata:t});if(!s||!s.enabled||!s.window||s.window<=0)return ln({arch:r,nLayer:n});const l=Math.max(0,Math.floor(Number(s.pattern)||0)),u=null!=s.kvLayers&&Number.isFinite(Number(s.kvLayers))?Number(s.kvLayers):o,c=Math.max(0,Math.floor(u)),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))})(c,l,Boolean(s.denseFirst));return{arch:r,enabled:d>0,window:s.window,pattern:l,denseFirst:Boolean(s.denseFirst),type:s.type||"standard",kvLayers:c,swaLayers:d}},dn=(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}},pn=({layerCount:e,headKvCount:t,embdHeadKCount:n,embdHeadVCount:r,cacheTypes:o,swaConfig:a,kvUnified:i=!1,nParallel:s=1,swaFull:l=!1})=>{const u=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:u=1,swaAdditionalTokens:c=0,swaFull:d=!1}={})=>{if(!(e&&t&&n&&r&&o))return 0;const p=Number(null!=i&&void 0!==i?i:e),f=Math.max(0,Math.floor(p));if(!f)return 0;const m=an(a.k),y=an(a.v),h=Number(n)*(Number(r)*m+Number(o)*y);if(!h)return 0;const b=Math.max(0,Number(t)||0),g=Math.min(f,Math.max(0,Math.floor(Number(s)||0))),v=Math.max(0,f-g),w=(null!=l&&Number.isFinite(Number(l))?Math.max(0,Number(l)):b)*Math.max(1,Number(u)||1)+Math.max(0,Number(c)||0),_=d?b:Math.min(b,w),x=v*b+g*Math.max(0,Math.floor(_));return Math.round(h*x)})(e,i,t,n,r,o,{totalLayers:e,swaLayers:a?.swaLayers||0,swaContext:a?.window,swaFull:l,swaContextMultiplier:u})},fn=({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},mn=t(import.meta.url)("node:stream/web");var yn=c.t(mn,2);const hn="undefined"!=typeof globalThis&&globalThis.ReadableStream&&globalThis.WritableStream?{ReadableStream:globalThis.ReadableStream,WritableStream:globalThis.WritableStream}:yn,{ReadableStream:bn,WritableStream:gn}=hn,vn=new TextEncoder,wn=(e={},t={})=>(Object.entries(t||{}).forEach((([t,n])=>{n&&"object"==typeof n&&!Array.isArray(n)?(e[t]&&"object"==typeof e[t]||(e[t]={}),wn(e[t],n)):e[t]=n})),e),_n="https://huggingface.co",xn="https://huggingface.co/api",En=Rt.join(Ut.homedir(),".buttress","models"),Sn=["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"],kn=.5,On={backend:{type:"ggml-llm",variant:null,variant_preference:["cuda","vulkan","snapdragon","default"],gpu_memory_fraction:.85,cpu_memory_fraction:kn},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_k_type:"f16",cache_v_type:"f16",ctx_shift:!1,kv_unified:!1,swa_full:!1,allow_local_file:!1,local_path:null,api_base:xn,base_url:_n},runtime:{cache_dir:En,prefer_variants:[],huggingface_token:process.env.HUGGINGFACE_TOKEN||null,http_headers:{}}},Cn=(e,t=[])=>e||0===e?Array.isArray(e)?e.filter((e=>null!=e)):[e]:[...t],Mn=e=>{if(!e)return null;const t=String(e).toLowerCase();return["cuda","vulkan","snapdragon","default"].includes(t)?t:null},Nn=(e={})=>{const t=JSON.parse(JSON.stringify(On));if(wn(t,e),t.backend.variant=Mn(t.backend.variant),t.backend.variant_preference=Array.from(new Set(Cn(t.backend.variant_preference).map(Mn).filter(Boolean))),0===t.backend.variant_preference.length&&(t.backend.variant_preference=["cuda","vulkan","snapdragon","default"]),t.runtime.prefer_variants=Array.from(new Set(Cn(t.runtime.prefer_variants).map(Mn).filter(Boolean))),t.model.preferred_quantizations=Array.from(new Set(Cn(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||xn,t.runtime.cache_dir=t.runtime.cache_dir?Rt.resolve(t.runtime.cache_dir):En,t},Tn=e=>{const t=e.toLowerCase();return Sn.find((e=>t.includes(e)))||null},Bn=async e=>{await(0,jt.mkdir)(e,{recursive:!0})},Pn=(e,t,n=En)=>{const r=(0,qt.createHash)("sha256").update(e).digest("hex");return Rt.join(((e=En)=>Rt.join(e,".metadata-cache"))(n),t,`${r}.json`)},$n=async(e,t,n=En)=>{try{const r=Pn(e,t,n),o=await(0,jt.readFile)(r,"utf-8");return console.log(`[Cache] Hit ${t} cache:`,Rt.basename(r)),JSON.parse(o,((e,t)=>"string"==typeof t&&t.startsWith("__bigint__")?BigInt(t.slice(10)):t))}catch(e){return null}},In=async(e,t,n,r=En)=>{try{const o=Pn(e,t,r);await Bn(Rt.dirname(o)),await(0,jt.writeFile)(o,JSON.stringify(n,((e,t)=>"bigint"==typeof t?`__bigint__${t.toString()}`:t)),"utf-8"),console.log(`[Cache] Wrote ${t} cache:`,Rt.basename(o))}catch(e){console.warn(`[Cache] Failed to write ${t} cache:`,e.message)}},An=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()},Rn=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},Un=async(e,t,n=En)=>{const r=JSON.stringify({url:e,headers:t}),o=await $n(r,"range-metadata",n);if(o)return o;const a=!/^https?:/i.test(e),{metadata:i}=await(0,Lt.gguf)(e,{fetch,additionalFetchHeaders:t,allowLocalFile:a});return await In(r,"range-metadata",i,n),i},jn=async(e,t)=>{try{const n=await(0,jt.stat)(e);return!t||n.size===t}catch(e){return!1}},qn=async(e,t,n,r,o)=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");await Bn(Rt.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,jt.open)(n,"w"),s=Number(a.headers.get("content-length"))||r||0;let l=0,u=.05;try{await a.body.pipeTo(new gn({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>=u;)o(u),u+=.05}},async close(){await i.close(),"function"==typeof o&&o(1)},async abort(e){throw await i.close().catch((()=>{})),await(0,jt.unlink)(n).catch((()=>{})),e}}))}catch(e){throw await i.close().catch((()=>{})),await(0,jt.unlink)(n).catch((()=>{})),e}if(r){const e=await(0,jt.stat)(n);if(e.size!==r)throw await(0,jt.unlink)(n).catch((()=>{})),new Error(`Downloaded file size mismatch, expected ${r} got ${e.size}`)}},Ln=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 $n(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 Rn(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 In(o,"artifact-info",l,r),l}let{filename:s}=e.model,l=e.model.quantization&&String(e.model.quantization).toLowerCase();const u=await An(`${e.model.api_base}/models/${t}?revision=${n}&blobs=true`,{headers:i}),c=(u?.siblings||u?.files||[]).map((e=>e.rfilename||e.path||e.filename)).filter((e=>"string"==typeof e&&e.endsWith(".gguf")));if(0===c.length)throw new Error(`No GGUF artifacts found in repo ${t}`);const d=e.model.preferred_quantizations.length>0?e.model.preferred_quantizations:Sn;if(s)l||(l=Tn(s));else{const e=(()=>{const e=d.find((e=>c.find((t=>t.toLowerCase().includes(e)))));if(e)return{filename:c.find((t=>t.toLowerCase().includes(e))),quantization:e};return null})()||{filename:c[0],quantization:null},{filename:t,quantization:n}=e;s=t,l=n||Tn(s)}const p=`${e.model.base_url.replace(/\/+$/,"")}/${t}/resolve/${n}/${s}`,f=/-(\d{5})-of-(\d{5})\.gguf$/,m=s.match(f);let y=null;if(m){const[,,r]=m,o=await An(`${e.model.api_base}/models/${t}?revision=${n}&blobs=true`,{headers:i}),a=o?.siblings||o?.files||[],l=Number(r);y=0;for(let e=1;e<=l;e+=1){const t=String(e).padStart(5,"0"),n=s.replace(f,`-${t}-of-${r}.gguf`),o=a.find((e=>(e.rfilename||e.path||e.filename)===n)),i=Number(o?.size);Number.isFinite(i)&&i>0&&(y+=i)}}else{const e=await Rn(p,{headers:i});y=Number(e.headers.get("content-length"))||null}const h={repoId:t,revision:n,filename:s,url:p,size:y,quantization:l,headers:i,isSplit:Boolean(m),splitCount:m?Number(m[2]):0};return await In(o,"artifact-info",h,r),h},Fn=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(Mn).filter(Boolean)))})(e),[o,...a]=r,i=null!=e.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.gpu_memory_fraction))):On.backend.gpu_memory_fraction||1,s=null!=e.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.cpu_memory_fraction))):kn,l=await rn({platform:process.platform,totalMemoryInBytes:Ut.totalmem(),backend:"ggml-llm",variant:o||null,preferVariants:a,gpuMemoryFraction:i,cpuMemoryFraction:s,dependencies:{getBackendDevicesInfo:Ft.getBackendDevicesInfo,isLibVariantAvailable:Ft.isLibVariantAvailable},modelBytes:t,kvCacheBytes:n}),u=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(!l.ok||!l.selected){const e=(l.attempts||[]).map((e=>`${e.variant}: ${e.error||"unknown error"}`)).join("; ");throw new Error(`Unable to initialize any backend variant (${r.join(", ")}). Errors: ${e}`)}const c=(l.attempts||[]).map(u);return{selected:u(l.selected),attempts:c}},Dn=async e=>{const t=await Ln(e),n=await Un(t.url,t.headers,e.runtime.cache_dir),{arch:r,nCtxTrain:o,nLayer:a,nEmbd:i,nHead:s,nHeadKv:l,nEmbdHeadK:u,nEmbdHeadV:c,quantVersion:d,fileType:p}=dn(n),f=Number.isFinite(Number(a))?Number(a):0,m=Number.isFinite(Number(i))?Number(i):0,y=Number.isFinite(Number(s))?Number(s):0,h=Number.isFinite(Number(l))?Number(l):y,b=y>0&&m>0?m/y:128,g=Number.isFinite(Number(u))?Number(u):b,v=Number.isFinite(Number(c))?Number(c):b,w=cn({arch:r,metadata:n,nLayer:f}),_=w&&Number.isFinite(Number(w.kvLayers))?Number(w.kvLayers):f,x=Math.max(0,Math.floor(Number(_)||0)),E=e.model.n_ctx?Number(e.model.n_ctx):null;let S=E||o||4096;const k=[],O=[];let C=!0;if(E&&o&&E>o){C=!1;const e=`Requested context length (${E}) exceeds model training context (${o})`;k.push(e),O.push(e),S=o}E&&!o&&k.push("Model metadata missing training context length, using requested value");const M={k:e.model.cache_k_type,v:e.model.cache_v_type},N=t.size>0?t.size:0,T=pn({layerCount:x,headKvCount:h,embdHeadKCount:g,embdHeadVCount:v,cacheTypes:M,swaConfig:w,kvUnified:e.model.kv_unified,nParallel:e.model.n_parallel,swaFull:e.model.swa_full}),B=T(S),P=await Fn(e,{modelBytes:N,kvCacheBytes:B}),$=P.selected.totalMemory||0,I=$*(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))):kn,R=Math.max(0,Ut.totalmem()*A),U=P.selected.hasGpu?I:R,j=fn({maxCtx:S,availableMemory:U,modelBytes:N,kvBytesForCtx:T});if(!E&&j){const e=o?Math.min(j,o):j,t=Math.max(32,e);t<S&&k.push(`Context length capped to ${t} by memory limits`),S=t}S>j&&(S=j);const q=Math.floor(j);console.log(`[buttress] Memory-limited context length: ${q}`);const L=T(S),F=N+L,D=f?N/(f+1):N;let z,G=0;P.selected.hasGpu&&D>0&&(G=Math.min(f+1,Math.max(0,Math.floor(I/D)))),console.log(`[buttress] Auto GPU layer capacity (${P.selected.variant}): ${G}/${f+1}`),z="auto"===e.model.n_gpu_layers||null==e.model.n_gpu_layers?G:Math.max(0,Math.min(Number(e.model.n_gpu_layers)||0,f+1));const H=(()=>{const t=e.model.flash_attn&&String(e.model.flash_attn).toLowerCase();return"on"===t||"off"===t?t:P.selected.hasGpu?"auto":"off"})(),V=e.runtime.cache_dir,J=((e,t)=>{if(e.model.local_path)return Rt.resolve(e.model.local_path);const n=t.repoId.split("/"),r=Rt.join(e.runtime.cache_dir,...n,t.revision);return Rt.join(r,t.filename)})(e,t),K=await jn(J,t.size),Y={ok:C,backend:"ggml-llm",warnings:k,errors:O,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:f,n_embd:m,quantization_version:d,file_type:p,kv_layer_count:x,swa:w?.enabled?{window:w.window,pattern:w.pattern,dense_first:w.denseFirst,type:w.type,layers:w.swaLayers}:null}},runtime:{variant:P.selected.variant,n_ctx:S,requested_ctx:E,n_gpu_layers:z,n_parallel:e.model.n_parallel,n_batch:e.model.n_batch,flash_attn_type:H,cache_type_k:M.k,cache_type_v:M.v,ctx_shift:e.model.ctx_shift,kv_unified:e.model.kv_unified,swa_full:e.model.swa_full,estimated_max_n_ctx:q,auto_gpu_layers:G},resources:{modelBytes:N,kvCacheBytes:L,totalEstimatedBytes:F,gpuCapacityBytes:$,gpuUsableBytes:I,cpuUsableBytes:R,fit:P.selected.fit},devices:{selected:P.selected,attempts:P.attempts},download:{cacheDir:V,localPath:J,exists:K},timestamp:(new Date).toISOString()};return{config:e,info:Y,artifact:t,metadata:{arch:r,nCtxTrain:o,nLayer:f,nEmbd:m},devices:P,cacheTypes:M,localPath:J,localExists:K}},zn=(e,t)=>`event: ${e}\ndata: ${null==t?"":JSON.stringify(t)}\n\n`,Gn=(e,t)=>{let n;return new bn({async start(r){try{const o=await e.parallel.completion(t,((e,t)=>{t&&r.enqueue(vn.encode(zn("token",{requestId:e,...t})))})),{requestId:a}=o;n=o.stop;const i=await o.promise;console.log("[Completion] Result:",i),r.enqueue(vn.encode(zn("result",{requestId:a,...i}))),r.close()}catch(e){r.enqueue(vn.encode(zn("error",{message:e?.message||String(e)}))),r.error(e)}},cancel(){n&&n()}})},Hn=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)},Vn=async(e,t)=>{const n=Hn(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 n=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=Rt.dirname(o),i=a.splitCount;let s=0;for(let o=1;o<=i;o+=1){const l=String(o).padStart(5,"0"),u=a.filename.replace(e,`-${l}-of-${String(i).padStart(5,"0")}.gguf`),c=`${r.model.base_url.replace(/\/+$/,"")}/${a.repoId}/resolve/${a.revision}/${u}`,d=Rt.join(t,u);await jn(d)||await qn(c,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 await qn(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 o={model:n,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 a;"off"!==e.plan.info.runtime.flash_attn_type&&(o.cache_type_k=e.plan.info.runtime.cache_type_k,o.cache_type_v=e.plan.info.runtime.cache_type_v),console.log("[Context] Load Options:",o);try{if(a=await(0,Ft.loadModel)(o,(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 a.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=a,r.modelInfo=a.getModelInfo(),r}catch(e){if(a)try{a.release()}catch(e){}throw e}})(),e.contexts.set(n,r);try{return await r.ready,r}catch(t){throw e.contexts.delete(n),t}},Jn=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};const Kn=e=>{const t=Nn(e);return t.model.repo_id||t.model.repository||t.model.model||null};const Yn=e=>e?"number"==typeof e.score&&Number.isFinite(e.score)?Number(e.score):Kt(e):0;async function Qn(e=null,t={}){const{threshold:n=1.1,includeBreakdown:r=!1,config:o,...a}=t;let i=null,s=null,l=null,u=null,c=null,d=null;if(o)try{const{modelBytes:e,kvCacheBytes:t,limitedKvCacheBytes:n,memoryLimitedCtx:r,kvInfo:a,quantization:p}=await async function(e){const t=Nn(e),n=await Ln(t),r=await Un(n.url,n.headers,t.runtime.cache_dir),{arch:o,nCtxTrain:a,nLayer:i,nEmbd:s,nHead:l,nHeadKv:u,nEmbdHeadK:c,nEmbdHeadV:d,quantVersion:p,fileType:f}=dn(r),m=Number.isFinite(Number(i))?Number(i):0,y=Number.isFinite(Number(s))?Number(s):0,h=Number.isFinite(Number(l))?Number(l):0,b=Number.isFinite(Number(u))?Number(u):h,g=h>0&&y>0?y/h:128,v=Number.isFinite(Number(c))?Number(c):g,w=Number.isFinite(Number(d))?Number(d):g,_=cn({arch:o,metadata:r,nLayer:m}),x=_&&Number.isFinite(Number(_.kvLayers))?Number(_.kvLayers):m,E=Math.max(0,Math.floor(Number(x)||0)),S=(t.model.n_ctx?Number(t.model.n_ctx):null)||a||4096,k={k:t.model.cache_k_type,v:t.model.cache_v_type},O=n.size>0?n.size:0,C=pn({layerCount:E,headKvCount:b,embdHeadKCount:v,embdHeadVCount:w,cacheTypes:k,swaConfig:_,kvUnified:t.model.kv_unified,nParallel:t.model.n_parallel,swaFull:t.model.swa_full}),M=null!=t.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(t.backend.gpu_memory_fraction))):On.backend.gpu_memory_fraction||1,N=null!=t.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(t.backend.cpu_memory_fraction))):kn,T=C(S),B=await Fn(t,{modelBytes:O,kvCacheBytes:T}),P=(B.selected.totalMemory||0)*M,$=Math.max(0,Ut.totalmem()*N),I=B.selected.hasGpu?P:$,A=fn({maxCtx:S,availableMemory:I,modelBytes:O,kvBytesForCtx:C}),R=C(S),U=C(A);return{kvInfo:{nCtxTrain:a,nLayer:m,nEmbd:y,nHeadKv:b,nEmbdHeadK:v,nEmbdHeadV:w,nHeadCount:h,nHeadKvCount:b,kvLayerCount:E,swa:_?.enabled?{window:_.window,pattern:_.pattern,denseFirst:_.denseFirst,type:_.type,layers:_.swaLayers}:null},modelBytes:O,kvCacheBytes:R,limitedKvCacheBytes:U,memoryLimitedCtx:A,quantization:{fileType:f,version:p}}}(o);i=e,s=t,l=n,u=r,c=a,d=p}catch(e){}const p=null!=o?.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(o.backend.gpu_memory_fraction))):void 0,f=null!=o?.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(o.backend.cpu_memory_fraction))):void 0,m=await rn({...a,platform:process.platform,totalMemoryInBytes:Ut.totalmem(),backend:"ggml-llm",includeBreakdown:r,gpuMemoryFraction:p,cpuMemoryFraction:f,dependencies:{getBackendDevicesInfo:Ft.getBackendDevicesInfo,isLibVariantAvailable:Ft.isLibVariantAvailable},modelBytes:i,kvCacheBytes:s,limitedKvCacheBytes:l}),y=m.selected,h=Yn(y);y.modelBytes=i||null,y.kvCacheBytes=s||null,y.memoryLimitedCtx=u||null,y.limitedKvCacheBytes=l||null,y.kvInfo=c||null,y.quantization=d||null;let b=null,g=null;if(e){const t=Yn(e);g={...e,score:t};let r="buttress",o="buttress-higher-score";if(m.ok)if(t||0===t){const e=g.fit,a=g.limitedFit,i=y?.fit,s=y?.limitedFit,l=e?.fitsInGpu||e?.fitsInCpu||a?.fitsInGpu||a?.fitsInCpu,u=i?.fitsInGpu||i?.fitsInCpu||s?.fitsInGpu||s?.fitsInCpu;l&&!u?(r="local",o="client-fits-in-memory"):u&&!l?(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 r="buttress",o="missing-client-score";else r="local",o="buttress-unavailable";b={buttressScore:h,clientScore:t,threshold:n,recommendation:r,reason:o}}m.ok||b||(b={buttressScore:h,clientScore:e?.score??null,threshold:n,recommendation:"local",reason:"buttress-unavailable"});let v=null;return o&&(v={repoId:o.model?.repo_id||null,quantization:o.model?.quantization||null,nCtx:o.model?.n_ctx||null,cacheKType:o.model?.cache_k_type||"f16",cacheVType:o.model?.cache_v_type||"f16"}),{type:"ggml-llm",timestamp:(new Date).toISOString(),buttress:m,client:g,comparison:b,modelConfig:v}}const Wn=new Map,Zn=e=>{const t=(e=>{const t=Wn.get(e);if(!t)throw new Error(`Unknown generator id "${e}"`);return t})(e);if("ggml-llm"!==t.type)throw new Error(`Generator "${e}" does not support GGML LLM backend`);return t.instance};async function Xn(e,t){if("ggml-llm"!==e)throw new Error("Currently only GGML LLM backend is supported");const n=Kn(t);if(!n)throw new Error("Buttress generator config missing repo identifier");const r=`${e}:${n}`,o=Wn.get(r);if(o)return o.refCount+=1,{id:o.id,info:o.instance.info};const a=await async function(e,t){const n=await Dn(Nn(t)),r={id:e,type:"ggml-llm",config:t,plan:n,info:n.info,contexts:new Map,downloads:new Map};return{id:e,type:"ggml-llm",info:n.info,initContext:async(e={})=>{const{onProgress:t}=e,n=await Vn(r,t);return{modelInfo:n.modelInfo?{...n.modelInfo}:null,runtime:{...r.plan.info.runtime},download:{...r.plan.info.download}}},completion:async(e={})=>{const{options:t={}}=e,n=Hn(r),o=r.contexts.get(n);if(!o)throw new Error(`Context "${n}" not initialized`);return await o.ready,Gn(o.context,t)},tokenize:async(e={})=>{const{text:t="",params:n={}}=e,o=Hn(r),a=r.contexts.get(o);if(!a)throw new Error(`Context "${o}" not initialized`);await a.ready;const i=await a.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=Hn(r),o=r.contexts.get(n);if(!o)throw new Error(`Context "${n}" not initialized`);await o.ready;const a=t.map((e=>Number(e)));return o.context.detokenize(a)},applyChatTemplate:async(e={})=>{const{messages:t=[],template:n,params:o}=e,a=Hn(r),i=r.contexts.get(a);if(!i)throw new Error(`Context "${a}" not initialized`);return await i.ready,i.context.getFormattedChat(t,n,o)},releaseContext:async(e={})=>{const t=Hn(r),n=r.contexts.get(t);return!!n&&Jn(r,n,Boolean(e.force))},finalize:async()=>{const e=Array.from(r.contexts.values()).map((e=>Jn(r,e,!0)));await Promise.allSettled(e)}}}(r,t),i={id:r,type:a.type,instance:a,refCount:1};return Wn.set(r,i),{id:r,info:a.info}}async function er(e){const t=Wn.get(e);return!!t&&(t.refCount-=1,t.refCount<=0&&(await t.instance.finalize(),Wn.delete(e)),!0)}async function tr(e,t=null,n={}){if("ggml-llm"===e)return Qn(t,n);throw new Error(`Unknown backend type: ${e}`)}const nr={initContext:async(e,t)=>Zn(e).initContext(t),completion:async(e,t)=>Zn(e).completion(t),tokenize:async(e,t)=>Zn(e).tokenize(t),detokenize:async(e,t)=>Zn(e).detokenize(t),applyChatTemplate:async(e,t)=>Zn(e).applyChatTemplate(t),releaseContext:async(e,t)=>Zn(e).releaseContext(t)};function rr(e,t){return"ggml-llm"===e?Kn(t):null}const{version:or,name:ar}={version:"2.23.0-beta.22",name:"@fugood/buttress-server-poc"},ir=async()=>{const e=`https://registry.npmjs.org/${ar}/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}},sr=(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},lr=async()=>{try{const e=await ir();e&&sr(or,e)&&(e=>{console.log(""),console.log("╭─────────────────────────────────────────────────╮"),console.log("│ Update available! %s → %s",or.padEnd(12),e.padEnd(12),"│"),console.log("│ │"),console.log("│ Run to upgrade: │"),console.log("│ npm install -g %s │",ar.padEnd(27)),console.log("╰─────────────────────────────────────────────────╯"),console.log("")})(e)}catch(e){}},ur=t(import.meta.url)("node:fs"),cr=t(import.meta.url)("node:child_process");const dr=(e=>{var t={};return c.d(t,e),t})({default:()=>a.default}),pr=JSON.parse('{"UU":"@fugood/buttress-server-poc","rE":"2.23.0-beta.22"}');async function fr({modelIds:e=[],defaultConfig:t=null}={}){const n=[];console.log(`${pr.UU} v${pr.rE}`),console.log("Generating model capabilities comparison...\n"),n.push(`${pr.UU} v${pr.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},c=[];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:{...r?.model||{},repo_id:n}};const o=await tr("ggml-llm",null,{config:r,includeBreakdown:!0});c.push({modelId:n,capabilities:o,modelInfo:o.buttress?.selected||null,modelConfig:o.modelConfig||null})}const d=e=>e?(e/1024/1024/1024).toFixed(2):"N/A",p=e=>e?"✅":"🚫";n.push("| Model ID | Size (GB) | Context Size | KV Cache Size (GB) | Total Required Memory (GB) | Fits GPU (Full) | Fits CPU (Full) |"),n.push("|----------|-----------|--------------|--------------------|----------------------------|-----------------|-----------------|"),c.forEach((({modelId:e,modelInfo:t,modelConfig:r})=>{const o=d(t?.modelBytes),a=r?.nCtx||t?.kvInfo?.nCtxTrain||"N/A",i=pn(t),s=Number(a),l=t?.kvCacheBytes||(i&&Number.isFinite(s)&&s>0?i(s):i&&i(t?.kvInfo?.nCtxTrain||0))||null,u=d(l),c=d(t?.modelBytes&&l?t.modelBytes+l:t?.fit?.totalRequiredBytes),f=p(t?.fit?.fitsInGpu),m=p(t?.fit?.fitsInCpu);n.push(`| ${e} | ${o} | ${a} | ${u} | ${c} | ${f} | ${m} |`);if((null!=t?.memoryLimitedCtx||null!=t?.limitedFit)&&(!t?.fit?.fitsInGpu||!t?.fit?.fitsInCpu)){const e=t?.memoryLimitedCtx||a,r=Number(e),s=t?.limitedKvCacheBytes||i&&Number.isFinite(r)&&r>0&&i(r)||null,l=d(s),f=d(t?.modelBytes&&s?t.modelBytes+s:t?.limitedFit?.totalRequiredBytes),m=p(t?.limitedFit?.fitsInGpu),y=p(t?.limitedFit?.fitsInCpu);(e!==a||l!==u||f!==c)&&n.push(`| ↳ Limited | ${o} | ${e} | ${l} | ${f} | ${m} | ${y} |`)}})),n.push("\n---"),n.push("\n### System Information");let f=null;if("win32"!==process.platform)try{f=(0,cr.execSync)("uname -a",{encoding:"utf8"}).trim()}catch{}if(f?n.push(`- **System:** ${f}`):(n.push(`- **Hostname:** ${Ut.hostname()}`),n.push(`- **OS:** ${Ut.type()} ${Ut.release()}`)),n.push(`- **Platform:** ${process.platform}`),n.push(`- **CPU Cores:** ${Ut.cpus().length}`),n.push(`- **Total System Memory:** ${(Ut.totalmem()/1024/1024/1024).toFixed(2)} GB`),c.length>0){const e=c[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 m=process.argv.slice(2).join(" ");if(n.push(`\`\`\`bash\n${process.argv[0]} ${process.argv[1]} ${m}\n\`\`\``),n.push("\n### Package Information"),n.push(`- **Name:** ${pr.UU}`),n.push(`- **Version:** ${pr.rE}`),pr.description&&n.push(`- **Description:** ${pr.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=dr.default.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=`model-capabilities-${(new Date).toISOString().replace(/[.:]/g,"-").split("T")[0]}.md`,h=Rt.join(process.cwd(),y);ur.writeFileSync(h,n.join("\n"),"utf8"),console.log(`\nModel capabilities table saved to: ${h}`),process.exit(0)}catch(e){console.error("Failed to generate model table:",e.message),process.exit(1)}}async function mr({modelId:e=null,defaultConfig:t=null}={}){console.log(`${pr.UU} v${pr.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 u=await tr("ggml-llm",null,{config:l,includeBreakdown:!0}),c=u.buttress?.selected||null,d=u.modelConfig||null;if(e||d?.repoId){console.log("\n=== Model Information ===");const t=e||d?.repoId;if(console.log(`Repository ID: ${t}`),d?.quantization&&console.log(`Quantization: ${d.quantization}`),d?.nCtx&&console.log(`Context Length: ${d.nCtx}`),c?.quantization){const{fileType:e}=c.quantization;null!=e&&console.log(`Model File Type (GGUF): ${e}`)}const n=d?.cacheKType||"f16",r=d?.cacheVType||"f16";if(console.log(`KV Cache Type: K=${n}, V=${r}`),c?.modelBytes&&c?.kvCacheBytes){if(console.log(`Model Size: ${(c.modelBytes/1024/1024/1024).toFixed(2)} GB`),c.kvInfo?console.log(`KV Cache Size: ${(c.kvCacheBytes/1024/1024/1024).toFixed(2)} GB (KV info: ${JSON.stringify(c.kvInfo)})`):console.log(`KV Cache Size: ${(c.kvCacheBytes/1024/1024/1024).toFixed(2)} GB`),console.log(`Total Required Memory: ${((c.modelBytes+c.kvCacheBytes)/1024/1024/1024).toFixed(2)} GB`),null!=c.memoryLimitedCtx){const e=c.memoryLimitedCtx,t=c.kvInfo?.nCtxTrain;t?console.log(`\nMemory-Limited Context: ${e} (Train: ${t})`):console.log(`\nMemory-Limited Context: ${e}`),null!=c.limitedKvCacheBytes&&console.log(`Limited KV Cache Size: ${(c.limitedKvCacheBytes/1024/1024/1024).toFixed(2)} GB`)}}else if(u.buttress?.selected?.fit){const{totalRequiredBytes:e}=u.buttress.selected.fit;console.log(`Total Required Memory: ${(e/1024/1024/1024).toFixed(2)} GB`)}}if(u.buttress?.selected){const{selected:e}=u.buttress;console.log("\n=== Hardware Information ===");let t=null;if("win32"!==process.platform)try{t=(0,cr.execSync)("uname -a",{encoding:"utf8"}).trim()}catch{}t?console.log(`System: ${t}`):(console.log(`Hostname: ${Ut.hostname()}`),console.log(`OS: ${Ut.type()} ${Ut.release()}`)),console.log(`Platform: ${e.platform}`),console.log(`CPU Cores: ${Ut.cpus().length}`),console.log(`Total System Memory: ${(Ut.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(u,null,2)),process.exit(0)}catch(e){console.error("Failed to get capabilities:",e.message),process.exit(1)}}const yr=new TextDecoder,hr=p.initTRPC.context().create(),br=At.z.record(At.z.any()).optional(),gr=At.z.object({id:At.z.string()}),vr=At.z.object({id:At.z.string(),property:At.z.any().optional()}),wr=At.z.object({type:At.z.string(),config:br}),_r=At.z.object({type:At.z.string().optional().default("ggml-llm"),config:br,currentClientCapabilities:At.z.record(At.z.any()).optional(),options:At.z.record(At.z.any()).optional()}).optional(),xr=(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]=xr(n[e]||{},t):n[e]=t})),n},Er=e=>e&&"object"==typeof e?JSON.parse(JSON.stringify(e)):null,Sr=(e,t)=>{const n=Er(e)||{},r=Er(t)||{};return xr(n,r)},kr=(e=d,{defaultConfig:t}={})=>{const n=Er(t)||{},r=Array.isArray(n.generators)?n.generators:[],{server:o,generators:a,...i}=n,s=e=>xr(JSON.parse(JSON.stringify(i)),e||{}),l=(e,t)=>{if(r.length>0){const n=r.filter((t=>t?.type===e));if(n.length>0&&t){const e=n.find((e=>e.model?.repo_id===t));if(e)return s(e)}}return Object.keys(i).length>0?s({}):null};return hr.router({getCapabilities:hr.procedure.input(_r).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=Er(o),u=e.getModelIdentifier(r,s),c=l(r,u),d=Sr(c,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:hr.procedure.input(wr).mutation((async({input:t})=>{console.log("[Server] Start Generator:",t);const{type:n,config:r}=t,o=Er(r),a=e.getModelIdentifier(n,o),i=l(n,a),s=Sr(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:hr.procedure.input(gr).mutation((async({input:t})=>(console.log("[Server] Finalize Generator:",t),e.finalizeGenerator(t.id)))),ggmlLlm:hr.router({initContext:hr.procedure.input(vr).subscription((({input:t})=>Y((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);r&&(n.next({result:a}),n.complete())}catch(e){r&&n.error(e)}})(),()=>{r=!1}})))),completion:hr.procedure.input(vr).subscription((({input:t})=>Y((n=>{console.log("[Server] Completion:",t);let r=()=>{};return(async()=>{try{const o=await e.ggmlLlm.completion(t.id,t.property);if(!o)return void n.complete();r=((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=yr.decode(e,{stream:!0});t.next(n)}}t.complete()}catch(e){t.error(e)}finally{n.cancel().catch((()=>{}))}})(),()=>{r=!1,n.cancel().catch((()=>{}))}})(o,n)}catch(e){n.error(e)}})(),()=>r()})))),tokenize:hr.procedure.input(vr).query((async({input:t})=>(console.log("[Server] Tokenize:",t),e.ggmlLlm.tokenize(t.id,t.property)))),detokenize:hr.procedure.input(vr).mutation((async({input:t})=>(console.log("[Server] Detokenize:",t),e.ggmlLlm.detokenize(t.id,t.property)))),applyChatTemplate:hr.procedure.input(vr).query((async({input:t})=>(console.log("[Server] Apply Chat Template:",t),e.ggmlLlm.applyChatTemplate(t.id,t.property)))),releaseContext:hr.procedure.input(vr).mutation((async({input:t})=>(console.log("[Server] Release Context:",t),e.ggmlLlm.releaseContext(t.id,t.property))))})})},Or=({backend:e=d,router:t,createContext:n=(()=>({})),defaultConfig:r}={})=>{const o=t||kr(e,{defaultConfig:r});return{server:It({router:o,createContext:n,basePath:"/trpc/"}),router:o,backend:e}},Cr=async({port:e=2080,backend:t,router:n,createContext:r,defaultConfig:o}={})=>{const{server:a,router:i}=Or({backend:t,router:n,createContext:r,defaultConfig:o});return await new Promise((t=>a.listen(e,t))),{server:a,router:i,port:e}};export{lr as checkAndNotifyUpdates,ir as checkForUpdates,sr as compareVersions,kr as createRouter,Or as createServer,or as currentVersion,fr as showModelsTable,Cr as startServer,mr as testGgmlLlmCapabilities};
1
+ import*as e from"@trpc/server";import{createRequire as t}from"node:module";import*as n from"zod";import*as r from"@huggingface/gguf";import*as o from"@fugood/llama.node";import*as a from"@fugood/whisper.node";import*as i from"@iarna/toml";var s,l,c={},u={};function d(e){var t=u[e];if(void 0!==t)return t.exports;var n=u[e]={exports:{}};return c[e](n,n.exports,d),n.exports}l=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,d.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);d.r(n);var r={};s=s||[null,l({}),l([]),l(l)];for(var o=2&t&&e;"object"==typeof o&&!~s.indexOf(o);o=l(o))Object.getOwnPropertyNames(o).forEach((t=>r[t]=()=>e[t]));return r.default=()=>e,d.d(n,r),n},d.d=(e,t)=>{for(var n in t)d.o(t,n)&&!d.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},d.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),d.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var f={};d.r(f),d.d(f,{finalizeGenerator:()=>Pr,getCapabilities:()=>Ar,getModelIdentifier:()=>Rr,ggmlLlm:()=>Ur,ggmlStt:()=>qr,startGenerator:()=>Ir});const p=(e=>{var t={};return d.d(t,e),t})({initTRPC:()=>e.initTRPC}),m={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},y={[-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"};m.BAD_GATEWAY,m.SERVICE_UNAVAILABLE,m.GATEWAY_TIMEOUT,m.INTERNAL_SERVER_ERROR;function h(e){return!!e&&!Array.isArray(e)&&"object"==typeof e}const g="function"==typeof Symbol&&!!Symbol.asyncIterator;function b(e){return g&&h(e)&&Symbol.asyncIterator in e}const v=e=>e();function w(e){return e}var _=Object.create,x=Object.defineProperty,S=Object.getOwnPropertyDescriptor,k=Object.getOwnPropertyNames,E=Object.getPrototypeOf,B=Object.prototype.hasOwnProperty,C=(e,t)=>function(){return t||(0,e[k(e)[0]])((t={exports:{}}).exports,t),t.exports},M=(e,t,n)=>(n=null!=e?_(E(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(var o,a=k(t),i=0,s=a.length;i<s;i++)o=a[i],B.call(e,o)||o===n||x(e,o,{get:(e=>t[e]).bind(null,o),enumerable:!(r=S(t,o))||r.enumerable});return e})(!t&&e&&e.__esModule?n:x(n,"default",{value:e,enumerable:!0}),e));const N={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 O(e){var t;return null!==(t=N[e])&&void 0!==t?t:500}function T(e){return O(e.code)}var $=C({"../../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}}),I=C({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPrimitive.js"(e,t){var n=$().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}}),P=C({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/toPropertyKey.js"(e,t){var n=$().default,r=I();t.exports=function(e){var t=r(e,"string");return"symbol"==n(t)?t:t+""},t.exports.__esModule=!0,t.exports.default=t.exports}}),A=C({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/defineProperty.js"(e,t){var n=P();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}}),U=C({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/objectSpread2.js"(e,t){var n=A();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}}),q=M(U(),1);function R(e){const{path:t,error:n,config:r}=e,{code:o}=e.error,a={message:n.message,code:m[o],data:{code:o,httpStatus:T(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,q.default)((0,q.default)({},e),{},{shape:a}))}var F=M(A(),1),z=class extends Error{};function j(e){if(e instanceof D)return e;if(e instanceof Error&&"TRPCError"===e.name)return e;const t=new D({code:"INTERNAL_SERVER_ERROR",cause:e});return e instanceof Error&&e.stack&&(t.stack=e.stack),t}var D=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)):h(e)?Object.assign(new z,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,F.default)(this,"cause",void 0),(0,F.default)(this,"code",void 0),this.code=e.code,this.name="TRPCError",null!==(r=this.cause)&&void 0!==r||(this.cause=o)}},L=M(U(),1);function G(e,t){return"error"in t?(0,L.default)((0,L.default)({},t),{},{error:e.transformer.output.serialize(t.error)}):"data"in t.result?(0,L.default)((0,L.default)({},t),{},{result:(0,L.default)((0,L.default)({},t.result),{},{data:e.transformer.output.serialize(t.result.data)})}):t}function V(e,t){return Array.isArray(t)?t.map((t=>G(e,t))):G(e,t)}Error;M(U(),1);async function H(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 J=Symbol();function K(e){return Array.isArray(e)&&e[2]===J}function Y(e){return"object"==typeof e&&null!==e&&"subscribe"in e}function W(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(Q,t)};return t}function Q(e,t){return t(e)}function Z(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 X(e){let t;try{t=JSON.parse(e)}catch(e){throw new D({code:"PARSE_ERROR",message:"Not JSON-parsable query params",cause:e})}return function(e){try{if(null===e)return null;if(!h(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 D({code:"PARSE_ERROR",message:"Invalid connection params shape",cause:e})}}(t)}var ee=M(U(),1);function te(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 D)throw e;throw new D({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 ne={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=te((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(!h(t))throw new D({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 H(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(h(t))t=(0,ee.default)((0,ee.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 D({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:X(c),signal:n.signal,url:e.url}}},re=[ne,{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 D({code:"METHOD_NOT_SUPPORTED",message:"Only POST requests are supported for multipart/form-data requests"});const n=te((async()=>await t.formData())),r=await H(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 D({code:"METHOD_NOT_SUPPORTED",message:"Only POST requests are supported for application/octet-stream requests"});const n=te((async()=>t.body));return{calls:[{path:e.path,getRawInput:n.read,result:n.result,procedure:await H(e.router,e.path)}],isBatchCall:!1,accept:null,type:"mutation",connectionParams:null,signal:t.signal,url:e.url}}}];async function oe(e){const t=function(e){const t=re.find((t=>t.isMatch(e)));if(t)return t;if(!t&&"GET"===e.method)return ne;throw new D({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 ae(e){return h(e)&&"AbortError"===e.name}function ie(e="AbortError"){throw new DOMException(e,"AbortError")}function se(e){return"[object Object]"===Object.prototype.toString.call(e)}var le=M(A(),1);let ce;const ue=new WeakMap,de=()=>{};ce=Symbol.toStringTag;var fe,pe,me,ye,he=class e{constructor(e){(0,le.default)(this,"promise",void 0),(0,le.default)(this,"subscribers",[]),(0,le.default)(this,"settlement",null),(0,le.default)(this,ce,"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=de}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 ue.set(t,n),ue.set(n,n),n}static getSubscribablePromise(e){return ue.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(ge);try{return await Promise.race(t)}finally{for(const e of t)e.unsubscribe()}}};function ge(e){return he.proxy(e).then((()=>[e]))}function be(e,t){const n=e,r=n[Symbol.dispose];return n[Symbol.dispose]=()=>{t(),null==r||r()},n}function ve(e,t){const n=e,r=n[Symbol.asyncDispose];return n[Symbol.asyncDispose]=async()=>{await t(),await(null==r?void 0:r())},n}null!==(pe=(fe=Symbol).dispose)&&void 0!==pe||(fe.dispose=Symbol()),null!==(ye=(me=Symbol).asyncDispose)&&void 0!==ye||(me.asyncDispose=Symbol());const we=Symbol();function _e(e){let t=null;return be({start(){if(t)throw new Error("Timer already started");return new Promise((n=>{t=setTimeout((()=>n(we)),e)}))}},(()=>{t&&clearTimeout(t)}))}var xe=C({"../../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}}),Se=C({"../../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}}),ke=C({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/awaitAsyncGenerator.js"(e,t){var n=Se();t.exports=function(e){return new n(e,0)},t.exports.__esModule=!0,t.exports.default=t.exports}}),Ee=C({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/wrapAsyncGenerator.js"(e,t){var n=Se();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}}),Be=M(xe(),1),Ce=M(ke(),1),Me=M(Ee(),1);function Ne(e){const t=e[Symbol.asyncIterator]();return t[Symbol.asyncDispose]?t:ve(t,(async()=>{var e;await(null===(e=t.return)||void 0===e?void 0:e.call(t))}))}function Oe(){return(Oe=(0,Me.default)((function*(e,t){try{var n=(0,Be.default)();const r=n.a(Ne(e)),o=n.u(_e(t.maxDurationMs)).start();let a;for(;;){if(a=yield(0,Ce.default)(he.race([r.next(),o])),a===we&&ie(),a.done)return a;yield a.value,a=null}}catch(e){n.e=e}finally{yield(0,Ce.default)(n.d())}}))).apply(this,arguments)}function Te(){return(Te=(0,Me.default)((function*(e,t){try{var n=(0,Be.default)();const r=n.a(Ne(e));let o;const a=n.u(_e(t.gracePeriodMs));let i=t.count,s=new Promise((()=>{}));for(;;){if(o=yield(0,Ce.default)(he.race([r.next(),s])),o===we&&ie(),o.done)return o.value;yield o.value,0==--i&&(s=a.start()),o=null}}catch(e){n.e=e}finally{yield(0,Ce.default)(n.d())}}))).apply(this,arguments)}function $e(){let e,t;return{promise:new Promise(((n,r)=>{e=n,t=r})),resolve:e,reject:t}}var Ie=M(xe(),1),Pe=M(ke(),1),Ae=M(Ee(),1);function Ue(){let e="idle",t=$e();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,Ae.default)((function*(){try{var i=(0,Ie.default)();if("idle"!==e)throw new Error("Cannot iterate twice");e="pending";i.a(ve({},(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,Pe.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=$e()}}catch(e){i.e=e}finally{yield(0,Pe.default)(i.d())}}))()}}function qe(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 Re=M(xe(),1),Fe=M(ke(),1),ze=M(Ee(),1);const je=Symbol("ping");function De(e,t){return Le.apply(this,arguments)}function Le(){return(Le=(0,ze.default)((function*(e,t){try{var n=(0,Re.default)();const o=n.a(Ne(e));let a,i=o.next();for(;;)try{var r=(0,Re.default)();const e=r.u(_e(t));if(a=yield(0,Fe.default)(he.race([i,e.start()])),a===we){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,Fe.default)(n.d())}}))).apply(this,arguments)}var Ge=C({"../../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}}),Ve=M(ke(),1),He=M(Ee(),1),Je=M(xe(),1),Ke=M(Ge(),1);const Ye=0,We=1,Qe=0,Ze=1,Xe=0,et=1,tt=2;function nt(e){return(h(e)||"function"==typeof e)&&"function"==typeof(null==e?void 0:e.then)&&"function"==typeof(null==e?void 0:e.catch)}var rt=class extends Error{constructor(e){super("Max depth reached at path: "+e.join(".")),this.path=e}};function ot(){return ot=(0,He.default)((function*(e){const{data:t}=e;let n=0;const r=0,o=Ue();function a(e){const t=n++,r=e(t);return o.add(r),t}function i(t,n){return a(function(){var r=(0,He.default)((function*(r){const o=l(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,Ve.default)(t);yield[r,Qe,u(e,n)]}catch(t){var a,i;null===(a=e.onError)||void 0===a||a.call(e,{error:t,path:n}),yield[r,Ze,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 s(t,n){return a(function(){var r=(0,He.default)((function*(r){try{var o=(0,Je.default)();const s=l(n);if(s)throw s;const c=o.a(Ne(t));try{for(;;){const e=yield(0,Ve.default)(c.next());if(e.done){yield[r,Xe,u(e.value,n)];break}yield[r,et,u(e.value,n)]}}catch(t){var a,i;null===(a=e.onError)||void 0===a||a.call(e,{error:t,path:n}),yield[r,tt,null===(i=e.formatError)||void 0===i?void 0:i.call(e,{error:t,path:n})]}}catch(e){o.e=e}finally{yield(0,Ve.default)(o.d())}}));return function(e){return r.apply(this,arguments)}}())}function l(t){return e.maxDepth&&t.length>e.maxDepth?new rt(t):null}function c(t,n){if(nt(t))return[Ye,i(t,n)];if(b(t)){if(e.maxDepth&&n.length>=e.maxDepth)throw new Error("Max depth reached");return[We,s(t,n)]}return null}function u(e,t){if(void 0===e)return[[]];const n=c(e,t);if(n)return[[r],[null,...n]];if(!1===se(o=e)||void 0!==(a=o.constructor)&&(!1===se(i=a.prototype)||!1===i.hasOwnProperty("isPrototypeOf")))return[[e]];var o,a,i;const s={},l=[];for(const[n,o]of Object.entries(e)){const e=c(o,[...t,n]);e?(s[n]=r,l.push([n,...e])):s[n]=o}return[[s],...l]}const d={};for(const[e,n]of Object.entries(t))d[e]=u(n,[e]);yield d;let f=o;e.pingMs&&(f=De(o,e.pingMs));var p,m=!1,y=!1;try{for(var h,g=(0,Ke.default)(f);m=!(h=yield(0,Ve.default)(g.next())).done;m=!1){const e=h.value;yield e}}catch(e){y=!0,p=e}finally{try{m&&null!=g.return&&(yield(0,Ve.default)(g.return()))}finally{if(y)throw p}}})),ot.apply(this,arguments)}function at(e){let t=qe(function(e){return ot.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 it=C({"../../node_modules/.pnpm/@oxc-project+runtime@0.72.2/node_modules/@oxc-project/runtime/src/helpers/asyncGeneratorDelegate.js"(e,t){var n=Se();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}}),st=M(Ge(),1),lt=M(ke(),1),ct=M(Ee(),1),ut=M(it(),1);M(xe(),1);const dt="ping",ft="serialized-error",pt="connected",mt="return";function yt(e){var t,n,r,o,a;const{serialize:i=w}=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,ct.default)((function*(){yield{event:pt,data:JSON.stringify(l)};let t,n,r=e.data;e.emitAndEndImmediately&&(r=function(e,t){return Te.apply(this,arguments)}(r,{count:1,gracePeriodMs:1})),e.maxDurationMs&&e.maxDurationMs>0&&e.maxDurationMs!==1/0&&(r=function(e,t){return Oe.apply(this,arguments)}(r,{maxDurationMs:e.maxDurationMs})),s.enabled&&s.intervalMs!==1/0&&s.intervalMs>0&&(r=De(r,s.intervalMs));var o,a=!1,c=!1;try{for(var u,d=(0,st.default)(r);a=!(u=yield(0,lt.default)(d.next())).done;a=!1)t=u.value,t!==je?(n=K(t)?{id:t[0],data:t[1]}:{data:t},n.data=JSON.stringify(i(n.data)),yield n,t=null,n=null):yield{event:dt,data:""}}catch(e){c=!0,o=e}finally{try{a&&null!=d.return&&(yield(0,lt.default)(d.return()))}finally{if(c)throw o}}})),c.apply(this,arguments)}function u(){return u=(0,ct.default)((function*(){try{yield*(0,ut.default)((0,st.default)(function(){return c.apply(this,arguments)}())),yield{event:mt,data:""}}catch(r){var t,n;if(ae(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:ft,data:JSON.stringify(i(a))}}})),u.apply(this,arguments)}const d=qe(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 ht={"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform","X-Accel-Buffering":"no",Connection:"keep-alive"};var gt=M(Ee(),1),bt=M(U(),1);function vt(e){return v((0,gt.default)((function*(){throw e})))}const wt={mutation:["POST"],query:["GET"],subscription:["GET"]},_t={mutation:["POST"],query:["GET","POST"],subscription:["GET","POST"]};function xt(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&&h(e.error.data)?"number"==typeof(null===(t=e.error.data)||void 0===t?void 0:t.httpStatus)?e.error.data.httpStatus:O(y[e.error.code]):200})));return 1!==n.size?207:n.values().next().value}(s):200;const d=!s,f=d?[]:Array.isArray(s)?s:[s],p=null!==(t=null==i?void 0:i({ctx:o,info:a,paths:null==a?void 0:a.calls.map((e=>e.path)),data:f,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(p.headers)if(p.headers instanceof Headers)for(const[e,t]of p.headers.entries())c.append(e,t);else for(const[e,t]of Object.entries(p.headers))if(Array.isArray(t))for(const n of t)c.append(e,n);else"string"==typeof t&&c.set(e,t);return p.status&&(u=p.status),{status:u}}function St(e){return!!h(e)&&(!!b(e)||(Object.values(e).some(nt)||Object.values(e).some(b)))}async function kt(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 f=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,p=null!==(o=e.allowMethodOverride)&&void 0!==o&&o&&"POST"===l.method,m=await v((async()=>{try{return[void 0,await oe({req:l,path:decodeURIComponent(e.path),router:s,searchParams:d.searchParams,headers:e.req.headers,url:d})]}catch(e){return[j(e),void 0]}})),y=v((()=>{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]}}}})),h=p?_t:wt,g="application/jsonl"===l.headers.get("trpc-accept"),w=null===(a=null===(i=u.sse)||void 0===i?void 0:i.enabled)||void 0===a||a;try{const[t,n]=m;if(t)throw t;if(n.isBatchCall&&!f)throw new D({code:"BAD_REQUEST",message:"Batching is not enabled on the server"});if(g&&!n.isBatchCall)throw new D({message:"Streaming requests must be batched (you can do a batch of 1)",code:"BAD_REQUEST"});await y.create(n);const r=n.calls.map((async t=>{const r=t.procedure;try{if(e.error)throw e.error;if(!r)throw new D({code:"NOT_FOUND",message:`No procedure found on path "${t.path}"`});if(!h[r._def.type].includes(l.method))throw new D({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 D({code:"BAD_REQUEST",message:"Cannot batch subscription calls"});return[void 0,{data:await r({path:t.path,getRawInput:t.getRawInput,ctx:y.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:y.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"),St(null==a?void 0:a.data))throw new D({code:"UNSUPPORTED_MEDIA_TYPE",message:"Cannot use stream-like response in non-streaming request - use httpBatchStreamLink"});const r=o?{error:R({config:u,ctx:y.valueOrUndefined(),error:o,input:t.result(),path:t.path,type:n.type})}:{result:{data:a.data}},i=xt({ctx:y.valueOrUndefined(),info:n,responseMeta:e.responseMeta,errors:o?[o]:[],headers:c,untransformedJSON:[r]});return new Response(JSON.stringify(V(u,r)),{status:i.status,headers:c})}case"subscription":{const r=v((()=>{if(o)return vt(o);if(!w)return vt(new D({code:"METHOD_NOT_SUPPORTED",message:'Missing experimental flag "sseSubscriptions"'}));if(!Y(a.data)&&!b(a.data))return vt(new D({message:`Subscription ${t.path} did not return an observable or a AsyncGenerator`,code:"INTERNAL_SERVER_ERROR"}));return Y(a.data)?Z(a.data,e.req.signal):a.data})),i=yt((0,bt.default)((0,bt.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:y.valueOrUndefined(),req:e.req,type:c});return R({config:u,ctx:y.valueOrUndefined(),error:i,input:s,path:l,type:c})}}));for(const[e,t]of Object.entries(ht))c.set(e,t);const s=xt({ctx:y.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=xt({ctx:y.valueOrUndefined(),info:n,responseMeta:e.responseMeta,errors:[],headers:c,untransformedJSON:null}),o=at((0,bt.default)((0,bt.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:R({config:u,ctx:y.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=Y(o.data)?Z(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:y.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 R({config:u,ctx:y.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:St(n.data)?[new D({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:R({config:u,ctx:y.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=xt({ctx:y.valueOrUndefined(),info:n,responseMeta:e.responseMeta,untransformedJSON:a,errors:i,headers:c});return new Response(JSON.stringify(V(u,a)),{status:s.status,headers:c})}catch(t){var _;const[n,r]=m,o=y.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:R({config:n._def._config,error:a,type:t.type,path:t.path,input:t.input,ctx:t.ctx})},s=V(n._def._config,i);return{error:a,untransformedJSON:i,body:JSON.stringify(s)}}(t,{opts:e,ctx:y.valueOrUndefined(),type:null!==(_=null==r?void 0:r.type)&&void 0!==_?_:"unknown"}),l=xt({ctx:o,info:r,responseMeta:e.responseMeta,untransformedJSON:i,errors:[a],headers:c});return new Response(s,{status:l.status,headers:c})}}function Et(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 D({code:"BAD_REQUEST",message:"Invalid URL",cause:e})}}function Bt(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=Et(e),i={headers:Bt(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 D({code:"PAYLOAD_TOO_LARGE"})),r=!0,e.off("data",a),e.off("end",i))},i=()=>{r||(r=!0,e.off("data",a),e.off("end",i),o.close())};e.on("data",a),e.on("end",i)},cancel(){e.destroy()}})}(e,n),i.duplex="half");return new Request(a,i)}async function Mt(e){const{res:t}=e;try{const n=new WritableStream({async write(e){var n;await async function(e,t){!1===e.write(t)&&await new Promise(((t,n)=>{const r=e=>{n(e),a()},o=()=>{t(),a()},a=()=>{e.off("error",r),e.off("drain",o)};e.once("error",r),e.once("drain",o)}))}(t,e),null===(n=t.flush)||void 0===n||n.call(t)}});await e.body.pipeTo(n,{signal:e.signal})}catch(e){if(ae(e))return;throw e}}var Nt=M(U(),1);function Ot(e){return t=>{var n;const{res:r,req:o}=e,a=j(t),i=R({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=V(e.router._def._config,{error:i});r.statusCode=i.data.httpStatus,r.end(JSON.stringify(s))}}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=>{v((async()=>{var n;const r=Ct(e.req,e.res,{maxBodySize:null!==(n=e.maxBodySize)&&void 0!==n?n:null}),o=await kt((0,Nt.default)((0,Nt.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,Nt.default)((0,Nt.default)({},e),t)))},onError(t){var n;null==e||null===(n=e.onError)||void 0===n||n.call(e,(0,Nt.default)((0,Nt.default)({},t),{},{req:e.req}))}}));await async function(e){const{response:t,rawResponse:n}=e;200===n.statusCode&&(n.statusCode=t.status);for(const[e,r]of t.headers)n.setHeader(e,r);try{t.body&&await Mt({res:n,signal:e.request.signal,body:t.body})}catch(e){throw n.headersSent||(n.statusCode=500),e}finally{n.end()}}({request:r,response:o,rawResponse:e.res})})).catch(Ot(e))}))}))}const $t=t(import.meta.url)("http");var It=M(U(),1);function Pt(e){var t;const n=(null!==(t=e.basePath)&&void 0!==t?t:"/").length;return(t,r)=>{let o="";v((async()=>{const a=Et(t);o=a.pathname.slice(n),await Tt((0,It.default)((0,It.default)({},e),{},{req:t,res:r,path:o}))})).catch(Ot((0,It.default)({req:t,res:r,path:o},e)))}}function At(e){return $t.createServer(function(e){return Pt(e)}(e))}const Ut=(e=>{var t={};return d.d(t,e),t})({z:()=>n.z}),qt=t(import.meta.url)("node:path"),Rt=t(import.meta.url)("node:os"),Ft=t(import.meta.url)("node:fs/promises"),zt=t(import.meta.url)("node:crypto");const jt=(e=>{var t={};return d.d(t,e),t})({gguf:()=>r.gguf});const Dt=(e=>{var t={};return d.d(t,e),t})({getBackendDevicesInfo:()=>o.getBackendDevicesInfo,isLibVariantAvailable:()=>o.isLibVariantAvailable,loadModel:()=>o.loadModel}),Lt=(e,t,n)=>Math.min(Math.max(e,t),n),Gt=e=>e?40:0,Vt=(e=0)=>{if(!e)return 0;return Lt(e/12884901888*20,0,20)},Ht=(e=0)=>{if(!e)return 0;return Lt(e/34359738368*10,0,10)},Jt=e=>e?10:0,Kt=(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},Yt=({platform:e,variant:t,hasGpu:n,gpuUsableBytes:r=0,cpuUsableBytes:o=0,ok:a=!0}={})=>{if(!a)return 0;const i=Gt(n)+Kt(t,e)+Vt(r),s=Ht(o),l=Jt(a);return Math.min(100,Math.round(i+s+l))},Wt=["cuda","vulkan","snapdragon","default"],Qt=e=>e||0===e?Array.isArray(e)?e.filter((e=>null!=e)):[e]:[],Zt=e=>e&&String(e).trim().toLowerCase()||null,Xt=(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"))))},en=({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(Xt),u=l.filter((e=>Xt(e)&&Number.isFinite(Number(e.maxMemorySize)))).reduce(((e,t)=>e+t.maxMemorySize),0),d=t,f=c?Math.floor(u*o):0,p=d?Math.floor(d*a):0,m={platform:e,variant:n,hasGpu:c,gpuUsableBytes:f,cpuUsableBytes:p,ok:i},y=Yt(m),h=i?(({platform:e,variant:t,hasGpu:n,gpuUsableBytes:r=0,cpuUsableBytes:o=0,ok:a=!0}={})=>({gpuPresence:Gt(n),variant:Kt(t,e),gpuMemory:Vt(r),cpuMemory:Ht(o),availability:Jt(a)}))(m):null;return{platform:e,ok:i,variant:n,hasGpu:c,devices:l,gpuTotalBytes:u,gpuUsableBytes:f,cpuTotalBytes:d,cpuUsableBytes:p,score:y,breakdown:h,error:s,timestamp:(new Date).toISOString()}},tn=({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}},nn=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:f=Wt}={})=>{const{getBackendDevicesInfo:p,isLibVariantAvailable:m}=d;if("function"!=typeof p||"function"!=typeof m)throw new TypeError("GGML capability detection requires getBackendDevicesInfo and isLibVariantAvailable functions");const y=(({variant:e,preferVariants:t=[],variantPreference:n=[],defaultVariants:r=Wt}={})=>{const o=[];e&&o.push(e),o.push(...Qt(t)),o.push(...Qt(n)),o.push(...r);const a=o.map(Zt).filter(Boolean);return Array.from(new Set(a))})({variant:t,preferVariants:n,variantPreference:r,defaultVariants:f}),h=[];for(const t of y)try{if(!await m(t))throw new Error(`Variant ${t} not available on this platform`);const n=await p(t);h.push(en({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);h.push(en({platform:e,totalMemoryInBytes:s,variant:t,devices:[],gpuMemoryFraction:o,cpuMemoryFraction:a,ok:!1,error:r}))}const g=h.filter((e=>e.ok)),b=g.find((e=>e.hasGpu))||g.find((e=>"default"===e.variant))||g[0]||null,v={ok:Boolean(b),selected:b?{...b,breakdown:i?b.breakdown:void 0}:null,attempts:h};if(!i&&v.selected&&delete v.selected.breakdown,!v||!l&&!c)return v;const w=e=>{if(!e)return e;const t=tn({device:e,modelBytes:l||0,kvCacheBytes:c||0});let n=null;return null!=u&&u!==c&&(n=tn({device:e,modelBytes:l||0,kvCacheBytes:u})),{...e,fit:t,...n&&{limitedFit:n}}};return v.selected=w(v.selected),v.attempts=Array.isArray(v.attempts)?v.attempts.map(w):v.attempts,v},rn="ggml-llm",on=["cuda","vulkan","default"],an=new Map([[rn,nn],["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 f=r&&r.length>0?r:on;return nn({platform:e,variant:t,preferVariants:n,variantPreference:f,gpuMemoryFraction:o,cpuMemoryFraction:a,includeBreakdown:i,totalMemoryInBytes:s,modelBytes:l,kvCacheBytes:c??u,dependencies:d,defaultVariants:on})}]]),sn=async({platform:e,totalMemoryInBytes:t,backend:n=rn,dependencies:r,...o}={})=>{const a=an.get(n);if(!a)throw new Error(`No capability detector registered for backend "${n}"`);return await a({...o,dependencies:r,totalMemoryInBytes:t,platform:e})},ln={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},cn=e=>{const t=e?String(e).toLowerCase():"f16";return ln[t]||ln.f16},un=({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}},dn=e=>e?String(e).trim().toLowerCase():null,fn=({arch:e,nLayer:t=0})=>({arch:dn(e),enabled:!1,window:null,pattern:null,denseFirst:!1,type:null,kvLayers:Math.max(0,Math.floor(Number(t)||0)),swaLayers:0}),pn=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"}]]),mn=({arch:e,metadata:t={},nLayer:n=0}={})=>{const r=dn(e||t["general.architecture"]),o=Math.max(0,Math.floor(Number(n)||0)),a=((e={},t=null)=>{if(!e)return null;const n=dn(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?pn.get(r):null;if(!i)return fn({arch:r,nLayer:n});const s=i({nLayer:o,nSwa:a,metadata:t});if(!s||!s.enabled||!s.window||s.window<=0)return fn({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}},yn=(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}},hn=({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 f=Number(null!=i&&void 0!==i?i:e),p=Math.max(0,Math.floor(f));if(!p)return 0;const m=cn(a.k),y=cn(a.v),h=Number(n)*(Number(r)*m+Number(o)*y);if(!h)return 0;const g=Math.max(0,Number(t)||0),b=Math.min(p,Math.max(0,Math.floor(Number(s)||0))),v=Math.max(0,p-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(h*x)})(e,i,t,n,r,o,{totalLayers:e,swaLayers:a?.swaLayers||0,swaContext:a?.window,swaFull:l,swaContextMultiplier:c})},gn=({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},bn=t(import.meta.url)("node:stream/web");var vn=d.t(bn,2);const wn="undefined"!=typeof globalThis&&globalThis.ReadableStream&&globalThis.WritableStream?{ReadableStream:globalThis.ReadableStream,WritableStream:globalThis.WritableStream}:vn,{ReadableStream:_n,WritableStream:xn}=wn,Sn=new TextEncoder,kn=(e={},t={})=>(Object.entries(t||{}).forEach((([t,n])=>{n&&"object"==typeof n&&!Array.isArray(n)?(e[t]&&"object"==typeof e[t]||(e[t]={}),kn(e[t],n)):e[t]=n})),e),En="https://huggingface.co",Bn="https://huggingface.co/api",Cn=qt.join(Rt.homedir(),".buttress","models"),Mn=["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"],Nn=.5,On={backend:{type:"ggml-llm",variant:null,variant_preference:["cuda","vulkan","snapdragon","default"],gpu_memory_fraction:.85,cpu_memory_fraction:Nn},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_k_type:"f16",cache_v_type:"f16",ctx_shift:!1,kv_unified:!1,swa_full:!1,allow_local_file:!1,local_path:null,api_base:Bn,base_url:En},runtime:{cache_dir:Cn,prefer_variants:[],huggingface_token:process.env.HUGGINGFACE_TOKEN||null,http_headers:{}}},Tn=(e,t=[])=>e||0===e?Array.isArray(e)?e.filter((e=>null!=e)):[e]:[...t],$n=e=>{if(!e)return null;const t=String(e).toLowerCase();return["cuda","vulkan","snapdragon","default"].includes(t)?t:null},In=(e={})=>{const t=JSON.parse(JSON.stringify(On));if(kn(t,e),t.backend.variant=$n(t.backend.variant),t.backend.variant_preference=Array.from(new Set(Tn(t.backend.variant_preference).map($n).filter(Boolean))),0===t.backend.variant_preference.length&&(t.backend.variant_preference=["cuda","vulkan","snapdragon","default"]),t.runtime.prefer_variants=Array.from(new Set(Tn(t.runtime.prefer_variants).map($n).filter(Boolean))),t.model.preferred_quantizations=Array.from(new Set(Tn(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||En,t.model.api_base=t.model.api_base||Bn,t.runtime.cache_dir=t.runtime.cache_dir?qt.resolve(t.runtime.cache_dir):Cn,t},Pn=e=>{const t=e.toLowerCase();return Mn.find((e=>t.includes(e)))||null},An=async e=>{await(0,Ft.mkdir)(e,{recursive:!0})},Un=(e,t,n=Cn)=>{const r=(0,zt.createHash)("sha256").update(e).digest("hex");return qt.join(((e=Cn)=>qt.join(e,".metadata-cache"))(n),t,`${r}.json`)},qn=async(e,t,n=Cn)=>{try{const r=Un(e,t,n),o=await(0,Ft.readFile)(r,"utf-8");return console.log(`[Cache] Hit ${t} cache:`,qt.basename(r)),JSON.parse(o,((e,t)=>"string"==typeof t&&t.startsWith("__bigint__")?BigInt(t.slice(10)):t))}catch(e){return null}},Rn=async(e,t,n,r=Cn)=>{try{const o=Un(e,t,r);await An(qt.dirname(o)),await(0,Ft.writeFile)(o,JSON.stringify(n,((e,t)=>"bigint"==typeof t?`__bigint__${t.toString()}`:t)),"utf-8"),console.log(`[Cache] Wrote ${t} cache:`,qt.basename(o))}catch(e){console.warn(`[Cache] Failed to write ${t} cache:`,e.message)}},Fn=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},jn=async(e,t,n=Cn)=>{const r=JSON.stringify({url:e,headers:t}),o=await qn(r,"range-metadata",n);if(o)return o;const a=!/^https?:/i.test(e),{metadata:i}=await(0,jt.gguf)(e,{fetch,additionalFetchHeaders:t,allowLocalFile:a});return await Rn(r,"range-metadata",i,n),i},Dn=async(e,t)=>{try{const n=await(0,Ft.stat)(e);return!t||n.size===t}catch(e){return!1}},Ln=async(e,t,n,r,o)=>{if("function"!=typeof fetch)throw new Error("Global fetch is not available in this runtime");await An(qt.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,Ft.open)(n,"w"),s=Number(a.headers.get("content-length"))||r||0;let l=0,c=.05;try{await a.body.pipeTo(new xn({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,Ft.unlink)(n).catch((()=>{})),e}}))}catch(e){throw await i.close().catch((()=>{})),await(0,Ft.unlink)(n).catch((()=>{})),e}if(r){const e=await(0,Ft.stat)(n);if(e.size!==r)throw await(0,Ft.unlink)(n).catch((()=>{})),new Error(`Downloaded file size mismatch, expected ${r} got ${e.size}`)}},Gn=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 qn(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 Rn(o,"artifact-info",l,r),l}let{filename:s}=e.model,l=e.model.quantization&&String(e.model.quantization).toLowerCase();const c=await Fn(`${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:Mn;if(s)l||(l=Pn(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||Pn(s)}const f=`${e.model.base_url.replace(/\/+$/,"")}/${t}/resolve/${n}/${s}`,p=/-(\d{5})-of-(\d{5})\.gguf$/,m=s.match(p);let y=null;if(m){const[,,r]=m,o=await Fn(`${e.model.api_base}/models/${t}?revision=${n}&blobs=true`,{headers:i}),a=o?.siblings||o?.files||[],l=Number(r);y=0;for(let e=1;e<=l;e+=1){const t=String(e).padStart(5,"0"),n=s.replace(p,`-${t}-of-${r}.gguf`),o=a.find((e=>(e.rfilename||e.path||e.filename)===n)),i=Number(o?.size);Number.isFinite(i)&&i>0&&(y+=i)}}else{const e=await zn(f,{headers:i});y=Number(e.headers.get("content-length"))||null}const h={repoId:t,revision:n,filename:s,url:f,size:y,quantization:l,headers:i,isSplit:Boolean(m),splitCount:m?Number(m[2]):0};return await Rn(o,"artifact-info",h,r),h},Vn=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($n).filter(Boolean)))})(e),[o,...a]=r,i=null!=e.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.gpu_memory_fraction))):On.backend.gpu_memory_fraction||1,s=null!=e.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.cpu_memory_fraction))):Nn,l=await sn({platform:process.platform,totalMemoryInBytes:Rt.totalmem(),backend:"ggml-llm",variant:o||null,preferVariants:a,gpuMemoryFraction:i,cpuMemoryFraction:s,dependencies:{getBackendDevicesInfo:Dt.getBackendDevicesInfo,isLibVariantAvailable:Dt.isLibVariantAvailable},modelBytes:t,kvCacheBytes:n}),c=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(!l.ok||!l.selected){const e=(l.attempts||[]).map((e=>`${e.variant}: ${e.error||"unknown error"}`)).join("; ");throw new Error(`Unable to initialize any backend variant (${r.join(", ")}). Errors: ${e}`)}const u=(l.attempts||[]).map(c);return{selected:c(l.selected),attempts:u}},Hn=async e=>{const t=await Gn(e),n=await jn(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:f}=yn(n),p=Number.isFinite(Number(a))?Number(a):0,m=Number.isFinite(Number(i))?Number(i):0,y=Number.isFinite(Number(s))?Number(s):0,h=Number.isFinite(Number(l))?Number(l):y,g=y>0&&m>0?m/y:128,b=Number.isFinite(Number(c))?Number(c):g,v=Number.isFinite(Number(u))?Number(u):g,w=mn({arch:r,metadata:n,nLayer:p}),_=w&&Number.isFinite(Number(w.kvLayers))?Number(w.kvLayers):p,x=Math.max(0,Math.floor(Number(_)||0)),S=e.model.n_ctx?Number(e.model.n_ctx):null;let k=S||o||4096;const E=[],B=[];let C=!0;if(S&&o&&S>o){C=!1;const e=`Requested context length (${S}) exceeds model training context (${o})`;E.push(e),B.push(e),k=o}S&&!o&&E.push("Model metadata missing training context length, using requested value");const M={k:e.model.cache_k_type,v:e.model.cache_v_type},N=t.size>0?t.size:0,O=hn({layerCount:x,headKvCount:h,embdHeadKCount:b,embdHeadVCount:v,cacheTypes:M,swaConfig:w,kvUnified:e.model.kv_unified,nParallel:e.model.n_parallel,swaFull:e.model.swa_full}),T=O(k),$=await Vn(e,{modelBytes:N,kvCacheBytes:T}),I=$.selected.totalMemory||0,P=I*(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))):Nn,U=Math.max(0,Rt.totalmem()*A),q=$.selected.hasGpu?P:U,R=gn({maxCtx:k,availableMemory:q,modelBytes:N,kvBytesForCtx:O});if(!S&&R){const e=o?Math.min(R,o):R,t=Math.max(32,e);t<k&&E.push(`Context length capped to ${t} by memory limits`),k=t}k>R&&(k=R);const F=Math.floor(R);console.log(`[buttress] Memory-limited context length: ${F}`);const z=O(k),j=N+z,D=p?N/(p+1):N;let L,G=0;$.selected.hasGpu&&D>0&&(G=Math.min(p+1,Math.max(0,Math.floor(P/D)))),console.log(`[buttress] Auto GPU layer capacity (${$.selected.variant}): ${G}/${p+1}`),L="auto"===e.model.n_gpu_layers||null==e.model.n_gpu_layers?G:Math.max(0,Math.min(Number(e.model.n_gpu_layers)||0,p+1));const V=(()=>{const t=e.model.flash_attn&&String(e.model.flash_attn).toLowerCase();return"on"===t||"off"===t?t:$.selected.hasGpu?"auto":"off"})(),H=e.runtime.cache_dir,J=((e,t)=>{if(e.model.local_path)return qt.resolve(e.model.local_path);const n=t.repoId.split("/"),r=qt.join(e.runtime.cache_dir,...n,t.revision);return qt.join(r,t.filename)})(e,t),K=await Dn(J,t.size),Y={ok:C,backend:"ggml-llm",warnings:E,errors:B,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:p,n_embd:m,quantization_version:d,file_type:f,kv_layer_count:x,swa:w?.enabled?{window:w.window,pattern:w.pattern,dense_first:w.denseFirst,type:w.type,layers:w.swaLayers}:null}},runtime:{variant:$.selected.variant,n_ctx:k,requested_ctx:S,n_gpu_layers:L,n_parallel:e.model.n_parallel,n_batch:e.model.n_batch,flash_attn_type:V,cache_type_k:M.k,cache_type_v:M.v,ctx_shift:e.model.ctx_shift,kv_unified:e.model.kv_unified,swa_full:e.model.swa_full,estimated_max_n_ctx:F,auto_gpu_layers:G},resources:{modelBytes:N,kvCacheBytes:z,totalEstimatedBytes:j,gpuCapacityBytes:I,gpuUsableBytes:P,cpuUsableBytes:U,fit:$.selected.fit},devices:{selected:$.selected,attempts:$.attempts},download:{cacheDir:H,localPath:J,exists:K},timestamp:(new Date).toISOString()};return{config:e,info:Y,artifact:t,metadata:{arch:r,nCtxTrain:o,nLayer:p,nEmbd:m},devices:$,cacheTypes:M,localPath:J,localExists:K}},Jn=(e,t)=>`event: ${e}\ndata: ${null==t?"":JSON.stringify(t)}\n\n`,Kn=(e,t)=>{let n;return new _n({async start(r){try{const o=await e.parallel.completion(t,((e,t)=>{t&&r.enqueue(Sn.encode(Jn("token",{requestId:e,...t})))})),{requestId:a}=o;n=o.stop;const i=await o.promise;console.log("[Completion] Result:",i),r.enqueue(Sn.encode(Jn("result",{requestId:a,...i}))),r.close()}catch(e){r.enqueue(Sn.encode(Jn("error",{message:e?.message||String(e)}))),r.error(e)}},cancel(){n&&n()}})},Yn=e=>{const t={model:e.plan.localPath,runtime:e.plan.info.runtime};return(0,zt.createHash)("sha256").update(JSON.stringify(t)).digest("hex").slice(0,24)},Wn=async(e,t)=>{const n=Yn(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 n=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=qt.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=qt.join(t,c);await Dn(d)||await Ln(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 await Ln(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 o={model:n,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 a;"off"!==e.plan.info.runtime.flash_attn_type&&(o.cache_type_k=e.plan.info.runtime.cache_type_k,o.cache_type_v=e.plan.info.runtime.cache_type_v),console.log("[Context] Load Options:",o);try{if(a=await(0,Dt.loadModel)(o,(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 a.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=a,r.modelInfo=a.getModelInfo(),r}catch(e){if(a)try{a.release()}catch(e){}throw e}})(),e.contexts.set(n,r);try{return await r.ready,r}catch(t){throw e.contexts.delete(n),t}},Qn=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 Zn(e,t){const n=await Hn(In(t)),r={id:e,type:"ggml-llm",config:t,plan:n,info:n.info,contexts:new Map,downloads:new Map};return{id:e,type:"ggml-llm",info:n.info,initContext:async(e={})=>{const{onProgress:t}=e,n=await Wn(r,t);return{modelInfo:n.modelInfo?{...n.modelInfo}:null,runtime:{...r.plan.info.runtime},download:{...r.plan.info.download}}},completion:async(e={})=>{const{options:t={}}=e,n=Yn(r),o=r.contexts.get(n);if(!o)throw new Error(`Context "${n}" not initialized`);return await o.ready,Kn(o.context,t)},tokenize:async(e={})=>{const{text:t="",params:n={}}=e,o=Yn(r),a=r.contexts.get(o);if(!a)throw new Error(`Context "${o}" not initialized`);await a.ready;const i=await a.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=Yn(r),o=r.contexts.get(n);if(!o)throw new Error(`Context "${n}" not initialized`);await o.ready;const a=t.map((e=>Number(e)));return o.context.detokenize(a)},applyChatTemplate:async(e={})=>{const{messages:t=[],template:n,params:o}=e,a=Yn(r),i=r.contexts.get(a);if(!i)throw new Error(`Context "${a}" not initialized`);return await i.ready,i.context.getFormattedChat(t,n,o)},releaseContext:async(e={})=>{const t=Yn(r),n=r.contexts.get(t);return!!n&&Qn(r,n,Boolean(e.force))},finalize:async()=>{const e=Array.from(r.contexts.values()).map((e=>Qn(r,e,!0)));await Promise.allSettled(e)}}}const Xn=e=>{const t=In(e);return t.model.repo_id||t.model.repository||t.model.model||null};const er=e=>e?"number"==typeof e.score&&Number.isFinite(e.score)?Number(e.score):Yt(e):0;async function tr(e=null,t={}){const{threshold:n=1.1,includeBreakdown:r=!1,config:o,...a}=t;let i=null,s=null,l=null,c=null,u=null,d=null;if(o)try{const{modelBytes:e,kvCacheBytes:t,limitedKvCacheBytes:n,memoryLimitedCtx:r,kvInfo:a,quantization:f}=await async function(e){const t=In(e),n=await Gn(t),r=await jn(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:f,fileType:p}=yn(r),m=Number.isFinite(Number(i))?Number(i):0,y=Number.isFinite(Number(s))?Number(s):0,h=Number.isFinite(Number(l))?Number(l):0,g=Number.isFinite(Number(c))?Number(c):h,b=h>0&&y>0?y/h:128,v=Number.isFinite(Number(u))?Number(u):b,w=Number.isFinite(Number(d))?Number(d):b,_=mn({arch:o,metadata:r,nLayer:m}),x=_&&Number.isFinite(Number(_.kvLayers))?Number(_.kvLayers):m,S=Math.max(0,Math.floor(Number(x)||0)),k=(t.model.n_ctx?Number(t.model.n_ctx):null)||a||4096,E={k:t.model.cache_k_type,v:t.model.cache_v_type},B=n.size>0?n.size:0,C=hn({layerCount:S,headKvCount:g,embdHeadKCount:v,embdHeadVCount:w,cacheTypes:E,swaConfig:_,kvUnified:t.model.kv_unified,nParallel:t.model.n_parallel,swaFull:t.model.swa_full}),M=null!=t.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(t.backend.gpu_memory_fraction))):On.backend.gpu_memory_fraction||1,N=null!=t.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(t.backend.cpu_memory_fraction))):Nn,O=C(k),T=await Vn(t,{modelBytes:B,kvCacheBytes:O}),$=(T.selected.totalMemory||0)*M,I=Math.max(0,Rt.totalmem()*N),P=T.selected.hasGpu?$:I,A=gn({maxCtx:k,availableMemory:P,modelBytes:B,kvBytesForCtx:C}),U=C(k),q=C(A);return{kvInfo:{nCtxTrain:a,nLayer:m,nEmbd:y,nHeadKv:g,nEmbdHeadK:v,nEmbdHeadV:w,nHeadCount:h,nHeadKvCount:g,kvLayerCount:S,swa:_?.enabled?{window:_.window,pattern:_.pattern,denseFirst:_.denseFirst,type:_.type,layers:_.swaLayers}:null},modelBytes:B,kvCacheBytes:U,limitedKvCacheBytes:q,memoryLimitedCtx:A,quantization:{fileType:p,version:f}}}(o);i=e,s=t,l=n,c=r,u=a,d=f}catch(e){}const f=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 sn({...a,platform:process.platform,totalMemoryInBytes:Rt.totalmem(),backend:"ggml-llm",includeBreakdown:r,gpuMemoryFraction:f,cpuMemoryFraction:p,dependencies:{getBackendDevicesInfo:Dt.getBackendDevicesInfo,isLibVariantAvailable:Dt.isLibVariantAvailable},modelBytes:i,kvCacheBytes:s,limitedKvCacheBytes:l}),y=m.selected,h=er(y);y.modelBytes=i||null,y.kvCacheBytes=s||null,y.memoryLimitedCtx=c||null,y.limitedKvCacheBytes=l||null,y.kvInfo=u||null,y.quantization=d||null;let g=null,b=null;if(e){const t=er(e);b={...e,score:t};let r="buttress",o="buttress-higher-score";if(m.ok)if(t||0===t){const e=b.fit,a=b.limitedFit,i=y?.fit,s=y?.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>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";g={buttressScore:h,clientScore:t,threshold:n,recommendation:r,reason:o}}m.ok||g||(g={buttressScore:h,clientScore:e?.score??null,threshold:n,recommendation:"local",reason:"buttress-unavailable"});let v=null;return o&&(v={repoId:o.model?.repo_id||null,quantization:o.model?.quantization||null,nCtx:o.model?.n_ctx||null,cacheKType:o.model?.cache_k_type||"f16",cacheVType:o.model?.cache_v_type||"f16"}),{type:"ggml-llm",timestamp:(new Date).toISOString(),buttress:m,client:b,comparison:g,modelConfig:v}}const nr=(e=>{var t={};return d.d(t,e),t})({initWhisper:()=>a.initWhisper}),{WritableStream:rr}="undefined"!=typeof globalThis&&globalThis.ReadableStream&&globalThis.WritableStream?{ReadableStream:globalThis.ReadableStream,WritableStream:globalThis.WritableStream}:vn,or=(e={},t={})=>(Object.entries(t||{}).forEach((([t,n])=>{n&&"object"==typeof n&&!Array.isArray(n)?(e[t]&&"object"==typeof e[t]||(e[t]={}),or(e[t],n)):e[t]=n})),e),ar="https://huggingface.co",ir="https://huggingface.co/api",sr=qt.join(Rt.homedir(),".buttress","models"),lr=["cuda","vulkan","default"],cr=["q8_0","q5_1","q5_0","q4_1","q4_0","base"],ur={backend:{type:"ggml-stt",variant:null,variant_preference:lr,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:ir,base_url:ar,use_gpu:!0,use_flash_attn:"auto"},runtime:{cache_dir:sr,prefer_variants:[],huggingface_token:process.env.HUGGINGFACE_TOKEN||null,http_headers:{},max_threads:null}},dr=(e,t=[])=>e||0===e?Array.isArray(e)?e.filter((e=>null!=e)):[e]:[...t],fr=e=>{if(!e)return null;const t=String(e).toLowerCase();return["cuda","vulkan","default"].includes(t)?t:null},pr=(e={})=>{const t=JSON.parse(JSON.stringify(ur));if(or(t,e),t.backend.variant=fr(t.backend.variant),t.backend.variant_preference=Array.from(new Set(dr(t.backend.variant_preference||lr).map(fr).filter(Boolean))),0===t.backend.variant_preference.length&&(t.backend.variant_preference=[...lr]),t.runtime.prefer_variants=Array.from(new Set(dr(t.runtime.prefer_variants).map(fr).filter(Boolean))),t.model.preferred_quantizations=Array.from(new Set(dr(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||ar,t.model.api_base=t.model.api_base||ir,t.runtime.cache_dir=t.runtime.cache_dir?qt.resolve(t.runtime.cache_dir):sr,t},mr=e=>{const t=e.toLowerCase();return cr.find((e=>t.includes(e)))||null},yr=async e=>{await(0,Ft.mkdir)(e,{recursive:!0})},hr=(e,t,n=sr)=>{const r=(0,zt.createHash)("sha256").update(e).digest("hex");return qt.join(((e=sr)=>qt.join(e,".metadata-cache"))(n),t,`${r}.json`)},gr=async(e,t,n,r=sr)=>{try{const o=hr(e,t,r);await yr(qt.dirname(o)),await(0,Ft.writeFile)(o,JSON.stringify(n),"utf-8")}catch(e){}},br=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},vr=async(e,t)=>{try{const n=await(0,Ft.stat)(e);return!t||n.size===t}catch(e){return!1}},wr=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=sr)=>{try{const r=hr(e,t,n),o=await(0,Ft.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 br(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:mr(l||""),headers:i};return await gr(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:cr;if(s)l||(l=mr(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||mr(s)}const f=`${e.model.base_url.replace(/\/+$/,"")}/${t}/resolve/${n}/${s}`,p=await br(f,{headers:i}),m={repoId:t,revision:n,filename:s,url:f,size:Number(p.headers.get("content-length"))||null,quantization:l,headers:i,isSplit:!1,splitCount:0};return await gr(o,"artifact-info",m,r),m},_r=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(fr).filter(Boolean)))})(e),[o,...a]=r,i=null!=e.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.gpu_memory_fraction))):ur.backend.gpu_memory_fraction||1,s=null!=e.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(e.backend.cpu_memory_fraction))):.5,l=await sn({platform:process.platform,totalMemoryInBytes:Rt.totalmem(),backend:"ggml-stt",variant:o||null,preferVariants:a,variantPreference:e.backend.variant_preference,gpuMemoryFraction:i,cpuMemoryFraction:s,dependencies:{getBackendDevicesInfo:Dt.getBackendDevicesInfo,isLibVariantAvailable:Dt.isLibVariantAvailable},modelBytes:t,kvCacheBytes:n}),c=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(!l.ok||!l.selected){const e=(l.attempts||[]).map((e=>`${e.variant}: ${e.error||"unknown error"}`)).join("; ");throw new Error(`Unable to initialize any backend variant (${r.join(", ")}). Errors: ${e}`)}const u=(l.attempts||[]).map(c);return{selected:c(l.selected),attempts:u}},xr=async e=>{const t=await wr(e),n=un({modelBytes:t.size>0?t.size:0}),r=await _r(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 qt.resolve(e.model.local_path);const n=t.repoId.split("/"),r=qt.join(e.runtime.cache_dir,...n,t.revision);return qt.join(r,t.filename)})(e,t),c=await vr(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}},Sr=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 vr(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 yr(qt.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,Ft.open)(n,"w"),s=Number(a.headers.get("content-length"))||r||0;let l=0,c=.05;try{await a.body.pipeTo(new rr({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,Ft.unlink)(n).catch((()=>{})),e}}))}catch(e){throw await i.close().catch((()=>{})),await(0,Ft.unlink)(n).catch((()=>{})),e}if(r){const e=await(0,Ft.stat)(n);if(e.size!==r)throw await(0,Ft.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 kr{constructor(){this.queue=[],this.processing=!1}async enqueue(e){return new Promise(((t,n)=>{this.queue.push({task:e,resolve:t,reject:n}),this.processNext()}))}async processNext(){if(this.processing||0===this.queue.length)return;this.processing=!0;const{task:e,resolve:t,reject:n}=this.queue.shift();try{t(await e())}catch(e){n(e)}finally{this.processing=!1,this.processNext()}}}const Er=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")},Br=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=await Sr(e.plan,e.downloads,t),o=await(0,nr.initWhisper)({filePath:r,useFlashAttn:e.plan.info.runtime.use_flash_attn,useGpu:e.plan.info.runtime.use_gpu},e.plan.info.runtime.variant);n.context=o;try{n.modelInfo=await o.getModelInfo()}catch(e){n.modelInfo=null}return n})(),e.contextRecord=n;try{return await n.ready,"function"==typeof t&&t(1),n}catch(t){throw e.contextRecord=null,t}},Cr=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 Mr(e,t){const n=await xr(pr(t)),r={id:e,type:"ggml-stt",config:t,plan:n,info:n.info,contextRecord:null,downloads:new Map,queue:new kr},o=async(e={})=>{const{audioPath:t,audioData:n,options:o={}}=e,a=await Br(r),i={...o};return r.plan.info.runtime.max_threads&&null==i.maxThreads&&(i.maxThreads=r.plan.info.runtime.max_threads),r.queue.enqueue((async()=>{if(await a.ready,n){const e=Er(n),{promise:t}=a.context.transcribeData(e,i);return await t}if(!t)throw new Error("audioPath or audioData is required for transcription");const e=qt.resolve(t),{promise:r}=a.context.transcribe(e,i);return await r}))};return{id:e,type:"ggml-stt",info:n.info,initContext:async(e={})=>{const{onProgress:t}=e,n=await Br(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&&Cr(r,t,Boolean(e.force))},finalize:async()=>{r.contextRecord&&await Cr(r,r.contextRecord,!0)}}}const Nr=e=>{const t=pr(e);return t.model.repo_id||t.model.repository||t.model.model||null},Or=e=>e?"number"==typeof e.score&&Number.isFinite(e.score)?Number(e.score):Yt(e):0;const Tr=new Map,$r=(e,t)=>{const n=(e=>{const t=Tr.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 Ir(e,t){const n={"ggml-llm":{create:Zn,getId:Xn},"ggml-stt":{create:Mr,getId:Nr}}[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=Tr.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 Tr.set(o,s),{id:o,info:i.info}}async function Pr(e){const t=Tr.get(e);return!!t&&(t.refCount-=1,t.refCount<=0&&(await t.instance.finalize(),Tr.delete(e)),!0)}async function Ar(e,t=null,n={}){if("ggml-llm"===e)return tr(t,n);if("ggml-stt"===e)return async function(e=null,t={}){const{threshold:n=1.1,includeBreakdown:r=!1,config:o,...a}=t;let i=null,s=null,l=null;if(o)try{const e=pr(o),t=await wr(e);i=t.size??null,({processingBufferBytes:s}=un({modelBytes:i})),l=t.quantization||null}catch(e){}const c=null!=o?.backend?.gpu_memory_fraction?Math.min(1,Math.max(0,Number(o.backend.gpu_memory_fraction))):void 0,u=null!=o?.backend?.cpu_memory_fraction?Math.min(1,Math.max(0,Number(o.backend.cpu_memory_fraction))):void 0,d=await sn({...a,platform:process.platform,totalMemoryInBytes:Rt.totalmem(),backend:"ggml-stt",includeBreakdown:r,gpuMemoryFraction:c,cpuMemoryFraction:u,dependencies:{getBackendDevicesInfo:Dt.getBackendDevicesInfo,isLibVariantAvailable:Dt.isLibVariantAvailable},modelBytes:i,kvCacheBytes:s}),f=d.selected,p=Or(f);f&&(f.modelBytes=i||null,f.processingBytes=s||null,f.quantization=l||null);let m=null,y=null;if(e){const t=Or(e);y={...e,score:t};let r="buttress",o="buttress-higher-score";if(d.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>p*n?(r="local",o="client-better"):p>t*n?(r="buttress",o="buttress-better"):(r="either",o="comparable-scores")}else t>p*n?(r="local",o="client-better"):p>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";m={buttressScore:p,clientScore:t,threshold:n,recommendation:r,reason:o}}d.ok||m||(m={buttressScore:p,clientScore:e?.score??null,threshold:n,recommendation:"local",reason:"buttress-unavailable"});let h=null;return o&&(h={repoId:o.model?.repo_id||null,quantization:o.model?.quantization||null,filename:o.model?.filename||null}),{type:"ggml-stt",timestamp:(new Date).toISOString(),buttress:d,client:y,comparison:m,modelConfig:h}}(t,n);throw new Error(`Unknown backend type: ${e}`)}const Ur={initContext:async(e,t)=>$r(e,"ggml-llm").initContext(t),completion:async(e,t)=>$r(e,"ggml-llm").completion(t),tokenize:async(e,t)=>$r(e,"ggml-llm").tokenize(t),detokenize:async(e,t)=>$r(e,"ggml-llm").detokenize(t),applyChatTemplate:async(e,t)=>$r(e,"ggml-llm").applyChatTemplate(t),releaseContext:async(e,t)=>$r(e,"ggml-llm").releaseContext(t)},qr={initContext:async(e,t)=>$r(e,"ggml-stt").initContext(t),transcribe:async(e,t)=>$r(e,"ggml-stt").transcribe(t),transcribeData:async(e,t)=>$r(e,"ggml-stt").transcribeData(t),releaseContext:async(e,t)=>$r(e,"ggml-stt").releaseContext(t)};function Rr(e,t){return"ggml-llm"===e?Xn(t):"ggml-stt"===e?Nr(t):null}const{version:Fr,name:zr}={version:"2.23.0-beta.23",name:"@fugood/buttress-server-poc"},jr=async()=>{const e=`https://registry.npmjs.org/${zr}/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}},Dr=(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},Lr=async()=>{try{const e=await jr();e&&Dr(Fr,e)&&(e=>{console.log(""),console.log("╭─────────────────────────────────────────────────╮"),console.log("│ Update available! %s → %s",Fr.padEnd(12),e.padEnd(12),"│"),console.log("│ │"),console.log("│ Run to upgrade: │"),console.log("│ npm install -g %s │",zr.padEnd(27)),console.log("╰─────────────────────────────────────────────────╯"),console.log("")})(e)}catch(e){}},Gr=t(import.meta.url)("node:fs"),Vr=t(import.meta.url)("node:child_process");const Hr=(e=>{var t={};return d.d(t,e),t})({default:()=>i.default}),Jr=JSON.parse('{"UU":"@fugood/buttress-server-poc","rE":"2.23.0-beta.23"}'),Kr=e=>{if(!e)return{repoId:null,filename:null};const[t,n]=e.split(":");return{repoId:t,filename:n||null}};async function Yr({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||{}),c=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},u=[];for(let t=0;t<e.length;t+=1){const n=e[t];console.log(`[${t+1}/${e.length}] Analyzing ${n}...`);let r=c(n);r={...r||{},model:{...r?.model||{},repo_id:n}};const o=await Ar("ggml-llm",null,{config:r,includeBreakdown:!0});u.push({modelId:n,capabilities:o,modelInfo:o.buttress?.selected||null,modelConfig:o.modelConfig||null})}const d=e=>e?(e/1024/1024/1024).toFixed(2):"N/A",f=e=>e?"✅":"🚫";n.push("| Model ID | Size (GB) | Context Size | KV Cache Size (GB) | Total Required Memory (GB) | Fits GPU (Full) | Fits CPU (Full) |"),n.push("|----------|-----------|--------------|--------------------|----------------------------|-----------------|-----------------|"),u.forEach((({modelId:e,modelInfo:t,modelConfig:r})=>{const o=d(t?.modelBytes),a=r?.nCtx||t?.kvInfo?.nCtxTrain||"N/A",i=hn(t),s=Number(a),l=t?.kvCacheBytes||(i&&Number.isFinite(s)&&s>0?i(s):i&&i(t?.kvInfo?.nCtxTrain||0))||null,c=d(l),u=d(t?.modelBytes&&l?t.modelBytes+l:t?.fit?.totalRequiredBytes),p=f(t?.fit?.fitsInGpu),m=f(t?.fit?.fitsInCpu);n.push(`| ${e} | ${o} | ${a} | ${c} | ${u} | ${p} | ${m} |`);if((null!=t?.memoryLimitedCtx||null!=t?.limitedFit)&&(!t?.fit?.fitsInGpu||!t?.fit?.fitsInCpu)){const e=t?.memoryLimitedCtx||a,r=Number(e),s=t?.limitedKvCacheBytes||i&&Number.isFinite(r)&&r>0&&i(r)||null,l=d(s),p=d(t?.modelBytes&&s?t.modelBytes+s:t?.limitedFit?.totalRequiredBytes),m=f(t?.limitedFit?.fitsInGpu),y=f(t?.limitedFit?.fitsInCpu);(e!==a||l!==c||p!==u)&&n.push(`| ↳ Limited | ${o} | ${e} | ${l} | ${p} | ${m} | ${y} |`)}})),n.push("\n---"),n.push("\n### System Information");let p=null;if("win32"!==process.platform)try{p=(0,Vr.execSync)("uname -a",{encoding:"utf8"}).trim()}catch{}if(p?n.push(`- **System:** ${p}`):(n.push(`- **Hostname:** ${Rt.hostname()}`),n.push(`- **OS:** ${Rt.type()} ${Rt.release()}`)),n.push(`- **Platform:** ${process.platform}`),n.push(`- **CPU Cores:** ${Rt.cpus().length}`),n.push(`- **Total System Memory:** ${(Rt.totalmem()/1024/1024/1024).toFixed(2)} GB`),u.length>0){const e=u[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 m=process.argv.slice(2).join(" ");if(n.push(`\`\`\`bash\n${process.argv[0]} ${process.argv[1]} ${m}\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=Hr.default.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`,h=qt.join(process.cwd(),y);Gr.writeFileSync(h,n.join("\n"),"utf8"),console.log(`\nModel capabilities table saved to: ${h}`),process.exit(0)}catch(e){console.error("Failed to generate model table:",e.message),process.exit(1)}}async function Wr({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 Ar("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;if(console.log(`Repository ID: ${t}`),d?.quantization&&console.log(`Quantization: ${d.quantization}`),d?.nCtx&&console.log(`Context Length: ${d.nCtx}`),u?.quantization){const{fileType:e}=u.quantization;null!=e&&console.log(`Model File Type (GGUF): ${e}`)}const n=d?.cacheKType||"f16",r=d?.cacheVType||"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,Vr.execSync)("uname -a",{encoding:"utf8"}).trim()}catch{}t?console.log(`System: ${t}`):(console.log(`Hostname: ${Rt.hostname()}`),console.log(`OS: ${Rt.type()} ${Rt.release()}`)),console.log(`Platform: ${e.platform}`),console.log(`CPU Cores: ${Rt.cpus().length}`),console.log(`Total System Memory: ${(Rt.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 Qr({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||{}),c=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},u=[];for(let t=0;t<e.length;t+=1){const n=e[t],{repoId:r,filename:o}=Kr(n);console.log(`[${t+1}/${e.length}] Analyzing ${n}...`);let a=c(r);a={...a||{},model:{...a?.model||{},repo_id:r,...o&&{filename:o}}};const i=await Ar("ggml-stt",null,{config:a,includeBreakdown:!0});u.push({modelId:n,repoId:r,filename:o,capabilities:i,modelInfo:i.buttress?.selected||null,modelConfig:i.modelConfig||null})}const d=e=>e?(e/1024/1024).toFixed(1):"N/A",f=e=>e?"✅":"🚫";n.push("| Model | Size (MB) | Processing Buffer (MB) | Total Required (MB) | Fits GPU | Fits CPU |"),n.push("|-------|-----------|------------------------|---------------------|----------|----------|"),u.forEach((({modelId:e,modelInfo:t})=>{const r=d(t?.modelBytes),o=d(t?.processingBytes||t?.kvCacheBytes),a=d(t?.fit?.totalRequiredBytes),i=f(t?.fit?.fitsInGpu),s=f(t?.fit?.fitsInCpu);n.push(`| ${e} | ${r} | ${o} | ${a} | ${i} | ${s} |`)})),n.push("\n---"),n.push("\n### System Information");let p=null;if("win32"!==process.platform)try{p=(0,Vr.execSync)("uname -a",{encoding:"utf8"}).trim()}catch{}if(p?n.push(`- **System:** ${p}`):(n.push(`- **Hostname:** ${Rt.hostname()}`),n.push(`- **OS:** ${Rt.type()} ${Rt.release()}`)),n.push(`- **Platform:** ${process.platform}`),n.push(`- **CPU Cores:** ${Rt.cpus().length}`),n.push(`- **Total System Memory:** ${(Rt.totalmem()/1024/1024/1024).toFixed(2)} GB`),u.length>0){const e=u[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 m=process.argv.slice(2).join(" ");if(n.push(`\`\`\`bash\n${process.argv[0]} ${process.argv[1]} ${m}\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=Hr.default.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`,h=qt.join(process.cwd(),y);Gr.writeFileSync(h,n.join("\n"),"utf8"),console.log(`\nSTT model capabilities table saved to: ${h}`),process.exit(0)}catch(e){console.error("Failed to generate STT model table:",e.message),process.exit(1)}}async function Zr({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}=Kr(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:{...u?.model||{},repo_id:n,...r&&{filename:r}}});const d=await Ar("ggml-stt",null,{config:u,includeBreakdown:!0}),f=d.buttress?.selected||null,p=d.modelConfig||null;if(n||p?.repoId){console.log("\n=== Model Information ===");const e=n||p?.repoId;console.log(`Repository ID: ${e}`),r&&console.log(`Filename: ${r}`),f?.modelBytes&&console.log(`Model Size: ${(f.modelBytes/1024/1024).toFixed(1)} MB`);const t=f?.processingBytes||f?.kvCacheBytes;if(t&&console.log(`Processing Buffer: ${(t/1024/1024).toFixed(1)} MB`),f?.modelBytes&&t)console.log(`Total Required Memory: ${((f.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,Vr.execSync)("uname -a",{encoding:"utf8"}).trim()}catch{}t?console.log(`System: ${t}`):(console.log(`Hostname: ${Rt.hostname()}`),console.log(`OS: ${Rt.type()} ${Rt.release()}`)),console.log(`Platform: ${e.platform}`),console.log(`CPU Cores: ${Rt.cpus().length}`),console.log(`Total System Memory: ${(Rt.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 Xr=new TextDecoder,eo=p.initTRPC.context().create(),to=Ut.z.record(Ut.z.any()).optional(),no=Ut.z.object({id:Ut.z.string()}),ro=Ut.z.object({id:Ut.z.string(),property:Ut.z.any().optional()}),oo=Ut.z.object({type:Ut.z.string(),config:to}),ao=Ut.z.object({type:Ut.z.string().optional().default("ggml-llm"),config:to,currentClientCapabilities:Ut.z.record(Ut.z.any()).optional(),options:Ut.z.record(Ut.z.any()).optional()}).optional(),io=(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]=io(n[e]||{},t):n[e]=t})),n},so=e=>e&&"object"==typeof e?JSON.parse(JSON.stringify(e)):null,lo=(e,t)=>{const n=so(e)||{},r=so(t)||{};return io(n,r)},co=(e=f,{defaultConfig:t}={})=>{const n=so(t)||{},r=Array.isArray(n.generators)?n.generators:[],{server:o,generators:a,...i}=n,s=e=>io(JSON.parse(JSON.stringify(i)),e||{}),l=(e,t)=>{if(r.length>0){const n=r.filter((t=>t?.type===e));if(n.length>0&&t){const e=n.find((e=>e.model?.repo_id===t));if(e)return s(e)}}return Object.keys(i).length>0?s({}):null};return eo.router({getCapabilities:eo.procedure.input(ao).query((async({input:t})=>{console.log("[Server] Get Capabilities:",t);const n=t||{type:"ggml-llm"},{type:r="ggml-llm",config:o,currentClientCapabilities:a=null,options:i={}}=n,s=so(o),c=e.getModelIdentifier(r,s),u=l(r,c),d=lo(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:eo.procedure.input(oo).mutation((async({input:t})=>{console.log("[Server] Start Generator:",t);const{type:n,config:r}=t,o=so(r),a=e.getModelIdentifier(n,o),i=l(n,a),s=lo(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:eo.procedure.input(no).mutation((async({input:t})=>(console.log("[Server] Finalize Generator:",t),e.finalizeGenerator(t.id)))),ggmlLlm:eo.router({initContext:eo.procedure.input(ro).subscription((({input:t})=>W((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}})))),completion:eo.procedure.input(ro).subscription((({input:t})=>W((n=>{console.log("[Server] Completion:",t);let r=()=>{};return(async()=>{try{const o=await e.ggmlLlm.completion(t.id,t.property);if(!o)return void n.complete();r=((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=Xr.decode(e,{stream:!0});t.next(n)}}t.complete()}catch(e){t.error(e)}finally{n.cancel().catch((()=>{}))}})(),()=>{r=!1,n.cancel().catch((()=>{}))}})(o,n)}catch(e){n.error(e)}})(),()=>r()})))),tokenize:eo.procedure.input(ro).query((async({input:t})=>(console.log("[Server] Tokenize:",t),e.ggmlLlm.tokenize(t.id,t.property)))),detokenize:eo.procedure.input(ro).mutation((async({input:t})=>(console.log("[Server] Detokenize:",t),e.ggmlLlm.detokenize(t.id,t.property)))),applyChatTemplate:eo.procedure.input(ro).query((async({input:t})=>(console.log("[Server] Apply Chat Template:",t),e.ggmlLlm.applyChatTemplate(t.id,t.property)))),releaseContext:eo.procedure.input(ro).mutation((async({input:t})=>(console.log("[Server] Release Context:",t),e.ggmlLlm.releaseContext(t.id,t.property))))}),ggmlStt:eo.router({initContext:eo.procedure.input(ro).subscription((({input:t})=>W((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:eo.procedure.input(Ut.z.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:eo.procedure.input(ro).mutation((async({input:t})=>(console.log("[Server] Release STT Context:",t),e.ggmlStt.releaseContext(t.id,t.property))))})})},uo=({backend:e=f,router:t,createContext:n=(()=>({})),defaultConfig:r}={})=>{const o=t||co(e,{defaultConfig:r});return{server:At({router:o,createContext:n,basePath:"/trpc/"}),router:o,backend:e}},fo=async({port:e=2080,backend:t,router:n,createContext:r,defaultConfig:o}={})=>{const{server:a,router:i}=uo({backend:t,router:n,createContext:r,defaultConfig:o});return await new Promise((t=>a.listen(e,t))),{server:a,router:i,port:e}};export{Lr as checkAndNotifyUpdates,jr as checkForUpdates,Dr as compareVersions,co as createRouter,uo as createServer,Fr as currentVersion,Yr as showModelsTable,Qr as showSttModelsTable,fo as startServer,Wr as testGgmlLlmCapabilities,Zr 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.22",
3
+ "version": "2.23.0-beta.23",
4
4
  "type": "module",
5
5
  "main": "lib/index.js",
6
6
  "files": [
@@ -17,7 +17,7 @@
17
17
  "start": "node bin/start.mjs"
18
18
  },
19
19
  "dependencies": {
20
- "@fugood/llama.node": "^1.4.4",
20
+ "@fugood/llama.node": "^1.4.6",
21
21
  "@huggingface/gguf": "^0.3.2",
22
22
  "@iarna/toml": "^3.0.0",
23
23
  "@trpc/server": "^11.6.0",
@@ -26,5 +26,5 @@
26
26
  "devDependencies": {
27
27
  "terser-webpack-plugin": "^5.0.3"
28
28
  },
29
- "gitHead": "d0a0fe0012e6938d1e756e0c6ef04759e997e138"
29
+ "gitHead": "8333b59a42b67c403834434cd549cdd354497129"
30
30
  }