Fraser commited on
Commit
ec2b26e
·
1 Parent(s): ddfebff

try fix client

Browse files
package-lock.json CHANGED
@@ -8,6 +8,7 @@
8
  "name": "svelte",
9
  "version": "0.0.0",
10
  "dependencies": {
 
11
  "@imgly/background-removal": "^1.7.0",
12
  "dexie": "^4.0.11"
13
  },
@@ -39,6 +40,34 @@
39
  "node": ">=6.0.0"
40
  }
41
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  "node_modules/@esbuild/aix-ppc64": {
43
  "version": "0.25.6",
44
  "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz",
@@ -481,6 +510,26 @@
481
  "node": ">=18"
482
  }
483
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
484
  "node_modules/@imgly/background-removal": {
485
  "version": "1.7.0",
486
  "resolved": "https://registry.npmjs.org/@imgly/background-removal/-/background-removal-1.7.0.tgz",
@@ -495,6 +544,80 @@
495
  "onnxruntime-web": "1.21.0"
496
  }
497
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
498
  "node_modules/@jridgewell/gen-mapping": {
499
  "version": "0.3.12",
500
  "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
@@ -534,6 +657,45 @@
534
  "@jridgewell/sourcemap-codec": "^1.4.14"
535
  }
536
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
537
  "node_modules/@polka/url": {
538
  "version": "1.0.0-next.29",
539
  "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
@@ -962,6 +1124,12 @@
962
  "@types/deep-eql": "*"
963
  }
964
  },
 
 
 
 
 
 
965
  "node_modules/@types/deep-eql": {
966
  "version": "4.0.2",
967
  "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
@@ -976,6 +1144,12 @@
976
  "dev": true,
977
  "license": "MIT"
978
  },
 
 
 
 
 
 
979
  "node_modules/@types/node": {
980
  "version": "24.0.14",
981
  "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.14.tgz",
@@ -985,6 +1159,18 @@
985
  "undici-types": "~7.8.0"
986
  }
987
  },
 
 
 
 
 
 
 
 
 
 
 
 
988
  "node_modules/@types/whatwg-mimetype": {
989
  "version": "3.0.2",
990
  "resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz",
@@ -1142,6 +1328,57 @@
1142
  "node": ">=0.4.0"
1143
  }
1144
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1145
  "node_modules/aria-query": {
1146
  "version": "5.3.2",
1147
  "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
@@ -1172,6 +1409,19 @@
1172
  "node": ">= 0.4"
1173
  }
1174
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
1175
  "node_modules/cac": {
1176
  "version": "6.7.14",
1177
  "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
@@ -1225,6 +1475,46 @@
1225
  "url": "https://paulmillr.com/funding/"
1226
  }
1227
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1228
  "node_modules/clsx": {
1229
  "version": "2.1.1",
1230
  "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
@@ -1235,6 +1525,33 @@
1235
  "node": ">=6"
1236
  }
1237
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1238
  "node_modules/debug": {
1239
  "version": "4.4.1",
1240
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
@@ -1279,6 +1596,12 @@
1279
  "integrity": "sha512-SOKO002EqlvBYYKQSew3iymBoN2EQ4BDw/3yprjh7kAfFzjBYkaMNa/pZvcA7HSWlcKSQb9XhPe3wKyQ0x4A8A==",
1280
  "license": "Apache-2.0"
1281
  },
 
 
 
 
 
 
1282
  "node_modules/es-module-lexer": {
1283
  "version": "1.7.0",
1284
  "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
@@ -1328,6 +1651,15 @@
1328
  "@esbuild/win32-x64": "0.25.6"
1329
  }
1330
  },
 
 
 
 
 
 
 
 
 
1331
  "node_modules/esm-env": {
1332
  "version": "1.2.2",
1333
  "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
@@ -1355,6 +1687,15 @@
1355
  "@types/estree": "^1.0.0"
1356
  }
1357
  },
 
 
 
 
 
 
 
 
 
1358
  "node_modules/expect-type": {
1359
  "version": "1.2.2",
1360
  "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz",
@@ -1390,6 +1731,12 @@
1390
  }
1391
  }
1392
  },
 
 
 
 
 
 
1393
  "node_modules/fflate": {
1394
  "version": "0.8.2",
1395
  "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
@@ -1426,6 +1773,24 @@
1426
  "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1427
  }
1428
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1429
  "node_modules/guid-typescript": {
1430
  "version": "1.0.9",
1431
  "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz",
@@ -1465,6 +1830,12 @@
1465
  "dev": true,
1466
  "license": "MIT"
1467
  },
 
 
 
 
 
 
1468
  "node_modules/iota-array": {
1469
  "version": "1.0.0",
1470
  "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz",
@@ -1477,6 +1848,21 @@
1477
  "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
1478
  "license": "MIT"
1479
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1480
  "node_modules/is-reference": {
1481
  "version": "3.0.3",
1482
  "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz",
@@ -1568,6 +1954,59 @@
1568
  "dev": true,
1569
  "license": "MIT"
1570
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1571
  "node_modules/nanoid": {
1572
  "version": "3.3.11",
1573
  "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
@@ -1597,6 +2036,17 @@
1597
  "is-buffer": "^1.0.2"
1598
  }
1599
  },
 
 
 
 
 
 
 
 
 
 
 
1600
  "node_modules/onnxruntime-common": {
1601
  "version": "1.21.0",
1602
  "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0.tgz",
@@ -1619,6 +2069,18 @@
1619
  "protobufjs": "^7.2.4"
1620
  }
1621
  },
 
 
 
 
 
 
 
 
 
 
 
 
1622
  "node_modules/pathe": {
1623
  "version": "2.0.3",
1624
  "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
@@ -1640,7 +2102,6 @@
1640
  "version": "1.1.1",
1641
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1642
  "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1643
- "dev": true,
1644
  "license": "ISC"
1645
  },
1646
  "node_modules/picomatch": {
@@ -1717,6 +2178,33 @@
1717
  "node": ">=12.0.0"
1718
  }
1719
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1720
  "node_modules/readdirp": {
1721
  "version": "4.1.2",
1722
  "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
@@ -1731,6 +2219,21 @@
1731
  "url": "https://paulmillr.com/funding/"
1732
  }
1733
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1734
  "node_modules/rollup": {
1735
  "version": "4.45.1",
1736
  "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz",
@@ -1784,6 +2287,15 @@
1784
  "node": ">=6"
1785
  }
1786
  },
 
 
 
 
 
 
 
 
 
1787
  "node_modules/siginfo": {
1788
  "version": "2.0.0",
1789
  "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
@@ -1791,6 +2303,18 @@
1791
  "dev": true,
1792
  "license": "ISC"
1793
  },
 
 
 
 
 
 
 
 
 
 
 
 
1794
  "node_modules/sirv": {
1795
  "version": "3.0.1",
1796
  "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz",
@@ -1823,6 +2347,15 @@
1823
  "dev": true,
1824
  "license": "MIT"
1825
  },
 
 
 
 
 
 
 
 
 
1826
  "node_modules/std-env": {
1827
  "version": "3.9.0",
1828
  "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz",
@@ -1830,6 +2363,38 @@
1830
  "dev": true,
1831
  "license": "MIT"
1832
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1833
  "node_modules/strip-literal": {
1834
  "version": "3.0.0",
1835
  "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz",
@@ -1893,6 +2458,12 @@
1893
  "typescript": ">=5.0.0"
1894
  }
1895
  },
 
 
 
 
 
 
1896
  "node_modules/tinybench": {
1897
  "version": "2.9.0",
1898
  "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
@@ -1964,11 +2535,37 @@
1964
  "node": ">=6"
1965
  }
1966
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1967
  "node_modules/typescript": {
1968
  "version": "5.8.3",
1969
  "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
1970
  "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
1971
- "dev": true,
1972
  "license": "Apache-2.0",
1973
  "bin": {
1974
  "tsc": "bin/tsc",
@@ -1984,6 +2581,25 @@
1984
  "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
1985
  "license": "MIT"
1986
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1987
  "node_modules/vite": {
1988
  "version": "6.3.5",
1989
  "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz",
@@ -2202,6 +2818,89 @@
2202
  "node": ">=8"
2203
  }
2204
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2205
  "node_modules/zimmerframe": {
2206
  "version": "1.1.2",
2207
  "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz",
 
8
  "name": "svelte",
9
  "version": "0.0.0",
10
  "dependencies": {
11
+ "@gradio/client": "^1.15.6",
12
  "@imgly/background-removal": "^1.7.0",
13
  "dexie": "^4.0.11"
14
  },
 
40
  "node": ">=6.0.0"
41
  }
42
  },
43
+ "node_modules/@bundled-es-modules/cookie": {
44
+ "version": "2.0.1",
45
+ "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.1.tgz",
46
+ "integrity": "sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==",
47
+ "license": "ISC",
48
+ "dependencies": {
49
+ "cookie": "^0.7.2"
50
+ }
51
+ },
52
+ "node_modules/@bundled-es-modules/statuses": {
53
+ "version": "1.0.1",
54
+ "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz",
55
+ "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==",
56
+ "license": "ISC",
57
+ "dependencies": {
58
+ "statuses": "^2.0.1"
59
+ }
60
+ },
61
+ "node_modules/@bundled-es-modules/tough-cookie": {
62
+ "version": "0.1.6",
63
+ "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz",
64
+ "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==",
65
+ "license": "ISC",
66
+ "dependencies": {
67
+ "@types/tough-cookie": "^4.0.5",
68
+ "tough-cookie": "^4.1.4"
69
+ }
70
+ },
71
  "node_modules/@esbuild/aix-ppc64": {
72
  "version": "0.25.6",
73
  "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz",
 
510
  "node": ">=18"
511
  }
512
  },
513
+ "node_modules/@gradio/client": {
514
+ "version": "1.15.6",
515
+ "resolved": "https://registry.npmjs.org/@gradio/client/-/client-1.15.6.tgz",
516
+ "integrity": "sha512-QDUj2uubhp8emy7vSF/27Pn7X/tTiI2kOIL4ymiqClw9ps3DMZnsmUgKg0JSQ0w/ir71kWV0zcmJLtsy2E+KKw==",
517
+ "license": "ISC",
518
+ "dependencies": {
519
+ "@types/eventsource": "^1.1.15",
520
+ "bufferutil": "^4.0.7",
521
+ "eventsource": "^2.0.2",
522
+ "fetch-event-stream": "^0.1.5",
523
+ "msw": "^2.2.1",
524
+ "semiver": "^1.1.0",
525
+ "textlinestream": "^1.1.1",
526
+ "typescript": "^5.0.0",
527
+ "ws": "^8.13.0"
528
+ },
529
+ "engines": {
530
+ "node": ">=18.0.0"
531
+ }
532
+ },
533
  "node_modules/@imgly/background-removal": {
534
  "version": "1.7.0",
535
  "resolved": "https://registry.npmjs.org/@imgly/background-removal/-/background-removal-1.7.0.tgz",
 
544
  "onnxruntime-web": "1.21.0"
545
  }
546
  },
547
+ "node_modules/@inquirer/confirm": {
548
+ "version": "5.1.14",
549
+ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.14.tgz",
550
+ "integrity": "sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==",
551
+ "license": "MIT",
552
+ "dependencies": {
553
+ "@inquirer/core": "^10.1.15",
554
+ "@inquirer/type": "^3.0.8"
555
+ },
556
+ "engines": {
557
+ "node": ">=18"
558
+ },
559
+ "peerDependencies": {
560
+ "@types/node": ">=18"
561
+ },
562
+ "peerDependenciesMeta": {
563
+ "@types/node": {
564
+ "optional": true
565
+ }
566
+ }
567
+ },
568
+ "node_modules/@inquirer/core": {
569
+ "version": "10.1.15",
570
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.15.tgz",
571
+ "integrity": "sha512-8xrp836RZvKkpNbVvgWUlxjT4CraKk2q+I3Ksy+seI2zkcE+y6wNs1BVhgcv8VyImFecUhdQrYLdW32pAjwBdA==",
572
+ "license": "MIT",
573
+ "dependencies": {
574
+ "@inquirer/figures": "^1.0.13",
575
+ "@inquirer/type": "^3.0.8",
576
+ "ansi-escapes": "^4.3.2",
577
+ "cli-width": "^4.1.0",
578
+ "mute-stream": "^2.0.0",
579
+ "signal-exit": "^4.1.0",
580
+ "wrap-ansi": "^6.2.0",
581
+ "yoctocolors-cjs": "^2.1.2"
582
+ },
583
+ "engines": {
584
+ "node": ">=18"
585
+ },
586
+ "peerDependencies": {
587
+ "@types/node": ">=18"
588
+ },
589
+ "peerDependenciesMeta": {
590
+ "@types/node": {
591
+ "optional": true
592
+ }
593
+ }
594
+ },
595
+ "node_modules/@inquirer/figures": {
596
+ "version": "1.0.13",
597
+ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz",
598
+ "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==",
599
+ "license": "MIT",
600
+ "engines": {
601
+ "node": ">=18"
602
+ }
603
+ },
604
+ "node_modules/@inquirer/type": {
605
+ "version": "3.0.8",
606
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz",
607
+ "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==",
608
+ "license": "MIT",
609
+ "engines": {
610
+ "node": ">=18"
611
+ },
612
+ "peerDependencies": {
613
+ "@types/node": ">=18"
614
+ },
615
+ "peerDependenciesMeta": {
616
+ "@types/node": {
617
+ "optional": true
618
+ }
619
+ }
620
+ },
621
  "node_modules/@jridgewell/gen-mapping": {
622
  "version": "0.3.12",
623
  "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
 
657
  "@jridgewell/sourcemap-codec": "^1.4.14"
658
  }
659
  },
660
+ "node_modules/@mswjs/interceptors": {
661
+ "version": "0.39.3",
662
+ "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.39.3.tgz",
663
+ "integrity": "sha512-9bw/wBL7pblsnOCIqvn1788S9o4h+cC5HWXg0Xhh0dOzsZ53IyfmBM+FYqpDDPbm0xjCqEqvCITloF3Dm4TXRQ==",
664
+ "license": "MIT",
665
+ "dependencies": {
666
+ "@open-draft/deferred-promise": "^2.2.0",
667
+ "@open-draft/logger": "^0.3.0",
668
+ "@open-draft/until": "^2.0.0",
669
+ "is-node-process": "^1.2.0",
670
+ "outvariant": "^1.4.3",
671
+ "strict-event-emitter": "^0.5.1"
672
+ },
673
+ "engines": {
674
+ "node": ">=18"
675
+ }
676
+ },
677
+ "node_modules/@open-draft/deferred-promise": {
678
+ "version": "2.2.0",
679
+ "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz",
680
+ "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==",
681
+ "license": "MIT"
682
+ },
683
+ "node_modules/@open-draft/logger": {
684
+ "version": "0.3.0",
685
+ "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz",
686
+ "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==",
687
+ "license": "MIT",
688
+ "dependencies": {
689
+ "is-node-process": "^1.2.0",
690
+ "outvariant": "^1.4.0"
691
+ }
692
+ },
693
+ "node_modules/@open-draft/until": {
694
+ "version": "2.1.0",
695
+ "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz",
696
+ "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==",
697
+ "license": "MIT"
698
+ },
699
  "node_modules/@polka/url": {
700
  "version": "1.0.0-next.29",
701
  "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
 
1124
  "@types/deep-eql": "*"
1125
  }
1126
  },
1127
+ "node_modules/@types/cookie": {
1128
+ "version": "0.6.0",
1129
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
1130
+ "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
1131
+ "license": "MIT"
1132
+ },
1133
  "node_modules/@types/deep-eql": {
1134
  "version": "4.0.2",
1135
  "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
 
1144
  "dev": true,
1145
  "license": "MIT"
1146
  },
1147
+ "node_modules/@types/eventsource": {
1148
+ "version": "1.1.15",
1149
+ "resolved": "https://registry.npmjs.org/@types/eventsource/-/eventsource-1.1.15.tgz",
1150
+ "integrity": "sha512-XQmGcbnxUNa06HR3VBVkc9+A2Vpi9ZyLJcdS5dwaQQ/4ZMWFO+5c90FnMUpbtMZwB/FChoYHwuVg8TvkECacTA==",
1151
+ "license": "MIT"
1152
+ },
1153
  "node_modules/@types/node": {
1154
  "version": "24.0.14",
1155
  "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.14.tgz",
 
1159
  "undici-types": "~7.8.0"
1160
  }
1161
  },
1162
+ "node_modules/@types/statuses": {
1163
+ "version": "2.0.6",
1164
+ "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz",
1165
+ "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==",
1166
+ "license": "MIT"
1167
+ },
1168
+ "node_modules/@types/tough-cookie": {
1169
+ "version": "4.0.5",
1170
+ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
1171
+ "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
1172
+ "license": "MIT"
1173
+ },
1174
  "node_modules/@types/whatwg-mimetype": {
1175
  "version": "3.0.2",
1176
  "resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz",
 
1328
  "node": ">=0.4.0"
1329
  }
1330
  },
1331
+ "node_modules/ansi-escapes": {
1332
+ "version": "4.3.2",
1333
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
1334
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
1335
+ "license": "MIT",
1336
+ "dependencies": {
1337
+ "type-fest": "^0.21.3"
1338
+ },
1339
+ "engines": {
1340
+ "node": ">=8"
1341
+ },
1342
+ "funding": {
1343
+ "url": "https://github.com/sponsors/sindresorhus"
1344
+ }
1345
+ },
1346
+ "node_modules/ansi-escapes/node_modules/type-fest": {
1347
+ "version": "0.21.3",
1348
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
1349
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
1350
+ "license": "(MIT OR CC0-1.0)",
1351
+ "engines": {
1352
+ "node": ">=10"
1353
+ },
1354
+ "funding": {
1355
+ "url": "https://github.com/sponsors/sindresorhus"
1356
+ }
1357
+ },
1358
+ "node_modules/ansi-regex": {
1359
+ "version": "5.0.1",
1360
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1361
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1362
+ "license": "MIT",
1363
+ "engines": {
1364
+ "node": ">=8"
1365
+ }
1366
+ },
1367
+ "node_modules/ansi-styles": {
1368
+ "version": "4.3.0",
1369
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1370
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1371
+ "license": "MIT",
1372
+ "dependencies": {
1373
+ "color-convert": "^2.0.1"
1374
+ },
1375
+ "engines": {
1376
+ "node": ">=8"
1377
+ },
1378
+ "funding": {
1379
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1380
+ }
1381
+ },
1382
  "node_modules/aria-query": {
1383
  "version": "5.3.2",
1384
  "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
 
1409
  "node": ">= 0.4"
1410
  }
1411
  },
1412
+ "node_modules/bufferutil": {
1413
+ "version": "4.0.9",
1414
+ "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz",
1415
+ "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==",
1416
+ "hasInstallScript": true,
1417
+ "license": "MIT",
1418
+ "dependencies": {
1419
+ "node-gyp-build": "^4.3.0"
1420
+ },
1421
+ "engines": {
1422
+ "node": ">=6.14.2"
1423
+ }
1424
+ },
1425
  "node_modules/cac": {
1426
  "version": "6.7.14",
1427
  "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
 
1475
  "url": "https://paulmillr.com/funding/"
1476
  }
1477
  },
1478
+ "node_modules/cli-width": {
1479
+ "version": "4.1.0",
1480
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
1481
+ "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
1482
+ "license": "ISC",
1483
+ "engines": {
1484
+ "node": ">= 12"
1485
+ }
1486
+ },
1487
+ "node_modules/cliui": {
1488
+ "version": "8.0.1",
1489
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
1490
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
1491
+ "license": "ISC",
1492
+ "dependencies": {
1493
+ "string-width": "^4.2.0",
1494
+ "strip-ansi": "^6.0.1",
1495
+ "wrap-ansi": "^7.0.0"
1496
+ },
1497
+ "engines": {
1498
+ "node": ">=12"
1499
+ }
1500
+ },
1501
+ "node_modules/cliui/node_modules/wrap-ansi": {
1502
+ "version": "7.0.0",
1503
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
1504
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
1505
+ "license": "MIT",
1506
+ "dependencies": {
1507
+ "ansi-styles": "^4.0.0",
1508
+ "string-width": "^4.1.0",
1509
+ "strip-ansi": "^6.0.0"
1510
+ },
1511
+ "engines": {
1512
+ "node": ">=10"
1513
+ },
1514
+ "funding": {
1515
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1516
+ }
1517
+ },
1518
  "node_modules/clsx": {
1519
  "version": "2.1.1",
1520
  "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
 
1525
  "node": ">=6"
1526
  }
1527
  },
1528
+ "node_modules/color-convert": {
1529
+ "version": "2.0.1",
1530
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1531
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1532
+ "license": "MIT",
1533
+ "dependencies": {
1534
+ "color-name": "~1.1.4"
1535
+ },
1536
+ "engines": {
1537
+ "node": ">=7.0.0"
1538
+ }
1539
+ },
1540
+ "node_modules/color-name": {
1541
+ "version": "1.1.4",
1542
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1543
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1544
+ "license": "MIT"
1545
+ },
1546
+ "node_modules/cookie": {
1547
+ "version": "0.7.2",
1548
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
1549
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
1550
+ "license": "MIT",
1551
+ "engines": {
1552
+ "node": ">= 0.6"
1553
+ }
1554
+ },
1555
  "node_modules/debug": {
1556
  "version": "4.4.1",
1557
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
 
1596
  "integrity": "sha512-SOKO002EqlvBYYKQSew3iymBoN2EQ4BDw/3yprjh7kAfFzjBYkaMNa/pZvcA7HSWlcKSQb9XhPe3wKyQ0x4A8A==",
1597
  "license": "Apache-2.0"
1598
  },
1599
+ "node_modules/emoji-regex": {
1600
+ "version": "8.0.0",
1601
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
1602
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
1603
+ "license": "MIT"
1604
+ },
1605
  "node_modules/es-module-lexer": {
1606
  "version": "1.7.0",
1607
  "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
 
1651
  "@esbuild/win32-x64": "0.25.6"
1652
  }
1653
  },
1654
+ "node_modules/escalade": {
1655
+ "version": "3.2.0",
1656
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1657
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1658
+ "license": "MIT",
1659
+ "engines": {
1660
+ "node": ">=6"
1661
+ }
1662
+ },
1663
  "node_modules/esm-env": {
1664
  "version": "1.2.2",
1665
  "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
 
1687
  "@types/estree": "^1.0.0"
1688
  }
1689
  },
1690
+ "node_modules/eventsource": {
1691
+ "version": "2.0.2",
1692
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz",
1693
+ "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==",
1694
+ "license": "MIT",
1695
+ "engines": {
1696
+ "node": ">=12.0.0"
1697
+ }
1698
+ },
1699
  "node_modules/expect-type": {
1700
  "version": "1.2.2",
1701
  "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz",
 
1731
  }
1732
  }
1733
  },
1734
+ "node_modules/fetch-event-stream": {
1735
+ "version": "0.1.5",
1736
+ "resolved": "https://registry.npmjs.org/fetch-event-stream/-/fetch-event-stream-0.1.5.tgz",
1737
+ "integrity": "sha512-V1PWovkspxQfssq/NnxoEyQo1DV+MRK/laPuPblIZmSjMN8P5u46OhlFQznSr9p/t0Sp8Uc6SbM3yCMfr0KU8g==",
1738
+ "license": "MIT"
1739
+ },
1740
  "node_modules/fflate": {
1741
  "version": "0.8.2",
1742
  "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
 
1773
  "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1774
  }
1775
  },
1776
+ "node_modules/get-caller-file": {
1777
+ "version": "2.0.5",
1778
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
1779
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
1780
+ "license": "ISC",
1781
+ "engines": {
1782
+ "node": "6.* || 8.* || >= 10.*"
1783
+ }
1784
+ },
1785
+ "node_modules/graphql": {
1786
+ "version": "16.11.0",
1787
+ "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz",
1788
+ "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==",
1789
+ "license": "MIT",
1790
+ "engines": {
1791
+ "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0"
1792
+ }
1793
+ },
1794
  "node_modules/guid-typescript": {
1795
  "version": "1.0.9",
1796
  "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz",
 
1830
  "dev": true,
1831
  "license": "MIT"
1832
  },
1833
+ "node_modules/headers-polyfill": {
1834
+ "version": "4.0.3",
1835
+ "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz",
1836
+ "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==",
1837
+ "license": "MIT"
1838
+ },
1839
  "node_modules/iota-array": {
1840
  "version": "1.0.0",
1841
  "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz",
 
1848
  "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
1849
  "license": "MIT"
1850
  },
1851
+ "node_modules/is-fullwidth-code-point": {
1852
+ "version": "3.0.0",
1853
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1854
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1855
+ "license": "MIT",
1856
+ "engines": {
1857
+ "node": ">=8"
1858
+ }
1859
+ },
1860
+ "node_modules/is-node-process": {
1861
+ "version": "1.2.0",
1862
+ "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz",
1863
+ "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==",
1864
+ "license": "MIT"
1865
+ },
1866
  "node_modules/is-reference": {
1867
  "version": "3.0.3",
1868
  "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz",
 
1954
  "dev": true,
1955
  "license": "MIT"
1956
  },
1957
+ "node_modules/msw": {
1958
+ "version": "2.10.4",
1959
+ "resolved": "https://registry.npmjs.org/msw/-/msw-2.10.4.tgz",
1960
+ "integrity": "sha512-6R1or/qyele7q3RyPwNuvc0IxO8L8/Aim6Sz5ncXEgcWUNxSKE+udriTOWHtpMwmfkLYlacA2y7TIx4cL5lgHA==",
1961
+ "hasInstallScript": true,
1962
+ "license": "MIT",
1963
+ "dependencies": {
1964
+ "@bundled-es-modules/cookie": "^2.0.1",
1965
+ "@bundled-es-modules/statuses": "^1.0.1",
1966
+ "@bundled-es-modules/tough-cookie": "^0.1.6",
1967
+ "@inquirer/confirm": "^5.0.0",
1968
+ "@mswjs/interceptors": "^0.39.1",
1969
+ "@open-draft/deferred-promise": "^2.2.0",
1970
+ "@open-draft/until": "^2.1.0",
1971
+ "@types/cookie": "^0.6.0",
1972
+ "@types/statuses": "^2.0.4",
1973
+ "graphql": "^16.8.1",
1974
+ "headers-polyfill": "^4.0.2",
1975
+ "is-node-process": "^1.2.0",
1976
+ "outvariant": "^1.4.3",
1977
+ "path-to-regexp": "^6.3.0",
1978
+ "picocolors": "^1.1.1",
1979
+ "strict-event-emitter": "^0.5.1",
1980
+ "type-fest": "^4.26.1",
1981
+ "yargs": "^17.7.2"
1982
+ },
1983
+ "bin": {
1984
+ "msw": "cli/index.js"
1985
+ },
1986
+ "engines": {
1987
+ "node": ">=18"
1988
+ },
1989
+ "funding": {
1990
+ "url": "https://github.com/sponsors/mswjs"
1991
+ },
1992
+ "peerDependencies": {
1993
+ "typescript": ">= 4.8.x"
1994
+ },
1995
+ "peerDependenciesMeta": {
1996
+ "typescript": {
1997
+ "optional": true
1998
+ }
1999
+ }
2000
+ },
2001
+ "node_modules/mute-stream": {
2002
+ "version": "2.0.0",
2003
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
2004
+ "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
2005
+ "license": "ISC",
2006
+ "engines": {
2007
+ "node": "^18.17.0 || >=20.5.0"
2008
+ }
2009
+ },
2010
  "node_modules/nanoid": {
2011
  "version": "3.3.11",
2012
  "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
 
2036
  "is-buffer": "^1.0.2"
2037
  }
2038
  },
2039
+ "node_modules/node-gyp-build": {
2040
+ "version": "4.8.4",
2041
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
2042
+ "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
2043
+ "license": "MIT",
2044
+ "bin": {
2045
+ "node-gyp-build": "bin.js",
2046
+ "node-gyp-build-optional": "optional.js",
2047
+ "node-gyp-build-test": "build-test.js"
2048
+ }
2049
+ },
2050
  "node_modules/onnxruntime-common": {
2051
  "version": "1.21.0",
2052
  "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0.tgz",
 
2069
  "protobufjs": "^7.2.4"
2070
  }
2071
  },
2072
+ "node_modules/outvariant": {
2073
+ "version": "1.4.3",
2074
+ "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz",
2075
+ "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==",
2076
+ "license": "MIT"
2077
+ },
2078
+ "node_modules/path-to-regexp": {
2079
+ "version": "6.3.0",
2080
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
2081
+ "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
2082
+ "license": "MIT"
2083
+ },
2084
  "node_modules/pathe": {
2085
  "version": "2.0.3",
2086
  "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
 
2102
  "version": "1.1.1",
2103
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
2104
  "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
 
2105
  "license": "ISC"
2106
  },
2107
  "node_modules/picomatch": {
 
2178
  "node": ">=12.0.0"
2179
  }
2180
  },
2181
+ "node_modules/psl": {
2182
+ "version": "1.15.0",
2183
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
2184
+ "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
2185
+ "license": "MIT",
2186
+ "dependencies": {
2187
+ "punycode": "^2.3.1"
2188
+ },
2189
+ "funding": {
2190
+ "url": "https://github.com/sponsors/lupomontero"
2191
+ }
2192
+ },
2193
+ "node_modules/punycode": {
2194
+ "version": "2.3.1",
2195
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
2196
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
2197
+ "license": "MIT",
2198
+ "engines": {
2199
+ "node": ">=6"
2200
+ }
2201
+ },
2202
+ "node_modules/querystringify": {
2203
+ "version": "2.2.0",
2204
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
2205
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
2206
+ "license": "MIT"
2207
+ },
2208
  "node_modules/readdirp": {
2209
  "version": "4.1.2",
2210
  "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
 
2219
  "url": "https://paulmillr.com/funding/"
2220
  }
2221
  },
2222
+ "node_modules/require-directory": {
2223
+ "version": "2.1.1",
2224
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
2225
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
2226
+ "license": "MIT",
2227
+ "engines": {
2228
+ "node": ">=0.10.0"
2229
+ }
2230
+ },
2231
+ "node_modules/requires-port": {
2232
+ "version": "1.0.0",
2233
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
2234
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
2235
+ "license": "MIT"
2236
+ },
2237
  "node_modules/rollup": {
2238
  "version": "4.45.1",
2239
  "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz",
 
2287
  "node": ">=6"
2288
  }
2289
  },
2290
+ "node_modules/semiver": {
2291
+ "version": "1.1.0",
2292
+ "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz",
2293
+ "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==",
2294
+ "license": "MIT",
2295
+ "engines": {
2296
+ "node": ">=6"
2297
+ }
2298
+ },
2299
  "node_modules/siginfo": {
2300
  "version": "2.0.0",
2301
  "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
 
2303
  "dev": true,
2304
  "license": "ISC"
2305
  },
2306
+ "node_modules/signal-exit": {
2307
+ "version": "4.1.0",
2308
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
2309
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
2310
+ "license": "ISC",
2311
+ "engines": {
2312
+ "node": ">=14"
2313
+ },
2314
+ "funding": {
2315
+ "url": "https://github.com/sponsors/isaacs"
2316
+ }
2317
+ },
2318
  "node_modules/sirv": {
2319
  "version": "3.0.1",
2320
  "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz",
 
2347
  "dev": true,
2348
  "license": "MIT"
2349
  },
2350
+ "node_modules/statuses": {
2351
+ "version": "2.0.2",
2352
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
2353
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
2354
+ "license": "MIT",
2355
+ "engines": {
2356
+ "node": ">= 0.8"
2357
+ }
2358
+ },
2359
  "node_modules/std-env": {
2360
  "version": "3.9.0",
2361
  "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz",
 
2363
  "dev": true,
2364
  "license": "MIT"
2365
  },
2366
+ "node_modules/strict-event-emitter": {
2367
+ "version": "0.5.1",
2368
+ "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz",
2369
+ "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==",
2370
+ "license": "MIT"
2371
+ },
2372
+ "node_modules/string-width": {
2373
+ "version": "4.2.3",
2374
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2375
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2376
+ "license": "MIT",
2377
+ "dependencies": {
2378
+ "emoji-regex": "^8.0.0",
2379
+ "is-fullwidth-code-point": "^3.0.0",
2380
+ "strip-ansi": "^6.0.1"
2381
+ },
2382
+ "engines": {
2383
+ "node": ">=8"
2384
+ }
2385
+ },
2386
+ "node_modules/strip-ansi": {
2387
+ "version": "6.0.1",
2388
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2389
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2390
+ "license": "MIT",
2391
+ "dependencies": {
2392
+ "ansi-regex": "^5.0.1"
2393
+ },
2394
+ "engines": {
2395
+ "node": ">=8"
2396
+ }
2397
+ },
2398
  "node_modules/strip-literal": {
2399
  "version": "3.0.0",
2400
  "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz",
 
2458
  "typescript": ">=5.0.0"
2459
  }
2460
  },
2461
+ "node_modules/textlinestream": {
2462
+ "version": "1.1.1",
2463
+ "resolved": "https://registry.npmjs.org/textlinestream/-/textlinestream-1.1.1.tgz",
2464
+ "integrity": "sha512-iBHbi7BQxrFmwZUQJsT0SjNzlLLsXhvW/kg7EyOMVMBIrlnj/qYofwo1LVLZi+3GbUEo96Iu2eqToI2+lZoAEQ==",
2465
+ "license": "MIT"
2466
+ },
2467
  "node_modules/tinybench": {
2468
  "version": "2.9.0",
2469
  "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
 
2535
  "node": ">=6"
2536
  }
2537
  },
2538
+ "node_modules/tough-cookie": {
2539
+ "version": "4.1.4",
2540
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
2541
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
2542
+ "license": "BSD-3-Clause",
2543
+ "dependencies": {
2544
+ "psl": "^1.1.33",
2545
+ "punycode": "^2.1.1",
2546
+ "universalify": "^0.2.0",
2547
+ "url-parse": "^1.5.3"
2548
+ },
2549
+ "engines": {
2550
+ "node": ">=6"
2551
+ }
2552
+ },
2553
+ "node_modules/type-fest": {
2554
+ "version": "4.41.0",
2555
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
2556
+ "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
2557
+ "license": "(MIT OR CC0-1.0)",
2558
+ "engines": {
2559
+ "node": ">=16"
2560
+ },
2561
+ "funding": {
2562
+ "url": "https://github.com/sponsors/sindresorhus"
2563
+ }
2564
+ },
2565
  "node_modules/typescript": {
2566
  "version": "5.8.3",
2567
  "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
2568
  "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
 
2569
  "license": "Apache-2.0",
2570
  "bin": {
2571
  "tsc": "bin/tsc",
 
2581
  "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
2582
  "license": "MIT"
2583
  },
2584
+ "node_modules/universalify": {
2585
+ "version": "0.2.0",
2586
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
2587
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
2588
+ "license": "MIT",
2589
+ "engines": {
2590
+ "node": ">= 4.0.0"
2591
+ }
2592
+ },
2593
+ "node_modules/url-parse": {
2594
+ "version": "1.5.10",
2595
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
2596
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
2597
+ "license": "MIT",
2598
+ "dependencies": {
2599
+ "querystringify": "^2.1.1",
2600
+ "requires-port": "^1.0.0"
2601
+ }
2602
+ },
2603
  "node_modules/vite": {
2604
  "version": "6.3.5",
2605
  "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz",
 
2818
  "node": ">=8"
2819
  }
2820
  },
2821
+ "node_modules/wrap-ansi": {
2822
+ "version": "6.2.0",
2823
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
2824
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
2825
+ "license": "MIT",
2826
+ "dependencies": {
2827
+ "ansi-styles": "^4.0.0",
2828
+ "string-width": "^4.1.0",
2829
+ "strip-ansi": "^6.0.0"
2830
+ },
2831
+ "engines": {
2832
+ "node": ">=8"
2833
+ }
2834
+ },
2835
+ "node_modules/ws": {
2836
+ "version": "8.18.3",
2837
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
2838
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
2839
+ "license": "MIT",
2840
+ "engines": {
2841
+ "node": ">=10.0.0"
2842
+ },
2843
+ "peerDependencies": {
2844
+ "bufferutil": "^4.0.1",
2845
+ "utf-8-validate": ">=5.0.2"
2846
+ },
2847
+ "peerDependenciesMeta": {
2848
+ "bufferutil": {
2849
+ "optional": true
2850
+ },
2851
+ "utf-8-validate": {
2852
+ "optional": true
2853
+ }
2854
+ }
2855
+ },
2856
+ "node_modules/y18n": {
2857
+ "version": "5.0.8",
2858
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
2859
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
2860
+ "license": "ISC",
2861
+ "engines": {
2862
+ "node": ">=10"
2863
+ }
2864
+ },
2865
+ "node_modules/yargs": {
2866
+ "version": "17.7.2",
2867
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
2868
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
2869
+ "license": "MIT",
2870
+ "dependencies": {
2871
+ "cliui": "^8.0.1",
2872
+ "escalade": "^3.1.1",
2873
+ "get-caller-file": "^2.0.5",
2874
+ "require-directory": "^2.1.1",
2875
+ "string-width": "^4.2.3",
2876
+ "y18n": "^5.0.5",
2877
+ "yargs-parser": "^21.1.1"
2878
+ },
2879
+ "engines": {
2880
+ "node": ">=12"
2881
+ }
2882
+ },
2883
+ "node_modules/yargs-parser": {
2884
+ "version": "21.1.1",
2885
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
2886
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
2887
+ "license": "ISC",
2888
+ "engines": {
2889
+ "node": ">=12"
2890
+ }
2891
+ },
2892
+ "node_modules/yoctocolors-cjs": {
2893
+ "version": "2.1.2",
2894
+ "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz",
2895
+ "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==",
2896
+ "license": "MIT",
2897
+ "engines": {
2898
+ "node": ">=18"
2899
+ },
2900
+ "funding": {
2901
+ "url": "https://github.com/sponsors/sindresorhus"
2902
+ }
2903
+ },
2904
  "node_modules/zimmerframe": {
2905
  "version": "1.1.2",
2906
  "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz",
package.json CHANGED
@@ -25,6 +25,7 @@
25
  "vitest": "^3.2.4"
26
  },
27
  "dependencies": {
 
28
  "@imgly/background-removal": "^1.7.0",
29
  "dexie": "^4.0.11"
30
  }
 
25
  "vitest": "^3.2.4"
26
  },
27
  "dependencies": {
28
+ "@gradio/client": "^1.15.6",
29
  "@imgly/background-removal": "^1.7.0",
30
  "dexie": "^4.0.11"
31
  }
src/lib/components/MonsterGenerator/MonsterGenerator.svelte CHANGED
@@ -318,8 +318,8 @@ Focus on: colors, body shape, eyes, limbs, mouth, and key visual features. Omit
318
  const objectMatch = state.monsterConcept.match(/# Object Caption\s*\n([\s\S]*?)(?=^# )/m);
319
  const objectDescription = objectMatch ? objectMatch[1].trim() : '';
320
 
321
- // Extract monster name - now it's the second heading after Object Caption
322
- const monsterNameMatch = state.monsterConcept.match(/^# (?!Object Caption)(.+)$/m);
323
  const monsterName = monsterNameMatch ? monsterNameMatch[1].trim() : 'Unknown Monster';
324
 
325
  // Debug logging
 
318
  const objectMatch = state.monsterConcept.match(/# Object Caption\s*\n([\s\S]*?)(?=^# )/m);
319
  const objectDescription = objectMatch ? objectMatch[1].trim() : '';
320
 
321
+ // Extract monster name from the Monster Name section - similar to object extraction
322
+ const monsterNameMatch = state.monsterConcept.match(/# Monster Name\s*\n([\s\S]*?)(?=^## |$)/m);
323
  const monsterName = monsterNameMatch ? monsterNameMatch[1].trim() : 'Unknown Monster';
324
 
325
  // Debug logging
src/lib/components/MonsterGenerator/MonsterResult.svelte CHANGED
@@ -1,7 +1,11 @@
1
  <script lang="ts">
2
  import type { MonsterWorkflowState } from '$lib/types';
 
3
  import { saveMonster } from '$lib/db/monsters';
4
  import { TYPE_DATA, PicletType } from '$lib/types/picletTypes';
 
 
 
5
 
6
  interface Props {
7
  workflowState: MonsterWorkflowState;
@@ -11,407 +15,162 @@
11
  let { workflowState, onReset }: Props = $props();
12
  let isSaving = $state(false);
13
  let isSaved = $state(false);
 
 
14
  let saveError: string | null = $state(null);
15
-
16
- function downloadImage() {
17
- if (!workflowState.monsterImage) return;
18
-
19
- const link = document.createElement('a');
20
- // Use transparent image if available, otherwise original
21
- link.href = workflowState.monsterImage.imageData || workflowState.monsterImage.imageUrl;
22
- link.download = `monster-${Date.now()}.png`;
23
- link.click();
24
- }
25
-
26
- function copyPrompt() {
27
- if (!workflowState.imagePrompt) return;
28
- navigator.clipboard.writeText(workflowState.imagePrompt);
29
- alert('Prompt copied to clipboard!');
30
- }
31
-
32
- function getStatColor(value: number): string {
33
- if (value >= 80) return '#007bff'; // very high - blue
34
- if (value >= 60) return '#28a745'; // high - green
35
- if (value >= 40) return '#ffc107'; // medium - yellow
36
- if (value >= 20) return '#fd7e14'; // low - orange
37
- return '#dc3545'; // very low - red
38
- }
39
-
40
- async function saveToCollection() {
41
- if (!workflowState.monsterImage || !workflowState.imageCaption || !workflowState.monsterConcept || !workflowState.imagePrompt || !workflowState.monsterStats) {
42
- saveError = 'Missing monster data';
43
- return;
44
- }
45
-
46
- isSaving = true;
47
- saveError = null;
48
-
49
- try {
50
- // Extract monster name from concept (usually first line or after "Monster Name:")
51
- let monsterName = 'Unknown Monster';
52
- const conceptLines = workflowState.monsterConcept.split('\n');
53
- for (const line of conceptLines) {
54
- if (line.includes('Monster Name:') || line.includes('**Monster Name:**')) {
55
- monsterName = line.replace(/\*\*Monster Name:\*\*|Monster Name:/g, '').trim();
56
- break;
57
- } else if (line.trim() && !line.includes(':')) {
58
- // First non-empty line without colon might be the name
59
- monsterName = line.trim();
60
- break;
61
- }
62
- }
63
-
64
- // Use stats name if available, otherwise use extracted name
65
- if (workflowState.monsterStats?.name) {
66
- monsterName = workflowState.monsterStats.name;
67
  }
68
-
69
- const monsterData = {
70
- name: monsterName,
71
- imageUrl: workflowState.monsterImage.imageUrl,
72
- imageData: workflowState.monsterImage.imageData,
73
- imageCaption: workflowState.imageCaption,
74
- concept: workflowState.monsterConcept,
75
- imagePrompt: workflowState.imagePrompt,
76
- stats: workflowState.monsterStats
77
- };
78
-
79
- console.log('Saving monster with data:', {
80
- ...monsterData,
81
- imageData: monsterData.imageData ? `${monsterData.imageData.substring(0, 50)}... (length: ${monsterData.imageData.length})` : 'null'
82
- });
83
-
84
- await saveMonster(monsterData);
85
-
86
- isSaved = true;
87
- } catch (err) {
88
- console.error('Failed to save monster:', err);
89
- saveError = 'Failed to save monster to collection';
90
- } finally {
91
- isSaving = false;
92
  }
 
 
 
 
 
 
 
 
 
 
93
  }
94
  </script>
95
 
96
- <div class="result-container">
97
- <h3>{workflowState.monsterStats?.name || 'Your Monster Has Been Created!'}</h3>
98
- <p class="saved-message">✓ Automatically saved to your collection</p>
99
-
100
- {#if workflowState.monsterImage}
101
- <div class="monster-image-container">
102
- <img
103
- src={workflowState.monsterImage.imageData || workflowState.monsterImage.imageUrl}
104
- alt="Generated Monster"
105
- class="monster-image"
106
- />
 
 
107
  </div>
108
- {/if}
109
-
110
- {#if workflowState.monsterStats?.description}
111
- <p class="monster-description">{workflowState.monsterStats.description}</p>
112
- {/if}
113
 
114
- {#if workflowState.monsterStats}
115
- <div class="result-section">
116
- <h4>Battle Stats</h4>
117
- <div class="stats-grid">
118
- <div class="stat-item">
119
- <div class="tier-badge {workflowState.monsterStats.tier}">{workflowState.monsterStats.tier.toUpperCase()}</div>
120
- <span class="stat-label">Tier</span>
121
- </div>
122
- {#if (workflowState.monsterStats as any).picletType}
123
- <div class="stat-item">
124
- <TypeBadge type={(workflowState.monsterStats as any).picletType as PicletType} showLabel={true} size="medium" />
125
- <span class="stat-label">Type</span>
126
- </div>
127
- {/if}
128
- <div class="stat-item">
129
- <div class="stat-bar" style="width: {workflowState.monsterStats.HP}%; background-color: {getStatColor(workflowState.monsterStats.HP)}20"></div>
130
- <span class="stat-label">HP</span>
131
- <span class="stat-value" style="color: {getStatColor(workflowState.monsterStats.HP)}">{workflowState.monsterStats.HP}</span>
132
- </div>
133
- <div class="stat-item">
134
- <div class="stat-bar" style="width: {workflowState.monsterStats.attack}%; background-color: {getStatColor(workflowState.monsterStats.attack)}20"></div>
135
- <span class="stat-label">Attack</span>
136
- <span class="stat-value" style="color: {getStatColor(workflowState.monsterStats.attack)}">{workflowState.monsterStats.attack}</span>
137
- </div>
138
- <div class="stat-item">
139
- <div class="stat-bar" style="width: {workflowState.monsterStats.defence}%; background-color: {getStatColor(workflowState.monsterStats.defence)}20"></div>
140
- <span class="stat-label">Defence</span>
141
- <span class="stat-value" style="color: {getStatColor(workflowState.monsterStats.defence)}">{workflowState.monsterStats.defence}</span>
142
- </div>
143
- <div class="stat-item">
144
- <div class="stat-bar" style="width: {workflowState.monsterStats.speed}%; background-color: {getStatColor(workflowState.monsterStats.speed)}20"></div>
145
- <span class="stat-label">Speed</span>
146
- <span class="stat-value" style="color: {getStatColor(workflowState.monsterStats.speed)}">{workflowState.monsterStats.speed}</span>
147
- </div>
148
- </div>
149
- <div class="abilities-section">
150
- <div class="ability-item">
151
- <h5>Special Passive Trait</h5>
152
- <p>{workflowState.monsterStats.specialPassiveTrait}</p>
153
- </div>
154
- <div class="ability-item">
155
- <h5>Attack: {workflowState.monsterStats.attackActionName}</h5>
156
- <p>{workflowState.monsterStats.attackActionDescription}</p>
157
- </div>
158
- <div class="ability-item">
159
- <h5>Buff: {workflowState.monsterStats.buffActionName}</h5>
160
- <p>{workflowState.monsterStats.buffActionDescription}</p>
161
- </div>
162
- <div class="ability-item">
163
- <h5>Debuff: {workflowState.monsterStats.debuffActionName}</h5>
164
- <p>{workflowState.monsterStats.debuffActionDescription}</p>
165
- </div>
166
- <div class="ability-item">
167
- <h5>Ultimate: {workflowState.monsterStats.specialActionName}</h5>
168
- <p>{workflowState.monsterStats.specialActionDescription}</p>
169
- </div>
170
- </div>
171
  </div>
172
  {/if}
173
-
174
- <div class="action-buttons">
175
- <button class="action-button download" onclick={downloadImage}>
176
- <svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor">
177
- <path d="M13 8V2H7v6H2l8 8 8-8h-5zM0 18h20v2H0v-2z"/>
178
- </svg>
179
- Download Monster
180
- </button>
181
- <button class="action-button reset" onclick={onReset}>
182
- <svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor">
183
- <path d="M4 2a1 1 0 011 1v2.101a7.002 7.002 0 0111.601 2.566 1 1 0 11-1.885.666A5.002 5.002 0 005.058 7.293a1 1 0 01-1.414 1.414l-2.35-2.35A1 1 0 011 5.648V3a1 1 0 011-1zm.008 9.057a1 1 0 011.276.61A5.002 5.002 0 0014.943 13H13a1 1 0 110-2h5a1 1 0 011 1v5a1 1 0 11-2 0v-2.101a7.002 7.002 0 01-11.601-2.566 1 1 0 01.61-1.276z"/>
184
- </svg>
185
- Create Another Monster
186
- </button>
187
  </div>
188
-
189
- {#if saveError}
190
- <div class="error-message">{saveError}</div>
191
- {/if}
192
- </div>
193
 
194
  <style>
195
  .result-container {
196
- max-width: 900px;
197
  margin: 0 auto;
198
  padding: 2rem;
199
- }
200
-
201
- h3 {
202
  text-align: center;
203
- color: #333;
204
- margin-bottom: 2rem;
205
  }
206
 
207
- .monster-image-container {
208
- text-align: center;
209
- margin-bottom: 3rem;
210
  }
211
 
212
- .monster-image {
213
- max-width: 100%;
214
- max-height: 600px;
215
- border-radius: 12px;
216
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
217
  }
218
 
219
-
220
- .result-section {
221
- background: #f8f9fa;
222
- padding: 1.5rem;
223
- border-radius: 8px;
224
- border: 1px solid #e9ecef;
225
  }
226
 
227
- .result-section h4 {
228
- margin: 0 0 1rem 0;
229
- color: #495057;
230
  font-size: 1.1rem;
 
231
  }
232
 
233
-
234
- .action-buttons {
235
- display: flex;
236
- justify-content: center;
237
- gap: 1rem;
238
- flex-wrap: wrap;
239
  }
240
 
241
- .action-button {
242
  display: flex;
 
243
  align-items: center;
244
- gap: 0.5rem;
245
- padding: 0.8rem 1.5rem;
246
- border: none;
247
- border-radius: 6px;
248
- font-size: 1rem;
249
- font-weight: 500;
250
- cursor: pointer;
251
- transition: all 0.2s;
252
- }
253
-
254
- .action-button.download {
255
- background: #28a745;
256
- color: white;
257
- }
258
-
259
- .action-button.download:hover {
260
- background: #218838;
261
- }
262
-
263
- .action-button.reset {
264
- background: #6c757d;
265
- color: white;
266
- }
267
-
268
- .action-button.reset:hover {
269
- background: #5a6268;
270
- }
271
-
272
- .action-button:disabled {
273
- opacity: 0.6;
274
- cursor: not-allowed;
275
- }
276
-
277
- .error-message {
278
- margin-top: 1rem;
279
- padding: 0.5rem;
280
- background: #f8d7da;
281
- color: #721c24;
282
- border-radius: 4px;
283
- text-align: center;
284
- }
285
-
286
- @keyframes spin {
287
- to { transform: rotate(360deg); }
288
- }
289
-
290
- .stats-grid {
291
- display: grid;
292
- grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
293
  gap: 1rem;
294
- margin-bottom: 1.5rem;
295
- }
296
-
297
- .stat-item {
298
- display: flex;
299
- flex-direction: column;
300
- padding: 0.75rem;
301
- background: white;
302
- border-radius: 6px;
303
- border: 1px solid #dee2e6;
304
- position: relative;
305
- overflow: hidden;
306
  }
307
 
308
- .stat-bar {
309
- position: absolute;
310
- top: 0;
311
- left: 0;
312
- height: 100%;
313
- transition: width 0.3s ease;
314
- z-index: 0;
315
- }
316
-
317
- .stat-label {
318
- font-size: 0.85rem;
319
- color: #6c757d;
320
- margin-bottom: 0.25rem;
321
- position: relative;
322
- z-index: 1;
323
  }
324
 
325
- .stat-value {
326
- font-weight: 600;
327
- font-size: 1.1rem;
328
- position: relative;
329
- z-index: 1;
330
  }
331
 
332
- .tier-badge {
333
- display: inline-block;
334
- padding: 0.5rem 1rem;
335
- border-radius: 4px;
336
  font-weight: 600;
337
  font-size: 1rem;
338
- margin-bottom: 0.5rem;
339
- }
340
-
341
- .tier-badge.low {
342
- background: #e0e0e0;
343
- color: #666;
344
- }
345
-
346
- .tier-badge.medium {
347
- background: #81c784;
348
- color: white;
349
- }
350
-
351
- .tier-badge.high {
352
- background: #64b5f6;
353
- color: white;
354
  }
355
 
356
- .tier-badge.legendary {
357
- background: linear-gradient(135deg, #ab47bc, #7b1fa2);
358
  color: white;
359
- box-shadow: 0 2px 4px rgba(123, 31, 162, 0.3);
360
- }
361
-
362
- .abilities-section {
363
- display: grid;
364
- gap: 1rem;
365
- }
366
-
367
- .ability-item {
368
- background: white;
369
- padding: 1rem;
370
- border-radius: 6px;
371
- border: 1px solid #dee2e6;
372
  }
373
 
374
- .ability-item h5 {
375
- margin: 0 0 0.5rem 0;
376
- color: #495057;
377
- font-size: 0.95rem;
378
  }
379
 
380
- .ability-item p {
381
- margin: 0;
382
- font-size: 0.85rem;
383
- line-height: 1.4;
384
- }
385
-
386
- .saved-message {
387
- color: #28a745;
388
- font-size: 0.9rem;
389
- margin: -0.5rem 0 1.5rem;
390
- text-align: center;
391
- }
392
-
393
- .monster-description {
394
- text-align: center;
395
- color: #555;
396
- font-size: 1rem;
397
- line-height: 1.5;
398
- margin: 1rem auto 2rem;
399
- max-width: 600px;
400
- font-style: italic;
401
  }
402
 
403
  @media (max-width: 768px) {
404
  .result-container {
405
  padding: 1rem;
406
  }
407
-
408
- .action-buttons {
409
- flex-direction: column;
410
- }
411
-
412
- .action-button {
413
- width: 100%;
414
- justify-content: center;
415
- }
416
  }
417
  </style>
 
1
  <script lang="ts">
2
  import type { MonsterWorkflowState } from '$lib/types';
3
+ import type { PicletInstance } from '$lib/db/schema';
4
  import { saveMonster } from '$lib/db/monsters';
5
  import { TYPE_DATA, PicletType } from '$lib/types/picletTypes';
6
+ import { monsterToPicletInstance } from '$lib/db/piclets';
7
+ import PicletCard from '../Piclets/PicletCard.svelte';
8
+ import PicletDetail from '../Piclets/PicletDetail.svelte';
9
 
10
  interface Props {
11
  workflowState: MonsterWorkflowState;
 
15
  let { workflowState, onReset }: Props = $props();
16
  let isSaving = $state(false);
17
  let isSaved = $state(false);
18
+ let picletInstance: PicletInstance | null = $state(null);
19
+ let showDetailView = $state(false);
20
  let saveError: string | null = $state(null);
21
+
22
+ // Create piclet instance from the monster data
23
+ $effect(() => {
24
+ if (workflowState.monsterImage && workflowState.monsterConcept && workflowState.monsterStats) {
25
+ try {
26
+ const monster = {
27
+ name: workflowState.monsterStats.name || 'Unknown Monster',
28
+ imageUrl: workflowState.monsterImage.imageUrl,
29
+ imageData: workflowState.monsterImage.imageData,
30
+ imageCaption: workflowState.imageCaption || '',
31
+ concept: workflowState.monsterConcept,
32
+ imagePrompt: workflowState.imagePrompt || '',
33
+ stats: workflowState.monsterStats
34
+ };
35
+
36
+ picletInstance = monsterToPicletInstance(monster);
37
+ } catch (error) {
38
+ console.error('Failed to create piclet instance:', error);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  }
41
+ });
42
+
43
+ function handleCardClick() {
44
+ if (picletInstance) {
45
+ showDetailView = true;
46
+ }
47
+ }
48
+
49
+ function handleCloseDetail() {
50
+ showDetailView = false;
51
  }
52
  </script>
53
 
54
+ {#if showDetailView && picletInstance}
55
+ <PicletDetail
56
+ instance={picletInstance}
57
+ onClose={handleCloseDetail}
58
+ />
59
+ {:else}
60
+ <div class="result-container">
61
+ <div class="success-header">
62
+ <div class="success-icon">✨</div>
63
+ <h2>Success!</h2>
64
+ <p class="success-message">
65
+ You can now encounter <strong>{picletInstance?.nickname || 'this creature'}</strong>!
66
+ </p>
67
  </div>
 
 
 
 
 
68
 
69
+ {#if picletInstance}
70
+ <div class="piclet-preview">
71
+ <PicletCard
72
+ instance={picletInstance}
73
+ size={140}
74
+ onClick={handleCardClick}
75
+ />
76
+ <p class="tap-hint">Tap to view details</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  </div>
78
  {/if}
79
+
80
+ <div class="action-buttons">
81
+ <button class="action-button primary" onclick={onReset}>
82
+ Create Another
83
+ </button>
84
+ </div>
 
 
 
 
 
 
 
 
85
  </div>
86
+ {/if}
 
 
 
 
87
 
88
  <style>
89
  .result-container {
90
+ max-width: 500px;
91
  margin: 0 auto;
92
  padding: 2rem;
 
 
 
93
  text-align: center;
 
 
94
  }
95
 
96
+ .success-header {
97
+ margin-bottom: 2rem;
 
98
  }
99
 
100
+ .success-icon {
101
+ font-size: 3rem;
102
+ margin-bottom: 1rem;
 
 
103
  }
104
 
105
+ .success-header h2 {
106
+ color: #333;
107
+ margin: 0 0 1rem;
108
+ font-size: 1.8rem;
109
+ font-weight: 600;
 
110
  }
111
 
112
+ .success-message {
113
+ color: #666;
 
114
  font-size: 1.1rem;
115
+ margin: 0;
116
  }
117
 
118
+ .success-message strong {
119
+ color: #333;
120
+ font-weight: 600;
 
 
 
121
  }
122
 
123
+ .piclet-preview {
124
  display: flex;
125
+ flex-direction: column;
126
  align-items: center;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  gap: 1rem;
128
+ margin: 2rem 0;
 
 
 
 
 
 
 
 
 
 
 
129
  }
130
 
131
+ .tap-hint {
132
+ color: #888;
133
+ font-size: 0.9rem;
134
+ margin: 0;
135
+ font-style: italic;
 
 
 
 
 
 
 
 
 
 
136
  }
137
 
138
+ .action-buttons {
139
+ display: flex;
140
+ justify-content: center;
141
+ margin-top: 2rem;
 
142
  }
143
 
144
+ .action-button {
145
+ padding: 0.875rem 2rem;
146
+ border: none;
147
+ border-radius: 12px;
148
  font-weight: 600;
149
  font-size: 1rem;
150
+ cursor: pointer;
151
+ transition: all 0.2s ease;
152
+ min-width: 160px;
 
 
 
 
 
 
 
 
 
 
 
 
 
153
  }
154
 
155
+ .action-button.primary {
156
+ background: linear-gradient(135deg, #3b82f6, #1d4ed8);
157
  color: white;
158
+ box-shadow: 0 4px 12px rgba(59, 130, 246, 0.4);
 
 
 
 
 
 
 
 
 
 
 
 
159
  }
160
 
161
+ .action-button.primary:hover {
162
+ background: linear-gradient(135deg, #2563eb, #1e40af);
163
+ transform: translateY(-2px);
164
+ box-shadow: 0 6px 16px rgba(59, 130, 246, 0.4);
165
  }
166
 
167
+ .action-button.primary:active {
168
+ transform: translateY(0);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
169
  }
170
 
171
  @media (max-width: 768px) {
172
  .result-container {
173
  padding: 1rem;
174
  }
 
 
 
 
 
 
 
 
 
175
  }
176
  </style>
src/lib/components/Piclets/PicletDetail.svelte CHANGED
@@ -157,7 +157,6 @@
157
  </div>
158
  {:else if selectedTab === 'stats'}
159
  <div class="content-card">
160
- <h3 class="section-title">Battle Stats</h3>
161
  <div class="stats-list">
162
  <div class="stat-row">
163
  <span>Attack</span>
 
157
  </div>
158
  {:else if selectedTab === 'stats'}
159
  <div class="content-card">
 
160
  <div class="stats-list">
161
  <div class="stat-row">
162
  <span>Attack</span>
src/lib/services/qwen3Client.ts CHANGED
@@ -1,6 +1,7 @@
1
  /**
2
  * Qwen3 Client - Drop-in replacement for rwkvClient using Qwen3 HF Space
3
  * Compatible with existing rwkvClient.predict("/chat", [...]) API
 
4
  */
5
 
6
  interface Qwen3Message {
@@ -17,11 +18,12 @@ interface Qwen3ClientOptions {
17
  export class Qwen3Client {
18
  private options: Qwen3ClientOptions;
19
  private sessionId: string;
 
20
 
21
  constructor(options: Partial<Qwen3ClientOptions> = {}) {
22
  this.options = {
23
  huggingFaceSpace: 'Qwen/Qwen3-Demo',
24
- model: 'qwen3-32b', // Default to Qwen3-32B for good performance/quality balance
25
  ...options
26
  };
27
  this.sessionId = this.generateSessionId();
@@ -31,6 +33,28 @@ export class Qwen3Client {
31
  return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
32
  }
33
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  /**
35
  * Predict method that mimics rwkvClient.predict("/chat", [...]) API
36
  * @param endpoint Should be "/chat" for compatibility
@@ -54,42 +78,13 @@ export class Qwen3Client {
54
  ] = params;
55
 
56
  try {
57
- // Build messages array in the format expected by Qwen3
58
- const messages: Qwen3Message[] = [];
59
-
60
- // Add system prompt if provided
61
- if (system_prompt && system_prompt.trim()) {
62
- messages.push({
63
- role: 'system',
64
- content: system_prompt
65
- });
66
- }
67
 
68
- // Add chat history
69
- if (Array.isArray(chat_history)) {
70
- chat_history.forEach((entry: any) => {
71
- if (Array.isArray(entry) && entry.length >= 2) {
72
- // Handle [user_message, assistant_message] format
73
- messages.push({
74
- role: 'user',
75
- content: entry[0]
76
- });
77
- messages.push({
78
- role: 'assistant',
79
- content: entry[1]
80
- });
81
- }
82
- });
83
- }
84
-
85
- // Add current message
86
- messages.push({
87
- role: 'user',
88
- content: message
89
- });
90
-
91
- // Use Hugging Face Spaces API
92
- const response = await this.callQwen3API(messages, {
93
  max_new_tokens,
94
  temperature,
95
  top_p,
@@ -108,94 +103,96 @@ export class Qwen3Client {
108
  }
109
  }
110
 
111
- private async callQwen3API(messages: Qwen3Message[], options: any): Promise<string> {
112
- // Use the Gradio Client to connect to the Qwen3 HF Space
113
- // For now, simulate the API call until we can get the proper Gradio client working
114
-
115
  try {
116
- // Build the message content
117
- const systemMessage = messages.find(m => m.role === 'system')?.content || '';
118
- const userMessage = messages[messages.length - 1].content;
119
-
120
- // For development: Use a proper HTTP API approach
121
- // This simulates what the Gradio client would do
122
- const spaceUrl = `https://${this.options.huggingFaceSpace.replace('/', '-')}.hf.space`;
123
-
124
- // Construct the API payload similar to what we see in the Qwen3-Demo
125
- const payload = {
126
- data: [
127
- userMessage, // input message
128
- {
129
- model: this.options.model,
130
- sys_prompt: systemMessage,
131
- thinking_budget: Math.min(options.max_new_tokens || 2048, 38) // Qwen3 has max 38k thinking budget
132
- },
133
- {
134
- enable_thinking: false // Disable for faster responses
135
- },
136
- {
137
- conversation_contexts: {},
138
- conversations: [],
139
- conversation_id: this.sessionId
140
- }
141
- ],
142
- fn_index: 0 // Function index for add_message
143
  };
144
 
145
- // Try the direct API call
146
- const response = await fetch(`${spaceUrl}/api/predict`, {
147
- method: 'POST',
148
- headers: {
149
- 'Content-Type': 'application/json',
150
- },
151
- body: JSON.stringify(payload)
152
- });
 
 
 
153
 
154
- if (response.ok) {
155
- const result = await response.json();
156
-
157
- // Parse the Gradio response format
158
- if (result && result.data && Array.isArray(result.data)) {
159
- // Look for chatbot data in the response
160
- for (const item of result.data) {
161
- if (Array.isArray(item) && item.length > 0) {
162
- const lastMessage = item[item.length - 1];
163
- if (lastMessage && lastMessage.content && Array.isArray(lastMessage.content)) {
164
- const textContent = lastMessage.content.find((c: any) => c.type === 'text');
165
- if (textContent && textContent.content) {
166
- return textContent.content;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
167
  }
 
 
 
168
  }
169
  }
170
  }
171
  }
172
-
173
- throw new Error('Could not extract text from Qwen3 response');
174
  }
175
 
176
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
 
177
 
178
  } catch (error) {
179
- console.warn('Qwen3 direct API call failed, using fallback strategy:', error);
180
 
181
  // Development fallback: Generate a reasonable response based on the input
182
- const userMessage = messages[messages.length - 1].content;
183
- const systemMessage = messages.find(m => m.role === 'system')?.content || '';
184
-
185
  // If it's a JSON generation request, provide a structured response
186
- if (userMessage.includes('JSON') || userMessage.includes('json') || systemMessage.includes('JSON')) {
187
- if (userMessage.includes('monster') || userMessage.includes('stats')) {
188
- return this.generateFallbackMonsterStats(userMessage);
189
  }
190
  return '```json\n{"status": "Qwen3 temporarily unavailable", "using_fallback": true}\n```';
191
  }
192
 
193
  // For text generation, provide a reasonable response
194
- if (userMessage.includes('visual description') || userMessage.includes('image generation')) {
195
- return this.generateFallbackImageDescription(userMessage);
196
  }
197
 
198
- return `I understand you're asking about: "${userMessage.substring(0, 100)}..."\n\nHowever, I'm currently unable to connect to the Qwen3 service. The system will automatically fall back to an alternative model for your request.`;
199
  }
200
  }
201
 
@@ -247,18 +244,28 @@ export class Qwen3Client {
247
  */
248
  async testConnection(): Promise<boolean> {
249
  try {
 
 
 
 
250
  const result = await this.predict('/chat', [
251
- 'Hello, are you working?',
252
  [],
253
- 'You are a helpful assistant. Respond briefly.',
254
- 100,
255
  0.7,
256
  0.95,
257
  50,
258
  1.0
259
  ]);
260
 
261
- return result.data && result.data[0] && typeof result.data[0] === 'string' && result.data[0].length > 0;
 
 
 
 
 
 
262
  } catch (error) {
263
  console.error('Qwen3 connection test failed:', error);
264
  return false;
 
1
  /**
2
  * Qwen3 Client - Drop-in replacement for rwkvClient using Qwen3 HF Space
3
  * Compatible with existing rwkvClient.predict("/chat", [...]) API
4
+ * Uses proper Gradio Client connection instead of direct HTTP calls
5
  */
6
 
7
  interface Qwen3Message {
 
18
  export class Qwen3Client {
19
  private options: Qwen3ClientOptions;
20
  private sessionId: string;
21
+ private gradioClient: any = null;
22
 
23
  constructor(options: Partial<Qwen3ClientOptions> = {}) {
24
  this.options = {
25
  huggingFaceSpace: 'Qwen/Qwen3-Demo',
26
+ model: 'qwen2.5-72b-instruct', // Use Qwen2.5-72B for best performance
27
  ...options
28
  };
29
  this.sessionId = this.generateSessionId();
 
33
  return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
34
  }
35
 
36
+ /**
37
+ * Initialize Gradio Client connection to Qwen3 Space
38
+ */
39
+ private async initializeGradioClient(): Promise<void> {
40
+ if (this.gradioClient) {
41
+ return; // Already initialized
42
+ }
43
+
44
+ try {
45
+ // Use dynamic import to avoid module issues
46
+ const { Client } = await import('@gradio/client');
47
+
48
+ console.log(`🔗 Connecting to ${this.options.huggingFaceSpace}...`);
49
+ this.gradioClient = await Client.connect(this.options.huggingFaceSpace);
50
+
51
+ console.log(`✅ Connected to Qwen3 space: ${this.options.huggingFaceSpace}`);
52
+ } catch (error) {
53
+ console.error('Failed to initialize Qwen3 Gradio Client:', error);
54
+ throw new Error(`Could not connect to Qwen3 space: ${error}`);
55
+ }
56
+ }
57
+
58
  /**
59
  * Predict method that mimics rwkvClient.predict("/chat", [...]) API
60
  * @param endpoint Should be "/chat" for compatibility
 
78
  ] = params;
79
 
80
  try {
81
+ // Ensure Gradio client is initialized
82
+ await this.initializeGradioClient();
 
 
 
 
 
 
 
 
83
 
84
+ // Use the proper Gradio Client API to call the add_message function
85
+ const response = await this.callQwen3API(message, {
86
+ sys_prompt: system_prompt,
87
+ model: this.options.model,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  max_new_tokens,
89
  temperature,
90
  top_p,
 
103
  }
104
  }
105
 
106
+ private async callQwen3API(message: string, options: any): Promise<string> {
 
 
 
107
  try {
108
+ if (!this.gradioClient) {
109
+ throw new Error('Gradio client not initialized');
110
+ }
111
+
112
+ // Prepare settings for the Qwen3 space based on app.py structure
113
+ const settingsFormValue = {
114
+ model: options.model || this.options.model,
115
+ sys_prompt: options.sys_prompt || "You are a helpful assistant.",
116
+ thinking_budget: Math.min(options.max_new_tokens || 20, 38), // Qwen3 has max 38k thinking budget
117
+ temperature: options.temperature || 0.7,
118
+ top_p: options.top_p || 0.95,
119
+ top_k: options.top_k || 50,
120
+ repetition_penalty: options.repetition_penalty || 1.0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  };
122
 
123
+ // Thinking button state - disable for faster responses
124
+ const thinkingBtnState = {
125
+ enable_thinking: false
126
+ };
127
+
128
+ // Initial state for the conversation
129
+ const stateValue = {
130
+ conversation_contexts: {},
131
+ conversations: [],
132
+ conversation_id: this.sessionId
133
+ };
134
 
135
+ console.log(`🤖 Calling Qwen3 add_message with: "${message.substring(0, 50)}..."`);
136
+
137
+ // Call the add_message function from the Gradio app
138
+ // Based on app.py line 170: add_message(input_value, settings_form_value, thinking_btn_state_value, state_value)
139
+ const result = await this.gradioClient.predict("/add_message", [
140
+ message, // input_value
141
+ settingsFormValue, // settings_form_value
142
+ thinkingBtnState, // thinking_btn_state_value
143
+ stateValue // state_value
144
+ ]);
145
+
146
+ console.log('🔍 Raw Qwen3 response:', result);
147
+
148
+ // Extract the response text from the Gradio result
149
+ if (result && result.data && Array.isArray(result.data)) {
150
+ // The response format should include the chatbot data
151
+ // Look for the chatbot component data (usually index 2 or 3)
152
+ for (let i = 0; i < result.data.length; i++) {
153
+ const item = result.data[i];
154
+ if (Array.isArray(item) && item.length > 0) {
155
+ // Look for the last assistant message
156
+ const lastMessage = item[item.length - 1];
157
+ if (lastMessage && lastMessage.role === 'assistant' && lastMessage.content) {
158
+ // Extract text content from the structured content
159
+ if (Array.isArray(lastMessage.content)) {
160
+ for (const contentItem of lastMessage.content) {
161
+ if (contentItem.type === 'text' && contentItem.content) {
162
+ console.log('✅ Extracted Qwen3 response:', contentItem.content.substring(0, 100) + '...');
163
+ return contentItem.content;
164
+ }
165
  }
166
+ } else if (typeof lastMessage.content === 'string') {
167
+ console.log('✅ Extracted Qwen3 response:', lastMessage.content.substring(0, 100) + '...');
168
+ return lastMessage.content;
169
  }
170
  }
171
  }
172
  }
 
 
173
  }
174
 
175
+ // If we can't extract the response, throw an error to trigger fallback
176
+ throw new Error('Could not extract text response from Qwen3 API result');
177
 
178
  } catch (error) {
179
+ console.warn('Qwen3 Gradio API call failed, using fallback strategy:', error);
180
 
181
  // Development fallback: Generate a reasonable response based on the input
 
 
 
182
  // If it's a JSON generation request, provide a structured response
183
+ if (message.includes('JSON') || message.includes('json') || options.sys_prompt?.includes('JSON')) {
184
+ if (message.includes('monster') || message.includes('stats')) {
185
+ return this.generateFallbackMonsterStats(message);
186
  }
187
  return '```json\n{"status": "Qwen3 temporarily unavailable", "using_fallback": true}\n```';
188
  }
189
 
190
  // For text generation, provide a reasonable response
191
+ if (message.includes('visual description') || message.includes('image generation')) {
192
+ return this.generateFallbackImageDescription(message);
193
  }
194
 
195
+ return `I understand you're asking about: "${message.substring(0, 100)}..."\n\nHowever, I'm currently unable to connect to the Qwen3 service. The system will automatically fall back to an alternative model for your request.`;
196
  }
197
  }
198
 
 
244
  */
245
  async testConnection(): Promise<boolean> {
246
  try {
247
+ // Try to initialize the Gradio client first
248
+ await this.initializeGradioClient();
249
+
250
+ // Test with a simple message
251
  const result = await this.predict('/chat', [
252
+ 'Hello, are you working? Please respond with just "Yes" if you can receive this message.',
253
  [],
254
+ 'You are a helpful assistant. Respond very briefly with just "Yes" if you can receive messages.',
255
+ 50, // Small token limit for test
256
  0.7,
257
  0.95,
258
  50,
259
  1.0
260
  ]);
261
 
262
+ const response = result.data && result.data[0] && typeof result.data[0] === 'string' ? result.data[0] : '';
263
+ const isWorking = response.length > 0 && !response.includes('temporarily unavailable');
264
+
265
+ console.log(`🔍 Qwen3 connection test result: ${isWorking ? 'PASS' : 'FAIL'}`);
266
+ console.log(`📝 Test response: "${response.substring(0, 50)}..."`);
267
+
268
+ return isWorking;
269
  } catch (error) {
270
  console.error('Qwen3 connection test failed:', error);
271
  return false;
src/lib/services/textGenerationClient.ts CHANGED
@@ -34,15 +34,24 @@ class TextGenerationManager {
34
  async initialize(): Promise<void> {
35
  if (this.connectionTested) return;
36
 
37
- console.log('Testing Qwen3 connection...');
38
 
39
  try {
40
  if (this.primaryClient.testConnection) {
41
- const qwen3Available = await this.primaryClient.testConnection();
 
 
 
 
 
 
42
 
43
  if (qwen3Available) {
44
  console.log('✅ Qwen3 client is available and will be used for text generation');
45
  this.useQwen3 = true;
 
 
 
46
  } else {
47
  console.log('⚠️ Qwen3 client is not available, falling back to Zephyr-7B');
48
  this.useQwen3 = false;
@@ -57,6 +66,48 @@ class TextGenerationManager {
57
  this.connectionTested = true;
58
  }
59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  /**
61
  * Get the active client for text generation
62
  */
@@ -140,6 +191,22 @@ class TextGenerationManager {
140
  activeClient: this.useQwen3 ? 'Qwen3' : 'Zephyr-7B'
141
  };
142
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143
  }
144
 
145
  // Export singleton instance
 
34
  async initialize(): Promise<void> {
35
  if (this.connectionTested) return;
36
 
37
+ console.log('🔍 Testing Qwen3 connection with improved verification...');
38
 
39
  try {
40
  if (this.primaryClient.testConnection) {
41
+ // Add timeout wrapper for connection test
42
+ const connectionTestPromise = this.primaryClient.testConnection();
43
+ const timeoutPromise = new Promise<boolean>((_, reject) => {
44
+ setTimeout(() => reject(new Error('Connection test timeout')), 15000); // 15 second timeout
45
+ });
46
+
47
+ const qwen3Available = await Promise.race([connectionTestPromise, timeoutPromise]);
48
 
49
  if (qwen3Available) {
50
  console.log('✅ Qwen3 client is available and will be used for text generation');
51
  this.useQwen3 = true;
52
+
53
+ // Perform a secondary validation test to ensure real functionality
54
+ await this.performSecondaryValidation();
55
  } else {
56
  console.log('⚠️ Qwen3 client is not available, falling back to Zephyr-7B');
57
  this.useQwen3 = false;
 
66
  this.connectionTested = true;
67
  }
68
 
69
+ /**
70
+ * Perform secondary validation to ensure Qwen3 is actually working
71
+ */
72
+ private async performSecondaryValidation(): Promise<void> {
73
+ try {
74
+ console.log('🔧 Performing secondary validation of Qwen3 functionality...');
75
+
76
+ // Test with a specific request that should return predictable content
77
+ const validationResult = await Promise.race([
78
+ this.primaryClient.predict('/chat', [
79
+ 'Respond with exactly this text: "VALIDATION_SUCCESS"',
80
+ [],
81
+ 'You are a helpful assistant. Follow instructions exactly as given.',
82
+ 20, // Very small token limit
83
+ 0.1, // Low temperature for deterministic output
84
+ 0.9,
85
+ 10,
86
+ 1.0
87
+ ]),
88
+ new Promise<any>((_, reject) => {
89
+ setTimeout(() => reject(new Error('Validation timeout')), 10000); // 10 second timeout
90
+ })
91
+ ]);
92
+
93
+ const response = validationResult?.data?.[0] || '';
94
+ const isValidResponse = typeof response === 'string' &&
95
+ response.length > 0 &&
96
+ !response.includes('temporarily unavailable') &&
97
+ !response.includes('using_fallback');
98
+
99
+ if (!isValidResponse) {
100
+ console.warn('⚠️ Secondary validation failed - Qwen3 responses seem invalid, switching to fallback');
101
+ this.useQwen3 = false;
102
+ } else {
103
+ console.log('✅ Secondary validation passed - Qwen3 is fully functional');
104
+ }
105
+ } catch (error) {
106
+ console.warn('⚠️ Secondary validation failed with error, switching to fallback:', error);
107
+ this.useQwen3 = false;
108
+ }
109
+ }
110
+
111
  /**
112
  * Get the active client for text generation
113
  */
 
191
  activeClient: this.useQwen3 ? 'Qwen3' : 'Zephyr-7B'
192
  };
193
  }
194
+
195
+ /**
196
+ * Reset connection testing to allow re-initialization
197
+ */
198
+ resetConnectionTest() {
199
+ this.connectionTested = false;
200
+ console.log('🔄 Connection test reset - will re-test on next prediction');
201
+ }
202
+
203
+ /**
204
+ * Force re-test connection and re-initialize
205
+ */
206
+ async retestConnection(): Promise<void> {
207
+ this.connectionTested = false;
208
+ await this.initialize();
209
+ }
210
  }
211
 
212
  // Export singleton instance