@caldrix-ai/caldrix 0.3.0 → 0.4.0

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/CHANGELOG.md CHANGED
@@ -3,12 +3,19 @@
3
3
  Format after [Keep a Changelog](https://keepachangelog.com/); versions are independent semver, tagged
4
4
  `caldrix-js-v<version>`.
5
5
 
6
+ ## 0.4.0 — 2026-11-04
7
+
8
+ ### Added
9
+
10
+ - `Caldrix.check(model, opts?)` and its types `CheckOptions` and `CheckResult`: which tier a load of the model would end on in this tab (`{ ok: true, backend }`), or why the load would be refused (`{ ok: false, kind, message }`), without loading it. It takes `load`'s tier-deciding options and `assets` (so it starts the same worker and `.wasm` as the load, under the same fallback rule), runs `load`'s option checks, probe and tier choice, then the load in its worker only until the tier is settled (the Hub listing for a repo id, and for a LoRA adapter repo its `adapter_config.json` and its base's Hub listing; `config.json` and the safetensors index or a GGUF alias's header range; the precheck; and on WebGPU the device open, destroyed again); it fetches no tokenizer file and no weight, and ends its worker on every answer. It never rejects; `kind: "fetch"` (an abort included) leaves the answer unknown. Covered by the unit tests over a scripted worker, and run in headless Chromium against the loopback hub (`inferno/WEB-VERIFICATION.md` entry 20): on a repo id, check and load agreed on the wasm tier and, on Dawn/SwiftShader (a CPU), the WebGPU tier, and the check fetched no tokenizer file and no weight; an index past the wasm ceiling checked as `fit`, an unknown repo id as `fetch`. Not run in a browser: an adapter repo or a GGUF alias through `check`, `signal`, `assets`.
11
+
6
12
  ## 0.3.0 — 2026-11-02
7
13
 
8
14
  ### Added
9
15
 
10
16
  - `Caldrix.load` takes a Hugging Face repo id, `owner/name[@revision]`, beside the aliases: resolved once to its canonical id and commit sha through the Hub's model API, every file fetched and cached at that sha, a gated repo is refused by name, a private one reads as not found (the Hub answers it as it answers a missing repo), and the caldrix CLI, which reads `HF_TOKEN`, loads both.
11
17
  - `Caldrix.load` loads a PEFT LoRA adapter repo, a bitsandbytes nf4 repo and a LoRA adapter over an nf4 base by repo id, densified at import (run in headless Chromium over a loopback hub on the wasm tier only; the WebGPU tier's densified load has run off-browser only, and `loadWebGpu`'s densified branch in no harness); `doctor().provenance` and `doctor().note`, and `repo`, `revision` and `provenance` on progress events.
18
+ - `Caldrix.load` of a repo that ships a SentencePiece BPE `tokenizer.model` and no `tokenizer.json` (the Llama-2, Mistral and Yi families) converts the tokenizer in the browser and loads; `doctor().source` names `tokenizer.model`; a Unigram model or a foreign tokenizer class is refused by name before any weight byte; run in headless Chromium on double7/vicuna-68m, token-exact at f32 on the wasm tier and on the WebGPU tier on SwiftShader (a CPU) — `inferno/WEB-VERIFICATION.md` entry 18.
12
19
 
13
20
  ### Changed
14
21
 
package/README.md CHANGED
@@ -8,7 +8,7 @@ This page states only what `inferno/WEB-VERIFICATION.md` records (in
8
8
  the Caldrix repository, which is private, so you cannot open it), what the package's own tests run in
9
9
  CI, and what the source does.
10
10
 
11
- <!-- host-commit: 9c890a49f6e794c2492312fc0b79d5c134054e8e -->
11
+ <!-- host-commit: 78d9f0c36868b8e9c44d1fa05f1b5719eaae0876 -->
12
12
 
13
13
  The compiled host in `host/` is built from the `caldrix-web` crate at the commit in the marker above.
14
14
  The release workflow overwrites that marker with the commit it builds; the value in a source checkout
@@ -40,6 +40,7 @@ The API, as the package's declarations have it:
40
40
  ```ts
41
41
  class Caldrix {
42
42
  static load(model: string, opts?: LoadOptions): Promise<Engine>;
43
+ static check(model: string, opts?: CheckOptions): Promise<CheckResult>;
43
44
  }
44
45
  class Engine {
45
46
  chat(messages: ChatMessage[], opts?: GenerateOptions): AsyncIterable<Delta>;
@@ -103,6 +104,41 @@ interface LoadOptions {
103
104
  source and URL of the worker and the `.wasm`: `bundle`, `cdn` or `page`), `aliases` (every alias
104
105
  this build loads, each with its `format`, `safetensors` or `gguf`), `provenance` (a densified load's `model:` line, `null` for a model read as it lies), `note` (an nf4 repo's 4-bit note, `null` otherwise), and `why`.
105
106
 
107
+ ## Checking a model before loading it
108
+
109
+ ```ts
110
+ type CheckOptions = Pick<LoadOptions, "backend" | "dtype" | "maxContext" | "storage" | "hubBaseUrl" | "signal" | "assets">;
111
+ type CheckResult = { ok: true; backend: "webgpu" | "wasm" } | { ok: false; kind: Kind; message: string };
112
+
113
+ const r = await Caldrix.check("smollm2-instruct");
114
+ if (r.ok) console.log(`a load would run on ${r.backend}`);
115
+ else if (r.kind !== "fetch") console.log(`a load would be refused: ${r.message}`);
116
+ ```
117
+
118
+ `Caldrix.check` says which tier a load of the model would end on in this tab, or why the load would
119
+ be refused, without loading it. It takes the same model and the same tier-deciding options as `load`,
120
+ and `assets`, so it starts the same worker and `.wasm` the load would, under the same fallback rule;
121
+ it runs the same option checks, the same probe and the same tier choice. Its worker then runs the
122
+ load only until the tier is settled: for a repo id the Hub listing (for a LoRA adapter repo, its
123
+ `adapter_config.json` and its base's Hub listing too), then `config.json` and the safetensors index
124
+ (for a GGUF alias, the file's header range instead), the same precheck as `load`, and on the WebGPU
125
+ tier the device open, after which the device is destroyed and the worker ends. It never fetches a
126
+ tokenizer file or a weight, sends no `onProgress` events, and is never `offline`.
127
+
128
+ Under `backend: "auto"` the answer is the tier the load would end on: a WebGPU refusal of the kinds
129
+ `load` falls back on (a limit, a larger explicit context, a device that fails to open) answers
130
+ `{ ok: true, backend: "wasm" }`, and a bf16 request answers wasm as `load` places it. An explicit
131
+ `"webgpu"` or `"wasm"` answers that tier or its refusal.
132
+
133
+ `check` never rejects. Every refusal is `{ ok: false, kind, message }`, with the kind and message
134
+ `load` would give: an option it refuses (an unknown backend, a `hubBaseUrl` that is not an absolute
135
+ http(s) URL, an empty model, `storage: "f32"` with `backend: "wasm"`) is `request`, a model past this
136
+ tab's limits is `fit`, and a worker that cannot start or answers out of protocol is `backend`.
137
+ `kind: "fetch"` means the answer is unknown: a file could not be fetched, or the check was aborted
138
+ through `signal` (`checking <model> was aborted`), so a load might still succeed. The CDN fallback
139
+ for the package's own files applies as on a load (off with `assets.fallback: false`), warned once per check on
140
+ the console. The files a check fetches are written to the cache, and a later load reuses them.
141
+
106
142
  ## Constrained decoding
107
143
 
108
144
  ```ts
@@ -139,10 +175,12 @@ one of the strings and stops. `{ json: <schema> }` yields a JSON value matching
139
175
 
140
176
  ## What has run, and where
141
177
 
142
- Only these model runs are recorded (`inferno/WEB-VERIFICATION.md`, entries 5, 8 and 9, and entries 10,
143
- 11, 12 and 14 for the quantized aliases); nothing else is claimed.
178
+ Only these model runs are recorded (`inferno/WEB-VERIFICATION.md`, entries 5, 8 and 9, entries 10,
179
+ 11, 12 and 14 for the quantized aliases, and entries 16 and 17 for the adapter and nf4 repos); nothing
180
+ else is claimed.
144
181
 
145
- - **Model:** SmolLM2-135M-Instruct, one prompt, 8 greedy tokens. No other model or prompt.
182
+ - **Model:** SmolLM2-135M-Instruct, one prompt, 8 greedy tokens; the adapter and nf4 repos below add a
183
+ LoRA adapter over it and SmolLM2-360M-Instruct's nf4 repo, on their fixtures' prompt. No other model or prompt.
146
184
  - **Browser:** Chromium driven by Playwright, headless only: the headless shell 153.0.8010.12 on Linux and on
147
185
  the operator's Apple M1 Max, and on that Mac Playwright's full Chromium (new headless mode, userAgent
148
186
  `HeadlessChrome/153.0.0.0`) for the WebGPU tier. No other browser.
@@ -159,9 +197,13 @@ Only these model runs are recorded (`inferno/WEB-VERIFICATION.md`, entries 5, 8
159
197
  - **Phase 2's exit is closed on the gates** (entry 9), with the run's two process deviations recorded there:
160
198
  the browser stages ran outside the sandbox, and the build's first attempt failed at its install step.
161
199
  - quantized aliases: off-browser at the desk on both tiers (`inferno/WEB-VERIFICATION.md` entries 10 and 11); in headless Chromium through `Caldrix.load` on both tiers on the pinned files, WebGPU on Dawn/SwiftShader, a CPU (entry 12); on the operator's Mac through `Caldrix.load` on both tiers, WebGPU on the Mac's own adapter, vendor `apple`, architecture `metal-3`, token-exact (entry 14).
162
- - **Not run:** any other adapter or GPU; a headed browser; the browser stages inside a sandbox; the scalar
163
- (non-SIMD) wasm spelling in a browser; real-Hub digest behaviour (the runs used a loopback Hub stand-in);
164
- any browser other than Playwright's headless Chromium; any other model. No performance figure is recorded
200
+ - adapter and nf4 repos by id (a LoRA adapter over SmolLM2-135M-Instruct, and SmolLM2-360M-Instruct's bitsandbytes nf4 repo, each at a pinned sha): off-browser at the desk on both tiers (`inferno/WEB-VERIFICATION.md` entry 16: wasm both pairs and WebGPU the LoRA pair token-exact, the f32 plan at f32 weight storage; the WebGPU nf4 pair stopped at lavapipe's storage-buffer binding limit); in headless Chromium through `Caldrix.load` by repo id on both tiers, both pairs token-exact, the f32 plan at f32 weight storage, WebGPU on Dawn/SwiftShader, a CPU (entry 17).
201
+ - `Caldrix.check`: in headless Chromium against the loopback hub (`inferno/WEB-VERIFICATION.md` entry 20): on a repo id, check and load agreed on the wasm tier and, under `--enable-unsafe-webgpu`, on the WebGPU tier on Dawn/SwiftShader, a CPU, and the check fetched no tokenizer file and no weight; an index past the wasm ceiling checked as `fit`, an unknown repo id as `fetch`.
202
+ - **Not run:** any other WebGPU adapter or GPU; a headed browser; the browser stages inside a sandbox; the scalar
203
+ (non-SIMD) wasm spelling in a browser; real-Hub digest behaviour (the runs used a loopback Hub stand-in); a real Hub listing for a repo id
204
+ (the loopback hub served the pinned snapshots); any browser other than Playwright's headless Chromium; any other model;
205
+ `Caldrix.check` against a real adapter's buffer limit (its unit tests only), against the real Hub, or in any other
206
+ browser or on any other device. No performance figure is recorded
165
207
  or claimed.
166
208
 
167
209
  ## The WebGPU default context
package/dist/index.d.ts CHANGED
@@ -1,3 +1,12 @@
1
+ /** The nine error kinds of the caldrix.js API (spec §5.4). */
2
+ type Kind = "probe" | "fit" | "architecture" | "fetch" | "digest" | "validate" | "lowering" | "backend" | "request";
3
+ declare class CaldrixError extends Error {
4
+ readonly kind: Kind;
5
+ /** Set by the Hub fetcher when the file is simply absent: not on the Hub (404) or not cached while offline. */
6
+ readonly missing?: "not-found" | "offline-uncached";
7
+ constructor(kind: Kind, message: string, missing?: "not-found" | "offline-uncached");
8
+ }
9
+
1
10
  /**
2
11
  * The generation options, passed to the host as its camelCase JSON. Any other key reaches the host
3
12
  * and is refused there by name; `signal` is the page's and never leaves the main thread.
@@ -23,15 +32,6 @@ interface GenerationOptions {
23
32
  maxTokens?: number;
24
33
  }
25
34
 
26
- /** The nine error kinds of the caldrix.js API (spec §5.4). */
27
- type Kind = "probe" | "fit" | "architecture" | "fetch" | "digest" | "validate" | "lowering" | "backend" | "request";
28
- declare class CaldrixError extends Error {
29
- readonly kind: Kind;
30
- /** Set by the Hub fetcher when the file is simply absent: not on the Hub (404) or not cached while offline. */
31
- readonly missing?: "not-found" | "offline-uncached";
32
- constructor(kind: Kind, message: string, missing?: "not-found" | "offline-uncached");
33
- }
34
-
35
35
  type ChatMessage = {
36
36
  role: "system" | "user" | "assistant";
37
37
  content: string;
@@ -200,9 +200,37 @@ interface AssetSource {
200
200
  type GenerateOptions = GenerationOptions & {
201
201
  signal?: AbortSignal;
202
202
  };
203
+ /**
204
+ * What `Caldrix.check` takes: the options that decide the tier and the files the check reads, and
205
+ * `assets`, so the check starts the same worker and `.wasm` (and the same fallback rule) as the load.
206
+ */
207
+ type CheckOptions = Pick<LoadOptions, "backend" | "dtype" | "maxContext" | "storage" | "hubBaseUrl" | "signal" | "assets">;
208
+ /**
209
+ * `Caldrix.check`'s answer: the tier a load of the model would end on in this tab, or why it would be
210
+ * refused. `kind: "fetch"` (a file could not be fetched, or the check was aborted) leaves it unknown.
211
+ */
212
+ type CheckResult = {
213
+ ok: true;
214
+ backend: "webgpu" | "wasm";
215
+ } | {
216
+ ok: false;
217
+ kind: Kind;
218
+ message: string;
219
+ };
203
220
  declare class Caldrix {
204
221
  /** Load a model, a built-in alias or a Hub repo id (`owner/name[@revision]`), into its own worker. */
205
222
  static load(model: string, opts?: LoadOptions): Promise<Engine>;
223
+ /**
224
+ * Which tier a load of `model` would end on in this tab, or why it would be refused, without
225
+ * loading it: the same option checks, probe and tier choice as `load`, then the worker runs the
226
+ * load only until its tier is settled (the Hub listing for a repo id, and for a LoRA adapter repo
227
+ * its `adapter_config.json` and its base's listing; `config.json` and the safetensors index, or a
228
+ * GGUF alias's header range; the precheck; on WebGPU the device open, destroyed again). It fetches
229
+ * no tokenizer file and no weight. `assets` starts the same worker and `.wasm` the load would.
230
+ * Never rejects: every refusal is `{ ok: false, kind, message }`, and an abort is `kind: "fetch"`,
231
+ * the answer unknown.
232
+ */
233
+ static check(model: string, opts?: CheckOptions): Promise<CheckResult>;
206
234
  }
207
235
  declare class Engine {
208
236
  #private;
@@ -271,4 +299,4 @@ interface Capabilities {
271
299
  }
272
300
  declare function probe(): Promise<Capabilities>;
273
301
 
274
- export { type AssetSource, Caldrix, CaldrixError, type Capabilities, type ChatMessage, type Delta, type DoctorReport, Engine, type GenerateOptions, type GenerationOptions, type Kind, type LoadOptions, probe };
302
+ export { type AssetSource, Caldrix, CaldrixError, type Capabilities, type ChatMessage, type CheckOptions, type CheckResult, type Delta, type DoctorReport, Engine, type GenerateOptions, type GenerationOptions, type Kind, type LoadOptions, probe };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{a as H,b as i,d as X}from"./chunk-PZGTLL5H.js";function W(e){return typeof e=="object"&&e!==null}function se(e){return W(e)&&typeof e.token=="number"&&typeof e.text=="string"&&typeof e.done=="boolean"&&(e.finishReason===null||e.finishReason==="stop"||e.finishReason==="length"||e.finishReason==="abort")&&typeof e.promptTokens=="number"&&typeof e.completionTokens=="number"&&typeof e.cachedTokens=="number"&&(e.logprobs===void 0||Array.isArray(e.logprobs)&&e.logprobs.every(t=>W(t)&&typeof t.token=="number"&&typeof t.logprob=="number"))}function ae(e){return!W(e)||typeof e.url!="string"?!1:e.failed===void 0||W(e.failed)&&typeof e.failed.url=="string"&&typeof e.failed.reason=="string"}function O(e){if(!W(e)||typeof e.id!="number")return!1;switch(e.type){case"ready":return e.id===0&&typeof e.url=="string";case"host":return ae(e.hostWasm);case"progress":return typeof e.file=="string"&&typeof e.loaded=="number"&&(e.total===null||typeof e.total=="number")&&typeof e.repo=="string"&&typeof e.revision=="string"&&(e.provenance===void 0||typeof e.provenance=="string");case"loaded":return W(e.doctor)&&W(e.sources)&&(e.fallback===void 0||typeof e.fallback=="string")&&Object.values(e.sources).every(t=>W(t)&&(t.source==="cache"||t.source==="network")&&typeof t.verified=="boolean");case"delta":return se(e.delta);case"result":return"value"in e;case"error":return H(e.kind)&&typeof e.message=="string"&&(e.fatal===void 0||typeof e.fatal=="string");default:return!1}}function m(e){let t;try{t=JSON.stringify(e)??String(e)}catch{t=String(e)}return t.length>200&&(t=`${t.slice(0,200)}...`),new i("backend",`the worker sent a malformed message: ${t}`)}var U=(...e)=>new Uint8Array(e),ie={simd:U(0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11),relaxedSimd:U(0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,15,1,13,0,65,1,253,15,65,2,253,15,253,128,2,11),bulkMemory:U(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,3,1,0,1,10,14,1,12,0,65,0,65,0,65,0,252,10,0,0,11),threads:U(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11),memory64:U(0,97,115,109,1,0,0,0,5,3,1,4,1),tailCall:U(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,6,1,4,0,18,0,11),exceptions:U(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,16,1,14,0,2,105,31,64,1,3,0,0,11,0,11,26,11)};function K(){let e={};for(let[t,r]of Object.entries(ie))e[t]=WebAssembly.validate(r);return e}var le=1e3,G=Symbol("timed out");async function z(e){let t,r=new Promise(n=>{t=setTimeout(()=>n(G),le)});try{return await Promise.race([e,r])}finally{clearTimeout(t)}}var V=e=>e instanceof Error?e.message:String(e);function Q(){let e=globalThis.navigator;return typeof e=="object"&&e!==null?e:{}}function P(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ue(){let e={available:!1,maxTextureSize:null,floatColorBuffer:null};try{let t=null;if(typeof OffscreenCanvas<"u"?t=new OffscreenCanvas(1,1):typeof document<"u"&&(t=document.createElement("canvas")),t===null)return e;let r=t,n=r.getContext("webgl2"),o=n??r.getContext("webgl");if(!o)return e;let s=P(o.getParameter(o.MAX_TEXTURE_SIZE)),l=o.getExtension(n?"EXT_color_buffer_float":"WEBGL_color_buffer_float")!==null;return o.getExtension("WEBGL_lose_context")?.loseContext(),{available:!0,maxTextureSize:s,floatColorBuffer:l}}catch{return e}}async function de(e){let t=e.info??{};if(!e.info&&typeof e.requestAdapterInfo=="function")try{t=await e.requestAdapterInfo()}catch{t={}}let r={},n=[];if(e.limits)for(let o in e.limits){let s=e.limits[o];typeof s=="number"?(r[o]=s,Number.isSafeInteger(s)||n.push(`${o} = ${s} (not a safe integer)`)):typeof s!="function"&&n.push(`${o} = ${JSON.stringify(s)??String(s)} (not a number)`)}return{vendor:t.vendor??"",architecture:t.architecture??"",device:t.device??"",description:t.description??"",features:e.features?[...e.features]:[],limits:r,unrepresentable:n}}async function ce(){let e=Q().gpu;if(!e||typeof e.requestAdapter!="function")return{webgpu:null,available:!1,reason:"no navigator.gpu"};let t;try{let n=await z(e.requestAdapter());if(n===G)return{webgpu:null,available:!1,reason:"requestAdapter timed out"};t=n}catch(n){return{webgpu:null,available:!1,reason:`requestAdapter failed: ${V(n)}`}}if(!t)return{webgpu:null,available:!1,reason:"requestAdapter returned null"};let r=await de(t);try{let n=await z(t.requestDevice());if(n===G)return{webgpu:r,available:!1,reason:"requestDevice timed out"};n.destroy?.()}catch(n){return{webgpu:r,available:!1,reason:`requestDevice refused: ${V(n)}`}}return{webgpu:r,available:!0}}function fe(e){return e.webgpu.available&&e.webgpu.built?"webgpu":"wasm"}function pe(e,t,r){let n=e.webgpu?.unrepresentable??[],o=n.length>0?`; adapter limits ${n.join(", ")}: the host reads them as missing`:"";return be(e,t,r)+o}function be(e,t,r){if(r==="webgpu"){let o=e.webgpu,s=o.features.includes("shader-f16")?" with shader-f16":"";return`WebGPU adapter present (${o.vendor} ${o.architecture})${s}: webgpu`}let n=e.wasm.simd?"with simd128":"without simd128";return e.webgpu===null?`no WebGPU adapter (${t.reason??"unavailable"}): wasm ${n}`:`WebGPU adapter present but unusable (${t.reason}): wasm ${n}`}async function q(){let e=Q(),t=await ce(),r={wasm:K(),threads:{sharedArrayBuffer:typeof SharedArrayBuffer<"u",crossOriginIsolated:globalThis.crossOriginIsolated===!0,hardwareConcurrency:P(e.hardwareConcurrency)},webgl:ue(),webgpu:t.webgpu,memory:{deviceMemoryGiB:P(e.deviceMemory)},tiers:{webgpu:t.available?{available:!0,built:!0}:{available:!1,built:!0,reason:t.reason},webgl:{available:!1,built:!1,reason:"not built"},wasm:{available:!0,built:!0}}};r.tiers.webgl.available=r.webgl.available;let n=fe(r.tiers);return{...r,chosen:n,why:pe(r,t,n)}}function Z(e){let t=e.webgpu===null?null:{vendor:e.webgpu.vendor,architecture:e.webgpu.architecture,device:e.webgpu.device,description:e.webgpu.description,features:e.webgpu.features,limits:Object.fromEntries(Object.entries(e.webgpu.limits).filter(([,r])=>Number.isSafeInteger(r)))};return JSON.stringify({wasm:{simd:e.wasm.simd,relaxedSimd:e.wasm.relaxedSimd,bulkMemory:e.wasm.bulkMemory,threads:e.wasm.threads,memory64:e.wasm.memory64,tailCall:e.wasm.tailCall,exceptions:e.wasm.exceptions},threads:{sharedArrayBuffer:e.threads.sharedArrayBuffer,crossOriginIsolated:e.threads.crossOriginIsolated,hardwareConcurrency:e.threads.hardwareConcurrency},webgpu:t,memory:{deviceMemoryGiB:e.memory.deviceMemoryGiB}})}var me="https://huggingface.co";function ge(e){return typeof location<"u"?new URL(String(e),location.href):new URL(String(e))}var he="https://cdn.jsdelivr.net/npm/@caldrix-ai/caldrix@0.3.0/";function ee(e){return e instanceof Error?e.message:String(e)}function B(e,t){if(t!==void 0){if(typeof t!="string"&&!(t instanceof URL))throw new i("request",`assets.${e} is a string or a URL, not ${typeof t}`);try{return typeof location<"u"?new URL(t,location.href):new URL(t)}catch{throw new i("request",`assets.${e} ${JSON.stringify(String(t))} is not a URL`)}}}function we(e,t){let r=M(e,t),n=null,o=()=>{n!==null&&URL.revokeObjectURL(n),n=null};try{return!r&&!t?{worker:new Worker(new URL("./worker.js",import.meta.url),{type:"module"}),revoke:o,literal:!0}:r?(n=URL.createObjectURL(new Blob([`import ${JSON.stringify(e.href)};`],{type:"text/javascript"})),{worker:new Worker(n,{type:"module"}),revoke:o}):{worker:new Worker(e,{type:"module"}),revoke:o}}catch(s){throw o(),s}}function ye(e){return typeof location<"u"&&e.origin!==location.origin}function M(e,t){return ye(e)&&(t||e.protocol==="http:"||e.protocol==="https:")}function I(e){return!e.chosen&&!M(e.url,!1)?`the package's worker (dist/worker.js as the page's bundler emitted it, or ${e.url.href} unbundled)`:`the engine's worker from ${e.url.href}${M(e.url,e.chosen)?" (through a same-origin shim)":""}`}var C=class{constructor(t){this.reason=t}reason};function ke(e,t,r){return new Promise((n,o)=>{let s;try{s=we(e.url,e.chosen)}catch(d){o(new C(`the page could not construct it: ${ee(d)}`));return}let{worker:l,revoke:f}=s,b=()=>u(r()),u=(d,a=e.url)=>{if(f(),l.onmessage=null,l.onerror=null,t?.removeEventListener("abort",b),d===null)return n({worker:l,url:a});l.terminate(),o(d)};t?.addEventListener("abort",b,{once:!0}),l.onerror=d=>u(new C(d.message||"it did not load")),l.onmessage=d=>{let a=d.data;if(!O(a)||a.id!==0)return u(m(a));if(a.type==="ready")return s.literal?URL.canParse(a.url)?u(null,new URL(a.url)):u(m(a)):u(null);if(a.type==="error")return u(new C(a.message));u(m(a))}})}async function ve(e,t,r,n){let o=[];for(let u of e)try{let{worker:d,url:a}=await ke(u,r,n),g=o[0];return{worker:d,used:u,url:a,...g!==void 0?{failed:{what:I(g.t),reason:g.reason}}:{}}}catch(d){if(!(d instanceof C))throw d;o.push({t:u,reason:d.reason})}let[s,l]=o;if(s!==void 0&&l!==void 0){let u=l.t.url.origin;throw new i("backend",`${I(s.t)} did not start (${s.reason}), nor from the CDN fallback ${l.t.url.href} (${l.reason}); serve dist/ and host/ beside the bundle, set assets.worker to where the page serves them, or allow ${u} in the page's Content-Security-Policy (worker-src blob: for the same-origin shim that starts it, script-src ${u} for the modules it imports, connect-src ${u} for the .wasm)`)}let f=s,b=t&&f.t.source==="bundle"?"; the CDN fallback is off (assets.fallback is false)":"";throw new i("backend",`${I(f.t)} did not start: ${f.reason}${b}; caldrix.js runs inference in a Web Worker and has no main-thread mode`)}function We(e,t,r){let n=r!==void 0?`, and with it the host .wasm from ${r}`:"";return`${e.what} did not start (${e.reason}); it was loaded from the CDN fallback ${t}${n}`}function Re(e){return`the host .wasm could not be fetched from ${e.failed.url} (${e.failed.reason}); it was fetched from the CDN fallback ${e.url}`}function Y(e){console.warn(`caldrix.js: ${e}. Serve dist/ and host/ beside the bundle or set assets.worker/assets.hostWasm; assets.fallback: false turns the fallback off.`)}function Ue(e){let t={text:e.text,token:e.token,done:e.done};return e.logprobs!==void 0&&(t.logprobs=e.logprobs),e.done&&(e.finishReason!==null&&(t.finishReason=e.finishReason),t.usage={promptTokens:e.promptTokens,completionTokens:e.completionTokens,cachedTokens:e.cachedTokens}),t}var F=class{static async load(t,r={}){let n=r.backend??"auto";if(n==="webgl")throw new i("backend","the webgl backend is not built");if(n!=="auto"&&n!=="webgpu"&&n!=="wasm")throw new i("request",`backend ${JSON.stringify(n)} is not auto, webgpu, wasm or webgl`);if(typeof t!="string"||t==="")throw new i("request","load takes a model alias or a Hub repo id (owner/name[@revision]), a non-empty string");let o=B("worker",r.assets?.worker),s=B("hostWasm",r.assets?.hostWasm),l=r.assets?.fallback??!0;if(typeof l!="boolean")throw new i("request",`assets.fallback is true or false, not ${JSON.stringify(l)}`);let f=B("cdn",r.assets?.cdn)??new URL(he);f.pathname.endsWith("/")||(f.pathname+="/");let b=[o!==void 0?{url:o,chosen:!0,source:"page"}:{url:ge(new URL("./worker.js",import.meta.url)),chosen:!1,source:"bundle"}];l&&o===void 0&&b.push({url:new URL("dist/worker.js",f),chosen:!0,source:"cdn"});let u=l&&s===void 0?new URL("host/caldrix_web_bg.wasm",f).href:void 0,d=r.storage??"auto";if(d!=="auto"&&d!=="f32")throw new i("request",`storage ${JSON.stringify(d)} is not auto or f32`);if(n==="wasm"&&d==="f32")throw new i("request",`storage "f32" is the WebGPU tier's weight storage; backend "wasm" takes none`);if(r.hubBaseUrl!==void 0){let h=r.hubBaseUrl,L=!1;if(typeof h=="string")try{let A=new URL(h);L=A.protocol==="http:"||A.protocol==="https:"}catch{L=!1}if(!L)throw new i("request",`hubBaseUrl must be an absolute http(s) URL, not ${JSON.stringify(h).slice(0,80)}`)}let a=()=>new i("fetch",`loading ${t} was aborted`),g=r.signal;if(g?.aborted)throw a();let p=await q(),R,T;if(n==="auto"&&r.dtype==="bf16"&&p.chosen==="webgpu")R="wasm",T=`bf16 requested: wasm (the WebGPU tier runs the f32 plan only); ${p.why}`;else if(n==="auto")R=p.chosen,T=p.why;else if(n==="webgpu"){if(!p.tiers.webgpu.available)throw new i("backend",`backend "webgpu" was asked for, but the probe found no usable WebGPU adapter: ${p.tiers.webgpu.reason??p.why}`);R="webgpu",T=`backend "webgpu" asked for; ${p.why}`}else R="wasm",T=`backend "wasm" asked for; ${p.why}`;let _=p.webgpu?.unrepresentable??[];if(g?.aborted)throw a();let $=await ve(b,!l,g,a),{worker:k}=$,D=$.url,x=null;$.failed!==void 0&&(x=We($.failed,D.href,s===void 0?u:void 0),Y(x));let j=h=>x===null?h:new i(h.kind,`${h.message} (after a CDN fallback: ${x})`,h.missing);if(g?.aborted)throw k.terminate(),j(a());let N=1,te={id:N,type:"load",model:t,probeJson:Z(p),request:{backend:R,...r.dtype!==void 0?{dtype:r.dtype}:{},...r.maxContext!==void 0?{maxContext:r.maxContext}:{},...R==="webgpu"&&d==="f32"?{f16:!1}:{}},...n==="auto"&&R==="webgpu"?{auto:!0}:{},offline:r.offline??!1,hubBaseUrl:r.hubBaseUrl??me,...s!==void 0?{hostWasm:s.href}:{},...u!==void 0?{cdnWasm:u}:{}};return new Promise((h,L)=>{let A=()=>v(a()),J=()=>{k.onmessage=null,k.onerror=null,g?.removeEventListener("abort",A)},v=S=>{J(),k.terminate(),L(j(S))},w=null;g?.addEventListener("abort",A,{once:!0}),k.onerror=S=>v(new i("backend",`the engine's worker from ${D.href} failed: ${S.message||"it did not start"}`)),k.onmessage=S=>{let c=S.data;if(!O(c)||c.id!==N)return v(m(c));switch(c.type){case"host":if(w!==null)return v(m(c));w=c.hostWasm,w.failed!==void 0&&(x=Re({...w,failed:w.failed}),Y(x));return;case"progress":try{r.onProgress?.({file:c.file,loaded:c.loaded,total:c.total,repo:c.repo,revision:c.revision,...c.provenance!==void 0?{provenance:c.provenance}:{}})}catch(y){v(y instanceof i?y:new i("request",`onProgress threw: ${ee(y)}`))}return;case"loaded":{if(w===null)return v(m(c));J();let y=$.used.source,re=s!==void 0||y==="page"&&w.failed===void 0?"page":w.failed!==void 0||y==="cdn"?"cdn":"bundle",ne={worker:{source:y,url:D.href},hostWasm:{source:re,url:w.url}},oe={...c.doctor,source:c.sources,why:c.fallback!==void 0?`${c.fallback}; ${p.why}`:T,assets:ne};h(new E(k,oe));return}case"error":{let y=c.kind==="probe"&&_.length>0?`; the browser gave ${_.join(", ")}, which the host reads as missing`:"";return v(new i(c.kind,c.message+y))}default:return v(m(c))}},k.postMessage(te)})}},E=class{#r;#n;#l=2;#t=!1;#e=null;#i=!1;#o=null;constructor(t,r){this.#r=t,this.#n=r,t.onmessage=n=>this.#d(n.data),t.onerror=n=>this.#a(new i("backend",`the engine's worker failed: ${n.message||"it stopped"}`))}chat(t,r={}){return this.#s(),this.#u({messages:t},r)}complete(t,r={}){this.#s();let n;if(typeof t=="string")n={text:t};else if(typeof t=="object"&&t!==null){let o=t;if(o.text!==void 0&&o.ids!==void 0)throw new i("request","complete takes exactly one of text and ids, not both");if(!Array.isArray(o.ids))throw new i("request","complete takes exactly one of text and ids");n={ids:o.ids}}else throw new i("request","complete takes exactly one of text and ids");return this.#u(n,r)}doctor(){this.#s();let t=Object.fromEntries(Object.entries(this.#n.source).map(([s,l])=>[s,{...l}])),{worker:r,hostWasm:n}=this.#n.assets,o=this.#n.aliases.map(s=>({...s}));return{...this.#n,source:t,aliases:o,assets:{worker:{...r},hostWasm:{...n}}}}dispose(){if(!this.#t){this.#t=!0;try{this.#r.postMessage({id:this.#l++,type:"dispose"})}catch{}this.#r.terminate(),this.#o?.sink(new i("request","the engine was disposed"))}}#s(){if(this.#t)throw new i("request","the engine was disposed; load a new one");if(this.#e)throw this.#e}#a(t){this.#e||this.#t||(this.#e=t,this.#r.terminate(),this.#o?.sink(t))}#d(t){if(this.#t||this.#e)return;if(!O(t))return this.#a(m(t));let r=this.#o;if(r===null||t.id!==r.id)return this.#a(m(t));switch(t.type){case"delta":return r.sink(Ue(t.delta));case"error":return t.fatal!==void 0&&(this.#e=X(t.fatal)),r.sink(new i(t.kind,t.message));default:return this.#a(m(t))}}async*#u(t,r){if(this.#s(),this.#i)throw new i("request","a generation is already running on this engine");let{signal:n,...o}=r;if(n?.aborted){yield{text:"",done:!0,finishReason:"abort",usage:{promptTokens:0,completionTokens:0,cachedTokens:0}};return}this.#i=!0;let s=this.#l++,l=[],f=null;this.#o={id:s,sink:a=>{l.push(a),f?.()}};let b=()=>{!this.#t&&!this.#e&&this.#r.postMessage({id:s,type:"abort"})},u=!1,d=async()=>{for(;l.length===0;)await new Promise(a=>f=a);return f=null,l.shift()};try{for(this.#r.postMessage({id:s,type:"generate",prompt:t,options:o}),n?.addEventListener("abort",b,{once:!0});;){let a=await d();if(a instanceof i)throw u=!0,a;if(a.done&&(u=!0),yield a,a.done)return}}finally{if(n?.removeEventListener("abort",b),!u)try{for(b();!(this.#t||this.#e);){let a=await d();if(a instanceof i||a.done)break}}catch{}this.#o=null,this.#i=!1}}};export{F as Caldrix,i as CaldrixError,E as Engine,q as probe};
1
+ import{a as F,b as i,d as _}from"./chunk-PZGTLL5H.js";function W(e){return typeof e=="object"&&e!==null}function V(e){return W(e)&&typeof e.token=="number"&&typeof e.text=="string"&&typeof e.done=="boolean"&&(e.finishReason===null||e.finishReason==="stop"||e.finishReason==="length"||e.finishReason==="abort")&&typeof e.promptTokens=="number"&&typeof e.completionTokens=="number"&&typeof e.cachedTokens=="number"&&(e.logprobs===void 0||Array.isArray(e.logprobs)&&e.logprobs.every(t=>W(t)&&typeof t.token=="number"&&typeof t.logprob=="number"))}function Q(e){return!W(e)||typeof e.url!="string"?!1:e.failed===void 0||W(e.failed)&&typeof e.failed.url=="string"&&typeof e.failed.reason=="string"}function L(e){if(!W(e)||typeof e.id!="number")return!1;switch(e.type){case"ready":return e.id===0&&typeof e.url=="string";case"host":return Q(e.hostWasm);case"progress":return typeof e.file=="string"&&typeof e.loaded=="number"&&(e.total===null||typeof e.total=="number")&&typeof e.repo=="string"&&typeof e.revision=="string"&&(e.provenance===void 0||typeof e.provenance=="string");case"loaded":return W(e.doctor)&&W(e.sources)&&(e.fallback===void 0||typeof e.fallback=="string")&&Object.values(e.sources).every(t=>W(t)&&(t.source==="cache"||t.source==="network")&&typeof t.verified=="boolean");case"checked":return e.backend==="webgpu"||e.backend==="wasm";case"delta":return V(e.delta);case"result":return"value"in e;case"error":return F(e.kind)&&typeof e.message=="string"&&(e.fatal===void 0||typeof e.fatal=="string");default:return!1}}function w(e){let t;try{t=JSON.stringify(e)??String(e)}catch{t=String(e)}return t.length>200&&(t=`${t.slice(0,200)}...`),new i("backend",`the worker sent a malformed message: ${t}`)}var C=(...e)=>new Uint8Array(e),Z={simd:C(0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11),relaxedSimd:C(0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,15,1,13,0,65,1,253,15,65,2,253,15,253,128,2,11),bulkMemory:C(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,3,1,0,1,10,14,1,12,0,65,0,65,0,65,0,252,10,0,0,11),threads:C(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11),memory64:C(0,97,115,109,1,0,0,0,5,3,1,4,1),tailCall:C(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,6,1,4,0,18,0,11),exceptions:C(0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,16,1,14,0,2,105,31,64,1,3,0,0,11,0,11,26,11)};function j(){let e={};for(let[t,n]of Object.entries(Z))e[t]=WebAssembly.validate(n);return e}var Y=1e3,S=Symbol("timed out");async function N(e){let t,n=new Promise(r=>{t=setTimeout(()=>r(S),Y)});try{return await Promise.race([e,n])}finally{clearTimeout(t)}}var J=e=>e instanceof Error?e.message:String(e);function H(){let e=globalThis.navigator;return typeof e=="object"&&e!==null?e:{}}function E(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ee(){let e={available:!1,maxTextureSize:null,floatColorBuffer:null};try{let t=null;if(typeof OffscreenCanvas<"u"?t=new OffscreenCanvas(1,1):typeof document<"u"&&(t=document.createElement("canvas")),t===null)return e;let n=t,r=n.getContext("webgl2"),o=r??n.getContext("webgl");if(!o)return e;let a=E(o.getParameter(o.MAX_TEXTURE_SIZE)),l=o.getExtension(r?"EXT_color_buffer_float":"WEBGL_color_buffer_float")!==null;return o.getExtension("WEBGL_lose_context")?.loseContext(),{available:!0,maxTextureSize:a,floatColorBuffer:l}}catch{return e}}async function te(e){let t=e.info??{};if(!e.info&&typeof e.requestAdapterInfo=="function")try{t=await e.requestAdapterInfo()}catch{t={}}let n={},r=[];if(e.limits)for(let o in e.limits){let a=e.limits[o];typeof a=="number"?(n[o]=a,Number.isSafeInteger(a)||r.push(`${o} = ${a} (not a safe integer)`)):typeof a!="function"&&r.push(`${o} = ${JSON.stringify(a)??String(a)} (not a number)`)}return{vendor:t.vendor??"",architecture:t.architecture??"",device:t.device??"",description:t.description??"",features:e.features?[...e.features]:[],limits:n,unrepresentable:r}}async function re(){let e=H().gpu;if(!e||typeof e.requestAdapter!="function")return{webgpu:null,available:!1,reason:"no navigator.gpu"};let t;try{let r=await N(e.requestAdapter());if(r===S)return{webgpu:null,available:!1,reason:"requestAdapter timed out"};t=r}catch(r){return{webgpu:null,available:!1,reason:`requestAdapter failed: ${J(r)}`}}if(!t)return{webgpu:null,available:!1,reason:"requestAdapter returned null"};let n=await te(t);try{let r=await N(t.requestDevice());if(r===S)return{webgpu:n,available:!1,reason:"requestDevice timed out"};r.destroy?.()}catch(r){return{webgpu:n,available:!1,reason:`requestDevice refused: ${J(r)}`}}return{webgpu:n,available:!0}}function ne(e){return e.webgpu.available&&e.webgpu.built?"webgpu":"wasm"}function oe(e,t,n){let r=e.webgpu?.unrepresentable??[],o=r.length>0?`; adapter limits ${r.join(", ")}: the host reads them as missing`:"";return se(e,t,n)+o}function se(e,t,n){if(n==="webgpu"){let o=e.webgpu,a=o.features.includes("shader-f16")?" with shader-f16":"";return`WebGPU adapter present (${o.vendor} ${o.architecture})${a}: webgpu`}let r=e.wasm.simd?"with simd128":"without simd128";return e.webgpu===null?`no WebGPU adapter (${t.reason??"unavailable"}): wasm ${r}`:`WebGPU adapter present but unusable (${t.reason}): wasm ${r}`}async function O(){let e=H(),t=await re(),n={wasm:j(),threads:{sharedArrayBuffer:typeof SharedArrayBuffer<"u",crossOriginIsolated:globalThis.crossOriginIsolated===!0,hardwareConcurrency:E(e.hardwareConcurrency)},webgl:ee(),webgpu:t.webgpu,memory:{deviceMemoryGiB:E(e.deviceMemory)},tiers:{webgpu:t.available?{available:!0,built:!0}:{available:!1,built:!0,reason:t.reason},webgl:{available:!1,built:!1,reason:"not built"},wasm:{available:!0,built:!0}}};n.tiers.webgl.available=n.webgl.available;let r=ne(n.tiers);return{...n,chosen:r,why:oe(n,t,r)}}function K(e){let t=e.webgpu===null?null:{vendor:e.webgpu.vendor,architecture:e.webgpu.architecture,device:e.webgpu.device,description:e.webgpu.description,features:e.webgpu.features,limits:Object.fromEntries(Object.entries(e.webgpu.limits).filter(([,n])=>Number.isSafeInteger(n)))};return JSON.stringify({wasm:{simd:e.wasm.simd,relaxedSimd:e.wasm.relaxedSimd,bulkMemory:e.wasm.bulkMemory,threads:e.wasm.threads,memory64:e.wasm.memory64,tailCall:e.wasm.tailCall,exceptions:e.wasm.exceptions},threads:{sharedArrayBuffer:e.threads.sharedArrayBuffer,crossOriginIsolated:e.threads.crossOriginIsolated,hardwareConcurrency:e.threads.hardwareConcurrency},webgpu:t,memory:{deviceMemoryGiB:e.memory.deviceMemoryGiB}})}var ae="https://huggingface.co";function ie(e){return typeof location<"u"?new URL(String(e),location.href):new URL(String(e))}var le="https://cdn.jsdelivr.net/npm/@caldrix-ai/caldrix@0.4.0/";function I(e){return e instanceof Error?e.message:String(e)}function D(e,t){if(t!==void 0){if(typeof t!="string"&&!(t instanceof URL))throw new i("request",`assets.${e} is a string or a URL, not ${typeof t}`);try{return typeof location<"u"?new URL(t,location.href):new URL(t)}catch{throw new i("request",`assets.${e} ${JSON.stringify(String(t))} is not a URL`)}}}function ue(e,t){let n=G(e,t),r=null,o=()=>{r!==null&&URL.revokeObjectURL(r),r=null};try{return!n&&!t?{worker:new Worker(new URL("./worker.js",import.meta.url),{type:"module"}),revoke:o,literal:!0}:n?(r=URL.createObjectURL(new Blob([`import ${JSON.stringify(e.href)};`],{type:"text/javascript"})),{worker:new Worker(r,{type:"module"}),revoke:o}):{worker:new Worker(e,{type:"module"}),revoke:o}}catch(a){throw o(),a}}function de(e){return typeof location<"u"&&e.origin!==location.origin}function G(e,t){return de(e)&&(t||e.protocol==="http:"||e.protocol==="https:")}function P(e){return!e.chosen&&!G(e.url,!1)?`the package's worker (dist/worker.js as the page's bundler emitted it, or ${e.url.href} unbundled)`:`the engine's worker from ${e.url.href}${G(e.url,e.chosen)?" (through a same-origin shim)":""}`}var U=class{constructor(t){this.reason=t}reason};function ce(e,t,n){return new Promise((r,o)=>{let a;try{a=ue(e.url,e.chosen)}catch(c){o(new U(`the page could not construct it: ${I(c)}`));return}let{worker:l,revoke:m}=a,u=()=>d(n()),d=(c,s=e.url)=>{if(m(),l.onmessage=null,l.onerror=null,t?.removeEventListener("abort",u),c===null)return r({worker:l,url:s});l.terminate(),o(c)};t?.addEventListener("abort",u,{once:!0}),l.onerror=c=>d(new U(c.message||"it did not load")),l.onmessage=c=>{let s=c.data;if(!L(s)||s.id!==0)return d(w(s));if(s.type==="ready")return a.literal?URL.canParse(s.url)?d(null,new URL(s.url)):d(w(s)):d(null);if(s.type==="error")return d(new U(s.message));d(w(s))}})}async function fe(e,t,n,r){let o=[];for(let d of e)try{let{worker:c,url:s}=await ce(d,n,r),b=o[0];return{worker:c,used:d,url:s,...b!==void 0?{failed:{what:P(b.t),reason:b.reason}}:{}}}catch(c){if(!(c instanceof U))throw c;o.push({t:d,reason:c.reason})}let[a,l]=o;if(a!==void 0&&l!==void 0){let d=l.t.url.origin;throw new i("backend",`${P(a.t)} did not start (${a.reason}), nor from the CDN fallback ${l.t.url.href} (${l.reason}); serve dist/ and host/ beside the bundle, set assets.worker to where the page serves them, or allow ${d} in the page's Content-Security-Policy (worker-src blob: for the same-origin shim that starts it, script-src ${d} for the modules it imports, connect-src ${d} for the .wasm)`)}let m=a,u=t&&m.t.source==="bundle"?"; the CDN fallback is off (assets.fallback is false)":"";throw new i("backend",`${P(m.t)} did not start: ${m.reason}${u}; caldrix.js runs inference in a Web Worker and has no main-thread mode`)}function pe(e,t,n){let r=n!==void 0?`, and with it the host .wasm from ${n}`:"";return`${e.what} did not start (${e.reason}); it was loaded from the CDN fallback ${t}${r}`}function be(e){return`the host .wasm could not be fetched from ${e.failed.url} (${e.failed.reason}); it was fetched from the CDN fallback ${e.url}`}function X(e){console.warn(`caldrix.js: ${e}. Serve dist/ and host/ beside the bundle or set assets.worker/assets.hostWasm; assets.fallback: false turns the fallback off.`)}function me(e){let t={text:e.text,token:e.token,done:e.done};return e.logprobs!==void 0&&(t.logprobs=e.logprobs),e.done&&(e.finishReason!==null&&(t.finishReason=e.finishReason),t.usage={promptTokens:e.promptTokens,completionTokens:e.completionTokens,cachedTokens:e.cachedTokens}),t}async function z(e,t,n){let r=t.backend??"auto";if(r==="webgl")throw new i("backend","the webgl backend is not built");if(r!=="auto"&&r!=="webgpu"&&r!=="wasm")throw new i("request",`backend ${JSON.stringify(r)} is not auto, webgpu, wasm or webgl`);if(typeof e!="string"||e==="")throw new i("request","load takes a model alias or a Hub repo id (owner/name[@revision]), a non-empty string");let o=D("worker",t.assets?.worker),a=D("hostWasm",t.assets?.hostWasm),l=t.assets?.fallback??!0;if(typeof l!="boolean")throw new i("request",`assets.fallback is true or false, not ${JSON.stringify(l)}`);let m=D("cdn",t.assets?.cdn)??new URL(le);m.pathname.endsWith("/")||(m.pathname+="/");let u=[o!==void 0?{url:o,chosen:!0,source:"page"}:{url:ie(new URL("./worker.js",import.meta.url)),chosen:!1,source:"bundle"}];l&&o===void 0&&u.push({url:new URL("dist/worker.js",m),chosen:!0,source:"cdn"});let d=l&&a===void 0?new URL("host/caldrix_web_bg.wasm",m).href:void 0,c=t.storage??"auto";if(c!=="auto"&&c!=="f32")throw new i("request",`storage ${JSON.stringify(c)} is not auto or f32`);if(r==="wasm"&&c==="f32")throw new i("request",`storage "f32" is the WebGPU tier's weight storage; backend "wasm" takes none`);if(t.hubBaseUrl!==void 0){let h=t.hubBaseUrl,x=!1;if(typeof h=="string")try{let M=new URL(h);x=M.protocol==="http:"||M.protocol==="https:"}catch{x=!1}if(!x)throw new i("request",`hubBaseUrl must be an absolute http(s) URL, not ${JSON.stringify(h).slice(0,80)}`)}let s=()=>new i("fetch",`${n?"checking":"loading"} ${e} was aborted`),b=t.signal;if(b?.aborted)throw s();let f=await O(),g,v;if(r==="auto"&&t.dtype==="bf16"&&f.chosen==="webgpu")g="wasm",v=`bf16 requested: wasm (the WebGPU tier runs the f32 plan only); ${f.why}`;else if(r==="auto")g=f.chosen,v=f.why;else if(r==="webgpu"){if(!f.tiers.webgpu.available)throw new i("backend",`backend "webgpu" was asked for, but the probe found no usable WebGPU adapter: ${f.tiers.webgpu.reason??f.why}`);g="webgpu",v=`backend "webgpu" asked for; ${f.why}`}else g="wasm",v=`backend "wasm" asked for; ${f.why}`;let p=f.webgpu?.unrepresentable??[];if(b?.aborted)throw s();let k=await fe(u,!l,b,s),{worker:R}=k,$=k.url,A={id:1,type:"load",model:e,probeJson:K(f),request:{backend:g,...t.dtype!==void 0?{dtype:t.dtype}:{},...t.maxContext!==void 0?{maxContext:t.maxContext}:{},...g==="webgpu"&&c==="f32"?{f16:!1}:{}},...r==="auto"&&g==="webgpu"?{auto:!0}:{},...n?{check:!0}:{},offline:t.offline??!1,hubBaseUrl:t.hubBaseUrl??ae,...a!==void 0?{hostWasm:a.href}:{},...d!==void 0?{cdnWasm:d}:{}},y={worker:R,used:k.used,workerUrl:$,caps:f,why:v,hostWasm:a,request:A,signal:b,aborted:s,fellBack:null,wasm:null,noted:h=>y.fellBack===null?h:new i(h.kind,`${h.message} (after a CDN fallback: ${y.fellBack})`,h.missing),host:h=>y.wasm!==null?!1:(y.wasm=h,h.failed!==void 0&&(y.fellBack=be({...h,failed:h.failed}),X(y.fellBack)),!0),workerError:h=>{let x=h.kind==="probe"&&p.length>0?`; the browser gave ${p.join(", ")}, which the host reads as missing`:"";return new i(h.kind,h.message+x)}};if(k.failed!==void 0&&(y.fellBack=pe(k.failed,$.href,a===void 0?d:void 0),X(y.fellBack)),b?.aborted)throw R.terminate(),y.noted(s());return y}function B(e){return e instanceof i?{ok:!1,kind:e.kind,message:e.message}:{ok:!1,kind:"backend",message:I(e)}}var q=class{static async load(t,n={}){let r=await z(t,n,!1),{worker:o,workerUrl:a,signal:l,request:m,hostWasm:u,caps:d}=r;return new Promise((c,s)=>{let b=()=>g(r.aborted()),f=()=>{o.onmessage=null,o.onerror=null,l?.removeEventListener("abort",b)},g=v=>{f(),o.terminate(),s(r.noted(v))};if(l?.addEventListener("abort",b,{once:!0}),l?.aborted)return g(r.aborted());o.onerror=v=>g(new i("backend",`the engine's worker from ${a.href} failed: ${v.message||"it did not start"}`)),o.onmessage=v=>{let p=v.data;if(!L(p)||p.id!==m.id)return g(w(p));switch(p.type){case"host":return r.host(p.hostWasm)?void 0:g(w(p));case"progress":try{n.onProgress?.({file:p.file,loaded:p.loaded,total:p.total,repo:p.repo,revision:p.revision,...p.provenance!==void 0?{provenance:p.provenance}:{}})}catch(k){g(k instanceof i?k:new i("request",`onProgress threw: ${I(k)}`))}return;case"loaded":{let k=r.wasm;if(k===null)return g(w(p));f();let R=r.used.source,$=u!==void 0||R==="page"&&k.failed===void 0?"page":k.failed!==void 0||R==="cdn"?"cdn":"bundle",A={worker:{source:R,url:a.href},hostWasm:{source:$,url:k.url}},y={...p.doctor,source:p.sources,why:p.fallback!==void 0?`${p.fallback}; ${d.why}`:r.why,assets:A};c(new T(o,y));return}case"error":return g(r.workerError(p));default:return g(w(p))}},o.postMessage(m)})}static async check(t,n={}){let r;try{let u=n??{};r=await z(t,{...u.backend!==void 0?{backend:u.backend}:{},...u.dtype!==void 0?{dtype:u.dtype}:{},...u.maxContext!==void 0?{maxContext:u.maxContext}:{},...u.storage!==void 0?{storage:u.storage}:{},...u.hubBaseUrl!==void 0?{hubBaseUrl:u.hubBaseUrl}:{},...u.signal!==void 0?{signal:u.signal}:{},...u.assets!==void 0?{assets:u.assets}:{}},!0)}catch(u){return B(u)}let{worker:o,workerUrl:a,signal:l,request:m}=r;return new Promise(u=>{let d=()=>s(r.aborted()),c=b=>{o.onmessage=null,o.onerror=null,l?.removeEventListener("abort",d),o.terminate(),u(b)},s=b=>c(B(r.noted(b)));if(l?.addEventListener("abort",d,{once:!0}),l?.aborted)return s(r.aborted());o.onerror=b=>s(new i("backend",`the engine's worker from ${a.href} failed: ${b.message||"it did not start"}`)),o.onmessage=b=>{let f=b.data;if(!L(f)||f.id!==m.id)return s(w(f));switch(f.type){case"host":return r.host(f.hostWasm)?void 0:s(w(f));case"progress":return;case"checked":return r.wasm===null?s(w(f)):c({ok:!0,backend:f.backend});case"error":return s(r.workerError(f));default:return s(w(f))}};try{o.postMessage(m)}catch(b){c(B(b))}})}},T=class{#r;#n;#l=2;#t=!1;#e=null;#i=!1;#o=null;constructor(t,n){this.#r=t,this.#n=n,t.onmessage=r=>this.#d(r.data),t.onerror=r=>this.#a(new i("backend",`the engine's worker failed: ${r.message||"it stopped"}`))}chat(t,n={}){return this.#s(),this.#u({messages:t},n)}complete(t,n={}){this.#s();let r;if(typeof t=="string")r={text:t};else if(typeof t=="object"&&t!==null){let o=t;if(o.text!==void 0&&o.ids!==void 0)throw new i("request","complete takes exactly one of text and ids, not both");if(!Array.isArray(o.ids))throw new i("request","complete takes exactly one of text and ids");r={ids:o.ids}}else throw new i("request","complete takes exactly one of text and ids");return this.#u(r,n)}doctor(){this.#s();let t=Object.fromEntries(Object.entries(this.#n.source).map(([a,l])=>[a,{...l}])),{worker:n,hostWasm:r}=this.#n.assets,o=this.#n.aliases.map(a=>({...a}));return{...this.#n,source:t,aliases:o,assets:{worker:{...n},hostWasm:{...r}}}}dispose(){if(!this.#t){this.#t=!0;try{this.#r.postMessage({id:this.#l++,type:"dispose"})}catch{}this.#r.terminate(),this.#o?.sink(new i("request","the engine was disposed"))}}#s(){if(this.#t)throw new i("request","the engine was disposed; load a new one");if(this.#e)throw this.#e}#a(t){this.#e||this.#t||(this.#e=t,this.#r.terminate(),this.#o?.sink(t))}#d(t){if(this.#t||this.#e)return;if(!L(t))return this.#a(w(t));let n=this.#o;if(n===null||t.id!==n.id)return this.#a(w(t));switch(t.type){case"delta":return n.sink(me(t.delta));case"error":return t.fatal!==void 0&&(this.#e=_(t.fatal)),n.sink(new i(t.kind,t.message));default:return this.#a(w(t))}}async*#u(t,n){if(this.#s(),this.#i)throw new i("request","a generation is already running on this engine");let{signal:r,...o}=n;if(r?.aborted){yield{text:"",done:!0,finishReason:"abort",usage:{promptTokens:0,completionTokens:0,cachedTokens:0}};return}this.#i=!0;let a=this.#l++,l=[],m=null;this.#o={id:a,sink:s=>{l.push(s),m?.()}};let u=()=>{!this.#t&&!this.#e&&this.#r.postMessage({id:a,type:"abort"})},d=!1,c=async()=>{for(;l.length===0;)await new Promise(s=>m=s);return m=null,l.shift()};try{for(this.#r.postMessage({id:a,type:"generate",prompt:t,options:o}),r?.addEventListener("abort",u,{once:!0});;){let s=await c();if(s instanceof i)throw d=!0,s;if(s.done&&(d=!0),yield s,s.done)return}}finally{if(r?.removeEventListener("abort",u),!d)try{for(u();!(this.#t||this.#e);){let s=await c();if(s instanceof i||s.done)break}}catch{}this.#o=null,this.#i=!1}}};export{q as Caldrix,i as CaldrixError,T as Engine,O as probe};
package/dist/worker.js CHANGED
@@ -1 +1 @@
1
- import{b as c,c as C,d as te}from"./chunk-PZGTLL5H.js";var ze="caldrix.js",$e="x-caldrix-verified",ce="x-caldrix-absent";function Je(r){return[...new Uint8Array(r)].map(t=>t.toString(16).padStart(2,"0")).join("")}function Ke(r){return r.trim().replace(/^W\//,"").replace(/^"|"$/g,"").toLowerCase()}function U(r){return r instanceof Error?r.message:String(r)}function Y(r,t){if(t===""||t==="."||t===".."||/[/\\?#]/.test(t)||/%[0-9a-fA-F]{2}/.test(t)||/[\u0000-\u001f\u007f]/.test(t))throw new c("validate",`${r} ${JSON.stringify(t)} is not a single safe path segment`);return encodeURIComponent(t)}function Pe(r){return new c("backend",`${r} is not available; caldrix.js needs a secure context`)}function Ae(r,t,s,e){let n=r.split("/").map(l=>Y("repo",l)).join("/");return`${e.endsWith("/")?e.slice(0,-1):e}/${n}/resolve/${Y("revision",t)}/${Y("file",s)}`}function Ye(r,t,s){let e=r.split("/").map(l=>Y("repo",l)).join("/"),n=s.endsWith("/")?s.slice(0,-1):s,u=t===null?"":`/revision/${t.split("/").map(l=>Y("revision",l)).join("%2F")}`;return`${n}/api/models/${e}${u}?blobs=true`}async function ue(r){if(typeof caches>"u")throw Pe("caches");try{return await caches.open(ze)}catch(t){throw new c("backend",`opening the cache for ${r} failed: ${U(t)}`)}}async function le(r){if(typeof crypto>"u"||!crypto.subtle)throw Pe("crypto.subtle");return Je(await crypto.subtle.digest("SHA-256",r))}function We(r){return new c("fetch",`${r} is not in the cache and offline is set`,"offline-uncached")}async function Se(r,t,s,e){let n=Ae(r,t,s,e.hubBaseUrl),u=await ue(s),l;try{l=await u.match(n)}catch(x){throw new c("backend",`reading ${s} from the cache failed: ${U(x)}`)}let i=x=>new c("fetch",`fetching ${s} failed: HTTP 404${x}`,"not-found");if(l&&l.headers.get(ce)==="1"){if(e.rememberAbsent)throw i(" (remembered from an earlier load)");l=void 0}let d=!1;if(l){let x=new Uint8Array(await l.arrayBuffer());if(e.sha256===void 0)return{bytes:x,source:"cache",verified:l.headers.get($e)==="1",cached:!0};if(await le(x)===e.sha256)return{bytes:x,source:"cache",verified:!0,cached:!0};d=!0;try{await u.delete(n)}catch{}}if(e.offline&&d)throw new c("fetch",`${s}: the cached copy fails the alias's sha256 pin and offline is set`,"offline-uncached");if(e.offline)throw We(s);let h=(x,D)=>new c("fetch",`fetching ${s} ${x}`,D),y=()=>{if(e.signal?.aborted)throw h("was aborted")},w;try{w=await fetch(n,{signal:e.signal})}catch(x){throw h(e.signal?.aborted?"was aborted":`failed: ${U(x)}`)}if(w.status===404&&e.rememberAbsent){try{await u.put(n,new Response(null,{headers:{[ce]:"1"}}))}catch{}throw i("")}if(!w.ok||!w.body)throw h(`failed: HTTP ${w.status}`,w.status===404?"not-found":void 0);let A=w.headers.get("x-linked-etag"),b=w.headers.get("content-length"),o=b!==null&&/^\d+$/.test(b.trim())?Number(b):null,a=[],g=0,m=w.body.getReader();try{for(;;){let x;try{x=await m.read()}catch(D){throw h(e.signal?.aborted?"was aborted":`failed: ${U(D)}`)}if(x.done)break;if(a.push(x.value),g+=x.value.byteLength,e.bytes!==void 0&&g>e.bytes)throw new c("fetch",`${s}: the body passed its pinned size, ${e.bytes} bytes`);e.onProgress?.({file:s,loaded:g,total:o})}}finally{m.cancel().catch(()=>{})}if(y(),o!==null&&o!==g&&!w.headers.get("content-encoding"))throw h(`failed: Content-Length is ${o} but ${g} bytes arrived`);let p=new Uint8Array(g),v=0;for(let x of a)p.set(x,v),v+=x.byteLength;e.onProgress?.({file:s,loaded:g,total:o});let W=!1,G=null;if(e.sha256!==void 0){if(G=await le(p),G!==e.sha256)throw new c("digest",`${s}: sha256 is ${G} but the alias pins ${e.sha256}`);W=!0}if(A!==null){let x=Ke(A);if(G??=await le(p),x!==G)throw new c("digest",`${s}: sha256 is ${G} but the Hub's X-Linked-Etag is ${x}`);W=!0}y();try{await u.put(n,new Response(p,{headers:{[$e]:W?"1":"0"}}))}catch{return{bytes:p,source:"network",verified:W,cached:!1}}return{bytes:p,source:"network",verified:W,cached:!0}}async function Ee(r,t,s,e,n){if(!Number.isSafeInteger(e)||e<=0)throw new c("request",`a range of ${e} bytes of ${s} is not a positive integer`);let u=Ae(r,t,s,n.hubBaseUrl),l=await ue(s),i;try{i=await l.match(u)}catch(b){throw new c("backend",`reading ${s} from the cache failed: ${U(b)}`)}if(i&&i.headers.get(ce)!=="1"){let b=new Uint8Array(await i.arrayBuffer());if(b.byteLength>=e)return b.slice(0,e)}if(n.offline)throw We(s);let d=b=>new c("fetch",`fetching the first ${e} bytes of ${s} ${b}`),h;try{h=await fetch(u,{headers:{Range:`bytes=0-${e-1}`},signal:n.signal})}catch(b){throw d(n.signal?.aborted?"was aborted":`failed: ${U(b)}`)}if(h.status!==206&&h.status!==200||!h.body)throw d(`failed: HTTP ${h.status}`);let y=new Uint8Array(e),w=0,A=h.body.getReader();try{for(;;){let b;try{b=await A.read()}catch(a){throw d(n.signal?.aborted?"was aborted":`failed: ${U(a)}`)}if(b.done)break;let o=Math.min(b.value.byteLength,e-w);if(y.set(b.value.subarray(0,o),w),w+=b.value.byteLength,w>e||h.status===200&&w===e)break}}finally{A.cancel().catch(()=>{})}if(n.signal?.aborted)throw d("was aborted");if(w<e)throw d(`failed: the HTTP ${h.status} answer carried ${w} bytes, not the ${e} asked for`);if(h.status===206&&w>e)throw d(`failed: the HTTP 206 answer carried more than the ${e} bytes asked for`);return y}var xe=262144;async function Ge(r,t,s){let e=Ye(r,t,s.hubBaseUrl),n=`the Hub listing of ${r}`,u=await ue(n);if(s.offline){let a;try{a=await u.match(e)}catch(g){throw new c("backend",`reading ${n} from the cache failed: ${U(g)}`)}if(!a)throw new c("fetch",`${n} is not in the cache and offline is set`,"offline-uncached");return{bytes:new Uint8Array(await a.arrayBuffer()),source:"cache"}}let l=a=>new c("fetch",`fetching ${n} ${a}`),i;try{i=await fetch(e,{signal:s.signal})}catch(a){throw l(s.signal?.aborted?"was aborted":`failed: ${U(a)}`)}let d=a=>{throw i.body?.cancel().catch(()=>{}),a},h=new URL(s.hubBaseUrl).origin;i.url&&new URL(i.url).origin!==h&&d(new c("fetch",`${n} was redirected off ${h} (to ${i.url})`)),i.status===401&&d(new c("fetch",`${r}: the Hub answered HTTP 401 for its listing: the repo does not exist, or it is private (the browser build sends no token; the caldrix CLI reads HF_TOKEN)`,"not-found")),i.status===404&&d(new c("fetch",`${r}${t?"@"+t:""}: no such repo or revision on the Hub (HTTP 404)`,"not-found")),(!i.ok||!i.body)&&d(l(`failed: HTTP ${i.status}`));let y=[],w=0,A=i.body.getReader();try{for(;;){let a;try{a=await A.read()}catch(g){throw l(s.signal?.aborted?"was aborted":`failed: ${U(g)}`)}if(a.done)break;if(w+=a.value.byteLength,w>xe)throw new c("validate",`${n} passed the 256 KiB (${xe}-byte) cap`);y.push(a.value)}}finally{A.cancel().catch(()=>{})}if(s.signal?.aborted)throw l("was aborted");let b=new Uint8Array(w),o=0;for(let a of y)b.set(a,o),o+=a.byteLength;try{await u.put(e,new Response(b))}catch{}return{bytes:b,source:"network"}}var fe=null,Z=null;function de(r){return r instanceof Error?r.message:String(r)}async function pe(){return await import("../host/caldrix_web.js")}function Ze(r){let t=globalThis.location?.href;return(t!==void 0?new URL(String(r),t):new URL(String(r))).href}async function Re(r){let t;try{t=await fetch(r)}catch(s){throw new Error(de(s))}if(!t.ok)throw new Error(`${t.status} ${t.statusText}`.trim());return t}async function he(r,t){if(fe===null){let s=await pe(),e=r??Ze(new URL("../host/caldrix_web_bg.wasm",import.meta.url)),n,u;try{n=await Re(e),u={url:e}}catch(l){let i=de(l);if(t===void 0||t===e)throw new c("backend",`the browser host's .wasm could not be fetched from ${e} (${i}); serve host/ beside dist/ or set assets.hostWasm to where the page serves it`);try{n=await Re(t)}catch(d){let h=new URL(t).origin;throw new c("backend",`the browser host's .wasm could not be fetched from ${e} (${i}) nor from the CDN fallback ${t} (${de(d)}); serve host/ beside dist/, set assets.hostWasm to where the page serves it, or allow ${h} in the page's Content-Security-Policy (connect-src ${h}, the .wasm is fetched)`)}u={url:t,failed:{url:e,reason:i}}}await s.default({module_or_path:n}),fe=s,Z=u}return fe}async function Le(r,t,s){let e=await he(t,s);return new e.CaldrixWeb(r)}function Ce(){if(Z===null)throw new c("backend","the browser host is not open");return{...Z,...Z.failed!==void 0?{failed:{...Z.failed}}:{}}}async function Ue(){return(await he()).CaldrixWeb}async function Be(r,t){let s=await he(),e;try{let{instance:l}=await WebAssembly.instantiate(t,{env:{memory:s.CaldrixWeb.memory()}});e=l.exports}catch(l){throw new c("backend",`instantiating the emitted module failed: ${l instanceof Error?l.message:String(l)}`)}let{step:n,prefill:u}=e;if(typeof n!="function"||typeof u!="function")throw new c("backend","the emitted module does not export step and prefill");if(r.attach(n,u),r.argsPtr()===0)throw new c("backend","the host reports no model loaded after load")}var q={MAP_READ:1,COPY_SRC:4,COPY_DST:8,UNIFORM:64,STORAGE:128},Ve=1,Xe=["maxStorageBufferBindingSize","maxBufferSize","maxComputeWorkgroupsPerDimension","maxStorageBuffersPerShaderStage"],Fe=(r,t)=>Number.isSafeInteger(r)&&r>=0&&r<t,Te=r=>Number.isSafeInteger(r)&&r>=0;function Qe(r,t){let s=n=>new c("backend",`the host's WebGPU program is malformed: ${n}`),e;try{e=JSON.parse(r)}catch(n){throw s(n instanceof Error?n.message:String(n))}if(typeof e!="object"||e===null||!Array.isArray(e.kernels)||!Array.isArray(e.buffers))throw s("no kernels or buffers");if(e.kernels.forEach((n,u)=>{if(!(typeof n?.symbol=="string"&&typeof n.entry=="string"&&Array.isArray(n.buffers)&&n.buffers.every(i=>i==="f32"||i==="f16"||i==="u32")&&Te(n.scalars)))throw s(`kernel ${u}`)}),e.buffers.forEach((n,u)=>{if(!(typeof n?.word=="string"&&Te(n.bytes)&&(n.storage==="f32"||n.storage==="f16"||n.storage==="blocks")&&typeof n.placed=="boolean"))throw s(`buffer ${u}`)}),!Fe(e.act,e.buffers.length))throw s("act is no buffer");if(!Fe(e.logits,e.buffers.length))throw s("logits is no buffer");if(!Array.isArray(t)||t.length!==e.kernels.length||!t.every(n=>typeof n=="string"))throw s(`${e.kernels.length} kernels but ${Array.isArray(t)?t.length:"no"} WGSL sources`);return e}function et(r,t){let s=[],e=l=>new c("backend",`the host's launch words are malformed: ${l}`),n=0,u=(l,i)=>{if(n+l>r.length)throw e(`launch ${s.length} ends inside its ${i}`);let d=r.subarray(n,n+l);return n+=l,d};for(;n<r.length;){let l=u(1,"kernel")[0],i=t.kernels[l];if(i===void 0)throw e(`launch ${s.length} names kernel ${l}; the program has ${t.kernels.length}`);let d=Array.from(u(u(1,"buffer count")[0],"buffers"));if(d.length!==i.buffers.length)throw e(`a launch of ${i.symbol} binds ${d.length} buffers; the kernel declares ${i.buffers.length}`);let h=d.find(b=>b>=t.buffers.length);if(h!==void 0)throw e(`a launch of ${i.symbol} binds buffer ${h}; the program has ${t.buffers.length}`);let[y,w]=u(2,"grid"),A=u(u(1,"uniform count")[0],"uniform").slice();if(A.length===0!=(i.scalars===0))throw e(`a launch of ${i.symbol} carries ${A.length} uniform words; the kernel declares ${i.scalars} scalars`);s.push({kernel:l,buffers:d,x:y,y:w,uniform:A})}return s}var M=r=>r instanceof Error?r.message:String(r),ge=class{constructor(t,s,e,n,u,l,i,d){this.adapter=t;this.description=s;this.host=e;this.device=n;this.program=u;this.pipelines=l;this.buffers=i;this.staging=d;n.lost.then(h=>{let y=`the WebGPU device was lost: ${h.message||h.reason||"no message"}`;!this.#e&&this.#t===null&&(this.#t=y),this.#r?.(y)})}adapter;description;host;device;program;pipelines;buffers;staging;#t=null;#e=!1;#r=null;#n=new Set;get failure(){return this.#t}get storage(){let t=s=>this.program.buffers.some(e=>e.storage===s);return t("f16")?"f16":t("blocks")?"blocks":"f32"}async run(t,s){if(this.#e)throw new c("request","the WebGPU runtime was destroyed (the engine was disposed)");if(this.failure!==null)throw this.#o(this.failure),te(this.failure);let e;try{e=et(t,this.program);let d=this.program.buffers[this.program.act];if(s.byteLength>d.bytes)throw new c("backend",`actIn is ${s.byteLength} bytes; the program's ${d.word} is ${d.bytes}`)}catch(d){throw this.#s(M(d),!1)}let n=this.device,u=[],l,i=new Promise((d,h)=>{this.#r=y=>h(new Error(y))});i.catch(()=>null);try{n.pushErrorScope("validation"),n.pushErrorScope("out-of-memory"),n.pushErrorScope("internal");let d=3,h=async()=>{let o=n.popErrorScope(),a=n.popErrorScope(),g=n.popErrorScope();d=0;let[m,p,v]=await Promise.all([o,a,g]);return p?`out of memory: ${p.message}`:v?`validation: ${v.message}`:m?`an internal error: ${m.message}`:null},y,w;try{s.byteLength>0&&n.queue.writeBuffer(this.buffers[this.program.act],0,s);let o=e.map(p=>{let v=p.buffers.map((W,G)=>({binding:G,resource:{buffer:this.buffers[W]}}));if(p.uniform.length>0){let W=n.createBuffer({size:p.uniform.byteLength,usage:q.UNIFORM|q.COPY_DST});u.push(W),this.#n.add(W),n.queue.writeBuffer(W,0,p.uniform),v.push({binding:p.buffers.length,resource:{buffer:W}})}return n.createBindGroup({layout:this.pipelines[p.kernel].getBindGroupLayout(0),entries:v})}),a=n.createCommandEncoder(),g=a.beginComputePass();e.forEach((p,v)=>{g.setPipeline(this.pipelines[p.kernel]),g.setBindGroup(0,o[v]),g.dispatchWorkgroups(p.x,p.y,1)}),g.end();let m=this.buffers[this.program.logits];a.copyBufferToBuffer(m,0,this.staging,0,m.size),n.queue.submit([a.finish()]),y=h(),w=this.staging.mapAsync(Ve),y.catch(()=>null),w.catch(()=>null)}finally{for(;d-- >0;)n.popErrorScope().catch(()=>null)}if(this.failure!==null)throw new Error(this.failure);let A=await Promise.race([y,i]);if(this.#e)throw new c("request","the engine was disposed during a WebGPU call");if(A!==null)throw new Error(`the device reported ${A}`);try{await Promise.race([w,i])}catch(o){throw this.#e?new c("request","the engine was disposed during a WebGPU call"):new Error(`mapping the logits readback failed: ${M(o)}`)}if(this.#e)throw new c("request","the engine was disposed during a WebGPU call");let b=this.program.buffers[this.program.logits].bytes;l=new Uint8Array(this.staging.getMappedRange(0,this.staging.size).slice(0,b)),this.staging.unmap()}catch(d){throw d instanceof c&&d.kind==="request"?d:this.#s(M(d))}finally{this.#r=null;for(let d of u)this.#n.delete(d),this.#e||d.destroy()}this.host.writeLogits(l)}#s(t,s=!0){return this.#e?new c("request","the engine was disposed during a WebGPU call"):(s&&(this.#t??=t),this.#o(t)??new c("backend",t))}#o(t){try{this.host.failLaunch(t)}catch(s){let e=C(s);if(e.kind==="backend")return e}return null}destroy(){if(!this.#e){this.#e=!0,this.#r?.("the engine was disposed during a WebGPU call");for(let t of[...this.buffers,this.staging,...this.#n])try{t.destroy()}catch{}this.#n.clear();try{this.device.destroy()}catch{}}}};function tt(r,t){let s=r.limits[t];return typeof s=="number"?s:void 0}function rt(){return globalThis.navigator?.gpu}async function Oe(r,t,s=rt()){let e=h=>new c("backend",h);if(!s)throw e("the worker has no navigator.gpu, though the page's probe found a WebGPU adapter");let n;try{n=await s.requestAdapter()}catch(h){throw e(`the worker's requestAdapter failed: ${M(h)}`)}if(!n)throw e("the worker's requestAdapter returned null, though the page's probe found an adapter");if(t&&!n.features.has("shader-f16"))throw e("the host's precheck chose f16 weight storage, but the worker's adapter has no shader-f16");let u={};for(let h of Xe){let y=tt(n,h),w=r.webgpu?.limits[h];if(w!==void 0&&(y===void 0||y<w))throw e(`the worker's adapter offers ${h} ${y??"none"}; the host prechecked against the probe's ${w}`);y!==void 0&&(u[h]=y)}let l;try{l=await n.requestDevice({requiredFeatures:t?["shader-f16"]:[],requiredLimits:u})}catch(h){throw e(`requestDevice refused${t?" shader-f16 with":""} the program's limits: ${M(h)}`)}let i=n.info??{};if(!n.info&&typeof n.requestAdapterInfo=="function")try{i=await n.requestAdapterInfo()}catch{i={}}let d=!1;return{device:l,f16:t,adapter:{vendor:i.vendor??"",architecture:i.architecture??""},description:i.description??"",destroy:()=>{if(!d){d=!0;try{l.destroy()}catch{}}}}}async function De(r,t,s){let e=i=>new c("backend",i),n=t.device,u=[],l=()=>{for(let i of u)i.destroy();t.destroy()};try{let i=Qe(s.program,s.kernels),d=i.buffers.some(A=>A.storage==="f16");if(d!==t.f16)throw e(`the program stores weights ${d?"f16":"f32"}, but the device was opened for ${t.f16?"f16":"f32"} storage`);let h=[];for(let[A,b]of i.kernels.entries()){n.pushErrorScope("validation"),n.pushErrorScope("internal");let o=null,a=null;try{let p=n.createShaderModule({code:s.kernels[A],label:b.symbol});o=n.createComputePipeline({label:b.symbol,layout:"auto",compute:{module:p,entryPoint:b.entry}})}catch(p){a=p}let g=await n.popErrorScope(),m=await n.popErrorScope()??g;if(m)throw e(`kernel ${b.symbol}: creating its pipeline: ${m.message}`);if(o===null)throw e(`kernel ${b.symbol}: creating its pipeline: ${M(a)}`);h.push(o)}for(let[A,b]of i.buffers.entries()){n.pushErrorScope("validation"),n.pushErrorScope("out-of-memory");let o=null;try{let m=n.createBuffer({size:Math.max(4,Math.ceil(b.bytes/4)*4),usage:q.STORAGE|q.COPY_SRC|q.COPY_DST,label:b.word});if(u.push(m),b.placed){let p=r.bufferBytes(A);if(p.byteLength!==b.bytes)throw new c("backend",`buffer ${b.word}: bufferBytes gave ${p.byteLength} bytes; the buffer is ${b.bytes} at ${b.storage} storage`);if(p.byteLength%4!==0)throw new c("backend",`buffer ${b.word}: ${p.byteLength} bytes are not whole 4-byte words`);n.queue.writeBuffer(m,0,p)}}catch(m){o=m}let a=await n.popErrorScope(),g=await n.popErrorScope();if(o!==null)throw o instanceof c?o:C(o);if(a)throw e(`buffer ${b.word} (${b.bytes} bytes): out of memory: ${a.message}`);if(g)throw e(`buffer ${b.word} (${b.bytes} bytes): ${g.message}`)}let y=u[i.logits],w=n.createBuffer({size:y.size,usage:q.MAP_READ|q.COPY_DST,label:"logits readback"});return new ge({...t.adapter},t.description,r,n,i,h,u,w)}catch(i){throw l(),i}}var nt=4194304,me=["tokenizer.json","tokenizer_config.json","chat_template.jinja"],[V,He,_e]=me;function re(r,t,s){return t!==null&&t.siblings.some(e=>e.name===r)?t:s}var be="adapter_model.safetensors",st=["fit","request","probe"];function Ne(){return new Promise(r=>{let t=new MessageChannel;t.port1.onmessage=()=>{t.port1.close(),r()},t.port2.postMessage(0)})}function ot(r,t,s){if(r!=="")return r;let e=[t,s].filter(n=>n!=="");return e.length>0?e.join(" "):"unnamed adapter"}async function qe(r,t,s){let e,n;try{e=s.kind==="prefill"?r.resolve("prefill",s.n):r.resolve("step",s.pos),n=r.actIn(s.kind==="prefill"?s.n:1)}catch(u){try{r.failLaunch(C(u).message)}catch{}throw u}await t.run(e,n)}async function it(r,t,s,e){if(await qe(r,t,s),!!e.launched())for(r.finishStart();;){if(!await e.between())return;let n=r.beginNext();if("delta"in n){e.delta(JSON.parse(n.delta));return}if(await qe(r,t,n.launch),!e.launched())return;let u=JSON.parse(r.finishNext());if(e.delta(u),u.done)return}}function Ie(r,t){let s=null,e=null,n=!1,u=null,l=!1,i=[],d=o=>{let a={...o.doctor(),aliases:i.map(W=>({...W}))};if(e===null)return{...a,storage:null,adapter:null};let g=e.adapter,m=`webgpu (${ot(e.description,g.vendor,g.architecture)})`,p=`backend webgpu on ${a.device}`,v=a.line.startsWith(p)?`backend webgpu on ${m}${a.line.slice(p.length)}`:a.line;return{...a,device:m,line:v,storage:e.storage,adapter:{...g}}},h=new c("request","the engine was disposed during its load"),y=()=>{if(l)throw h};async function w(o){if(s!==null||n)throw new c("request","this engine already has a model loaded");n=!0;let a=null;try{a=await r.openHost(o.probeJson,o.hostWasm,o.cdnWasm),t({id:o.id,type:"host",hostWasm:r.wasmUsed()}),y();let g=await r.hostClass(),m=g.resolveModel(o.model);i=g.listAliases();let p=m.kind==="alias"?m:null,v=null;if(m.kind==="repo"){let f=await r.fetchListing(m.repo,m.revision,{hubBaseUrl:o.hubBaseUrl,offline:o.offline});y(),v=JSON.parse(g.parseListing(f.bytes))}let W=v!==null?v.id:m.repo,G;if(v!==null)G=v.sha;else if(p!==null)G=p.revision;else throw new c("backend","internal invariant broken: a repo id reached the file fetches without its Hub listing");let x={},D,ne={repo:W,revision:G,listing:v},se=f=>({repo:f.id,revision:f.sha,listing:f}),X=(f,$)=>{let k=f.siblings.find(P=>P.name===$);if(k===void 0)throw new c("validate",`${f.id}@${f.sha} has no ${$}`);return k.size},z=async(f,$,k,P)=>{let T;if(f.listing!==null){if(k&&!f.listing.siblings.some(E=>E.name===$))return null;T={bytes:X(f.listing,$)}}try{let E=await r.fetchFile(f.repo,f.revision,$,{hubBaseUrl:o.hubBaseUrl,offline:o.offline,rememberAbsent:f.listing===null&&k,...T??{},...P??{},onProgress:_=>t({id:o.id,type:"progress",file:_.file,loaded:_.loaded,total:_.total,repo:f.repo,revision:f.revision,...D!==void 0?{provenance:D}:{}})});return y(),x[$]={source:E.source,verified:E.verified},E.bytes}catch(E){if(k&&E instanceof c&&E.missing==="not-found")return null;throw E}},Q=async(f,$,k)=>await z(f,$,!1,k),we=(f,$,k)=>z(se(f),$,k),ye={},F=a,J,ee;if(p!==null&&p.format==="gguf"){let f=P=>r.fetchRange(W,G,p.file,P,{hubBaseUrl:o.hubBaseUrl,offline:o.offline}),$=await f(Math.min(nt,p.bytes));y();for(let P=g.ggufHeaderNeed($,p.bytes);P!==0;P=g.ggufHeaderNeed($,p.bytes))$=await f(P),y();let k=$;J=P=>F.precheckGguf(k,p.bytes,P),ee=async(P,T)=>{let E=await Q(ne,p.file,{sha256:p.sha256,bytes:p.bytes});return T?F.loadWebGpuGguf(E,P):F.loadGguf(E,P)}}else{let f=null,$=v;if(v!==null&&v.shape==="adapter"){let R=`${v.id}@${v.sha}`,L=await we(v,"adapter_config.json",!1),O=JSON.parse(g.adapterBase(L,R)),K=S=>{let B=C(S);return B===h||B.message.startsWith(R)?B:new c(B.kind,`${R} names base ${O.repo}: ${B.message}`,B.missing)},N=v.siblings.some(S=>S.name===V);try{let S=await r.fetchListing(O.repo,O.revision,{hubBaseUrl:o.hubBaseUrl,offline:o.offline});y(),$=JSON.parse(g.parseBaseListing(S.bytes,R,N))}catch(S){throw K(S)}f={listing:v,config:L,bytes:X(v,be)}}let k=$,P=k!==null?se(k):ne,T=R=>k!==null?se(re(R,f?.listing??null,k)):ne,E=await Q(P,"config.json"),_=await z(P,"model.safetensors.index.json",!0),ae=g.weightFiles(_);if(k!==null){if(X(re(V,f?.listing??null,k),V),f!==null){let L=f.listing,O=new Set(["adapter_config.json",be,...me.filter(S=>re(S,L,k)===L)]),N=["config.json",..._!==null?["model.safetensors.index.json"]:[],...ae,...me.filter(S=>re(S,L,k)===k)].find(S=>O.has(S));if(N!==void 0)throw new c("validate",`${N} is required from both ${L.id}@${L.sha} (the adapter) and ${k.id}@${k.sha} (its base); a file is fetched from one repo only`)}let R=0;for(let L of ae)R+=X(k,L);ye={weightBytes:R,...f!==null?{adapterBytes:f.bytes,baseRepo:k.id,baseRevision:k.sha}:{}}}J=R=>F.precheck(E,_,R,f?.config),ee=async(R,L)=>{let O=await Q(T(V),V),K=await z(T(He),He,!0),N=await z(T(_e),_e,!0),S=[];for(let je of ae)S.push(await Q(P,je));let B=f!==null?[await we(f.listing,be,!1)]:void 0,ve=f?.config;return L?F.loadWebGpu(E,O,K,N,S,R,ve,B):F.load(E,O,K,N,S,R,ve,B)}}let H={...o.request,repo:W,revision:G,...v!==null&&v.id!==m.repo?{resolvedFrom:m.repo}:{},...ye},oe,I=null,Me=()=>{let f={...H,backend:"wasm"};delete f.f16,H=f},ie=f=>{let $=JSON.parse(f).provenance;D=typeof $=="string"?$:void 0},ke=f=>{Me();try{ie(J(JSON.stringify(H)))}catch($){let k=C($);throw new c(k.kind,`${k.message} (backend "auto": WebGPU refused first: ${f.message})`)}oe=`webgpu refused: ${f.message}; wasm serves this load`};if(H.backend==="webgpu"){let f=null,$=null;try{f=J(JSON.stringify(H)),$=JSON.parse(f)}catch(k){let P=C(k);if(!(o.auto===!0&&st.includes(P.kind)))throw P;ke(P)}if($!==null){try{I=await r.openDevice(JSON.parse(o.probeJson),$.f16===!0)}catch(k){let P=C(k);if(o.auto!==!0)throw P;ke(P)}I!==null&&ie(f)}}else ie(J(JSON.stringify(H)));try{y();let f=JSON.stringify(H);if(I!==null){let $=await ee(f,!0),k=I;I=null,e=await r.openRuntime(F,k,$)}else await r.instantiate(F,await ee(f,!1))}finally{I?.destroy()}y(),s=a,t({id:o.id,type:"loaded",doctor:d(a),sources:x,...oe!==void 0?{fallback:oe}:{}})}catch(g){if(e?.destroy(),e=null,a!==null&&s!==a)try{a.dispose()}catch{}throw g}finally{n=!1}}async function A(o,a,g,m){let p;"messages"in o.prompt?p=a.startChatSplit(JSON.stringify(o.prompt.messages),m):"text"in o.prompt?p=a.startCompleteSplit(o.prompt.text,null,m):p=a.startCompleteSplit(null,Uint32Array.from(o.prompt.ids),m),await it(a,g,p,{launched:()=>!l,between:async()=>(await Ne(),!l),delta:v=>t({id:o.id,type:"delta",delta:v})})}async function b(o){if(u!==null)throw new c("request","a generation is already running on this engine");if(s===null)throw new c("request","no model is loaded");let a=s,g=JSON.stringify(o.options);if(e!==null){if(e.failure!==null)throw te(e.failure);u=o.id;try{return await A(o,a,e,g)}catch(m){if(l)return;throw m}finally{u=null}}u=o.id;try{for(("messages"in o.prompt)?a.startChat(JSON.stringify(o.prompt.messages),g):("text"in o.prompt)?a.startComplete(o.prompt.text,null,g):a.startComplete(null,Uint32Array.from(o.prompt.ids),g);;){if(await Ne(),l)return;let m=JSON.parse(a.next());if(t({id:o.id,type:"delta",delta:m}),m.done)return}}finally{u=null}}return async o=>{try{switch(o.type){case"load":return await w(o);case"generate":return await b(o);case"abort":u===o.id&&s?.abort();return;case"doctor":if(s===null)throw new c("request","no model is loaded");t({id:o.id,type:"result",value:d(s)});return;case"dispose":l=!0,e?.destroy(),e=null,s?.dispose(),s=null,t({id:o.id,type:"result",value:null}),r.close();return}}catch(a){if(l)return;let g=C(a),m=e?.failure??null;t({id:o.id,type:"error",kind:g.kind,message:g.message,...m!==null?{fatal:m}:{}})}}}var j=globalThis,at=Ie({openHost:Le,wasmUsed:Ce,hostClass:Ue,instantiate:Be,openDevice:(r,t)=>Oe(r,t),openRuntime:De,fetchFile:Se,fetchListing:Ge,fetchRange:Ee,close:()=>j.close()},r=>j.postMessage(r));j.onmessage=r=>{at(r.data)};pe().then(()=>j.postMessage({id:0,type:"ready",url:j.location.href}),r=>j.postMessage({id:0,type:"error",kind:"backend",message:`the browser host's glue (host/caldrix_web.js, beside dist/worker.js) did not load (${r instanceof Error?r.message:String(r)})`}));
1
+ import{b as l,c as O,d as te}from"./chunk-PZGTLL5H.js";var Qe="caldrix.js",Se="x-caldrix-verified",he="x-caldrix-absent";function et(t){return[...new Uint8Array(t)].map(r=>r.toString(16).padStart(2,"0")).join("")}function tt(t){return t.trim().replace(/^W\//,"").replace(/^"|"$/g,"").toLowerCase()}function D(t){return t instanceof Error?t.message:String(t)}function Y(t,r){if(r===""||r==="."||r===".."||/[/\\?#]/.test(r)||/%[0-9a-fA-F]{2}/.test(r)||/[\u0000-\u001f\u007f]/.test(r))throw new l("validate",`${t} ${JSON.stringify(r)} is not a single safe path segment`);return encodeURIComponent(r)}function Le(t){return new l("backend",`${t} is not available; caldrix.js needs a secure context`)}function Ue(t,r,s,e){let n=t.split("/").map(c=>Y("repo",c)).join("/");return`${e.endsWith("/")?e.slice(0,-1):e}/${n}/resolve/${Y("revision",r)}/${Y("file",s)}`}function rt(t,r,s){let e=t.split("/").map(c=>Y("repo",c)).join("/"),n=s.endsWith("/")?s.slice(0,-1):s,u=r===null?"":`/revision/${r.split("/").map(c=>Y("revision",c)).join("%2F")}`;return`${n}/api/models/${e}${u}?blobs=true`}async function pe(t){if(typeof caches>"u")throw Le("caches");try{return await caches.open(Qe)}catch(r){throw new l("backend",`opening the cache for ${t} failed: ${D(r)}`)}}async function de(t){if(typeof crypto>"u"||!crypto.subtle)throw Le("crypto.subtle");return et(await crypto.subtle.digest("SHA-256",t))}function Ce(t){return new l("fetch",`${t} is not in the cache and offline is set`,"offline-uncached")}async function Be(t,r,s,e){let n=Ue(t,r,s,e.hubBaseUrl),u=await pe(s),c;try{c=await u.match(n)}catch(x){throw new l("backend",`reading ${s} from the cache failed: ${D(x)}`)}let i=x=>new l("fetch",`fetching ${s} failed: HTTP 404${x}`,"not-found");if(c&&c.headers.get(he)==="1"){if(e.rememberAbsent)throw i(" (remembered from an earlier load)");c=void 0}let d=!1;if(c){let x=new Uint8Array(await c.arrayBuffer());if(e.sha256===void 0)return{bytes:x,source:"cache",verified:c.headers.get(Se)==="1",cached:!0};if(await de(x)===e.sha256)return{bytes:x,source:"cache",verified:!0,cached:!0};d=!0;try{await u.delete(n)}catch{}}if(e.offline&&d)throw new l("fetch",`${s}: the cached copy fails the alias's sha256 pin and offline is set`,"offline-uncached");if(e.offline)throw Ce(s);let p=(x,z)=>new l("fetch",`fetching ${s} ${x}`,z),w=()=>{if(e.signal?.aborted)throw p("was aborted")},y;try{y=await fetch(n,{signal:e.signal})}catch(x){throw p(e.signal?.aborted?"was aborted":`failed: ${D(x)}`)}if(y.status===404&&e.rememberAbsent){try{await u.put(n,new Response(null,{headers:{[he]:"1"}}))}catch{}throw i("")}if(!y.ok||!y.body)throw p(`failed: HTTP ${y.status}`,y.status===404?"not-found":void 0);let W=y.headers.get("x-linked-etag"),b=y.headers.get("content-length"),o=b!==null&&/^\d+$/.test(b.trim())?Number(b):null,a=[],g=0,m=y.body.getReader();try{for(;;){let x;try{x=await m.read()}catch(z){throw p(e.signal?.aborted?"was aborted":`failed: ${D(z)}`)}if(x.done)break;if(a.push(x.value),g+=x.value.byteLength,e.bytes!==void 0&&g>e.bytes)throw new l("fetch",`${s}: the body passed its pinned size, ${e.bytes} bytes`);e.onProgress?.({file:s,loaded:g,total:o})}}finally{m.cancel().catch(()=>{})}if(w(),o!==null&&o!==g&&!y.headers.get("content-encoding"))throw p(`failed: Content-Length is ${o} but ${g} bytes arrived`);let h=new Uint8Array(g),v=0;for(let x of a)h.set(x,v),v+=x.byteLength;e.onProgress?.({file:s,loaded:g,total:o});let E=!1,L=null;if(e.sha256!==void 0){if(L=await de(h),L!==e.sha256)throw new l("digest",`${s}: sha256 is ${L} but the alias pins ${e.sha256}`);E=!0}if(W!==null){let x=tt(W);if(L??=await de(h),x!==L)throw new l("digest",`${s}: sha256 is ${L} but the Hub's X-Linked-Etag is ${x}`);E=!0}w();try{await u.put(n,new Response(h,{headers:{[Se]:E?"1":"0"}}))}catch{return{bytes:h,source:"network",verified:E,cached:!1}}return{bytes:h,source:"network",verified:E,cached:!0}}async function Oe(t,r,s,e,n){if(!Number.isSafeInteger(e)||e<=0)throw new l("request",`a range of ${e} bytes of ${s} is not a positive integer`);let u=Ue(t,r,s,n.hubBaseUrl),c=await pe(s),i;try{i=await c.match(u)}catch(b){throw new l("backend",`reading ${s} from the cache failed: ${D(b)}`)}if(i&&i.headers.get(he)!=="1"){let b=new Uint8Array(await i.arrayBuffer());if(b.byteLength>=e)return b.slice(0,e)}if(n.offline)throw Ce(s);let d=b=>new l("fetch",`fetching the first ${e} bytes of ${s} ${b}`),p;try{p=await fetch(u,{headers:{Range:`bytes=0-${e-1}`},signal:n.signal})}catch(b){throw d(n.signal?.aborted?"was aborted":`failed: ${D(b)}`)}if(p.status!==206&&p.status!==200||!p.body)throw d(`failed: HTTP ${p.status}`);let w=new Uint8Array(e),y=0,W=p.body.getReader();try{for(;;){let b;try{b=await W.read()}catch(a){throw d(n.signal?.aborted?"was aborted":`failed: ${D(a)}`)}if(b.done)break;let o=Math.min(b.value.byteLength,e-y);if(w.set(b.value.subarray(0,o),y),y+=b.value.byteLength,y>e||p.status===200&&y===e)break}}finally{W.cancel().catch(()=>{})}if(n.signal?.aborted)throw d("was aborted");if(y<e)throw d(`failed: the HTTP ${p.status} answer carried ${y} bytes, not the ${e} asked for`);if(p.status===206&&y>e)throw d(`failed: the HTTP 206 answer carried more than the ${e} bytes asked for`);return w}var Ge=262144;async function Te(t,r,s){let e=rt(t,r,s.hubBaseUrl),n=`the Hub listing of ${t}`,u=await pe(n);if(s.offline){let a;try{a=await u.match(e)}catch(g){throw new l("backend",`reading ${n} from the cache failed: ${D(g)}`)}if(!a)throw new l("fetch",`${n} is not in the cache and offline is set`,"offline-uncached");return{bytes:new Uint8Array(await a.arrayBuffer()),source:"cache"}}let c=a=>new l("fetch",`fetching ${n} ${a}`),i;try{i=await fetch(e,{signal:s.signal})}catch(a){throw c(s.signal?.aborted?"was aborted":`failed: ${D(a)}`)}let d=a=>{throw i.body?.cancel().catch(()=>{}),a},p=new URL(s.hubBaseUrl).origin;i.url&&new URL(i.url).origin!==p&&d(new l("fetch",`${n} was redirected off ${p} (to ${i.url})`)),i.status===401&&d(new l("fetch",`${t}: the Hub answered HTTP 401 for its listing: the repo does not exist, or it is private (the browser build sends no token; the caldrix CLI reads HF_TOKEN)`,"not-found")),i.status===404&&d(new l("fetch",`${t}${r?"@"+r:""}: no such repo or revision on the Hub (HTTP 404)`,"not-found")),(!i.ok||!i.body)&&d(c(`failed: HTTP ${i.status}`));let w=[],y=0,W=i.body.getReader();try{for(;;){let a;try{a=await W.read()}catch(g){throw c(s.signal?.aborted?"was aborted":`failed: ${D(g)}`)}if(a.done)break;if(y+=a.value.byteLength,y>Ge)throw new l("validate",`${n} passed the 256 KiB (${Ge}-byte) cap`);w.push(a.value)}}finally{W.cancel().catch(()=>{})}if(s.signal?.aborted)throw c("was aborted");let b=new Uint8Array(y),o=0;for(let a of w)b.set(a,o),o+=a.byteLength;try{await u.put(e,new Response(b))}catch{}return{bytes:b,source:"network"}}var ge=null,V=null;function be(t){return t instanceof Error?t.message:String(t)}async function me(){return await import("../host/caldrix_web.js")}function nt(t){let r=globalThis.location?.href;return(r!==void 0?new URL(String(t),r):new URL(String(t))).href}async function De(t){let r;try{r=await fetch(t)}catch(s){throw new Error(be(s))}if(!r.ok)throw new Error(`${r.status} ${r.statusText}`.trim());return r}async function we(t,r){if(ge===null){let s=await me(),e=t??nt(new URL("../host/caldrix_web_bg.wasm",import.meta.url)),n,u;try{n=await De(e),u={url:e}}catch(c){let i=be(c);if(r===void 0||r===e)throw new l("backend",`the browser host's .wasm could not be fetched from ${e} (${i}); serve host/ beside dist/ or set assets.hostWasm to where the page serves it`);try{n=await De(r)}catch(d){let p=new URL(r).origin;throw new l("backend",`the browser host's .wasm could not be fetched from ${e} (${i}) nor from the CDN fallback ${r} (${be(d)}); serve host/ beside dist/, set assets.hostWasm to where the page serves it, or allow ${p} in the page's Content-Security-Policy (connect-src ${p}, the .wasm is fetched)`)}u={url:r,failed:{url:e,reason:i}}}await s.default({module_or_path:n}),ge=s,V=u}return ge}async function Fe(t,r,s){let e=await we(r,s);return new e.CaldrixWeb(t)}function He(){if(V===null)throw new l("backend","the browser host is not open");return{...V,...V.failed!==void 0?{failed:{...V.failed}}:{}}}async function _e(){return(await we()).CaldrixWeb}async function Ne(t,r){let s=await we(),e;try{let{instance:c}=await WebAssembly.instantiate(r,{env:{memory:s.CaldrixWeb.memory()}});e=c.exports}catch(c){throw new l("backend",`instantiating the emitted module failed: ${c instanceof Error?c.message:String(c)}`)}let{step:n,prefill:u}=e;if(typeof n!="function"||typeof u!="function")throw new l("backend","the emitted module does not export step and prefill");if(t.attach(n,u),t.argsPtr()===0)throw new l("backend","the host reports no model loaded after load")}var M={MAP_READ:1,COPY_SRC:4,COPY_DST:8,UNIFORM:64,STORAGE:128},st=1,ot=["maxStorageBufferBindingSize","maxBufferSize","maxComputeWorkgroupsPerDimension","maxStorageBuffersPerShaderStage"],qe=(t,r)=>Number.isSafeInteger(t)&&t>=0&&t<r,ze=t=>Number.isSafeInteger(t)&&t>=0;function it(t,r){let s=n=>new l("backend",`the host's WebGPU program is malformed: ${n}`),e;try{e=JSON.parse(t)}catch(n){throw s(n instanceof Error?n.message:String(n))}if(typeof e!="object"||e===null||!Array.isArray(e.kernels)||!Array.isArray(e.buffers))throw s("no kernels or buffers");if(e.kernels.forEach((n,u)=>{if(!(typeof n?.symbol=="string"&&typeof n.entry=="string"&&Array.isArray(n.buffers)&&n.buffers.every(i=>i==="f32"||i==="f16"||i==="u32")&&ze(n.scalars)))throw s(`kernel ${u}`)}),e.buffers.forEach((n,u)=>{if(!(typeof n?.word=="string"&&ze(n.bytes)&&(n.storage==="f32"||n.storage==="f16"||n.storage==="blocks")&&typeof n.placed=="boolean"))throw s(`buffer ${u}`)}),!qe(e.act,e.buffers.length))throw s("act is no buffer");if(!qe(e.logits,e.buffers.length))throw s("logits is no buffer");if(!Array.isArray(r)||r.length!==e.kernels.length||!r.every(n=>typeof n=="string"))throw s(`${e.kernels.length} kernels but ${Array.isArray(r)?r.length:"no"} WGSL sources`);return e}function at(t,r){let s=[],e=c=>new l("backend",`the host's launch words are malformed: ${c}`),n=0,u=(c,i)=>{if(n+c>t.length)throw e(`launch ${s.length} ends inside its ${i}`);let d=t.subarray(n,n+c);return n+=c,d};for(;n<t.length;){let c=u(1,"kernel")[0],i=r.kernels[c];if(i===void 0)throw e(`launch ${s.length} names kernel ${c}; the program has ${r.kernels.length}`);let d=Array.from(u(u(1,"buffer count")[0],"buffers"));if(d.length!==i.buffers.length)throw e(`a launch of ${i.symbol} binds ${d.length} buffers; the kernel declares ${i.buffers.length}`);let p=d.find(b=>b>=r.buffers.length);if(p!==void 0)throw e(`a launch of ${i.symbol} binds buffer ${p}; the program has ${r.buffers.length}`);let[w,y]=u(2,"grid"),W=u(u(1,"uniform count")[0],"uniform").slice();if(W.length===0!=(i.scalars===0))throw e(`a launch of ${i.symbol} carries ${W.length} uniform words; the kernel declares ${i.scalars} scalars`);s.push({kernel:c,buffers:d,x:w,y,uniform:W})}return s}var J=t=>t instanceof Error?t.message:String(t),ye=class{constructor(r,s,e,n,u,c,i,d){this.adapter=r;this.description=s;this.host=e;this.device=n;this.program=u;this.pipelines=c;this.buffers=i;this.staging=d;n.lost.then(p=>{let w=`the WebGPU device was lost: ${p.message||p.reason||"no message"}`;!this.#e&&this.#t===null&&(this.#t=w),this.#r?.(w)})}adapter;description;host;device;program;pipelines;buffers;staging;#t=null;#e=!1;#r=null;#n=new Set;get failure(){return this.#t}get storage(){let r=s=>this.program.buffers.some(e=>e.storage===s);return r("f16")?"f16":r("blocks")?"blocks":"f32"}async run(r,s){if(this.#e)throw new l("request","the WebGPU runtime was destroyed (the engine was disposed)");if(this.failure!==null)throw this.#o(this.failure),te(this.failure);let e;try{e=at(r,this.program);let d=this.program.buffers[this.program.act];if(s.byteLength>d.bytes)throw new l("backend",`actIn is ${s.byteLength} bytes; the program's ${d.word} is ${d.bytes}`)}catch(d){throw this.#s(J(d),!1)}let n=this.device,u=[],c,i=new Promise((d,p)=>{this.#r=w=>p(new Error(w))});i.catch(()=>null);try{n.pushErrorScope("validation"),n.pushErrorScope("out-of-memory"),n.pushErrorScope("internal");let d=3,p=async()=>{let o=n.popErrorScope(),a=n.popErrorScope(),g=n.popErrorScope();d=0;let[m,h,v]=await Promise.all([o,a,g]);return h?`out of memory: ${h.message}`:v?`validation: ${v.message}`:m?`an internal error: ${m.message}`:null},w,y;try{s.byteLength>0&&n.queue.writeBuffer(this.buffers[this.program.act],0,s);let o=e.map(h=>{let v=h.buffers.map((E,L)=>({binding:L,resource:{buffer:this.buffers[E]}}));if(h.uniform.length>0){let E=n.createBuffer({size:h.uniform.byteLength,usage:M.UNIFORM|M.COPY_DST});u.push(E),this.#n.add(E),n.queue.writeBuffer(E,0,h.uniform),v.push({binding:h.buffers.length,resource:{buffer:E}})}return n.createBindGroup({layout:this.pipelines[h.kernel].getBindGroupLayout(0),entries:v})}),a=n.createCommandEncoder(),g=a.beginComputePass();e.forEach((h,v)=>{g.setPipeline(this.pipelines[h.kernel]),g.setBindGroup(0,o[v]),g.dispatchWorkgroups(h.x,h.y,1)}),g.end();let m=this.buffers[this.program.logits];a.copyBufferToBuffer(m,0,this.staging,0,m.size),n.queue.submit([a.finish()]),w=p(),y=this.staging.mapAsync(st),w.catch(()=>null),y.catch(()=>null)}finally{for(;d-- >0;)n.popErrorScope().catch(()=>null)}if(this.failure!==null)throw new Error(this.failure);let W=await Promise.race([w,i]);if(this.#e)throw new l("request","the engine was disposed during a WebGPU call");if(W!==null)throw new Error(`the device reported ${W}`);try{await Promise.race([y,i])}catch(o){throw this.#e?new l("request","the engine was disposed during a WebGPU call"):new Error(`mapping the logits readback failed: ${J(o)}`)}if(this.#e)throw new l("request","the engine was disposed during a WebGPU call");let b=this.program.buffers[this.program.logits].bytes;c=new Uint8Array(this.staging.getMappedRange(0,this.staging.size).slice(0,b)),this.staging.unmap()}catch(d){throw d instanceof l&&d.kind==="request"?d:this.#s(J(d))}finally{this.#r=null;for(let d of u)this.#n.delete(d),this.#e||d.destroy()}this.host.writeLogits(c)}#s(r,s=!0){return this.#e?new l("request","the engine was disposed during a WebGPU call"):(s&&(this.#t??=r),this.#o(r)??new l("backend",r))}#o(r){try{this.host.failLaunch(r)}catch(s){let e=O(s);if(e.kind==="backend")return e}return null}destroy(){if(!this.#e){this.#e=!0,this.#r?.("the engine was disposed during a WebGPU call");for(let r of[...this.buffers,this.staging,...this.#n])try{r.destroy()}catch{}this.#n.clear();try{this.device.destroy()}catch{}}}};function lt(t,r){let s=t.limits[r];return typeof s=="number"?s:void 0}function ct(){return globalThis.navigator?.gpu}async function Ie(t,r,s=ct()){let e=p=>new l("backend",p);if(!s)throw e("the worker has no navigator.gpu, though the page's probe found a WebGPU adapter");let n;try{n=await s.requestAdapter()}catch(p){throw e(`the worker's requestAdapter failed: ${J(p)}`)}if(!n)throw e("the worker's requestAdapter returned null, though the page's probe found an adapter");if(r&&!n.features.has("shader-f16"))throw e("the host's precheck chose f16 weight storage, but the worker's adapter has no shader-f16");let u={};for(let p of ot){let w=lt(n,p),y=t.webgpu?.limits[p];if(y!==void 0&&(w===void 0||w<y))throw e(`the worker's adapter offers ${p} ${w??"none"}; the host prechecked against the probe's ${y}`);w!==void 0&&(u[p]=w)}let c;try{c=await n.requestDevice({requiredFeatures:r?["shader-f16"]:[],requiredLimits:u})}catch(p){throw e(`requestDevice refused${r?" shader-f16 with":""} the program's limits: ${J(p)}`)}let i=n.info??{};if(!n.info&&typeof n.requestAdapterInfo=="function")try{i=await n.requestAdapterInfo()}catch{i={}}let d=!1;return{device:c,f16:r,adapter:{vendor:i.vendor??"",architecture:i.architecture??""},description:i.description??"",destroy:()=>{if(!d){d=!0;try{c.destroy()}catch{}}}}}async function je(t,r,s){let e=i=>new l("backend",i),n=r.device,u=[],c=()=>{for(let i of u)i.destroy();r.destroy()};try{let i=it(s.program,s.kernels),d=i.buffers.some(W=>W.storage==="f16");if(d!==r.f16)throw e(`the program stores weights ${d?"f16":"f32"}, but the device was opened for ${r.f16?"f16":"f32"} storage`);let p=[];for(let[W,b]of i.kernels.entries()){n.pushErrorScope("validation"),n.pushErrorScope("internal");let o=null,a=null;try{let h=n.createShaderModule({code:s.kernels[W],label:b.symbol});o=n.createComputePipeline({label:b.symbol,layout:"auto",compute:{module:h,entryPoint:b.entry}})}catch(h){a=h}let g=await n.popErrorScope(),m=await n.popErrorScope()??g;if(m)throw e(`kernel ${b.symbol}: creating its pipeline: ${m.message}`);if(o===null)throw e(`kernel ${b.symbol}: creating its pipeline: ${J(a)}`);p.push(o)}for(let[W,b]of i.buffers.entries()){n.pushErrorScope("validation"),n.pushErrorScope("out-of-memory");let o=null;try{let m=n.createBuffer({size:Math.max(4,Math.ceil(b.bytes/4)*4),usage:M.STORAGE|M.COPY_SRC|M.COPY_DST,label:b.word});if(u.push(m),b.placed){let h=t.bufferBytes(W);if(h.byteLength!==b.bytes)throw new l("backend",`buffer ${b.word}: bufferBytes gave ${h.byteLength} bytes; the buffer is ${b.bytes} at ${b.storage} storage`);if(h.byteLength%4!==0)throw new l("backend",`buffer ${b.word}: ${h.byteLength} bytes are not whole 4-byte words`);n.queue.writeBuffer(m,0,h)}}catch(m){o=m}let a=await n.popErrorScope(),g=await n.popErrorScope();if(o!==null)throw o instanceof l?o:O(o);if(a)throw e(`buffer ${b.word} (${b.bytes} bytes): out of memory: ${a.message}`);if(g)throw e(`buffer ${b.word} (${b.bytes} bytes): ${g.message}`)}let w=u[i.logits],y=n.createBuffer({size:w.size,usage:M.MAP_READ|M.COPY_DST,label:"logits readback"});return new ye({...r.adapter},r.description,t,n,i,p,u,y)}catch(i){throw c(),i}}var ut=4194304,$e=["tokenizer.json","tokenizer.model","added_tokens.json","tokenizer_config.json","chat_template.jinja"],[X,ne,xe,Me,Je]=$e;function re(t,r,s){return r!==null&&!(t===ne||t===xe)&&r.siblings.some(n=>n.name===t)?r:s}var ke=(t,r)=>new l("validate",`${t}@${r} has neither tokenizer.json nor tokenizer.model`),ft="the model has no tokenizer.json, and ";function Ke(t,r,s){let e=O(t);return e.kind!=="validate"||!e.message.startsWith(ft)?t:new l("validate",`${r}@${s}: ${e.message}`,e.missing)}var ve="adapter_model.safetensors",dt=["fit","request","probe"];function Ze(){return new Promise(t=>{let r=new MessageChannel;r.port1.onmessage=()=>{r.port1.close(),t()},r.port2.postMessage(0)})}function ht(t,r,s){if(t!=="")return t;let e=[r,s].filter(n=>n!=="");return e.length>0?e.join(" "):"unnamed adapter"}async function Ye(t,r,s){let e,n;try{e=s.kind==="prefill"?t.resolve("prefill",s.n):t.resolve("step",s.pos),n=t.actIn(s.kind==="prefill"?s.n:1)}catch(u){try{t.failLaunch(O(u).message)}catch{}throw u}await r.run(e,n)}async function pt(t,r,s,e){if(await Ye(t,r,s),!!e.launched())for(t.finishStart();;){if(!await e.between())return;let n=t.beginNext();if("delta"in n){e.delta(JSON.parse(n.delta));return}if(await Ye(t,r,n.launch),!e.launched())return;let u=JSON.parse(t.finishNext());if(e.delta(u),u.done)return}}function Ve(t,r){let s=null,e=null,n=!1,u=null,c=!1,i=[],d=o=>{let a={...o.doctor(),aliases:i.map(E=>({...E}))};if(e===null)return{...a,storage:null,adapter:null};let g=e.adapter,m=`webgpu (${ht(e.description,g.vendor,g.architecture)})`,h=`backend webgpu on ${a.device}`,v=a.line.startsWith(h)?`backend webgpu on ${m}${a.line.slice(h.length)}`:a.line;return{...a,device:m,line:v,storage:e.storage,adapter:{...g}}},p=new l("request","the engine was disposed during its load"),w=()=>{if(c)throw p};async function y(o){if(s!==null||n)throw new l("request","this engine already has a model loaded");n=!0;let a=null;try{a=await t.openHost(o.probeJson,o.hostWasm,o.cdnWasm),r({id:o.id,type:"host",hostWasm:t.wasmUsed()}),w();let g=await t.hostClass(),m=g.resolveModel(o.model);i=g.listAliases();let h=m.kind==="alias"?m:null,v=null;if(m.kind==="repo"){let f=await t.fetchListing(m.repo,m.revision,{hubBaseUrl:o.hubBaseUrl,offline:o.offline});w(),v=JSON.parse(g.parseListing(f.bytes))}let E=v!==null?v.id:m.repo,L;if(v!==null)L=v.sha;else if(h!==null)L=h.revision;else throw new l("backend","internal invariant broken: a repo id reached the file fetches without its Hub listing");let x={},z,se={repo:E,revision:L,listing:v},oe=f=>({repo:f.id,revision:f.sha,listing:f}),ie=(f,$)=>{let k=f.siblings.find(P=>P.name===$);if(k===void 0)throw new l("validate",`${f.id}@${f.sha} has no ${$}`);return k.size},_=async(f,$,k,P)=>{let F;if(f.listing!==null){if(k&&!f.listing.siblings.some(R=>R.name===$))return null;F={bytes:ie(f.listing,$)}}try{let R=await t.fetchFile(f.repo,f.revision,$,{hubBaseUrl:o.hubBaseUrl,offline:o.offline,rememberAbsent:f.listing===null&&k,...F??{},...P??{},onProgress:I=>r({id:o.id,type:"progress",file:I.file,loaded:I.loaded,total:I.total,repo:f.repo,revision:f.revision,...z!==void 0?{provenance:z}:{}})});return w(),x[$]={source:R.source,verified:R.verified},R.bytes}catch(R){if(k&&R instanceof l&&R.missing==="not-found")return null;throw R}},Q=async(f,$,k)=>await _(f,$,!1,k),Pe=(f,$,k)=>_(oe(f),$,k),Ae={},T=a,Z,ee;if(h!==null&&h.format==="gguf"){let f=P=>t.fetchRange(E,L,h.file,P,{hubBaseUrl:o.hubBaseUrl,offline:o.offline}),$=await f(Math.min(ut,h.bytes));w();for(let P=g.ggufHeaderNeed($,h.bytes);P!==0;P=g.ggufHeaderNeed($,h.bytes))$=await f(P),w();let k=$;Z=P=>T.precheckGguf(k,h.bytes,P),ee=async(P,F)=>{let R=await Q(se,h.file,{sha256:h.sha256,bytes:h.bytes});return F?T.loadWebGpuGguf(R,P):T.loadGguf(R,P)}}else{let f=null,$=v;if(v!==null&&v.shape==="adapter"){let G=`${v.id}@${v.sha}`,j=await Pe(v,"adapter_config.json",!1),A=JSON.parse(g.adapterBase(j,G)),C=U=>{let S=O(U);return S===p||S.message.startsWith(G)?S:new l(S.kind,`${G} names base ${A.repo}: ${S.message}`,S.missing)},B=v.siblings.some(U=>U.name===X);try{let U=await t.fetchListing(A.repo,A.revision,{hubBaseUrl:o.hubBaseUrl,offline:o.offline});w(),$=JSON.parse(g.parseBaseListing(U.bytes,G,B))}catch(U){throw C(U)}f={listing:v,config:j,bytes:ie(v,ve)}}let k=$,P=k!==null?oe(k):se,F=G=>k!==null?oe(re(G,f?.listing??null,k)):se,R=await Q(P,"config.json"),I=await _(P,"model.safetensors.index.json",!0),ce=g.weightFiles(I);if(k!==null){let G=re(X,f?.listing??null,k);if(G.tokenizer===null)throw ke(G.id,G.sha);if(f!==null){let A=f.listing,C=new Set(["adapter_config.json",ve,...$e.filter(S=>re(S,A,k)===A)]),U=["config.json",...I!==null?["model.safetensors.index.json"]:[],...ce,...$e.filter(S=>re(S,A,k)===k)].find(S=>C.has(S));if(U!==void 0)throw new l("validate",`${U} is required from both ${A.id}@${A.sha} (the adapter) and ${k.id}@${k.sha} (its base); a file is fetched from one repo only`)}let j=0;for(let A of ce)j+=ie(k,A);Ae={weightBytes:j,...f!==null?{adapterBytes:f.bytes,baseRepo:k.id,baseRevision:k.sha}:{}}}Z=G=>T.precheck(R,I,G,f?.config),ee=async(G,j)=>{let A=F(X),C,B;if(A.listing!==null){let H=A.listing.tokenizer;if(H===null)throw ke(A.repo,A.revision);C=H,B=await Q(A,H)}else if(C=X,B=await _(A,X,!0),B===null&&(C=ne,B=await _(A,ne,!0)),B===null)throw ke(A.repo,A.revision);let U=C===ne?await _(F(xe),xe,!0):null,S=await _(F(Me),Me,!0),ue=await _(F(Je),Je,!0);try{T.checkTokenizer(R,C,B,U,S,ue)}catch(H){throw Ke(H,A.repo,A.revision)}let fe=[];for(let H of ce)fe.push(await Q(P,H));let Ee=f!==null?[await Pe(f.listing,ve,!1)]:void 0,Re=f?.config;try{return j?T.loadWebGpu(R,C,B,U,S,ue,fe,G,Re,Ee):T.load(R,C,B,U,S,ue,fe,G,Re,Ee)}catch(H){throw Ke(H,A.repo,A.revision)}}}let N={...o.request,repo:E,revision:L,...v!==null&&v.id!==m.repo?{resolvedFrom:m.repo}:{},...Ae},ae,q=null,Xe=()=>{let f={...N,backend:"wasm"};delete f.f16,N=f},le=f=>{let $=JSON.parse(f).provenance;z=typeof $=="string"?$:void 0},We=f=>{Xe();try{le(Z(JSON.stringify(N)))}catch($){let k=O($);throw new l(k.kind,`${k.message} (backend "auto": WebGPU refused first: ${f.message})`)}ae=`webgpu refused: ${f.message}; wasm serves this load`};if(N.backend==="webgpu"){let f=null,$=null;try{f=Z(JSON.stringify(N)),$=JSON.parse(f)}catch(k){let P=O(k);if(!(o.auto===!0&&dt.includes(P.kind)))throw P;We(P)}if($!==null){try{q=await t.openDevice(JSON.parse(o.probeJson),$.f16===!0)}catch(k){let P=O(k);if(o.auto!==!0)throw P;We(P)}q!==null&&le(f)}}else le(Z(JSON.stringify(N)));if(o.check===!0){q?.destroy(),q=null,w(),a=null,T.dispose(),r({id:o.id,type:"checked",backend:N.backend}),t.close();return}try{w();let f=JSON.stringify(N);if(q!==null){let $=await ee(f,!0),k=q;q=null,e=await t.openRuntime(T,k,$)}else await t.instantiate(T,await ee(f,!1))}finally{q?.destroy()}w(),s=a,r({id:o.id,type:"loaded",doctor:d(a),sources:x,...ae!==void 0?{fallback:ae}:{}})}catch(g){if(e?.destroy(),e=null,a!==null&&s!==a)try{a.dispose()}catch{}throw g}finally{n=!1}}async function W(o,a,g,m){let h;"messages"in o.prompt?h=a.startChatSplit(JSON.stringify(o.prompt.messages),m):"text"in o.prompt?h=a.startCompleteSplit(o.prompt.text,null,m):h=a.startCompleteSplit(null,Uint32Array.from(o.prompt.ids),m),await pt(a,g,h,{launched:()=>!c,between:async()=>(await Ze(),!c),delta:v=>r({id:o.id,type:"delta",delta:v})})}async function b(o){if(u!==null)throw new l("request","a generation is already running on this engine");if(s===null)throw new l("request","no model is loaded");let a=s,g=JSON.stringify(o.options);if(e!==null){if(e.failure!==null)throw te(e.failure);u=o.id;try{return await W(o,a,e,g)}catch(m){if(c)return;throw m}finally{u=null}}u=o.id;try{for(("messages"in o.prompt)?a.startChat(JSON.stringify(o.prompt.messages),g):("text"in o.prompt)?a.startComplete(o.prompt.text,null,g):a.startComplete(null,Uint32Array.from(o.prompt.ids),g);;){if(await Ze(),c)return;let m=JSON.parse(a.next());if(r({id:o.id,type:"delta",delta:m}),m.done)return}}finally{u=null}}return async o=>{try{switch(o.type){case"load":return await y(o);case"generate":return await b(o);case"abort":u===o.id&&s?.abort();return;case"doctor":if(s===null)throw new l("request","no model is loaded");r({id:o.id,type:"result",value:d(s)});return;case"dispose":c=!0,e?.destroy(),e=null,s?.dispose(),s=null,r({id:o.id,type:"result",value:null}),t.close();return}}catch(a){if(c)return;let g=O(a),m=e?.failure??null;r({id:o.id,type:"error",kind:g.kind,message:g.message,...m!==null?{fatal:m}:{}})}}}var K=globalThis,gt=Ve({openHost:Fe,wasmUsed:He,hostClass:_e,instantiate:Ne,openDevice:(t,r)=>Ie(t,r),openRuntime:je,fetchFile:Be,fetchListing:Te,fetchRange:Oe,close:()=>K.close()},t=>K.postMessage(t));K.onmessage=t=>{gt(t.data)};me().then(()=>K.postMessage({id:0,type:"ready",url:K.location.href}),t=>K.postMessage({id:0,type:"error",kind:"backend",message:`the browser host's glue (host/caldrix_web.js, beside dist/worker.js) did not load (${t instanceof Error?t.message:String(t)})`}));
@@ -30,6 +30,12 @@ export class CaldrixWeb {
30
30
  * tensor).
31
31
  */
32
32
  bufferBytes(index: number): Uint8Array;
33
+ /**
34
+ * Builds the tokenizer as [`CaldrixWeb::load`] would from its first six arguments, and drops
35
+ * it: called once the tokenizer files are fetched, before the first weight shard, so a refused
36
+ * tokenizer costs no weight byte. Refuses exactly what `load` refuses for the tokenizer.
37
+ */
38
+ checkTokenizer(config_json: Uint8Array, tokenizer_file: string, tokenizer: Uint8Array, added_tokens?: Uint8Array | null, tokenizer_config?: Uint8Array | null, chat_template?: Uint8Array | null): void;
33
39
  /**
34
40
  * Releases the host's heap and everything it holds; every later call (but `dispose` and `abort`,
35
41
  * no-ops, and `argsPtr`, then `0`) is a `request` refusal rather than a use of a freed
@@ -42,6 +48,11 @@ export class CaldrixWeb {
42
48
  * repo's 4-bit note) are `null` otherwise; `source` is the page's to fill.
43
49
  */
44
50
  doctor(): any;
51
+ /**
52
+ * The ids `text` encodes to under the loaded model's tokenizer (its special tokens added,
53
+ * as a completion's prompt is), on either tier.
54
+ */
55
+ encode(text: string): Uint32Array;
45
56
  /**
46
57
  * The runtime's launch failed (a device loss, a validation or out-of-memory error): the
47
58
  * generation ends as `next` does on a failed step -- every later split call is the
@@ -97,7 +108,7 @@ export class CaldrixWeb {
97
108
  * sources in the same index order. Nothing is attached: the split-phase calls drive it. The
98
109
  * adapter arguments and the densified path are [`CaldrixWeb::load`]'s, at the plan dtype f32.
99
110
  */
100
- loadWebGpu(config_json: Uint8Array, tokenizer_json: Uint8Array, tokenizer_config: Uint8Array | null | undefined, chat_template: Uint8Array | null | undefined, files: Array<any>, request_json: string, adapter_config?: Uint8Array | null, adapter_files?: Array<any> | null): any;
111
+ loadWebGpu(config_json: Uint8Array, tokenizer_file: string, tokenizer: Uint8Array, added_tokens: Uint8Array | null | undefined, tokenizer_config: Uint8Array | null | undefined, chat_template: Uint8Array | null | undefined, files: Array<any>, request_json: string, adapter_config?: Uint8Array | null, adapter_files?: Array<any> | null): any;
101
112
  /**
102
113
  * Prechecks again on the real bytes, imports, lowers and places into the host's heap; returns
103
114
  * the module bytes for the page to instantiate over [`memory`]. With `adapter_config` and
@@ -105,8 +116,10 @@ export class CaldrixWeb {
105
116
  * bitsandbytes nf4 repo), the model is imported densified at the request's plan dtype, then
106
117
  * prechecked over the imported dense descriptor and the files' real lengths, lowered and
107
118
  * placed tensor by tensor; the base's files and the adapter's are freed before this returns.
119
+ * `tokenizer_file` names what `tokenizer` holds: `tokenizer.json`, or `tokenizer.model` (with
120
+ * the repo's `added_tokens.json` as `added_tokens`, when it has one), anything else refused.
108
121
  */
109
- load(config_json: Uint8Array, tokenizer_json: Uint8Array, tokenizer_config: Uint8Array | null | undefined, chat_template: Uint8Array | null | undefined, files: Array<any>, request_json: string, adapter_config?: Uint8Array | null, adapter_files?: Array<any> | null): Uint8Array;
122
+ load(config_json: Uint8Array, tokenizer_file: string, tokenizer: Uint8Array, added_tokens: Uint8Array | null | undefined, tokenizer_config: Uint8Array | null | undefined, chat_template: Uint8Array | null | undefined, files: Array<any>, request_json: string, adapter_config?: Uint8Array | null, adapter_files?: Array<any> | null): Uint8Array;
110
123
  /**
111
124
  * Where the module writes each logits row: [`Placed::logits`], `0` when nothing is loaded. For
112
125
  * a test page that reads the row from [`CaldrixWeb::memory`]; the product never reads it.
@@ -126,12 +139,13 @@ export class CaldrixWeb {
126
139
  next(): any;
127
140
  /**
128
141
  * An adapter's base listing bytes, parsed and checked against the adapter (`adapterAt` is
129
- * `id@sha`); answers `{"id","sha","siblings"}`.
142
+ * `id@sha`); answers `{"id","sha","tokenizer","siblings"}`.
130
143
  */
131
144
  static parseBaseListing(bytes: Uint8Array, adapter_at: string, adapter_has_tokenizer: boolean): string;
132
145
  /**
133
146
  * The Hub's listing bytes, parsed, gated refused and the shape decided; answers the JSON
134
- * `{"id","sha","shape":"model"|"adapter","siblings":[{"name","size"}]}` (never gated).
147
+ * `{"id","sha","shape":"model"|"adapter","tokenizer","siblings":[{"name","size"}]}` (never
148
+ * gated); `tokenizer` is the file a load reads, `"tokenizer.json"`, `"tokenizer.model"` or `null`.
135
149
  */
136
150
  static parseListing(bytes: Uint8Array): string;
137
151
  /**
@@ -186,8 +200,10 @@ export interface InitOutput {
186
200
  readonly caldrixweb_attach: (a: number, b: number, c: number, d: number) => void;
187
201
  readonly caldrixweb_beginNext: (a: number, b: number) => void;
188
202
  readonly caldrixweb_bufferBytes: (a: number, b: number, c: number) => void;
203
+ readonly caldrixweb_checkTokenizer: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number) => void;
189
204
  readonly caldrixweb_dispose: (a: number) => void;
190
205
  readonly caldrixweb_doctor: (a: number, b: number) => void;
206
+ readonly caldrixweb_encode: (a: number, b: number, c: number, d: number) => void;
191
207
  readonly caldrixweb_failLaunch: (a: number, b: number, c: number, d: number) => void;
192
208
  readonly caldrixweb_finishNext: (a: number, b: number) => void;
193
209
  readonly caldrixweb_finishStart: (a: number, b: number) => void;
@@ -195,9 +211,9 @@ export interface InitOutput {
195
211
  readonly caldrixweb_ggufHeaderNeed: (a: number, b: number, c: number, d: number) => void;
196
212
  readonly caldrixweb_listAliases: (a: number) => void;
197
213
  readonly caldrixweb_listingCap: () => number;
198
- readonly caldrixweb_load: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number) => void;
214
+ readonly caldrixweb_load: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number) => void;
199
215
  readonly caldrixweb_loadGguf: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
200
- readonly caldrixweb_loadWebGpu: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number) => void;
216
+ readonly caldrixweb_loadWebGpu: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number) => void;
201
217
  readonly caldrixweb_loadWebGpuGguf: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
202
218
  readonly caldrixweb_logitsPtr: (a: number, b: number) => void;
203
219
  readonly caldrixweb_memory: () => number;
@@ -1 +1 @@
1
- class ${__destroy_into_raw(){const e=this.__wbg_ptr;return this.__wbg_ptr=0,X.unregister(this),e}free(){const e=this.__destroy_into_raw();t.__wbg_caldrixweb_free(e,0)}abort(){t.caldrixweb_abort(this.__wbg_ptr)}actIn(e){try{const s=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_actIn(s,this.__wbg_ptr,e);var n=i().getInt32(s+0,!0),_=i().getInt32(s+4,!0),r=i().getInt32(s+8,!0);if(r)throw d(_);return d(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static adapterBase(e,n){let _,r;try{const p=t.__wbindgen_add_to_stack_pointer(-16),l=y(e,t.__wbindgen_export),I=g,k=v(n,t.__wbindgen_export,t.__wbindgen_export2),m=g;t.caldrixweb_adapterBase(p,l,I,k,m);var s=i().getInt32(p+0,!0),o=i().getInt32(p+4,!0),c=i().getInt32(p+8,!0),b=i().getInt32(p+12,!0),u=s,w=o;if(b)throw u=0,w=0,d(c);return _=u,r=w,C(u,w)}finally{t.__wbindgen_add_to_stack_pointer(16),t.__wbindgen_export4(_,r,1)}}argsPtr(){return t.caldrixweb_argsPtr(this.__wbg_ptr)>>>0}attach(e,n){try{const s=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_attach(s,this.__wbg_ptr,x(e),x(n));var _=i().getInt32(s+0,!0),r=i().getInt32(s+4,!0);if(r)throw d(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}beginNext(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_beginNext(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw d(n);return d(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}bufferBytes(e){try{const s=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_bufferBytes(s,this.__wbg_ptr,e);var n=i().getInt32(s+0,!0),_=i().getInt32(s+4,!0),r=i().getInt32(s+8,!0);if(r)throw d(_);return d(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}dispose(){t.caldrixweb_dispose(this.__wbg_ptr)}doctor(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_doctor(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw d(n);return d(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}failLaunch(e){try{const r=t.__wbindgen_add_to_stack_pointer(-16),s=v(e,t.__wbindgen_export,t.__wbindgen_export2),o=g;t.caldrixweb_failLaunch(r,this.__wbg_ptr,s,o);var n=i().getInt32(r+0,!0),_=i().getInt32(r+4,!0);if(_)throw d(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}finishNext(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_finishNext(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw d(n);return d(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}finishStart(){try{const _=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_finishStart(_,this.__wbg_ptr);var e=i().getInt32(_+0,!0),n=i().getInt32(_+4,!0);if(n)throw d(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static ggufHeaderFirstRange(){return t.caldrixweb_ggufHeaderFirstRange()}static ggufHeaderNeed(e,n){try{const o=t.__wbindgen_add_to_stack_pointer(-16),c=y(e,t.__wbindgen_export),b=g;t.caldrixweb_ggufHeaderNeed(o,c,b,n);var _=i().getFloat64(o+0,!0),r=i().getInt32(o+8,!0),s=i().getInt32(o+12,!0);if(s)throw d(r);return _}finally{t.__wbindgen_add_to_stack_pointer(16)}}static listAliases(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_listAliases(r);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw d(n);return d(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static listingCap(){return t.caldrixweb_listingCap()}loadGguf(e,n){try{const o=t.__wbindgen_add_to_stack_pointer(-16),c=y(e,t.__wbindgen_export),b=g,u=v(n,t.__wbindgen_export,t.__wbindgen_export2),w=g;t.caldrixweb_loadGguf(o,this.__wbg_ptr,c,b,u,w);var _=i().getInt32(o+0,!0),r=i().getInt32(o+4,!0),s=i().getInt32(o+8,!0);if(s)throw d(r);return d(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}loadWebGpuGguf(e,n){try{const o=t.__wbindgen_add_to_stack_pointer(-16),c=y(e,t.__wbindgen_export),b=g,u=v(n,t.__wbindgen_export,t.__wbindgen_export2),w=g;t.caldrixweb_loadWebGpuGguf(o,this.__wbg_ptr,c,b,u,w);var _=i().getInt32(o+0,!0),r=i().getInt32(o+4,!0),s=i().getInt32(o+8,!0);if(s)throw d(r);return d(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}loadWebGpu(e,n,_,r,s,o,c,b){try{const A=t.__wbindgen_add_to_stack_pointer(-16),B=y(e,t.__wbindgen_export),G=g,D=y(n,t.__wbindgen_export),N=g;var u=h(_)?0:y(_,t.__wbindgen_export),w=g,p=h(r)?0:y(r,t.__wbindgen_export),l=g;const P=v(o,t.__wbindgen_export,t.__wbindgen_export2),V=g;var I=h(c)?0:y(c,t.__wbindgen_export),k=g;t.caldrixweb_loadWebGpu(A,this.__wbg_ptr,B,G,D,N,u,w,p,l,x(s),P,V,I,k,h(b)?0:x(b));var m=i().getInt32(A+0,!0),R=i().getInt32(A+4,!0),E=i().getInt32(A+8,!0);if(E)throw d(R);return d(m)}finally{t.__wbindgen_add_to_stack_pointer(16)}}load(e,n,_,r,s,o,c,b){try{const A=t.__wbindgen_add_to_stack_pointer(-16),B=y(e,t.__wbindgen_export),G=g,D=y(n,t.__wbindgen_export),N=g;var u=h(_)?0:y(_,t.__wbindgen_export),w=g,p=h(r)?0:y(r,t.__wbindgen_export),l=g;const P=v(o,t.__wbindgen_export,t.__wbindgen_export2),V=g;var I=h(c)?0:y(c,t.__wbindgen_export),k=g;t.caldrixweb_load(A,this.__wbg_ptr,B,G,D,N,u,w,p,l,x(s),P,V,I,k,h(b)?0:x(b));var m=i().getInt32(A+0,!0),R=i().getInt32(A+4,!0),E=i().getInt32(A+8,!0);if(E)throw d(R);return d(m)}finally{t.__wbindgen_add_to_stack_pointer(16)}}logitsPtr(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_logitsPtr(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw d(n);return e>>>0}finally{t.__wbindgen_add_to_stack_pointer(16)}}static memory(){const e=t.caldrixweb_memory();return d(e)}constructor(e){try{const s=t.__wbindgen_add_to_stack_pointer(-16),o=v(e,t.__wbindgen_export,t.__wbindgen_export2),c=g;t.caldrixweb_new(s,o,c);var n=i().getInt32(s+0,!0),_=i().getInt32(s+4,!0),r=i().getInt32(s+8,!0);if(r)throw d(_);return this.__wbg_ptr=n,X.register(this,this.__wbg_ptr,this),this}finally{t.__wbindgen_add_to_stack_pointer(16)}}next(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_next(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw d(n);return d(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static parseBaseListing(e,n,_){let r,s;try{const l=t.__wbindgen_add_to_stack_pointer(-16),I=y(e,t.__wbindgen_export),k=g,m=v(n,t.__wbindgen_export,t.__wbindgen_export2),R=g;t.caldrixweb_parseBaseListing(l,I,k,m,R,_);var o=i().getInt32(l+0,!0),c=i().getInt32(l+4,!0),b=i().getInt32(l+8,!0),u=i().getInt32(l+12,!0),w=o,p=c;if(u)throw w=0,p=0,d(b);return r=w,s=p,C(w,p)}finally{t.__wbindgen_add_to_stack_pointer(16),t.__wbindgen_export4(r,s,1)}}static parseListing(e){let n,_;try{const w=t.__wbindgen_add_to_stack_pointer(-16),p=y(e,t.__wbindgen_export),l=g;t.caldrixweb_parseListing(w,p,l);var r=i().getInt32(w+0,!0),s=i().getInt32(w+4,!0),o=i().getInt32(w+8,!0),c=i().getInt32(w+12,!0),b=r,u=s;if(c)throw b=0,u=0,d(o);return n=b,_=u,C(b,u)}finally{t.__wbindgen_add_to_stack_pointer(16),t.__wbindgen_export4(n,_,1)}}precheckGguf(e,n,_){try{const c=t.__wbindgen_add_to_stack_pointer(-16),b=y(e,t.__wbindgen_export),u=g,w=v(_,t.__wbindgen_export,t.__wbindgen_export2),p=g;t.caldrixweb_precheckGguf(c,this.__wbg_ptr,b,u,n,w,p);var r=i().getInt32(c+0,!0),s=i().getInt32(c+4,!0),o=i().getInt32(c+8,!0);if(o)throw d(s);return d(r)}finally{t.__wbindgen_add_to_stack_pointer(16)}}precheck(e,n,_,r){try{const l=t.__wbindgen_add_to_stack_pointer(-16),I=y(e,t.__wbindgen_export),k=g;var s=h(n)?0:y(n,t.__wbindgen_export),o=g;const m=v(_,t.__wbindgen_export,t.__wbindgen_export2),R=g;var c=h(r)?0:y(r,t.__wbindgen_export),b=g;t.caldrixweb_precheck(l,this.__wbg_ptr,I,k,s,o,m,R,c,b);var u=i().getInt32(l+0,!0),w=i().getInt32(l+4,!0),p=i().getInt32(l+8,!0);if(p)throw d(w);return d(u)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static resolveAlias(e){try{const s=t.__wbindgen_add_to_stack_pointer(-16),o=v(e,t.__wbindgen_export,t.__wbindgen_export2),c=g;t.caldrixweb_resolveAlias(s,o,c);var n=i().getInt32(s+0,!0),_=i().getInt32(s+4,!0),r=i().getInt32(s+8,!0);if(r)throw d(_);return d(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static resolveModel(e){try{const s=t.__wbindgen_add_to_stack_pointer(-16),o=v(e,t.__wbindgen_export,t.__wbindgen_export2),c=g;t.caldrixweb_resolveModel(s,o,c);var n=i().getInt32(s+0,!0),_=i().getInt32(s+4,!0),r=i().getInt32(s+8,!0);if(r)throw d(_);return d(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}resolve(e,n){try{const o=t.__wbindgen_add_to_stack_pointer(-16),c=v(e,t.__wbindgen_export,t.__wbindgen_export2),b=g;t.caldrixweb_resolve(o,this.__wbg_ptr,c,b,n);var _=i().getInt32(o+0,!0),r=i().getInt32(o+4,!0),s=i().getInt32(o+8,!0);if(s)throw d(r);return d(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}startChatSplit(e,n){try{const o=t.__wbindgen_add_to_stack_pointer(-16),c=v(e,t.__wbindgen_export,t.__wbindgen_export2),b=g,u=v(n,t.__wbindgen_export,t.__wbindgen_export2),w=g;t.caldrixweb_startChatSplit(o,this.__wbg_ptr,c,b,u,w);var _=i().getInt32(o+0,!0),r=i().getInt32(o+4,!0),s=i().getInt32(o+8,!0);if(s)throw d(r);return d(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}startChat(e,n){try{const o=t.__wbindgen_add_to_stack_pointer(-16),c=v(e,t.__wbindgen_export,t.__wbindgen_export2),b=g,u=v(n,t.__wbindgen_export,t.__wbindgen_export2),w=g;t.caldrixweb_startChat(o,this.__wbg_ptr,c,b,u,w);var _=i().getInt32(o+0,!0),r=i().getInt32(o+4,!0),s=i().getInt32(o+8,!0);if(s)throw d(r);return _>>>0}finally{t.__wbindgen_add_to_stack_pointer(16)}}startCompleteSplit(e,n,_){try{const p=t.__wbindgen_add_to_stack_pointer(-16);var r=h(e)?0:v(e,t.__wbindgen_export,t.__wbindgen_export2),s=g,o=h(n)?0:J(n,t.__wbindgen_export),c=g;const l=v(_,t.__wbindgen_export,t.__wbindgen_export2),I=g;t.caldrixweb_startCompleteSplit(p,this.__wbg_ptr,r,s,o,c,l,I);var b=i().getInt32(p+0,!0),u=i().getInt32(p+4,!0),w=i().getInt32(p+8,!0);if(w)throw d(u);return d(b)}finally{t.__wbindgen_add_to_stack_pointer(16)}}startComplete(e,n,_){try{const p=t.__wbindgen_add_to_stack_pointer(-16);var r=h(e)?0:v(e,t.__wbindgen_export,t.__wbindgen_export2),s=g,o=h(n)?0:J(n,t.__wbindgen_export),c=g;const l=v(_,t.__wbindgen_export,t.__wbindgen_export2),I=g;t.caldrixweb_startComplete(p,this.__wbg_ptr,r,s,o,c,l,I);var b=i().getInt32(p+0,!0),u=i().getInt32(p+4,!0),w=i().getInt32(p+8,!0);if(w)throw d(u);return b>>>0}finally{t.__wbindgen_add_to_stack_pointer(16)}}vocab(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_vocab(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw d(n);return e>>>0}finally{t.__wbindgen_add_to_stack_pointer(16)}}static weightFiles(e){try{const c=t.__wbindgen_add_to_stack_pointer(-16);var n=h(e)?0:y(e,t.__wbindgen_export),_=g;t.caldrixweb_weightFiles(c,n,_);var r=i().getInt32(c+0,!0),s=i().getInt32(c+4,!0),o=i().getInt32(c+8,!0);if(o)throw d(s);return d(r)}finally{t.__wbindgen_add_to_stack_pointer(16)}}writeLogits(e){try{const r=t.__wbindgen_add_to_stack_pointer(-16),s=y(e,t.__wbindgen_export),o=g;t.caldrixweb_writeLogits(r,this.__wbg_ptr,s,o);var n=i().getInt32(r+0,!0),_=i().getInt32(r+4,!0);if(_)throw d(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}}Symbol.dispose&&($.prototype[Symbol.dispose]=$.prototype.free);function q(){return{__proto__:null,"./caldrix_web_bg.js":{__proto__:null,__wbg___wbindgen_memory_caa4a6165639c8b5:function(){const e=t.memory;return x(e)},__wbg___wbindgen_number_get_2e0e7dee9f701a71:function(e,n){const _=f(n),r=typeof _=="number"?_:void 0;i().setFloat64(e+8,h(r)?0:r,!0),i().setInt32(e+0,!h(r),!0)},__wbg___wbindgen_string_get_0380ccaa2f57f0d9:function(e,n){const _=f(n),r=typeof _=="string"?_:void 0;var s=h(r)?0:v(r,t.__wbindgen_export,t.__wbindgen_export2),o=g;i().setInt32(e+4,o,!0),i().setInt32(e+0,s,!0)},__wbg___wbindgen_throw_41e9ee4f547fc59a:function(e,n){throw new Error(C(e,n))},__wbg_call_1875a20c43a36133:function(){return T(function(e,n,_,r){const s=f(e).call(f(n),f(_),f(r));return x(s)},arguments)},__wbg_call_187d372bd5fdd4aa:function(){return T(function(e,n,_){const r=f(e).call(f(n),f(_));return x(r)},arguments)},__wbg_getRandomValues_a608c4436c19407a:function(){return T(function(e,n){globalThis.crypto.getRandomValues(H(e,n))},arguments)},__wbg_get_unchecked_288889d017702237:function(e,n){const _=f(e)[n>>>0];return x(_)},__wbg_instanceof_Error_80a725f81f2e102d:function(e){let n;try{n=f(e)instanceof Error}catch{n=!1}return n},__wbg_instanceof_Uint8Array_828cef2aaacafc31:function(e){let n;try{n=f(e)instanceof Uint8Array}catch{n=!1}return n},__wbg_length_7f3c00c40364105e:function(e){return f(e).length},__wbg_length_d4bdea10311bd9cf:function(e){return f(e).length},__wbg_message_5f8387f0c32b90a7:function(e){const n=f(e).message;return x(n)},__wbg_new_617a8cdb8bb1130e:function(){const e=new Object;return x(e)},__wbg_new_ee2291f50781bf1d:function(){const e=new Array;return x(e)},__wbg_new_from_slice_37a3c3a194266cb8:function(e,n){const _=new Uint32Array(Z(e,n));return x(_)},__wbg_new_from_slice_9a868026ffa4208a:function(e,n){const _=new Uint8Array(H(e,n));return x(_)},__wbg_prototypesetcall_bc27214492979395:function(e,n,_){Uint8Array.prototype.set.call(H(e,n),f(_))},__wbg_push_2baf45db356cf468:function(e,n){return f(e).push(f(n))},__wbg_set_145a351398b48c65:function(){return T(function(e,n,_){return Reflect.set(f(e),f(n),f(_))},arguments)},__wbindgen_generic_0000000000000001:function(e){return x(e)},__wbindgen_generic_0000000000000002:function(e,n){const _=C(e,n);return x(_)},__wbindgen_object_drop_ref:function(e){d(e)}}}}const X=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(a=>t.__wbg_caldrixweb_free(a,1));function x(a){F===W.length&&W.push(W.length+1);const e=F;return F=W[e],W[e]=a,e}function Q(a){a<1028||(W[a]=F,F=a)}function Z(a,e){return a=a>>>0,Y().subarray(a/4,a/4+e)}function H(a,e){return a=a>>>0,M().subarray(a/1,a/1+e)}let S=null;function i(){return(S===null||S.buffer.detached===!0||S.buffer.detached===void 0&&S.buffer!==t.memory.buffer)&&(S=new DataView(t.memory.buffer)),S}function C(a,e){return et(a>>>0,e)}let O=null;function Y(){return(O===null||O.byteLength===0)&&(O=new Uint32Array(t.memory.buffer)),O}let U=null;function M(){return(U===null||U.byteLength===0)&&(U=new Uint8Array(t.memory.buffer)),U}function f(a){return W[a]}function T(a,e){try{return a.apply(this,e)}catch(n){t.__wbindgen_export3(x(n))}}let W=new Array(1024).fill(void 0);W.push(void 0,null,!0,!1);let F=W.length;function h(a){return a==null}function J(a,e){const n=e(a.length*4,4)>>>0;return Y().set(a,n/4),g=a.length,n}function y(a,e){const n=e(a.length*1,1)>>>0;return M().set(a,n/1),g=a.length,n}function v(a,e,n){if(n===void 0){const c=L.encode(a),b=e(c.length,1)>>>0;return M().subarray(b,b+c.length).set(c),g=c.length,b}let _=a.length,r=e(_,1)>>>0;const s=M();let o=0;for(;o<_;o++){const c=a.charCodeAt(o);if(c>127)break;s[r+o]=c}if(o!==_){o!==0&&(a=a.slice(o)),r=n(r,_,_=o+a.length*3,1)>>>0;const c=M().subarray(r+o,r+_),b=L.encodeInto(a,c);o+=b.written,r=n(r,_,o,1)>>>0}return g=o,r}function d(a){const e=f(a);return Q(a),e}let j=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});j.decode();const tt=2146435072;let z=0;function et(a,e){return z+=e,z>=tt&&(j=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),j.decode(),z=e),j.decode(M().subarray(a,a+e))}const L=new TextEncoder;"encodeInto"in L||(L.encodeInto=function(a,e){const n=L.encode(a);return e.set(n),{read:a.length,written:n.length}});let g=0,nt,rt,t;function K(a,e){return rt=a,t=a.exports,nt=e,S=null,O=null,U=null,t}async function _t(a,e){if(typeof Response=="function"&&a instanceof Response){if(!a.ok)throw new Error(`failed to fetch Wasm: ${a.status} ${a.statusText} fetching '${a.url}'`);if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(a,e)}catch(r){if(n(a.type)&&a.headers.get("Content-Type")!=="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",r);else throw r}const _=await a.arrayBuffer();return await WebAssembly.instantiate(_,e)}else{const _=await WebAssembly.instantiate(a,e);return _ instanceof WebAssembly.Instance?{instance:_,module:a}:_}function n(_){switch(_){case"basic":case"cors":case"default":return!0}return!1}}function it(a){if(t!==void 0)return t;a!==void 0&&(Object.getPrototypeOf(a)===Object.prototype?{module:a}=a:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));const e=q();a instanceof WebAssembly.Module||(a=new WebAssembly.Module(a));const n=new WebAssembly.Instance(a,e);return K(n,a)}async function at(a){if(t!==void 0)return t;a!==void 0&&(Object.getPrototypeOf(a)===Object.prototype?{module_or_path:a}=a:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),a===void 0&&(a=new URL("caldrix_web_bg.wasm",import.meta.url));const e=q();(typeof a=="string"||typeof Request=="function"&&a instanceof Request||typeof URL=="function"&&a instanceof URL)&&(a=fetch(a));const{instance:n,module:_}=await _t(await a,e);return K(n,_)}export{$ as CaldrixWeb,at as default,it as initSync};
1
+ class Q{__destroy_into_raw(){const e=this.__wbg_ptr;return this.__wbg_ptr=0,tt.unregister(this),e}free(){const e=this.__destroy_into_raw();t.__wbg_caldrixweb_free(e,0)}abort(){t.caldrixweb_abort(this.__wbg_ptr)}actIn(e){try{const o=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_actIn(o,this.__wbg_ptr,e);var n=i().getInt32(o+0,!0),_=i().getInt32(o+4,!0),r=i().getInt32(o+8,!0);if(r)throw g(_);return g(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static adapterBase(e,n){let _,r;try{const u=t.__wbindgen_add_to_stack_pointer(-16),y=l(e,t.__wbindgen_export),I=c,m=f(n,t.__wbindgen_export,t.__wbindgen_export2),k=c;t.caldrixweb_adapterBase(u,y,I,m,k);var o=i().getInt32(u+0,!0),s=i().getInt32(u+4,!0),d=i().getInt32(u+8,!0),w=i().getInt32(u+12,!0),p=o,b=s;if(w)throw p=0,b=0,g(d);return _=p,r=b,L(p,b)}finally{t.__wbindgen_add_to_stack_pointer(16),t.__wbindgen_export4(_,r,1)}}argsPtr(){return t.caldrixweb_argsPtr(this.__wbg_ptr)>>>0}attach(e,n){try{const o=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_attach(o,this.__wbg_ptr,h(e),h(n));var _=i().getInt32(o+0,!0),r=i().getInt32(o+4,!0);if(r)throw g(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}beginNext(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_beginNext(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw g(n);return g(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}bufferBytes(e){try{const o=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_bufferBytes(o,this.__wbg_ptr,e);var n=i().getInt32(o+0,!0),_=i().getInt32(o+4,!0),r=i().getInt32(o+8,!0);if(r)throw g(_);return g(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}checkTokenizer(e,n,_,r,o,s){try{const k=t.__wbindgen_add_to_stack_pointer(-16),A=l(e,t.__wbindgen_export),T=c,C=f(n,t.__wbindgen_export,t.__wbindgen_export2),O=c,U=l(_,t.__wbindgen_export),F=c;var d=v(r)?0:l(r,t.__wbindgen_export),w=c,p=v(o)?0:l(o,t.__wbindgen_export),b=c,u=v(s)?0:l(s,t.__wbindgen_export),y=c;t.caldrixweb_checkTokenizer(k,this.__wbg_ptr,A,T,C,O,U,F,d,w,p,b,u,y);var I=i().getInt32(k+0,!0),m=i().getInt32(k+4,!0);if(m)throw g(I)}finally{t.__wbindgen_add_to_stack_pointer(16)}}dispose(){t.caldrixweb_dispose(this.__wbg_ptr)}doctor(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_doctor(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw g(n);return g(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}encode(e){try{const o=t.__wbindgen_add_to_stack_pointer(-16),s=f(e,t.__wbindgen_export,t.__wbindgen_export2),d=c;t.caldrixweb_encode(o,this.__wbg_ptr,s,d);var n=i().getInt32(o+0,!0),_=i().getInt32(o+4,!0),r=i().getInt32(o+8,!0);if(r)throw g(_);return g(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}failLaunch(e){try{const r=t.__wbindgen_add_to_stack_pointer(-16),o=f(e,t.__wbindgen_export,t.__wbindgen_export2),s=c;t.caldrixweb_failLaunch(r,this.__wbg_ptr,o,s);var n=i().getInt32(r+0,!0),_=i().getInt32(r+4,!0);if(_)throw g(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}finishNext(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_finishNext(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw g(n);return g(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}finishStart(){try{const _=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_finishStart(_,this.__wbg_ptr);var e=i().getInt32(_+0,!0),n=i().getInt32(_+4,!0);if(n)throw g(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static ggufHeaderFirstRange(){return t.caldrixweb_ggufHeaderFirstRange()}static ggufHeaderNeed(e,n){try{const s=t.__wbindgen_add_to_stack_pointer(-16),d=l(e,t.__wbindgen_export),w=c;t.caldrixweb_ggufHeaderNeed(s,d,w,n);var _=i().getFloat64(s+0,!0),r=i().getInt32(s+8,!0),o=i().getInt32(s+12,!0);if(o)throw g(r);return _}finally{t.__wbindgen_add_to_stack_pointer(16)}}static listAliases(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_listAliases(r);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw g(n);return g(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static listingCap(){return t.caldrixweb_listingCap()}loadGguf(e,n){try{const s=t.__wbindgen_add_to_stack_pointer(-16),d=l(e,t.__wbindgen_export),w=c,p=f(n,t.__wbindgen_export,t.__wbindgen_export2),b=c;t.caldrixweb_loadGguf(s,this.__wbg_ptr,d,w,p,b);var _=i().getInt32(s+0,!0),r=i().getInt32(s+4,!0),o=i().getInt32(s+8,!0);if(o)throw g(r);return g(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}loadWebGpuGguf(e,n){try{const s=t.__wbindgen_add_to_stack_pointer(-16),d=l(e,t.__wbindgen_export),w=c,p=f(n,t.__wbindgen_export,t.__wbindgen_export2),b=c;t.caldrixweb_loadWebGpuGguf(s,this.__wbg_ptr,d,w,p,b);var _=i().getInt32(s+0,!0),r=i().getInt32(s+4,!0),o=i().getInt32(s+8,!0);if(o)throw g(r);return g(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}loadWebGpu(e,n,_,r,o,s,d,w,p,b){try{const W=t.__wbindgen_add_to_stack_pointer(-16),P=l(e,t.__wbindgen_export),V=c,H=f(n,t.__wbindgen_export,t.__wbindgen_export2),z=c,$=l(_,t.__wbindgen_export),q=c;var u=v(r)?0:l(r,t.__wbindgen_export),y=c,I=v(o)?0:l(o,t.__wbindgen_export),m=c,k=v(s)?0:l(s,t.__wbindgen_export),A=c;const X=f(w,t.__wbindgen_export,t.__wbindgen_export2),Y=c;var T=v(p)?0:l(p,t.__wbindgen_export),C=c;t.caldrixweb_loadWebGpu(W,this.__wbg_ptr,P,V,H,z,$,q,u,y,I,m,k,A,h(d),X,Y,T,C,v(b)?0:h(b));var O=i().getInt32(W+0,!0),U=i().getInt32(W+4,!0),F=i().getInt32(W+8,!0);if(F)throw g(U);return g(O)}finally{t.__wbindgen_add_to_stack_pointer(16)}}load(e,n,_,r,o,s,d,w,p,b){try{const W=t.__wbindgen_add_to_stack_pointer(-16),P=l(e,t.__wbindgen_export),V=c,H=f(n,t.__wbindgen_export,t.__wbindgen_export2),z=c,$=l(_,t.__wbindgen_export),q=c;var u=v(r)?0:l(r,t.__wbindgen_export),y=c,I=v(o)?0:l(o,t.__wbindgen_export),m=c,k=v(s)?0:l(s,t.__wbindgen_export),A=c;const X=f(w,t.__wbindgen_export,t.__wbindgen_export2),Y=c;var T=v(p)?0:l(p,t.__wbindgen_export),C=c;t.caldrixweb_load(W,this.__wbg_ptr,P,V,H,z,$,q,u,y,I,m,k,A,h(d),X,Y,T,C,v(b)?0:h(b));var O=i().getInt32(W+0,!0),U=i().getInt32(W+4,!0),F=i().getInt32(W+8,!0);if(F)throw g(U);return g(O)}finally{t.__wbindgen_add_to_stack_pointer(16)}}logitsPtr(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_logitsPtr(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw g(n);return e>>>0}finally{t.__wbindgen_add_to_stack_pointer(16)}}static memory(){const e=t.caldrixweb_memory();return g(e)}constructor(e){try{const o=t.__wbindgen_add_to_stack_pointer(-16),s=f(e,t.__wbindgen_export,t.__wbindgen_export2),d=c;t.caldrixweb_new(o,s,d);var n=i().getInt32(o+0,!0),_=i().getInt32(o+4,!0),r=i().getInt32(o+8,!0);if(r)throw g(_);return this.__wbg_ptr=n,tt.register(this,this.__wbg_ptr,this),this}finally{t.__wbindgen_add_to_stack_pointer(16)}}next(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_next(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw g(n);return g(e)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static parseBaseListing(e,n,_){let r,o;try{const y=t.__wbindgen_add_to_stack_pointer(-16),I=l(e,t.__wbindgen_export),m=c,k=f(n,t.__wbindgen_export,t.__wbindgen_export2),A=c;t.caldrixweb_parseBaseListing(y,I,m,k,A,_);var s=i().getInt32(y+0,!0),d=i().getInt32(y+4,!0),w=i().getInt32(y+8,!0),p=i().getInt32(y+12,!0),b=s,u=d;if(p)throw b=0,u=0,g(w);return r=b,o=u,L(b,u)}finally{t.__wbindgen_add_to_stack_pointer(16),t.__wbindgen_export4(r,o,1)}}static parseListing(e){let n,_;try{const b=t.__wbindgen_add_to_stack_pointer(-16),u=l(e,t.__wbindgen_export),y=c;t.caldrixweb_parseListing(b,u,y);var r=i().getInt32(b+0,!0),o=i().getInt32(b+4,!0),s=i().getInt32(b+8,!0),d=i().getInt32(b+12,!0),w=r,p=o;if(d)throw w=0,p=0,g(s);return n=w,_=p,L(w,p)}finally{t.__wbindgen_add_to_stack_pointer(16),t.__wbindgen_export4(n,_,1)}}precheckGguf(e,n,_){try{const d=t.__wbindgen_add_to_stack_pointer(-16),w=l(e,t.__wbindgen_export),p=c,b=f(_,t.__wbindgen_export,t.__wbindgen_export2),u=c;t.caldrixweb_precheckGguf(d,this.__wbg_ptr,w,p,n,b,u);var r=i().getInt32(d+0,!0),o=i().getInt32(d+4,!0),s=i().getInt32(d+8,!0);if(s)throw g(o);return g(r)}finally{t.__wbindgen_add_to_stack_pointer(16)}}precheck(e,n,_,r){try{const y=t.__wbindgen_add_to_stack_pointer(-16),I=l(e,t.__wbindgen_export),m=c;var o=v(n)?0:l(n,t.__wbindgen_export),s=c;const k=f(_,t.__wbindgen_export,t.__wbindgen_export2),A=c;var d=v(r)?0:l(r,t.__wbindgen_export),w=c;t.caldrixweb_precheck(y,this.__wbg_ptr,I,m,o,s,k,A,d,w);var p=i().getInt32(y+0,!0),b=i().getInt32(y+4,!0),u=i().getInt32(y+8,!0);if(u)throw g(b);return g(p)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static resolveAlias(e){try{const o=t.__wbindgen_add_to_stack_pointer(-16),s=f(e,t.__wbindgen_export,t.__wbindgen_export2),d=c;t.caldrixweb_resolveAlias(o,s,d);var n=i().getInt32(o+0,!0),_=i().getInt32(o+4,!0),r=i().getInt32(o+8,!0);if(r)throw g(_);return g(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}static resolveModel(e){try{const o=t.__wbindgen_add_to_stack_pointer(-16),s=f(e,t.__wbindgen_export,t.__wbindgen_export2),d=c;t.caldrixweb_resolveModel(o,s,d);var n=i().getInt32(o+0,!0),_=i().getInt32(o+4,!0),r=i().getInt32(o+8,!0);if(r)throw g(_);return g(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}resolve(e,n){try{const s=t.__wbindgen_add_to_stack_pointer(-16),d=f(e,t.__wbindgen_export,t.__wbindgen_export2),w=c;t.caldrixweb_resolve(s,this.__wbg_ptr,d,w,n);var _=i().getInt32(s+0,!0),r=i().getInt32(s+4,!0),o=i().getInt32(s+8,!0);if(o)throw g(r);return g(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}startChatSplit(e,n){try{const s=t.__wbindgen_add_to_stack_pointer(-16),d=f(e,t.__wbindgen_export,t.__wbindgen_export2),w=c,p=f(n,t.__wbindgen_export,t.__wbindgen_export2),b=c;t.caldrixweb_startChatSplit(s,this.__wbg_ptr,d,w,p,b);var _=i().getInt32(s+0,!0),r=i().getInt32(s+4,!0),o=i().getInt32(s+8,!0);if(o)throw g(r);return g(_)}finally{t.__wbindgen_add_to_stack_pointer(16)}}startChat(e,n){try{const s=t.__wbindgen_add_to_stack_pointer(-16),d=f(e,t.__wbindgen_export,t.__wbindgen_export2),w=c,p=f(n,t.__wbindgen_export,t.__wbindgen_export2),b=c;t.caldrixweb_startChat(s,this.__wbg_ptr,d,w,p,b);var _=i().getInt32(s+0,!0),r=i().getInt32(s+4,!0),o=i().getInt32(s+8,!0);if(o)throw g(r);return _>>>0}finally{t.__wbindgen_add_to_stack_pointer(16)}}startCompleteSplit(e,n,_){try{const u=t.__wbindgen_add_to_stack_pointer(-16);var r=v(e)?0:f(e,t.__wbindgen_export,t.__wbindgen_export2),o=c,s=v(n)?0:nt(n,t.__wbindgen_export),d=c;const y=f(_,t.__wbindgen_export,t.__wbindgen_export2),I=c;t.caldrixweb_startCompleteSplit(u,this.__wbg_ptr,r,o,s,d,y,I);var w=i().getInt32(u+0,!0),p=i().getInt32(u+4,!0),b=i().getInt32(u+8,!0);if(b)throw g(p);return g(w)}finally{t.__wbindgen_add_to_stack_pointer(16)}}startComplete(e,n,_){try{const u=t.__wbindgen_add_to_stack_pointer(-16);var r=v(e)?0:f(e,t.__wbindgen_export,t.__wbindgen_export2),o=c,s=v(n)?0:nt(n,t.__wbindgen_export),d=c;const y=f(_,t.__wbindgen_export,t.__wbindgen_export2),I=c;t.caldrixweb_startComplete(u,this.__wbg_ptr,r,o,s,d,y,I);var w=i().getInt32(u+0,!0),p=i().getInt32(u+4,!0),b=i().getInt32(u+8,!0);if(b)throw g(p);return w>>>0}finally{t.__wbindgen_add_to_stack_pointer(16)}}vocab(){try{const r=t.__wbindgen_add_to_stack_pointer(-16);t.caldrixweb_vocab(r,this.__wbg_ptr);var e=i().getInt32(r+0,!0),n=i().getInt32(r+4,!0),_=i().getInt32(r+8,!0);if(_)throw g(n);return e>>>0}finally{t.__wbindgen_add_to_stack_pointer(16)}}static weightFiles(e){try{const d=t.__wbindgen_add_to_stack_pointer(-16);var n=v(e)?0:l(e,t.__wbindgen_export),_=c;t.caldrixweb_weightFiles(d,n,_);var r=i().getInt32(d+0,!0),o=i().getInt32(d+4,!0),s=i().getInt32(d+8,!0);if(s)throw g(o);return g(r)}finally{t.__wbindgen_add_to_stack_pointer(16)}}writeLogits(e){try{const r=t.__wbindgen_add_to_stack_pointer(-16),o=l(e,t.__wbindgen_export),s=c;t.caldrixweb_writeLogits(r,this.__wbg_ptr,o,s);var n=i().getInt32(r+0,!0),_=i().getInt32(r+4,!0);if(_)throw g(n)}finally{t.__wbindgen_add_to_stack_pointer(16)}}}Symbol.dispose&&(Q.prototype[Symbol.dispose]=Q.prototype.free);function Z(){return{__proto__:null,"./caldrix_web_bg.js":{__proto__:null,__wbg___wbindgen_memory_caa4a6165639c8b5:function(){const e=t.memory;return h(e)},__wbg___wbindgen_number_get_2e0e7dee9f701a71:function(e,n){const _=x(n),r=typeof _=="number"?_:void 0;i().setFloat64(e+8,v(r)?0:r,!0),i().setInt32(e+0,!v(r),!0)},__wbg___wbindgen_string_get_0380ccaa2f57f0d9:function(e,n){const _=x(n),r=typeof _=="string"?_:void 0;var o=v(r)?0:f(r,t.__wbindgen_export,t.__wbindgen_export2),s=c;i().setInt32(e+4,s,!0),i().setInt32(e+0,o,!0)},__wbg___wbindgen_throw_41e9ee4f547fc59a:function(e,n){throw new Error(L(e,n))},__wbg_call_1875a20c43a36133:function(){return D(function(e,n,_,r){const o=x(e).call(x(n),x(_),x(r));return h(o)},arguments)},__wbg_call_187d372bd5fdd4aa:function(){return D(function(e,n,_){const r=x(e).call(x(n),x(_));return h(r)},arguments)},__wbg_getRandomValues_a608c4436c19407a:function(){return D(function(e,n){globalThis.crypto.getRandomValues(J(e,n))},arguments)},__wbg_get_unchecked_288889d017702237:function(e,n){const _=x(e)[n>>>0];return h(_)},__wbg_instanceof_Error_80a725f81f2e102d:function(e){let n;try{n=x(e)instanceof Error}catch{n=!1}return n},__wbg_instanceof_Uint8Array_828cef2aaacafc31:function(e){let n;try{n=x(e)instanceof Uint8Array}catch{n=!1}return n},__wbg_length_7f3c00c40364105e:function(e){return x(e).length},__wbg_length_d4bdea10311bd9cf:function(e){return x(e).length},__wbg_message_5f8387f0c32b90a7:function(e){const n=x(e).message;return h(n)},__wbg_new_617a8cdb8bb1130e:function(){const e=new Object;return h(e)},__wbg_new_ee2291f50781bf1d:function(){const e=new Array;return h(e)},__wbg_new_from_slice_37a3c3a194266cb8:function(e,n){const _=new Uint32Array(it(e,n));return h(_)},__wbg_new_from_slice_9a868026ffa4208a:function(e,n){const _=new Uint8Array(J(e,n));return h(_)},__wbg_prototypesetcall_bc27214492979395:function(e,n,_){Uint8Array.prototype.set.call(J(e,n),x(_))},__wbg_push_2baf45db356cf468:function(e,n){return x(e).push(x(n))},__wbg_set_145a351398b48c65:function(){return D(function(e,n,_){return Reflect.set(x(e),x(n),x(_))},arguments)},__wbindgen_generic_0000000000000001:function(e){return h(e)},__wbindgen_generic_0000000000000002:function(e,n){const _=L(e,n);return h(_)},__wbindgen_object_drop_ref:function(e){g(e)}}}}const tt=typeof FinalizationRegistry>"u"?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(a=>t.__wbg_caldrixweb_free(a,1));function h(a){B===R.length&&R.push(R.length+1);const e=B;return B=R[e],R[e]=a,e}function _t(a){a<1028||(R[a]=B,B=a)}function it(a,e){return a=a>>>0,et().subarray(a/4,a/4+e)}function J(a,e){return a=a>>>0,M().subarray(a/1,a/1+e)}let S=null;function i(){return(S===null||S.buffer.detached===!0||S.buffer.detached===void 0&&S.buffer!==t.memory.buffer)&&(S=new DataView(t.memory.buffer)),S}function L(a,e){return ot(a>>>0,e)}let j=null;function et(){return(j===null||j.byteLength===0)&&(j=new Uint32Array(t.memory.buffer)),j}let E=null;function M(){return(E===null||E.byteLength===0)&&(E=new Uint8Array(t.memory.buffer)),E}function x(a){return R[a]}function D(a,e){try{return a.apply(this,e)}catch(n){t.__wbindgen_export3(h(n))}}let R=new Array(1024).fill(void 0);R.push(void 0,null,!0,!1);let B=R.length;function v(a){return a==null}function nt(a,e){const n=e(a.length*4,4)>>>0;return et().set(a,n/4),c=a.length,n}function l(a,e){const n=e(a.length*1,1)>>>0;return M().set(a,n/1),c=a.length,n}function f(a,e,n){if(n===void 0){const d=G.encode(a),w=e(d.length,1)>>>0;return M().subarray(w,w+d.length).set(d),c=d.length,w}let _=a.length,r=e(_,1)>>>0;const o=M();let s=0;for(;s<_;s++){const d=a.charCodeAt(s);if(d>127)break;o[r+s]=d}if(s!==_){s!==0&&(a=a.slice(s)),r=n(r,_,_=s+a.length*3,1)>>>0;const d=M().subarray(r+s,r+_),w=G.encodeInto(a,d);s+=w.written,r=n(r,_,s,1)>>>0}return c=s,r}function g(a){const e=x(a);return _t(a),e}let N=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});N.decode();const at=2146435072;let K=0;function ot(a,e){return K+=e,K>=at&&(N=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),N.decode(),K=e),N.decode(M().subarray(a,a+e))}const G=new TextEncoder;"encodeInto"in G||(G.encodeInto=function(a,e){const n=G.encode(a);return e.set(n),{read:a.length,written:n.length}});let c=0,st,ct,t;function rt(a,e){return ct=a,t=a.exports,st=e,S=null,j=null,E=null,t}async function dt(a,e){if(typeof Response=="function"&&a instanceof Response){if(!a.ok)throw new Error(`failed to fetch Wasm: ${a.status} ${a.statusText} fetching '${a.url}'`);if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(a,e)}catch(r){if(n(a.type)&&a.headers.get("Content-Type")!=="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",r);else throw r}const _=await a.arrayBuffer();return await WebAssembly.instantiate(_,e)}else{const _=await WebAssembly.instantiate(a,e);return _ instanceof WebAssembly.Instance?{instance:_,module:a}:_}function n(_){switch(_){case"basic":case"cors":case"default":return!0}return!1}}function gt(a){if(t!==void 0)return t;a!==void 0&&(Object.getPrototypeOf(a)===Object.prototype?{module:a}=a:console.warn("using deprecated parameters for `initSync()`; pass a single object instead"));const e=Z();a instanceof WebAssembly.Module||(a=new WebAssembly.Module(a));const n=new WebAssembly.Instance(a,e);return rt(n,a)}async function wt(a){if(t!==void 0)return t;a!==void 0&&(Object.getPrototypeOf(a)===Object.prototype?{module_or_path:a}=a:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),a===void 0&&(a=new URL("caldrix_web_bg.wasm",import.meta.url));const e=Z();(typeof a=="string"||typeof Request=="function"&&a instanceof Request||typeof URL=="function"&&a instanceof URL)&&(a=fetch(a));const{instance:n,module:_}=await dt(await a,e);return rt(n,_)}export{Q as CaldrixWeb,wt as default,gt as initSync};
Binary file
@@ -9,8 +9,10 @@ export const caldrixweb_argsPtr: (a: number) => number;
9
9
  export const caldrixweb_attach: (a: number, b: number, c: number, d: number) => void;
10
10
  export const caldrixweb_beginNext: (a: number, b: number) => void;
11
11
  export const caldrixweb_bufferBytes: (a: number, b: number, c: number) => void;
12
+ export const caldrixweb_checkTokenizer: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number) => void;
12
13
  export const caldrixweb_dispose: (a: number) => void;
13
14
  export const caldrixweb_doctor: (a: number, b: number) => void;
15
+ export const caldrixweb_encode: (a: number, b: number, c: number, d: number) => void;
14
16
  export const caldrixweb_failLaunch: (a: number, b: number, c: number, d: number) => void;
15
17
  export const caldrixweb_finishNext: (a: number, b: number) => void;
16
18
  export const caldrixweb_finishStart: (a: number, b: number) => void;
@@ -18,9 +20,9 @@ export const caldrixweb_ggufHeaderFirstRange: () => number;
18
20
  export const caldrixweb_ggufHeaderNeed: (a: number, b: number, c: number, d: number) => void;
19
21
  export const caldrixweb_listAliases: (a: number) => void;
20
22
  export const caldrixweb_listingCap: () => number;
21
- export const caldrixweb_load: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number) => void;
23
+ export const caldrixweb_load: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number) => void;
22
24
  export const caldrixweb_loadGguf: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
23
- export const caldrixweb_loadWebGpu: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number) => void;
25
+ export const caldrixweb_loadWebGpu: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number, r: number, s: number, t: number) => void;
24
26
  export const caldrixweb_loadWebGpuGguf: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
25
27
  export const caldrixweb_logitsPtr: (a: number, b: number) => void;
26
28
  export const caldrixweb_memory: () => number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caldrix-ai/caldrix",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "private": false,
5
5
  "description": "Run a language model in the browser, in a worker, on WebAssembly or WebGPU; see the README for what has run.",
6
6
  "license": "Apache-2.0",