Thomas G. Lopes commited on
Commit
58843c4
·
unverified ·
1 Parent(s): 262221c

update hf libs & update code snippets (#87)

Browse files
package.json CHANGED
@@ -12,16 +12,18 @@
12
  "lint": "prettier . --check . && eslint src/",
13
  "format": "prettier . --write .",
14
  "clean": "rm -rf ./node_modules/ && rm -rf ./.svelte-kit/ && ni && echo 'Project cleaned!'",
15
- "update-ctx-length": "jiti scripts/update-ctx-length.ts"
 
 
16
  },
17
  "devDependencies": {
18
  "@eslint/eslintrc": "^3.3.0",
19
  "@eslint/js": "^9.22.0",
20
  "@floating-ui/dom": "^1.6.13",
21
- "@huggingface/hub": "^1.0.1",
22
- "@huggingface/inference": "^3.5.1",
23
- "@huggingface/tasks": "^0.17.1",
24
- "@huggingface/transformers": "^3.4.2",
25
  "@iconify-json/carbon": "^1.2.8",
26
  "@iconify-json/material-symbols": "^1.2.15",
27
  "@ryoppippi/unplugin-typia": "^1.0.0",
@@ -32,6 +34,8 @@
32
  "@sveltejs/vite-plugin-svelte": "^4.0.0",
33
  "@tailwindcss/container-queries": "^0.1.1",
34
  "@tailwindcss/postcss": "^4.0.9",
 
 
35
  "@types/node": "^22.14.1",
36
  "clsx": "^2.1.1",
37
  "dotenv": "^16.5.0",
@@ -41,6 +45,7 @@
41
  "globals": "^16.0.0",
42
  "highlight.js": "^11.10.0",
43
  "jiti": "^2.4.2",
 
44
  "melt": "^0.30.1",
45
  "openai": "^4.90.0",
46
  "postcss": "^8.4.38",
@@ -58,7 +63,8 @@
58
  "typescript": "^5.8.2",
59
  "typescript-eslint": "^8.26.1",
60
  "unplugin-icons": "^22.1.0",
61
- "vite": "^5.4.4"
 
62
  },
63
  "type": "module",
64
  "dependencies": {
@@ -66,5 +72,10 @@
66
  "eslint-plugin-svelte": "^3.6.0",
67
  "remult": "^3.0.2",
68
  "typia": "^8.0.0"
 
 
 
 
 
69
  }
70
  }
 
12
  "lint": "prettier . --check . && eslint src/",
13
  "format": "prettier . --write .",
14
  "clean": "rm -rf ./node_modules/ && rm -rf ./.svelte-kit/ && ni && echo 'Project cleaned!'",
15
+ "update-ctx-length": "jiti scripts/update-ctx-length.ts",
16
+ "test:unit": "vitest",
17
+ "test": "npm run test:unit -- --run"
18
  },
19
  "devDependencies": {
20
  "@eslint/eslintrc": "^3.3.0",
21
  "@eslint/js": "^9.22.0",
22
  "@floating-ui/dom": "^1.6.13",
23
+ "@huggingface/hub": "^2.1.0",
24
+ "@huggingface/inference": "^3.13.2",
25
+ "@huggingface/tasks": "^0.19.8",
26
+ "@huggingface/transformers": "^3.5.1",
27
  "@iconify-json/carbon": "^1.2.8",
28
  "@iconify-json/material-symbols": "^1.2.15",
29
  "@ryoppippi/unplugin-typia": "^1.0.0",
 
34
  "@sveltejs/vite-plugin-svelte": "^4.0.0",
35
  "@tailwindcss/container-queries": "^0.1.1",
36
  "@tailwindcss/postcss": "^4.0.9",
37
+ "@testing-library/jest-dom": "^6.6.3",
38
+ "@testing-library/svelte": "^5.2.4",
39
  "@types/node": "^22.14.1",
40
  "clsx": "^2.1.1",
41
  "dotenv": "^16.5.0",
 
45
  "globals": "^16.0.0",
46
  "highlight.js": "^11.10.0",
47
  "jiti": "^2.4.2",
48
+ "jsdom": "^26.0.0",
49
  "melt": "^0.30.1",
50
  "openai": "^4.90.0",
51
  "postcss": "^8.4.38",
 
63
  "typescript": "^5.8.2",
64
  "typescript-eslint": "^8.26.1",
65
  "unplugin-icons": "^22.1.0",
66
+ "vite": "^5.4.4",
67
+ "vitest": "^3.0.0"
68
  },
69
  "type": "module",
70
  "dependencies": {
 
72
  "eslint-plugin-svelte": "^3.6.0",
73
  "remult": "^3.0.2",
74
  "typia": "^8.0.0"
75
+ },
76
+ "pnpm": {
77
+ "onlyBuiltDependencies": [
78
+ "esbuild"
79
+ ]
80
  }
81
  }
pnpm-lock.yaml CHANGED
@@ -31,17 +31,17 @@ importers:
31
  specifier: ^1.6.13
32
  version: 1.6.13
33
  '@huggingface/hub':
34
- specifier: ^1.0.1
35
- version: 1.0.1
36
  '@huggingface/inference':
37
- specifier: ^3.5.1
38
- version: 3.5.1
39
  '@huggingface/tasks':
40
- specifier: ^0.17.1
41
- version: 0.17.1
42
  '@huggingface/transformers':
43
- specifier: ^3.4.2
44
- version: 3.4.2
45
  '@iconify-json/carbon':
46
  specifier: ^1.2.8
47
  version: 1.2.8
@@ -72,6 +72,12 @@ importers:
72
  '@tailwindcss/postcss':
73
  specifier: ^4.0.9
74
  version: 4.0.9
 
 
 
 
 
 
75
  '@types/node':
76
  specifier: ^22.14.1
77
  version: 22.14.1
@@ -99,12 +105,15 @@ importers:
99
  jiti:
100
  specifier: ^2.4.2
101
  version: 2.4.2
 
 
 
102
  melt:
103
  specifier: ^0.30.1
104
  version: 0.30.1(@floating-ui/dom@1.6.13)(svelte@5.30.1)
105
  openai:
106
  specifier: ^4.90.0
107
- version: 4.90.0
108
  postcss:
109
  specifier: ^8.4.38
110
  version: 8.5.3
@@ -153,9 +162,15 @@ importers:
153
  vite:
154
  specifier: ^5.4.4
155
  version: 5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)
 
 
 
156
 
157
  packages:
158
 
 
 
 
159
  '@alloc/quick-lru@5.2.0':
160
  resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
161
  engines: {node: '>=10'}
@@ -170,8 +185,51 @@ packages:
170
  '@antfu/utils@8.1.1':
171
  resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==}
172
 
173
- '@emnapi/runtime@1.4.0':
174
- resolution: {integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
175
 
176
  '@esbuild/aix-ppc64@0.21.5':
177
  resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
@@ -508,26 +566,28 @@ packages:
508
  '@floating-ui/utils@0.2.9':
509
  resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
510
 
511
- '@huggingface/hub@1.0.1':
512
- resolution: {integrity: sha512-wogGVETaNUV/wYBkny0uQD48L0rK9cttVtbaA1Rw/pGCuSYoZ8YlvTV6zymsGJfXaxQU8zup0aOR2XLIf6HVfg==}
513
  engines: {node: '>=18'}
 
514
 
515
- '@huggingface/inference@3.5.1':
516
- resolution: {integrity: sha512-NwTj5MS1eb4HfSp/O1/PyH1bEhTXl/iFh/K+8yYkUTHtK4AHXi/NDsV2LblhACaTEIhpOpYswL9cZx7z3y1tlg==}
517
  engines: {node: '>=18'}
518
 
519
- '@huggingface/jinja@0.3.3':
520
- resolution: {integrity: sha512-vQQr2JyWvVFba3Lj9es4q9vCl1sAc74fdgnEMoX8qHrXtswap9ge9uO3ONDzQB0cQ0PUyaKY2N6HaVbTBvSXvw==}
521
  engines: {node: '>=18'}
522
 
523
- '@huggingface/tasks@0.15.9':
524
- resolution: {integrity: sha512-cbnZcpMHKdhURWIplVP4obHxAZcxjyRm0zI7peTPksZN4CtIOMmJC4ZqGEymo0lk+0VNkXD7ULwFJ3JjT/VpkQ==}
 
525
 
526
- '@huggingface/tasks@0.17.1':
527
- resolution: {integrity: sha512-kN5F/pzwxtmdZ0jORumNyegNKOX/ciU5G/DMZcqK3SJShod4C6yfvBRCMn5sEDzanxtU8VjX+7TaInQFmmU8Nw==}
528
 
529
- '@huggingface/transformers@3.4.2':
530
- resolution: {integrity: sha512-B7K7SCkpqjlfhrV0z18icmnCqgdU2zq+gI3ttBRQ8xl6mIzfxeeKht/vCa8y7pbewY/hJmirKdQClpw0IUaSaw==}
531
 
532
  '@humanfs/core@0.19.1':
533
  resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
@@ -561,107 +621,118 @@ packages:
561
  '@iconify/utils@2.3.0':
562
  resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==}
563
 
564
- '@img/sharp-darwin-arm64@0.33.5':
565
- resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==}
566
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
567
  cpu: [arm64]
568
  os: [darwin]
569
 
570
- '@img/sharp-darwin-x64@0.33.5':
571
- resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==}
572
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
573
  cpu: [x64]
574
  os: [darwin]
575
 
576
- '@img/sharp-libvips-darwin-arm64@1.0.4':
577
- resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==}
578
  cpu: [arm64]
579
  os: [darwin]
580
 
581
- '@img/sharp-libvips-darwin-x64@1.0.4':
582
- resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==}
583
  cpu: [x64]
584
  os: [darwin]
585
 
586
- '@img/sharp-libvips-linux-arm64@1.0.4':
587
- resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==}
588
  cpu: [arm64]
589
  os: [linux]
590
 
591
- '@img/sharp-libvips-linux-arm@1.0.5':
592
- resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==}
593
  cpu: [arm]
594
  os: [linux]
595
 
596
- '@img/sharp-libvips-linux-s390x@1.0.4':
597
- resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==}
 
 
 
 
 
598
  cpu: [s390x]
599
  os: [linux]
600
 
601
- '@img/sharp-libvips-linux-x64@1.0.4':
602
- resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==}
603
  cpu: [x64]
604
  os: [linux]
605
 
606
- '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
607
- resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==}
608
  cpu: [arm64]
609
  os: [linux]
610
 
611
- '@img/sharp-libvips-linuxmusl-x64@1.0.4':
612
- resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==}
613
  cpu: [x64]
614
  os: [linux]
615
 
616
- '@img/sharp-linux-arm64@0.33.5':
617
- resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==}
618
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
619
  cpu: [arm64]
620
  os: [linux]
621
 
622
- '@img/sharp-linux-arm@0.33.5':
623
- resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==}
624
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
625
  cpu: [arm]
626
  os: [linux]
627
 
628
- '@img/sharp-linux-s390x@0.33.5':
629
- resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==}
630
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
631
  cpu: [s390x]
632
  os: [linux]
633
 
634
- '@img/sharp-linux-x64@0.33.5':
635
- resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==}
636
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
637
  cpu: [x64]
638
  os: [linux]
639
 
640
- '@img/sharp-linuxmusl-arm64@0.33.5':
641
- resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==}
642
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
643
  cpu: [arm64]
644
  os: [linux]
645
 
646
- '@img/sharp-linuxmusl-x64@0.33.5':
647
- resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==}
648
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
649
  cpu: [x64]
650
  os: [linux]
651
 
652
- '@img/sharp-wasm32@0.33.5':
653
- resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==}
654
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
655
  cpu: [wasm32]
656
 
657
- '@img/sharp-win32-ia32@0.33.5':
658
- resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==}
 
 
 
 
 
 
659
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
660
  cpu: [ia32]
661
  os: [win32]
662
 
663
- '@img/sharp-win32-x64@0.33.5':
664
- resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==}
665
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
666
  cpu: [x64]
667
  os: [win32]
@@ -1029,6 +1100,30 @@ packages:
1029
  '@tailwindcss/postcss@4.0.9':
1030
  resolution: {integrity: sha512-BT/E+pdMqulavEAVM5NCpxmGEwHiLDPpkmg/c/X25ZBW+izTe+aZ+v1gf/HXTrihRoCxrUp5U4YyHsBTzspQKQ==}
1031
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1032
  '@types/cookie@0.6.0':
1033
  resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
1034
 
@@ -1109,6 +1204,35 @@ packages:
1109
  '@ungap/structured-clone@1.3.0':
1110
  resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
1111
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1112
  abort-controller@3.0.0:
1113
  resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
1114
  engines: {node: '>=6.5'}
@@ -1123,6 +1247,10 @@ packages:
1123
  engines: {node: '>=0.4.0'}
1124
  hasBin: true
1125
 
 
 
 
 
1126
  agentkeepalive@4.6.0:
1127
  resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==}
1128
  engines: {node: '>= 8.0.0'}
@@ -1149,6 +1277,9 @@ packages:
1149
  argparse@2.0.1:
1150
  resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
1151
 
 
 
 
1152
  aria-query@5.3.2:
1153
  resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
1154
  engines: {node: '>= 0.4'}
@@ -1156,6 +1287,10 @@ packages:
1156
  array-timsort@1.0.3:
1157
  resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==}
1158
 
 
 
 
 
1159
  asynckit@0.4.0:
1160
  resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
1161
 
@@ -1176,6 +1311,10 @@ packages:
1176
  bl@4.1.0:
1177
  resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
1178
 
 
 
 
 
1179
  brace-expansion@1.1.11:
1180
  resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
1181
 
@@ -1189,6 +1328,10 @@ packages:
1189
  buffer@5.7.1:
1190
  resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
1191
 
 
 
 
 
1192
  call-bind-apply-helpers@1.0.2:
1193
  resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
1194
  engines: {node: '>= 0.4'}
@@ -1200,6 +1343,14 @@ packages:
1200
  ccount@2.0.1:
1201
  resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
1202
 
 
 
 
 
 
 
 
 
1203
  chalk@4.1.2:
1204
  resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
1205
  engines: {node: '>=10'}
@@ -1213,6 +1364,10 @@ packages:
1213
  chardet@0.7.0:
1214
  resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
1215
 
 
 
 
 
1216
  chokidar@4.0.3:
1217
  resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
1218
  engines: {node: '>= 14.16.0'}
@@ -1300,11 +1455,22 @@ packages:
1300
  resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
1301
  engines: {node: '>= 8'}
1302
 
 
 
 
1303
  cssesc@3.0.0:
1304
  resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
1305
  engines: {node: '>=4'}
1306
  hasBin: true
1307
 
 
 
 
 
 
 
 
 
1308
  debug@4.4.0:
1309
  resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
1310
  engines: {node: '>=6.0'}
@@ -1314,6 +1480,13 @@ packages:
1314
  supports-color:
1315
  optional: true
1316
 
 
 
 
 
 
 
 
1317
  deep-is@0.1.4:
1318
  resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
1319
 
@@ -1324,6 +1497,14 @@ packages:
1324
  defaults@1.0.4:
1325
  resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
1326
 
 
 
 
 
 
 
 
 
1327
  defu@6.1.4:
1328
  resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
1329
 
@@ -1340,10 +1521,13 @@ packages:
1340
  engines: {node: '>=0.10'}
1341
  hasBin: true
1342
 
1343
- detect-libc@2.0.3:
1344
- resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
1345
  engines: {node: '>=8'}
1346
 
 
 
 
1347
  devalue@5.1.1:
1348
  resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==}
1349
 
@@ -1357,6 +1541,12 @@ packages:
1357
  resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
1358
  engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
1359
 
 
 
 
 
 
 
1360
  dotenv@16.5.0:
1361
  resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==}
1362
  engines: {node: '>=12'}
@@ -1376,6 +1566,10 @@ packages:
1376
  resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
1377
  engines: {node: '>=10.13.0'}
1378
 
 
 
 
 
1379
  es-define-property@1.0.1:
1380
  resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
1381
  engines: {node: '>= 0.4'}
@@ -1384,6 +1578,9 @@ packages:
1384
  resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
1385
  engines: {node: '>= 0.4'}
1386
 
 
 
 
1387
  es-object-atoms@1.1.1:
1388
  resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
1389
  engines: {node: '>= 0.4'}
@@ -1392,6 +1589,9 @@ packages:
1392
  resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
1393
  engines: {node: '>= 0.4'}
1394
 
 
 
 
1395
  esbuild@0.21.5:
1396
  resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
1397
  engines: {node: '>=12'}
@@ -1492,6 +1692,9 @@ packages:
1492
  estree-walker@2.0.2:
1493
  resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
1494
 
 
 
 
1495
  esutils@2.0.3:
1496
  resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
1497
  engines: {node: '>=0.10.0'}
@@ -1500,6 +1703,10 @@ packages:
1500
  resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
1501
  engines: {node: '>=6'}
1502
 
 
 
 
 
1503
  exsolve@1.0.4:
1504
  resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==}
1505
 
@@ -1534,6 +1741,14 @@ packages:
1534
  picomatch:
1535
  optional: true
1536
 
 
 
 
 
 
 
 
 
1537
  figures@3.2.0:
1538
  resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
1539
  engines: {node: '>=8'}
@@ -1603,6 +1818,10 @@ packages:
1603
  resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
1604
  engines: {node: '>=10.13.0'}
1605
 
 
 
 
 
1606
  global-prefix@4.0.0:
1607
  resolution: {integrity: sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==}
1608
  engines: {node: '>=16'}
@@ -1619,6 +1838,10 @@ packages:
1619
  resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==}
1620
  engines: {node: '>=18'}
1621
 
 
 
 
 
1622
  gopd@1.2.0:
1623
  resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
1624
  engines: {node: '>= 0.4'}
@@ -1640,6 +1863,9 @@ packages:
1640
  resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==}
1641
  engines: {node: '>=8'}
1642
 
 
 
 
1643
  has-symbols@1.1.0:
1644
  resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
1645
  engines: {node: '>= 0.4'}
@@ -1662,9 +1888,21 @@ packages:
1662
  resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
1663
  engines: {node: '>=12.0.0'}
1664
 
 
 
 
 
1665
  html-void-elements@3.0.0:
1666
  resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
1667
 
 
 
 
 
 
 
 
 
1668
  humanize-ms@1.2.1:
1669
  resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
1670
 
@@ -1672,6 +1910,10 @@ packages:
1672
  resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
1673
  engines: {node: '>=0.10.0'}
1674
 
 
 
 
 
1675
  ieee754@1.2.1:
1676
  resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
1677
 
@@ -1690,6 +1932,10 @@ packages:
1690
  resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
1691
  engines: {node: '>=0.8.19'}
1692
 
 
 
 
 
1693
  inherits@2.0.4:
1694
  resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
1695
 
@@ -1731,6 +1977,9 @@ packages:
1731
  resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
1732
  engines: {node: '>=0.12.0'}
1733
 
 
 
 
1734
  is-reference@1.2.1:
1735
  resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
1736
 
@@ -1768,10 +2017,22 @@ packages:
1768
  resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
1769
  hasBin: true
1770
 
 
 
 
1771
  js-yaml@4.1.0:
1772
  resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
1773
  hasBin: true
1774
 
 
 
 
 
 
 
 
 
 
1775
  json-buffer@3.0.1:
1776
  resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
1777
 
@@ -1781,6 +2042,9 @@ packages:
1781
  json-stable-stringify-without-jsonify@1.0.1:
1782
  resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
1783
 
 
 
 
1784
  keyv@4.5.4:
1785
  resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
1786
 
@@ -1898,9 +2162,23 @@ packages:
1898
  long@5.3.1:
1899
  resolution: {integrity: sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==}
1900
 
 
 
 
 
 
 
 
 
 
 
1901
  magic-string@0.30.17:
1902
  resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
1903
 
 
 
 
 
1904
  math-intrinsics@1.1.0:
1905
  resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
1906
  engines: {node: '>= 0.4'}
@@ -1949,6 +2227,10 @@ packages:
1949
  resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
1950
  engines: {node: '>=6'}
1951
 
 
 
 
 
1952
  minimatch@3.1.2:
1953
  resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1954
 
@@ -2015,6 +2297,13 @@ packages:
2015
  encoding:
2016
  optional: true
2017
 
 
 
 
 
 
 
 
2018
  onetime@5.1.2:
2019
  resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
2020
  engines: {node: '>=6'}
@@ -2025,18 +2314,18 @@ packages:
2025
  oniguruma-to-es@4.3.3:
2026
  resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==}
2027
 
2028
- onnxruntime-common@1.20.1:
2029
- resolution: {integrity: sha512-YiU0s0IzYYC+gWvqD1HzLc46Du1sXpSiwzKb63PACIJr6LfL27VsXSXQvt68EzD3V0D5Bc0vyJTjmMxp0ylQiw==}
2030
 
2031
- onnxruntime-common@1.22.0-dev.20250306-aafa8d170a:
2032
- resolution: {integrity: sha512-NfIQnW4lIk/8LnhnYqknYPeet0U0+AADgKQRlKex36QrNoVSCY+aNaX6wyy2VzQ4CNWxsYh0E203ajRD/zxn0g==}
2033
 
2034
- onnxruntime-node@1.20.1:
2035
- resolution: {integrity: sha512-di/I4HDXRw+FLgq+TyHmQEDd3cEp9iFFZm0r4uJ1Wd7b/WE1VXtKWo8yemex347c6GNF/3Pv86ZfPhIWxORr0w==}
2036
  os: [win32, darwin, linux]
2037
 
2038
- onnxruntime-web@1.22.0-dev.20250306-ccf8fdd9ea:
2039
- resolution: {integrity: sha512-YwqS9Qqx2eKFXIx+HQloqRUG5/STHPUuNk8wn+qVVmwXBIfNdXX0/Lm7wgo5CnC2k+yqZmjDV5V1dZi4PeSPGQ==}
2040
 
2041
  openai@4.90.0:
2042
  resolution: {integrity: sha512-YCuHMMycqtCg1B8G9ezkOF0j8UnBWD3Al/zYaelpuXwU1yhCEv+Y4n9G20MnyGy6cH4GsFwOMrgstQ+bgG1PtA==}
@@ -2085,6 +2374,9 @@ packages:
2085
  resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
2086
  engines: {node: '>=6'}
2087
 
 
 
 
2088
  path-exists@4.0.0:
2089
  resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
2090
  engines: {node: '>=8'}
@@ -2106,6 +2398,10 @@ packages:
2106
  pathe@2.0.3:
2107
  resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
2108
 
 
 
 
 
2109
  picocolors@1.1.1:
2110
  resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
2111
 
@@ -2236,6 +2532,10 @@ packages:
2236
  engines: {node: '>=14'}
2237
  hasBin: true
2238
 
 
 
 
 
2239
  pretty-format@29.7.0:
2240
  resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
2241
  engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -2261,6 +2561,9 @@ packages:
2261
  resolution: {integrity: sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==}
2262
  engines: {node: '>=4'}
2263
 
 
 
 
2264
  react-is@18.3.1:
2265
  resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
2266
 
@@ -2272,6 +2575,10 @@ packages:
2272
  resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
2273
  engines: {node: '>= 14.18.0'}
2274
 
 
 
 
 
2275
  reflect-metadata@0.1.14:
2276
  resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==}
2277
 
@@ -2312,11 +2619,18 @@ packages:
2312
  resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
2313
  engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
2314
 
 
 
 
 
2315
  rollup@4.34.9:
2316
  resolution: {integrity: sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==}
2317
  engines: {node: '>=18.0.0', npm: '>=8.0.0'}
2318
  hasBin: true
2319
 
 
 
 
2320
  run-async@2.4.1:
2321
  resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
2322
  engines: {node: '>=0.12.0'}
@@ -2347,16 +2661,32 @@ packages:
2347
  safer-buffer@2.1.2:
2348
  resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
2349
 
 
 
 
 
 
 
 
2350
  semver@7.7.1:
2351
  resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==}
2352
  engines: {node: '>=10'}
2353
  hasBin: true
2354
 
 
 
 
 
 
 
 
 
 
2355
  set-cookie-parser@2.7.1:
2356
  resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==}
2357
 
2358
- sharp@0.33.5:
2359
- resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==}
2360
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
2361
 
2362
  shebang-command@2.0.0:
@@ -2370,6 +2700,9 @@ packages:
2370
  shiki@3.4.0:
2371
  resolution: {integrity: sha512-Ni80XHcqhOEXv5mmDAvf5p6PAJqbUc/RzFeaOqk+zP5DLvTPS3j0ckvA+MI87qoxTQ5RGJDVTbdl/ENLSyyAnQ==}
2372
 
 
 
 
2373
  signal-exit@3.0.7:
2374
  resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
2375
 
@@ -2387,6 +2720,15 @@ packages:
2387
  space-separated-tokens@2.0.2:
2388
  resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
2389
 
 
 
 
 
 
 
 
 
 
2390
  string-width@4.2.3:
2391
  resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
2392
  engines: {node: '>=8'}
@@ -2401,6 +2743,10 @@ packages:
2401
  resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
2402
  engines: {node: '>=8'}
2403
 
 
 
 
 
2404
  strip-json-comments@3.1.1:
2405
  resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
2406
  engines: {node: '>=8'}
@@ -2434,6 +2780,9 @@ packages:
2434
  resolution: {integrity: sha512-QIYtKnJGkubWXtNkrUBKVCvyo9gjcccdbnvXfwsGNhvbeNNdQjRDTa/BiQcJ2kWXbXPQbWKyT7CUu53KIj1rfw==}
2435
  engines: {node: '>=18'}
2436
 
 
 
 
2437
  synckit@0.9.2:
2438
  resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
2439
  engines: {node: ^14.18.0 || >=16.0.0}
@@ -2455,9 +2804,35 @@ packages:
2455
  through@2.3.8:
2456
  resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
2457
 
 
 
 
2458
  tinyexec@0.3.2:
2459
  resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
2460
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2461
  tmp@0.0.33:
2462
  resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
2463
  engines: {node: '>=0.6.0'}
@@ -2470,9 +2845,17 @@ packages:
2470
  resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
2471
  engines: {node: '>=6'}
2472
 
 
 
 
 
2473
  tr46@0.0.3:
2474
  resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
2475
 
 
 
 
 
2476
  trim-lines@3.0.1:
2477
  resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
2478
 
@@ -2493,6 +2876,10 @@ packages:
2493
  resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
2494
  engines: {node: '>= 0.8.0'}
2495
 
 
 
 
 
2496
  type-fest@0.21.3:
2497
  resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
2498
  engines: {node: '>=10'}
@@ -2603,6 +2990,11 @@ packages:
2603
  vfile@6.0.3:
2604
  resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
2605
 
 
 
 
 
 
2606
  vite@5.4.14:
2607
  resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==}
2608
  engines: {node: ^18.0.0 || >=20.0.0}
@@ -2682,6 +3074,38 @@ packages:
2682
  vite:
2683
  optional: true
2684
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2685
  wcwidth@1.0.1:
2686
  resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
2687
 
@@ -2692,9 +3116,25 @@ packages:
2692
  webidl-conversions@3.0.1:
2693
  resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
2694
 
 
 
 
 
2695
  webpack-virtual-modules@0.6.2:
2696
  resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
2697
 
 
 
 
 
 
 
 
 
 
 
 
 
2698
  whatwg-url@5.0.0:
2699
  resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
2700
 
@@ -2708,6 +3148,11 @@ packages:
2708
  engines: {node: ^16.13.0 || >=18.0.0}
2709
  hasBin: true
2710
 
 
 
 
 
 
2711
  word-wrap@1.2.5:
2712
  resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
2713
  engines: {node: '>=0.10.0'}
@@ -2716,6 +3161,25 @@ packages:
2716
  resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
2717
  engines: {node: '>=8'}
2718
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2719
  yallist@5.0.0:
2720
  resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
2721
  engines: {node: '>=18'}
@@ -2745,6 +3209,8 @@ packages:
2745
 
2746
  snapshots:
2747
 
 
 
2748
  '@alloc/quick-lru@5.2.0': {}
2749
 
2750
  '@ampproject/remapping@2.3.0':
@@ -2759,7 +3225,45 @@ snapshots:
2759
 
2760
  '@antfu/utils@8.1.1': {}
2761
 
2762
- '@emnapi/runtime@1.4.0':
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2763
  dependencies:
2764
  tslib: 2.8.1
2765
  optional: true
@@ -2963,26 +3467,27 @@ snapshots:
2963
 
2964
  '@floating-ui/utils@0.2.9': {}
2965
 
2966
- '@huggingface/hub@1.0.1':
2967
  dependencies:
2968
- '@huggingface/tasks': 0.15.9
2969
 
2970
- '@huggingface/inference@3.5.1':
2971
  dependencies:
2972
- '@huggingface/tasks': 0.17.1
 
2973
 
2974
- '@huggingface/jinja@0.3.3': {}
2975
 
2976
- '@huggingface/tasks@0.15.9': {}
2977
 
2978
- '@huggingface/tasks@0.17.1': {}
2979
 
2980
- '@huggingface/transformers@3.4.2':
2981
  dependencies:
2982
- '@huggingface/jinja': 0.3.3
2983
- onnxruntime-node: 1.20.1
2984
- onnxruntime-web: 1.22.0-dev.20250306-ccf8fdd9ea
2985
- sharp: 0.33.5
2986
 
2987
  '@humanfs/core@0.19.1': {}
2988
 
@@ -3020,79 +3525,85 @@ snapshots:
3020
  transitivePeerDependencies:
3021
  - supports-color
3022
 
3023
- '@img/sharp-darwin-arm64@0.33.5':
3024
  optionalDependencies:
3025
- '@img/sharp-libvips-darwin-arm64': 1.0.4
3026
  optional: true
3027
 
3028
- '@img/sharp-darwin-x64@0.33.5':
3029
  optionalDependencies:
3030
- '@img/sharp-libvips-darwin-x64': 1.0.4
3031
  optional: true
3032
 
3033
- '@img/sharp-libvips-darwin-arm64@1.0.4':
3034
  optional: true
3035
 
3036
- '@img/sharp-libvips-darwin-x64@1.0.4':
3037
  optional: true
3038
 
3039
- '@img/sharp-libvips-linux-arm64@1.0.4':
3040
  optional: true
3041
 
3042
- '@img/sharp-libvips-linux-arm@1.0.5':
3043
  optional: true
3044
 
3045
- '@img/sharp-libvips-linux-s390x@1.0.4':
3046
  optional: true
3047
 
3048
- '@img/sharp-libvips-linux-x64@1.0.4':
3049
  optional: true
3050
 
3051
- '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
3052
  optional: true
3053
 
3054
- '@img/sharp-libvips-linuxmusl-x64@1.0.4':
3055
  optional: true
3056
 
3057
- '@img/sharp-linux-arm64@0.33.5':
 
 
 
3058
  optionalDependencies:
3059
- '@img/sharp-libvips-linux-arm64': 1.0.4
3060
  optional: true
3061
 
3062
- '@img/sharp-linux-arm@0.33.5':
3063
  optionalDependencies:
3064
- '@img/sharp-libvips-linux-arm': 1.0.5
3065
  optional: true
3066
 
3067
- '@img/sharp-linux-s390x@0.33.5':
3068
  optionalDependencies:
3069
- '@img/sharp-libvips-linux-s390x': 1.0.4
3070
  optional: true
3071
 
3072
- '@img/sharp-linux-x64@0.33.5':
3073
  optionalDependencies:
3074
- '@img/sharp-libvips-linux-x64': 1.0.4
3075
  optional: true
3076
 
3077
- '@img/sharp-linuxmusl-arm64@0.33.5':
3078
  optionalDependencies:
3079
- '@img/sharp-libvips-linuxmusl-arm64': 1.0.4
3080
  optional: true
3081
 
3082
- '@img/sharp-linuxmusl-x64@0.33.5':
3083
  optionalDependencies:
3084
- '@img/sharp-libvips-linuxmusl-x64': 1.0.4
3085
  optional: true
3086
 
3087
- '@img/sharp-wasm32@0.33.5':
3088
  dependencies:
3089
- '@emnapi/runtime': 1.4.0
 
 
 
3090
  optional: true
3091
 
3092
- '@img/sharp-win32-ia32@0.33.5':
3093
  optional: true
3094
 
3095
- '@img/sharp-win32-x64@0.33.5':
3096
  optional: true
3097
 
3098
  '@isaacs/fs-minipass@4.0.1':
@@ -3447,6 +3958,37 @@ snapshots:
3447
  postcss: 8.5.3
3448
  tailwindcss: 4.0.9
3449
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3450
  '@types/cookie@0.6.0': {}
3451
 
3452
  '@types/estree@1.0.6': {}
@@ -3557,6 +4099,46 @@ snapshots:
3557
 
3558
  '@ungap/structured-clone@1.3.0': {}
3559
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3560
  abort-controller@3.0.0:
3561
  dependencies:
3562
  event-target-shim: 5.0.1
@@ -3567,6 +4149,8 @@ snapshots:
3567
 
3568
  acorn@8.14.0: {}
3569
 
 
 
3570
  agentkeepalive@4.6.0:
3571
  dependencies:
3572
  humanize-ms: 1.2.1
@@ -3592,10 +4176,16 @@ snapshots:
3592
 
3593
  argparse@2.0.1: {}
3594
 
 
 
 
 
3595
  aria-query@5.3.2: {}
3596
 
3597
  array-timsort@1.0.3: {}
3598
 
 
 
3599
  asynckit@0.4.0: {}
3600
 
3601
  axe-core@4.9.1: {}
@@ -3612,6 +4202,8 @@ snapshots:
3612
  inherits: 2.0.4
3613
  readable-stream: 3.6.2
3614
 
 
 
3615
  brace-expansion@1.1.11:
3616
  dependencies:
3617
  balanced-match: 1.0.2
@@ -3630,6 +4222,8 @@ snapshots:
3630
  base64-js: 1.5.1
3631
  ieee754: 1.2.1
3632
 
 
 
3633
  call-bind-apply-helpers@1.0.2:
3634
  dependencies:
3635
  es-errors: 1.3.0
@@ -3639,6 +4233,19 @@ snapshots:
3639
 
3640
  ccount@2.0.1: {}
3641
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3642
  chalk@4.1.2:
3643
  dependencies:
3644
  ansi-styles: 4.3.0
@@ -3650,6 +4257,8 @@ snapshots:
3650
 
3651
  chardet@0.7.0: {}
3652
 
 
 
3653
  chokidar@4.0.3:
3654
  dependencies:
3655
  readdirp: 4.1.2
@@ -3722,12 +4331,28 @@ snapshots:
3722
  shebang-command: 2.0.0
3723
  which: 2.0.2
3724
 
 
 
3725
  cssesc@3.0.0: {}
3726
 
 
 
 
 
 
 
 
 
 
 
3727
  debug@4.4.0:
3728
  dependencies:
3729
  ms: 2.1.3
3730
 
 
 
 
 
3731
  deep-is@0.1.4: {}
3732
 
3733
  deepmerge@4.3.1: {}
@@ -3736,6 +4361,18 @@ snapshots:
3736
  dependencies:
3737
  clone: 1.0.4
3738
 
 
 
 
 
 
 
 
 
 
 
 
 
3739
  defu@6.1.4: {}
3740
 
3741
  delayed-stream@1.0.0: {}
@@ -3744,7 +4381,9 @@ snapshots:
3744
 
3745
  detect-libc@1.0.3: {}
3746
 
3747
- detect-libc@2.0.3: {}
 
 
3748
 
3749
  devalue@5.1.1: {}
3750
 
@@ -3756,6 +4395,10 @@ snapshots:
3756
 
3757
  diff-sequences@29.6.3: {}
3758
 
 
 
 
 
3759
  dotenv@16.5.0: {}
3760
 
3761
  drange@1.1.1: {}
@@ -3773,10 +4416,14 @@ snapshots:
3773
  graceful-fs: 4.2.11
3774
  tapable: 2.2.1
3775
 
 
 
3776
  es-define-property@1.0.1: {}
3777
 
3778
  es-errors@1.3.0: {}
3779
 
 
 
3780
  es-object-atoms@1.1.1:
3781
  dependencies:
3782
  es-errors: 1.3.0
@@ -3788,6 +4435,8 @@ snapshots:
3788
  has-tostringtag: 1.0.2
3789
  hasown: 2.0.2
3790
 
 
 
3791
  esbuild@0.21.5:
3792
  optionalDependencies:
3793
  '@esbuild/aix-ppc64': 0.21.5
@@ -3953,10 +4602,16 @@ snapshots:
3953
 
3954
  estree-walker@2.0.2: {}
3955
 
 
 
 
 
3956
  esutils@2.0.3: {}
3957
 
3958
  event-target-shim@5.0.1: {}
3959
 
 
 
3960
  exsolve@1.0.4: {}
3961
 
3962
  external-editor@3.1.0:
@@ -3989,6 +4644,10 @@ snapshots:
3989
  optionalDependencies:
3990
  picomatch: 4.0.2
3991
 
 
 
 
 
3992
  figures@3.2.0:
3993
  dependencies:
3994
  escape-string-regexp: 1.0.5
@@ -4070,6 +4729,15 @@ snapshots:
4070
  dependencies:
4071
  is-glob: 4.0.3
4072
 
 
 
 
 
 
 
 
 
 
4073
  global-prefix@4.0.0:
4074
  dependencies:
4075
  ini: 4.1.3
@@ -4082,6 +4750,11 @@ snapshots:
4082
 
4083
  globals@16.0.0: {}
4084
 
 
 
 
 
 
4085
  gopd@1.2.0: {}
4086
 
4087
  graceful-fs@4.2.11: {}
@@ -4094,6 +4767,10 @@ snapshots:
4094
 
4095
  has-own-prop@2.0.0: {}
4096
 
 
 
 
 
4097
  has-symbols@1.1.0: {}
4098
 
4099
  has-tostringtag@1.0.2:
@@ -4124,8 +4801,26 @@ snapshots:
4124
 
4125
  highlight.js@11.11.1: {}
4126
 
 
 
 
 
4127
  html-void-elements@3.0.0: {}
4128
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4129
  humanize-ms@1.2.1:
4130
  dependencies:
4131
  ms: 2.1.3
@@ -4134,6 +4829,10 @@ snapshots:
4134
  dependencies:
4135
  safer-buffer: 2.1.2
4136
 
 
 
 
 
4137
  ieee754@1.2.1: {}
4138
 
4139
  ignore@5.3.2: {}
@@ -4147,6 +4846,8 @@ snapshots:
4147
 
4148
  imurmurhash@0.1.4: {}
4149
 
 
 
4150
  inherits@2.0.4: {}
4151
 
4152
  ini@4.1.3: {}
@@ -4189,6 +4890,8 @@ snapshots:
4189
 
4190
  is-number@7.0.0: {}
4191
 
 
 
4192
  is-reference@1.2.1:
4193
  dependencies:
4194
  '@types/estree': 1.0.6
@@ -4228,16 +4931,47 @@ snapshots:
4228
 
4229
  jiti@2.4.2: {}
4230
 
 
 
4231
  js-yaml@4.1.0:
4232
  dependencies:
4233
  argparse: 2.0.1
4234
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4235
  json-buffer@3.0.1: {}
4236
 
4237
  json-schema-traverse@0.4.1: {}
4238
 
4239
  json-stable-stringify-without-jsonify@1.0.1: {}
4240
 
 
 
4241
  keyv@4.5.4:
4242
  dependencies:
4243
  json-buffer: 3.0.1
@@ -4329,10 +5063,20 @@ snapshots:
4329
 
4330
  long@5.3.1: {}
4331
 
 
 
 
 
 
 
4332
  magic-string@0.30.17:
4333
  dependencies:
4334
  '@jridgewell/sourcemap-codec': 1.5.0
4335
 
 
 
 
 
4336
  math-intrinsics@1.1.0: {}
4337
 
4338
  mdast-util-to-hast@13.2.0:
@@ -4388,6 +5132,8 @@ snapshots:
4388
 
4389
  mimic-fn@2.1.0: {}
4390
 
 
 
4391
  minimatch@3.1.2:
4392
  dependencies:
4393
  brace-expansion: 1.1.11
@@ -4433,6 +5179,10 @@ snapshots:
4433
  dependencies:
4434
  whatwg-url: 5.0.0
4435
 
 
 
 
 
4436
  onetime@5.1.2:
4437
  dependencies:
4438
  mimic-fn: 2.1.0
@@ -4445,25 +5195,26 @@ snapshots:
4445
  regex: 6.0.1
4446
  regex-recursion: 6.0.2
4447
 
4448
- onnxruntime-common@1.20.1: {}
4449
 
4450
- onnxruntime-common@1.22.0-dev.20250306-aafa8d170a: {}
4451
 
4452
- onnxruntime-node@1.20.1:
4453
  dependencies:
4454
- onnxruntime-common: 1.20.1
 
4455
  tar: 7.4.3
4456
 
4457
- onnxruntime-web@1.22.0-dev.20250306-ccf8fdd9ea:
4458
  dependencies:
4459
  flatbuffers: 25.2.10
4460
  guid-typescript: 1.0.9
4461
  long: 5.3.1
4462
- onnxruntime-common: 1.22.0-dev.20250306-aafa8d170a
4463
  platform: 1.3.6
4464
  protobufjs: 7.4.0
4465
 
4466
- openai@4.90.0:
4467
  dependencies:
4468
  '@types/node': 18.19.84
4469
  '@types/node-fetch': 2.6.12
@@ -4472,6 +5223,8 @@ snapshots:
4472
  form-data-encoder: 1.7.2
4473
  formdata-node: 4.4.1
4474
  node-fetch: 2.7.0
 
 
4475
  transitivePeerDependencies:
4476
  - encoding
4477
 
@@ -4522,6 +5275,10 @@ snapshots:
4522
  dependencies:
4523
  callsites: 3.1.0
4524
 
 
 
 
 
4525
  path-exists@4.0.0: {}
4526
 
4527
  path-exists@5.0.0: {}
@@ -4534,6 +5291,8 @@ snapshots:
4534
 
4535
  pathe@2.0.3: {}
4536
 
 
 
4537
  picocolors@1.1.1: {}
4538
 
4539
  picomatch@2.3.1: {}
@@ -4603,6 +5362,12 @@ snapshots:
4603
 
4604
  prettier@3.5.3: {}
4605
 
 
 
 
 
 
 
4606
  pretty-format@29.7.0:
4607
  dependencies:
4608
  '@jest/schemas': 29.6.3
@@ -4637,6 +5402,8 @@ snapshots:
4637
  drange: 1.1.1
4638
  ret: 0.2.2
4639
 
 
 
4640
  react-is@18.3.1: {}
4641
 
4642
  readable-stream@3.6.2:
@@ -4647,6 +5414,11 @@ snapshots:
4647
 
4648
  readdirp@4.1.2: {}
4649
 
 
 
 
 
 
4650
  reflect-metadata@0.1.14: {}
4651
 
4652
  regex-recursion@6.0.2:
@@ -4685,6 +5457,15 @@ snapshots:
4685
 
4686
  reusify@1.1.0: {}
4687
 
 
 
 
 
 
 
 
 
 
4688
  rollup@4.34.9:
4689
  dependencies:
4690
  '@types/estree': 1.0.6
@@ -4710,6 +5491,8 @@ snapshots:
4710
  '@rollup/rollup-win32-x64-msvc': 4.34.9
4711
  fsevents: 2.3.3
4712
 
 
 
4713
  run-async@2.4.1: {}
4714
 
4715
  run-parallel@1.2.0:
@@ -4738,35 +5521,49 @@ snapshots:
4738
 
4739
  safer-buffer@2.1.2: {}
4740
 
 
 
 
 
 
 
4741
  semver@7.7.1: {}
4742
 
 
 
 
 
 
 
4743
  set-cookie-parser@2.7.1: {}
4744
 
4745
- sharp@0.33.5:
4746
  dependencies:
4747
  color: 4.2.3
4748
- detect-libc: 2.0.3
4749
- semver: 7.7.1
4750
  optionalDependencies:
4751
- '@img/sharp-darwin-arm64': 0.33.5
4752
- '@img/sharp-darwin-x64': 0.33.5
4753
- '@img/sharp-libvips-darwin-arm64': 1.0.4
4754
- '@img/sharp-libvips-darwin-x64': 1.0.4
4755
- '@img/sharp-libvips-linux-arm': 1.0.5
4756
- '@img/sharp-libvips-linux-arm64': 1.0.4
4757
- '@img/sharp-libvips-linux-s390x': 1.0.4
4758
- '@img/sharp-libvips-linux-x64': 1.0.4
4759
- '@img/sharp-libvips-linuxmusl-arm64': 1.0.4
4760
- '@img/sharp-libvips-linuxmusl-x64': 1.0.4
4761
- '@img/sharp-linux-arm': 0.33.5
4762
- '@img/sharp-linux-arm64': 0.33.5
4763
- '@img/sharp-linux-s390x': 0.33.5
4764
- '@img/sharp-linux-x64': 0.33.5
4765
- '@img/sharp-linuxmusl-arm64': 0.33.5
4766
- '@img/sharp-linuxmusl-x64': 0.33.5
4767
- '@img/sharp-wasm32': 0.33.5
4768
- '@img/sharp-win32-ia32': 0.33.5
4769
- '@img/sharp-win32-x64': 0.33.5
 
 
4770
 
4771
  shebang-command@2.0.0:
4772
  dependencies:
@@ -4785,6 +5582,8 @@ snapshots:
4785
  '@shikijs/vscode-textmate': 10.0.2
4786
  '@types/hast': 3.0.4
4787
 
 
 
4788
  signal-exit@3.0.7: {}
4789
 
4790
  simple-swizzle@0.2.2:
@@ -4801,6 +5600,12 @@ snapshots:
4801
 
4802
  space-separated-tokens@2.0.2: {}
4803
 
 
 
 
 
 
 
4804
  string-width@4.2.3:
4805
  dependencies:
4806
  emoji-regex: 8.0.0
@@ -4820,6 +5625,10 @@ snapshots:
4820
  dependencies:
4821
  ansi-regex: 5.0.1
4822
 
 
 
 
 
4823
  strip-json-comments@3.1.1: {}
4824
 
4825
  supports-color@7.2.0:
@@ -4868,6 +5677,8 @@ snapshots:
4868
  magic-string: 0.30.17
4869
  zimmerframe: 1.1.2
4870
 
 
 
4871
  synckit@0.9.2:
4872
  dependencies:
4873
  '@pkgr/core': 0.1.1
@@ -4890,8 +5701,27 @@ snapshots:
4890
 
4891
  through@2.3.8: {}
4892
 
 
 
4893
  tinyexec@0.3.2: {}
4894
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4895
  tmp@0.0.33:
4896
  dependencies:
4897
  os-tmpdir: 1.0.2
@@ -4902,8 +5732,16 @@ snapshots:
4902
 
4903
  totalist@3.0.1: {}
4904
 
 
 
 
 
4905
  tr46@0.0.3: {}
4906
 
 
 
 
 
4907
  trim-lines@3.0.1: {}
4908
 
4909
  ts-api-utils@2.0.1(typescript@5.8.2):
@@ -4925,6 +5763,8 @@ snapshots:
4925
  dependencies:
4926
  prelude-ls: 1.2.1
4927
 
 
 
4928
  type-fest@0.21.3: {}
4929
 
4930
  type-fest@4.37.0: {}
@@ -5032,6 +5872,24 @@ snapshots:
5032
  '@types/unist': 3.0.3
5033
  vfile-message: 4.0.2
5034
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5035
  vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1):
5036
  dependencies:
5037
  esbuild: 0.21.5
@@ -5058,6 +5916,47 @@ snapshots:
5058
  optionalDependencies:
5059
  vite: 5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)
5060
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5061
  wcwidth@1.0.1:
5062
  dependencies:
5063
  defaults: 1.0.4
@@ -5066,8 +5965,21 @@ snapshots:
5066
 
5067
  webidl-conversions@3.0.1: {}
5068
 
 
 
5069
  webpack-virtual-modules@0.6.2: {}
5070
 
 
 
 
 
 
 
 
 
 
 
 
5071
  whatwg-url@5.0.0:
5072
  dependencies:
5073
  tr46: 0.0.3
@@ -5081,6 +5993,11 @@ snapshots:
5081
  dependencies:
5082
  isexe: 3.1.1
5083
 
 
 
 
 
 
5084
  word-wrap@1.2.5: {}
5085
 
5086
  wrap-ansi@6.2.0:
@@ -5089,6 +6006,12 @@ snapshots:
5089
  string-width: 4.2.3
5090
  strip-ansi: 6.0.1
5091
 
 
 
 
 
 
 
5092
  yallist@5.0.0: {}
5093
 
5094
  yaml@1.10.2: {}
 
31
  specifier: ^1.6.13
32
  version: 1.6.13
33
  '@huggingface/hub':
34
+ specifier: ^2.1.0
35
+ version: 2.1.0
36
  '@huggingface/inference':
37
+ specifier: ^3.13.2
38
+ version: 3.13.2
39
  '@huggingface/tasks':
40
+ specifier: ^0.19.8
41
+ version: 0.19.8
42
  '@huggingface/transformers':
43
+ specifier: ^3.5.1
44
+ version: 3.5.1
45
  '@iconify-json/carbon':
46
  specifier: ^1.2.8
47
  version: 1.2.8
 
72
  '@tailwindcss/postcss':
73
  specifier: ^4.0.9
74
  version: 4.0.9
75
+ '@testing-library/jest-dom':
76
+ specifier: ^6.6.3
77
+ version: 6.6.3
78
+ '@testing-library/svelte':
79
+ specifier: ^5.2.4
80
+ version: 5.2.8(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1))(vitest@3.1.4(@types/node@22.14.1)(jsdom@26.1.0)(lightningcss@1.29.1))
81
  '@types/node':
82
  specifier: ^22.14.1
83
  version: 22.14.1
 
105
  jiti:
106
  specifier: ^2.4.2
107
  version: 2.4.2
108
+ jsdom:
109
+ specifier: ^26.0.0
110
+ version: 26.1.0
111
  melt:
112
  specifier: ^0.30.1
113
  version: 0.30.1(@floating-ui/dom@1.6.13)(svelte@5.30.1)
114
  openai:
115
  specifier: ^4.90.0
116
+ version: 4.90.0(ws@8.18.2)
117
  postcss:
118
  specifier: ^8.4.38
119
  version: 8.5.3
 
162
  vite:
163
  specifier: ^5.4.4
164
  version: 5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)
165
+ vitest:
166
+ specifier: ^3.0.0
167
+ version: 3.1.4(@types/node@22.14.1)(jsdom@26.1.0)(lightningcss@1.29.1)
168
 
169
  packages:
170
 
171
+ '@adobe/css-tools@4.4.3':
172
+ resolution: {integrity: sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==}
173
+
174
  '@alloc/quick-lru@5.2.0':
175
  resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
176
  engines: {node: '>=10'}
 
185
  '@antfu/utils@8.1.1':
186
  resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==}
187
 
188
+ '@asamuzakjp/css-color@3.2.0':
189
+ resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==}
190
+
191
+ '@babel/code-frame@7.27.1':
192
+ resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
193
+ engines: {node: '>=6.9.0'}
194
+
195
+ '@babel/helper-validator-identifier@7.27.1':
196
+ resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
197
+ engines: {node: '>=6.9.0'}
198
+
199
+ '@babel/runtime@7.27.1':
200
+ resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==}
201
+ engines: {node: '>=6.9.0'}
202
+
203
+ '@csstools/color-helpers@5.0.2':
204
+ resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==}
205
+ engines: {node: '>=18'}
206
+
207
+ '@csstools/css-calc@2.1.3':
208
+ resolution: {integrity: sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==}
209
+ engines: {node: '>=18'}
210
+ peerDependencies:
211
+ '@csstools/css-parser-algorithms': ^3.0.4
212
+ '@csstools/css-tokenizer': ^3.0.3
213
+
214
+ '@csstools/css-color-parser@3.0.9':
215
+ resolution: {integrity: sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==}
216
+ engines: {node: '>=18'}
217
+ peerDependencies:
218
+ '@csstools/css-parser-algorithms': ^3.0.4
219
+ '@csstools/css-tokenizer': ^3.0.3
220
+
221
+ '@csstools/css-parser-algorithms@3.0.4':
222
+ resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==}
223
+ engines: {node: '>=18'}
224
+ peerDependencies:
225
+ '@csstools/css-tokenizer': ^3.0.3
226
+
227
+ '@csstools/css-tokenizer@3.0.3':
228
+ resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==}
229
+ engines: {node: '>=18'}
230
+
231
+ '@emnapi/runtime@1.4.3':
232
+ resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==}
233
 
234
  '@esbuild/aix-ppc64@0.21.5':
235
  resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
 
566
  '@floating-ui/utils@0.2.9':
567
  resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
568
 
569
+ '@huggingface/hub@2.1.0':
570
+ resolution: {integrity: sha512-L+125tAXwCOwVd8n4qQlT20ZJP7I5sEXOLNrIzpgkUG6eMIsGlxT+9hmmiCH/LGmjbXjlcRHoPB8GGT3zCws4A==}
571
  engines: {node: '>=18'}
572
+ hasBin: true
573
 
574
+ '@huggingface/inference@3.13.2':
575
+ resolution: {integrity: sha512-s9grNTO33FeBIvKg4KjnG3sTQWppGDTdQxtpaVqKtn2Hl24yKwc59TfwNAKDzW12aZrc9njYBPwA/Y/mxX/kew==}
576
  engines: {node: '>=18'}
577
 
578
+ '@huggingface/jinja@0.4.1':
579
+ resolution: {integrity: sha512-3WXbMFaPkk03LRCM0z0sylmn8ddDm4ubjU7X+Hg4M2GOuMklwoGAFXp9V2keq7vltoB/c7McE5aHUVVddAewsw==}
580
  engines: {node: '>=18'}
581
 
582
+ '@huggingface/jinja@0.5.0':
583
+ resolution: {integrity: sha512-Ptc03/jGRiYRoi0bUYKZ14MkDslsBRT24oxmsvUlfYrvQMldrxCevhPnT+hfX8awKTT8/f/0ZBBWldoeAcMHdQ==}
584
+ engines: {node: '>=18'}
585
 
586
+ '@huggingface/tasks@0.19.8':
587
+ resolution: {integrity: sha512-gR88OvYQQ2zu1Dt/tfFRVWJRfsKCdssxJBb8bz3tVd9fh3rneNE/pjkaGyG3oT1VlHv7wEmrqrnkmMcXy8O0rg==}
588
 
589
+ '@huggingface/transformers@3.5.1':
590
+ resolution: {integrity: sha512-qWsPoJMBPYcrGuzRMVL//3dwcLXED9r+j+Hzw+hZpBfrMPdyq57ehNs7lew0D34Paj0DO0E0kZQjOZcIVN17hQ==}
591
 
592
  '@humanfs/core@0.19.1':
593
  resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
 
621
  '@iconify/utils@2.3.0':
622
  resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==}
623
 
624
+ '@img/sharp-darwin-arm64@0.34.2':
625
+ resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==}
626
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
627
  cpu: [arm64]
628
  os: [darwin]
629
 
630
+ '@img/sharp-darwin-x64@0.34.2':
631
+ resolution: {integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==}
632
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
633
  cpu: [x64]
634
  os: [darwin]
635
 
636
+ '@img/sharp-libvips-darwin-arm64@1.1.0':
637
+ resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==}
638
  cpu: [arm64]
639
  os: [darwin]
640
 
641
+ '@img/sharp-libvips-darwin-x64@1.1.0':
642
+ resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==}
643
  cpu: [x64]
644
  os: [darwin]
645
 
646
+ '@img/sharp-libvips-linux-arm64@1.1.0':
647
+ resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==}
648
  cpu: [arm64]
649
  os: [linux]
650
 
651
+ '@img/sharp-libvips-linux-arm@1.1.0':
652
+ resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==}
653
  cpu: [arm]
654
  os: [linux]
655
 
656
+ '@img/sharp-libvips-linux-ppc64@1.1.0':
657
+ resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==}
658
+ cpu: [ppc64]
659
+ os: [linux]
660
+
661
+ '@img/sharp-libvips-linux-s390x@1.1.0':
662
+ resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==}
663
  cpu: [s390x]
664
  os: [linux]
665
 
666
+ '@img/sharp-libvips-linux-x64@1.1.0':
667
+ resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==}
668
  cpu: [x64]
669
  os: [linux]
670
 
671
+ '@img/sharp-libvips-linuxmusl-arm64@1.1.0':
672
+ resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==}
673
  cpu: [arm64]
674
  os: [linux]
675
 
676
+ '@img/sharp-libvips-linuxmusl-x64@1.1.0':
677
+ resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==}
678
  cpu: [x64]
679
  os: [linux]
680
 
681
+ '@img/sharp-linux-arm64@0.34.2':
682
+ resolution: {integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==}
683
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
684
  cpu: [arm64]
685
  os: [linux]
686
 
687
+ '@img/sharp-linux-arm@0.34.2':
688
+ resolution: {integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==}
689
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
690
  cpu: [arm]
691
  os: [linux]
692
 
693
+ '@img/sharp-linux-s390x@0.34.2':
694
+ resolution: {integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==}
695
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
696
  cpu: [s390x]
697
  os: [linux]
698
 
699
+ '@img/sharp-linux-x64@0.34.2':
700
+ resolution: {integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==}
701
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
702
  cpu: [x64]
703
  os: [linux]
704
 
705
+ '@img/sharp-linuxmusl-arm64@0.34.2':
706
+ resolution: {integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==}
707
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
708
  cpu: [arm64]
709
  os: [linux]
710
 
711
+ '@img/sharp-linuxmusl-x64@0.34.2':
712
+ resolution: {integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==}
713
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
714
  cpu: [x64]
715
  os: [linux]
716
 
717
+ '@img/sharp-wasm32@0.34.2':
718
+ resolution: {integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==}
719
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
720
  cpu: [wasm32]
721
 
722
+ '@img/sharp-win32-arm64@0.34.2':
723
+ resolution: {integrity: sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==}
724
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
725
+ cpu: [arm64]
726
+ os: [win32]
727
+
728
+ '@img/sharp-win32-ia32@0.34.2':
729
+ resolution: {integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==}
730
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
731
  cpu: [ia32]
732
  os: [win32]
733
 
734
+ '@img/sharp-win32-x64@0.34.2':
735
+ resolution: {integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==}
736
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
737
  cpu: [x64]
738
  os: [win32]
 
1100
  '@tailwindcss/postcss@4.0.9':
1101
  resolution: {integrity: sha512-BT/E+pdMqulavEAVM5NCpxmGEwHiLDPpkmg/c/X25ZBW+izTe+aZ+v1gf/HXTrihRoCxrUp5U4YyHsBTzspQKQ==}
1102
 
1103
+ '@testing-library/dom@10.4.0':
1104
+ resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==}
1105
+ engines: {node: '>=18'}
1106
+
1107
+ '@testing-library/jest-dom@6.6.3':
1108
+ resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==}
1109
+ engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
1110
+
1111
+ '@testing-library/svelte@5.2.8':
1112
+ resolution: {integrity: sha512-ucQOtGsJhtawOEtUmbR4rRh53e6RbM1KUluJIXRmh6D4UzxR847iIqqjRtg9mHNFmGQ8Vkam9yVcR5d1mhIHKA==}
1113
+ engines: {node: '>= 10'}
1114
+ peerDependencies:
1115
+ svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0
1116
+ vite: '*'
1117
+ vitest: '*'
1118
+ peerDependenciesMeta:
1119
+ vite:
1120
+ optional: true
1121
+ vitest:
1122
+ optional: true
1123
+
1124
+ '@types/aria-query@5.0.4':
1125
+ resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
1126
+
1127
  '@types/cookie@0.6.0':
1128
  resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
1129
 
 
1204
  '@ungap/structured-clone@1.3.0':
1205
  resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
1206
 
1207
+ '@vitest/expect@3.1.4':
1208
+ resolution: {integrity: sha512-xkD/ljeliyaClDYqHPNCiJ0plY5YIcM0OlRiZizLhlPmpXWpxnGMyTZXOHFhFeG7w9P5PBeL4IdtJ/HeQwTbQA==}
1209
+
1210
+ '@vitest/mocker@3.1.4':
1211
+ resolution: {integrity: sha512-8IJ3CvwtSw/EFXqWFL8aCMu+YyYXG2WUSrQbViOZkWTKTVicVwZ/YiEZDSqD00kX+v/+W+OnxhNWoeVKorHygA==}
1212
+ peerDependencies:
1213
+ msw: ^2.4.9
1214
+ vite: ^5.0.0 || ^6.0.0
1215
+ peerDependenciesMeta:
1216
+ msw:
1217
+ optional: true
1218
+ vite:
1219
+ optional: true
1220
+
1221
+ '@vitest/pretty-format@3.1.4':
1222
+ resolution: {integrity: sha512-cqv9H9GvAEoTaoq+cYqUTCGscUjKqlJZC7PRwY5FMySVj5J+xOm1KQcCiYHJOEzOKRUhLH4R2pTwvFlWCEScsg==}
1223
+
1224
+ '@vitest/runner@3.1.4':
1225
+ resolution: {integrity: sha512-djTeF1/vt985I/wpKVFBMWUlk/I7mb5hmD5oP8K9ACRmVXgKTae3TUOtXAEBfslNKPzUQvnKhNd34nnRSYgLNQ==}
1226
+
1227
+ '@vitest/snapshot@3.1.4':
1228
+ resolution: {integrity: sha512-JPHf68DvuO7vilmvwdPr9TS0SuuIzHvxeaCkxYcCD4jTk67XwL45ZhEHFKIuCm8CYstgI6LZ4XbwD6ANrwMpFg==}
1229
+
1230
+ '@vitest/spy@3.1.4':
1231
+ resolution: {integrity: sha512-Xg1bXhu+vtPXIodYN369M86K8shGLouNjoVI78g8iAq2rFoHFdajNvJJ5A/9bPMFcfQqdaCpOgWKEoMQg/s0Yg==}
1232
+
1233
+ '@vitest/utils@3.1.4':
1234
+ resolution: {integrity: sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg==}
1235
+
1236
  abort-controller@3.0.0:
1237
  resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
1238
  engines: {node: '>=6.5'}
 
1247
  engines: {node: '>=0.4.0'}
1248
  hasBin: true
1249
 
1250
+ agent-base@7.1.3:
1251
+ resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==}
1252
+ engines: {node: '>= 14'}
1253
+
1254
  agentkeepalive@4.6.0:
1255
  resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==}
1256
  engines: {node: '>= 8.0.0'}
 
1277
  argparse@2.0.1:
1278
  resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
1279
 
1280
+ aria-query@5.3.0:
1281
+ resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
1282
+
1283
  aria-query@5.3.2:
1284
  resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
1285
  engines: {node: '>= 0.4'}
 
1287
  array-timsort@1.0.3:
1288
  resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==}
1289
 
1290
+ assertion-error@2.0.1:
1291
+ resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
1292
+ engines: {node: '>=12'}
1293
+
1294
  asynckit@0.4.0:
1295
  resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
1296
 
 
1311
  bl@4.1.0:
1312
  resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
1313
 
1314
+ boolean@3.2.0:
1315
+ resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==}
1316
+ deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
1317
+
1318
  brace-expansion@1.1.11:
1319
  resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
1320
 
 
1328
  buffer@5.7.1:
1329
  resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
1330
 
1331
+ cac@6.7.14:
1332
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
1333
+ engines: {node: '>=8'}
1334
+
1335
  call-bind-apply-helpers@1.0.2:
1336
  resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
1337
  engines: {node: '>= 0.4'}
 
1343
  ccount@2.0.1:
1344
  resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
1345
 
1346
+ chai@5.2.0:
1347
+ resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==}
1348
+ engines: {node: '>=12'}
1349
+
1350
+ chalk@3.0.0:
1351
+ resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
1352
+ engines: {node: '>=8'}
1353
+
1354
  chalk@4.1.2:
1355
  resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
1356
  engines: {node: '>=10'}
 
1364
  chardet@0.7.0:
1365
  resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
1366
 
1367
+ check-error@2.1.1:
1368
+ resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
1369
+ engines: {node: '>= 16'}
1370
+
1371
  chokidar@4.0.3:
1372
  resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
1373
  engines: {node: '>= 14.16.0'}
 
1455
  resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
1456
  engines: {node: '>= 8'}
1457
 
1458
+ css.escape@1.5.1:
1459
+ resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
1460
+
1461
  cssesc@3.0.0:
1462
  resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
1463
  engines: {node: '>=4'}
1464
  hasBin: true
1465
 
1466
+ cssstyle@4.3.1:
1467
+ resolution: {integrity: sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==}
1468
+ engines: {node: '>=18'}
1469
+
1470
+ data-urls@5.0.0:
1471
+ resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
1472
+ engines: {node: '>=18'}
1473
+
1474
  debug@4.4.0:
1475
  resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
1476
  engines: {node: '>=6.0'}
 
1480
  supports-color:
1481
  optional: true
1482
 
1483
+ decimal.js@10.5.0:
1484
+ resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==}
1485
+
1486
+ deep-eql@5.0.2:
1487
+ resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
1488
+ engines: {node: '>=6'}
1489
+
1490
  deep-is@0.1.4:
1491
  resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
1492
 
 
1497
  defaults@1.0.4:
1498
  resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
1499
 
1500
+ define-data-property@1.1.4:
1501
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
1502
+ engines: {node: '>= 0.4'}
1503
+
1504
+ define-properties@1.2.1:
1505
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
1506
+ engines: {node: '>= 0.4'}
1507
+
1508
  defu@6.1.4:
1509
  resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
1510
 
 
1521
  engines: {node: '>=0.10'}
1522
  hasBin: true
1523
 
1524
+ detect-libc@2.0.4:
1525
+ resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==}
1526
  engines: {node: '>=8'}
1527
 
1528
+ detect-node@2.1.0:
1529
+ resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
1530
+
1531
  devalue@5.1.1:
1532
  resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==}
1533
 
 
1541
  resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
1542
  engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
1543
 
1544
+ dom-accessibility-api@0.5.16:
1545
+ resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
1546
+
1547
+ dom-accessibility-api@0.6.3:
1548
+ resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
1549
+
1550
  dotenv@16.5.0:
1551
  resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==}
1552
  engines: {node: '>=12'}
 
1566
  resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
1567
  engines: {node: '>=10.13.0'}
1568
 
1569
+ entities@6.0.0:
1570
+ resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==}
1571
+ engines: {node: '>=0.12'}
1572
+
1573
  es-define-property@1.0.1:
1574
  resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
1575
  engines: {node: '>= 0.4'}
 
1578
  resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
1579
  engines: {node: '>= 0.4'}
1580
 
1581
+ es-module-lexer@1.7.0:
1582
+ resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
1583
+
1584
  es-object-atoms@1.1.1:
1585
  resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
1586
  engines: {node: '>= 0.4'}
 
1589
  resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
1590
  engines: {node: '>= 0.4'}
1591
 
1592
+ es6-error@4.1.1:
1593
+ resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==}
1594
+
1595
  esbuild@0.21.5:
1596
  resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
1597
  engines: {node: '>=12'}
 
1692
  estree-walker@2.0.2:
1693
  resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
1694
 
1695
+ estree-walker@3.0.3:
1696
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
1697
+
1698
  esutils@2.0.3:
1699
  resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
1700
  engines: {node: '>=0.10.0'}
 
1703
  resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
1704
  engines: {node: '>=6'}
1705
 
1706
+ expect-type@1.2.1:
1707
+ resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==}
1708
+ engines: {node: '>=12.0.0'}
1709
+
1710
  exsolve@1.0.4:
1711
  resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==}
1712
 
 
1741
  picomatch:
1742
  optional: true
1743
 
1744
+ fdir@6.4.4:
1745
+ resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==}
1746
+ peerDependencies:
1747
+ picomatch: ^3 || ^4
1748
+ peerDependenciesMeta:
1749
+ picomatch:
1750
+ optional: true
1751
+
1752
  figures@3.2.0:
1753
  resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
1754
  engines: {node: '>=8'}
 
1818
  resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
1819
  engines: {node: '>=10.13.0'}
1820
 
1821
+ global-agent@3.0.0:
1822
+ resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==}
1823
+ engines: {node: '>=10.0'}
1824
+
1825
  global-prefix@4.0.0:
1826
  resolution: {integrity: sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==}
1827
  engines: {node: '>=16'}
 
1838
  resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==}
1839
  engines: {node: '>=18'}
1840
 
1841
+ globalthis@1.0.4:
1842
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
1843
+ engines: {node: '>= 0.4'}
1844
+
1845
  gopd@1.2.0:
1846
  resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
1847
  engines: {node: '>= 0.4'}
 
1863
  resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==}
1864
  engines: {node: '>=8'}
1865
 
1866
+ has-property-descriptors@1.0.2:
1867
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
1868
+
1869
  has-symbols@1.1.0:
1870
  resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
1871
  engines: {node: '>= 0.4'}
 
1888
  resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
1889
  engines: {node: '>=12.0.0'}
1890
 
1891
+ html-encoding-sniffer@4.0.0:
1892
+ resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
1893
+ engines: {node: '>=18'}
1894
+
1895
  html-void-elements@3.0.0:
1896
  resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
1897
 
1898
+ http-proxy-agent@7.0.2:
1899
+ resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
1900
+ engines: {node: '>= 14'}
1901
+
1902
+ https-proxy-agent@7.0.6:
1903
+ resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
1904
+ engines: {node: '>= 14'}
1905
+
1906
  humanize-ms@1.2.1:
1907
  resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
1908
 
 
1910
  resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
1911
  engines: {node: '>=0.10.0'}
1912
 
1913
+ iconv-lite@0.6.3:
1914
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
1915
+ engines: {node: '>=0.10.0'}
1916
+
1917
  ieee754@1.2.1:
1918
  resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
1919
 
 
1932
  resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
1933
  engines: {node: '>=0.8.19'}
1934
 
1935
+ indent-string@4.0.0:
1936
+ resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
1937
+ engines: {node: '>=8'}
1938
+
1939
  inherits@2.0.4:
1940
  resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
1941
 
 
1977
  resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
1978
  engines: {node: '>=0.12.0'}
1979
 
1980
+ is-potential-custom-element-name@1.0.1:
1981
+ resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
1982
+
1983
  is-reference@1.2.1:
1984
  resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
1985
 
 
2017
  resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
2018
  hasBin: true
2019
 
2020
+ js-tokens@4.0.0:
2021
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
2022
+
2023
  js-yaml@4.1.0:
2024
  resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
2025
  hasBin: true
2026
 
2027
+ jsdom@26.1.0:
2028
+ resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==}
2029
+ engines: {node: '>=18'}
2030
+ peerDependencies:
2031
+ canvas: ^3.0.0
2032
+ peerDependenciesMeta:
2033
+ canvas:
2034
+ optional: true
2035
+
2036
  json-buffer@3.0.1:
2037
  resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
2038
 
 
2042
  json-stable-stringify-without-jsonify@1.0.1:
2043
  resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
2044
 
2045
+ json-stringify-safe@5.0.1:
2046
+ resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
2047
+
2048
  keyv@4.5.4:
2049
  resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
2050
 
 
2162
  long@5.3.1:
2163
  resolution: {integrity: sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==}
2164
 
2165
+ loupe@3.1.3:
2166
+ resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==}
2167
+
2168
+ lru-cache@10.4.3:
2169
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
2170
+
2171
+ lz-string@1.5.0:
2172
+ resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
2173
+ hasBin: true
2174
+
2175
  magic-string@0.30.17:
2176
  resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
2177
 
2178
+ matcher@3.0.0:
2179
+ resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==}
2180
+ engines: {node: '>=10'}
2181
+
2182
  math-intrinsics@1.1.0:
2183
  resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
2184
  engines: {node: '>= 0.4'}
 
2227
  resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
2228
  engines: {node: '>=6'}
2229
 
2230
+ min-indent@1.0.1:
2231
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
2232
+ engines: {node: '>=4'}
2233
+
2234
  minimatch@3.1.2:
2235
  resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
2236
 
 
2297
  encoding:
2298
  optional: true
2299
 
2300
+ nwsapi@2.2.20:
2301
+ resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==}
2302
+
2303
+ object-keys@1.1.1:
2304
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
2305
+ engines: {node: '>= 0.4'}
2306
+
2307
  onetime@5.1.2:
2308
  resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
2309
  engines: {node: '>=6'}
 
2314
  oniguruma-to-es@4.3.3:
2315
  resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==}
2316
 
2317
+ onnxruntime-common@1.21.0:
2318
+ resolution: {integrity: sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ==}
2319
 
2320
+ onnxruntime-common@1.22.0-dev.20250409-89f8206ba4:
2321
+ resolution: {integrity: sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLueuFc5DuYwjIZUBrSvx/fO5IrLjLz+oTrB3pcGlhovQ==}
2322
 
2323
+ onnxruntime-node@1.21.0:
2324
+ resolution: {integrity: sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw==}
2325
  os: [win32, darwin, linux]
2326
 
2327
+ onnxruntime-web@1.22.0-dev.20250409-89f8206ba4:
2328
+ resolution: {integrity: sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC4PkrR8mBX8LtNUFZO25IQBqV2Hx2ho3FlbQ==}
2329
 
2330
  openai@4.90.0:
2331
  resolution: {integrity: sha512-YCuHMMycqtCg1B8G9ezkOF0j8UnBWD3Al/zYaelpuXwU1yhCEv+Y4n9G20MnyGy6cH4GsFwOMrgstQ+bgG1PtA==}
 
2374
  resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
2375
  engines: {node: '>=6'}
2376
 
2377
+ parse5@7.3.0:
2378
+ resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
2379
+
2380
  path-exists@4.0.0:
2381
  resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
2382
  engines: {node: '>=8'}
 
2398
  pathe@2.0.3:
2399
  resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
2400
 
2401
+ pathval@2.0.0:
2402
+ resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
2403
+ engines: {node: '>= 14.16'}
2404
+
2405
  picocolors@1.1.1:
2406
  resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
2407
 
 
2532
  engines: {node: '>=14'}
2533
  hasBin: true
2534
 
2535
+ pretty-format@27.5.1:
2536
+ resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
2537
+ engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
2538
+
2539
  pretty-format@29.7.0:
2540
  resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
2541
  engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
 
2561
  resolution: {integrity: sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==}
2562
  engines: {node: '>=4'}
2563
 
2564
+ react-is@17.0.2:
2565
+ resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
2566
+
2567
  react-is@18.3.1:
2568
  resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
2569
 
 
2575
  resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
2576
  engines: {node: '>= 14.18.0'}
2577
 
2578
+ redent@3.0.0:
2579
+ resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
2580
+ engines: {node: '>=8'}
2581
+
2582
  reflect-metadata@0.1.14:
2583
  resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==}
2584
 
 
2619
  resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
2620
  engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
2621
 
2622
+ roarr@2.15.4:
2623
+ resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==}
2624
+ engines: {node: '>=8.0'}
2625
+
2626
  rollup@4.34.9:
2627
  resolution: {integrity: sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==}
2628
  engines: {node: '>=18.0.0', npm: '>=8.0.0'}
2629
  hasBin: true
2630
 
2631
+ rrweb-cssom@0.8.0:
2632
+ resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==}
2633
+
2634
  run-async@2.4.1:
2635
  resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
2636
  engines: {node: '>=0.12.0'}
 
2661
  safer-buffer@2.1.2:
2662
  resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
2663
 
2664
+ saxes@6.0.0:
2665
+ resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
2666
+ engines: {node: '>=v12.22.7'}
2667
+
2668
+ semver-compare@1.0.0:
2669
+ resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==}
2670
+
2671
  semver@7.7.1:
2672
  resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==}
2673
  engines: {node: '>=10'}
2674
  hasBin: true
2675
 
2676
+ semver@7.7.2:
2677
+ resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
2678
+ engines: {node: '>=10'}
2679
+ hasBin: true
2680
+
2681
+ serialize-error@7.0.1:
2682
+ resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==}
2683
+ engines: {node: '>=10'}
2684
+
2685
  set-cookie-parser@2.7.1:
2686
  resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==}
2687
 
2688
+ sharp@0.34.2:
2689
+ resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==}
2690
  engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
2691
 
2692
  shebang-command@2.0.0:
 
2700
  shiki@3.4.0:
2701
  resolution: {integrity: sha512-Ni80XHcqhOEXv5mmDAvf5p6PAJqbUc/RzFeaOqk+zP5DLvTPS3j0ckvA+MI87qoxTQ5RGJDVTbdl/ENLSyyAnQ==}
2702
 
2703
+ siginfo@2.0.0:
2704
+ resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
2705
+
2706
  signal-exit@3.0.7:
2707
  resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
2708
 
 
2720
  space-separated-tokens@2.0.2:
2721
  resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
2722
 
2723
+ sprintf-js@1.1.3:
2724
+ resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==}
2725
+
2726
+ stackback@0.0.2:
2727
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
2728
+
2729
+ std-env@3.9.0:
2730
+ resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==}
2731
+
2732
  string-width@4.2.3:
2733
  resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
2734
  engines: {node: '>=8'}
 
2743
  resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
2744
  engines: {node: '>=8'}
2745
 
2746
+ strip-indent@3.0.0:
2747
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
2748
+ engines: {node: '>=8'}
2749
+
2750
  strip-json-comments@3.1.1:
2751
  resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
2752
  engines: {node: '>=8'}
 
2780
  resolution: {integrity: sha512-QIYtKnJGkubWXtNkrUBKVCvyo9gjcccdbnvXfwsGNhvbeNNdQjRDTa/BiQcJ2kWXbXPQbWKyT7CUu53KIj1rfw==}
2781
  engines: {node: '>=18'}
2782
 
2783
+ symbol-tree@3.2.4:
2784
+ resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
2785
+
2786
  synckit@0.9.2:
2787
  resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
2788
  engines: {node: ^14.18.0 || >=16.0.0}
 
2804
  through@2.3.8:
2805
  resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
2806
 
2807
+ tinybench@2.9.0:
2808
+ resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
2809
+
2810
  tinyexec@0.3.2:
2811
  resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
2812
 
2813
+ tinyglobby@0.2.13:
2814
+ resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==}
2815
+ engines: {node: '>=12.0.0'}
2816
+
2817
+ tinypool@1.0.2:
2818
+ resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==}
2819
+ engines: {node: ^18.0.0 || >=20.0.0}
2820
+
2821
+ tinyrainbow@2.0.0:
2822
+ resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==}
2823
+ engines: {node: '>=14.0.0'}
2824
+
2825
+ tinyspy@3.0.2:
2826
+ resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
2827
+ engines: {node: '>=14.0.0'}
2828
+
2829
+ tldts-core@6.1.86:
2830
+ resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==}
2831
+
2832
+ tldts@6.1.86:
2833
+ resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==}
2834
+ hasBin: true
2835
+
2836
  tmp@0.0.33:
2837
  resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
2838
  engines: {node: '>=0.6.0'}
 
2845
  resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
2846
  engines: {node: '>=6'}
2847
 
2848
+ tough-cookie@5.1.2:
2849
+ resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==}
2850
+ engines: {node: '>=16'}
2851
+
2852
  tr46@0.0.3:
2853
  resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
2854
 
2855
+ tr46@5.1.1:
2856
+ resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==}
2857
+ engines: {node: '>=18'}
2858
+
2859
  trim-lines@3.0.1:
2860
  resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
2861
 
 
2876
  resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
2877
  engines: {node: '>= 0.8.0'}
2878
 
2879
+ type-fest@0.13.1:
2880
+ resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==}
2881
+ engines: {node: '>=10'}
2882
+
2883
  type-fest@0.21.3:
2884
  resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
2885
  engines: {node: '>=10'}
 
2990
  vfile@6.0.3:
2991
  resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
2992
 
2993
+ vite-node@3.1.4:
2994
+ resolution: {integrity: sha512-6enNwYnpyDo4hEgytbmc6mYWHXDHYEn0D1/rw4Q+tnHUGtKTJsn8T1YkX6Q18wI5LCrS8CTYlBaiCqxOy2kvUA==}
2995
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
2996
+ hasBin: true
2997
+
2998
  vite@5.4.14:
2999
  resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==}
3000
  engines: {node: ^18.0.0 || >=20.0.0}
 
3074
  vite:
3075
  optional: true
3076
 
3077
+ vitest@3.1.4:
3078
+ resolution: {integrity: sha512-Ta56rT7uWxCSJXlBtKgIlApJnT6e6IGmTYxYcmxjJ4ujuZDI59GUQgVDObXXJujOmPDBYXHK1qmaGtneu6TNIQ==}
3079
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
3080
+ hasBin: true
3081
+ peerDependencies:
3082
+ '@edge-runtime/vm': '*'
3083
+ '@types/debug': ^4.1.12
3084
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
3085
+ '@vitest/browser': 3.1.4
3086
+ '@vitest/ui': 3.1.4
3087
+ happy-dom: '*'
3088
+ jsdom: '*'
3089
+ peerDependenciesMeta:
3090
+ '@edge-runtime/vm':
3091
+ optional: true
3092
+ '@types/debug':
3093
+ optional: true
3094
+ '@types/node':
3095
+ optional: true
3096
+ '@vitest/browser':
3097
+ optional: true
3098
+ '@vitest/ui':
3099
+ optional: true
3100
+ happy-dom:
3101
+ optional: true
3102
+ jsdom:
3103
+ optional: true
3104
+
3105
+ w3c-xmlserializer@5.0.0:
3106
+ resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
3107
+ engines: {node: '>=18'}
3108
+
3109
  wcwidth@1.0.1:
3110
  resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
3111
 
 
3116
  webidl-conversions@3.0.1:
3117
  resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
3118
 
3119
+ webidl-conversions@7.0.0:
3120
+ resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
3121
+ engines: {node: '>=12'}
3122
+
3123
  webpack-virtual-modules@0.6.2:
3124
  resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
3125
 
3126
+ whatwg-encoding@3.1.1:
3127
+ resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
3128
+ engines: {node: '>=18'}
3129
+
3130
+ whatwg-mimetype@4.0.0:
3131
+ resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
3132
+ engines: {node: '>=18'}
3133
+
3134
+ whatwg-url@14.2.0:
3135
+ resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==}
3136
+ engines: {node: '>=18'}
3137
+
3138
  whatwg-url@5.0.0:
3139
  resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
3140
 
 
3148
  engines: {node: ^16.13.0 || >=18.0.0}
3149
  hasBin: true
3150
 
3151
+ why-is-node-running@2.3.0:
3152
+ resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
3153
+ engines: {node: '>=8'}
3154
+ hasBin: true
3155
+
3156
  word-wrap@1.2.5:
3157
  resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
3158
  engines: {node: '>=0.10.0'}
 
3161
  resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
3162
  engines: {node: '>=8'}
3163
 
3164
+ ws@8.18.2:
3165
+ resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==}
3166
+ engines: {node: '>=10.0.0'}
3167
+ peerDependencies:
3168
+ bufferutil: ^4.0.1
3169
+ utf-8-validate: '>=5.0.2'
3170
+ peerDependenciesMeta:
3171
+ bufferutil:
3172
+ optional: true
3173
+ utf-8-validate:
3174
+ optional: true
3175
+
3176
+ xml-name-validator@5.0.0:
3177
+ resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
3178
+ engines: {node: '>=18'}
3179
+
3180
+ xmlchars@2.2.0:
3181
+ resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
3182
+
3183
  yallist@5.0.0:
3184
  resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
3185
  engines: {node: '>=18'}
 
3209
 
3210
  snapshots:
3211
 
3212
+ '@adobe/css-tools@4.4.3': {}
3213
+
3214
  '@alloc/quick-lru@5.2.0': {}
3215
 
3216
  '@ampproject/remapping@2.3.0':
 
3225
 
3226
  '@antfu/utils@8.1.1': {}
3227
 
3228
+ '@asamuzakjp/css-color@3.2.0':
3229
+ dependencies:
3230
+ '@csstools/css-calc': 2.1.3(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
3231
+ '@csstools/css-color-parser': 3.0.9(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
3232
+ '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
3233
+ '@csstools/css-tokenizer': 3.0.3
3234
+ lru-cache: 10.4.3
3235
+
3236
+ '@babel/code-frame@7.27.1':
3237
+ dependencies:
3238
+ '@babel/helper-validator-identifier': 7.27.1
3239
+ js-tokens: 4.0.0
3240
+ picocolors: 1.1.1
3241
+
3242
+ '@babel/helper-validator-identifier@7.27.1': {}
3243
+
3244
+ '@babel/runtime@7.27.1': {}
3245
+
3246
+ '@csstools/color-helpers@5.0.2': {}
3247
+
3248
+ '@csstools/css-calc@2.1.3(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)':
3249
+ dependencies:
3250
+ '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
3251
+ '@csstools/css-tokenizer': 3.0.3
3252
+
3253
+ '@csstools/css-color-parser@3.0.9(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)':
3254
+ dependencies:
3255
+ '@csstools/color-helpers': 5.0.2
3256
+ '@csstools/css-calc': 2.1.3(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
3257
+ '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
3258
+ '@csstools/css-tokenizer': 3.0.3
3259
+
3260
+ '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)':
3261
+ dependencies:
3262
+ '@csstools/css-tokenizer': 3.0.3
3263
+
3264
+ '@csstools/css-tokenizer@3.0.3': {}
3265
+
3266
+ '@emnapi/runtime@1.4.3':
3267
  dependencies:
3268
  tslib: 2.8.1
3269
  optional: true
 
3467
 
3468
  '@floating-ui/utils@0.2.9': {}
3469
 
3470
+ '@huggingface/hub@2.1.0':
3471
  dependencies:
3472
+ '@huggingface/tasks': 0.19.8
3473
 
3474
+ '@huggingface/inference@3.13.2':
3475
  dependencies:
3476
+ '@huggingface/jinja': 0.5.0
3477
+ '@huggingface/tasks': 0.19.8
3478
 
3479
+ '@huggingface/jinja@0.4.1': {}
3480
 
3481
+ '@huggingface/jinja@0.5.0': {}
3482
 
3483
+ '@huggingface/tasks@0.19.8': {}
3484
 
3485
+ '@huggingface/transformers@3.5.1':
3486
  dependencies:
3487
+ '@huggingface/jinja': 0.4.1
3488
+ onnxruntime-node: 1.21.0
3489
+ onnxruntime-web: 1.22.0-dev.20250409-89f8206ba4
3490
+ sharp: 0.34.2
3491
 
3492
  '@humanfs/core@0.19.1': {}
3493
 
 
3525
  transitivePeerDependencies:
3526
  - supports-color
3527
 
3528
+ '@img/sharp-darwin-arm64@0.34.2':
3529
  optionalDependencies:
3530
+ '@img/sharp-libvips-darwin-arm64': 1.1.0
3531
  optional: true
3532
 
3533
+ '@img/sharp-darwin-x64@0.34.2':
3534
  optionalDependencies:
3535
+ '@img/sharp-libvips-darwin-x64': 1.1.0
3536
  optional: true
3537
 
3538
+ '@img/sharp-libvips-darwin-arm64@1.1.0':
3539
  optional: true
3540
 
3541
+ '@img/sharp-libvips-darwin-x64@1.1.0':
3542
  optional: true
3543
 
3544
+ '@img/sharp-libvips-linux-arm64@1.1.0':
3545
  optional: true
3546
 
3547
+ '@img/sharp-libvips-linux-arm@1.1.0':
3548
  optional: true
3549
 
3550
+ '@img/sharp-libvips-linux-ppc64@1.1.0':
3551
  optional: true
3552
 
3553
+ '@img/sharp-libvips-linux-s390x@1.1.0':
3554
  optional: true
3555
 
3556
+ '@img/sharp-libvips-linux-x64@1.1.0':
3557
  optional: true
3558
 
3559
+ '@img/sharp-libvips-linuxmusl-arm64@1.1.0':
3560
  optional: true
3561
 
3562
+ '@img/sharp-libvips-linuxmusl-x64@1.1.0':
3563
+ optional: true
3564
+
3565
+ '@img/sharp-linux-arm64@0.34.2':
3566
  optionalDependencies:
3567
+ '@img/sharp-libvips-linux-arm64': 1.1.0
3568
  optional: true
3569
 
3570
+ '@img/sharp-linux-arm@0.34.2':
3571
  optionalDependencies:
3572
+ '@img/sharp-libvips-linux-arm': 1.1.0
3573
  optional: true
3574
 
3575
+ '@img/sharp-linux-s390x@0.34.2':
3576
  optionalDependencies:
3577
+ '@img/sharp-libvips-linux-s390x': 1.1.0
3578
  optional: true
3579
 
3580
+ '@img/sharp-linux-x64@0.34.2':
3581
  optionalDependencies:
3582
+ '@img/sharp-libvips-linux-x64': 1.1.0
3583
  optional: true
3584
 
3585
+ '@img/sharp-linuxmusl-arm64@0.34.2':
3586
  optionalDependencies:
3587
+ '@img/sharp-libvips-linuxmusl-arm64': 1.1.0
3588
  optional: true
3589
 
3590
+ '@img/sharp-linuxmusl-x64@0.34.2':
3591
  optionalDependencies:
3592
+ '@img/sharp-libvips-linuxmusl-x64': 1.1.0
3593
  optional: true
3594
 
3595
+ '@img/sharp-wasm32@0.34.2':
3596
  dependencies:
3597
+ '@emnapi/runtime': 1.4.3
3598
+ optional: true
3599
+
3600
+ '@img/sharp-win32-arm64@0.34.2':
3601
  optional: true
3602
 
3603
+ '@img/sharp-win32-ia32@0.34.2':
3604
  optional: true
3605
 
3606
+ '@img/sharp-win32-x64@0.34.2':
3607
  optional: true
3608
 
3609
  '@isaacs/fs-minipass@4.0.1':
 
3958
  postcss: 8.5.3
3959
  tailwindcss: 4.0.9
3960
 
3961
+ '@testing-library/dom@10.4.0':
3962
+ dependencies:
3963
+ '@babel/code-frame': 7.27.1
3964
+ '@babel/runtime': 7.27.1
3965
+ '@types/aria-query': 5.0.4
3966
+ aria-query: 5.3.0
3967
+ chalk: 4.1.2
3968
+ dom-accessibility-api: 0.5.16
3969
+ lz-string: 1.5.0
3970
+ pretty-format: 27.5.1
3971
+
3972
+ '@testing-library/jest-dom@6.6.3':
3973
+ dependencies:
3974
+ '@adobe/css-tools': 4.4.3
3975
+ aria-query: 5.3.2
3976
+ chalk: 3.0.0
3977
+ css.escape: 1.5.1
3978
+ dom-accessibility-api: 0.6.3
3979
+ lodash: 4.17.21
3980
+ redent: 3.0.0
3981
+
3982
+ '@testing-library/svelte@5.2.8(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1))(vitest@3.1.4(@types/node@22.14.1)(jsdom@26.1.0)(lightningcss@1.29.1))':
3983
+ dependencies:
3984
+ '@testing-library/dom': 10.4.0
3985
+ svelte: 5.30.1
3986
+ optionalDependencies:
3987
+ vite: 5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)
3988
+ vitest: 3.1.4(@types/node@22.14.1)(jsdom@26.1.0)(lightningcss@1.29.1)
3989
+
3990
+ '@types/aria-query@5.0.4': {}
3991
+
3992
  '@types/cookie@0.6.0': {}
3993
 
3994
  '@types/estree@1.0.6': {}
 
4099
 
4100
  '@ungap/structured-clone@1.3.0': {}
4101
 
4102
+ '@vitest/expect@3.1.4':
4103
+ dependencies:
4104
+ '@vitest/spy': 3.1.4
4105
+ '@vitest/utils': 3.1.4
4106
+ chai: 5.2.0
4107
+ tinyrainbow: 2.0.0
4108
+
4109
+ '@vitest/mocker@3.1.4(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1))':
4110
+ dependencies:
4111
+ '@vitest/spy': 3.1.4
4112
+ estree-walker: 3.0.3
4113
+ magic-string: 0.30.17
4114
+ optionalDependencies:
4115
+ vite: 5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)
4116
+
4117
+ '@vitest/pretty-format@3.1.4':
4118
+ dependencies:
4119
+ tinyrainbow: 2.0.0
4120
+
4121
+ '@vitest/runner@3.1.4':
4122
+ dependencies:
4123
+ '@vitest/utils': 3.1.4
4124
+ pathe: 2.0.3
4125
+
4126
+ '@vitest/snapshot@3.1.4':
4127
+ dependencies:
4128
+ '@vitest/pretty-format': 3.1.4
4129
+ magic-string: 0.30.17
4130
+ pathe: 2.0.3
4131
+
4132
+ '@vitest/spy@3.1.4':
4133
+ dependencies:
4134
+ tinyspy: 3.0.2
4135
+
4136
+ '@vitest/utils@3.1.4':
4137
+ dependencies:
4138
+ '@vitest/pretty-format': 3.1.4
4139
+ loupe: 3.1.3
4140
+ tinyrainbow: 2.0.0
4141
+
4142
  abort-controller@3.0.0:
4143
  dependencies:
4144
  event-target-shim: 5.0.1
 
4149
 
4150
  acorn@8.14.0: {}
4151
 
4152
+ agent-base@7.1.3: {}
4153
+
4154
  agentkeepalive@4.6.0:
4155
  dependencies:
4156
  humanize-ms: 1.2.1
 
4176
 
4177
  argparse@2.0.1: {}
4178
 
4179
+ aria-query@5.3.0:
4180
+ dependencies:
4181
+ dequal: 2.0.3
4182
+
4183
  aria-query@5.3.2: {}
4184
 
4185
  array-timsort@1.0.3: {}
4186
 
4187
+ assertion-error@2.0.1: {}
4188
+
4189
  asynckit@0.4.0: {}
4190
 
4191
  axe-core@4.9.1: {}
 
4202
  inherits: 2.0.4
4203
  readable-stream: 3.6.2
4204
 
4205
+ boolean@3.2.0: {}
4206
+
4207
  brace-expansion@1.1.11:
4208
  dependencies:
4209
  balanced-match: 1.0.2
 
4222
  base64-js: 1.5.1
4223
  ieee754: 1.2.1
4224
 
4225
+ cac@6.7.14: {}
4226
+
4227
  call-bind-apply-helpers@1.0.2:
4228
  dependencies:
4229
  es-errors: 1.3.0
 
4233
 
4234
  ccount@2.0.1: {}
4235
 
4236
+ chai@5.2.0:
4237
+ dependencies:
4238
+ assertion-error: 2.0.1
4239
+ check-error: 2.1.1
4240
+ deep-eql: 5.0.2
4241
+ loupe: 3.1.3
4242
+ pathval: 2.0.0
4243
+
4244
+ chalk@3.0.0:
4245
+ dependencies:
4246
+ ansi-styles: 4.3.0
4247
+ supports-color: 7.2.0
4248
+
4249
  chalk@4.1.2:
4250
  dependencies:
4251
  ansi-styles: 4.3.0
 
4257
 
4258
  chardet@0.7.0: {}
4259
 
4260
+ check-error@2.1.1: {}
4261
+
4262
  chokidar@4.0.3:
4263
  dependencies:
4264
  readdirp: 4.1.2
 
4331
  shebang-command: 2.0.0
4332
  which: 2.0.2
4333
 
4334
+ css.escape@1.5.1: {}
4335
+
4336
  cssesc@3.0.0: {}
4337
 
4338
+ cssstyle@4.3.1:
4339
+ dependencies:
4340
+ '@asamuzakjp/css-color': 3.2.0
4341
+ rrweb-cssom: 0.8.0
4342
+
4343
+ data-urls@5.0.0:
4344
+ dependencies:
4345
+ whatwg-mimetype: 4.0.0
4346
+ whatwg-url: 14.2.0
4347
+
4348
  debug@4.4.0:
4349
  dependencies:
4350
  ms: 2.1.3
4351
 
4352
+ decimal.js@10.5.0: {}
4353
+
4354
+ deep-eql@5.0.2: {}
4355
+
4356
  deep-is@0.1.4: {}
4357
 
4358
  deepmerge@4.3.1: {}
 
4361
  dependencies:
4362
  clone: 1.0.4
4363
 
4364
+ define-data-property@1.1.4:
4365
+ dependencies:
4366
+ es-define-property: 1.0.1
4367
+ es-errors: 1.3.0
4368
+ gopd: 1.2.0
4369
+
4370
+ define-properties@1.2.1:
4371
+ dependencies:
4372
+ define-data-property: 1.1.4
4373
+ has-property-descriptors: 1.0.2
4374
+ object-keys: 1.1.1
4375
+
4376
  defu@6.1.4: {}
4377
 
4378
  delayed-stream@1.0.0: {}
 
4381
 
4382
  detect-libc@1.0.3: {}
4383
 
4384
+ detect-libc@2.0.4: {}
4385
+
4386
+ detect-node@2.1.0: {}
4387
 
4388
  devalue@5.1.1: {}
4389
 
 
4395
 
4396
  diff-sequences@29.6.3: {}
4397
 
4398
+ dom-accessibility-api@0.5.16: {}
4399
+
4400
+ dom-accessibility-api@0.6.3: {}
4401
+
4402
  dotenv@16.5.0: {}
4403
 
4404
  drange@1.1.1: {}
 
4416
  graceful-fs: 4.2.11
4417
  tapable: 2.2.1
4418
 
4419
+ entities@6.0.0: {}
4420
+
4421
  es-define-property@1.0.1: {}
4422
 
4423
  es-errors@1.3.0: {}
4424
 
4425
+ es-module-lexer@1.7.0: {}
4426
+
4427
  es-object-atoms@1.1.1:
4428
  dependencies:
4429
  es-errors: 1.3.0
 
4435
  has-tostringtag: 1.0.2
4436
  hasown: 2.0.2
4437
 
4438
+ es6-error@4.1.1: {}
4439
+
4440
  esbuild@0.21.5:
4441
  optionalDependencies:
4442
  '@esbuild/aix-ppc64': 0.21.5
 
4602
 
4603
  estree-walker@2.0.2: {}
4604
 
4605
+ estree-walker@3.0.3:
4606
+ dependencies:
4607
+ '@types/estree': 1.0.6
4608
+
4609
  esutils@2.0.3: {}
4610
 
4611
  event-target-shim@5.0.1: {}
4612
 
4613
+ expect-type@1.2.1: {}
4614
+
4615
  exsolve@1.0.4: {}
4616
 
4617
  external-editor@3.1.0:
 
4644
  optionalDependencies:
4645
  picomatch: 4.0.2
4646
 
4647
+ fdir@6.4.4(picomatch@4.0.2):
4648
+ optionalDependencies:
4649
+ picomatch: 4.0.2
4650
+
4651
  figures@3.2.0:
4652
  dependencies:
4653
  escape-string-regexp: 1.0.5
 
4729
  dependencies:
4730
  is-glob: 4.0.3
4731
 
4732
+ global-agent@3.0.0:
4733
+ dependencies:
4734
+ boolean: 3.2.0
4735
+ es6-error: 4.1.1
4736
+ matcher: 3.0.0
4737
+ roarr: 2.15.4
4738
+ semver: 7.7.1
4739
+ serialize-error: 7.0.1
4740
+
4741
  global-prefix@4.0.0:
4742
  dependencies:
4743
  ini: 4.1.3
 
4750
 
4751
  globals@16.0.0: {}
4752
 
4753
+ globalthis@1.0.4:
4754
+ dependencies:
4755
+ define-properties: 1.2.1
4756
+ gopd: 1.2.0
4757
+
4758
  gopd@1.2.0: {}
4759
 
4760
  graceful-fs@4.2.11: {}
 
4767
 
4768
  has-own-prop@2.0.0: {}
4769
 
4770
+ has-property-descriptors@1.0.2:
4771
+ dependencies:
4772
+ es-define-property: 1.0.1
4773
+
4774
  has-symbols@1.1.0: {}
4775
 
4776
  has-tostringtag@1.0.2:
 
4801
 
4802
  highlight.js@11.11.1: {}
4803
 
4804
+ html-encoding-sniffer@4.0.0:
4805
+ dependencies:
4806
+ whatwg-encoding: 3.1.1
4807
+
4808
  html-void-elements@3.0.0: {}
4809
 
4810
+ http-proxy-agent@7.0.2:
4811
+ dependencies:
4812
+ agent-base: 7.1.3
4813
+ debug: 4.4.0
4814
+ transitivePeerDependencies:
4815
+ - supports-color
4816
+
4817
+ https-proxy-agent@7.0.6:
4818
+ dependencies:
4819
+ agent-base: 7.1.3
4820
+ debug: 4.4.0
4821
+ transitivePeerDependencies:
4822
+ - supports-color
4823
+
4824
  humanize-ms@1.2.1:
4825
  dependencies:
4826
  ms: 2.1.3
 
4829
  dependencies:
4830
  safer-buffer: 2.1.2
4831
 
4832
+ iconv-lite@0.6.3:
4833
+ dependencies:
4834
+ safer-buffer: 2.1.2
4835
+
4836
  ieee754@1.2.1: {}
4837
 
4838
  ignore@5.3.2: {}
 
4846
 
4847
  imurmurhash@0.1.4: {}
4848
 
4849
+ indent-string@4.0.0: {}
4850
+
4851
  inherits@2.0.4: {}
4852
 
4853
  ini@4.1.3: {}
 
4890
 
4891
  is-number@7.0.0: {}
4892
 
4893
+ is-potential-custom-element-name@1.0.1: {}
4894
+
4895
  is-reference@1.2.1:
4896
  dependencies:
4897
  '@types/estree': 1.0.6
 
4931
 
4932
  jiti@2.4.2: {}
4933
 
4934
+ js-tokens@4.0.0: {}
4935
+
4936
  js-yaml@4.1.0:
4937
  dependencies:
4938
  argparse: 2.0.1
4939
 
4940
+ jsdom@26.1.0:
4941
+ dependencies:
4942
+ cssstyle: 4.3.1
4943
+ data-urls: 5.0.0
4944
+ decimal.js: 10.5.0
4945
+ html-encoding-sniffer: 4.0.0
4946
+ http-proxy-agent: 7.0.2
4947
+ https-proxy-agent: 7.0.6
4948
+ is-potential-custom-element-name: 1.0.1
4949
+ nwsapi: 2.2.20
4950
+ parse5: 7.3.0
4951
+ rrweb-cssom: 0.8.0
4952
+ saxes: 6.0.0
4953
+ symbol-tree: 3.2.4
4954
+ tough-cookie: 5.1.2
4955
+ w3c-xmlserializer: 5.0.0
4956
+ webidl-conversions: 7.0.0
4957
+ whatwg-encoding: 3.1.1
4958
+ whatwg-mimetype: 4.0.0
4959
+ whatwg-url: 14.2.0
4960
+ ws: 8.18.2
4961
+ xml-name-validator: 5.0.0
4962
+ transitivePeerDependencies:
4963
+ - bufferutil
4964
+ - supports-color
4965
+ - utf-8-validate
4966
+
4967
  json-buffer@3.0.1: {}
4968
 
4969
  json-schema-traverse@0.4.1: {}
4970
 
4971
  json-stable-stringify-without-jsonify@1.0.1: {}
4972
 
4973
+ json-stringify-safe@5.0.1: {}
4974
+
4975
  keyv@4.5.4:
4976
  dependencies:
4977
  json-buffer: 3.0.1
 
5063
 
5064
  long@5.3.1: {}
5065
 
5066
+ loupe@3.1.3: {}
5067
+
5068
+ lru-cache@10.4.3: {}
5069
+
5070
+ lz-string@1.5.0: {}
5071
+
5072
  magic-string@0.30.17:
5073
  dependencies:
5074
  '@jridgewell/sourcemap-codec': 1.5.0
5075
 
5076
+ matcher@3.0.0:
5077
+ dependencies:
5078
+ escape-string-regexp: 4.0.0
5079
+
5080
  math-intrinsics@1.1.0: {}
5081
 
5082
  mdast-util-to-hast@13.2.0:
 
5132
 
5133
  mimic-fn@2.1.0: {}
5134
 
5135
+ min-indent@1.0.1: {}
5136
+
5137
  minimatch@3.1.2:
5138
  dependencies:
5139
  brace-expansion: 1.1.11
 
5179
  dependencies:
5180
  whatwg-url: 5.0.0
5181
 
5182
+ nwsapi@2.2.20: {}
5183
+
5184
+ object-keys@1.1.1: {}
5185
+
5186
  onetime@5.1.2:
5187
  dependencies:
5188
  mimic-fn: 2.1.0
 
5195
  regex: 6.0.1
5196
  regex-recursion: 6.0.2
5197
 
5198
+ onnxruntime-common@1.21.0: {}
5199
 
5200
+ onnxruntime-common@1.22.0-dev.20250409-89f8206ba4: {}
5201
 
5202
+ onnxruntime-node@1.21.0:
5203
  dependencies:
5204
+ global-agent: 3.0.0
5205
+ onnxruntime-common: 1.21.0
5206
  tar: 7.4.3
5207
 
5208
+ onnxruntime-web@1.22.0-dev.20250409-89f8206ba4:
5209
  dependencies:
5210
  flatbuffers: 25.2.10
5211
  guid-typescript: 1.0.9
5212
  long: 5.3.1
5213
+ onnxruntime-common: 1.22.0-dev.20250409-89f8206ba4
5214
  platform: 1.3.6
5215
  protobufjs: 7.4.0
5216
 
5217
+ openai@4.90.0(ws@8.18.2):
5218
  dependencies:
5219
  '@types/node': 18.19.84
5220
  '@types/node-fetch': 2.6.12
 
5223
  form-data-encoder: 1.7.2
5224
  formdata-node: 4.4.1
5225
  node-fetch: 2.7.0
5226
+ optionalDependencies:
5227
+ ws: 8.18.2
5228
  transitivePeerDependencies:
5229
  - encoding
5230
 
 
5275
  dependencies:
5276
  callsites: 3.1.0
5277
 
5278
+ parse5@7.3.0:
5279
+ dependencies:
5280
+ entities: 6.0.0
5281
+
5282
  path-exists@4.0.0: {}
5283
 
5284
  path-exists@5.0.0: {}
 
5291
 
5292
  pathe@2.0.3: {}
5293
 
5294
+ pathval@2.0.0: {}
5295
+
5296
  picocolors@1.1.1: {}
5297
 
5298
  picomatch@2.3.1: {}
 
5362
 
5363
  prettier@3.5.3: {}
5364
 
5365
+ pretty-format@27.5.1:
5366
+ dependencies:
5367
+ ansi-regex: 5.0.1
5368
+ ansi-styles: 5.2.0
5369
+ react-is: 17.0.2
5370
+
5371
  pretty-format@29.7.0:
5372
  dependencies:
5373
  '@jest/schemas': 29.6.3
 
5402
  drange: 1.1.1
5403
  ret: 0.2.2
5404
 
5405
+ react-is@17.0.2: {}
5406
+
5407
  react-is@18.3.1: {}
5408
 
5409
  readable-stream@3.6.2:
 
5414
 
5415
  readdirp@4.1.2: {}
5416
 
5417
+ redent@3.0.0:
5418
+ dependencies:
5419
+ indent-string: 4.0.0
5420
+ strip-indent: 3.0.0
5421
+
5422
  reflect-metadata@0.1.14: {}
5423
 
5424
  regex-recursion@6.0.2:
 
5457
 
5458
  reusify@1.1.0: {}
5459
 
5460
+ roarr@2.15.4:
5461
+ dependencies:
5462
+ boolean: 3.2.0
5463
+ detect-node: 2.1.0
5464
+ globalthis: 1.0.4
5465
+ json-stringify-safe: 5.0.1
5466
+ semver-compare: 1.0.0
5467
+ sprintf-js: 1.1.3
5468
+
5469
  rollup@4.34.9:
5470
  dependencies:
5471
  '@types/estree': 1.0.6
 
5491
  '@rollup/rollup-win32-x64-msvc': 4.34.9
5492
  fsevents: 2.3.3
5493
 
5494
+ rrweb-cssom@0.8.0: {}
5495
+
5496
  run-async@2.4.1: {}
5497
 
5498
  run-parallel@1.2.0:
 
5521
 
5522
  safer-buffer@2.1.2: {}
5523
 
5524
+ saxes@6.0.0:
5525
+ dependencies:
5526
+ xmlchars: 2.2.0
5527
+
5528
+ semver-compare@1.0.0: {}
5529
+
5530
  semver@7.7.1: {}
5531
 
5532
+ semver@7.7.2: {}
5533
+
5534
+ serialize-error@7.0.1:
5535
+ dependencies:
5536
+ type-fest: 0.13.1
5537
+
5538
  set-cookie-parser@2.7.1: {}
5539
 
5540
+ sharp@0.34.2:
5541
  dependencies:
5542
  color: 4.2.3
5543
+ detect-libc: 2.0.4
5544
+ semver: 7.7.2
5545
  optionalDependencies:
5546
+ '@img/sharp-darwin-arm64': 0.34.2
5547
+ '@img/sharp-darwin-x64': 0.34.2
5548
+ '@img/sharp-libvips-darwin-arm64': 1.1.0
5549
+ '@img/sharp-libvips-darwin-x64': 1.1.0
5550
+ '@img/sharp-libvips-linux-arm': 1.1.0
5551
+ '@img/sharp-libvips-linux-arm64': 1.1.0
5552
+ '@img/sharp-libvips-linux-ppc64': 1.1.0
5553
+ '@img/sharp-libvips-linux-s390x': 1.1.0
5554
+ '@img/sharp-libvips-linux-x64': 1.1.0
5555
+ '@img/sharp-libvips-linuxmusl-arm64': 1.1.0
5556
+ '@img/sharp-libvips-linuxmusl-x64': 1.1.0
5557
+ '@img/sharp-linux-arm': 0.34.2
5558
+ '@img/sharp-linux-arm64': 0.34.2
5559
+ '@img/sharp-linux-s390x': 0.34.2
5560
+ '@img/sharp-linux-x64': 0.34.2
5561
+ '@img/sharp-linuxmusl-arm64': 0.34.2
5562
+ '@img/sharp-linuxmusl-x64': 0.34.2
5563
+ '@img/sharp-wasm32': 0.34.2
5564
+ '@img/sharp-win32-arm64': 0.34.2
5565
+ '@img/sharp-win32-ia32': 0.34.2
5566
+ '@img/sharp-win32-x64': 0.34.2
5567
 
5568
  shebang-command@2.0.0:
5569
  dependencies:
 
5582
  '@shikijs/vscode-textmate': 10.0.2
5583
  '@types/hast': 3.0.4
5584
 
5585
+ siginfo@2.0.0: {}
5586
+
5587
  signal-exit@3.0.7: {}
5588
 
5589
  simple-swizzle@0.2.2:
 
5600
 
5601
  space-separated-tokens@2.0.2: {}
5602
 
5603
+ sprintf-js@1.1.3: {}
5604
+
5605
+ stackback@0.0.2: {}
5606
+
5607
+ std-env@3.9.0: {}
5608
+
5609
  string-width@4.2.3:
5610
  dependencies:
5611
  emoji-regex: 8.0.0
 
5625
  dependencies:
5626
  ansi-regex: 5.0.1
5627
 
5628
+ strip-indent@3.0.0:
5629
+ dependencies:
5630
+ min-indent: 1.0.1
5631
+
5632
  strip-json-comments@3.1.1: {}
5633
 
5634
  supports-color@7.2.0:
 
5677
  magic-string: 0.30.17
5678
  zimmerframe: 1.1.2
5679
 
5680
+ symbol-tree@3.2.4: {}
5681
+
5682
  synckit@0.9.2:
5683
  dependencies:
5684
  '@pkgr/core': 0.1.1
 
5701
 
5702
  through@2.3.8: {}
5703
 
5704
+ tinybench@2.9.0: {}
5705
+
5706
  tinyexec@0.3.2: {}
5707
 
5708
+ tinyglobby@0.2.13:
5709
+ dependencies:
5710
+ fdir: 6.4.4(picomatch@4.0.2)
5711
+ picomatch: 4.0.2
5712
+
5713
+ tinypool@1.0.2: {}
5714
+
5715
+ tinyrainbow@2.0.0: {}
5716
+
5717
+ tinyspy@3.0.2: {}
5718
+
5719
+ tldts-core@6.1.86: {}
5720
+
5721
+ tldts@6.1.86:
5722
+ dependencies:
5723
+ tldts-core: 6.1.86
5724
+
5725
  tmp@0.0.33:
5726
  dependencies:
5727
  os-tmpdir: 1.0.2
 
5732
 
5733
  totalist@3.0.1: {}
5734
 
5735
+ tough-cookie@5.1.2:
5736
+ dependencies:
5737
+ tldts: 6.1.86
5738
+
5739
  tr46@0.0.3: {}
5740
 
5741
+ tr46@5.1.1:
5742
+ dependencies:
5743
+ punycode: 2.3.1
5744
+
5745
  trim-lines@3.0.1: {}
5746
 
5747
  ts-api-utils@2.0.1(typescript@5.8.2):
 
5763
  dependencies:
5764
  prelude-ls: 1.2.1
5765
 
5766
+ type-fest@0.13.1: {}
5767
+
5768
  type-fest@0.21.3: {}
5769
 
5770
  type-fest@4.37.0: {}
 
5872
  '@types/unist': 3.0.3
5873
  vfile-message: 4.0.2
5874
 
5875
+ vite-node@3.1.4(@types/node@22.14.1)(lightningcss@1.29.1):
5876
+ dependencies:
5877
+ cac: 6.7.14
5878
+ debug: 4.4.0
5879
+ es-module-lexer: 1.7.0
5880
+ pathe: 2.0.3
5881
+ vite: 5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)
5882
+ transitivePeerDependencies:
5883
+ - '@types/node'
5884
+ - less
5885
+ - lightningcss
5886
+ - sass
5887
+ - sass-embedded
5888
+ - stylus
5889
+ - sugarss
5890
+ - supports-color
5891
+ - terser
5892
+
5893
  vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1):
5894
  dependencies:
5895
  esbuild: 0.21.5
 
5916
  optionalDependencies:
5917
  vite: 5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)
5918
 
5919
+ vitest@3.1.4(@types/node@22.14.1)(jsdom@26.1.0)(lightningcss@1.29.1):
5920
+ dependencies:
5921
+ '@vitest/expect': 3.1.4
5922
+ '@vitest/mocker': 3.1.4(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1))
5923
+ '@vitest/pretty-format': 3.1.4
5924
+ '@vitest/runner': 3.1.4
5925
+ '@vitest/snapshot': 3.1.4
5926
+ '@vitest/spy': 3.1.4
5927
+ '@vitest/utils': 3.1.4
5928
+ chai: 5.2.0
5929
+ debug: 4.4.0
5930
+ expect-type: 1.2.1
5931
+ magic-string: 0.30.17
5932
+ pathe: 2.0.3
5933
+ std-env: 3.9.0
5934
+ tinybench: 2.9.0
5935
+ tinyexec: 0.3.2
5936
+ tinyglobby: 0.2.13
5937
+ tinypool: 1.0.2
5938
+ tinyrainbow: 2.0.0
5939
+ vite: 5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)
5940
+ vite-node: 3.1.4(@types/node@22.14.1)(lightningcss@1.29.1)
5941
+ why-is-node-running: 2.3.0
5942
+ optionalDependencies:
5943
+ '@types/node': 22.14.1
5944
+ jsdom: 26.1.0
5945
+ transitivePeerDependencies:
5946
+ - less
5947
+ - lightningcss
5948
+ - msw
5949
+ - sass
5950
+ - sass-embedded
5951
+ - stylus
5952
+ - sugarss
5953
+ - supports-color
5954
+ - terser
5955
+
5956
+ w3c-xmlserializer@5.0.0:
5957
+ dependencies:
5958
+ xml-name-validator: 5.0.0
5959
+
5960
  wcwidth@1.0.1:
5961
  dependencies:
5962
  defaults: 1.0.4
 
5965
 
5966
  webidl-conversions@3.0.1: {}
5967
 
5968
+ webidl-conversions@7.0.0: {}
5969
+
5970
  webpack-virtual-modules@0.6.2: {}
5971
 
5972
+ whatwg-encoding@3.1.1:
5973
+ dependencies:
5974
+ iconv-lite: 0.6.3
5975
+
5976
+ whatwg-mimetype@4.0.0: {}
5977
+
5978
+ whatwg-url@14.2.0:
5979
+ dependencies:
5980
+ tr46: 5.1.1
5981
+ webidl-conversions: 7.0.0
5982
+
5983
  whatwg-url@5.0.0:
5984
  dependencies:
5985
  tr46: 0.0.3
 
5993
  dependencies:
5994
  isexe: 3.1.1
5995
 
5996
+ why-is-node-running@2.3.0:
5997
+ dependencies:
5998
+ siginfo: 2.0.0
5999
+ stackback: 0.0.2
6000
+
6001
  word-wrap@1.2.5: {}
6002
 
6003
  wrap-ansi@6.2.0:
 
6006
  string-width: 4.2.3
6007
  strip-ansi: 6.0.1
6008
 
6009
+ ws@8.18.2: {}
6010
+
6011
+ xml-name-validator@5.0.0: {}
6012
+
6013
+ xmlchars@2.2.0: {}
6014
+
6015
  yallist@5.0.0: {}
6016
 
6017
  yaml@1.10.2: {}
src/lib/components/inference-playground/code-snippets.svelte CHANGED
@@ -1,10 +1,10 @@
1
  <script lang="ts">
2
- import { emptyModel, type ConversationClass } from "$lib/state/conversations.svelte";
 
3
  import { token } from "$lib/state/token.svelte.js";
4
- import { isCustomModel, PipelineTag } from "$lib/types.js";
5
  import { copyToClipboard } from "$lib/utils/copy.js";
6
  import { entries, fromEntries, keys } from "$lib/utils/object.svelte.js";
7
- import type { InferenceProvider } from "@huggingface/inference";
8
  import hljs from "highlight.js/lib/core";
9
  import http from "highlight.js/lib/languages/http";
10
  import javascript from "highlight.js/lib/languages/javascript";
@@ -17,7 +17,6 @@
17
  type GetInferenceSnippetReturn,
18
  type InferenceSnippetLanguage,
19
  } from "./utils.svelte.js";
20
- import { structuredForbiddenProviders } from "$lib/state/models.svelte";
21
 
22
  hljs.registerLanguage("javascript", javascript);
23
  hljs.registerLanguage("python", python);
@@ -62,21 +61,9 @@
62
  }
63
 
64
  if (isCustomModel(model)) {
65
- const snippets = getInferenceSnippet(
66
- {
67
- ...emptyModel,
68
- _id: model._id,
69
- id: model.id,
70
- pipeline_tag: PipelineTag.TextGeneration,
71
- tags: ["conversational"],
72
- },
73
- "hf-inference",
74
- lang,
75
- tokenStr,
76
- opts
77
- );
78
  return snippets
79
- .filter(s => s.client.startsWith("open") || lang === "curl")
80
  .map(s => {
81
  return {
82
  ...s,
@@ -87,7 +74,7 @@
87
  });
88
  }
89
 
90
- return getInferenceSnippet(model, data.provider as InferenceProvider, lang, tokenStr, opts);
91
  }
92
 
93
  // { javascript: 0, python: 0, http: 0 } at first
@@ -107,7 +94,7 @@
107
 
108
  function highlight(code?: string, language?: InferenceSnippetLanguage) {
109
  if (!code || !language) return "";
110
- return hljs.highlight(code, { language: language === "curl" ? "http" : language }).value;
111
  }
112
 
113
  const tokenStr = $derived.by(() => {
@@ -123,7 +110,7 @@
123
  const snippetsByLang = $derived({
124
  javascript: getSnippet({ lang: "js", tokenStr, conversation }),
125
  python: getSnippet({ lang: "python", tokenStr, conversation }),
126
- http: getSnippet({ lang: "curl", tokenStr, conversation }),
127
  } as Record<Language, GetInferenceSnippetReturn>);
128
 
129
  const selectedSnippet = $derived(snippetsByLang[lang][selectedSnippetIdxByLang[lang]]);
 
1
  <script lang="ts">
2
+ import { type ConversationClass } from "$lib/state/conversations.svelte";
3
+ import { structuredForbiddenProviders } from "$lib/state/models.svelte";
4
  import { token } from "$lib/state/token.svelte.js";
5
+ import { isCustomModel } from "$lib/types.js";
6
  import { copyToClipboard } from "$lib/utils/copy.js";
7
  import { entries, fromEntries, keys } from "$lib/utils/object.svelte.js";
 
8
  import hljs from "highlight.js/lib/core";
9
  import http from "highlight.js/lib/languages/http";
10
  import javascript from "highlight.js/lib/languages/javascript";
 
17
  type GetInferenceSnippetReturn,
18
  type InferenceSnippetLanguage,
19
  } from "./utils.svelte.js";
 
20
 
21
  hljs.registerLanguage("javascript", javascript);
22
  hljs.registerLanguage("python", python);
 
61
  }
62
 
63
  if (isCustomModel(model)) {
64
+ const snippets = getInferenceSnippet(conversation, lang, tokenStr, opts);
 
 
 
 
 
 
 
 
 
 
 
 
65
  return snippets
66
+ .filter(s => s.client.startsWith("open") || lang === "sh")
67
  .map(s => {
68
  return {
69
  ...s,
 
74
  });
75
  }
76
 
77
+ return getInferenceSnippet(conversation, lang, tokenStr, opts);
78
  }
79
 
80
  // { javascript: 0, python: 0, http: 0 } at first
 
94
 
95
  function highlight(code?: string, language?: InferenceSnippetLanguage) {
96
  if (!code || !language) return "";
97
+ return hljs.highlight(code, { language: language === "sh" ? "http" : language }).value;
98
  }
99
 
100
  const tokenStr = $derived.by(() => {
 
110
  const snippetsByLang = $derived({
111
  javascript: getSnippet({ lang: "js", tokenStr, conversation }),
112
  python: getSnippet({ lang: "python", tokenStr, conversation }),
113
+ http: getSnippet({ lang: "sh", tokenStr, conversation }),
114
  } as Record<Language, GetInferenceSnippetReturn>);
115
 
116
  const selectedSnippet = $derived(snippetsByLang[lang][selectedSnippetIdxByLang[lang]]);
src/lib/components/inference-playground/snippets/curl.svelte.ts DELETED
@@ -1,191 +0,0 @@
1
- import type { ConversationEntityMembers } from "$lib/state/conversations.svelte";
2
- import type { ChatCompletionInputMessage, GenerationParameters, PipelineType } from "@huggingface/tasks";
3
- import {
4
- HF_HUB_INFERENCE_PROXY_TEMPLATE,
5
- type InferenceSnippet,
6
- type ModelDataMinimal,
7
- type SnippetInferenceProvider,
8
- getModelInputSnippet,
9
- stringifyGenerationConfig,
10
- stringifyMessages,
11
- } from "@huggingface/tasks";
12
-
13
- export const snippetBasic = (
14
- model: ModelDataMinimal,
15
- accessToken: string,
16
- provider: SnippetInferenceProvider
17
- ): InferenceSnippet[] => {
18
- if (provider !== "hf-inference") {
19
- return [];
20
- }
21
- return [
22
- {
23
- client: "curl",
24
- content: `\
25
- curl https://router.huggingface.co/hf-inference/models/${model.id} \\
26
- -X POST \\
27
- -d '{"inputs": ${getModelInputSnippet(model, true)}}' \\
28
- -H 'Content-Type: application/json' \\
29
- -H 'Authorization: Bearer ${accessToken || `{API_TOKEN}`}'`,
30
- },
31
- ];
32
- };
33
-
34
- export const snippetTextGeneration = (
35
- model: ModelDataMinimal,
36
- accessToken: string,
37
- provider: SnippetInferenceProvider,
38
- providerModelId?: string,
39
- opts?: {
40
- streaming?: boolean;
41
- messages?: ChatCompletionInputMessage[];
42
- temperature?: GenerationParameters["temperature"];
43
- max_tokens?: GenerationParameters["max_tokens"];
44
- top_p?: GenerationParameters["top_p"];
45
- structured_output?: ConversationEntityMembers["structuredOutput"];
46
- }
47
- ): InferenceSnippet[] => {
48
- if (model.tags.includes("conversational")) {
49
- const baseUrl =
50
- provider === "hf-inference"
51
- ? `https://router.huggingface.co/hf-inference/models/${model.id}/v1/chat/completions`
52
- : HF_HUB_INFERENCE_PROXY_TEMPLATE.replace("{{PROVIDER}}", provider) + "/v1/chat/completions";
53
- const modelId = providerModelId ?? model.id;
54
-
55
- // Conversational model detected, so we display a code snippet that features the Messages API
56
- const streaming = opts?.streaming ?? true;
57
- const exampleMessages = getModelInputSnippet(model) as ChatCompletionInputMessage[];
58
- const messages = opts?.messages ?? exampleMessages;
59
-
60
- const config = {
61
- ...(opts?.temperature ? { temperature: opts.temperature } : undefined),
62
- max_tokens: opts?.max_tokens ?? 500,
63
- ...(opts?.top_p ? { top_p: opts.top_p } : undefined),
64
- ...(opts?.structured_output?.enabled
65
- ? {
66
- response_format: JSON.stringify(
67
- {
68
- type: "json_schema",
69
- json_schema: JSON.parse(opts.structured_output.schema ?? ""),
70
- },
71
- null,
72
- 6
73
- ),
74
- }
75
- : undefined),
76
- };
77
- return [
78
- {
79
- client: "curl",
80
- content: `curl '${baseUrl}' \\
81
- -H 'Authorization: Bearer ${accessToken || `{API_TOKEN}`}' \\
82
- -H 'Content-Type: application/json' \\
83
- --data '{
84
- "model": "${modelId}",
85
- "messages": ${stringifyMessages(messages, {
86
- indent: "\t",
87
- attributeKeyQuotes: true,
88
- customContentEscaper: str => str.replace(/'/g, "'\\''"),
89
- })},
90
- ${stringifyGenerationConfig(config, {
91
- indent: "\n ",
92
- attributeKeyQuotes: true,
93
- attributeValueConnector: ": ",
94
- })}
95
- "stream": ${!!streaming}
96
- }'`,
97
- },
98
- ];
99
- } else {
100
- return snippetBasic(model, accessToken, provider);
101
- }
102
- };
103
-
104
- export const snippetZeroShotClassification = (
105
- model: ModelDataMinimal,
106
- accessToken: string,
107
- provider: SnippetInferenceProvider
108
- ): InferenceSnippet[] => {
109
- if (provider !== "hf-inference") {
110
- return [];
111
- }
112
- return [
113
- {
114
- client: "curl",
115
- content: `curl https://router.huggingface.co/hf-inference/models/${model.id} \\
116
- -X POST \\
117
- -d '{"inputs": ${getModelInputSnippet(model, true)}, "parameters": {"candidate_labels": ["refund", "legal", "faq"]}}' \\
118
- -H 'Content-Type: application/json' \\
119
- -H 'Authorization: Bearer ${accessToken || `{API_TOKEN}`}'`,
120
- },
121
- ];
122
- };
123
-
124
- export const snippetFile = (
125
- model: ModelDataMinimal,
126
- accessToken: string,
127
- provider: SnippetInferenceProvider
128
- ): InferenceSnippet[] => {
129
- if (provider !== "hf-inference") {
130
- return [];
131
- }
132
- return [
133
- {
134
- client: "curl",
135
- content: `curl https://router.huggingface.co/hf-inference/models/${model.id} \\
136
- -X POST \\
137
- --data-binary '@${getModelInputSnippet(model, true, true)}' \\
138
- -H 'Authorization: Bearer ${accessToken || `{API_TOKEN}`}'`,
139
- },
140
- ];
141
- };
142
-
143
- export const curlSnippets: Partial<
144
- Record<
145
- PipelineType,
146
- (
147
- model: ModelDataMinimal,
148
- accessToken: string,
149
- provider: SnippetInferenceProvider,
150
- providerModelId?: string,
151
- opts?: Record<string, unknown>
152
- ) => InferenceSnippet[]
153
- >
154
- > = {
155
- // Same order as in tasks/src/pipelines.ts
156
- "text-classification": snippetBasic,
157
- "token-classification": snippetBasic,
158
- "table-question-answering": snippetBasic,
159
- "question-answering": snippetBasic,
160
- "zero-shot-classification": snippetZeroShotClassification,
161
- "translation": snippetBasic,
162
- "summarization": snippetBasic,
163
- "feature-extraction": snippetBasic,
164
- "text-generation": snippetTextGeneration,
165
- "image-text-to-text": snippetTextGeneration,
166
- "text2text-generation": snippetBasic,
167
- "fill-mask": snippetBasic,
168
- "sentence-similarity": snippetBasic,
169
- "automatic-speech-recognition": snippetFile,
170
- "text-to-image": snippetBasic,
171
- "text-to-speech": snippetBasic,
172
- "text-to-audio": snippetBasic,
173
- "audio-to-audio": snippetFile,
174
- "audio-classification": snippetFile,
175
- "image-classification": snippetFile,
176
- "image-to-text": snippetFile,
177
- "object-detection": snippetFile,
178
- "image-segmentation": snippetFile,
179
- };
180
-
181
- export function getCurlInferenceSnippet(
182
- model: ModelDataMinimal,
183
- accessToken: string,
184
- provider: SnippetInferenceProvider,
185
- providerModelId?: string,
186
- opts?: Record<string, unknown>
187
- ): InferenceSnippet[] {
188
- return model.pipeline_tag && model.pipeline_tag in curlSnippets
189
- ? (curlSnippets[model.pipeline_tag]?.(model, accessToken, provider, providerModelId, opts) ?? [])
190
- : [];
191
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/lib/components/inference-playground/snippets/index.svelte.ts DELETED
@@ -1,5 +0,0 @@
1
- import * as curl from "./curl.svelte.js";
2
- import * as python from "./python.svelte.js";
3
- import * as js from "./js.svelte.js";
4
-
5
- export const snippets = { curl, python, js };
 
 
 
 
 
 
src/lib/components/inference-playground/snippets/js.svelte.ts DELETED
@@ -1,489 +0,0 @@
1
- import type { ConversationEntityMembers } from "$lib/state/conversations.svelte";
2
- import type { ChatCompletionInputMessage, GenerationParameters, PipelineType, WidgetType } from "@huggingface/tasks";
3
- import {
4
- getModelInputSnippet,
5
- openAIbaseUrl,
6
- stringifyGenerationConfig,
7
- stringifyMessages,
8
- type InferenceSnippet,
9
- type ModelDataMinimal,
10
- type SnippetInferenceProvider,
11
- } from "@huggingface/tasks";
12
-
13
- const HFJS_METHODS: Partial<Record<WidgetType, string>> = {
14
- "text-classification": "textClassification",
15
- "token-classification": "tokenClassification",
16
- "table-question-answering": "tableQuestionAnswering",
17
- "question-answering": "questionAnswering",
18
- "translation": "translation",
19
- "summarization": "summarization",
20
- "feature-extraction": "featureExtraction",
21
- "text-generation": "textGeneration",
22
- "text2text-generation": "textGeneration",
23
- "fill-mask": "fillMask",
24
- "sentence-similarity": "sentenceSimilarity",
25
- };
26
-
27
- export const snippetBasic = (
28
- model: ModelDataMinimal,
29
- accessToken: string,
30
- provider: SnippetInferenceProvider
31
- ): InferenceSnippet[] => {
32
- return [
33
- ...(model.pipeline_tag && model.pipeline_tag in HFJS_METHODS
34
- ? [
35
- {
36
- client: "huggingface.js",
37
- content: `\
38
- import { HfInference } from "@huggingface/inference";
39
-
40
- const client = new HfInference("${accessToken || `{API_TOKEN}`}");
41
-
42
- const output = await client.${HFJS_METHODS[model.pipeline_tag]}({
43
- model: "${model.id}",
44
- inputs: ${getModelInputSnippet(model)},
45
- provider: "${provider}",
46
- });
47
-
48
- console.log(output);
49
- `,
50
- },
51
- ]
52
- : []),
53
- {
54
- client: "fetch",
55
- content: `\
56
- async function query(data) {
57
- const response = await fetch(
58
- "https://router.huggingface.co/hf-inference/models/${model.id}",
59
- {
60
- headers: {
61
- Authorization: "Bearer ${accessToken || `{API_TOKEN}`}",
62
- "Content-Type": "application/json",
63
- },
64
- method: "POST",
65
- body: JSON.stringify(data),
66
- }
67
- );
68
- const result = await response.json();
69
- return result;
70
- }
71
-
72
- query({"inputs": ${getModelInputSnippet(model)}}).then((response) => {
73
- console.log(JSON.stringify(response));
74
- });`,
75
- },
76
- ];
77
- };
78
-
79
- export const snippetTextGeneration = (
80
- model: ModelDataMinimal,
81
- accessToken: string,
82
- provider: SnippetInferenceProvider,
83
- providerModelId?: string,
84
- opts?: {
85
- streaming?: boolean;
86
- messages?: ChatCompletionInputMessage[];
87
- temperature?: GenerationParameters["temperature"];
88
- max_tokens?: GenerationParameters["max_tokens"];
89
- top_p?: GenerationParameters["top_p"];
90
- structured_output?: ConversationEntityMembers["structuredOutput"];
91
- }
92
- ): InferenceSnippet[] => {
93
- if (model.tags.includes("conversational")) {
94
- // Conversational model detected, so we display a code snippet that features the Messages API
95
- const streaming = opts?.streaming ?? true;
96
- const exampleMessages = getModelInputSnippet(model) as ChatCompletionInputMessage[];
97
- const messages = opts?.messages ?? exampleMessages;
98
- const messagesStr = stringifyMessages(messages, { indent: "\t" });
99
-
100
- const config = {
101
- ...(opts?.temperature ? { temperature: opts.temperature } : undefined),
102
- max_tokens: opts?.max_tokens ?? 500,
103
- ...(opts?.top_p ? { top_p: opts.top_p } : undefined),
104
- ...(opts?.structured_output?.enabled
105
- ? {
106
- response_format: JSON.stringify(
107
- {
108
- type: "json_schema",
109
- json_schema: JSON.parse(opts.structured_output.schema ?? ""),
110
- },
111
- null,
112
- 6
113
- ),
114
- }
115
- : undefined),
116
- };
117
- const configStr = stringifyGenerationConfig(config, {
118
- indent: "\n\t",
119
- attributeValueConnector: ": ",
120
- });
121
-
122
- if (streaming) {
123
- return [
124
- {
125
- client: "huggingface.js",
126
- content: `import { HfInference } from "@huggingface/inference";
127
-
128
- const client = new HfInference("${accessToken || `{API_TOKEN}`}");
129
-
130
- let out = "";
131
-
132
- const stream = client.chatCompletionStream({
133
- model: "${model.id}",
134
- messages: ${messagesStr},
135
- provider: "${provider}",
136
- ${configStr}
137
- });
138
-
139
- for await (const chunk of stream) {
140
- if (chunk.choices && chunk.choices.length > 0) {
141
- const newContent = chunk.choices[0].delta.content;
142
- out += newContent;
143
- console.log(newContent);
144
- }
145
- }`,
146
- },
147
- {
148
- client: "openai",
149
- content: `import { OpenAI } from "openai";
150
-
151
- const client = new OpenAI({
152
- baseURL: "${openAIbaseUrl(provider)}",
153
- apiKey: "${accessToken || `{API_TOKEN}`}"
154
- });
155
- data.
156
- let out = "";
157
-
158
- const stream = await client.chat.completions.create({
159
- model: "${providerModelId ?? model.id}",
160
- messages: ${messagesStr},
161
- ${configStr}
162
- stream: true,
163
- });
164
-
165
- for await (const chunk of stream) {
166
- if (chunk.choices && chunk.choices.length > 0) {
167
- const newContent = chunk.choices[0].delta.content;
168
- out += newContent;
169
- console.log(newContent);
170
- }
171
- }`,
172
- },
173
- ];
174
- } else {
175
- return [
176
- {
177
- client: "huggingface.js",
178
- content: `import { HfInference } from "@huggingface/inference";
179
-
180
- const client = new HfInference("${accessToken || `{API_TOKEN}`}");
181
-
182
- const chatCompletion = await client.chatCompletion({
183
- model: "${model.id}",
184
- messages: ${messagesStr},
185
- provider: "${provider}",
186
- ${configStr}
187
- });
188
-
189
- console.log(chatCompletion.choices[0].message);
190
- `,
191
- },
192
- {
193
- client: "openai",
194
- content: `import { OpenAI } from "openai";
195
-
196
- const client = new OpenAI({
197
- baseURL: "${openAIbaseUrl(provider)}",
198
- apiKey: "${accessToken || `{API_TOKEN}`}"
199
- });
200
-
201
- const chatCompletion = await client.chat.completions.create({
202
- model: "${providerModelId ?? model.id}",
203
- messages: ${messagesStr},
204
- ${configStr}
205
- });
206
-
207
- console.log(chatCompletion.choices[0].message);
208
- `,
209
- },
210
- ];
211
- }
212
- } else {
213
- return snippetBasic(model, accessToken, provider);
214
- }
215
- };
216
-
217
- export const snippetZeroShotClassification = (model: ModelDataMinimal, accessToken: string): InferenceSnippet[] => {
218
- return [
219
- {
220
- client: "fetch",
221
- content: `async function query(data) {
222
- const response = await fetch(
223
- "https://router.huggingface.co/hf-inference/models/${model.id}",
224
- {
225
- headers: {
226
- Authorization: "Bearer ${accessToken || `{API_TOKEN}`}",
227
- "Content-Type": "application/json",
228
- },
229
- method: "POST",
230
- body: JSON.stringify(data),
231
- }
232
- );
233
- const result = await response.json();
234
- return result;
235
- }
236
-
237
- query({"inputs": ${getModelInputSnippet(
238
- model
239
- )}, "parameters": {"candidate_labels": ["refund", "legal", "faq"]}}).then((response) => {
240
- console.log(JSON.stringify(response));
241
- });`,
242
- },
243
- ];
244
- };
245
-
246
- export const snippetTextToImage = (
247
- model: ModelDataMinimal,
248
- accessToken: string,
249
- provider: SnippetInferenceProvider
250
- ): InferenceSnippet[] => {
251
- return [
252
- {
253
- client: "huggingface.js",
254
- content: `\
255
- import { HfInference } from "@huggingface/inference";
256
-
257
- const client = new HfInference("${accessToken || `{API_TOKEN}`}");
258
-
259
- const image = await client.textToImage({
260
- model: "${model.id}",
261
- inputs: ${getModelInputSnippet(model)},
262
- parameters: { num_inference_steps: 5 },
263
- provider: "${provider}",
264
- });
265
- /// Use the generated image (it's a Blob)
266
- `,
267
- },
268
- ...(provider === "hf-inference"
269
- ? [
270
- {
271
- client: "fetch",
272
- content: `async function query(data) {
273
- const response = await fetch(
274
- "https://router.huggingface.co/hf-inference/models/${model.id}",
275
- {
276
- headers: {
277
- Authorization: "Bearer ${accessToken || `{API_TOKEN}`}",
278
- "Content-Type": "application/json",
279
- },
280
- method: "POST",
281
- body: JSON.stringify(data),
282
- }
283
- );
284
- const result = await response.blob();
285
- return result;
286
- }
287
- query({"inputs": ${getModelInputSnippet(model)}}).then((response) => {
288
- // Use image
289
- });`,
290
- },
291
- ]
292
- : []),
293
- ];
294
- };
295
-
296
- export const snippetTextToVideo = (
297
- model: ModelDataMinimal,
298
- accessToken: string,
299
- provider: SnippetInferenceProvider
300
- ): InferenceSnippet[] => {
301
- return ["fal-ai", "replicate"].includes(provider)
302
- ? [
303
- {
304
- client: "huggingface.js",
305
- content: `\
306
- import { HfInference } from "@huggingface/inference";
307
-
308
- const client = new HfInference("${accessToken || `{API_TOKEN}`}");
309
-
310
- const video = await client.textToVideo({
311
- model: "${model.id}",
312
- provider: "${provider}",
313
- inputs: ${getModelInputSnippet(model)},
314
- parameters: { num_inference_steps: 5 },
315
- });
316
- // Use the generated video (it's a Blob)
317
- `,
318
- },
319
- ]
320
- : [];
321
- };
322
-
323
- export const snippetTextToAudio = (
324
- model: ModelDataMinimal,
325
- accessToken: string,
326
- provider: SnippetInferenceProvider
327
- ): InferenceSnippet[] => {
328
- if (provider !== "hf-inference") {
329
- return [];
330
- }
331
- const commonSnippet = `async function query(data) {
332
- const response = await fetch(
333
- "https://router.huggingface.co/hf-inference/models/${model.id}",
334
- {
335
- headers: {
336
- Authorization: "Bearer ${accessToken || `{API_TOKEN}`}",
337
- "Content-Type": "application/json",
338
- },
339
- method: "POST",
340
- body: JSON.stringify(data),
341
- }
342
- );`;
343
- if (model.library_name === "transformers") {
344
- return [
345
- {
346
- client: "fetch",
347
- content:
348
- commonSnippet +
349
- `
350
- const result = await response.blob();
351
- return result;
352
- }
353
- query({"inputs": ${getModelInputSnippet(model)}}).then((response) => {
354
- // Returns a byte object of the Audio wavform. Use it directly!
355
- });`,
356
- },
357
- ];
358
- } else {
359
- return [
360
- {
361
- client: "fetch",
362
- content:
363
- commonSnippet +
364
- `
365
- const result = await response.json();
366
- return result;
367
- }
368
-
369
- query({"inputs": ${getModelInputSnippet(model)}}).then((response) => {
370
- console.log(JSON.stringify(response));
371
- });`,
372
- },
373
- ];
374
- }
375
- };
376
-
377
- export const snippetAutomaticSpeechRecognition = (
378
- model: ModelDataMinimal,
379
- accessToken: string,
380
- provider: SnippetInferenceProvider
381
- ): InferenceSnippet[] => {
382
- return [
383
- {
384
- client: "huggingface.js",
385
- content: `\
386
- import { HfInference } from "@huggingface/inference";
387
-
388
- const client = new HfInference("${accessToken || `{API_TOKEN}`}");
389
-
390
- const data = fs.readFileSync(${getModelInputSnippet(model)});
391
-
392
- const output = await client.automaticSpeechRecognition({
393
- data,
394
- model: "${model.id}",
395
- provider: "${provider}",
396
- });
397
-
398
- console.log(output);
399
- `,
400
- },
401
- ...(provider === "hf-inference" ? snippetFile(model, accessToken, provider) : []),
402
- ];
403
- };
404
-
405
- export const snippetFile = (
406
- model: ModelDataMinimal,
407
- accessToken: string,
408
- provider: SnippetInferenceProvider
409
- ): InferenceSnippet[] => {
410
- if (provider !== "hf-inference") {
411
- return [];
412
- }
413
- return [
414
- {
415
- client: "fetch",
416
- content: `async function query(filename) {
417
- const data = fs.readFileSync(filename);
418
- const response = await fetch(
419
- "https://router.huggingface.co/hf-inference/models/${model.id}",
420
- {
421
- headers: {
422
- Authorization: "Bearer ${accessToken || `{API_TOKEN}`}",
423
- "Content-Type": "application/json",
424
- },
425
- method: "POST",
426
- body: data,
427
- }
428
- );
429
- const result = await response.json();
430
- return result;
431
- }
432
-
433
- query(${getModelInputSnippet(model)}).then((response) => {
434
- console.log(JSON.stringify(response));
435
- });`,
436
- },
437
- ];
438
- };
439
-
440
- export const jsSnippets: Partial<
441
- Record<
442
- PipelineType,
443
- (
444
- model: ModelDataMinimal,
445
- accessToken: string,
446
- provider: SnippetInferenceProvider,
447
- providerModelId?: string,
448
- opts?: Record<string, unknown>
449
- ) => InferenceSnippet[]
450
- >
451
- > = {
452
- // Same order as in tasks/src/pipelines.ts
453
- "text-classification": snippetBasic,
454
- "token-classification": snippetBasic,
455
- "table-question-answering": snippetBasic,
456
- "question-answering": snippetBasic,
457
- "zero-shot-classification": snippetZeroShotClassification,
458
- "translation": snippetBasic,
459
- "summarization": snippetBasic,
460
- "feature-extraction": snippetBasic,
461
- "text-generation": snippetTextGeneration,
462
- "image-text-to-text": snippetTextGeneration,
463
- "text2text-generation": snippetBasic,
464
- "fill-mask": snippetBasic,
465
- "sentence-similarity": snippetBasic,
466
- "automatic-speech-recognition": snippetAutomaticSpeechRecognition,
467
- "text-to-image": snippetTextToImage,
468
- "text-to-video": snippetTextToVideo,
469
- "text-to-speech": snippetTextToAudio,
470
- "text-to-audio": snippetTextToAudio,
471
- "audio-to-audio": snippetFile,
472
- "audio-classification": snippetFile,
473
- "image-classification": snippetFile,
474
- "image-to-text": snippetFile,
475
- "object-detection": snippetFile,
476
- "image-segmentation": snippetFile,
477
- };
478
-
479
- export function getJsInferenceSnippet(
480
- model: ModelDataMinimal,
481
- accessToken: string,
482
- provider: SnippetInferenceProvider,
483
- providerModelId?: string,
484
- opts?: Record<string, unknown>
485
- ): InferenceSnippet[] {
486
- return model.pipeline_tag && model.pipeline_tag in jsSnippets
487
- ? (jsSnippets[model.pipeline_tag]?.(model, accessToken, provider, providerModelId, opts) ?? [])
488
- : [];
489
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/lib/components/inference-playground/snippets/python.svelte.ts DELETED
@@ -1,534 +0,0 @@
1
- import type { ConversationEntityMembers } from "$lib/state/conversations.svelte";
2
- import type { ChatCompletionInputMessage, GenerationParameters, PipelineType, WidgetType } from "@huggingface/tasks";
3
- import {
4
- getModelInputSnippet,
5
- openAIbaseUrl,
6
- stringifyGenerationConfig,
7
- stringifyMessages,
8
- type InferenceSnippet,
9
- type ModelDataMinimal,
10
- type SnippetInferenceProvider,
11
- } from "@huggingface/tasks";
12
-
13
- const HFH_INFERENCE_CLIENT_METHODS: Partial<Record<WidgetType, string>> = {
14
- "audio-classification": "audio_classification",
15
- "audio-to-audio": "audio_to_audio",
16
- "automatic-speech-recognition": "automatic_speech_recognition",
17
- "text-to-speech": "text_to_speech",
18
- "image-classification": "image_classification",
19
- "image-segmentation": "image_segmentation",
20
- "image-to-image": "image_to_image",
21
- "image-to-text": "image_to_text",
22
- "object-detection": "object_detection",
23
- "text-to-image": "text_to_image",
24
- "text-to-video": "text_to_video",
25
- "zero-shot-image-classification": "zero_shot_image_classification",
26
- "document-question-answering": "document_question_answering",
27
- "visual-question-answering": "visual_question_answering",
28
- "feature-extraction": "feature_extraction",
29
- "fill-mask": "fill_mask",
30
- "question-answering": "question_answering",
31
- "sentence-similarity": "sentence_similarity",
32
- "summarization": "summarization",
33
- "table-question-answering": "table_question_answering",
34
- "text-classification": "text_classification",
35
- "text-generation": "text_generation",
36
- "token-classification": "token_classification",
37
- "translation": "translation",
38
- "zero-shot-classification": "zero_shot_classification",
39
- "tabular-classification": "tabular_classification",
40
- "tabular-regression": "tabular_regression",
41
- };
42
-
43
- const snippetImportInferenceClient = (accessToken: string, provider: SnippetInferenceProvider): string =>
44
- `\
45
- from huggingface_hub import InferenceClient
46
-
47
- client = InferenceClient(
48
- provider="${provider}",
49
- api_key="${accessToken || "{API_TOKEN}"}"
50
- )`;
51
-
52
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
- function toPythonDict(obj: any, indent: number = 6, level: number = 0): string {
54
- const pad = (lvl: number) => " ".repeat(indent * lvl);
55
-
56
- if (obj === null) {
57
- return "None";
58
- }
59
- if (typeof obj === "string") {
60
- // Escape single quotes and backslashes
61
- return `'${obj.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'`;
62
- }
63
- if (typeof obj === "number" || typeof obj === "bigint") {
64
- return obj.toString();
65
- }
66
- if (typeof obj === "boolean") {
67
- return obj ? "True" : "False";
68
- }
69
- if (Array.isArray(obj)) {
70
- if (obj.length === 0) return "[]";
71
- const items = obj.map(item => `${pad(level + 1)}${toPythonDict(item, indent, level + 1)}`).join(",\n");
72
- return `[\n${items}\n${pad(level)}]`;
73
- }
74
- if (typeof obj === "object") {
75
- const keys = Object.keys(obj);
76
- if (keys.length === 0) return "{}";
77
- const items = keys
78
- .map(key => `${pad(level + 1)}'${key}': ${toPythonDict(obj[key], indent, level + 1)}`)
79
- .join(",\n");
80
- return `{\n${items}\n${pad(level)}}`;
81
- }
82
- // Fallback for undefined or functions
83
- return "None";
84
- }
85
-
86
- export const snippetConversational = (
87
- model: ModelDataMinimal,
88
- accessToken: string,
89
- provider: SnippetInferenceProvider,
90
- providerModelId?: string,
91
- opts?: {
92
- streaming?: boolean;
93
- messages?: ChatCompletionInputMessage[];
94
- temperature?: GenerationParameters["temperature"];
95
- max_tokens?: GenerationParameters["max_tokens"];
96
- top_p?: GenerationParameters["top_p"];
97
- structured_output?: ConversationEntityMembers["structuredOutput"];
98
- }
99
- ): InferenceSnippet[] => {
100
- const streaming = opts?.streaming ?? true;
101
- const exampleMessages = getModelInputSnippet(model) as ChatCompletionInputMessage[];
102
- const messages = opts?.messages ?? exampleMessages;
103
- const messagesStr = stringifyMessages(messages, { attributeKeyQuotes: true });
104
-
105
- const config = {
106
- ...(opts?.temperature ? { temperature: opts.temperature } : undefined),
107
- max_tokens: opts?.max_tokens ?? 500,
108
- ...(opts?.top_p ? { top_p: opts.top_p } : undefined),
109
- ...(opts?.structured_output?.enabled
110
- ? {
111
- response_format: toPythonDict(
112
- {
113
- type: "json_schema",
114
- json_schema: JSON.parse(opts.structured_output.schema ?? ""),
115
- },
116
- 6
117
- ),
118
- }
119
- : undefined),
120
- };
121
- const configStr = stringifyGenerationConfig(config, {
122
- indent: "\n\t",
123
- attributeValueConnector: "=",
124
- });
125
-
126
- if (streaming) {
127
- return [
128
- {
129
- client: "huggingface_hub",
130
- content: `\
131
- ${snippetImportInferenceClient(accessToken, provider)}
132
-
133
- messages = ${messagesStr}
134
-
135
- stream = client.chat.completions.create(
136
- model="${model.id}",
137
- messages=messages,
138
- ${configStr}
139
- stream=True
140
- )
141
-
142
- for chunk in stream:
143
- print(chunk.choices[0].delta.content, end="")`,
144
- },
145
- {
146
- client: "openai",
147
- content: `\
148
- from openai import OpenAI
149
-
150
- client = OpenAI(
151
- base_url="${openAIbaseUrl(provider)}",
152
- api_key="${accessToken || "{API_TOKEN}"}"
153
- )
154
-
155
- messages = ${messagesStr}
156
-
157
- stream = client.chat.completions.create(
158
- model="${providerModelId ?? model.id}",
159
- messages=messages,
160
- ${configStr}
161
- stream=True
162
- )
163
-
164
- for chunk in stream:
165
- print(chunk.choices[0].delta.content, end="")`,
166
- },
167
- ];
168
- } else {
169
- return [
170
- {
171
- client: "huggingface_hub",
172
- content: `\
173
- ${snippetImportInferenceClient(accessToken, provider)}
174
-
175
- messages = ${messagesStr}
176
-
177
- completion = client.chat.completions.create(
178
- model="${model.id}",
179
- messages=messages,
180
- ${configStr}
181
- )
182
-
183
- print(completion.choices[0].message)`,
184
- },
185
- {
186
- client: "openai",
187
- content: `\
188
- from openai import OpenAI
189
-
190
- client = OpenAI(
191
- base_url="${openAIbaseUrl(provider)}",
192
- api_key="${accessToken || "{API_TOKEN}"}"
193
- )
194
-
195
- messages = ${messagesStr}
196
-
197
- completion = client.chat.completions.create(
198
- model="${providerModelId ?? model.id}",
199
- messages=messages,
200
- ${configStr}
201
- )
202
-
203
- print(completion.choices[0].message)`,
204
- },
205
- ];
206
- }
207
- };
208
-
209
- export const snippetZeroShotClassification = (model: ModelDataMinimal): InferenceSnippet[] => {
210
- return [
211
- {
212
- client: "requests",
213
- content: `\
214
- def query(payload):
215
- response = requests.post(API_URL, headers=headers, json=payload)
216
- return response.json()
217
-
218
- output = query({
219
- "inputs": ${getModelInputSnippet(model)},
220
- "parameters": {"candidate_labels": ["refund", "legal", "faq"]},
221
- })`,
222
- },
223
- ];
224
- };
225
-
226
- export const snippetZeroShotImageClassification = (model: ModelDataMinimal): InferenceSnippet[] => {
227
- return [
228
- {
229
- client: "requests",
230
- content: `\
231
- def query(data):
232
- with open(data["image_path"], "rb") as f:
233
- img = f.read()
234
- payload={
235
- "parameters": data["parameters"],
236
- "inputs": base64.b64encode(img).decode("utf-8")
237
- }
238
- response = requests.post(API_URL, headers=headers, json=payload)
239
- return response.json()
240
-
241
- output = query({
242
- "image_path": ${getModelInputSnippet(model)},
243
- "parameters": {"candidate_labels": ["cat", "dog", "llama"]},
244
- })`,
245
- },
246
- ];
247
- };
248
-
249
- export const snippetBasic = (
250
- model: ModelDataMinimal,
251
- accessToken: string,
252
- provider: SnippetInferenceProvider
253
- ): InferenceSnippet[] => {
254
- return [
255
- ...(model.pipeline_tag && model.pipeline_tag in HFH_INFERENCE_CLIENT_METHODS
256
- ? [
257
- {
258
- client: "huggingface_hub",
259
- content: `\
260
- ${snippetImportInferenceClient(accessToken, provider)}
261
-
262
- result = client.${HFH_INFERENCE_CLIENT_METHODS[model.pipeline_tag]}(
263
- model="${model.id}",
264
- inputs=${getModelInputSnippet(model)},
265
- provider="${provider}",
266
- )
267
-
268
- print(result)
269
- `,
270
- },
271
- ]
272
- : []),
273
- {
274
- client: "requests",
275
- content: `\
276
- def query(payload):
277
- response = requests.post(API_URL, headers=headers, json=payload)
278
- return response.json()
279
-
280
- output = query({
281
- "inputs": ${getModelInputSnippet(model)},
282
- })`,
283
- },
284
- ];
285
- };
286
-
287
- export const snippetFile = (model: ModelDataMinimal): InferenceSnippet[] => {
288
- return [
289
- {
290
- client: "requests",
291
- content: `\
292
- def query(filename):
293
- with open(filename, "rb") as f:
294
- data = f.read()
295
- response = requests.post(API_URL, headers=headers, data=data)
296
- return response.json()
297
-
298
- output = query(${getModelInputSnippet(model)})`,
299
- },
300
- ];
301
- };
302
-
303
- export const snippetTextToImage = (
304
- model: ModelDataMinimal,
305
- accessToken: string,
306
- provider: SnippetInferenceProvider,
307
- providerModelId?: string
308
- ): InferenceSnippet[] => {
309
- return [
310
- {
311
- client: "huggingface_hub",
312
- content: `\
313
- ${snippetImportInferenceClient(accessToken, provider)}
314
-
315
- # output is a PIL.Image object
316
- image = client.text_to_image(
317
- ${getModelInputSnippet(model)},
318
- model="${model.id}"
319
- )`,
320
- },
321
- ...(provider === "fal-ai"
322
- ? [
323
- {
324
- client: "fal-client",
325
- content: `\
326
- import fal_client
327
-
328
- result = fal_client.subscribe(
329
- "${providerModelId ?? model.id}",
330
- arguments={
331
- "prompt": ${getModelInputSnippet(model)},
332
- },
333
- )
334
- print(result)
335
- `,
336
- },
337
- ]
338
- : []),
339
- ...(provider === "hf-inference"
340
- ? [
341
- {
342
- client: "requests",
343
- content: `\
344
- def query(payload):
345
- response = requests.post(API_URL, headers=headers, json=payload)
346
- return response.content
347
-
348
- image_bytes = query({
349
- "inputs": ${getModelInputSnippet(model)},
350
- })
351
-
352
- # You can access the image with PIL.Image for example
353
- import io
354
- from PIL import Image
355
- image = Image.open(io.BytesIO(image_bytes))`,
356
- },
357
- ]
358
- : []),
359
- ];
360
- };
361
-
362
- export const snippetTextToVideo = (
363
- model: ModelDataMinimal,
364
- accessToken: string,
365
- provider: SnippetInferenceProvider
366
- ): InferenceSnippet[] => {
367
- return ["fal-ai", "replicate"].includes(provider)
368
- ? [
369
- {
370
- client: "huggingface_hub",
371
- content: `\
372
- ${snippetImportInferenceClient(accessToken, provider)}
373
-
374
- video = client.text_to_video(
375
- ${getModelInputSnippet(model)},
376
- model="${model.id}"
377
- )`,
378
- },
379
- ]
380
- : [];
381
- };
382
-
383
- export const snippetTabular = (model: ModelDataMinimal): InferenceSnippet[] => {
384
- return [
385
- {
386
- client: "requests",
387
- content: `\
388
- def query(payload):
389
- response = requests.post(API_URL, headers=headers, json=payload)
390
- return response.content
391
-
392
- response = query({
393
- "inputs": {"data": ${getModelInputSnippet(model)}},
394
- })`,
395
- },
396
- ];
397
- };
398
-
399
- export const snippetTextToAudio = (model: ModelDataMinimal): InferenceSnippet[] => {
400
- // Transformers TTS pipeline and api-inference-community (AIC) pipeline outputs are diverged
401
- // with the latest update to inference-api (IA).
402
- // Transformers IA returns a byte object (wav file), whereas AIC returns wav and sampling_rate.
403
- if (model.library_name === "transformers") {
404
- return [
405
- {
406
- client: "requests",
407
- content: `\
408
- def query(payload):
409
- response = requests.post(API_URL, headers=headers, json=payload)
410
- return response.content
411
-
412
- audio_bytes = query({
413
- "inputs": ${getModelInputSnippet(model)},
414
- })
415
- # You can access the audio with IPython.display for example
416
- from IPython.display import Audio
417
- Audio(audio_bytes)`,
418
- },
419
- ];
420
- } else {
421
- return [
422
- {
423
- client: "requests",
424
- content: `\
425
- def query(payload):
426
- response = requests.post(API_URL, headers=headers, json=payload)
427
- return response.json()
428
-
429
- audio, sampling_rate = query({
430
- "inputs": ${getModelInputSnippet(model)},
431
- })
432
- # You can access the audio with IPython.display for example
433
- from IPython.display import Audio
434
- Audio(audio, rate=sampling_rate)`,
435
- },
436
- ];
437
- }
438
- };
439
-
440
- export const snippetDocumentQuestionAnswering = (model: ModelDataMinimal): InferenceSnippet[] => {
441
- return [
442
- {
443
- client: "requests",
444
- content: `\
445
- def query(payload):
446
- with open(payload["image"], "rb") as f:
447
- img = f.read()
448
- payload["image"] = base64.b64encode(img).decode("utf-8")
449
- response = requests.post(API_URL, headers=headers, json=payload)
450
- return response.json()
451
-
452
- output = query({
453
- "inputs": ${getModelInputSnippet(model)},
454
- })`,
455
- },
456
- ];
457
- };
458
-
459
- export const pythonSnippets: Partial<
460
- Record<
461
- PipelineType,
462
- (
463
- model: ModelDataMinimal,
464
- accessToken: string,
465
- provider: SnippetInferenceProvider,
466
- providerModelId?: string,
467
- opts?: Record<string, unknown>
468
- ) => InferenceSnippet[]
469
- >
470
- > = {
471
- // Same order as in tasks/src/pipelines.ts
472
- "text-classification": snippetBasic,
473
- "token-classification": snippetBasic,
474
- "table-question-answering": snippetBasic,
475
- "question-answering": snippetBasic,
476
- "zero-shot-classification": snippetZeroShotClassification,
477
- "translation": snippetBasic,
478
- "summarization": snippetBasic,
479
- "feature-extraction": snippetBasic,
480
- "text-generation": snippetBasic,
481
- "text2text-generation": snippetBasic,
482
- "image-text-to-text": snippetConversational,
483
- "fill-mask": snippetBasic,
484
- "sentence-similarity": snippetBasic,
485
- "automatic-speech-recognition": snippetFile,
486
- "text-to-image": snippetTextToImage,
487
- "text-to-video": snippetTextToVideo,
488
- "text-to-speech": snippetTextToAudio,
489
- "text-to-audio": snippetTextToAudio,
490
- "audio-to-audio": snippetFile,
491
- "audio-classification": snippetFile,
492
- "image-classification": snippetFile,
493
- "tabular-regression": snippetTabular,
494
- "tabular-classification": snippetTabular,
495
- "object-detection": snippetFile,
496
- "image-segmentation": snippetFile,
497
- "document-question-answering": snippetDocumentQuestionAnswering,
498
- "image-to-text": snippetFile,
499
- "zero-shot-image-classification": snippetZeroShotImageClassification,
500
- };
501
-
502
- export function getPythonInferenceSnippet(
503
- model: ModelDataMinimal,
504
- accessToken: string,
505
- provider: SnippetInferenceProvider,
506
- providerModelId?: string,
507
- opts?: Record<string, unknown>
508
- ): InferenceSnippet[] {
509
- if (model.tags.includes("conversational")) {
510
- // Conversational model detected, so we display a code snippet that features the Messages API
511
- return snippetConversational(model, accessToken, provider, providerModelId, opts);
512
- } else {
513
- const snippets =
514
- model.pipeline_tag && model.pipeline_tag in pythonSnippets
515
- ? (pythonSnippets[model.pipeline_tag]?.(model, accessToken, provider, providerModelId) ?? [])
516
- : [];
517
-
518
- return snippets.map(snippet => {
519
- return {
520
- ...snippet,
521
- content:
522
- snippet.client === "requests"
523
- ? `\
524
- import requests
525
-
526
- API_URL = "${openAIbaseUrl(provider)}"
527
- headers = {"Authorization": ${accessToken ? `"Bearer ${accessToken}"` : `f"Bearer {API_TOKEN}"`}}
528
-
529
- ${snippet.content}`
530
- : snippet.content,
531
- };
532
- });
533
- }
534
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/lib/components/inference-playground/utils.svelte.ts CHANGED
@@ -1,4 +1,5 @@
1
  import ctxLengthData from "$lib/data/context_length.json";
 
2
  import { ConversationClass, type ConversationEntityMembers } from "$lib/state/conversations.svelte";
3
  import { token } from "$lib/state/token.svelte";
4
  import {
@@ -12,8 +13,7 @@ import {
12
  } from "$lib/types.js";
13
  import { safeParse } from "$lib/utils/json.js";
14
  import { omit, tryGet } from "$lib/utils/object.svelte.js";
15
- import { HfInference, type InferenceProvider } from "@huggingface/inference";
16
- import { snippets } from "./snippets/index.svelte.js";
17
  import type { ChatCompletionInputMessage, InferenceSnippet } from "@huggingface/tasks";
18
  import { type ChatCompletionOutputMessage } from "@huggingface/tasks";
19
  import { AutoTokenizer, PreTrainedTokenizer } from "@huggingface/transformers";
@@ -21,6 +21,7 @@ import OpenAI from "openai";
21
  import { images } from "$lib/state/images.svelte.js";
22
  import { projects } from "$lib/state/projects.svelte.js";
23
  import { structuredForbiddenProviders } from "$lib/state/models.svelte.js";
 
24
 
25
  type ChatCompletionInputMessageChunk =
26
  NonNullable<ChatCompletionInputMessage["content"]> extends string | (infer U)[] ? U : never;
@@ -49,8 +50,8 @@ async function parseMessage(message: ConversationMessage): Promise<ChatCompletio
49
 
50
  type HFCompletionMetadata = {
51
  type: "huggingface";
52
- client: HfInference;
53
- args: Parameters<HfInference["chatCompletion"]>[0];
54
  };
55
 
56
  type OpenAICompletionMetadata = {
@@ -81,55 +82,55 @@ export function maxAllowedTokens(conversation: ConversationClass) {
81
  return ctxLength;
82
  }
83
 
84
- async function getCompletionMetadata(
85
- conversation: ConversationClass | Conversation,
86
- signal?: AbortSignal
87
- ): Promise<CompletionMetadata> {
88
  const data = conversation instanceof ConversationClass ? conversation.data : conversation;
89
- const model = conversation.model;
90
- const systemMessage = projects.current?.systemMessage;
91
-
92
- const messages: ConversationMessage[] = [
93
- ...(isSystemPromptSupported(model) && systemMessage?.length ? [{ role: "system", content: systemMessage }] : []),
94
- ...data.messages,
95
- ];
96
- const parsed = await Promise.all(messages.map(parseMessage));
97
-
98
- const baseArgs = {
99
- ...data.config,
100
- messages: parsed,
101
- model: model.id,
102
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
103
- } as any;
104
-
105
  const json = safeParse(data.structuredOutput?.schema ?? "");
106
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
107
  if (json && data.structuredOutput?.enabled && !structuredForbiddenProviders.includes(data.provider as any)) {
108
  switch (data.provider) {
109
  case "cohere": {
110
- baseArgs.response_format = {
111
  type: "json_object",
112
  ...json,
113
  };
114
- break;
115
  }
116
  case Provider.Cerebras: {
117
- baseArgs.response_format = {
118
  type: "json_schema",
119
  json_schema: { ...json, name: "schema" },
120
  };
121
- break;
122
  }
123
  default: {
124
- baseArgs.response_format = {
125
  type: "json_schema",
126
  json_schema: json,
127
  };
128
-
129
- break;
130
  }
131
  }
132
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
 
134
  // Handle OpenAI-compatible models
135
  if (isCustomModel(model)) {
@@ -163,7 +164,7 @@ async function getCompletionMetadata(
163
  // Handle HuggingFace models
164
  return {
165
  type: "huggingface",
166
- client: new HfInference(token.value),
167
  args,
168
  };
169
  }
@@ -299,21 +300,14 @@ export const customMaxTokens: { [key: string]: number } = {
299
  } as const;
300
 
301
  // Order of the elements in InferenceModal.svelte is determined by this const
302
- export const inferenceSnippetLanguages = ["python", "js", "curl"] as const;
303
 
304
  export type InferenceSnippetLanguage = (typeof inferenceSnippetLanguages)[number];
305
 
306
- const GET_SNIPPET_FN = {
307
- curl: snippets.curl.getCurlInferenceSnippet,
308
- js: snippets.js.getJsInferenceSnippet,
309
- python: snippets.python.getPythonInferenceSnippet,
310
- } as const;
311
-
312
- export type GetInferenceSnippetReturn = (InferenceSnippet & { language: InferenceSnippetLanguage })[];
313
 
314
  export function getInferenceSnippet(
315
- model: Model,
316
- provider: InferenceProvider,
317
  language: InferenceSnippetLanguage,
318
  accessToken: string,
319
  opts?: {
@@ -325,32 +319,53 @@ export function getInferenceSnippet(
325
  structured_output?: ConversationEntityMembers["structuredOutput"];
326
  }
327
  ): GetInferenceSnippetReturn {
 
 
 
 
328
  // If it's a custom model, we don't generate inference snippets
329
  if (isCustomModel(model)) {
330
  return [];
331
  }
332
 
333
- const providerId = model.inferenceProviderMapping.find(p => p.provider === provider)?.providerId;
334
- const snippetsByClient = GET_SNIPPET_FN[language](
 
335
  { ...model, inference: "" },
336
  accessToken,
337
  provider,
338
- providerId,
339
  opts
340
  );
341
- return snippetsByClient.map(snippetByClient => ({ ...snippetByClient, language }));
342
- }
343
 
344
- /**
345
- * - If language is defined, the function checks if in an inference snippet is available for that specific language
346
- */
347
- export function hasInferenceSnippet(
348
- model: Model,
349
- provider: InferenceProvider,
350
- language: InferenceSnippetLanguage
351
- ): boolean {
352
- if (isCustomModel(model)) return false;
353
- return getInferenceSnippet(model, provider, language, "").length > 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
354
  }
355
 
356
  const tokenizers = new Map<string, PreTrainedTokenizer | null>();
 
1
  import ctxLengthData from "$lib/data/context_length.json";
2
+ import { InferenceClient, snippets } from "@huggingface/inference";
3
  import { ConversationClass, type ConversationEntityMembers } from "$lib/state/conversations.svelte";
4
  import { token } from "$lib/state/token.svelte";
5
  import {
 
13
  } from "$lib/types.js";
14
  import { safeParse } from "$lib/utils/json.js";
15
  import { omit, tryGet } from "$lib/utils/object.svelte.js";
16
+ import { type InferenceProvider } from "@huggingface/inference";
 
17
  import type { ChatCompletionInputMessage, InferenceSnippet } from "@huggingface/tasks";
18
  import { type ChatCompletionOutputMessage } from "@huggingface/tasks";
19
  import { AutoTokenizer, PreTrainedTokenizer } from "@huggingface/transformers";
 
21
  import { images } from "$lib/state/images.svelte.js";
22
  import { projects } from "$lib/state/projects.svelte.js";
23
  import { structuredForbiddenProviders } from "$lib/state/models.svelte.js";
24
+ import { modifySnippet } from "$lib/utils/snippets.js";
25
 
26
  type ChatCompletionInputMessageChunk =
27
  NonNullable<ChatCompletionInputMessage["content"]> extends string | (infer U)[] ? U : never;
 
50
 
51
  type HFCompletionMetadata = {
52
  type: "huggingface";
53
+ client: InferenceClient;
54
+ args: Parameters<InferenceClient["chatCompletion"]>[0];
55
  };
56
 
57
  type OpenAICompletionMetadata = {
 
82
  return ctxLength;
83
  }
84
 
85
+ function getResponseFormatObj(conversation: ConversationClass | Conversation) {
 
 
 
86
  const data = conversation instanceof ConversationClass ? conversation.data : conversation;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  const json = safeParse(data.structuredOutput?.schema ?? "");
88
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
89
  if (json && data.structuredOutput?.enabled && !structuredForbiddenProviders.includes(data.provider as any)) {
90
  switch (data.provider) {
91
  case "cohere": {
92
+ return {
93
  type: "json_object",
94
  ...json,
95
  };
 
96
  }
97
  case Provider.Cerebras: {
98
+ return {
99
  type: "json_schema",
100
  json_schema: { ...json, name: "schema" },
101
  };
 
102
  }
103
  default: {
104
+ return {
105
  type: "json_schema",
106
  json_schema: json,
107
  };
 
 
108
  }
109
  }
110
  }
111
+ }
112
+
113
+ async function getCompletionMetadata(
114
+ conversation: ConversationClass | Conversation,
115
+ signal?: AbortSignal
116
+ ): Promise<CompletionMetadata> {
117
+ const data = conversation instanceof ConversationClass ? conversation.data : conversation;
118
+ const model = conversation.model;
119
+ const systemMessage = projects.current?.systemMessage;
120
+
121
+ const messages: ConversationMessage[] = [
122
+ ...(isSystemPromptSupported(model) && systemMessage?.length ? [{ role: "system", content: systemMessage }] : []),
123
+ ...data.messages,
124
+ ];
125
+ const parsed = await Promise.all(messages.map(parseMessage));
126
+
127
+ const baseArgs = {
128
+ ...data.config,
129
+ messages: parsed,
130
+ model: model.id,
131
+ response_format: getResponseFormatObj(conversation),
132
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
133
+ } as any;
134
 
135
  // Handle OpenAI-compatible models
136
  if (isCustomModel(model)) {
 
164
  // Handle HuggingFace models
165
  return {
166
  type: "huggingface",
167
+ client: new InferenceClient(token.value),
168
  args,
169
  };
170
  }
 
300
  } as const;
301
 
302
  // Order of the elements in InferenceModal.svelte is determined by this const
303
+ export const inferenceSnippetLanguages = ["python", "js", "sh"] as const;
304
 
305
  export type InferenceSnippetLanguage = (typeof inferenceSnippetLanguages)[number];
306
 
307
+ export type GetInferenceSnippetReturn = InferenceSnippet[];
 
 
 
 
 
 
308
 
309
  export function getInferenceSnippet(
310
+ conversation: ConversationClass,
 
311
  language: InferenceSnippetLanguage,
312
  accessToken: string,
313
  opts?: {
 
319
  structured_output?: ConversationEntityMembers["structuredOutput"];
320
  }
321
  ): GetInferenceSnippetReturn {
322
+ const model = conversation.model;
323
+ const data = conversation.data;
324
+ const provider = (isCustomModel(model) ? "hf-inference" : data.provider) as InferenceProvider;
325
+
326
  // If it's a custom model, we don't generate inference snippets
327
  if (isCustomModel(model)) {
328
  return [];
329
  }
330
 
331
+ const providerMapping = model.inferenceProviderMapping.find(p => p.provider === provider);
332
+ if (!providerMapping) return [];
333
+ const allSnippets = snippets.getInferenceSnippets(
334
  { ...model, inference: "" },
335
  accessToken,
336
  provider,
337
+ { ...providerMapping, hfModelId: model.id },
338
  opts
339
  );
 
 
340
 
341
+ if (opts?.structured_output && !structuredForbiddenProviders.includes(provider as Provider)) {
342
+ allSnippets.forEach(s => {
343
+ const modified = modifySnippet(s.content, { prop: "hi" });
344
+ if (s.content === modified) {
345
+ console.log("Failed for", s.language, "\n");
346
+ } else {
347
+ console.log("Original snippet");
348
+ console.log(s.content);
349
+ console.log("\nModified");
350
+ console.log(modified);
351
+ console.log();
352
+ }
353
+ });
354
+ }
355
+
356
+ return allSnippets
357
+ .filter(s => s.language === language)
358
+ .map(s => {
359
+ if (opts?.structured_output && !structuredForbiddenProviders.includes(provider as Provider)) {
360
+ return {
361
+ ...s,
362
+ content: modifySnippet(s.content, {
363
+ response_format: getResponseFormatObj(conversation),
364
+ }),
365
+ };
366
+ }
367
+ return s;
368
+ });
369
  }
370
 
371
  const tokenizers = new Map<string, PreTrainedTokenizer | null>();
src/lib/state/conversations.svelte.ts CHANGED
@@ -8,9 +8,9 @@ import {
8
  } from "$lib/components/inference-playground/utils.svelte.js";
9
  import { addToast } from "$lib/components/toaster.svelte.js";
10
  import { AbortManager } from "$lib/spells/abort-manager.svelte";
11
- import { PipelineTag, type ConversationMessage, type GenerationStatistics, type Model } from "$lib/types.js";
12
  import { omit, snapshot } from "$lib/utils/object.svelte";
13
- import { models } from "./models.svelte";
14
  import { DEFAULT_PROJECT_ID, ProjectEntity, projects } from "./projects.svelte";
15
  import { token } from "./token.svelte";
16
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -103,6 +103,16 @@ export class ConversationClass {
103
  return this.#data;
104
  }
105
 
 
 
 
 
 
 
 
 
 
 
106
  async update(data: Partial<ConversationEntityMembers>) {
107
  if (this.data.id === -1) return;
108
  // if (this.data.id === undefined) return;
 
8
  } from "$lib/components/inference-playground/utils.svelte.js";
9
  import { addToast } from "$lib/components/toaster.svelte.js";
10
  import { AbortManager } from "$lib/spells/abort-manager.svelte";
11
+ import { PipelineTag, Provider, type ConversationMessage, type GenerationStatistics, type Model } from "$lib/types.js";
12
  import { omit, snapshot } from "$lib/utils/object.svelte";
13
+ import { models, structuredForbiddenProviders } from "./models.svelte";
14
  import { DEFAULT_PROJECT_ID, ProjectEntity, projects } from "./projects.svelte";
15
  import { token } from "./token.svelte";
16
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
 
103
  return this.#data;
104
  }
105
 
106
+ get isStructuredOutputAllowed() {
107
+ const forbiddenProvider =
108
+ this.data.provider && structuredForbiddenProviders.includes(this.data.provider as Provider);
109
+ return !forbiddenProvider;
110
+ }
111
+
112
+ get isStructuredOutputEnabled() {
113
+ return this.isStructuredOutputAllowed && this.data.structuredOutput?.enabled;
114
+ }
115
+
116
  async update(data: Partial<ConversationEntityMembers>) {
117
  if (this.data.id === -1) return;
118
  // if (this.data.id === undefined) return;
src/lib/types.ts CHANGED
@@ -3,7 +3,7 @@ import type { ChatCompletionInputMessage } from "@huggingface/tasks";
3
  import typia from "typia";
4
  import type { ConversationEntityMembers } from "./state/conversations.svelte";
5
 
6
- export type ConversationMessage = Pick<ChatCompletionInputMessage, "name" | "role" | "tool_calls"> & {
7
  content?: string;
8
  images?: string[];
9
  };
 
3
  import typia from "typia";
4
  import type { ConversationEntityMembers } from "./state/conversations.svelte";
5
 
6
+ export type ConversationMessage = Pick<ChatCompletionInputMessage, "name" | "role"> & {
7
  content?: string;
8
  images?: string[];
9
  };
src/lib/utils/snippets.spec.ts ADDED
@@ -0,0 +1,399 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* eslint-disable no-useless-escape */
2
+ import { describe, it, expect } from "vitest";
3
+ import { modifySnippet } from "./snippets.js";
4
+
5
+ // Shared object to add, including various types
6
+ const SHARED_OBJ_TO_ADD = {
7
+ maxTokens: 200,
8
+ frequencyPenalty: 0.3,
9
+ presencePenalty: null,
10
+ stopSequences: ["stop1", "stop2"],
11
+ complexObject: {
12
+ nestedKey: "nestedValue",
13
+ nestedNum: 123,
14
+ nestedBool: false,
15
+ nestedArr: ["a", 1, true, null],
16
+ },
17
+ anotherString: "test string",
18
+ isStreaming: true,
19
+ };
20
+
21
+ // Helper to create regex for matching stringified values (JS/JSON and Python)
22
+ // This version is updated to handle multi-line, indented ("pretty-printed") structures.
23
+ function createValueRegex(value: unknown, language: "js" | "python" | "json"): string {
24
+ // Flexible whitespace: matches any number of spaces, tabs, or newlines.
25
+ const ws = "(?:\\s|\\n)*";
26
+
27
+ if (typeof value === "string") {
28
+ return `"${value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}"`; // Escape special regex chars in string
29
+ }
30
+ if (value === null) {
31
+ return language === "python" ? "None" : "null";
32
+ }
33
+ if (typeof value === "boolean") {
34
+ return language === "python" ? (value ? "True" : "False") : String(value);
35
+ }
36
+ if (typeof value === "number") {
37
+ return String(value);
38
+ }
39
+ if (Array.isArray(value)) {
40
+ if (value.length === 0) {
41
+ return `\\[${ws}\\]`; // Matches "[]" or "[ \n ]" etc.
42
+ }
43
+ const itemRegexes = value.map(item => createValueRegex(item, language)).join(`${ws},${ws}`);
44
+ return `\\[${ws}${itemRegexes}${ws}\\]`;
45
+ }
46
+ if (typeof value === "object" && value !== null) {
47
+ const entries = Object.entries(value);
48
+ if (entries.length === 0) {
49
+ return `\\{${ws}\\}`; // Matches "{}" or "{ \n }" etc.
50
+ }
51
+ const entriesRegex = entries
52
+ .map(([k, v]) => {
53
+ // In Python kwargs, keys are not quoted. This regex builder is for values that look like JSON/Python dicts.
54
+ // The main test loops handle Python kwarg key formatting separately.
55
+ const keyRegex = `"${k.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}"`;
56
+ const valueRegexPart = createValueRegex(v, language);
57
+ return `${keyRegex}${ws}:${ws}${valueRegexPart}`;
58
+ })
59
+ .join(`${ws},${ws}`); // Join key-value pairs with a comma and flexible whitespace
60
+ return `\\{${ws}${entriesRegex}${ws}\\}`;
61
+ }
62
+ return String(value).replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // Fallback for other primitive types
63
+ }
64
+
65
+ type TestCase = {
66
+ snippet: string;
67
+ objToAdd: Record<string, unknown>;
68
+ description: string; // Optional description for the test
69
+ pythonSyntax?: "kwargs" | "dict"; // Add this field
70
+ };
71
+
72
+ // JavaScript/TypeScript test cases
73
+ const jsTestCases: TestCase[] = [
74
+ {
75
+ description: "JavaScript InferenceClient with chatCompletionStream",
76
+ snippet: `
77
+ import { InferenceClient } from "@huggingface/inference";
78
+
79
+ const client = new InferenceClient("YOUR_HF_TOKEN");
80
+
81
+ let out = "";
82
+
83
+ const stream = client.chatCompletionStream({
84
+ provider: "cerebras",
85
+ model: "Qwen/Qwen3-32B",
86
+ messages: [
87
+ {
88
+ role: "user",
89
+ content: "What is the capital of Brazil?",
90
+ },
91
+ {
92
+ content: "{\"answer_the_question\": 5, \"how_many_legs_does_a_dog_have\": true, \"answer_the_question_HERE\": \"elderberry\"}",
93
+ role: "assistant",
94
+ },
95
+ ],
96
+ temperature: 0.5,
97
+ top_p: 0.7,
98
+ });
99
+
100
+ for await (const chunk of stream) {
101
+ if (chunk.choices && chunk.choices.length > 0) {
102
+ const newContent = chunk.choices[0].delta.content;
103
+ out += newContent;
104
+ console.log(newContent);
105
+ }
106
+ }
107
+ `,
108
+ objToAdd: SHARED_OBJ_TO_ADD,
109
+ },
110
+ {
111
+ description: "JavaScript InferenceClient without streaming",
112
+ snippet: `import { InferenceClient } from "@huggingface/inference";
113
+
114
+ const client = new InferenceClient("YOUR_HF_TOKEN");
115
+
116
+ const chatCompletion = await client.chatCompletion({
117
+ provider: "cohere",
118
+ model: "CohereLabs/c4ai-command-r-plus",
119
+ messages: [
120
+ {
121
+ role: "user",
122
+ content: "hey, how are you???",
123
+ },
124
+ {
125
+ role: "assistant",
126
+ content: "{ \"answer_the_question\": \n\n\n\n \n \n\n-1.175\n\n\n\n, \n \"how_many_legs_does_a_dog_have\": \nfalse, \n\n\"answer_the_question_HERE\": \n\n\"A\"\n\n\n}",
127
+ },
128
+ ],
129
+ temperature: 0.5,
130
+ top_p: 0.7,
131
+ });
132
+
133
+ console.log(chatCompletion.choices[0].message);`,
134
+ objToAdd: SHARED_OBJ_TO_ADD,
135
+ },
136
+ {
137
+ description: "JavaScript with OpenAI library",
138
+ snippet: `import { OpenAI } from "openai";
139
+
140
+ const client = new OpenAI({
141
+ baseURL: "https://api.cerebras.ai/v1",
142
+ apiKey: "YOUR_HF_TOKEN",
143
+ });
144
+
145
+ const stream = await client.chat.completions.create({
146
+ model: "qwen-3-32b",
147
+ messages: [
148
+ {
149
+ role: "user",
150
+ content: "What is the capital of Brazil?",
151
+ },
152
+ {
153
+ content: "{\"answer_the_question\": 5, \"how_many_legs_does_a_dog_have\": true, \"answer_the_question_HERE\": \"elderberry\"}",
154
+ role: "assistant",
155
+ },
156
+ ],
157
+ temperature: 0.5,
158
+ top_p: 0.7,
159
+ stream: true,
160
+ });
161
+
162
+ for await (const chunk of stream) {
163
+ process.stdout.write(chunk.choices[0]?.delta?.content || "");
164
+ }`,
165
+ objToAdd: SHARED_OBJ_TO_ADD,
166
+ },
167
+ ];
168
+
169
+ // Python test cases
170
+ const pythonTestCases: TestCase[] = [
171
+ {
172
+ description: "Python HuggingFace client",
173
+ snippet: `from huggingface_hub import InferenceClient
174
+
175
+ client = InferenceClient(
176
+ provider="cerebras",
177
+ api_key="YOUR_HF_TOKEN",
178
+ )
179
+
180
+ stream = client.chat.completions.create(
181
+ model="Qwen/Qwen3-32B",
182
+ messages=[
183
+ {
184
+ "role": "user",
185
+ "content": "What is the capital of Brazil?"
186
+ },
187
+ {
188
+ "content": "{\"answer_the_question\": 5, \"how_many_legs_does_a_dog_have\": true, \"answer_the_question_HERE\": \"elderberry\"}",
189
+ "role": "assistant"
190
+ }
191
+ ],
192
+ temperature=0.5,
193
+ top_p=0.7,
194
+ stream=True,
195
+ )
196
+
197
+ for chunk in stream:
198
+ print(chunk.choices[0].delta.content, end="")`,
199
+ objToAdd: SHARED_OBJ_TO_ADD, // Use shared object
200
+ pythonSyntax: "kwargs",
201
+ },
202
+ {
203
+ description: "Python with Requests",
204
+ snippet: `import json
205
+ import requests
206
+
207
+ API_URL = "https://api.cerebras.ai/v1/chat/completions"
208
+ headers = {
209
+ "Authorization": "Bearer YOUR_HF_TOKEN",
210
+ }
211
+
212
+ def query(payload):
213
+ response = requests.post(API_URL, headers=headers, json=payload, stream=True)
214
+ for line in response.iter_lines():
215
+ if not line.startswith(b"data:"):
216
+ continue
217
+ if line.strip() == b"data: [DONE]":
218
+ return
219
+ yield json.loads(line.decode("utf-8").lstrip("data:").rstrip("/n"))
220
+
221
+ chunks = query({
222
+ "messages": [
223
+ {
224
+ "role": "user",
225
+ "content": "What is the capital of Brazil?"
226
+ },
227
+ {
228
+ "content": "{\"answer_the_question\": 5, \"how_many_legs_does_a_dog_have\": true, \"answer_the_question_HERE\": \"elderberry\"}",
229
+ "role": "assistant"
230
+ }
231
+ ],
232
+ "temperature": 0.5,
233
+ "top_p": 0.7,
234
+ "model": "qwen-3-32b",
235
+ "stream": True,
236
+ })
237
+
238
+ for chunk in chunks:
239
+ print(chunk["choices"][0]["delta"]["content"], end="")`,
240
+ objToAdd: SHARED_OBJ_TO_ADD, // Use shared object
241
+ pythonSyntax: "dict",
242
+ },
243
+ {
244
+ description: "Python OpenAI client",
245
+ snippet: `from openai import OpenAI
246
+
247
+ client = OpenAI(
248
+ base_url="https://api.cerebras.ai/v1",
249
+ api_key="YOUR_HF_TOKEN",
250
+ )
251
+
252
+ stream = client.chat.completions.create(
253
+ model="qwen-3-32b",
254
+ messages=[
255
+ {
256
+ "role": "user",
257
+ "content": "What is the capital of Brazil?"
258
+ },
259
+ {
260
+ "content": "{\"answer_the_question\": 5, \"how_many_legs_does_a_dog_have\": true, \"answer_the_question_HERE\": \"elderberry\"}",
261
+ "role": "assistant"
262
+ }
263
+ ],
264
+ temperature=0.5,
265
+ top_p=0.7,
266
+ stream=True,
267
+ )
268
+
269
+ for chunk in stream:
270
+ print(chunk.choices[0].delta.content, end="")`,
271
+ objToAdd: SHARED_OBJ_TO_ADD, // Use shared object
272
+ pythonSyntax: "kwargs",
273
+ },
274
+ // Add more Python test cases as needed
275
+ ];
276
+
277
+ // Shell/curl test cases
278
+ const shellTestCases: TestCase[] = [
279
+ {
280
+ description: "curl request to Cerebras API",
281
+ snippet: `
282
+ curl https://api.cerebras.ai/v1/chat/completions \\
283
+ -H 'Authorization: Bearer YOUR_HF_TOKEN' \\
284
+ -H 'Content-Type: application/json' \\
285
+ -d '{
286
+ "messages": [
287
+ {
288
+ "role": "user",
289
+ "content": "What is the capital of Brazil?"
290
+ },
291
+ {
292
+ "content": "{\"answer_the_question\": 5, \"how_many_legs_does_a_dog_have\": true, \"answer_the_question_HERE\": \"elderberry\"}",
293
+ "role": "assistant"
294
+ }
295
+ ],
296
+ "temperature": 0.5,
297
+ "top_p": 0.7,
298
+ "model": "qwen-3-32b",
299
+ "stream": false
300
+ }'
301
+ `,
302
+ objToAdd: SHARED_OBJ_TO_ADD, // Use shared object
303
+ },
304
+ // Add more shell test cases as needed
305
+ ];
306
+
307
+ describe("modifySnippet", () => {
308
+ // Test JavaScript/TypeScript snippets
309
+ describe("JavaScript/TypeScript", () => {
310
+ jsTestCases.forEach((testCase, index) => {
311
+ it(`should add properties to JS snippet #${index + 1}: ${testCase.description}`, () => {
312
+ const result = modifySnippet(testCase.snippet, testCase.objToAdd);
313
+
314
+ // Check that all new properties are added with correct JS syntax
315
+ Object.entries(testCase.objToAdd).forEach(([key, value]) => {
316
+ // For JS, keys are typically camelCase or as-is from the object.
317
+ // The value needs to be regex-matched due to potential complex structures.
318
+ const valueRegexStr = createValueRegex(value, "js");
319
+ // Regex to match 'key: value' or '"key": value' (for keys that might be quoted if they have special chars, though not in SHARED_OBJ_TO_ADD)
320
+ // Allowing for flexible spacing around colon.
321
+ const propertyPattern = new RegExp(`"${key}"\\s*:\\s*${valueRegexStr}|${key}\\s*:\\s*${valueRegexStr}`);
322
+ expect(result).toMatch(propertyPattern);
323
+ });
324
+
325
+ // Check that original properties are preserved
326
+ expect(result).toContain("temperature: 0.5");
327
+ expect(result).toContain("top_p: 0.7");
328
+
329
+ // Check that the structure is maintained
330
+ expect(result.includes("{") && result.includes("}")).toBeTruthy();
331
+ });
332
+ });
333
+ });
334
+
335
+ // Test Python snippets
336
+ describe("Python", () => {
337
+ pythonTestCases.forEach((testCase, index) => {
338
+ it(`should add properties to Python snippet #${index + 1}: ${testCase.description}`, () => {
339
+ const result = modifySnippet(testCase.snippet, testCase.objToAdd);
340
+
341
+ // Check that all new properties are added with correct Python syntax
342
+ Object.entries(testCase.objToAdd).forEach(([key, value]) => {
343
+ const valueRegexStr = createValueRegex(value, "python");
344
+ let propertyPattern;
345
+
346
+ if (testCase.pythonSyntax === "dict") {
347
+ // Python dict: "key": value
348
+ propertyPattern = new RegExp(`"${key}"\\s*:\\s*${valueRegexStr}`);
349
+ } else {
350
+ // Python kwargs: key=value
351
+ // Convert camelCase keys from SHARED_OBJ_TO_ADD to snake_case for Python kwargs
352
+ const snakeKey = key.replace(/([A-Z])/g, "_$1").toLowerCase();
353
+ propertyPattern = new RegExp(`${snakeKey}\\s*=\\s*${valueRegexStr}`);
354
+ }
355
+ expect(result).toMatch(propertyPattern);
356
+ });
357
+
358
+ // Check that original properties are preserved
359
+ if (testCase.pythonSyntax === "dict") {
360
+ expect(result).toContain('"temperature": 0.5');
361
+ expect(result).toContain('"top_p": 0.7');
362
+ expect(result.includes("{") && result.includes("}")).toBeTruthy();
363
+ } else {
364
+ // kwargs
365
+ expect(result).toContain("temperature=0.5");
366
+ expect(result).toContain("top_p=0.7");
367
+ expect(result.includes("(") && result.includes(")")).toBeTruthy();
368
+ }
369
+ });
370
+ });
371
+ });
372
+
373
+ // Test Shell/curl snippets
374
+ describe("Shell/curl", () => {
375
+ shellTestCases.forEach((testCase, index) => {
376
+ it(`should add properties to shell snippet #${index + 1}: ${testCase.description}`, () => {
377
+ const result = modifySnippet(testCase.snippet, testCase.objToAdd);
378
+
379
+ // Check that all new properties are added with correct JSON syntax
380
+ Object.entries(testCase.objToAdd).forEach(([key, value]) => {
381
+ // For shell/JSON, keys are typically snake_case or as-is.
382
+ // Values need to be regex-matched.
383
+ // Convert camelCase keys from SHARED_OBJ_TO_ADD to snake_case for JSON
384
+ const snakeKey = key.replace(/([A-Z])/g, "_$1").toLowerCase();
385
+ const valueRegexStr = createValueRegex(value, "json");
386
+ const propertyPattern = new RegExp(`"${snakeKey}"\\s*:\\s*${valueRegexStr}`);
387
+ expect(result).toMatch(propertyPattern);
388
+ });
389
+
390
+ // Check that original properties are preserved
391
+ expect(result).toContain(`"temperature": 0.5`);
392
+ expect(result).toContain(`"top_p": 0.7`);
393
+
394
+ // Check that the structure is maintained
395
+ expect(result.includes("{") && result.includes("}")).toBeTruthy();
396
+ });
397
+ });
398
+ });
399
+ });
src/lib/utils/snippets.ts ADDED
@@ -0,0 +1,294 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const INDENT_STEP = " "; // 4 spaces for indentation
2
+
3
+ function stringifyJsJsonRecursive(value: unknown, currentIndent: string): string {
4
+ if (typeof value === "string") return `"${value}"`;
5
+ if (value === null) return "null";
6
+ if (typeof value === "boolean" || typeof value === "number") return String(value);
7
+
8
+ if (typeof value === "object" && value !== null) {
9
+ const nextIndent = currentIndent + INDENT_STEP;
10
+ if (Array.isArray(value)) {
11
+ if (value.length === 0) return "[]";
12
+ const items = value.map(v => stringifyJsJsonRecursive(v, nextIndent));
13
+ return "[\n" + items.map(item => nextIndent + item).join(",\n") + "\n" + currentIndent + "]";
14
+ }
15
+
16
+ const entries = Object.entries(value);
17
+ if (entries.length === 0) return "{}";
18
+ const properties = entries.map(([k, v]) => `${nextIndent}"${k}": ${stringifyJsJsonRecursive(v, nextIndent)}`);
19
+
20
+ return "{\n" + properties.join(",\n") + "\n" + currentIndent + "}";
21
+ }
22
+ return String(value); // Fallback for other types
23
+ }
24
+
25
+ function formatJsJsonValue(value: unknown, baseIndent: string): string {
26
+ return stringifyJsJsonRecursive(value, baseIndent);
27
+ }
28
+
29
+ function stringifyPythonRecursive(value: unknown, currentIndent: string): string {
30
+ if (typeof value === "string") return `"${value}"`;
31
+ if (typeof value === "boolean") return value ? "True" : "False";
32
+ if (value === null) return "None";
33
+ if (typeof value === "number") return String(value);
34
+
35
+ if (typeof value === "object" && value !== null) {
36
+ const nextIndent = currentIndent + INDENT_STEP;
37
+ if (Array.isArray(value)) {
38
+ if (value.length === 0) return "[]";
39
+ const items = value.map(v => stringifyPythonRecursive(v, nextIndent));
40
+ return "[\n" + items.map(item => nextIndent + item).join(",\n") + "\n" + currentIndent + "]";
41
+ }
42
+
43
+ const entries = Object.entries(value);
44
+ if (entries.length === 0) return "{}";
45
+ // In Python, dictionary keys are typically strings.
46
+ const properties = entries.map(([k, v]) => `${nextIndent}"${k}": ${stringifyPythonRecursive(v, nextIndent)}`);
47
+
48
+ return "{\n" + properties.join(",\n") + "\n" + currentIndent + "}";
49
+ }
50
+ return String(value); // Fallback
51
+ }
52
+
53
+ function formatPythonValue(value: unknown, baseIndent: string): string {
54
+ return stringifyPythonRecursive(value, baseIndent);
55
+ }
56
+
57
+ /**
58
+ * Inserts new properties into a code snippet block (like a JS object or Python dict).
59
+ */
60
+ function insertPropertiesInternal(
61
+ snippet: string,
62
+ newProperties: Record<string, unknown>,
63
+ blockStartMarker: RegExp, // Regex to find the character *opening* the block (e.g., '{' or '(')
64
+ openChar: string, // The opening character, e.g., '{' or '('
65
+ closeChar: string, // The closing character, e.g., '}' or ')'
66
+ propFormatter: (key: string, formattedValue: string, indent: string) => string,
67
+ valueFormatter: (value: unknown, baseIndent: string) => string
68
+ ): string {
69
+ if (Object.keys(newProperties).length === 0) {
70
+ return snippet;
71
+ }
72
+
73
+ const match = snippet.match(blockStartMarker);
74
+ // match.index is the start of the whole marker, e.g. "client.chatCompletionStream("
75
+ // We need the index of the openChar itself.
76
+ if (!match || typeof match.index !== "number") {
77
+ return snippet;
78
+ }
79
+
80
+ const openCharIndex = snippet.indexOf(openChar, match.index + match[0].length - 1);
81
+ if (openCharIndex === -1) {
82
+ return snippet;
83
+ }
84
+
85
+ let balance = 1;
86
+ let closeCharIndex = -1;
87
+ for (let i = openCharIndex + 1; i < snippet.length; i++) {
88
+ if (snippet[i] === openChar) {
89
+ balance++;
90
+ } else if (snippet[i] === closeChar) {
91
+ balance--;
92
+ }
93
+ if (balance === 0) {
94
+ closeCharIndex = i;
95
+ break;
96
+ }
97
+ }
98
+
99
+ if (closeCharIndex === -1) {
100
+ return snippet; // Malformed or not found
101
+ }
102
+
103
+ const contentBeforeBlock = snippet.substring(0, openCharIndex + 1);
104
+ const currentContent = snippet.substring(openCharIndex + 1, closeCharIndex);
105
+ const contentAfterBlock = snippet.substring(closeCharIndex);
106
+
107
+ // Determine indentation
108
+ let indent = "";
109
+ const lines = currentContent.split("\n");
110
+ if (lines.length > 1) {
111
+ for (const line of lines) {
112
+ const lineIndentMatch = line.match(/^(\s+)\S/);
113
+ if (lineIndentMatch) {
114
+ indent = lineIndentMatch[1] ?? "";
115
+ break;
116
+ }
117
+ }
118
+ }
119
+ if (!indent) {
120
+ // If no indent found, or content is empty/single line, derive from openChar line
121
+ const lineOfOpenCharStart = snippet.lastIndexOf("\n", openCharIndex) + 1;
122
+ const lineOfOpenChar = snippet.substring(lineOfOpenCharStart, openCharIndex);
123
+ const openCharLineIndentMatch = lineOfOpenChar.match(/^(\s*)/);
124
+ indent = (openCharLineIndentMatch ? openCharLineIndentMatch[1] : "") + " "; // Default to 4 spaces more
125
+ }
126
+
127
+ let newPropsStr = "";
128
+ Object.entries(newProperties).forEach(([key, value]) => {
129
+ newPropsStr += propFormatter(key, valueFormatter(value, indent), indent);
130
+ });
131
+
132
+ const trimmedOriginalContent = currentContent.trim();
133
+ let combinedContent;
134
+
135
+ if (trimmedOriginalContent) {
136
+ // There was actual non-whitespace content.
137
+ // Preserve original currentContent structure as much as possible.
138
+ // Find the end of the textual part of currentContent (before any pure trailing whitespace).
139
+ let endOfTextualPart = currentContent.length;
140
+ while (endOfTextualPart > 0 && /\s/.test(currentContent.charAt(endOfTextualPart - 1))) {
141
+ endOfTextualPart--;
142
+ }
143
+ const textualPartOfCurrentContent = currentContent.substring(0, endOfTextualPart);
144
+ const trailingWhitespaceOfCurrentContent = currentContent.substring(endOfTextualPart);
145
+
146
+ let processedTextualPart = textualPartOfCurrentContent;
147
+ if (processedTextualPart && !processedTextualPart.endsWith(",")) {
148
+ processedTextualPart += ",";
149
+ }
150
+
151
+ // Add a newline separator if the original trailing whitespace doesn't end with one.
152
+ const separator =
153
+ trailingWhitespaceOfCurrentContent.endsWith("\n") || trailingWhitespaceOfCurrentContent.endsWith("\r")
154
+ ? ""
155
+ : "\n";
156
+ combinedContent = processedTextualPart + trailingWhitespaceOfCurrentContent + separator + newPropsStr;
157
+ } else {
158
+ // currentContent was empty or contained only whitespace.
159
+ // Check if the original block opening (e.g., '{' or '(') was immediately followed by a newline.
160
+ const openCharFollowedByNewline =
161
+ snippet[openCharIndex + 1] === "\n" ||
162
+ (snippet[openCharIndex + 1] === "\r" && snippet[openCharIndex + 2] === "\n");
163
+ if (openCharFollowedByNewline) {
164
+ combinedContent = newPropsStr; // newPropsStr already starts with indent
165
+ } else {
166
+ combinedContent = "\n" + newPropsStr; // Add a newline first, then newPropsStr
167
+ }
168
+ }
169
+
170
+ // Remove the trailing comma (and its trailing whitespace/newline) from the last property added.
171
+ combinedContent = combinedContent.replace(/,\s*$/, "");
172
+
173
+ // Ensure the block content ends with a newline, and the closing character is on its own line, indented.
174
+ if (combinedContent.trim()) {
175
+ // If there's any actual content in the block
176
+ if (!combinedContent.endsWith("\n")) {
177
+ combinedContent += "\n";
178
+ }
179
+ // Determine the base indent for the closing character's line
180
+ const lineOfOpenCharStart = snippet.lastIndexOf("\n", openCharIndex) + 1;
181
+ const openCharLine = snippet.substring(lineOfOpenCharStart, openCharIndex);
182
+ const baseIndentMatch = openCharLine.match(/^(\s*)/);
183
+ const baseIndent = baseIndentMatch ? baseIndentMatch[1] : "";
184
+ combinedContent += baseIndent;
185
+ } else {
186
+ // Block is effectively empty (e.g., was {} and no properties added, or newPropsStr was empty - though current logic prevents this if newProperties is not empty).
187
+ // Format as an empty block with the closing char on a new, indented line.
188
+ const lineOfOpenCharStart = snippet.lastIndexOf("\n", openCharIndex) + 1;
189
+ const openCharLine = snippet.substring(lineOfOpenCharStart, openCharIndex);
190
+ const baseIndentMatch = openCharLine.match(/^(\s*)/);
191
+ const baseIndent = baseIndentMatch ? baseIndentMatch[1] : "";
192
+
193
+ const openCharFollowedByNewline =
194
+ snippet[openCharIndex + 1] === "\n" ||
195
+ (snippet[openCharIndex + 1] === "\r" && snippet[openCharIndex + 2] === "\n");
196
+ if (openCharFollowedByNewline) {
197
+ // Original was like {\n}
198
+ combinedContent = baseIndent; // Just the indent for the closing char
199
+ } else {
200
+ // Original was like {}
201
+ combinedContent = "\n" + baseIndent; // Newline, then indent for closing char
202
+ }
203
+ }
204
+
205
+ return contentBeforeBlock + combinedContent + contentAfterBlock;
206
+ }
207
+
208
+ export function modifySnippet(snippet: string, newProperties: Record<string, unknown>): string {
209
+ // JS: HuggingFace InferenceClient (streaming)
210
+ if (snippet.includes("client.chatCompletionStream")) {
211
+ return insertPropertiesInternal(
212
+ snippet,
213
+ newProperties,
214
+ /client\.chatCompletionStream\s*\(\s*/, // Finds "client.chatCompletionStream("
215
+ "{", // The parameters are in an object literal
216
+ "}",
217
+ (key, value, indent) => `${indent}${key}: ${value},\n`, // JS object literal style
218
+ formatJsJsonValue
219
+ );
220
+ }
221
+ // JS: HuggingFace InferenceClient (non-streaming)
222
+ else if (snippet.includes("client.chatCompletion") && snippet.includes("InferenceClient")) {
223
+ // Ensure it's not the OpenAI client by also checking for InferenceClient
224
+ return insertPropertiesInternal(
225
+ snippet,
226
+ newProperties,
227
+ /client\.chatCompletion\s*\(\s*/, // Finds "client.chatCompletion("
228
+ "{", // The parameters are in an object literal
229
+ "}",
230
+ (key, value, indent) => `${indent}${key}: ${value},\n`, // JS object literal style
231
+ formatJsJsonValue
232
+ );
233
+ }
234
+ // JS: OpenAI Client
235
+ // Check for client.chat.completions.create and a common JS import pattern
236
+ else if (
237
+ snippet.includes("client.chat.completions.create") &&
238
+ (snippet.includes('import { OpenAI } from "openai"') || snippet.includes("new OpenAI("))
239
+ ) {
240
+ return insertPropertiesInternal(
241
+ snippet,
242
+ newProperties,
243
+ /client\.chat\.completions\.create\s*\(\s*/, // Finds "client.chat.completions.create("
244
+ "{", // The parameters are in an object literal
245
+ "}",
246
+ (key, value, indent) => `${indent}${key}: ${value},\n`,
247
+ formatJsJsonValue
248
+ );
249
+ }
250
+ // Python: OpenAI or HuggingFace Client using client.chat.completions.create
251
+ else if (snippet.includes("client.chat.completions.create")) {
252
+ return insertPropertiesInternal(
253
+ snippet,
254
+ newProperties,
255
+ /client\.chat\.completions\.create\s*\(/, // Finds "client.chat.completions.create("
256
+ "(", // The parameters are directly in the function call tuple
257
+ ")",
258
+ (key, value, indent) => {
259
+ const snakeKey = key.replace(/([A-Z])/g, "_$1").toLowerCase();
260
+ return `${indent}${snakeKey}=${value},\n`;
261
+ },
262
+ formatPythonValue
263
+ );
264
+ }
265
+ // Python: requests example with query({...})
266
+ else if (snippet.includes("def query(payload):") && snippet.includes("query({")) {
267
+ return insertPropertiesInternal(
268
+ snippet,
269
+ newProperties,
270
+ /query\s*\(\s*/, // Finds "query(" and expects a dictionary literal next
271
+ "{", // The parameters are in a dictionary literal
272
+ "}",
273
+ // Python dict keys are strings, values formatted for Python
274
+ (key, formattedValue, indent) => `${indent}"${key}": ${formattedValue},\n`,
275
+ formatPythonValue // Use formatPythonValue for the values themselves
276
+ );
277
+ }
278
+ // Shell/curl (JSON content)
279
+ else if (snippet.includes("curl") && snippet.includes("-d")) {
280
+ return insertPropertiesInternal(
281
+ snippet,
282
+ newProperties,
283
+ /-d\s*'(?:\\n)?\s*/,
284
+ "{",
285
+ "}",
286
+ (key, value, indent) => {
287
+ const snakeKey = key.replace(/([A-Z])/g, "_$1").toLowerCase();
288
+ return `${indent}"${snakeKey}": ${value},\n`;
289
+ },
290
+ formatJsJsonValue
291
+ );
292
+ }
293
+ return snippet;
294
+ }
vite.config.ts CHANGED
@@ -1,3 +1,4 @@
 
1
  import { sveltekit } from "@sveltejs/kit/vite";
2
  import { defineConfig } from "vite";
3
  import UnpluginTypia from "@ryoppippi/unplugin-typia/vite";
@@ -7,17 +8,34 @@ export const isDev = process.env.NODE_ENV === "development";
7
 
8
  export default defineConfig({
9
  plugins: [
10
- UnpluginTypia({
11
- log: "verbose",
12
- cache: false,
13
- }),
14
  sveltekit(),
15
- Icons({
16
- compiler: "svelte",
17
- autoInstall: true,
18
- }),
19
  ],
20
- server: {
21
- allowedHosts: isDev ? true : undefined,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  },
23
  });
 
1
+ import { svelteTesting } from "@testing-library/svelte/vite";
2
  import { sveltekit } from "@sveltejs/kit/vite";
3
  import { defineConfig } from "vite";
4
  import UnpluginTypia from "@ryoppippi/unplugin-typia/vite";
 
8
 
9
  export default defineConfig({
10
  plugins: [
11
+ UnpluginTypia({ log: "verbose", cache: false }),
 
 
 
12
  sveltekit(),
13
+ Icons({ compiler: "svelte", autoInstall: true }),
 
 
 
14
  ],
15
+ server: { allowedHosts: isDev ? true : undefined },
16
+ test: {
17
+ workspace: [
18
+ {
19
+ extends: "./vite.config.ts",
20
+ plugins: [svelteTesting()],
21
+ test: {
22
+ name: "client",
23
+ environment: "jsdom",
24
+ clearMocks: true,
25
+ include: ["src/**/*.svelte.{test,spec}.{js,ts}"],
26
+ exclude: ["src/lib/server/**"],
27
+ setupFiles: ["./vitest-setup-client.ts"],
28
+ },
29
+ },
30
+ {
31
+ extends: "./vite.config.ts",
32
+ test: {
33
+ name: "server",
34
+ environment: "node",
35
+ include: ["src/**/*.{test,spec}.{js,ts}"],
36
+ exclude: ["src/**/*.svelte.{test,spec}.{js,ts}"],
37
+ },
38
+ },
39
+ ],
40
  },
41
  });
vitest-setup-client.ts ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import "@testing-library/jest-dom/vitest";
2
+ import { vi } from "vitest";
3
+
4
+ // required for svelte5 + jsdom as jsdom does not support matchMedia
5
+ Object.defineProperty(window, "matchMedia", {
6
+ writable: true,
7
+ enumerable: true,
8
+ value: vi.fn().mockImplementation(query => ({
9
+ matches: false,
10
+ media: query,
11
+ onchange: null,
12
+ addEventListener: vi.fn(),
13
+ removeEventListener: vi.fn(),
14
+ dispatchEvent: vi.fn(),
15
+ })),
16
+ });
17
+
18
+ // add more mocks here if you need them