choltha commited on
Commit
824c790
·
verified ·
1 Parent(s): 3f7f0ef

Upload LFM2.5 WebGPU static app

Browse files

Replace the default Static Space template with the Transformers.js WebGPU app.

Files changed (14) hide show
  1. .gitignore +2 -0
  2. AGENTS.md +37 -0
  3. README.md +43 -4
  4. index.html +14 -17
  5. package-lock.json +2112 -0
  6. package.json +18 -0
  7. src/main.ts +272 -0
  8. src/messages.ts +44 -0
  9. src/model.ts +44 -0
  10. src/styles.css +419 -0
  11. src/worker.ts +162 -0
  12. style.css +0 -28
  13. tsconfig.json +20 -0
  14. vite.config.ts +10 -0
.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ node_modules/
2
+ dist/
AGENTS.md ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # AGENTS.md - LFM2.5 230M WebGPU Space
2
+
3
+ ## Scope
4
+
5
+ This folder is a Hugging Face Static Space for running `LiquidAI/LFM2.5-230M-ONNX` in the browser with Transformers.js and WebGPU.
6
+
7
+ ## Key Constraints
8
+
9
+ - Keep this as a static app unless there is a deliberate reason to move inference server-side.
10
+ - Do not add Gradio/Python runtime files for the normal browser demo path.
11
+ - Default to `device: "webgpu"` and `dtype: "q4"` for the model.
12
+ - Only expose WebGPU-supported model precisions in the UI (`q4` and `fp16` for this model).
13
+ - Keep model loading and generation in a Web Worker so the UI thread remains responsive.
14
+ - Do not commit downloaded model weights; Transformers.js fetches them from Hugging Face at runtime.
15
+
16
+ ## Hugging Face Space Metadata
17
+
18
+ The Space config lives in `README.md` front matter:
19
+
20
+ ```yaml
21
+ sdk: static
22
+ app_build_command: npm run build
23
+ app_file: dist/index.html
24
+ models:
25
+ - LiquidAI/LFM2.5-230M-ONNX
26
+ ```
27
+
28
+ ## Verification
29
+
30
+ Preferred local checks:
31
+
32
+ ```bash
33
+ npm run build
34
+ npm run preview
35
+ ```
36
+
37
+ Manual browser check should use Chrome or Edge with WebGPU available. Verify model load progress, streamed output, and the WebGPU-unavailable failure state when applicable.
README.md CHANGED
@@ -1,10 +1,49 @@
1
  ---
2
- title: Lfm25 230m Webgpu
3
- emoji: 😻
4
- colorFrom: purple
5
  colorTo: blue
6
  sdk: static
 
 
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: LFM2.5 230M WebGPU
3
+ colorFrom: gray
 
4
  colorTo: blue
5
  sdk: static
6
+ app_build_command: npm run build
7
+ app_file: dist/index.html
8
  pinned: false
9
+ models:
10
+ - LiquidAI/LFM2.5-230M-ONNX
11
  ---
12
 
13
+ # LFM2.5 230M WebGPU
14
+
15
+ Browser-only text generation demo for `LiquidAI/LFM2.5-230M-ONNX` using Transformers.js and WebGPU.
16
+
17
+ The app runs inference in the visitor's browser. The Space only serves the static application files; model weights are fetched by Transformers.js from the Hugging Face Hub and cached by the browser.
18
+
19
+ ## Local development
20
+
21
+ ```bash
22
+ npm install
23
+ npm run dev
24
+ ```
25
+
26
+ Open the local Vite URL in Chrome or Edge with WebGPU support enabled.
27
+
28
+ ## Build
29
+
30
+ ```bash
31
+ npm run build
32
+ npm run preview
33
+ ```
34
+
35
+ ## Deployment
36
+
37
+ Create a Static Space, then upload this directory as the Space repository root:
38
+
39
+ ```bash
40
+ huggingface-cli repo create <owner>/lfm25-230m-webgpu --type space --space_sdk static
41
+ huggingface-cli upload <owner>/lfm25-230m-webgpu . . --repo-type space
42
+ ```
43
+
44
+ ## Notes
45
+
46
+ - Default precision is Q4, which is the recommended WebGPU variant for this model.
47
+ - FP16 is available as a quality-oriented option with a larger initial download.
48
+ - Q4F32 and Q8 are not exposed in the UI because the model card marks them as server-only for this export.
49
+ - The base model card recommends this model for data extraction and lightweight on-device agentic workflows, not reasoning-heavy workloads.
index.html CHANGED
@@ -1,19 +1,16 @@
1
  <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
  </html>
 
1
  <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <meta
7
+ name="description"
8
+ content="Run LiquidAI LFM2.5 230M locally in your browser with Transformers.js and WebGPU."
9
+ />
10
+ <title>LFM2.5 230M WebGPU</title>
11
+ </head>
12
+ <body>
13
+ <div id="app"></div>
14
+ <script type="module" src="/src/main.ts"></script>
15
+ </body>
 
 
 
16
  </html>
package-lock.json ADDED
@@ -0,0 +1,2112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "lfm25-230m-webgpu-space",
3
+ "version": "0.1.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "lfm25-230m-webgpu-space",
9
+ "version": "0.1.0",
10
+ "dependencies": {
11
+ "@huggingface/transformers": "^3.8.1"
12
+ },
13
+ "devDependencies": {
14
+ "typescript": "^5.5.4",
15
+ "vite": "^5.4.11"
16
+ }
17
+ },
18
+ "node_modules/@emnapi/runtime": {
19
+ "version": "1.11.1",
20
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz",
21
+ "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==",
22
+ "license": "MIT",
23
+ "optional": true,
24
+ "dependencies": {
25
+ "tslib": "^2.4.0"
26
+ }
27
+ },
28
+ "node_modules/@esbuild/aix-ppc64": {
29
+ "version": "0.21.5",
30
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
31
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
32
+ "cpu": [
33
+ "ppc64"
34
+ ],
35
+ "dev": true,
36
+ "license": "MIT",
37
+ "optional": true,
38
+ "os": [
39
+ "aix"
40
+ ],
41
+ "engines": {
42
+ "node": ">=12"
43
+ }
44
+ },
45
+ "node_modules/@esbuild/android-arm": {
46
+ "version": "0.21.5",
47
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
48
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
49
+ "cpu": [
50
+ "arm"
51
+ ],
52
+ "dev": true,
53
+ "license": "MIT",
54
+ "optional": true,
55
+ "os": [
56
+ "android"
57
+ ],
58
+ "engines": {
59
+ "node": ">=12"
60
+ }
61
+ },
62
+ "node_modules/@esbuild/android-arm64": {
63
+ "version": "0.21.5",
64
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
65
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
66
+ "cpu": [
67
+ "arm64"
68
+ ],
69
+ "dev": true,
70
+ "license": "MIT",
71
+ "optional": true,
72
+ "os": [
73
+ "android"
74
+ ],
75
+ "engines": {
76
+ "node": ">=12"
77
+ }
78
+ },
79
+ "node_modules/@esbuild/android-x64": {
80
+ "version": "0.21.5",
81
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
82
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
83
+ "cpu": [
84
+ "x64"
85
+ ],
86
+ "dev": true,
87
+ "license": "MIT",
88
+ "optional": true,
89
+ "os": [
90
+ "android"
91
+ ],
92
+ "engines": {
93
+ "node": ">=12"
94
+ }
95
+ },
96
+ "node_modules/@esbuild/darwin-arm64": {
97
+ "version": "0.21.5",
98
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
99
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
100
+ "cpu": [
101
+ "arm64"
102
+ ],
103
+ "dev": true,
104
+ "license": "MIT",
105
+ "optional": true,
106
+ "os": [
107
+ "darwin"
108
+ ],
109
+ "engines": {
110
+ "node": ">=12"
111
+ }
112
+ },
113
+ "node_modules/@esbuild/darwin-x64": {
114
+ "version": "0.21.5",
115
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
116
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
117
+ "cpu": [
118
+ "x64"
119
+ ],
120
+ "dev": true,
121
+ "license": "MIT",
122
+ "optional": true,
123
+ "os": [
124
+ "darwin"
125
+ ],
126
+ "engines": {
127
+ "node": ">=12"
128
+ }
129
+ },
130
+ "node_modules/@esbuild/freebsd-arm64": {
131
+ "version": "0.21.5",
132
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
133
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
134
+ "cpu": [
135
+ "arm64"
136
+ ],
137
+ "dev": true,
138
+ "license": "MIT",
139
+ "optional": true,
140
+ "os": [
141
+ "freebsd"
142
+ ],
143
+ "engines": {
144
+ "node": ">=12"
145
+ }
146
+ },
147
+ "node_modules/@esbuild/freebsd-x64": {
148
+ "version": "0.21.5",
149
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
150
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
151
+ "cpu": [
152
+ "x64"
153
+ ],
154
+ "dev": true,
155
+ "license": "MIT",
156
+ "optional": true,
157
+ "os": [
158
+ "freebsd"
159
+ ],
160
+ "engines": {
161
+ "node": ">=12"
162
+ }
163
+ },
164
+ "node_modules/@esbuild/linux-arm": {
165
+ "version": "0.21.5",
166
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
167
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
168
+ "cpu": [
169
+ "arm"
170
+ ],
171
+ "dev": true,
172
+ "license": "MIT",
173
+ "optional": true,
174
+ "os": [
175
+ "linux"
176
+ ],
177
+ "engines": {
178
+ "node": ">=12"
179
+ }
180
+ },
181
+ "node_modules/@esbuild/linux-arm64": {
182
+ "version": "0.21.5",
183
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
184
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
185
+ "cpu": [
186
+ "arm64"
187
+ ],
188
+ "dev": true,
189
+ "license": "MIT",
190
+ "optional": true,
191
+ "os": [
192
+ "linux"
193
+ ],
194
+ "engines": {
195
+ "node": ">=12"
196
+ }
197
+ },
198
+ "node_modules/@esbuild/linux-ia32": {
199
+ "version": "0.21.5",
200
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
201
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
202
+ "cpu": [
203
+ "ia32"
204
+ ],
205
+ "dev": true,
206
+ "license": "MIT",
207
+ "optional": true,
208
+ "os": [
209
+ "linux"
210
+ ],
211
+ "engines": {
212
+ "node": ">=12"
213
+ }
214
+ },
215
+ "node_modules/@esbuild/linux-loong64": {
216
+ "version": "0.21.5",
217
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
218
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
219
+ "cpu": [
220
+ "loong64"
221
+ ],
222
+ "dev": true,
223
+ "license": "MIT",
224
+ "optional": true,
225
+ "os": [
226
+ "linux"
227
+ ],
228
+ "engines": {
229
+ "node": ">=12"
230
+ }
231
+ },
232
+ "node_modules/@esbuild/linux-mips64el": {
233
+ "version": "0.21.5",
234
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
235
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
236
+ "cpu": [
237
+ "mips64el"
238
+ ],
239
+ "dev": true,
240
+ "license": "MIT",
241
+ "optional": true,
242
+ "os": [
243
+ "linux"
244
+ ],
245
+ "engines": {
246
+ "node": ">=12"
247
+ }
248
+ },
249
+ "node_modules/@esbuild/linux-ppc64": {
250
+ "version": "0.21.5",
251
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
252
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
253
+ "cpu": [
254
+ "ppc64"
255
+ ],
256
+ "dev": true,
257
+ "license": "MIT",
258
+ "optional": true,
259
+ "os": [
260
+ "linux"
261
+ ],
262
+ "engines": {
263
+ "node": ">=12"
264
+ }
265
+ },
266
+ "node_modules/@esbuild/linux-riscv64": {
267
+ "version": "0.21.5",
268
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
269
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
270
+ "cpu": [
271
+ "riscv64"
272
+ ],
273
+ "dev": true,
274
+ "license": "MIT",
275
+ "optional": true,
276
+ "os": [
277
+ "linux"
278
+ ],
279
+ "engines": {
280
+ "node": ">=12"
281
+ }
282
+ },
283
+ "node_modules/@esbuild/linux-s390x": {
284
+ "version": "0.21.5",
285
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
286
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
287
+ "cpu": [
288
+ "s390x"
289
+ ],
290
+ "dev": true,
291
+ "license": "MIT",
292
+ "optional": true,
293
+ "os": [
294
+ "linux"
295
+ ],
296
+ "engines": {
297
+ "node": ">=12"
298
+ }
299
+ },
300
+ "node_modules/@esbuild/linux-x64": {
301
+ "version": "0.21.5",
302
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
303
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
304
+ "cpu": [
305
+ "x64"
306
+ ],
307
+ "dev": true,
308
+ "license": "MIT",
309
+ "optional": true,
310
+ "os": [
311
+ "linux"
312
+ ],
313
+ "engines": {
314
+ "node": ">=12"
315
+ }
316
+ },
317
+ "node_modules/@esbuild/netbsd-x64": {
318
+ "version": "0.21.5",
319
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
320
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
321
+ "cpu": [
322
+ "x64"
323
+ ],
324
+ "dev": true,
325
+ "license": "MIT",
326
+ "optional": true,
327
+ "os": [
328
+ "netbsd"
329
+ ],
330
+ "engines": {
331
+ "node": ">=12"
332
+ }
333
+ },
334
+ "node_modules/@esbuild/openbsd-x64": {
335
+ "version": "0.21.5",
336
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
337
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
338
+ "cpu": [
339
+ "x64"
340
+ ],
341
+ "dev": true,
342
+ "license": "MIT",
343
+ "optional": true,
344
+ "os": [
345
+ "openbsd"
346
+ ],
347
+ "engines": {
348
+ "node": ">=12"
349
+ }
350
+ },
351
+ "node_modules/@esbuild/sunos-x64": {
352
+ "version": "0.21.5",
353
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
354
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
355
+ "cpu": [
356
+ "x64"
357
+ ],
358
+ "dev": true,
359
+ "license": "MIT",
360
+ "optional": true,
361
+ "os": [
362
+ "sunos"
363
+ ],
364
+ "engines": {
365
+ "node": ">=12"
366
+ }
367
+ },
368
+ "node_modules/@esbuild/win32-arm64": {
369
+ "version": "0.21.5",
370
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
371
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
372
+ "cpu": [
373
+ "arm64"
374
+ ],
375
+ "dev": true,
376
+ "license": "MIT",
377
+ "optional": true,
378
+ "os": [
379
+ "win32"
380
+ ],
381
+ "engines": {
382
+ "node": ">=12"
383
+ }
384
+ },
385
+ "node_modules/@esbuild/win32-ia32": {
386
+ "version": "0.21.5",
387
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
388
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
389
+ "cpu": [
390
+ "ia32"
391
+ ],
392
+ "dev": true,
393
+ "license": "MIT",
394
+ "optional": true,
395
+ "os": [
396
+ "win32"
397
+ ],
398
+ "engines": {
399
+ "node": ">=12"
400
+ }
401
+ },
402
+ "node_modules/@esbuild/win32-x64": {
403
+ "version": "0.21.5",
404
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
405
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
406
+ "cpu": [
407
+ "x64"
408
+ ],
409
+ "dev": true,
410
+ "license": "MIT",
411
+ "optional": true,
412
+ "os": [
413
+ "win32"
414
+ ],
415
+ "engines": {
416
+ "node": ">=12"
417
+ }
418
+ },
419
+ "node_modules/@huggingface/jinja": {
420
+ "version": "0.5.9",
421
+ "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.5.9.tgz",
422
+ "integrity": "sha512-uWTG+l3VJRsl7EXxYizuL3P+cCPoc3cRqbWWRcQN0FhejRfbdq0RNhCmbY/YDtnTcz9icdLYuLDjsnz4d8JMuw==",
423
+ "license": "MIT",
424
+ "engines": {
425
+ "node": ">=18"
426
+ }
427
+ },
428
+ "node_modules/@huggingface/transformers": {
429
+ "version": "3.8.1",
430
+ "resolved": "https://registry.npmjs.org/@huggingface/transformers/-/transformers-3.8.1.tgz",
431
+ "integrity": "sha512-tsTk4zVjImqdqjS8/AOZg2yNLd1z9S5v+7oUPpXaasDRwEDhB+xnglK1k5cad26lL5/ZIaeREgWWy0bs9y9pPA==",
432
+ "license": "Apache-2.0",
433
+ "dependencies": {
434
+ "@huggingface/jinja": "^0.5.3",
435
+ "onnxruntime-node": "1.21.0",
436
+ "onnxruntime-web": "1.22.0-dev.20250409-89f8206ba4",
437
+ "sharp": "^0.34.1"
438
+ }
439
+ },
440
+ "node_modules/@img/colour": {
441
+ "version": "1.1.0",
442
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
443
+ "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
444
+ "license": "MIT",
445
+ "engines": {
446
+ "node": ">=18"
447
+ }
448
+ },
449
+ "node_modules/@img/sharp-darwin-arm64": {
450
+ "version": "0.34.5",
451
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
452
+ "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
453
+ "cpu": [
454
+ "arm64"
455
+ ],
456
+ "license": "Apache-2.0",
457
+ "optional": true,
458
+ "os": [
459
+ "darwin"
460
+ ],
461
+ "engines": {
462
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
463
+ },
464
+ "funding": {
465
+ "url": "https://opencollective.com/libvips"
466
+ },
467
+ "optionalDependencies": {
468
+ "@img/sharp-libvips-darwin-arm64": "1.2.4"
469
+ }
470
+ },
471
+ "node_modules/@img/sharp-darwin-x64": {
472
+ "version": "0.34.5",
473
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
474
+ "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
475
+ "cpu": [
476
+ "x64"
477
+ ],
478
+ "license": "Apache-2.0",
479
+ "optional": true,
480
+ "os": [
481
+ "darwin"
482
+ ],
483
+ "engines": {
484
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
485
+ },
486
+ "funding": {
487
+ "url": "https://opencollective.com/libvips"
488
+ },
489
+ "optionalDependencies": {
490
+ "@img/sharp-libvips-darwin-x64": "1.2.4"
491
+ }
492
+ },
493
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
494
+ "version": "1.2.4",
495
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
496
+ "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
497
+ "cpu": [
498
+ "arm64"
499
+ ],
500
+ "license": "LGPL-3.0-or-later",
501
+ "optional": true,
502
+ "os": [
503
+ "darwin"
504
+ ],
505
+ "funding": {
506
+ "url": "https://opencollective.com/libvips"
507
+ }
508
+ },
509
+ "node_modules/@img/sharp-libvips-darwin-x64": {
510
+ "version": "1.2.4",
511
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
512
+ "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
513
+ "cpu": [
514
+ "x64"
515
+ ],
516
+ "license": "LGPL-3.0-or-later",
517
+ "optional": true,
518
+ "os": [
519
+ "darwin"
520
+ ],
521
+ "funding": {
522
+ "url": "https://opencollective.com/libvips"
523
+ }
524
+ },
525
+ "node_modules/@img/sharp-libvips-linux-arm": {
526
+ "version": "1.2.4",
527
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
528
+ "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
529
+ "cpu": [
530
+ "arm"
531
+ ],
532
+ "libc": [
533
+ "glibc"
534
+ ],
535
+ "license": "LGPL-3.0-or-later",
536
+ "optional": true,
537
+ "os": [
538
+ "linux"
539
+ ],
540
+ "funding": {
541
+ "url": "https://opencollective.com/libvips"
542
+ }
543
+ },
544
+ "node_modules/@img/sharp-libvips-linux-arm64": {
545
+ "version": "1.2.4",
546
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
547
+ "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
548
+ "cpu": [
549
+ "arm64"
550
+ ],
551
+ "libc": [
552
+ "glibc"
553
+ ],
554
+ "license": "LGPL-3.0-or-later",
555
+ "optional": true,
556
+ "os": [
557
+ "linux"
558
+ ],
559
+ "funding": {
560
+ "url": "https://opencollective.com/libvips"
561
+ }
562
+ },
563
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
564
+ "version": "1.2.4",
565
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
566
+ "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
567
+ "cpu": [
568
+ "ppc64"
569
+ ],
570
+ "libc": [
571
+ "glibc"
572
+ ],
573
+ "license": "LGPL-3.0-or-later",
574
+ "optional": true,
575
+ "os": [
576
+ "linux"
577
+ ],
578
+ "funding": {
579
+ "url": "https://opencollective.com/libvips"
580
+ }
581
+ },
582
+ "node_modules/@img/sharp-libvips-linux-riscv64": {
583
+ "version": "1.2.4",
584
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
585
+ "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
586
+ "cpu": [
587
+ "riscv64"
588
+ ],
589
+ "libc": [
590
+ "glibc"
591
+ ],
592
+ "license": "LGPL-3.0-or-later",
593
+ "optional": true,
594
+ "os": [
595
+ "linux"
596
+ ],
597
+ "funding": {
598
+ "url": "https://opencollective.com/libvips"
599
+ }
600
+ },
601
+ "node_modules/@img/sharp-libvips-linux-s390x": {
602
+ "version": "1.2.4",
603
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
604
+ "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
605
+ "cpu": [
606
+ "s390x"
607
+ ],
608
+ "libc": [
609
+ "glibc"
610
+ ],
611
+ "license": "LGPL-3.0-or-later",
612
+ "optional": true,
613
+ "os": [
614
+ "linux"
615
+ ],
616
+ "funding": {
617
+ "url": "https://opencollective.com/libvips"
618
+ }
619
+ },
620
+ "node_modules/@img/sharp-libvips-linux-x64": {
621
+ "version": "1.2.4",
622
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
623
+ "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
624
+ "cpu": [
625
+ "x64"
626
+ ],
627
+ "libc": [
628
+ "glibc"
629
+ ],
630
+ "license": "LGPL-3.0-or-later",
631
+ "optional": true,
632
+ "os": [
633
+ "linux"
634
+ ],
635
+ "funding": {
636
+ "url": "https://opencollective.com/libvips"
637
+ }
638
+ },
639
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
640
+ "version": "1.2.4",
641
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
642
+ "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
643
+ "cpu": [
644
+ "arm64"
645
+ ],
646
+ "libc": [
647
+ "musl"
648
+ ],
649
+ "license": "LGPL-3.0-or-later",
650
+ "optional": true,
651
+ "os": [
652
+ "linux"
653
+ ],
654
+ "funding": {
655
+ "url": "https://opencollective.com/libvips"
656
+ }
657
+ },
658
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
659
+ "version": "1.2.4",
660
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
661
+ "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
662
+ "cpu": [
663
+ "x64"
664
+ ],
665
+ "libc": [
666
+ "musl"
667
+ ],
668
+ "license": "LGPL-3.0-or-later",
669
+ "optional": true,
670
+ "os": [
671
+ "linux"
672
+ ],
673
+ "funding": {
674
+ "url": "https://opencollective.com/libvips"
675
+ }
676
+ },
677
+ "node_modules/@img/sharp-linux-arm": {
678
+ "version": "0.34.5",
679
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
680
+ "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
681
+ "cpu": [
682
+ "arm"
683
+ ],
684
+ "libc": [
685
+ "glibc"
686
+ ],
687
+ "license": "Apache-2.0",
688
+ "optional": true,
689
+ "os": [
690
+ "linux"
691
+ ],
692
+ "engines": {
693
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
694
+ },
695
+ "funding": {
696
+ "url": "https://opencollective.com/libvips"
697
+ },
698
+ "optionalDependencies": {
699
+ "@img/sharp-libvips-linux-arm": "1.2.4"
700
+ }
701
+ },
702
+ "node_modules/@img/sharp-linux-arm64": {
703
+ "version": "0.34.5",
704
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
705
+ "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
706
+ "cpu": [
707
+ "arm64"
708
+ ],
709
+ "libc": [
710
+ "glibc"
711
+ ],
712
+ "license": "Apache-2.0",
713
+ "optional": true,
714
+ "os": [
715
+ "linux"
716
+ ],
717
+ "engines": {
718
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
719
+ },
720
+ "funding": {
721
+ "url": "https://opencollective.com/libvips"
722
+ },
723
+ "optionalDependencies": {
724
+ "@img/sharp-libvips-linux-arm64": "1.2.4"
725
+ }
726
+ },
727
+ "node_modules/@img/sharp-linux-ppc64": {
728
+ "version": "0.34.5",
729
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
730
+ "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
731
+ "cpu": [
732
+ "ppc64"
733
+ ],
734
+ "libc": [
735
+ "glibc"
736
+ ],
737
+ "license": "Apache-2.0",
738
+ "optional": true,
739
+ "os": [
740
+ "linux"
741
+ ],
742
+ "engines": {
743
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
744
+ },
745
+ "funding": {
746
+ "url": "https://opencollective.com/libvips"
747
+ },
748
+ "optionalDependencies": {
749
+ "@img/sharp-libvips-linux-ppc64": "1.2.4"
750
+ }
751
+ },
752
+ "node_modules/@img/sharp-linux-riscv64": {
753
+ "version": "0.34.5",
754
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
755
+ "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
756
+ "cpu": [
757
+ "riscv64"
758
+ ],
759
+ "libc": [
760
+ "glibc"
761
+ ],
762
+ "license": "Apache-2.0",
763
+ "optional": true,
764
+ "os": [
765
+ "linux"
766
+ ],
767
+ "engines": {
768
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
769
+ },
770
+ "funding": {
771
+ "url": "https://opencollective.com/libvips"
772
+ },
773
+ "optionalDependencies": {
774
+ "@img/sharp-libvips-linux-riscv64": "1.2.4"
775
+ }
776
+ },
777
+ "node_modules/@img/sharp-linux-s390x": {
778
+ "version": "0.34.5",
779
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
780
+ "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
781
+ "cpu": [
782
+ "s390x"
783
+ ],
784
+ "libc": [
785
+ "glibc"
786
+ ],
787
+ "license": "Apache-2.0",
788
+ "optional": true,
789
+ "os": [
790
+ "linux"
791
+ ],
792
+ "engines": {
793
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
794
+ },
795
+ "funding": {
796
+ "url": "https://opencollective.com/libvips"
797
+ },
798
+ "optionalDependencies": {
799
+ "@img/sharp-libvips-linux-s390x": "1.2.4"
800
+ }
801
+ },
802
+ "node_modules/@img/sharp-linux-x64": {
803
+ "version": "0.34.5",
804
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
805
+ "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
806
+ "cpu": [
807
+ "x64"
808
+ ],
809
+ "libc": [
810
+ "glibc"
811
+ ],
812
+ "license": "Apache-2.0",
813
+ "optional": true,
814
+ "os": [
815
+ "linux"
816
+ ],
817
+ "engines": {
818
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
819
+ },
820
+ "funding": {
821
+ "url": "https://opencollective.com/libvips"
822
+ },
823
+ "optionalDependencies": {
824
+ "@img/sharp-libvips-linux-x64": "1.2.4"
825
+ }
826
+ },
827
+ "node_modules/@img/sharp-linuxmusl-arm64": {
828
+ "version": "0.34.5",
829
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
830
+ "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
831
+ "cpu": [
832
+ "arm64"
833
+ ],
834
+ "libc": [
835
+ "musl"
836
+ ],
837
+ "license": "Apache-2.0",
838
+ "optional": true,
839
+ "os": [
840
+ "linux"
841
+ ],
842
+ "engines": {
843
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
844
+ },
845
+ "funding": {
846
+ "url": "https://opencollective.com/libvips"
847
+ },
848
+ "optionalDependencies": {
849
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
850
+ }
851
+ },
852
+ "node_modules/@img/sharp-linuxmusl-x64": {
853
+ "version": "0.34.5",
854
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
855
+ "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
856
+ "cpu": [
857
+ "x64"
858
+ ],
859
+ "libc": [
860
+ "musl"
861
+ ],
862
+ "license": "Apache-2.0",
863
+ "optional": true,
864
+ "os": [
865
+ "linux"
866
+ ],
867
+ "engines": {
868
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
869
+ },
870
+ "funding": {
871
+ "url": "https://opencollective.com/libvips"
872
+ },
873
+ "optionalDependencies": {
874
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
875
+ }
876
+ },
877
+ "node_modules/@img/sharp-wasm32": {
878
+ "version": "0.34.5",
879
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
880
+ "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
881
+ "cpu": [
882
+ "wasm32"
883
+ ],
884
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
885
+ "optional": true,
886
+ "dependencies": {
887
+ "@emnapi/runtime": "^1.7.0"
888
+ },
889
+ "engines": {
890
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
891
+ },
892
+ "funding": {
893
+ "url": "https://opencollective.com/libvips"
894
+ }
895
+ },
896
+ "node_modules/@img/sharp-win32-arm64": {
897
+ "version": "0.34.5",
898
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
899
+ "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
900
+ "cpu": [
901
+ "arm64"
902
+ ],
903
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
904
+ "optional": true,
905
+ "os": [
906
+ "win32"
907
+ ],
908
+ "engines": {
909
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
910
+ },
911
+ "funding": {
912
+ "url": "https://opencollective.com/libvips"
913
+ }
914
+ },
915
+ "node_modules/@img/sharp-win32-ia32": {
916
+ "version": "0.34.5",
917
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
918
+ "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
919
+ "cpu": [
920
+ "ia32"
921
+ ],
922
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
923
+ "optional": true,
924
+ "os": [
925
+ "win32"
926
+ ],
927
+ "engines": {
928
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
929
+ },
930
+ "funding": {
931
+ "url": "https://opencollective.com/libvips"
932
+ }
933
+ },
934
+ "node_modules/@img/sharp-win32-x64": {
935
+ "version": "0.34.5",
936
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
937
+ "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
938
+ "cpu": [
939
+ "x64"
940
+ ],
941
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
942
+ "optional": true,
943
+ "os": [
944
+ "win32"
945
+ ],
946
+ "engines": {
947
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
948
+ },
949
+ "funding": {
950
+ "url": "https://opencollective.com/libvips"
951
+ }
952
+ },
953
+ "node_modules/@isaacs/fs-minipass": {
954
+ "version": "4.0.1",
955
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
956
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
957
+ "license": "ISC",
958
+ "dependencies": {
959
+ "minipass": "^7.0.4"
960
+ },
961
+ "engines": {
962
+ "node": ">=18.0.0"
963
+ }
964
+ },
965
+ "node_modules/@protobufjs/aspromise": {
966
+ "version": "1.1.2",
967
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
968
+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
969
+ "license": "BSD-3-Clause"
970
+ },
971
+ "node_modules/@protobufjs/base64": {
972
+ "version": "1.1.2",
973
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
974
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
975
+ "license": "BSD-3-Clause"
976
+ },
977
+ "node_modules/@protobufjs/codegen": {
978
+ "version": "2.0.5",
979
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz",
980
+ "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==",
981
+ "license": "BSD-3-Clause"
982
+ },
983
+ "node_modules/@protobufjs/eventemitter": {
984
+ "version": "1.1.1",
985
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz",
986
+ "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==",
987
+ "license": "BSD-3-Clause"
988
+ },
989
+ "node_modules/@protobufjs/fetch": {
990
+ "version": "1.1.1",
991
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz",
992
+ "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==",
993
+ "license": "BSD-3-Clause",
994
+ "dependencies": {
995
+ "@protobufjs/aspromise": "^1.1.1"
996
+ }
997
+ },
998
+ "node_modules/@protobufjs/float": {
999
+ "version": "1.0.2",
1000
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
1001
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
1002
+ "license": "BSD-3-Clause"
1003
+ },
1004
+ "node_modules/@protobufjs/path": {
1005
+ "version": "1.1.2",
1006
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
1007
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
1008
+ "license": "BSD-3-Clause"
1009
+ },
1010
+ "node_modules/@protobufjs/pool": {
1011
+ "version": "1.1.0",
1012
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
1013
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
1014
+ "license": "BSD-3-Clause"
1015
+ },
1016
+ "node_modules/@protobufjs/utf8": {
1017
+ "version": "1.1.1",
1018
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz",
1019
+ "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==",
1020
+ "license": "BSD-3-Clause"
1021
+ },
1022
+ "node_modules/@rollup/rollup-android-arm-eabi": {
1023
+ "version": "4.62.2",
1024
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz",
1025
+ "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==",
1026
+ "cpu": [
1027
+ "arm"
1028
+ ],
1029
+ "dev": true,
1030
+ "license": "MIT",
1031
+ "optional": true,
1032
+ "os": [
1033
+ "android"
1034
+ ]
1035
+ },
1036
+ "node_modules/@rollup/rollup-android-arm64": {
1037
+ "version": "4.62.2",
1038
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz",
1039
+ "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==",
1040
+ "cpu": [
1041
+ "arm64"
1042
+ ],
1043
+ "dev": true,
1044
+ "license": "MIT",
1045
+ "optional": true,
1046
+ "os": [
1047
+ "android"
1048
+ ]
1049
+ },
1050
+ "node_modules/@rollup/rollup-darwin-arm64": {
1051
+ "version": "4.62.2",
1052
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz",
1053
+ "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==",
1054
+ "cpu": [
1055
+ "arm64"
1056
+ ],
1057
+ "dev": true,
1058
+ "license": "MIT",
1059
+ "optional": true,
1060
+ "os": [
1061
+ "darwin"
1062
+ ]
1063
+ },
1064
+ "node_modules/@rollup/rollup-darwin-x64": {
1065
+ "version": "4.62.2",
1066
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz",
1067
+ "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==",
1068
+ "cpu": [
1069
+ "x64"
1070
+ ],
1071
+ "dev": true,
1072
+ "license": "MIT",
1073
+ "optional": true,
1074
+ "os": [
1075
+ "darwin"
1076
+ ]
1077
+ },
1078
+ "node_modules/@rollup/rollup-freebsd-arm64": {
1079
+ "version": "4.62.2",
1080
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz",
1081
+ "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==",
1082
+ "cpu": [
1083
+ "arm64"
1084
+ ],
1085
+ "dev": true,
1086
+ "license": "MIT",
1087
+ "optional": true,
1088
+ "os": [
1089
+ "freebsd"
1090
+ ]
1091
+ },
1092
+ "node_modules/@rollup/rollup-freebsd-x64": {
1093
+ "version": "4.62.2",
1094
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz",
1095
+ "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==",
1096
+ "cpu": [
1097
+ "x64"
1098
+ ],
1099
+ "dev": true,
1100
+ "license": "MIT",
1101
+ "optional": true,
1102
+ "os": [
1103
+ "freebsd"
1104
+ ]
1105
+ },
1106
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
1107
+ "version": "4.62.2",
1108
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz",
1109
+ "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==",
1110
+ "cpu": [
1111
+ "arm"
1112
+ ],
1113
+ "dev": true,
1114
+ "libc": [
1115
+ "glibc"
1116
+ ],
1117
+ "license": "MIT",
1118
+ "optional": true,
1119
+ "os": [
1120
+ "linux"
1121
+ ]
1122
+ },
1123
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
1124
+ "version": "4.62.2",
1125
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz",
1126
+ "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==",
1127
+ "cpu": [
1128
+ "arm"
1129
+ ],
1130
+ "dev": true,
1131
+ "libc": [
1132
+ "musl"
1133
+ ],
1134
+ "license": "MIT",
1135
+ "optional": true,
1136
+ "os": [
1137
+ "linux"
1138
+ ]
1139
+ },
1140
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
1141
+ "version": "4.62.2",
1142
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz",
1143
+ "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==",
1144
+ "cpu": [
1145
+ "arm64"
1146
+ ],
1147
+ "dev": true,
1148
+ "libc": [
1149
+ "glibc"
1150
+ ],
1151
+ "license": "MIT",
1152
+ "optional": true,
1153
+ "os": [
1154
+ "linux"
1155
+ ]
1156
+ },
1157
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
1158
+ "version": "4.62.2",
1159
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz",
1160
+ "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==",
1161
+ "cpu": [
1162
+ "arm64"
1163
+ ],
1164
+ "dev": true,
1165
+ "libc": [
1166
+ "musl"
1167
+ ],
1168
+ "license": "MIT",
1169
+ "optional": true,
1170
+ "os": [
1171
+ "linux"
1172
+ ]
1173
+ },
1174
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
1175
+ "version": "4.62.2",
1176
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz",
1177
+ "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==",
1178
+ "cpu": [
1179
+ "loong64"
1180
+ ],
1181
+ "dev": true,
1182
+ "libc": [
1183
+ "glibc"
1184
+ ],
1185
+ "license": "MIT",
1186
+ "optional": true,
1187
+ "os": [
1188
+ "linux"
1189
+ ]
1190
+ },
1191
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
1192
+ "version": "4.62.2",
1193
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz",
1194
+ "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==",
1195
+ "cpu": [
1196
+ "loong64"
1197
+ ],
1198
+ "dev": true,
1199
+ "libc": [
1200
+ "musl"
1201
+ ],
1202
+ "license": "MIT",
1203
+ "optional": true,
1204
+ "os": [
1205
+ "linux"
1206
+ ]
1207
+ },
1208
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
1209
+ "version": "4.62.2",
1210
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz",
1211
+ "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==",
1212
+ "cpu": [
1213
+ "ppc64"
1214
+ ],
1215
+ "dev": true,
1216
+ "libc": [
1217
+ "glibc"
1218
+ ],
1219
+ "license": "MIT",
1220
+ "optional": true,
1221
+ "os": [
1222
+ "linux"
1223
+ ]
1224
+ },
1225
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
1226
+ "version": "4.62.2",
1227
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz",
1228
+ "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==",
1229
+ "cpu": [
1230
+ "ppc64"
1231
+ ],
1232
+ "dev": true,
1233
+ "libc": [
1234
+ "musl"
1235
+ ],
1236
+ "license": "MIT",
1237
+ "optional": true,
1238
+ "os": [
1239
+ "linux"
1240
+ ]
1241
+ },
1242
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
1243
+ "version": "4.62.2",
1244
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz",
1245
+ "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==",
1246
+ "cpu": [
1247
+ "riscv64"
1248
+ ],
1249
+ "dev": true,
1250
+ "libc": [
1251
+ "glibc"
1252
+ ],
1253
+ "license": "MIT",
1254
+ "optional": true,
1255
+ "os": [
1256
+ "linux"
1257
+ ]
1258
+ },
1259
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
1260
+ "version": "4.62.2",
1261
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz",
1262
+ "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==",
1263
+ "cpu": [
1264
+ "riscv64"
1265
+ ],
1266
+ "dev": true,
1267
+ "libc": [
1268
+ "musl"
1269
+ ],
1270
+ "license": "MIT",
1271
+ "optional": true,
1272
+ "os": [
1273
+ "linux"
1274
+ ]
1275
+ },
1276
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
1277
+ "version": "4.62.2",
1278
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz",
1279
+ "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==",
1280
+ "cpu": [
1281
+ "s390x"
1282
+ ],
1283
+ "dev": true,
1284
+ "libc": [
1285
+ "glibc"
1286
+ ],
1287
+ "license": "MIT",
1288
+ "optional": true,
1289
+ "os": [
1290
+ "linux"
1291
+ ]
1292
+ },
1293
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
1294
+ "version": "4.62.2",
1295
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz",
1296
+ "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==",
1297
+ "cpu": [
1298
+ "x64"
1299
+ ],
1300
+ "dev": true,
1301
+ "libc": [
1302
+ "glibc"
1303
+ ],
1304
+ "license": "MIT",
1305
+ "optional": true,
1306
+ "os": [
1307
+ "linux"
1308
+ ]
1309
+ },
1310
+ "node_modules/@rollup/rollup-linux-x64-musl": {
1311
+ "version": "4.62.2",
1312
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz",
1313
+ "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==",
1314
+ "cpu": [
1315
+ "x64"
1316
+ ],
1317
+ "dev": true,
1318
+ "libc": [
1319
+ "musl"
1320
+ ],
1321
+ "license": "MIT",
1322
+ "optional": true,
1323
+ "os": [
1324
+ "linux"
1325
+ ]
1326
+ },
1327
+ "node_modules/@rollup/rollup-openbsd-x64": {
1328
+ "version": "4.62.2",
1329
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz",
1330
+ "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==",
1331
+ "cpu": [
1332
+ "x64"
1333
+ ],
1334
+ "dev": true,
1335
+ "license": "MIT",
1336
+ "optional": true,
1337
+ "os": [
1338
+ "openbsd"
1339
+ ]
1340
+ },
1341
+ "node_modules/@rollup/rollup-openharmony-arm64": {
1342
+ "version": "4.62.2",
1343
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz",
1344
+ "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==",
1345
+ "cpu": [
1346
+ "arm64"
1347
+ ],
1348
+ "dev": true,
1349
+ "license": "MIT",
1350
+ "optional": true,
1351
+ "os": [
1352
+ "openharmony"
1353
+ ]
1354
+ },
1355
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
1356
+ "version": "4.62.2",
1357
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz",
1358
+ "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==",
1359
+ "cpu": [
1360
+ "arm64"
1361
+ ],
1362
+ "dev": true,
1363
+ "license": "MIT",
1364
+ "optional": true,
1365
+ "os": [
1366
+ "win32"
1367
+ ]
1368
+ },
1369
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
1370
+ "version": "4.62.2",
1371
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz",
1372
+ "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==",
1373
+ "cpu": [
1374
+ "ia32"
1375
+ ],
1376
+ "dev": true,
1377
+ "license": "MIT",
1378
+ "optional": true,
1379
+ "os": [
1380
+ "win32"
1381
+ ]
1382
+ },
1383
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
1384
+ "version": "4.62.2",
1385
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz",
1386
+ "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==",
1387
+ "cpu": [
1388
+ "x64"
1389
+ ],
1390
+ "dev": true,
1391
+ "license": "MIT",
1392
+ "optional": true,
1393
+ "os": [
1394
+ "win32"
1395
+ ]
1396
+ },
1397
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
1398
+ "version": "4.62.2",
1399
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz",
1400
+ "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==",
1401
+ "cpu": [
1402
+ "x64"
1403
+ ],
1404
+ "dev": true,
1405
+ "license": "MIT",
1406
+ "optional": true,
1407
+ "os": [
1408
+ "win32"
1409
+ ]
1410
+ },
1411
+ "node_modules/@types/estree": {
1412
+ "version": "1.0.9",
1413
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
1414
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
1415
+ "dev": true,
1416
+ "license": "MIT"
1417
+ },
1418
+ "node_modules/@types/node": {
1419
+ "version": "26.0.1",
1420
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-26.0.1.tgz",
1421
+ "integrity": "sha512-fc3KiUoBt6kie0N9bIW3E47vZsuaMf0PM2AaUpLCLT0s/LvX1nxAim6Fc049cNxODPpGm6qRAuUOB86SkRuPQw==",
1422
+ "license": "MIT",
1423
+ "dependencies": {
1424
+ "undici-types": "~8.3.0"
1425
+ }
1426
+ },
1427
+ "node_modules/boolean": {
1428
+ "version": "3.2.0",
1429
+ "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
1430
+ "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==",
1431
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
1432
+ "license": "MIT"
1433
+ },
1434
+ "node_modules/chownr": {
1435
+ "version": "3.0.0",
1436
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
1437
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
1438
+ "license": "BlueOak-1.0.0",
1439
+ "engines": {
1440
+ "node": ">=18"
1441
+ }
1442
+ },
1443
+ "node_modules/define-data-property": {
1444
+ "version": "1.1.4",
1445
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
1446
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
1447
+ "license": "MIT",
1448
+ "dependencies": {
1449
+ "es-define-property": "^1.0.0",
1450
+ "es-errors": "^1.3.0",
1451
+ "gopd": "^1.0.1"
1452
+ },
1453
+ "engines": {
1454
+ "node": ">= 0.4"
1455
+ },
1456
+ "funding": {
1457
+ "url": "https://github.com/sponsors/ljharb"
1458
+ }
1459
+ },
1460
+ "node_modules/define-properties": {
1461
+ "version": "1.2.1",
1462
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
1463
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
1464
+ "license": "MIT",
1465
+ "dependencies": {
1466
+ "define-data-property": "^1.0.1",
1467
+ "has-property-descriptors": "^1.0.0",
1468
+ "object-keys": "^1.1.1"
1469
+ },
1470
+ "engines": {
1471
+ "node": ">= 0.4"
1472
+ },
1473
+ "funding": {
1474
+ "url": "https://github.com/sponsors/ljharb"
1475
+ }
1476
+ },
1477
+ "node_modules/detect-libc": {
1478
+ "version": "2.1.2",
1479
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
1480
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
1481
+ "license": "Apache-2.0",
1482
+ "engines": {
1483
+ "node": ">=8"
1484
+ }
1485
+ },
1486
+ "node_modules/detect-node": {
1487
+ "version": "2.1.0",
1488
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
1489
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
1490
+ "license": "MIT"
1491
+ },
1492
+ "node_modules/es-define-property": {
1493
+ "version": "1.0.1",
1494
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
1495
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
1496
+ "license": "MIT",
1497
+ "engines": {
1498
+ "node": ">= 0.4"
1499
+ }
1500
+ },
1501
+ "node_modules/es-errors": {
1502
+ "version": "1.3.0",
1503
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
1504
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
1505
+ "license": "MIT",
1506
+ "engines": {
1507
+ "node": ">= 0.4"
1508
+ }
1509
+ },
1510
+ "node_modules/es6-error": {
1511
+ "version": "4.1.1",
1512
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
1513
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
1514
+ "license": "MIT"
1515
+ },
1516
+ "node_modules/esbuild": {
1517
+ "version": "0.21.5",
1518
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
1519
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
1520
+ "dev": true,
1521
+ "hasInstallScript": true,
1522
+ "license": "MIT",
1523
+ "bin": {
1524
+ "esbuild": "bin/esbuild"
1525
+ },
1526
+ "engines": {
1527
+ "node": ">=12"
1528
+ },
1529
+ "optionalDependencies": {
1530
+ "@esbuild/aix-ppc64": "0.21.5",
1531
+ "@esbuild/android-arm": "0.21.5",
1532
+ "@esbuild/android-arm64": "0.21.5",
1533
+ "@esbuild/android-x64": "0.21.5",
1534
+ "@esbuild/darwin-arm64": "0.21.5",
1535
+ "@esbuild/darwin-x64": "0.21.5",
1536
+ "@esbuild/freebsd-arm64": "0.21.5",
1537
+ "@esbuild/freebsd-x64": "0.21.5",
1538
+ "@esbuild/linux-arm": "0.21.5",
1539
+ "@esbuild/linux-arm64": "0.21.5",
1540
+ "@esbuild/linux-ia32": "0.21.5",
1541
+ "@esbuild/linux-loong64": "0.21.5",
1542
+ "@esbuild/linux-mips64el": "0.21.5",
1543
+ "@esbuild/linux-ppc64": "0.21.5",
1544
+ "@esbuild/linux-riscv64": "0.21.5",
1545
+ "@esbuild/linux-s390x": "0.21.5",
1546
+ "@esbuild/linux-x64": "0.21.5",
1547
+ "@esbuild/netbsd-x64": "0.21.5",
1548
+ "@esbuild/openbsd-x64": "0.21.5",
1549
+ "@esbuild/sunos-x64": "0.21.5",
1550
+ "@esbuild/win32-arm64": "0.21.5",
1551
+ "@esbuild/win32-ia32": "0.21.5",
1552
+ "@esbuild/win32-x64": "0.21.5"
1553
+ }
1554
+ },
1555
+ "node_modules/escape-string-regexp": {
1556
+ "version": "4.0.0",
1557
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
1558
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
1559
+ "license": "MIT",
1560
+ "engines": {
1561
+ "node": ">=10"
1562
+ },
1563
+ "funding": {
1564
+ "url": "https://github.com/sponsors/sindresorhus"
1565
+ }
1566
+ },
1567
+ "node_modules/flatbuffers": {
1568
+ "version": "25.9.23",
1569
+ "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz",
1570
+ "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==",
1571
+ "license": "Apache-2.0"
1572
+ },
1573
+ "node_modules/fsevents": {
1574
+ "version": "2.3.3",
1575
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1576
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1577
+ "dev": true,
1578
+ "hasInstallScript": true,
1579
+ "license": "MIT",
1580
+ "optional": true,
1581
+ "os": [
1582
+ "darwin"
1583
+ ],
1584
+ "engines": {
1585
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1586
+ }
1587
+ },
1588
+ "node_modules/global-agent": {
1589
+ "version": "3.0.0",
1590
+ "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
1591
+ "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
1592
+ "license": "BSD-3-Clause",
1593
+ "dependencies": {
1594
+ "boolean": "^3.0.1",
1595
+ "es6-error": "^4.1.1",
1596
+ "matcher": "^3.0.0",
1597
+ "roarr": "^2.15.3",
1598
+ "semver": "^7.3.2",
1599
+ "serialize-error": "^7.0.1"
1600
+ },
1601
+ "engines": {
1602
+ "node": ">=10.0"
1603
+ }
1604
+ },
1605
+ "node_modules/globalthis": {
1606
+ "version": "1.0.4",
1607
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
1608
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
1609
+ "license": "MIT",
1610
+ "dependencies": {
1611
+ "define-properties": "^1.2.1",
1612
+ "gopd": "^1.0.1"
1613
+ },
1614
+ "engines": {
1615
+ "node": ">= 0.4"
1616
+ },
1617
+ "funding": {
1618
+ "url": "https://github.com/sponsors/ljharb"
1619
+ }
1620
+ },
1621
+ "node_modules/gopd": {
1622
+ "version": "1.2.0",
1623
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
1624
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
1625
+ "license": "MIT",
1626
+ "engines": {
1627
+ "node": ">= 0.4"
1628
+ },
1629
+ "funding": {
1630
+ "url": "https://github.com/sponsors/ljharb"
1631
+ }
1632
+ },
1633
+ "node_modules/guid-typescript": {
1634
+ "version": "1.0.9",
1635
+ "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz",
1636
+ "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==",
1637
+ "license": "ISC"
1638
+ },
1639
+ "node_modules/has-property-descriptors": {
1640
+ "version": "1.0.2",
1641
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
1642
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
1643
+ "license": "MIT",
1644
+ "dependencies": {
1645
+ "es-define-property": "^1.0.0"
1646
+ },
1647
+ "funding": {
1648
+ "url": "https://github.com/sponsors/ljharb"
1649
+ }
1650
+ },
1651
+ "node_modules/json-stringify-safe": {
1652
+ "version": "5.0.1",
1653
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
1654
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
1655
+ "license": "ISC"
1656
+ },
1657
+ "node_modules/long": {
1658
+ "version": "5.3.2",
1659
+ "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
1660
+ "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
1661
+ "license": "Apache-2.0"
1662
+ },
1663
+ "node_modules/matcher": {
1664
+ "version": "3.0.0",
1665
+ "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
1666
+ "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
1667
+ "license": "MIT",
1668
+ "dependencies": {
1669
+ "escape-string-regexp": "^4.0.0"
1670
+ },
1671
+ "engines": {
1672
+ "node": ">=10"
1673
+ }
1674
+ },
1675
+ "node_modules/minipass": {
1676
+ "version": "7.1.3",
1677
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
1678
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
1679
+ "license": "BlueOak-1.0.0",
1680
+ "engines": {
1681
+ "node": ">=16 || 14 >=14.17"
1682
+ }
1683
+ },
1684
+ "node_modules/minizlib": {
1685
+ "version": "3.1.0",
1686
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
1687
+ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
1688
+ "license": "MIT",
1689
+ "dependencies": {
1690
+ "minipass": "^7.1.2"
1691
+ },
1692
+ "engines": {
1693
+ "node": ">= 18"
1694
+ }
1695
+ },
1696
+ "node_modules/nanoid": {
1697
+ "version": "3.3.15",
1698
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz",
1699
+ "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==",
1700
+ "dev": true,
1701
+ "funding": [
1702
+ {
1703
+ "type": "github",
1704
+ "url": "https://github.com/sponsors/ai"
1705
+ }
1706
+ ],
1707
+ "license": "MIT",
1708
+ "bin": {
1709
+ "nanoid": "bin/nanoid.cjs"
1710
+ },
1711
+ "engines": {
1712
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1713
+ }
1714
+ },
1715
+ "node_modules/object-keys": {
1716
+ "version": "1.1.1",
1717
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1718
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
1719
+ "license": "MIT",
1720
+ "engines": {
1721
+ "node": ">= 0.4"
1722
+ }
1723
+ },
1724
+ "node_modules/onnxruntime-common": {
1725
+ "version": "1.21.0",
1726
+ "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0.tgz",
1727
+ "integrity": "sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ==",
1728
+ "license": "MIT"
1729
+ },
1730
+ "node_modules/onnxruntime-node": {
1731
+ "version": "1.21.0",
1732
+ "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.21.0.tgz",
1733
+ "integrity": "sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw==",
1734
+ "hasInstallScript": true,
1735
+ "license": "MIT",
1736
+ "os": [
1737
+ "win32",
1738
+ "darwin",
1739
+ "linux"
1740
+ ],
1741
+ "dependencies": {
1742
+ "global-agent": "^3.0.0",
1743
+ "onnxruntime-common": "1.21.0",
1744
+ "tar": "^7.0.1"
1745
+ }
1746
+ },
1747
+ "node_modules/onnxruntime-web": {
1748
+ "version": "1.22.0-dev.20250409-89f8206ba4",
1749
+ "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.22.0-dev.20250409-89f8206ba4.tgz",
1750
+ "integrity": "sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC4PkrR8mBX8LtNUFZO25IQBqV2Hx2ho3FlbQ==",
1751
+ "license": "MIT",
1752
+ "dependencies": {
1753
+ "flatbuffers": "^25.1.24",
1754
+ "guid-typescript": "^1.0.9",
1755
+ "long": "^5.2.3",
1756
+ "onnxruntime-common": "1.22.0-dev.20250409-89f8206ba4",
1757
+ "platform": "^1.3.6",
1758
+ "protobufjs": "^7.2.4"
1759
+ }
1760
+ },
1761
+ "node_modules/onnxruntime-web/node_modules/onnxruntime-common": {
1762
+ "version": "1.22.0-dev.20250409-89f8206ba4",
1763
+ "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.22.0-dev.20250409-89f8206ba4.tgz",
1764
+ "integrity": "sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLueuFc5DuYwjIZUBrSvx/fO5IrLjLz+oTrB3pcGlhovQ==",
1765
+ "license": "MIT"
1766
+ },
1767
+ "node_modules/picocolors": {
1768
+ "version": "1.1.1",
1769
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1770
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1771
+ "dev": true,
1772
+ "license": "ISC"
1773
+ },
1774
+ "node_modules/platform": {
1775
+ "version": "1.3.6",
1776
+ "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
1777
+ "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==",
1778
+ "license": "MIT"
1779
+ },
1780
+ "node_modules/postcss": {
1781
+ "version": "8.5.15",
1782
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
1783
+ "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
1784
+ "dev": true,
1785
+ "funding": [
1786
+ {
1787
+ "type": "opencollective",
1788
+ "url": "https://opencollective.com/postcss/"
1789
+ },
1790
+ {
1791
+ "type": "tidelift",
1792
+ "url": "https://tidelift.com/funding/github/npm/postcss"
1793
+ },
1794
+ {
1795
+ "type": "github",
1796
+ "url": "https://github.com/sponsors/ai"
1797
+ }
1798
+ ],
1799
+ "license": "MIT",
1800
+ "dependencies": {
1801
+ "nanoid": "^3.3.12",
1802
+ "picocolors": "^1.1.1",
1803
+ "source-map-js": "^1.2.1"
1804
+ },
1805
+ "engines": {
1806
+ "node": "^10 || ^12 || >=14"
1807
+ }
1808
+ },
1809
+ "node_modules/protobufjs": {
1810
+ "version": "7.6.4",
1811
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.4.tgz",
1812
+ "integrity": "sha512-RJJPTTpvFfHcWLkIa2JFWK4XvtSzS0yEWDmunqHXli1h3JlkbcQZXDZdcWxv+JK3Xsl5/UFDPZ0iGm7DAengYw==",
1813
+ "hasInstallScript": true,
1814
+ "license": "BSD-3-Clause",
1815
+ "dependencies": {
1816
+ "@protobufjs/aspromise": "^1.1.2",
1817
+ "@protobufjs/base64": "^1.1.2",
1818
+ "@protobufjs/codegen": "^2.0.5",
1819
+ "@protobufjs/eventemitter": "^1.1.1",
1820
+ "@protobufjs/fetch": "^1.1.1",
1821
+ "@protobufjs/float": "^1.0.2",
1822
+ "@protobufjs/path": "^1.1.2",
1823
+ "@protobufjs/pool": "^1.1.0",
1824
+ "@protobufjs/utf8": "^1.1.1",
1825
+ "@types/node": ">=13.7.0",
1826
+ "long": "^5.3.2"
1827
+ },
1828
+ "engines": {
1829
+ "node": ">=12.0.0"
1830
+ }
1831
+ },
1832
+ "node_modules/roarr": {
1833
+ "version": "2.15.4",
1834
+ "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
1835
+ "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
1836
+ "license": "BSD-3-Clause",
1837
+ "dependencies": {
1838
+ "boolean": "^3.0.1",
1839
+ "detect-node": "^2.0.4",
1840
+ "globalthis": "^1.0.1",
1841
+ "json-stringify-safe": "^5.0.1",
1842
+ "semver-compare": "^1.0.0",
1843
+ "sprintf-js": "^1.1.2"
1844
+ },
1845
+ "engines": {
1846
+ "node": ">=8.0"
1847
+ }
1848
+ },
1849
+ "node_modules/rollup": {
1850
+ "version": "4.62.2",
1851
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz",
1852
+ "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==",
1853
+ "dev": true,
1854
+ "license": "MIT",
1855
+ "dependencies": {
1856
+ "@types/estree": "1.0.9"
1857
+ },
1858
+ "bin": {
1859
+ "rollup": "dist/bin/rollup"
1860
+ },
1861
+ "engines": {
1862
+ "node": ">=18.0.0",
1863
+ "npm": ">=8.0.0"
1864
+ },
1865
+ "optionalDependencies": {
1866
+ "@rollup/rollup-android-arm-eabi": "4.62.2",
1867
+ "@rollup/rollup-android-arm64": "4.62.2",
1868
+ "@rollup/rollup-darwin-arm64": "4.62.2",
1869
+ "@rollup/rollup-darwin-x64": "4.62.2",
1870
+ "@rollup/rollup-freebsd-arm64": "4.62.2",
1871
+ "@rollup/rollup-freebsd-x64": "4.62.2",
1872
+ "@rollup/rollup-linux-arm-gnueabihf": "4.62.2",
1873
+ "@rollup/rollup-linux-arm-musleabihf": "4.62.2",
1874
+ "@rollup/rollup-linux-arm64-gnu": "4.62.2",
1875
+ "@rollup/rollup-linux-arm64-musl": "4.62.2",
1876
+ "@rollup/rollup-linux-loong64-gnu": "4.62.2",
1877
+ "@rollup/rollup-linux-loong64-musl": "4.62.2",
1878
+ "@rollup/rollup-linux-ppc64-gnu": "4.62.2",
1879
+ "@rollup/rollup-linux-ppc64-musl": "4.62.2",
1880
+ "@rollup/rollup-linux-riscv64-gnu": "4.62.2",
1881
+ "@rollup/rollup-linux-riscv64-musl": "4.62.2",
1882
+ "@rollup/rollup-linux-s390x-gnu": "4.62.2",
1883
+ "@rollup/rollup-linux-x64-gnu": "4.62.2",
1884
+ "@rollup/rollup-linux-x64-musl": "4.62.2",
1885
+ "@rollup/rollup-openbsd-x64": "4.62.2",
1886
+ "@rollup/rollup-openharmony-arm64": "4.62.2",
1887
+ "@rollup/rollup-win32-arm64-msvc": "4.62.2",
1888
+ "@rollup/rollup-win32-ia32-msvc": "4.62.2",
1889
+ "@rollup/rollup-win32-x64-gnu": "4.62.2",
1890
+ "@rollup/rollup-win32-x64-msvc": "4.62.2",
1891
+ "fsevents": "~2.3.2"
1892
+ }
1893
+ },
1894
+ "node_modules/semver": {
1895
+ "version": "7.8.5",
1896
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
1897
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
1898
+ "license": "ISC",
1899
+ "bin": {
1900
+ "semver": "bin/semver.js"
1901
+ },
1902
+ "engines": {
1903
+ "node": ">=10"
1904
+ }
1905
+ },
1906
+ "node_modules/semver-compare": {
1907
+ "version": "1.0.0",
1908
+ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
1909
+ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
1910
+ "license": "MIT"
1911
+ },
1912
+ "node_modules/serialize-error": {
1913
+ "version": "7.0.1",
1914
+ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
1915
+ "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
1916
+ "license": "MIT",
1917
+ "dependencies": {
1918
+ "type-fest": "^0.13.1"
1919
+ },
1920
+ "engines": {
1921
+ "node": ">=10"
1922
+ },
1923
+ "funding": {
1924
+ "url": "https://github.com/sponsors/sindresorhus"
1925
+ }
1926
+ },
1927
+ "node_modules/sharp": {
1928
+ "version": "0.34.5",
1929
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
1930
+ "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
1931
+ "hasInstallScript": true,
1932
+ "license": "Apache-2.0",
1933
+ "dependencies": {
1934
+ "@img/colour": "^1.0.0",
1935
+ "detect-libc": "^2.1.2",
1936
+ "semver": "^7.7.3"
1937
+ },
1938
+ "engines": {
1939
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
1940
+ },
1941
+ "funding": {
1942
+ "url": "https://opencollective.com/libvips"
1943
+ },
1944
+ "optionalDependencies": {
1945
+ "@img/sharp-darwin-arm64": "0.34.5",
1946
+ "@img/sharp-darwin-x64": "0.34.5",
1947
+ "@img/sharp-libvips-darwin-arm64": "1.2.4",
1948
+ "@img/sharp-libvips-darwin-x64": "1.2.4",
1949
+ "@img/sharp-libvips-linux-arm": "1.2.4",
1950
+ "@img/sharp-libvips-linux-arm64": "1.2.4",
1951
+ "@img/sharp-libvips-linux-ppc64": "1.2.4",
1952
+ "@img/sharp-libvips-linux-riscv64": "1.2.4",
1953
+ "@img/sharp-libvips-linux-s390x": "1.2.4",
1954
+ "@img/sharp-libvips-linux-x64": "1.2.4",
1955
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
1956
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
1957
+ "@img/sharp-linux-arm": "0.34.5",
1958
+ "@img/sharp-linux-arm64": "0.34.5",
1959
+ "@img/sharp-linux-ppc64": "0.34.5",
1960
+ "@img/sharp-linux-riscv64": "0.34.5",
1961
+ "@img/sharp-linux-s390x": "0.34.5",
1962
+ "@img/sharp-linux-x64": "0.34.5",
1963
+ "@img/sharp-linuxmusl-arm64": "0.34.5",
1964
+ "@img/sharp-linuxmusl-x64": "0.34.5",
1965
+ "@img/sharp-wasm32": "0.34.5",
1966
+ "@img/sharp-win32-arm64": "0.34.5",
1967
+ "@img/sharp-win32-ia32": "0.34.5",
1968
+ "@img/sharp-win32-x64": "0.34.5"
1969
+ }
1970
+ },
1971
+ "node_modules/source-map-js": {
1972
+ "version": "1.2.1",
1973
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
1974
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
1975
+ "dev": true,
1976
+ "license": "BSD-3-Clause",
1977
+ "engines": {
1978
+ "node": ">=0.10.0"
1979
+ }
1980
+ },
1981
+ "node_modules/sprintf-js": {
1982
+ "version": "1.1.3",
1983
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
1984
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
1985
+ "license": "BSD-3-Clause"
1986
+ },
1987
+ "node_modules/tar": {
1988
+ "version": "7.5.17",
1989
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.17.tgz",
1990
+ "integrity": "sha512-wPEBwzapC+2PaTYPH6e2L+cNOEE227S47wUYFqlegcs8zlLLmeb9Fcff1HVZY4Fwku/1Eyv38n7GYwB2aaS71g==",
1991
+ "license": "BlueOak-1.0.0",
1992
+ "dependencies": {
1993
+ "@isaacs/fs-minipass": "^4.0.0",
1994
+ "chownr": "^3.0.0",
1995
+ "minipass": "^7.1.2",
1996
+ "minizlib": "^3.1.0",
1997
+ "yallist": "^5.0.0"
1998
+ },
1999
+ "engines": {
2000
+ "node": ">=18"
2001
+ }
2002
+ },
2003
+ "node_modules/tslib": {
2004
+ "version": "2.8.1",
2005
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
2006
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
2007
+ "license": "0BSD",
2008
+ "optional": true
2009
+ },
2010
+ "node_modules/type-fest": {
2011
+ "version": "0.13.1",
2012
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
2013
+ "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
2014
+ "license": "(MIT OR CC0-1.0)",
2015
+ "engines": {
2016
+ "node": ">=10"
2017
+ },
2018
+ "funding": {
2019
+ "url": "https://github.com/sponsors/sindresorhus"
2020
+ }
2021
+ },
2022
+ "node_modules/typescript": {
2023
+ "version": "5.9.3",
2024
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
2025
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
2026
+ "dev": true,
2027
+ "license": "Apache-2.0",
2028
+ "bin": {
2029
+ "tsc": "bin/tsc",
2030
+ "tsserver": "bin/tsserver"
2031
+ },
2032
+ "engines": {
2033
+ "node": ">=14.17"
2034
+ }
2035
+ },
2036
+ "node_modules/undici-types": {
2037
+ "version": "8.3.0",
2038
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz",
2039
+ "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==",
2040
+ "license": "MIT"
2041
+ },
2042
+ "node_modules/vite": {
2043
+ "version": "5.4.21",
2044
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
2045
+ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
2046
+ "dev": true,
2047
+ "license": "MIT",
2048
+ "dependencies": {
2049
+ "esbuild": "^0.21.3",
2050
+ "postcss": "^8.4.43",
2051
+ "rollup": "^4.20.0"
2052
+ },
2053
+ "bin": {
2054
+ "vite": "bin/vite.js"
2055
+ },
2056
+ "engines": {
2057
+ "node": "^18.0.0 || >=20.0.0"
2058
+ },
2059
+ "funding": {
2060
+ "url": "https://github.com/vitejs/vite?sponsor=1"
2061
+ },
2062
+ "optionalDependencies": {
2063
+ "fsevents": "~2.3.3"
2064
+ },
2065
+ "peerDependencies": {
2066
+ "@types/node": "^18.0.0 || >=20.0.0",
2067
+ "less": "*",
2068
+ "lightningcss": "^1.21.0",
2069
+ "sass": "*",
2070
+ "sass-embedded": "*",
2071
+ "stylus": "*",
2072
+ "sugarss": "*",
2073
+ "terser": "^5.4.0"
2074
+ },
2075
+ "peerDependenciesMeta": {
2076
+ "@types/node": {
2077
+ "optional": true
2078
+ },
2079
+ "less": {
2080
+ "optional": true
2081
+ },
2082
+ "lightningcss": {
2083
+ "optional": true
2084
+ },
2085
+ "sass": {
2086
+ "optional": true
2087
+ },
2088
+ "sass-embedded": {
2089
+ "optional": true
2090
+ },
2091
+ "stylus": {
2092
+ "optional": true
2093
+ },
2094
+ "sugarss": {
2095
+ "optional": true
2096
+ },
2097
+ "terser": {
2098
+ "optional": true
2099
+ }
2100
+ }
2101
+ },
2102
+ "node_modules/yallist": {
2103
+ "version": "5.0.0",
2104
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
2105
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
2106
+ "license": "BlueOak-1.0.0",
2107
+ "engines": {
2108
+ "node": ">=18"
2109
+ }
2110
+ }
2111
+ }
2112
+ }
package.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "lfm25-230m-webgpu-space",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite --host 0.0.0.0",
8
+ "build": "tsc --noEmit && vite build",
9
+ "preview": "vite preview --host 0.0.0.0"
10
+ },
11
+ "dependencies": {
12
+ "@huggingface/transformers": "^3.8.1"
13
+ },
14
+ "devDependencies": {
15
+ "typescript": "^5.5.4",
16
+ "vite": "^5.4.11"
17
+ }
18
+ }
src/main.ts ADDED
@@ -0,0 +1,272 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import "./styles.css";
2
+ import {
3
+ DEFAULT_PROMPT,
4
+ DEFAULT_SETTINGS,
5
+ DEFAULT_SYSTEM_PROMPT,
6
+ MODEL_ID,
7
+ PRESETS,
8
+ type GenerationSettings,
9
+ type Precision,
10
+ } from "./model";
11
+ import type { WorkerRequest, WorkerResponse } from "./messages";
12
+
13
+ const app = document.querySelector<HTMLDivElement>("#app");
14
+
15
+ if (!app) {
16
+ throw new Error("Missing #app root");
17
+ }
18
+
19
+ let jobId = 0;
20
+ let isGenerating = false;
21
+ let generatedText = "";
22
+ const worker = new Worker(new URL("./worker.ts", import.meta.url), { type: "module" });
23
+
24
+ app.innerHTML = `
25
+ <main class="shell">
26
+ <section class="console" aria-labelledby="app-title">
27
+ <header class="topbar">
28
+ <div>
29
+ <p class="eyebrow">Transformers.js / WebGPU</p>
30
+ <h1 id="app-title">LFM2.5 230M</h1>
31
+ </div>
32
+ <div class="runtime" id="runtime-status">
33
+ <span class="runtime-dot" aria-hidden="true"></span>
34
+ <span id="runtime-label">Checking WebGPU</span>
35
+ </div>
36
+ </header>
37
+
38
+ <div class="workbench">
39
+ <form class="controls" id="generation-form">
40
+ <label class="field field-block">
41
+ <span>System</span>
42
+ <textarea id="system-prompt" rows="3" spellcheck="true"></textarea>
43
+ </label>
44
+
45
+ <div class="preset-row" role="group" aria-label="Prompt presets">
46
+ ${PRESETS.map(
47
+ (preset) =>
48
+ `<button class="preset" type="button" data-preset="${preset.id}">${preset.label}</button>`,
49
+ ).join("")}
50
+ </div>
51
+
52
+ <label class="field field-block prompt-field">
53
+ <span>Prompt</span>
54
+ <textarea id="prompt" rows="9" spellcheck="true"></textarea>
55
+ </label>
56
+
57
+ <div class="setting-grid">
58
+ <label class="field">
59
+ <span>Precision</span>
60
+ <select id="precision">
61
+ <option value="q4">Q4</option>
62
+ <option value="fp16">FP16</option>
63
+ </select>
64
+ </label>
65
+
66
+ <label class="field">
67
+ <span>Max tokens</span>
68
+ <input id="max-new-tokens" type="number" min="16" max="1024" step="8" />
69
+ </label>
70
+
71
+ <label class="field">
72
+ <span>Temperature</span>
73
+ <input id="temperature" type="number" min="0" max="1.5" step="0.05" />
74
+ </label>
75
+
76
+ <label class="field">
77
+ <span>Top K</span>
78
+ <input id="top-k" type="number" min="1" max="200" step="1" />
79
+ </label>
80
+
81
+ <label class="field">
82
+ <span>Penalty</span>
83
+ <input id="repetition-penalty" type="number" min="1" max="2" step="0.01" />
84
+ </label>
85
+ </div>
86
+
87
+ <div class="actions">
88
+ <button class="primary" id="generate" type="submit">Generate</button>
89
+ <button class="secondary" id="stop" type="button">Stop</button>
90
+ <button class="secondary" id="clear" type="button">Clear</button>
91
+ </div>
92
+ </form>
93
+
94
+ <section class="output-panel" aria-label="Generation output">
95
+ <div class="output-header">
96
+ <div>
97
+ <p class="eyebrow">Local output</p>
98
+ <h2>Response</h2>
99
+ </div>
100
+ <div class="metric" id="metric">Idle</div>
101
+ </div>
102
+ <div class="progress-shell" aria-hidden="true">
103
+ <div class="progress-bar" id="progress-bar"></div>
104
+ </div>
105
+ <pre class="output" id="output" tabindex="0"></pre>
106
+ <div class="token-rail" id="token-rail" aria-hidden="true"></div>
107
+ </section>
108
+ </div>
109
+ </section>
110
+ </main>
111
+ `;
112
+
113
+ const runtimeStatus = element<HTMLDivElement>("#runtime-status");
114
+ const runtimeLabel = element<HTMLSpanElement>("#runtime-label");
115
+ const form = element<HTMLFormElement>("#generation-form");
116
+ const systemPrompt = element<HTMLTextAreaElement>("#system-prompt");
117
+ const promptInput = element<HTMLTextAreaElement>("#prompt");
118
+ const precision = element<HTMLSelectElement>("#precision");
119
+ const maxNewTokens = element<HTMLInputElement>("#max-new-tokens");
120
+ const temperature = element<HTMLInputElement>("#temperature");
121
+ const topK = element<HTMLInputElement>("#top-k");
122
+ const repetitionPenalty = element<HTMLInputElement>("#repetition-penalty");
123
+ const generateButton = element<HTMLButtonElement>("#generate");
124
+ const stopButton = element<HTMLButtonElement>("#stop");
125
+ const clearButton = element<HTMLButtonElement>("#clear");
126
+ const output = element<HTMLPreElement>("#output");
127
+ const metric = element<HTMLDivElement>("#metric");
128
+ const progressBar = element<HTMLDivElement>("#progress-bar");
129
+ const tokenRail = element<HTMLDivElement>("#token-rail");
130
+
131
+ systemPrompt.value = DEFAULT_SYSTEM_PROMPT;
132
+ promptInput.value = DEFAULT_PROMPT;
133
+ precision.value = DEFAULT_SETTINGS.precision;
134
+ maxNewTokens.value = String(DEFAULT_SETTINGS.maxNewTokens);
135
+ temperature.value = String(DEFAULT_SETTINGS.temperature);
136
+ topK.value = String(DEFAULT_SETTINGS.topK);
137
+ repetitionPenalty.value = String(DEFAULT_SETTINGS.repetitionPenalty);
138
+
139
+ updateWebGpuStatus();
140
+ setBusy(false);
141
+
142
+ form.addEventListener("submit", (event) => {
143
+ event.preventDefault();
144
+ startGeneration();
145
+ });
146
+
147
+ stopButton.addEventListener("click", () => {
148
+ jobId += 1;
149
+ const request: WorkerRequest = { type: "reset", jobId };
150
+ worker.postMessage(request);
151
+ setBusy(false);
152
+ metric.textContent = "Stopped";
153
+ });
154
+
155
+ clearButton.addEventListener("click", () => {
156
+ generatedText = "";
157
+ output.textContent = "";
158
+ tokenRail.innerHTML = "";
159
+ metric.textContent = "Idle";
160
+ progressBar.style.width = "0%";
161
+ });
162
+
163
+ for (const button of document.querySelectorAll<HTMLButtonElement>(".preset")) {
164
+ button.addEventListener("click", () => {
165
+ const preset = PRESETS.find((item) => item.id === button.dataset.preset);
166
+ if (preset) promptInput.value = preset.prompt;
167
+ });
168
+ }
169
+
170
+ worker.addEventListener("message", (event: MessageEvent<WorkerResponse>) => {
171
+ const message = event.data;
172
+ if (message.jobId !== jobId) return;
173
+
174
+ switch (message.type) {
175
+ case "status":
176
+ metric.textContent = message.message;
177
+ break;
178
+ case "progress":
179
+ progressBar.style.width = `${message.progress}%`;
180
+ metric.textContent =
181
+ message.progress > 0
182
+ ? `${message.status}: ${message.progress.toFixed(0)}%`
183
+ : `${message.status}: ${message.file}`;
184
+ break;
185
+ case "token":
186
+ generatedText += message.text;
187
+ output.textContent = generatedText;
188
+ appendTokenMark(message.text);
189
+ output.scrollTop = output.scrollHeight;
190
+ break;
191
+ case "complete":
192
+ generatedText = message.text || generatedText;
193
+ output.textContent = generatedText;
194
+ metric.textContent = `${Math.max(0.1, message.elapsedMs / 1000).toFixed(1)}s`;
195
+ progressBar.style.width = "100%";
196
+ setBusy(false);
197
+ break;
198
+ case "error":
199
+ metric.textContent = "Error";
200
+ output.textContent = message.message;
201
+ runtimeStatus.classList.add("runtime-error");
202
+ setBusy(false);
203
+ break;
204
+ }
205
+ });
206
+
207
+ function element<T extends Element>(selector: string) {
208
+ const found = document.querySelector<T>(selector);
209
+ if (!found) throw new Error(`Missing element: ${selector}`);
210
+ return found;
211
+ }
212
+
213
+ function readSettings(): GenerationSettings {
214
+ return {
215
+ precision: precision.value as Precision,
216
+ maxNewTokens: readNumber(maxNewTokens, DEFAULT_SETTINGS.maxNewTokens),
217
+ temperature: readNumber(temperature, DEFAULT_SETTINGS.temperature),
218
+ topK: readNumber(topK, DEFAULT_SETTINGS.topK),
219
+ repetitionPenalty: readNumber(repetitionPenalty, DEFAULT_SETTINGS.repetitionPenalty),
220
+ };
221
+ }
222
+
223
+ function readNumber(input: HTMLInputElement, fallback: number) {
224
+ const value = Number(input.value);
225
+ return Number.isFinite(value) ? value : fallback;
226
+ }
227
+
228
+ function startGeneration() {
229
+ if (isGenerating) return;
230
+
231
+ generatedText = "";
232
+ output.textContent = "";
233
+ tokenRail.innerHTML = "";
234
+ progressBar.style.width = "0%";
235
+ metric.textContent = "Queueing";
236
+ setBusy(true);
237
+ jobId += 1;
238
+
239
+ const request: WorkerRequest = {
240
+ type: "generate",
241
+ jobId,
242
+ systemPrompt: systemPrompt.value.trim() || DEFAULT_SYSTEM_PROMPT,
243
+ prompt: promptInput.value.trim(),
244
+ settings: readSettings(),
245
+ };
246
+
247
+ worker.postMessage(request);
248
+ }
249
+
250
+ function setBusy(nextBusy: boolean) {
251
+ isGenerating = nextBusy;
252
+ generateButton.disabled = nextBusy;
253
+ stopButton.disabled = !nextBusy;
254
+ generateButton.textContent = nextBusy ? "Generating" : "Generate";
255
+ }
256
+
257
+ function appendTokenMark(text: string) {
258
+ const mark = document.createElement("span");
259
+ mark.className = "token-mark";
260
+ mark.style.setProperty("--token-size", `${Math.min(42, Math.max(8, text.length * 3))}px`);
261
+ tokenRail.append(mark);
262
+ while (tokenRail.childElementCount > 56) {
263
+ tokenRail.firstElementChild?.remove();
264
+ }
265
+ }
266
+
267
+ function updateWebGpuStatus() {
268
+ const hasWebGpu = "gpu" in navigator;
269
+ runtimeStatus.classList.toggle("runtime-ready", hasWebGpu);
270
+ runtimeStatus.classList.toggle("runtime-error", !hasWebGpu);
271
+ runtimeLabel.textContent = hasWebGpu ? `WebGPU ready / ${MODEL_ID}` : "WebGPU unavailable";
272
+ }
src/messages.ts ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import type { GenerationSettings } from "./model";
2
+
3
+ export type WorkerRequest =
4
+ | {
5
+ type: "generate";
6
+ jobId: number;
7
+ systemPrompt: string;
8
+ prompt: string;
9
+ settings: GenerationSettings;
10
+ }
11
+ | {
12
+ type: "reset";
13
+ jobId: number;
14
+ };
15
+
16
+ export type WorkerResponse =
17
+ | {
18
+ type: "status";
19
+ jobId: number;
20
+ message: string;
21
+ }
22
+ | {
23
+ type: "progress";
24
+ jobId: number;
25
+ file: string;
26
+ progress: number;
27
+ status: string;
28
+ }
29
+ | {
30
+ type: "token";
31
+ jobId: number;
32
+ text: string;
33
+ }
34
+ | {
35
+ type: "complete";
36
+ jobId: number;
37
+ text: string;
38
+ elapsedMs: number;
39
+ }
40
+ | {
41
+ type: "error";
42
+ jobId: number;
43
+ message: string;
44
+ };
src/model.ts ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export const MODEL_ID = "LiquidAI/LFM2.5-230M-ONNX";
2
+
3
+ export const DEFAULT_SYSTEM_PROMPT =
4
+ "You are a concise assistant trained by Liquid AI. Prefer direct answers and preserve structured output when requested.";
5
+
6
+ export const DEFAULT_PROMPT =
7
+ "Extract the candidate name, current status, role, and interview date from this note as JSON:\n\nCandidate ID 12345 is currently in the Interview Scheduled stage for the Clinical Research Associate position, with an interview date set for 2023-11-20.";
8
+
9
+ export const PRESETS = [
10
+ {
11
+ id: "extract",
12
+ label: "Extract JSON",
13
+ prompt: DEFAULT_PROMPT,
14
+ },
15
+ {
16
+ id: "brief",
17
+ label: "Brief Answer",
18
+ prompt: "What is WebGPU useful for in browser-based machine learning?",
19
+ },
20
+ {
21
+ id: "agent",
22
+ label: "Tool Call",
23
+ prompt:
24
+ "A user asks: What is the current status of candidate ID 12345? Return the most likely tool call in a compact Pythonic function-call style.",
25
+ },
26
+ ] as const;
27
+
28
+ export type Precision = "q4" | "fp16";
29
+
30
+ export type GenerationSettings = {
31
+ precision: Precision;
32
+ maxNewTokens: number;
33
+ temperature: number;
34
+ topK: number;
35
+ repetitionPenalty: number;
36
+ };
37
+
38
+ export const DEFAULT_SETTINGS: GenerationSettings = {
39
+ precision: "q4",
40
+ maxNewTokens: 220,
41
+ temperature: 0.1,
42
+ topK: 50,
43
+ repetitionPenalty: 1.05,
44
+ };
src/styles.css ADDED
@@ -0,0 +1,419 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ color-scheme: light;
3
+ --paper: #f7f7f4;
4
+ --panel: #ffffff;
5
+ --ink: #171a1f;
6
+ --muted: #626a73;
7
+ --line: #d9ded8;
8
+ --field: #f1f3f0;
9
+ --copper: #b85f37;
10
+ --signal: #1d7f6e;
11
+ --violet: #4f46a7;
12
+ --shadow: 0 24px 80px rgba(23, 26, 31, 0.14);
13
+ font-family:
14
+ Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
15
+ }
16
+
17
+ * {
18
+ box-sizing: border-box;
19
+ }
20
+
21
+ html {
22
+ min-height: 100%;
23
+ background:
24
+ linear-gradient(90deg, rgba(23, 26, 31, 0.035) 1px, transparent 1px) 0 0 / 42px 42px,
25
+ linear-gradient(rgba(23, 26, 31, 0.035) 1px, transparent 1px) 0 0 / 42px 42px,
26
+ var(--paper);
27
+ color: var(--ink);
28
+ }
29
+
30
+ body {
31
+ min-width: 320px;
32
+ min-height: 100vh;
33
+ margin: 0;
34
+ }
35
+
36
+ button,
37
+ input,
38
+ select,
39
+ textarea {
40
+ font: inherit;
41
+ }
42
+
43
+ button {
44
+ cursor: pointer;
45
+ }
46
+
47
+ button:disabled {
48
+ cursor: not-allowed;
49
+ opacity: 0.62;
50
+ }
51
+
52
+ .shell {
53
+ width: min(1420px, calc(100vw - 32px));
54
+ min-height: 100vh;
55
+ margin: 0 auto;
56
+ padding: 28px 0;
57
+ display: grid;
58
+ align-items: center;
59
+ }
60
+
61
+ .console {
62
+ min-height: min(860px, calc(100vh - 56px));
63
+ padding: 18px;
64
+ border: 1px solid var(--line);
65
+ border-radius: 8px;
66
+ background: rgba(255, 255, 255, 0.78);
67
+ box-shadow: var(--shadow);
68
+ backdrop-filter: blur(14px);
69
+ }
70
+
71
+ .topbar,
72
+ .output-header,
73
+ .actions,
74
+ .preset-row {
75
+ display: flex;
76
+ align-items: center;
77
+ }
78
+
79
+ .topbar {
80
+ justify-content: space-between;
81
+ gap: 16px;
82
+ padding: 4px 4px 18px;
83
+ border-bottom: 1px solid var(--line);
84
+ }
85
+
86
+ .eyebrow {
87
+ margin: 0 0 5px;
88
+ color: var(--muted);
89
+ font-size: 0.72rem;
90
+ font-weight: 760;
91
+ letter-spacing: 0;
92
+ text-transform: uppercase;
93
+ }
94
+
95
+ h1,
96
+ h2 {
97
+ margin: 0;
98
+ letter-spacing: 0;
99
+ }
100
+
101
+ h1 {
102
+ font-family: ui-serif, Georgia, Cambria, "Times New Roman", serif;
103
+ font-size: clamp(2.2rem, 5vw, 5.4rem);
104
+ line-height: 0.92;
105
+ font-weight: 680;
106
+ }
107
+
108
+ h2 {
109
+ font-size: 1.05rem;
110
+ line-height: 1.1;
111
+ }
112
+
113
+ .runtime {
114
+ min-height: 40px;
115
+ max-width: 520px;
116
+ padding: 9px 12px;
117
+ border: 1px solid var(--line);
118
+ border-radius: 999px;
119
+ display: flex;
120
+ align-items: center;
121
+ gap: 9px;
122
+ color: var(--muted);
123
+ background: var(--panel);
124
+ font-size: 0.82rem;
125
+ line-height: 1.2;
126
+ }
127
+
128
+ .runtime-dot {
129
+ width: 10px;
130
+ height: 10px;
131
+ flex: 0 0 auto;
132
+ border-radius: 50%;
133
+ background: var(--muted);
134
+ }
135
+
136
+ .runtime-ready .runtime-dot {
137
+ background: var(--signal);
138
+ }
139
+
140
+ .runtime-error .runtime-dot {
141
+ background: var(--copper);
142
+ }
143
+
144
+ .workbench {
145
+ display: grid;
146
+ grid-template-columns: minmax(340px, 0.78fr) minmax(420px, 1.22fr);
147
+ gap: 18px;
148
+ padding-top: 18px;
149
+ }
150
+
151
+ .controls,
152
+ .output-panel {
153
+ min-width: 0;
154
+ border: 1px solid var(--line);
155
+ border-radius: 8px;
156
+ background: var(--panel);
157
+ }
158
+
159
+ .controls {
160
+ padding: 16px;
161
+ }
162
+
163
+ .field {
164
+ display: grid;
165
+ gap: 7px;
166
+ }
167
+
168
+ .field span {
169
+ color: var(--muted);
170
+ font-size: 0.76rem;
171
+ font-weight: 720;
172
+ text-transform: uppercase;
173
+ }
174
+
175
+ textarea,
176
+ input,
177
+ select {
178
+ width: 100%;
179
+ border: 1px solid var(--line);
180
+ border-radius: 6px;
181
+ background: var(--field);
182
+ color: var(--ink);
183
+ outline: none;
184
+ }
185
+
186
+ textarea {
187
+ resize: vertical;
188
+ min-height: 82px;
189
+ padding: 11px 12px;
190
+ line-height: 1.42;
191
+ }
192
+
193
+ textarea:focus,
194
+ input:focus,
195
+ select:focus,
196
+ button:focus-visible,
197
+ .output:focus {
198
+ border-color: var(--violet);
199
+ box-shadow: 0 0 0 3px rgba(79, 70, 167, 0.16);
200
+ }
201
+
202
+ .prompt-field {
203
+ margin-top: 12px;
204
+ }
205
+
206
+ .preset-row {
207
+ flex-wrap: wrap;
208
+ gap: 8px;
209
+ margin: 12px 0 0;
210
+ }
211
+
212
+ .preset,
213
+ .secondary,
214
+ .primary {
215
+ min-height: 38px;
216
+ border: 1px solid var(--line);
217
+ border-radius: 6px;
218
+ padding: 0 13px;
219
+ color: var(--ink);
220
+ background: var(--panel);
221
+ font-weight: 720;
222
+ }
223
+
224
+ .preset:hover,
225
+ .secondary:hover {
226
+ border-color: var(--muted);
227
+ }
228
+
229
+ .setting-grid {
230
+ display: grid;
231
+ grid-template-columns: repeat(5, minmax(0, 1fr));
232
+ gap: 10px;
233
+ margin-top: 14px;
234
+ }
235
+
236
+ input,
237
+ select {
238
+ height: 38px;
239
+ padding: 0 10px;
240
+ }
241
+
242
+ .actions {
243
+ justify-content: flex-end;
244
+ gap: 8px;
245
+ margin-top: 16px;
246
+ }
247
+
248
+ .primary {
249
+ min-width: 132px;
250
+ border-color: var(--ink);
251
+ background: var(--ink);
252
+ color: #fff;
253
+ }
254
+
255
+ .primary:hover {
256
+ background: #000;
257
+ }
258
+
259
+ .output-panel {
260
+ position: relative;
261
+ display: grid;
262
+ grid-template-rows: auto auto minmax(360px, 1fr) auto;
263
+ overflow: hidden;
264
+ }
265
+
266
+ .output-header {
267
+ justify-content: space-between;
268
+ gap: 16px;
269
+ padding: 16px;
270
+ }
271
+
272
+ .metric {
273
+ min-width: 96px;
274
+ padding: 8px 10px;
275
+ border: 1px solid var(--line);
276
+ border-radius: 6px;
277
+ color: var(--muted);
278
+ text-align: center;
279
+ font-size: 0.82rem;
280
+ font-weight: 720;
281
+ }
282
+
283
+ .progress-shell {
284
+ height: 3px;
285
+ background: var(--field);
286
+ }
287
+
288
+ .progress-bar {
289
+ width: 0%;
290
+ height: 100%;
291
+ background: linear-gradient(90deg, var(--signal), var(--violet), var(--copper));
292
+ transition: width 180ms ease;
293
+ }
294
+
295
+ .output {
296
+ margin: 0;
297
+ padding: 20px;
298
+ overflow: auto;
299
+ white-space: pre-wrap;
300
+ word-break: break-word;
301
+ outline: none;
302
+ color: var(--ink);
303
+ font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
304
+ font-size: 0.96rem;
305
+ line-height: 1.55;
306
+ }
307
+
308
+ .output:empty::before {
309
+ color: var(--muted);
310
+ content: "Model output will appear here.";
311
+ }
312
+
313
+ .token-rail {
314
+ min-height: 34px;
315
+ padding: 8px 12px 12px;
316
+ display: flex;
317
+ align-items: flex-end;
318
+ gap: 4px;
319
+ border-top: 1px solid var(--line);
320
+ background: #fbfbfa;
321
+ }
322
+
323
+ .token-mark {
324
+ width: var(--token-size);
325
+ height: 9px;
326
+ border-radius: 999px;
327
+ background: var(--signal);
328
+ opacity: 0.42;
329
+ animation: token-rise 360ms ease-out both;
330
+ }
331
+
332
+ .token-mark:nth-child(3n) {
333
+ background: var(--violet);
334
+ }
335
+
336
+ .token-mark:nth-child(5n) {
337
+ background: var(--copper);
338
+ }
339
+
340
+ @keyframes token-rise {
341
+ from {
342
+ transform: translateY(7px);
343
+ opacity: 0;
344
+ }
345
+ }
346
+
347
+ @media (max-width: 980px) {
348
+ .shell {
349
+ width: min(100vw - 20px, 760px);
350
+ align-items: start;
351
+ padding: 10px 0;
352
+ }
353
+
354
+ .console {
355
+ min-height: calc(100vh - 20px);
356
+ padding: 12px;
357
+ }
358
+
359
+ .topbar {
360
+ align-items: flex-start;
361
+ flex-direction: column;
362
+ }
363
+
364
+ .runtime {
365
+ width: 100%;
366
+ max-width: none;
367
+ border-radius: 6px;
368
+ }
369
+
370
+ .workbench {
371
+ grid-template-columns: 1fr;
372
+ }
373
+
374
+ .setting-grid {
375
+ grid-template-columns: repeat(2, minmax(0, 1fr));
376
+ }
377
+
378
+ .output-panel {
379
+ grid-template-rows: auto auto minmax(280px, 48vh) auto;
380
+ }
381
+ }
382
+
383
+ @media (max-width: 560px) {
384
+ .shell {
385
+ width: 100%;
386
+ padding: 0;
387
+ }
388
+
389
+ .console {
390
+ min-height: 100vh;
391
+ border: 0;
392
+ border-radius: 0;
393
+ }
394
+
395
+ .setting-grid {
396
+ grid-template-columns: 1fr;
397
+ }
398
+
399
+ .actions {
400
+ align-items: stretch;
401
+ flex-direction: column;
402
+ }
403
+
404
+ .primary,
405
+ .secondary {
406
+ width: 100%;
407
+ }
408
+ }
409
+
410
+ @media (prefers-reduced-motion: reduce) {
411
+ *,
412
+ *::before,
413
+ *::after {
414
+ scroll-behavior: auto !important;
415
+ transition-duration: 0.01ms !important;
416
+ animation-duration: 0.01ms !important;
417
+ animation-iteration-count: 1 !important;
418
+ }
419
+ }
src/worker.ts ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import {
2
+ InterruptableStoppingCriteria,
3
+ pipeline,
4
+ TextStreamer,
5
+ } from "@huggingface/transformers";
6
+ import { MODEL_ID, type Precision, type GenerationSettings } from "./model";
7
+ import type { WorkerRequest, WorkerResponse } from "./messages";
8
+
9
+ type ChatMessage = {
10
+ role: "system" | "user";
11
+ content: string;
12
+ };
13
+
14
+ type TextGenerationPipeline = {
15
+ tokenizer: ConstructorParameters<typeof TextStreamer>[0];
16
+ (input: ChatMessage[], options: Record<string, unknown>): Promise<unknown>;
17
+ };
18
+
19
+ const instances = new Map<Precision, Promise<TextGenerationPipeline>>();
20
+ let activeJobId = 0;
21
+ let stoppingCriteria: InstanceType<typeof InterruptableStoppingCriteria> | null = null;
22
+
23
+ function post(message: WorkerResponse) {
24
+ self.postMessage(message);
25
+ }
26
+
27
+ function getProgressName(progress: unknown) {
28
+ if (!progress || typeof progress !== "object") return "model files";
29
+ const record = progress as Record<string, unknown>;
30
+ return String(record.file ?? record.name ?? record.url ?? "model files");
31
+ }
32
+
33
+ function getProgressPercent(progress: unknown) {
34
+ if (!progress || typeof progress !== "object") return 0;
35
+ const record = progress as Record<string, unknown>;
36
+ const raw = record.progress;
37
+ return typeof raw === "number" && Number.isFinite(raw) ? Math.max(0, Math.min(100, raw)) : 0;
38
+ }
39
+
40
+ function getProgressStatus(progress: unknown) {
41
+ if (!progress || typeof progress !== "object") return "loading";
42
+ const record = progress as Record<string, unknown>;
43
+ return String(record.status ?? "loading");
44
+ }
45
+
46
+ async function getGenerator(settings: GenerationSettings, jobId: number) {
47
+ const existing = instances.get(settings.precision);
48
+ if (existing) return existing;
49
+
50
+ post({
51
+ type: "status",
52
+ jobId,
53
+ message: `Loading ${MODEL_ID} (${settings.precision.toUpperCase()})`,
54
+ });
55
+
56
+ const instancePromise = pipeline(
57
+ "text-generation",
58
+ MODEL_ID,
59
+ {
60
+ device: "webgpu",
61
+ dtype: settings.precision,
62
+ progress_callback: (progress: unknown) => {
63
+ if (jobId !== activeJobId) return;
64
+ post({
65
+ type: "progress",
66
+ jobId,
67
+ file: getProgressName(progress),
68
+ progress: getProgressPercent(progress),
69
+ status: getProgressStatus(progress),
70
+ });
71
+ },
72
+ },
73
+ ) as Promise<TextGenerationPipeline>;
74
+
75
+ instances.set(settings.precision, instancePromise);
76
+ return instancePromise;
77
+ }
78
+
79
+ async function generate(request: Extract<WorkerRequest, { type: "generate" }>) {
80
+ activeJobId = request.jobId;
81
+ const started = performance.now();
82
+
83
+ if (!("gpu" in navigator)) {
84
+ post({
85
+ type: "error",
86
+ jobId: request.jobId,
87
+ message: "WebGPU is not available in this browser. Use a recent Chrome or Edge build.",
88
+ });
89
+ return;
90
+ }
91
+
92
+ const generator = await getGenerator(request.settings, request.jobId);
93
+ if (request.jobId !== activeJobId) return;
94
+
95
+ stoppingCriteria = new InterruptableStoppingCriteria();
96
+ stoppingCriteria.reset();
97
+
98
+ post({
99
+ type: "status",
100
+ jobId: request.jobId,
101
+ message: "Generating",
102
+ });
103
+
104
+ let streamedText = "";
105
+ const streamer = new TextStreamer(generator.tokenizer, {
106
+ skip_prompt: true,
107
+ skip_special_tokens: true,
108
+ callback_function: (text: string) => {
109
+ if (request.jobId !== activeJobId) return;
110
+ streamedText += text;
111
+ post({ type: "token", jobId: request.jobId, text });
112
+ },
113
+ });
114
+
115
+ const messages: ChatMessage[] = [
116
+ { role: "system", content: request.systemPrompt },
117
+ { role: "user", content: request.prompt },
118
+ ];
119
+
120
+ const result = await generator(messages, {
121
+ max_new_tokens: request.settings.maxNewTokens,
122
+ temperature: request.settings.temperature,
123
+ top_k: request.settings.topK,
124
+ repetition_penalty: request.settings.repetitionPenalty,
125
+ do_sample: request.settings.temperature > 0,
126
+ streamer,
127
+ stopping_criteria: stoppingCriteria,
128
+ return_full_text: false,
129
+ });
130
+
131
+ if (request.jobId !== activeJobId) return;
132
+
133
+ const fallbackText =
134
+ Array.isArray(result) && result[0] && typeof result[0] === "object"
135
+ ? String((result[0] as Record<string, unknown>).generated_text ?? "")
136
+ : "";
137
+
138
+ post({
139
+ type: "complete",
140
+ jobId: request.jobId,
141
+ text: streamedText || fallbackText,
142
+ elapsedMs: performance.now() - started,
143
+ });
144
+ }
145
+
146
+ self.addEventListener("message", (event: MessageEvent<WorkerRequest>) => {
147
+ const request = event.data;
148
+ if (request.type === "reset") {
149
+ activeJobId = request.jobId;
150
+ stoppingCriteria?.interrupt();
151
+ post({ type: "status", jobId: request.jobId, message: "Stopped" });
152
+ return;
153
+ }
154
+
155
+ generate(request).catch((error: unknown) => {
156
+ post({
157
+ type: "error",
158
+ jobId: request.jobId,
159
+ message: error instanceof Error ? error.message : String(error),
160
+ });
161
+ });
162
+ });
style.css DELETED
@@ -1,28 +0,0 @@
1
- body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
4
- }
5
-
6
- h1 {
7
- font-size: 16px;
8
- margin-top: 0;
9
- }
10
-
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
16
- }
17
-
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
24
- }
25
-
26
- .card p:last-child {
27
- margin-bottom: 0;
28
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tsconfig.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "useDefineForClassFields": true,
5
+ "module": "ESNext",
6
+ "lib": ["ES2022", "DOM", "DOM.Iterable", "WebWorker"],
7
+ "types": ["vite/client"],
8
+ "skipLibCheck": true,
9
+ "moduleResolution": "Bundler",
10
+ "allowImportingTsExtensions": true,
11
+ "isolatedModules": true,
12
+ "moduleDetection": "force",
13
+ "noEmit": true,
14
+ "strict": true,
15
+ "noUnusedLocals": true,
16
+ "noUnusedParameters": true,
17
+ "noFallthroughCasesInSwitch": true
18
+ },
19
+ "include": ["src"]
20
+ }
vite.config.ts ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from "vite";
2
+
3
+ export default defineConfig({
4
+ build: {
5
+ target: "es2022",
6
+ },
7
+ worker: {
8
+ format: "es",
9
+ },
10
+ });