diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 10fe864..a8e54b2 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -10,8 +10,6 @@ "tauri": "tauri" }, "dependencies": { - "@lab/theme": "workspace:*", - "@lab/ui": "workspace:*", "@radix-ui/react-icons": "1.3.0", "@radix-ui/react-select": "1.2.2", "@tauri-apps/api": "1.4.0", @@ -19,24 +17,26 @@ "acorn-jsx": "5.3.2", "change-case": "4.1.2", "clsx": "1.2.1", - "iconoir-react": "6.8.0", + "iconoir-react": "6.9.0", "nanoid": "4.0.2", - "next": "13.4.6", + "next": "13.4.7", "puro": "0.8.4", "react": "18.2.0", "react-dom": "18.2.0", "react-wrap-balancer": "1.0.0", - "swr": "2.1.5" + "swr": "2.2.0" }, "devDependencies": { + "@lab/theme": "workspace:*", + "@lab/ui": "workspace:*", "@plasmo/config": "workspace:*", "@plasmo/constants": "workspace:*", "@plasmo/utils": "workspace:*", "@tauri-apps/cli": "1.4.0", - "@types/node": "20.3.1", - "@types/react": "18.2.12", - "@types/react-dom": "18.2.5", + "@types/node": "20.3.3", + "@types/react": "18.2.14", + "@types/react-dom": "18.2.6", "tailwindcss": "3.3.2", - "typescript": "5.1.3" + "typescript": "5.1.6" } } diff --git a/apps/desktop/src-tauri/Cargo.lock b/apps/desktop/src-tauri/Cargo.lock index d58171d..de69237 100644 --- a/apps/desktop/src-tauri/Cargo.lock +++ b/apps/desktop/src-tauri/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ "serde_urlencoded", "smallvec", "socket2", - "time 0.3.15", + "time 0.3.22", "url", ] @@ -198,6 +198,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -206,9 +215,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aes" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" dependencies = [ "cfg-if", "cipher", @@ -271,6 +280,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "allocator-api2" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56fc6cf8dc8c4158eed8649f9b8b0ea1518eb62b544fe9490d66fa0b349eafe9" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -303,15 +318,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" +checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" [[package]] name = "anstyle-parse" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" dependencies = [ "utf8parse", ] @@ -349,9 +364,9 @@ checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" [[package]] name = "arrayvec" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "atk" @@ -374,7 +389,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -383,6 +398,21 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base-x" version = "0.2.11" @@ -424,21 +454,21 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.1" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6776fc96284a0bb647b615056fc496d1fe1644a7ab01829818a6d91cae888b84" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" [[package]] name = "blake3" -version = "1.3.3" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ae2468a89544a466886840aa467a25b766499f4f04bf7d9fcd10ecee9fccef" +checksum = "729b71f35bd3fa1a4c86b85d32c8b9069ea7fe14f7a53cfabb65f62d4265b888" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", - "constant_time_eq 0.2.5", + "constant_time_eq 0.2.6", "digest", ] @@ -588,7 +618,7 @@ checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" dependencies = [ "glib-sys", "libc", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -598,7 +628,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" dependencies = [ "serde", - "toml 0.7.3", + "toml 0.7.5", ] [[package]] @@ -638,9 +668,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70d3ad08698a0568b0562f22710fe6bfc1f4a61a367c77d0398c562eadd453a" +checksum = "215c0072ecc28f92eeb0eea38ba63ddfcb65c2828c46311d646f1a3ff5f9841c" dependencies = [ "smallvec", "target-lexicon", @@ -680,9 +710,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.2" +version = "4.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "401a4694d2bf92537b6867d94de48c4842089645fdcdf6c71865b175d836e9c2" +checksum = "bba77a07e4489fb41bd90e8d4201c3eb246b3c2c9ea2ba0bddd6c1d1df87db7d" dependencies = [ "clap_builder", "clap_derive", @@ -691,9 +721,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.3.1" +version = "4.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72394f3339a76daf211e57d4bcb374410f3965dcc606dd0e03738c7888766980" +checksum = "2c9b4a88bb4bc35d3d6f65a21b0f0bafe9c894fa00978de242c555ec28bea1c0" dependencies = [ "anstream", "anstyle", @@ -711,7 +741,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -800,9 +830,9 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] name = "constant_time_eq" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13418e745008f7349ec7e449155f419a61b92b58a99cc3616942b926825ec76b" +checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" [[package]] name = "convert_case" @@ -817,7 +847,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" dependencies = [ "percent-encoding", - "time 0.3.15", + "time 0.3.22", "version_check", ] @@ -852,21 +882,20 @@ dependencies = [ [[package]] name = "core-graphics-types" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" +checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" dependencies = [ "bitflags 1.3.2", "core-foundation", - "foreign-types", "libc", ] [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "03e69e28e9f7f77debdedbaafa2866e1de9ba56df55a8bd7cfc724c25a09987c" dependencies = [ "libc", ] @@ -903,22 +932,22 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.14" +version = "0.9.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", - "memoffset 0.8.0", + "memoffset", "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ "cfg-if", ] @@ -963,7 +992,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -976,12 +1005,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "cty" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" - [[package]] name = "darling" version = "0.14.4" @@ -1027,7 +1050,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -1049,7 +1072,7 @@ checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" dependencies = [ "darling_core 0.20.1", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -1104,7 +1127,7 @@ checksum = "f7a532c1f99a0f596f6960a60d1e119e91582b24b39e2d83a190e61262c3ef0c" dependencies = [ "diesel_derives", "libsqlite3-sys", - "time 0.3.15", + "time 0.3.22", ] [[package]] @@ -1116,7 +1139,7 @@ dependencies = [ "diesel_table_macro_syntax", "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -1125,7 +1148,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" dependencies = [ - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -1227,7 +1250,7 @@ checksum = "80663502655af01a2902dff3f06869330782267924bf1788410b74edcd93770a" dependencies = [ "cc", "rustc_version 0.4.0", - "toml 0.7.3", + "toml 0.7.5", "vswhom", "winreg 0.11.0", ] @@ -1253,6 +1276,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "equivalent" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1" + [[package]] name = "errno" version = "0.3.1" @@ -1319,7 +1348,7 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ - "memoffset 0.9.0", + "memoffset", "rustc_version 0.4.0", ] @@ -1464,7 +1493,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -1545,7 +1574,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -1562,7 +1591,7 @@ dependencies = [ "libc", "pango-sys", "pkg-config", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -1576,7 +1605,7 @@ dependencies = [ "gobject-sys", "libc", "pkg-config", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -1588,15 +1617,15 @@ dependencies = [ "gdk-sys", "glib-sys", "libc", - "system-deps 6.1.0", + "system-deps 6.1.1", "x11", ] [[package]] name = "generator" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e123d9ae7c02966b4d892e550bdc32164f05853cd40ab570650ad600596a8a" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" dependencies = [ "cc", "libc", @@ -1642,20 +1671,27 @@ dependencies = [ [[package]] name = "ggml" version = "0.2.0-dev" -source = "git+https://github.com/rustformers/llm?branch=main#85d64688ffe6bc3c16c6cc9c3ff1b8d10b959369" +source = "git+https://github.com/rustformers/llm?branch=main#9a222690cd0a9e3322bb6a926d54e90d08fb2c0f" dependencies = [ "ggml-sys", + "memmap2", "thiserror", ] [[package]] name = "ggml-sys" version = "0.2.0-dev" -source = "git+https://github.com/rustformers/llm?branch=main#85d64688ffe6bc3c16c6cc9c3ff1b8d10b959369" +source = "git+https://github.com/rustformers/llm?branch=main#9a222690cd0a9e3322bb6a926d54e90d08fb2c0f" dependencies = [ "cc", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "gio" version = "0.15.12" @@ -1682,7 +1718,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.0", + "system-deps 6.1.1", "winapi", ] @@ -1728,7 +1764,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" dependencies = [ "libc", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -1758,7 +1794,7 @@ checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" dependencies = [ "glib-sys", "libc", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -1799,7 +1835,7 @@ dependencies = [ "gobject-sys", "libc", "pango-sys", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -1818,9 +1854,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ "bytes", "fnv", @@ -1828,7 +1864,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 1.9.3", "slab", "tokio", "tokio-util", @@ -1837,10 +1873,11 @@ dependencies = [ [[package]] name = "half" -version = "2.2.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" +checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" dependencies = [ + "cfg-if", "crunchy", ] @@ -1852,20 +1889,21 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.13.2" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" dependencies = [ "ahash 0.8.3", + "allocator-api2", ] [[package]] name = "hashlink" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0761a1b9491c4f2e3d66aa0f62d0fba0af9a0e2852e4d48ea506632a4b56e6aa" +checksum = "312f66718a2d7789ffef4f4b7b213138ed9f1eb3aa1d0d82fc99f88fb3ffd26f" dependencies = [ - "hashbrown 0.13.2", + "hashbrown 0.14.0", ] [[package]] @@ -1883,15 +1921,6 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -[[package]] -name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.3.1" @@ -1969,9 +1998,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -2055,11 +2084,10 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.18" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" +checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" dependencies = [ - "crossbeam-utils", "globset", "lazy_static", "log", @@ -2095,6 +2123,16 @@ dependencies = [ "serde", ] +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", +] + [[package]] name = "indicatif" version = "0.15.0" @@ -2152,26 +2190,25 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi", "libc", "windows-sys 0.48.0", ] [[package]] name = "ipnet" -version = "2.7.2" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "is-terminal" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +checksum = "24fddda5af7e54bf7da53067d6e802dbcc381d0a8eef629df528e3ebf68755cb" dependencies = [ - "hermit-abi 0.3.1", - "io-lifetimes", - "rustix", + "hermit-abi", + "rustix 0.38.1", "windows-sys 0.48.0", ] @@ -2259,9 +2296,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.63" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -2318,9 +2355,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.146" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libsqlite3-sys" @@ -2348,10 +2385,16 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +[[package]] +name = "linux-raw-sys" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" + [[package]] name = "llm" version = "0.2.0-dev" -source = "git+https://github.com/rustformers/llm?branch=main#85d64688ffe6bc3c16c6cc9c3ff1b8d10b959369" +source = "git+https://github.com/rustformers/llm?branch=main#9a222690cd0a9e3322bb6a926d54e90d08fb2c0f" dependencies = [ "llm-base", "llm-bloom", @@ -2366,7 +2409,7 @@ dependencies = [ [[package]] name = "llm-base" version = "0.2.0-dev" -source = "git+https://github.com/rustformers/llm?branch=main#85d64688ffe6bc3c16c6cc9c3ff1b8d10b959369" +source = "git+https://github.com/rustformers/llm?branch=main#9a222690cd0a9e3322bb6a926d54e90d08fb2c0f" dependencies = [ "bytemuck", "ggml", @@ -2384,16 +2427,15 @@ dependencies = [ [[package]] name = "llm-bloom" version = "0.2.0-dev" -source = "git+https://github.com/rustformers/llm?branch=main#85d64688ffe6bc3c16c6cc9c3ff1b8d10b959369" +source = "git+https://github.com/rustformers/llm?branch=main#9a222690cd0a9e3322bb6a926d54e90d08fb2c0f" dependencies = [ - "bytemuck", "llm-base", ] [[package]] name = "llm-gpt2" version = "0.2.0-dev" -source = "git+https://github.com/rustformers/llm?branch=main#85d64688ffe6bc3c16c6cc9c3ff1b8d10b959369" +source = "git+https://github.com/rustformers/llm?branch=main#9a222690cd0a9e3322bb6a926d54e90d08fb2c0f" dependencies = [ "bytemuck", "llm-base", @@ -2402,39 +2444,32 @@ dependencies = [ [[package]] name = "llm-gptj" version = "0.2.0-dev" -source = "git+https://github.com/rustformers/llm?branch=main#85d64688ffe6bc3c16c6cc9c3ff1b8d10b959369" +source = "git+https://github.com/rustformers/llm?branch=main#9a222690cd0a9e3322bb6a926d54e90d08fb2c0f" dependencies = [ - "bytemuck", "llm-base", ] [[package]] name = "llm-gptneox" version = "0.2.0-dev" -source = "git+https://github.com/rustformers/llm?branch=main#85d64688ffe6bc3c16c6cc9c3ff1b8d10b959369" +source = "git+https://github.com/rustformers/llm?branch=main#9a222690cd0a9e3322bb6a926d54e90d08fb2c0f" dependencies = [ - "bytemuck", "llm-base", - "serde", ] [[package]] name = "llm-llama" version = "0.2.0-dev" -source = "git+https://github.com/rustformers/llm?branch=main#85d64688ffe6bc3c16c6cc9c3ff1b8d10b959369" +source = "git+https://github.com/rustformers/llm?branch=main#9a222690cd0a9e3322bb6a926d54e90d08fb2c0f" dependencies = [ - "bytemuck", "llm-base", - "rand 0.8.5", - "thiserror", ] [[package]] name = "llm-mpt" version = "0.2.0-dev" -source = "git+https://github.com/rustformers/llm?branch=main#85d64688ffe6bc3c16c6cc9c3ff1b8d10b959369" +source = "git+https://github.com/rustformers/llm?branch=main#9a222690cd0a9e3322bb6a926d54e90d08fb2c0f" dependencies = [ - "bytemuck", "llm-base", ] @@ -2515,9 +2550,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.18" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "loom" @@ -2609,15 +2644,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.9.0" @@ -2685,7 +2711,7 @@ checksum = "8795add3e14028f11f8e848bd3294898a8294767b3776b6f733560d33bd2530b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -2807,11 +2833,11 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi", "libc", ] @@ -2836,15 +2862,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "num_threads" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" -dependencies = [ - "libc", -] - [[package]] name = "number_prefix" version = "0.3.0" @@ -2896,6 +2913,15 @@ dependencies = [ "objc", ] +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.18.0" @@ -2926,9 +2952,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.54" +version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69b3f656a17a6cbc115b5c7a40c616947d213ba182135b014d6051b73ab6f019" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ "bitflags 1.3.2", "cfg-if", @@ -2947,7 +2973,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -2958,9 +2984,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.88" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ce0f250f34a308dcfdbb351f511359857d4ed2134ba715a4eadd46e1ffd617" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ "cc", "libc", @@ -3007,7 +3033,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -3055,7 +3081,7 @@ dependencies = [ "libc", "redox_syscall 0.3.5", "smallvec", - "windows-targets 0.48.0", + "windows-targets 0.48.1", ] [[package]] @@ -3199,22 +3225,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" +checksum = "6e138fdd8263907a2b0e1b4e80b7e58c721126479b6e6eedfb1b402acea7b9bd" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" +checksum = "d1fef411b303e3e12d534fb6e7852de82da56edd937d895125821fb7c09436c7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -3242,18 +3268,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bd9647b268a3d3e14ff09c23201133a62589c658db02bb7388c7246aafe0590" dependencies = [ "base64 0.21.2", - "indexmap", + "indexmap 1.9.3", "line-wrap", "quick-xml", "serde", - "time 0.3.15", + "time 0.3.22", ] [[package]] name = "png" -version = "0.17.8" +version = "0.17.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaeebc51f9e7d2c150d3f3bfeb667f2aa985db5ef1e3d212847bdedb488beeaa" +checksum = "59871cc5b6cce7eaccca5a802b4173377a1c2ba90654246789a8fa2334426d11" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -3316,9 +3342,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.59" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" +checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" dependencies = [ "unicode-ident", ] @@ -3334,9 +3360,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.28" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" dependencies = [ "proc-macro2", ] @@ -3424,12 +3450,9 @@ dependencies = [ [[package]] name = "raw-window-handle" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed7e3d950b66e19e0c372f3fa3fbbcf85b1746b571f74e0c2af6042a5c93420a" -dependencies = [ - "cty", -] +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" [[package]] name = "rayon" @@ -3594,7 +3617,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2" dependencies = [ - "bitflags 2.3.1", + "bitflags 2.3.3", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -3602,6 +3625,12 @@ dependencies = [ "smallvec", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc_version" version = "0.2.3" @@ -3622,15 +3651,28 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.19" +version = "0.37.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" +checksum = "62f25693a73057a1b4cb56179dd3c7ea21a7c6c5ee7d85781f5749b46f34b79c" dependencies = [ "bitflags 1.3.2", "errno", "io-lifetimes", "libc", - "linux-raw-sys", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc6396159432b5c8490d4e301d8c705f61860b8b6c863bf79942ce5401968f3" +dependencies = [ + "bitflags 2.3.3", + "errno", + "libc", + "linux-raw-sys 0.4.3", "windows-sys 0.48.0", ] @@ -3751,9 +3793,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.163" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" dependencies = [ "serde_derive", ] @@ -3769,20 +3811,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.163" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3" dependencies = [ "itoa 1.0.6", "ryu", @@ -3797,14 +3839,14 @@ checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] name = "serde_spanned" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93107647184f6027e3b7dcb2e11034cf95ffa1e3a682c67951963ac69c1c007d" +checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" dependencies = [ "serde", ] @@ -3830,11 +3872,11 @@ dependencies = [ "base64 0.21.2", "chrono", "hex", - "indexmap", + "indexmap 1.9.3", "serde", "serde_json", "serde_with_macros", - "time 0.3.15", + "time 0.3.22", ] [[package]] @@ -3846,7 +3888,7 @@ dependencies = [ "darling 0.20.1", "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -3909,9 +3951,9 @@ checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -4162,9 +4204,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.18" +version = "2.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" +checksum = "2efbeae7acf4eabd6bcdcbd11c92f45231ddda7539edc7806bd1a04a03b24616" dependencies = [ "proc-macro2", "quote", @@ -4209,14 +4251,14 @@ dependencies = [ [[package]] name = "system-deps" -version = "6.1.0" +version = "6.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5fa6fb9ee296c0dc2df41a656ca7948546d061958115ddb0bcaae43ad0d17d2" +checksum = "30c2de8a4d8f4b823d634affc9cd2a74ec98c53a756f317e529a48046cbf71f3" dependencies = [ - "cfg-expr 0.15.2", + "cfg-expr 0.15.3", "heck 0.4.1", "pkg-config", - "toml 0.7.3", + "toml 0.7.5", "version-compare 0.1.1", ] @@ -4291,9 +4333,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.7" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5" +checksum = "1b1c7f239eb94671427157bd93b3694320f3668d4e1eff08c7285366fd777fac" [[package]] name = "tauri" @@ -4339,7 +4381,7 @@ dependencies = [ "tauri-utils", "tempfile", "thiserror", - "time 0.3.15", + "time 0.3.22", "tokio", "url", "uuid", @@ -4386,7 +4428,7 @@ dependencies = [ "sha2", "tauri-utils", "thiserror", - "time 0.3.15", + "time 0.3.22", "uuid", "walkdir", ] @@ -4407,9 +4449,9 @@ dependencies = [ [[package]] name = "tauri-plugin-persisted-scope" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b805c25146a7351e4d0f562b15c428b5eaa1b45f70c1215a6eb8cfb15ffffe9" +checksum = "d055034da82e3abd8d8727e71a4e5748a1d434d3f1d4fdbc517ab8dceb51d6f5" dependencies = [ "aho-corasick 1.0.2", "bincode", @@ -4497,7 +4539,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" dependencies = [ "embed-resource", - "toml 0.7.3", + "toml 0.7.5", ] [[package]] @@ -4510,7 +4552,7 @@ dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.3.5", - "rustix", + "rustix 0.37.21", "windows-sys 0.48.0", ] @@ -4548,7 +4590,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -4589,17 +4631,22 @@ dependencies = [ [[package]] name = "time" -version = "0.3.15" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d634a985c4d4238ec39cacaed2e7ae552fbd3c476b552c1deac3021b7d7eaf0c" +checksum = "ea9e1b3cf1243ae005d9e74085d4d542f3125458f3a81af210d901dcd7411efd" dependencies = [ "itoa 1.0.6", - "libc", - "num_threads", "serde", - "time-macros 0.2.4", + "time-core", + "time-macros 0.2.9", ] +[[package]] +name = "time-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" + [[package]] name = "time-macros" version = "0.1.1" @@ -4612,9 +4659,12 @@ dependencies = [ [[package]] name = "time-macros" -version = "0.2.4" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" +checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" +dependencies = [ + "time-core", +] [[package]] name = "time-macros-impl" @@ -4682,11 +4732,12 @@ dependencies = [ [[package]] name = "tokio" -version = "1.28.2" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", @@ -4707,7 +4758,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -4756,9 +4807,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21" +checksum = "1ebafdf5ad1220cb59e7d17cf4d2c72015297b75b19a10472f99b89225089240" dependencies = [ "serde", "serde_spanned", @@ -4768,20 +4819,20 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.8" +version = "0.19.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" +checksum = "266f016b7f039eec8a1a80dfe6156b633d208b9fccca5e4db1d6775b0c4e34a7" dependencies = [ - "indexmap", + "indexmap 2.0.0", "serde", "serde_spanned", "toml_datetime", @@ -4809,13 +4860,13 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", ] [[package]] @@ -4952,9 +5003,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.3.3" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345444e32442451b267fc254ae85a209c64be56d2890e601a0c37ff0c3c5ecd2" +checksum = "d023da39d1fde5a8a3fe1f3e01ca9632ada0a63e9797de55a879d6e2236277be" dependencies = [ "getrandom 0.2.10", ] @@ -5021,11 +5072,10 @@ dependencies = [ [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -5049,9 +5099,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -5059,24 +5109,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.36" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1985d03709c53167ce907ff394f5316aa22cb4e12761295c5dc57dacb6297e" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" dependencies = [ "cfg-if", "js-sys", @@ -5086,9 +5136,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5096,22 +5146,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.22", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "wasm-streams" @@ -5128,9 +5178,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.63" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -5180,7 +5230,7 @@ dependencies = [ "pango-sys", "pkg-config", "soup2-sys", - "system-deps 6.1.0", + "system-deps 6.1.1", ] [[package]] @@ -5285,7 +5335,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.48.1", ] [[package]] @@ -5344,7 +5394,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.48.1", ] [[package]] @@ -5364,9 +5414,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm 0.48.0", "windows_aarch64_msvc 0.48.0", @@ -5529,9 +5579,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winnow" -version = "0.4.1" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" +checksum = "ca0ace3845f0d96209f0375e6d367e3eb87eb65d27d445bdc9f1843a26f39448" dependencies = [ "memchr", ] @@ -5639,7 +5689,7 @@ dependencies = [ "hmac", "pbkdf2", "sha1 0.10.5", - "time 0.3.15", + "time 0.3.22", "zstd 0.11.2+zstd.1.5.2", ] diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index e6b65a2..6278227 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -13,11 +13,15 @@ edition = "2021" tauri-build = { version = "1.4.0", features = [] } [dependencies] -llm = { git = "https://github.com/rustformers/llm", branch = "main", package = "llm" } +llm = { git = "https://github.com/rustformers/llm", branch = "main", package = "llm", features = [ + "default", + "cublas", +] } # llm = { git = "https://github.com/RedBoxing/llm.git", branch = "hf-tokenizer", package = "llm" } tauri = { version = "1.4.0", features = [ + "reqwest-client", "dialog-confirm", "dialog-message", "dialog-open", @@ -66,11 +70,16 @@ digest = "0.10.6" sha2 = "0.10.6" blake3 = "1.3.3" - [target."cfg(target_os = \"macos\")".dependencies] cocoa = "0.24.1" objc = "0.2.7" +[target.aarch64-apple-darwin.dependencies] +llm = { git = "https://github.com/rustformers/llm", branch = "main", package = "llm", features = [ + "default", + "metal", +] } + [target."cfg(target_os = \"linux\")".dependencies] webkit2gtk = "0.18.2" diff --git a/apps/desktop/src-tauri/src/inference/completion.rs b/apps/desktop/src-tauri/src/inference/completion.rs index c4623e3..3fefbc8 100644 --- a/apps/desktop/src-tauri/src/inference/completion.rs +++ b/apps/desktop/src-tauri/src/inference/completion.rs @@ -130,8 +130,4 @@ impl CompletionResponse { Bytes::from(format!("data: {}\n\n", serialized)) } - - pub fn done() -> Bytes { - Bytes::from("data: [DONE]") - } } diff --git a/apps/desktop/src-tauri/src/inference/mod.rs b/apps/desktop/src-tauri/src/inference/mod.rs index 19e14d2..f6dc283 100644 --- a/apps/desktop/src-tauri/src/inference/mod.rs +++ b/apps/desktop/src-tauri/src/inference/mod.rs @@ -1,4 +1,5 @@ pub mod completion; pub mod process; pub mod server; +pub mod server_config; mod stop_handler; diff --git a/apps/desktop/src-tauri/src/inference/process.rs b/apps/desktop/src-tauri/src/inference/process.rs index 40ac97a..52ec9d8 100644 --- a/apps/desktop/src-tauri/src/inference/process.rs +++ b/apps/desktop/src-tauri/src/inference/process.rs @@ -4,8 +4,8 @@ use std::{convert::Infallible, sync::Arc}; use actix_web::web::Bytes; use flume::Sender; use llm::{ - InferenceError, InferenceFeedback, InferenceParameters, Model, OutputRequest, - Prompt, TokenUtf8Buffer, + InferenceError, InferenceFeedback, InferenceParameters, InferenceStats, + Model, OutputRequest, Prompt, TokenUtf8Buffer, }; use parking_lot::{Mutex, RwLock}; @@ -25,6 +25,43 @@ pub struct InferenceThreadRequest { pub completion_request: CompletionRequest, } +impl InferenceThreadRequest { + pub fn is_aborted(&self) -> bool { + *self.abort_flag.read() || self.token_sender.is_disconnected() + } + + pub fn send_comment(&self, message: &str) { + self + .token_sender + .send(Bytes::from(format!(": {} \n\n", message))) + .unwrap(); + } + + pub fn send_event(&self, event_name: &str) { + self + .token_sender + .send(Bytes::from(format!("event: {} \n\n", event_name))) + .unwrap(); + } + + pub fn send_done(&self) { + if self.token_sender.is_disconnected() { + return; + } + + self.token_sender.send(Bytes::from("data: [DONE]")).unwrap(); + } + + pub fn send_error(&self, error: String) { + println!("{}", error); + self + .token_sender + .send(CompletionResponse::to_data_bytes(error)) + .unwrap(); + self.send_done(); + } +} + fn get_inference_params( completion_request: &CompletionRequest, ) -> InferenceParameters { @@ -41,68 +78,12 @@ fn get_inference_params( pub fn start(req: InferenceThreadRequest) -> Option> { println!("Starting inference ..."); - // Need to clone it to have its own arc - let guard_clone = Arc::clone(&req.model_guard); - let guard = guard_clone.lock(); - let model = match &*guard { - Some(m) => m, - None => { - println!("Model locked, cannot be loaded"); - return None; - } - }; - - let mut session = model.start_session(Default::default()); - println!("Session created ..."); - - let mut output_request = OutputRequest::default(); - - let inference_params = get_inference_params(&req.completion_request); - - // Manual tokenization if needed - // let vocab = model.vocabulary(); - // let prompt_tokens: Vec = vocab - // .tokenize(prompt, true) - // .into_par_iter() // Flatten to create a parallel iterator over the tuples - // .flatten() // Flatten the nested vectors - // .map(|(_, tok)| tok) - // .collect(); - - // for batch in prompt_tokens.chunks(inference_params.n_batch) { - // model.evaluate(&mut session, inference_params, batch, &mut output_request); - // for &tk in batch { - // // Update the tokens for this session - // session.tokens.push(tk); - // } - // } - - println!("Feeding prompt ..."); - match session.feed_prompt::( - model.as_ref(), - &inference_params, - req.completion_request.prompt.as_str().into(), - &mut output_request, - |_| Ok(InferenceFeedback::Continue), - ) { - Ok(_) => {} - Err(e) => { - println!("Error while feeding prompt: {:?}", e); - return None; - } - } - - let handle = - spawn_inference_thread(req, inference_params, session, output_request); + let handle = spawn_inference_thread(req); Some(handle) } -fn spawn_inference_thread( - req: InferenceThreadRequest, - inference_params: InferenceParameters, - mut session: llm::InferenceSession, - mut output_request: OutputRequest, -) -> JoinHandle<()> { +fn spawn_inference_thread(req: InferenceThreadRequest) -> JoinHandle<()> { println!("Spawning inference thread..."); let handle = actix_web::rt::task::spawn_blocking(move || { let mut rng = req.completion_request.get_rng(); @@ -120,15 +101,62 @@ fn spawn_inference_thread( } }; + let mut session = model.start_session(Default::default()); + + let mut output_request = OutputRequest::default(); + + let inference_params = get_inference_params(&req.completion_request); + + let mut stats = InferenceStats::default(); + let start_at = std::time::SystemTime::now(); + + println!("Feeding prompt ..."); + req.send_event("FEEDING_PROMPT"); + + match session.feed_prompt::( + model.as_ref(), + &inference_params, + req.completion_request.prompt.as_str().into(), + &mut output_request, + |t| { + if req.is_aborted() { + return Ok(InferenceFeedback::Halt); + } + + if let Some(token) = token_utf8_buf.push(t) { + req.send_comment(format!("Processing token: {:?}", token).as_str()); + } + + Ok(InferenceFeedback::Continue) + }, + ) { + Ok(_) => { + stats.feed_prompt_duration = start_at.elapsed().unwrap(); + + println!( + "Done feeding prompt ... in {:?}", + stats.feed_prompt_duration + ); + } + Err(e) => { + req.send_error(e.to_string()); + return; + } + }; + + req.send_comment("Generating tokens ..."); + req.send_event("GENERATING_TOKENS"); + + // Reset the utf8 buf + token_utf8_buf = TokenUtf8Buffer::new(); + let mut stop_handler = req.completion_request.get_stop_handler(model.as_ref()); let mut tokens_processed = 0; while tokens_processed < maximum_token_count { - if *Arc::clone(&req.abort_flag).read() - || req.token_sender.is_disconnected() - { + if req.is_aborted() { break; } @@ -143,7 +171,7 @@ fn spawn_inference_thread( break; } Err(e) => { - println!("{}", e.to_string()); + req.send_error(e.to_string()); break; } }; @@ -168,8 +196,13 @@ fn spawn_inference_thread( tokens_processed += 1; } + stats.predict_duration = start_at.elapsed().unwrap(); + stats.predict_tokens = tokens_processed; + + println!("Inference stats: {:?}", stats); + if !req.token_sender.is_disconnected() { - req.token_sender.send(CompletionResponse::done()).unwrap(); + req.send_done(); } // TODO: Might make this into a callback later, for now we just abuse the singleton diff --git a/apps/desktop/src-tauri/src/inference/server.rs b/apps/desktop/src-tauri/src/inference/server.rs index a24bc67..3d0e103 100644 --- a/apps/desktop/src-tauri/src/inference/server.rs +++ b/apps/desktop/src-tauri/src/inference/server.rs @@ -58,29 +58,28 @@ async fn post_completions(payload: Json) -> impl Responder { } }; - let abort_flag = Arc::new(RwLock::new(false)); - - let inference_thread = match start(InferenceThreadRequest { - model_guard: Arc::clone(&model_guard), - abort_flag: Arc::clone(&abort_flag), - token_sender, - completion_request: payload.0, - }) { - Some(thread) => thread, - None => { - println!("Failed to spawn inference thread."); - return HttpResponse::InternalServerError().finish(); - } - }; - - let stream = - AbortStream::new(receiver, Arc::clone(&abort_flag), inference_thread); - HttpResponse::Ok() .append_header(("Content-Type", "text/event-stream")) .append_header(("Cache-Control", "no-cache")) - // .keep_alive() - .streaming(stream) + .keep_alive() + .streaming({ + let abort_flag = Arc::new(RwLock::new(false)); + + let inference_thread = match start(InferenceThreadRequest { + model_guard: model_guard.clone(), + abort_flag: abort_flag.clone(), + token_sender, + completion_request: payload.0, + }) { + Some(thread) => thread, + None => { + println!("Failed to spawn inference thread."); + return HttpResponse::InternalServerError().finish(); + } + }; + + AbortStream::new(receiver, abort_flag.clone(), inference_thread) + }) } #[tauri::command] @@ -94,24 +93,27 @@ pub async fn start_server<'a>( state.running.store(true, Ordering::SeqCst); - let server_clone = Arc::clone(&state.server); - - tauri::async_runtime::spawn(async move { - let server = HttpServer::new(|| { - let cors = Cors::permissive(); - App::new() - .wrap(cors) - .service(ping) - .service(post_model) - .service(post_completions) - }) - .bind(("127.0.0.1", port)) - .unwrap() - // .disable_signals() - .run(); - *server_clone.lock() = Some(server.handle()); - println!("Server started on port {port}"); - server.await.unwrap(); + tauri::async_runtime::spawn({ + let server_arc = state.server.clone(); + async move { + let server = HttpServer::new(|| { + let cors = Cors::permissive(); + App::new() + .wrap(cors) + .service(ping) + .service(post_model) + .service(post_completions) + }) + .bind(("127.0.0.1", port)) + .unwrap() + // .bind(("0.0.0.0", port)) // TODO: make a toggle for this + // .unwrap() + // .disable_signals() + .run(); + *server_arc.lock() = Some(server.handle()); + println!("Server started on port {port}"); + server.await.unwrap(); + } }); Ok(()) diff --git a/apps/desktop/src-tauri/src/inference/server_config.rs b/apps/desktop/src-tauri/src/inference/server_config.rs new file mode 100644 index 0000000..31003b3 --- /dev/null +++ b/apps/desktop/src-tauri/src/inference/server_config.rs @@ -0,0 +1,13 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Clone, Default)] +pub struct ServerConfig { + #[serde(rename = "useGpu")] + pub use_gpu: Option, + + pub port: Option, + + pub concurrency: Option, +} + +crate::macros::bucket_state::make!(ServerConfig, "server_config", "v1"); diff --git a/apps/desktop/src-tauri/src/inference/stop_handler.rs b/apps/desktop/src-tauri/src/inference/stop_handler.rs index 1362b53..2fb3d7e 100644 --- a/apps/desktop/src-tauri/src/inference/stop_handler.rs +++ b/apps/desktop/src-tauri/src/inference/stop_handler.rs @@ -39,7 +39,7 @@ impl StopHandler { .iter() .map(|word| { model - .vocabulary() + .tokenizer() .tokenize(word, false) .unwrap() .iter() diff --git a/apps/desktop/src-tauri/src/main.rs b/apps/desktop/src-tauri/src/main.rs index d3630f8..3cbda20 100644 --- a/apps/desktop/src-tauri/src/main.rs +++ b/apps/desktop/src-tauri/src/main.rs @@ -26,6 +26,7 @@ fn main() { model::integrity::State::new(app)?; model::stats::State::new(app)?; thread::config::State::new(app)?; + inference::server_config::State::new(app)?; // A hack to make MacOS window show up in dev mode... #[cfg(all(debug_assertions, not(target_os = "windows")))] @@ -67,6 +68,8 @@ fn main() { model::config::set_model_config, inference::server::start_server, inference::server::stop_server, + inference::server_config::get_server_config, + inference::server_config::set_server_config, model::pool::load_model, test::test_model, utils::fs::open_directory, diff --git a/apps/desktop/src-tauri/src/model/config.rs b/apps/desktop/src-tauri/src/model/config.rs index 5d3c56f..24677d5 100644 --- a/apps/desktop/src-tauri/src/model/config.rs +++ b/apps/desktop/src-tauri/src/model/config.rs @@ -1,6 +1,6 @@ use std::path::{Path, PathBuf}; -use llm::{ModelArchitecture, VocabularySource}; +use llm::{ModelArchitecture, TokenizerSource}; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, PartialEq, Clone, Default)] @@ -17,25 +17,25 @@ pub struct ModelConfig { crate::macros::bucket_state::make!(ModelConfig, "model_config", "v1"); impl ModelConfig { - fn determine_source(&self) -> Option { + fn determine_source(&self) -> Option { if let Some(v) = &self.tokenizer { let path = Path::new(v.as_str()); if path.is_absolute() && path.exists() && path.is_file() { - return Some(VocabularySource::HuggingFaceTokenizerFile( - PathBuf::from(v), - )); + return Some(TokenizerSource::HuggingFaceTokenizerFile(PathBuf::from( + v, + ))); } else if !v.is_empty() { - return Some(VocabularySource::HuggingFaceRemote(v.to_string())); + return Some(TokenizerSource::HuggingFaceRemote(v.to_string())); } } None } - pub fn get_vocab(&self) -> VocabularySource { - self.determine_source().unwrap_or(VocabularySource::Model) + pub fn get_tokenizer(&self) -> TokenizerSource { + self.determine_source().unwrap_or(TokenizerSource::Embedded) } - pub fn get_model_arch(&self) -> Result { + pub fn get_model_arch(&self) -> Result, String> { let default_model_type = "llama".to_string(); let model_type = self.model_type.as_ref().unwrap_or(&default_model_type); @@ -43,6 +43,6 @@ impl ModelConfig { .parse() .map_err(|_| format!("Invalid model type: {model_type}"))?; - Ok(architecture) + Ok(Some(architecture)) } } diff --git a/apps/desktop/src-tauri/src/model/pool.rs b/apps/desktop/src-tauri/src/model/pool.rs index f287abb..d807a1d 100644 --- a/apps/desktop/src-tauri/src/model/pool.rs +++ b/apps/desktop/src-tauri/src/model/pool.rs @@ -45,6 +45,7 @@ pub async fn spawn_pool( model_config: &ModelConfig, concurrency: usize, cache_dir: &PathBuf, + use_gpu: bool, ) -> Result<(), String> { let now = std::time::Instant::now(); let model_path = Path::new(path); @@ -61,7 +62,7 @@ pub async fn spawn_pool( let cache_name = format!("run_cache_{}", i); let cache_file_path = cache_dir.join(cache_name); let original_model_path = original_model_path.clone(); - let vocabulary_source = model_config.get_vocab(); + let tokenizer_source = model_config.get_tokenizer(); let task = tokio::task::spawn_blocking(move || { if !skip_copy { fs::copy(&original_model_path, &cache_file_path) @@ -77,11 +78,12 @@ pub async fn spawn_pool( match llm::load_dynamic( architecture, cache_path.as_path(), - vocabulary_source, + tokenizer_source, llm::ModelParameters { prefer_mmap: true, // TODO: need to figure out how to assign this properly, and automatically // context_size: 8472, + use_gpu, ..Default::default() }, load_progress_callback_stdout, @@ -125,6 +127,7 @@ pub async fn load_model<'a>( app_handle: AppHandle, path: &str, concurrency: usize, + use_gpu: bool, ) -> Result<(), String> { config_state.set(ConfigKey::OnboardState, format!("done"))?; model_stats_bucket_state.increment_load_count(path)?; @@ -134,5 +137,5 @@ pub async fn load_model<'a>( let model_config = model_config_bucket_state.get(path).unwrap_or_default(); - spawn_pool(path, &model_config, concurrency, &cache_dir).await + spawn_pool(path, &model_config, concurrency, &cache_dir, use_gpu).await } diff --git a/apps/desktop/src/features/inference-server/file-config-store.ts b/apps/desktop/src/features/inference-server/file-config-store.ts index b64bd03..e9b5baf 100644 --- a/apps/desktop/src/features/inference-server/file-config-store.ts +++ b/apps/desktop/src/features/inference-server/file-config-store.ts @@ -1,11 +1,10 @@ import { useCallback, useEffect, useState } from "react" import { type ValidCommand, invoke } from "~features/invoke" -import type { FileInfo } from "~features/model-downloader/model-file" export const createFileConfigStore = (getterCommand: ValidCommand, setterCommand: ValidCommand) => - (file: FileInfo, defaultData?: T) => { + (file: { path: string }, defaultData?: T) => { const [data, _setData] = useState(defaultData) useEffect(() => { diff --git a/apps/desktop/src/features/inference-server/model-config.tsx b/apps/desktop/src/features/inference-server/model-config.tsx index 9e58b0f..2287130 100644 --- a/apps/desktop/src/features/inference-server/model-config.tsx +++ b/apps/desktop/src/features/inference-server/model-config.tsx @@ -1,6 +1,7 @@ import { cn } from "@lab/theme/utils" import { SpinnerButton } from "@lab/ui/button" import { Input } from "@lab/ui/input" +import { CornerLabel } from "@lab/ui/label" import { Select, SelectContent, @@ -109,12 +110,7 @@ export const ModelConfig = () => { }) }> - + Type {modelConfig.data.modelType || "???"} @@ -129,6 +125,7 @@ export const ModelConfig = () => { ( { )} isSpinning={modelLoadState === ModelLoadState.Loading} disabled={ - modelLoadState === ModelLoadState.Loaded || - (downloadState !== DownloadState.None && - downloadState !== DownloadState.Completed) + downloadState !== DownloadState.None && + downloadState !== DownloadState.Completed } onClick={() => { modelStats.incrementLaunchCount() loadModel() }}> - {modelLoadState === ModelLoadState.Loaded ? "Loaded" : "Load Model"} + {modelLoadState === ModelLoadState.Loaded ? "Reload" : "Load"} diff --git a/apps/desktop/src/features/inference-server/server-config.tsx b/apps/desktop/src/features/inference-server/server-config.tsx index 0fd87b7..4382628 100644 --- a/apps/desktop/src/features/inference-server/server-config.tsx +++ b/apps/desktop/src/features/inference-server/server-config.tsx @@ -1,17 +1,17 @@ import { cn } from "@lab/theme/utils" import { SpinnerButton } from "@lab/ui/button" -import { Input } from "@lab/ui/input" +import { IntInput } from "@lab/ui/int-input" +import { Switch } from "@lab/ui/switch" import { useState } from "react" import { useGlobal } from "~providers/global" export const ServerConfig = () => { const { - concurrencyState: [concurrency, setConcurrency], + serverConfig, serverStartedState: [isStarted], startServer, - stopServer, - portState: [port, setPort] + stopServer } = useGlobal() const [isLoading, setIsLoading] = useState(false) @@ -23,22 +23,30 @@ export const ServerConfig = () => { Test */} - setPort(e.target.valueAsNumber || 0)} + value={serverConfig.data.port} + onDone={(port) => serverConfig.update({ port })} /> - setConcurrency(e.target.valueAsNumber || 0)} + value={serverConfig.data.concurrency} + onDone={(concurrency) => serverConfig.update({ concurrency })} /> + + serverConfig.update({ useGpu })} + /> + [InvokeCommand.GetConfig]: InvokeIO<{ key: string }, string> - - [InvokeCommand.StartServer]: InvokeIO<{ port: number }, string> - [InvokeCommand.StopServer]: InvokeIO } & ThreadCommandMap & - ModelCommandMap + ModelCommandMap & + ServerCommandMap export type ValidCommand = keyof InvokeCommandMap diff --git a/apps/desktop/src/features/invoke/server.ts b/apps/desktop/src/features/invoke/server.ts new file mode 100644 index 0000000..ab93c56 --- /dev/null +++ b/apps/desktop/src/features/invoke/server.ts @@ -0,0 +1,18 @@ +import type { InvokeCommand, InvokeIO } from "~features/invoke/_shared" + +export type ServerConfig = { + port: number + concurrency: number + useGpu: boolean +} + +export type ServerCommandMap = { + [InvokeCommand.StartServer]: InvokeIO<{ port: number }, string> + [InvokeCommand.StopServer]: InvokeIO + + [InvokeCommand.GetServerConfig]: InvokeIO<{ path: string }, ServerConfig> + [InvokeCommand.SetServerConfig]: InvokeIO<{ + path: string + config: ServerConfig + }> +} diff --git a/apps/desktop/src/features/layout/index.tsx b/apps/desktop/src/features/layout/index.tsx index 57d42ad..328c09e 100644 --- a/apps/desktop/src/features/layout/index.tsx +++ b/apps/desktop/src/features/layout/index.tsx @@ -7,6 +7,7 @@ import type { ReactNode } from "react" import { InvokeCommand, invoke } from "~features/invoke" import { NavButton } from "~features/layout/nav-button" +import { ViewHeader } from "~features/layout/view" import { NewThreadButton } from "~features/thread/new-thread" import { ChatSideBar } from "~features/thread/side-bar" import { Route, useGlobal } from "~providers/global" @@ -16,7 +17,7 @@ const TopBar = () => { threadsDirectoryState: { threadsDirectory, updateThreadsDirectory } } = useGlobal() return ( -
+ -
+ ) } diff --git a/apps/desktop/src/features/layout/view.tsx b/apps/desktop/src/features/layout/view.tsx index 0081803..7132da5 100644 --- a/apps/desktop/src/features/layout/view.tsx +++ b/apps/desktop/src/features/layout/view.tsx @@ -10,11 +10,17 @@ export const ViewContainer = ({ ) -export const ViewHeader = ({ children = null as ReactNode }) => { +export const ViewHeader = ({ + children = null as ReactNode, + className = "" +}) => { return (
+ className={cn( + "flex items-center gap-2 bg-gray-1 w-full h-20 shrink-0 px-4 border-b border-b-gray-6 z-30", + className + )}> {children} {/* // For future maybe custom window bar
diff --git a/apps/desktop/src/features/thread/mdx-parser.ts b/apps/desktop/src/features/thread/mdx-parser.ts index c730e50..a63cecd 100644 --- a/apps/desktop/src/features/thread/mdx-parser.ts +++ b/apps/desktop/src/features/thread/mdx-parser.ts @@ -1,6 +1,5 @@ import { Parser } from "acorn" import acornJsx from "acorn-jsx" -import dedent from "ts-dedent" function replacer(_: any, value: any) { if (value === "" || value === null) { diff --git a/apps/desktop/src/features/thread/process-sse-stream.ts b/apps/desktop/src/features/thread/process-sse-stream.ts index 613eb9b..36ff894 100644 --- a/apps/desktop/src/features/thread/process-sse-stream.ts +++ b/apps/desktop/src/features/thread/process-sse-stream.ts @@ -3,13 +3,24 @@ interface StreamResponse { choices: Array<{ text: string }> } -const SSE_DATA_EVENT_PREFIX = "data:" +const SSE_DATA_PREFIX = "data:" +const SSE_EVENT_PREFIX = "event:" +const SSE_COMMENT_PREFIX = ":" export async function processSseStream( fetchStream: Response, abortRef: { current: boolean }, - onData: (resp: StreamResponse) => Promise, - onFinish: (isDone: boolean) => Promise + { + onData, + onFinish, + onEvent, + onComment + }: { + onData: (resp: StreamResponse) => Promise + onFinish: (isDone: boolean) => Promise + onEvent?: (str: string) => Promise + onComment?: (str: string) => Promise + } ) { const reader = fetchStream.body?.getReader() @@ -27,16 +38,30 @@ export async function processSseStream( ? readingBuffer.value : decoder.decode(readingBuffer.value, { stream: true }) - if (result?.startsWith(SSE_DATA_EVENT_PREFIX)) { - const eventData = result.slice(SSE_DATA_EVENT_PREFIX.length).trim() + const lines = result.split("\n") - if (eventData === "[DONE]") { - // Handle early termination here if needed. This is the final value event emitted by the server before closing the connection. + for (const line of lines) { + if (line?.startsWith(SSE_COMMENT_PREFIX)) { + const comment = line.slice(SSE_COMMENT_PREFIX.length).trim() + await onComment?.(comment) + } - break + if (line?.startsWith(SSE_EVENT_PREFIX)) { + const eventName = line.slice(SSE_EVENT_PREFIX.length).trim() + await onEvent?.(eventName) } - await onData(JSON.parse(eventData)) + if (line?.startsWith(SSE_DATA_PREFIX)) { + const eventData = line.slice(SSE_DATA_PREFIX.length).trim() + + if (eventData === "[DONE]") { + // Handle early termination here if needed. This is the final value event emitted by the server before closing the connection. + + break + } + + await onData(JSON.parse(eventData)) + } } } catch (_) {} diff --git a/apps/desktop/src/features/thread/thread-model-selector.tsx b/apps/desktop/src/features/thread/thread-model-selector.tsx index 267c101..dd77fc3 100644 --- a/apps/desktop/src/features/thread/thread-model-selector.tsx +++ b/apps/desktop/src/features/thread/thread-model-selector.tsx @@ -1,4 +1,5 @@ import { cn } from "@lab/theme/utils" +import { CornerLabel } from "@lab/ui/label" import { Select, SelectContent, @@ -37,12 +38,7 @@ export const ThreadModelSelector = () => { "relative", "w-64 flex flex-grow-0 flex-shrink-0 group" )}> - + Model
diff --git a/apps/desktop/src/features/thread/use-hybrid.ts b/apps/desktop/src/features/thread/use-hybrid.ts new file mode 100644 index 0000000..8d98154 --- /dev/null +++ b/apps/desktop/src/features/thread/use-hybrid.ts @@ -0,0 +1,22 @@ +import { useReducer, useRef } from "react" + +/** + * A hybrid is a state variable that is accompanied by a logic ref. + * The render states are good for ui render + * The logic ref is useful for checking in effect without the need for re-render. + */ +export const useHybrid = (defaultValue: T) => { + const dataRef = useRef(defaultValue) + const [render, set] = useReducer( + (_: T, newValue: T) => (dataRef.current = newValue), + dataRef.current + ) + + return { + set, + render, + get data() { + return dataRef.current + } + } +} diff --git a/apps/desktop/src/providers/global.ts b/apps/desktop/src/providers/global.ts index d889e8e..166d6d9 100644 --- a/apps/desktop/src/providers/global.ts +++ b/apps/desktop/src/providers/global.ts @@ -5,9 +5,11 @@ import { createProvider } from "puro" import { useEffect, useRef } from "react" import { useContext, useState } from "react" +import { createFileConfigStore } from "~features/inference-server/file-config-store" import { useInit } from "~features/inference-server/use-init" import { useModelsDirectory } from "~features/inference-server/use-models-directory" import { InvokeCommand, invoke } from "~features/invoke" +import type { ServerConfig } from "~features/invoke/server" import { useToggle } from "~features/layout/use-toggle" import type { FileInfo, @@ -41,14 +43,25 @@ async function setTitle(title = "") { await window.setTitle(`${_prefix}${title}${suffix}`) } +const useServerConfig = createFileConfigStore( + InvokeCommand.GetServerConfig, + InvokeCommand.SetServerConfig +) + const useGlobalProvider = () => { const [activeRoute, setActiveRoute] = useState(Route.ModelManager) const activeModelState = useState(null) - const concurrencyState = useState(1) const [activeThread, setActiveThread] = useState() - const portState = useState(8000) + const serverConfig = useServerConfig( + { path: "june-2023" }, + { + concurrency: 1, + port: 8000, + useGpu: false + } + ) const serverStartedState = useState(false) const sidebarState = useToggle(true) @@ -86,9 +99,9 @@ const useGlobalProvider = () => { }) const startServer = async () => { - await invoke(InvokeCommand.StartServer, { port: portState[0] }).catch( - (_) => null - ) + await invoke(InvokeCommand.StartServer, { + port: serverConfig.data.port + }).catch((_) => null) serverStartedState[1](true) } @@ -100,7 +113,8 @@ const useGlobalProvider = () => { const loadModel = async (model: ModelMetadata) => { await invoke(InvokeCommand.LoadModel, { ...model, - concurrency: concurrencyState[0] + concurrency: serverConfig.data.concurrency, + useGpu: serverConfig.data.useGpu }) const integrity = await getCachedIntegrity(model) @@ -134,12 +148,12 @@ const useGlobalProvider = () => { stopServer, knownModels, + serverConfig, - portState, routeState: [activeRoute, setActiveRoute] as const, activeThreadState: [activeThread, setActiveThread] as const, activeModelState, - concurrencyState, + serverStartedState, sidebarState, modelsDirectoryState, diff --git a/apps/desktop/src/providers/thread.ts b/apps/desktop/src/providers/thread.ts index be9857e..e79d690 100644 --- a/apps/desktop/src/providers/thread.ts +++ b/apps/desktop/src/providers/thread.ts @@ -2,7 +2,16 @@ import { nanoid } from "nanoid" import { createProvider } from "puro" -import { useCallback, useContext, useMemo, useRef, useState } from "react" +import { + useCallback, + useContext, + useEffect, + useMemo, + useRef, + useState +} from "react" + +import { wait } from "@plasmo/utils/wait" import { createFileConfigStore } from "~features/inference-server/file-config-store" import { InvokeCommand } from "~features/invoke" @@ -14,6 +23,7 @@ import { type ThreadMessage } from "~features/thread/_shared" import { processSseStream } from "~features/thread/process-sse-stream" +import { useHybrid } from "~features/thread/use-hybrid" import { useThreadMdx } from "~features/thread/use-thread-mdx" import { useGlobal } from "~providers/global" @@ -33,13 +43,15 @@ const useThreadConfig = createFileConfigStore( */ const useThreadProvider = ({ thread }: { thread: FileInfo }) => { const { + routeState: [activeRoute], + activeThreadState: [activeThread], activeModelState: [activeModel], modelsDirectoryState: { models, modelsMap }, - portState: [port], + serverConfig, loadModel } = useGlobal() - const [isResponding, setIsResponding] = useState(false) + const isResponding = useHybrid(false) const threadConfig = useThreadConfig(thread, DEFAULT_THREAD_CONFIG) @@ -55,6 +67,8 @@ const useThreadProvider = ({ thread }: { thread: FileInfo }) => { const { messages, setMessages, appendMessage, botIconIndex } = useThreadMdx(thread) + const [statusMessage, setStatusMessage] = useState("") + const aiMessageRef = useRef() const abortRef = useRef(false) @@ -71,7 +85,7 @@ const useThreadProvider = ({ thread }: { thread: FileInfo }) => { ) const addNote = async (text: string) => { - setIsResponding(true) + isResponding.set(true) const newMessage: ThreadMessage = { id: nanoid(), role: Role.Note, @@ -81,7 +95,7 @@ const useThreadProvider = ({ thread }: { thread: FileInfo }) => { setMessages((m) => [newMessage, ...m]) await appendMessage(newMessage) - setIsResponding(false) + isResponding.set(false) } const stopInference = () => { @@ -89,7 +103,7 @@ const useThreadProvider = ({ thread }: { thread: FileInfo }) => { } const startInference = async (userPrompt: string) => { - if (isResponding) { + if (isResponding.data) { return } @@ -103,7 +117,7 @@ const useThreadProvider = ({ thread }: { thread: FileInfo }) => { ] setMessages(newMessages) - setIsResponding(true) + isResponding.set(true) await appendMessage(newMessages[0]) @@ -122,9 +136,10 @@ const useThreadProvider = ({ thread }: { thread: FileInfo }) => { } const fetchStream = await globalThis.fetch( - `http://localhost:${port}/completions`, + `http://localhost:${serverConfig.data.port}/completions`, { method: "POST", + keepalive: true, headers: { "Content-Type": "application/json" }, @@ -140,32 +155,44 @@ const useThreadProvider = ({ thread }: { thread: FileInfo }) => { throw new Error(`Server responded with ${fetchStream.status}`) } - await processSseStream( - fetchStream, - abortRef, - async function onData(resp) { + await processSseStream(fetchStream, abortRef, { + async onComment(comment) { + setStatusMessage(comment) + await wait(42) + }, + async onData(resp) { aiMessageRef.current.content += resp.choices[0].text setMessages([aiMessageRef.current, ...newMessages]) }, - async function onFinish() { + async onFinish() { abortRef.current = false + setStatusMessage("") await appendMessage( aiMessageRef.current, threadConfig.data, loadedModel ) - setIsResponding(false) + isResponding.set(false) } - ) + }) } catch (error) { alert(`ERROR: Server was not started OR no model was loaded | ${error}`) - setIsResponding(false) + isResponding.set(false) } } + useEffect(() => { + if (isResponding.data) { + abortRef.current = true + } + }, [activeThread.path, activeRoute]) + return { messages, - isResponding, + + statusMessage, + isResponding: isResponding.render, + botIconIndex, threadModel, diff --git a/apps/desktop/src/views/model-manager.tsx b/apps/desktop/src/views/model-manager.tsx index 62c0bfb..0d4c643 100644 --- a/apps/desktop/src/views/model-manager.tsx +++ b/apps/desktop/src/views/model-manager.tsx @@ -53,7 +53,7 @@ export function ModelManagerView() { /> )} { stopInference, isResponding, botIconIndex, - threadConfig + threadConfig, + statusMessage } = useThread() const botIconClass = useMemo( @@ -99,8 +100,9 @@ const MainPanel = () => { ))}
-
+
{isResponding && } +
{statusMessage}
=7.0.0", "node": ">=16.0.0" }, - "packageManager": "pnpm@8.5.0" + "packageManager": "pnpm@8.6.5" } diff --git a/packages/theme/package.json b/packages/theme/package.json index 7c5a8ef..d5af895 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -6,10 +6,10 @@ "license": "ISC", "dependencies": { "@plasmo/config": "workspace:*", - "@radix-ui/colors": "0.1.8", + "@radix-ui/colors": "1.0.0", "@tailwindcss/forms": "0.5.3", "@tailwindcss/typography": "0.5.9", - "class-variance-authority": "0.6.0", + "class-variance-authority": "0.6.1", "clsx": "1.2.1", "tailwind-merge": "1.13.2", "tailwindcss": "3.3.2", diff --git a/packages/ui/animation/in-view-fade.tsx b/packages/ui/animations/in-view-fade.tsx similarity index 100% rename from packages/ui/animation/in-view-fade.tsx rename to packages/ui/animations/in-view-fade.tsx diff --git a/packages/ui/hooks/use-match-media.ts b/packages/ui/hooks/use-match-media.ts new file mode 100644 index 0000000..6675c78 --- /dev/null +++ b/packages/ui/hooks/use-match-media.ts @@ -0,0 +1,27 @@ +import { useEffect, useState } from "react" + +export const useMatchMedia = (query: string) => { + const [isMatch, setIsMatch] = useState() + + useEffect(() => { + if (!globalThis.window?.matchMedia) { + return + } + + // set initial value + const mediaWatcher = globalThis.window.matchMedia(query) + setIsMatch(mediaWatcher.matches) + //watch for updates + function onMediaChanged(e: MediaQueryListEvent) { + setIsMatch(e.matches) + } + mediaWatcher.addEventListener("change", onMediaChanged) + + // clean up after ourselves + return function cleanup() { + mediaWatcher.removeEventListener("change", onMediaChanged) + } + }, [query]) + + return isMatch +} diff --git a/packages/ui/input.tsx b/packages/ui/input.tsx index cf69b94..40fea0c 100644 --- a/packages/ui/input.tsx +++ b/packages/ui/input.tsx @@ -3,6 +3,7 @@ import { ResetIcon } from "@radix-ui/react-icons" import { type InputHTMLAttributes, forwardRef } from "react" import { Button } from "./button" +import { CornerLabel } from "./label" export interface InputProps extends InputHTMLAttributes { onRevert?: () => void @@ -13,19 +14,18 @@ const Input = forwardRef( return (
{(props.title || props.placeholder) && ( - + )} void +} + +const intRegex = /^([0-9]{1,})?$/ + +export const IntInput = forwardRef( + ({ onDone, value, ...props }, ref) => { + const [localValue, setLocalValue] = useState(value.toFixed(0)) + + useEffect(() => { + setLocalValue(value.toFixed(0)) + }, [value]) + + return ( + { + const newValue = e.target.value + if (intRegex.test(newValue)) { + setLocalValue(newValue) + } + }} + onBlur={() => { + onDone?.(parseInt(localValue) || 0) + }} + {...props} + /> + ) + } +) + +IntInput.displayName = "IntInput" diff --git a/packages/ui/label.tsx b/packages/ui/label.tsx new file mode 100644 index 0000000..67ec66d --- /dev/null +++ b/packages/ui/label.tsx @@ -0,0 +1,24 @@ +import { cn } from "@lab/theme/utils" +import { type LabelHTMLAttributes, forwardRef } from "react" + +export interface LabelProps extends LabelHTMLAttributes { + isHidden?: boolean +} + +const CornerLabel = forwardRef( + ({ className, isHidden, ...props }, ref) => ( +