diff --git a/apps/app/package.json b/apps/app/package.json index 6ad6339f..bab30b3c 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -15,7 +15,9 @@ "devDependencies": { "@0x-jerry/unocss-preset-daisyui": "0.2.3", "@iconify-json/famicons": "^1.2.2", + "@iconify-json/healthicons": "^1.2.12", "@iconify-json/line-md": "^1.2.14", + "@iconify-json/ri": "^1.2.9", "@sveltejs/vite-plugin-svelte": "^6.2.4", "@tauri-apps/cli": "^2.9.6", "@testing-library/svelte": "^5.3.1", @@ -34,6 +36,10 @@ "vitest": "^4.0.18" }, "dependencies": { + "@ai-sdk/anthropic": "^3.0.36", + "@ai-sdk/google": "^3.0.21", + "@ai-sdk/openai": "^3.0.25", + "@ai-sdk/provider": "^3.0.7", "@iconify-json/carbon": "^1.2.18", "@iconify-json/tabler": "^1.2.26", "@saurl/tauri-plugin-safe-area-insets-css-api": "^0.1.0", @@ -48,12 +54,15 @@ "@unocss/preset-mini": "^66.6.0", "@unocss/reset": "^66.6.0", "@unocss/transformer-variant-group": "^66.6.0", + "ai": "^6.0.70", + "bits-ui": "^2.15.5", "daisyui": "5.4.7", "html2canvas-pro": "^1.6.6", "jspdf": "^3.0.4", "svelte-animated-details": "^1.0.2", "svelte-sonner": "^1.0.7", "tauri-plugin-android-fs-api": "^24.2.2", + "tauri-plugin-llm-api": "git+https://github.com/crabnebula-dev/tauri-plugin-llm.git", "zod": "^4.3.6" } } diff --git a/apps/app/src-tauri/Cargo.lock b/apps/app/src-tauri/Cargo.lock index f40e7878..c65abf65 100644 --- a/apps/app/src-tauri/Cargo.lock +++ b/apps/app/src-tauri/Cargo.lock @@ -19,6 +19,20 @@ dependencies = [ "version_check", ] +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "serde", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.4" @@ -43,6 +57,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "android_log-sys" version = "0.3.2" @@ -289,6 +309,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + [[package]] name = "base64" version = "0.21.7" @@ -301,6 +327,21 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + [[package]] name = "bitflags" version = "1.3.2" @@ -309,9 +350,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" dependencies = [ "serde_core", ] @@ -328,6 +369,12 @@ dependencies = [ "wyz", ] +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "block-buffer" version = "0.10.4" @@ -448,6 +495,20 @@ name = "bytemuck" version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] [[package]] name = "byteorder" @@ -476,7 +537,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "cairo-sys-rs", "glib", "libc", @@ -504,6 +565,91 @@ dependencies = [ "serde_core", ] +[[package]] +name = "candle-core" +version = "0.9.2" +source = "git+https://github.com/huggingface/candle.git#38e7202145a8d264cf78e824edf2c31f6a438cdf" +dependencies = [ + "byteorder", + "candle-metal-kernels", + "candle-ug", + "float8", + "gemm 0.19.0", + "half", + "libm", + "memmap2", + "num-traits", + "num_cpus", + "objc2-foundation", + "objc2-metal", + "rand 0.9.2", + "rand_distr", + "rayon", + "safetensors 0.7.0", + "thiserror 2.0.17", + "tokenizers 0.22.2", + "yoke 0.8.1", + "zip", +] + +[[package]] +name = "candle-metal-kernels" +version = "0.9.2" +source = "git+https://github.com/huggingface/candle.git#38e7202145a8d264cf78e824edf2c31f6a438cdf" +dependencies = [ + "half", + "objc2", + "objc2-foundation", + "objc2-metal", + "once_cell", + "thiserror 2.0.17", + "tracing", +] + +[[package]] +name = "candle-nn" +version = "0.9.2" +source = "git+https://github.com/huggingface/candle.git#38e7202145a8d264cf78e824edf2c31f6a438cdf" +dependencies = [ + "candle-core", + "candle-metal-kernels", + "half", + "libc", + "num-traits", + "objc2-metal", + "rayon", + "safetensors 0.7.0", + "serde", + "thiserror 2.0.17", +] + +[[package]] +name = "candle-transformers" +version = "0.9.2" +source = "git+https://github.com/huggingface/candle.git#38e7202145a8d264cf78e824edf2c31f6a438cdf" +dependencies = [ + "byteorder", + "candle-core", + "candle-nn", + "fancy-regex", + "num-traits", + "rand 0.9.2", + "rayon", + "serde", + "serde_json", + "serde_plain", + "tracing", +] + +[[package]] +name = "candle-ug" +version = "0.9.2" +source = "git+https://github.com/huggingface/candle.git#38e7202145a8d264cf78e824edf2c31f6a438cdf" +dependencies = [ + "ug", + "ug-metal", +] + [[package]] name = "cargo-platform" version = "0.1.9" @@ -537,6 +683,15 @@ dependencies = [ "toml 0.9.10+spec-1.1.0", ] +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + [[package]] name = "cc" version = "1.2.51" @@ -591,6 +746,7 @@ name = "cherit" version = "0.0.1" dependencies = [ "futures", + "hf-hub 0.5.0", "log", "natord", "rayon", @@ -602,6 +758,7 @@ dependencies = [ "tauri-plugin-clipboard-manager", "tauri-plugin-dialog", "tauri-plugin-fs", + "tauri-plugin-llm", "tauri-plugin-log", "tauri-plugin-opener", "tauri-plugin-os", @@ -641,6 +798,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "compact_str" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "serde", + "static_assertions", +] + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -650,6 +822,32 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", +] + +[[package]] +name = "console" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03e45a4a8926227e4197636ba97a9fc9b00477e9f4bd711395687c5f0734bec4" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.61.2", +] + [[package]] name = "convert_case" version = "0.4.0" @@ -666,6 +864,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation" version = "0.10.1" @@ -688,10 +896,21 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 2.10.0", - "core-foundation", - "core-graphics-types", - "foreign-types", + "bitflags 2.11.0", + "core-foundation 0.10.1", + "core-graphics-types 0.2.0", + "foreign-types 0.5.0", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", "libc", ] @@ -701,8 +920,8 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.10.0", - "core-foundation", + "bitflags 2.11.0", + "core-foundation 0.10.1", "libc", ] @@ -811,14 +1030,38 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + [[package]] name = "darling" version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.21.3", + "darling_macro 0.21.3", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.111", ] [[package]] @@ -835,17 +1078,37 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core 0.20.11", + "quote", + "syn 2.0.111", +] + [[package]] name = "darling_macro" version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ - "darling_core", + "darling_core 0.21.3", "quote", "syn 2.0.111", ] +[[package]] +name = "dary_heap" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06d2e3287df1c007e74221c49ca10a95d557349e54b3a75dc2fb14712c751f04" +dependencies = [ + "serde", +] + [[package]] name = "deranged" version = "0.5.5" @@ -856,6 +1119,37 @@ dependencies = [ "serde_core", ] +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn 2.0.111", +] + [[package]] name = "derive_more" version = "0.99.20" @@ -912,7 +1206,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "libc", "objc2", @@ -1003,6 +1297,22 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" +[[package]] +name = "dyn-stack" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c4713e43e2886ba72b8271aa66c93d722116acf7a75555cce11dcde84388fe8" +dependencies = [ + "bytemuck", + "dyn-stack-macros", +] + +[[package]] +name = "dyn-stack-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d926b4d407d372f141f93bb444696142c29d32962ccbd3531117cf3aa0bfa9" + [[package]] name = "either" version = "1.15.0" @@ -1029,12 +1339,39 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "endi" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" +[[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "enumflags2" version = "0.7.12" @@ -1099,6 +1436,15 @@ version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" +[[package]] +name = "esaxx-rs" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d817e038c30374a4bcb22f94d0a8a0e216958d4c3dcde369b1439fec4bdda6e6" +dependencies = [ + "cc", +] + [[package]] name = "event-listener" version = "5.4.1" @@ -1121,18 +1467,41 @@ dependencies = [ ] [[package]] -name = "fastrand" -version = "2.3.0" +name = "failsafe" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "a6b1dc7c28e66a8f5dc32b7043b735e93d9eea8ea6e7be5507dae5850ab7ac70" +dependencies = [ + "futures-core", + "parking_lot", + "pin-project", + "rand 0.8.5", +] [[package]] -name = "fax" -version = "0.2.6" +name = "fancy-regex" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" +checksum = "72cf461f865c862bb7dc573f643dd6a2b6842f7c30b07882b56bd148cc2761b8" dependencies = [ - "fax_derive", + "bit-set", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fax" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" +dependencies = [ + "fax_derive", ] [[package]] @@ -1196,6 +1565,18 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "float8" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d1f04709a8ac06e8e8042875a3c466cc4832d3c1a18dbcb9dba3c6e83046bc" +dependencies = [ + "half", + "num-traits", + "rand 0.9.2", + "rand_distr", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1208,6 +1589,21 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -1215,7 +1611,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared", + "foreign-types-shared 0.3.1", ] [[package]] @@ -1229,6 +1625,12 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "foreign-types-shared" version = "0.3.1" @@ -1470,6 +1872,244 @@ dependencies = [ "x11", ] +[[package]] +name = "gemm" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab96b703d31950f1aeddded248bc95543c9efc7ac9c4a21fda8703a83ee35451" +dependencies = [ + "dyn-stack", + "gemm-c32 0.18.2", + "gemm-c64 0.18.2", + "gemm-common 0.18.2", + "gemm-f16 0.18.2", + "gemm-f32 0.18.2", + "gemm-f64 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa0673db364b12263d103b68337a68fbecc541d6f6b61ba72fe438654709eacb" +dependencies = [ + "dyn-stack", + "gemm-c32 0.19.0", + "gemm-c64 0.19.0", + "gemm-common 0.19.0", + "gemm-f16 0.19.0", + "gemm-f32 0.19.0", + "gemm-f64 0.19.0", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-c32" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6db9fd9f40421d00eea9dd0770045a5603b8d684654816637732463f4073847" +dependencies = [ + "dyn-stack", + "gemm-common 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-c32" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "086936dbdcb99e37aad81d320f98f670e53c1e55a98bee70573e83f95beb128c" +dependencies = [ + "dyn-stack", + "gemm-common 0.19.0", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-c64" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfcad8a3d35a43758330b635d02edad980c1e143dc2f21e6fd25f9e4eada8edf" +dependencies = [ + "dyn-stack", + "gemm-common 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-c64" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c8aeeeec425959bda4d9827664029ba1501a90a0d1e6228e48bef741db3a3f" +dependencies = [ + "dyn-stack", + "gemm-common 0.19.0", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-common" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a352d4a69cbe938b9e2a9cb7a3a63b7e72f9349174a2752a558a8a563510d0f3" +dependencies = [ + "bytemuck", + "dyn-stack", + "half", + "libm", + "num-complex", + "num-traits", + "once_cell", + "paste", + "pulp 0.21.5", + "raw-cpuid", + "rayon", + "seq-macro", + "sysctl", +] + +[[package]] +name = "gemm-common" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88027625910cc9b1085aaaa1c4bc46bb3a36aad323452b33c25b5e4e7c8e2a3e" +dependencies = [ + "bytemuck", + "dyn-stack", + "half", + "libm", + "num-complex", + "num-traits", + "once_cell", + "paste", + "pulp 0.22.2", + "raw-cpuid", + "rayon", + "seq-macro", + "sysctl", +] + +[[package]] +name = "gemm-f16" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff95ae3259432f3c3410eaa919033cd03791d81cebd18018393dc147952e109" +dependencies = [ + "dyn-stack", + "gemm-common 0.18.2", + "gemm-f32 0.18.2", + "half", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "rayon", + "seq-macro", +] + +[[package]] +name = "gemm-f16" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3df7a55202e6cd6739d82ae3399c8e0c7e1402859b30e4cb780e61525d9486e" +dependencies = [ + "dyn-stack", + "gemm-common 0.19.0", + "gemm-f32 0.19.0", + "half", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "rayon", + "seq-macro", +] + +[[package]] +name = "gemm-f32" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc8d3d4385393304f407392f754cd2dc4b315d05063f62cf09f47b58de276864" +dependencies = [ + "dyn-stack", + "gemm-common 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-f32" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e0b8c9da1fbec6e3e3ab2ce6bc259ef18eb5f6f0d3e4edf54b75f9fd41a81c" +dependencies = [ + "dyn-stack", + "gemm-common 0.19.0", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-f64" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35b2a4f76ce4b8b16eadc11ccf2e083252d8237c1b589558a49b0183545015bd" +dependencies = [ + "dyn-stack", + "gemm-common 0.18.2", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + +[[package]] +name = "gemm-f64" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056131e8f2a521bfab322f804ccd652520c79700d81209e9d9275bbdecaadc6a" +dependencies = [ + "dyn-stack", + "gemm-common 0.19.0", + "num-complex", + "num-traits", + "paste", + "raw-cpuid", + "seq-macro", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1508,8 +2148,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -1519,9 +2161,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi", "wasip2", + "wasm-bindgen", ] [[package]] @@ -1562,7 +2206,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "futures-channel", "futures-core", "futures-executor", @@ -1672,14 +2316,37 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "h2" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.12.1", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ + "bytemuck", "cfg-if", "crunchy", + "num-traits", + "rand 0.9.2", + "rand_distr", "zerocopy", ] @@ -1689,7 +2356,7 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash", + "ahash 0.7.8", ] [[package]] @@ -1698,7 +2365,7 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "foldhash", + "foldhash 0.1.5", ] [[package]] @@ -1706,6 +2373,13 @@ name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", + "serde", + "serde_core", +] [[package]] name = "heck" @@ -1731,6 +2405,51 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hf-hub" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "629d8f3bbeda9d148036d6b0de0a3ab947abd08ce90626327fc3547a49d59d97" +dependencies = [ + "dirs", + "futures", + "http", + "indicatif 0.17.11", + "libc", + "log", + "native-tls", + "num_cpus", + "rand 0.9.2", + "reqwest", + "serde", + "serde_json", + "thiserror 2.0.17", + "tokio", + "ureq", + "windows-sys 0.60.2", +] + +[[package]] +name = "hf-hub" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef3982638978efa195ff11b305f51f1f22f4f0a6cabee7af79b383ebee6a213" +dependencies = [ + "dirs", + "futures", + "indicatif 0.18.4", + "libc", + "log", + "num_cpus", + "rand 0.9.2", + "reqwest", + "serde", + "serde_json", + "thiserror 2.0.17", + "tokio", + "windows-sys 0.61.2", +] + [[package]] name = "html5ever" version = "0.29.1" @@ -1792,6 +2511,7 @@ dependencies = [ "bytes", "futures-channel", "futures-core", + "h2", "http", "http-body", "httparse", @@ -1803,6 +2523,39 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots 1.0.6", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + [[package]] name = "hyper-util" version = "0.1.19" @@ -1822,9 +2575,11 @@ dependencies = [ "percent-encoding", "pin-project-lite", "socket2", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] @@ -1869,7 +2624,7 @@ checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", - "yoke", + "yoke 0.8.1", "zerofrom", "zerovec", ] @@ -1936,7 +2691,7 @@ dependencies = [ "displaydoc", "icu_locale_core", "writeable", - "yoke", + "yoke 0.8.1", "zerofrom", "zerotrie", "zerovec", @@ -2006,6 +2761,32 @@ dependencies = [ "serde_core", ] +[[package]] +name = "indicatif" +version = "0.17.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" +dependencies = [ + "console 0.15.11", + "number_prefix", + "portable-atomic", + "unicode-width", + "web-time", +] + +[[package]] +name = "indicatif" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" +dependencies = [ + "console 0.16.2", + "portable-atomic", + "unicode-width", + "unit-prefix", + "web-time", +] + [[package]] name = "infer" version = "0.19.0" @@ -2050,6 +2831,15 @@ dependencies = [ "once_cell", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.17" @@ -2139,7 +2929,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "serde", "unicode-segmentation", ] @@ -2212,13 +3002,19 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + [[package]] name = "libredox" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "libc", ] @@ -2252,12 +3048,43 @@ dependencies = [ "value-bag", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "mac" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" +[[package]] +name = "macro_rules_attribute" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65049d7923698040cd0b1ddcced9b0eb14dd22c5f86ae59c3740eab64a676520" +dependencies = [ + "macro_rules_attribute-proc_macro", + "paste", +] + +[[package]] +name = "macro_rules_attribute-proc_macro" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670fdfda89751bc4a84ac13eaa63e205cf0fd22b4c9a5fbfa085b63c1f1d3a30" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + [[package]] name = "markup5ever" version = "0.14.1" @@ -2295,6 +3122,16 @@ version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +[[package]] +name = "memmap2" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" +dependencies = [ + "libc", + "stable_deref_trait", +] + [[package]] name = "memoffset" version = "0.9.1" @@ -2304,12 +3141,43 @@ dependencies = [ "autocfg", ] +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.11.0", + "block", + "core-graphics-types 0.1.3", + "foreign-types 0.5.0", + "log", + "objc", + "paste", +] + [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minijinja" +version = "2.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c54f3bcc034dd74496b5ca929fd0b710186672d5ff0b0f255a9ceb259042ece" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -2331,6 +3199,28 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "monostate" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3341a273f6c9d5bef1908f17b7267bbab0e95c9bf69a0d4dcf8e9e1b2c76ef67" +dependencies = [ + "monostate-impl", + "serde", + "serde_core", +] + +[[package]] +name = "monostate-impl" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4db6d5580af57bf992f59068d4ea26fd518574ff48d7639b255a36f9de6e7e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "moxcms" version = "0.7.11" @@ -2362,6 +3252,23 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "native-tls" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "natord" version = "1.0.9" @@ -2374,7 +3281,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "jni-sys", "log", "ndk-sys", @@ -2410,7 +3317,7 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "cfg-if", "cfg_aliases", "libc", @@ -2423,6 +3330,16 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "nom" version = "8.0.0" @@ -2432,11 +3349,85 @@ dependencies = [ "memchr", ] +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "bytemuck", + "num-traits", +] + [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] [[package]] name = "num-traits" @@ -2445,6 +3436,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", ] [[package]] @@ -2478,6 +3480,21 @@ dependencies = [ "libc", ] +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + [[package]] name = "objc2" version = "0.6.3" @@ -2494,7 +3511,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "libc", "objc2", @@ -2515,7 +3532,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "objc2", "objc2-foundation", ] @@ -2526,7 +3543,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "objc2", "objc2-foundation", ] @@ -2537,7 +3554,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "dispatch2", "objc2", ] @@ -2548,7 +3565,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "dispatch2", "objc2", "objc2-core-foundation", @@ -2581,7 +3598,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "objc2", "objc2-core-foundation", "objc2-core-graphics", @@ -2593,7 +3610,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "objc2", "objc2-core-foundation", "objc2-core-graphics", @@ -2621,7 +3638,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "libc", "objc2", @@ -2634,7 +3651,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "objc2", "objc2-core-foundation", ] @@ -2649,13 +3666,27 @@ dependencies = [ "objc2-core-foundation", ] +[[package]] +name = "objc2-metal" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" +dependencies = [ + "bitflags 2.11.0", + "block2", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + [[package]] name = "objc2-quartz-core" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "objc2", "objc2-core-foundation", "objc2-foundation", @@ -2667,7 +3698,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "objc2", "objc2-core-foundation", ] @@ -2678,7 +3709,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "objc2", "objc2-cloud-kit", @@ -2707,34 +3738,100 @@ dependencies = [ name = "objc2-web-kit" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-javascript-core", + "objc2-security", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "onig" +version = "6.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "336b9c63443aceef14bea841b899035ae3abe89b7c486aaf4c5bd8aafedac3f0" +dependencies = [ + "bitflags 2.11.0", + "libc", + "once_cell", + "onig_sys", +] + +[[package]] +name = "onig_sys" +version = "69.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f86c6eef3d6df15f23bcfb6af487cbd2fed4e5581d58d5bf1f5f8b7f6727dc" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "open" +version = "5.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" +dependencies = [ + "dunce", + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "openssl" +version = "0.10.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "bitflags 2.10.0", - "block2", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "objc2-javascript-core", - "objc2-security", + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] -name = "once_cell" -version = "1.21.3" +name = "openssl-probe" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] -name = "open" -version = "5.3.3" +name = "openssl-sys" +version = "0.9.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ - "dunce", - "is-wsl", + "cc", "libc", - "pathdiff", + "pkg-config", + "vcpkg", ] [[package]] @@ -2833,6 +3930,12 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pathdiff" version = "0.2.3" @@ -2990,6 +4093,26 @@ dependencies = [ "siphasher 1.0.1", ] +[[package]] +name = "pin-project" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -3051,7 +4174,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "crc32fast", "fdeflate", "flate2", @@ -3072,6 +4195,12 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + [[package]] name = "potential_utf" version = "0.1.4" @@ -3190,6 +4319,43 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "pulp" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b86df24f0a7ddd5e4b95c94fc9ed8a98f1ca94d3b01bdce2824097e7835907" +dependencies = [ + "bytemuck", + "cfg-if", + "libm", + "num-complex", + "reborrow", + "version_check", +] + +[[package]] +name = "pulp" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e205bb30d5b916c55e584c22201771bcf2bad9aabd5d4127f38387140c38632" +dependencies = [ + "bytemuck", + "cfg-if", + "libm", + "num-complex", + "paste", + "pulp-wasm-simd-flag", + "raw-cpuid", + "reborrow", + "version_check", +] + +[[package]] +name = "pulp-wasm-simd-flag" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40e24eee682d89fb193496edf918a7f407d30175b2e785fe057e4392dfd182e0" + [[package]] name = "pxfm" version = "0.1.27" @@ -3223,6 +4389,61 @@ dependencies = [ "memchr", ] +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.17", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.17", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "quote" version = "1.0.42" @@ -3336,6 +4557,16 @@ dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rand_distr" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" +dependencies = [ + "num-traits", + "rand 0.9.2", +] + [[package]] name = "rand_hc" version = "0.2.0" @@ -3354,6 +4585,15 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags 2.11.0", +] + [[package]] name = "raw-window-handle" version = "0.6.2" @@ -3370,6 +4610,17 @@ dependencies = [ "rayon-core", ] +[[package]] +name = "rayon-cond" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2964d0cf57a3e7a06e8183d14a8b527195c706b7983549cd5462d5aa3747438f" +dependencies = [ + "either", + "itertools", + "rayon", +] + [[package]] name = "rayon-core" version = "1.13.0" @@ -3380,13 +4631,19 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "reborrow" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" + [[package]] name = "redox_syscall" version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] @@ -3466,22 +4723,33 @@ checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ "base64 0.22.1", "bytes", + "encoding_rs", "futures-core", "futures-util", + "h2", "http", "http-body", "http-body-util", "hyper", + "hyper-rustls", + "hyper-tls", "hyper-util", "js-sys", "log", + "mime", + "native-tls", "percent-encoding", "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", "tokio", + "tokio-native-tls", + "tokio-rustls", "tokio-util", "tower", "tower-http", @@ -3491,6 +4759,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", + "webpki-roots 1.0.6", ] [[package]] @@ -3518,6 +4787,20 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "rkyv" version = "0.7.45" @@ -3563,6 +4846,12 @@ dependencies = [ "serde_json", ] +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustc_version" version = "0.4.1" @@ -3578,13 +4867,49 @@ version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "errno", "libc", "linux-raw-sys", "windows-sys 0.61.2", ] +[[package]] +name = "rustls" +version = "0.23.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.22" @@ -3597,6 +4922,27 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" +[[package]] +name = "safetensors" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44560c11236a6130a46ce36c836a62936dc81ebf8c36a37947423571be0e55b6" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "safetensors" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "675656c1eabb620b921efea4f9199f97fc86e36dd6ffd1fbbe48d0f59a4987f5" +dependencies = [ + "hashbrown 0.16.1", + "serde", + "serde_json", +] + [[package]] name = "same-file" version = "1.0.6" @@ -3606,6 +4952,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "schemars" version = "0.8.22" @@ -3675,6 +5030,29 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.11.0", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "selectors" version = "0.24.0" @@ -3703,6 +5081,12 @@ dependencies = [ "serde_core", ] +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + [[package]] name = "serde" version = "1.0.228" @@ -3769,6 +5153,15 @@ dependencies = [ "zmij", ] +[[package]] +name = "serde_plain" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1fc6db65a611022b23a0dec6975d63fb80a302cb3388835ff02c097258d50" +dependencies = [ + "serde", +] + [[package]] name = "serde_repr" version = "0.1.20" @@ -3835,7 +5228,7 @@ version = "3.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" dependencies = [ - "darling", + "darling 0.21.3", "proc-macro2", "quote", "syn 2.0.111", @@ -3884,6 +5277,15 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" version = "1.3.0" @@ -3946,6 +5348,17 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "socks" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b" +dependencies = [ + "byteorder", + "libc", + "winapi", +] + [[package]] name = "softbuffer" version = "0.4.8" @@ -3994,6 +5407,18 @@ dependencies = [ "system-deps", ] +[[package]] +name = "spm_precompiled" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5851699c4033c63636f7ea4cf7b7c1f1bf06d0cc03cfb42e711de5a5c46cf326" +dependencies = [ + "base64 0.13.1", + "nom 7.1.3", + "serde", + "unicode-segmentation", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -4037,6 +5462,12 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "swift-rs" version = "1.0.7" @@ -4091,22 +5522,57 @@ dependencies = [ ] [[package]] -name = "synstructure" -version = "0.13.2" +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "sys-locale" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" +dependencies = [ + "libc", +] + +[[package]] +name = "sysctl" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc" +dependencies = [ + "bitflags 2.11.0", + "byteorder", + "enum-as-inner", + "libc", + "thiserror 1.0.69", + "walkdir", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", + "bitflags 2.11.0", + "core-foundation 0.9.4", + "system-configuration-sys", ] [[package]] -name = "sys-locale" -version = "0.3.2" +name = "system-configuration-sys" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ + "core-foundation-sys", "libc", ] @@ -4129,9 +5595,9 @@ version = "0.34.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", - "core-foundation", + "core-foundation 0.10.1", "core-graphics", "crossbeam-channel", "dispatch", @@ -4391,6 +5857,32 @@ dependencies = [ "url", ] +[[package]] +name = "tauri-plugin-llm" +version = "0.1.0" +source = "git+https://github.com/crabnebula-dev/tauri-plugin-llm#e8add88af76b1fbb2798ea85ec9f53cbd1976488" +dependencies = [ + "anyhow", + "base64 0.22.1", + "candle-core", + "candle-nn", + "candle-transformers", + "failsafe", + "hf-hub 0.4.3", + "minijinja", + "rand 0.9.2", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.17", + "tokenizers 0.22.3-dev.0", + "tokio", + "tracing", + "tracing-appender", + "tracing-subscriber", +] + [[package]] name = "tauri-plugin-log" version = "2.7.1" @@ -4646,6 +6138,15 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + [[package]] name = "tiff" version = "0.10.3" @@ -4662,9 +6163,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.44" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", @@ -4672,22 +6173,22 @@ dependencies = [ "num-conv", "num_threads", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", @@ -4718,6 +6219,72 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tokenizers" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b238e22d44a15349529690fb07bd645cf58149a1b1e44d6cb5bd1641ff1a6223" +dependencies = [ + "ahash 0.8.12", + "aho-corasick", + "compact_str", + "dary_heap", + "derive_builder", + "esaxx-rs", + "getrandom 0.3.4", + "itertools", + "log", + "macro_rules_attribute", + "monostate", + "onig", + "paste", + "rand 0.9.2", + "rayon", + "rayon-cond", + "regex", + "regex-syntax", + "serde", + "serde_json", + "spm_precompiled", + "thiserror 2.0.17", + "unicode-normalization-alignments", + "unicode-segmentation", + "unicode_categories", +] + +[[package]] +name = "tokenizers" +version = "0.22.3-dev.0" +source = "git+https://github.com/huggingface/tokenizers?branch=main#c4e27cfc84d7534702a8c5a7eb2677ebb2ab48a5" +dependencies = [ + "ahash 0.8.12", + "aho-corasick", + "compact_str", + "dary_heap", + "derive_builder", + "esaxx-rs", + "getrandom 0.3.4", + "indicatif 0.18.4", + "itertools", + "log", + "macro_rules_attribute", + "monostate", + "onig", + "paste", + "rand 0.9.2", + "rayon", + "rayon-cond", + "regex", + "regex-syntax", + "serde", + "serde_json", + "spm_precompiled", + "thiserror 2.0.17", + "unicode-normalization-alignments", + "unicode-segmentation", + "unicode_categories", +] + [[package]] name = "tokio" version = "1.48.0" @@ -4727,6 +6294,7 @@ dependencies = [ "bytes", "libc", "mio", + "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", @@ -4746,6 +6314,26 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.17" @@ -4876,7 +6464,7 @@ version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "bytes", "futures-util", "http", @@ -4911,6 +6499,18 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-appender" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786d480bce6247ab75f005b14ae1624ad978d3029d9113f0a22fa1ac773faeaf" +dependencies = [ + "crossbeam-channel", + "thiserror 2.0.17", + "time", + "tracing-subscriber", +] + [[package]] name = "tracing-attributes" version = "0.1.31" @@ -4929,6 +6529,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +dependencies = [ + "nu-ansi-term", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", + "tracing-serde", ] [[package]] @@ -4960,7 +6599,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8765b90061cba6c22b5831f675da109ae5561588290f9fa2317adab2714d5a6" dependencies = [ "memchr", - "nom", + "nom 8.0.0", "petgraph", ] @@ -4970,6 +6609,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + [[package]] name = "typeid" version = "1.0.3" @@ -4993,6 +6638,41 @@ dependencies = [ "winapi", ] +[[package]] +name = "ug" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76b761acf8af3494640d826a8609e2265e19778fb43306c7f15379c78c9b05b0" +dependencies = [ + "gemm 0.18.2", + "half", + "libloading 0.8.9", + "memmap2", + "num", + "num-traits", + "num_cpus", + "rayon", + "safetensors 0.4.5", + "serde", + "thiserror 1.0.69", + "tracing", + "yoke 0.7.5", +] + +[[package]] +name = "ug-metal" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7adf545a99a086d362efc739e7cf4317c18cbeda22706000fd434d70ea3d95" +dependencies = [ + "half", + "metal", + "objc", + "serde", + "thiserror 1.0.69", + "ug", +] + [[package]] name = "unic-char-property" version = "0.9.0" @@ -5040,12 +6720,65 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +[[package]] +name = "unicode-normalization-alignments" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f613e4fa046e69818dd287fdc4bc78175ff20331479dab6e1b0f98d57062de" +dependencies = [ + "smallvec", +] + [[package]] name = "unicode-segmentation" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + +[[package]] +name = "unit-prefix" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ureq" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" +dependencies = [ + "base64 0.22.1", + "flate2", + "log", + "native-tls", + "once_cell", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "socks", + "url", + "webpki-roots 0.26.11", +] + [[package]] name = "url" version = "2.5.7" @@ -5106,12 +6839,24 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + [[package]] name = "value-bag" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version-compare" version = "0.2.1" @@ -5275,7 +7020,7 @@ version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "rustix", "wayland-backend", "wayland-scanner", @@ -5287,7 +7032,7 @@ version = "0.32.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -5299,7 +7044,7 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -5338,6 +7083,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "webkit2gtk" version = "2.0.1" @@ -5382,6 +7137,24 @@ dependencies = [ "system-deps", ] +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.6", +] + +[[package]] +name = "webpki-roots" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webview2-com" version = "0.38.0" @@ -5573,6 +7346,17 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + [[package]] name = "windows-result" version = "0.3.4" @@ -5618,6 +7402,15 @@ dependencies = [ "windows-targets 0.42.2", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.59.0" @@ -5999,6 +7792,18 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive 0.7.5", + "zerofrom", +] + [[package]] name = "yoke" version = "0.8.1" @@ -6006,10 +7811,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ "stable_deref_trait", - "yoke-derive", + "yoke-derive 0.8.1", "zerofrom", ] +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", + "synstructure", +] + [[package]] name = "yoke-derive" version = "0.8.1" @@ -6125,6 +7942,12 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + [[package]] name = "zerotrie" version = "0.2.3" @@ -6132,7 +7955,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", - "yoke", + "yoke 0.8.1", "zerofrom", ] @@ -6142,7 +7965,7 @@ version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ - "yoke", + "yoke 0.8.1", "zerofrom", "zerovec-derive", ] @@ -6158,6 +7981,18 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "zip" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42e33efc22a0650c311c2ef19115ce232583abbe80850bc8b66509ebef02de0" +dependencies = [ + "crc32fast", + "indexmap 2.12.1", + "memchr", + "typed-path", +] + [[package]] name = "zmij" version = "1.0.0" diff --git a/apps/app/src-tauri/Cargo.toml b/apps/app/src-tauri/Cargo.toml index f42549ef..112129f2 100644 --- a/apps/app/src-tauri/Cargo.toml +++ b/apps/app/src-tauri/Cargo.toml @@ -37,13 +37,18 @@ tauri-plugin-safe-area-insets-css = "0.2" tauri-plugin-clipboard-manager = "2" futures = "0.3" rayon = "1.8" +hf-hub = { version = "0.5.0", default-features = false, features = [ + "tokio", + "rustls-tls", +] } +tauri-plugin-llm = { git = "https://github.com/crabnebula-dev/tauri-plugin-llm" } [profile.dev] incremental = true # Compile your binary in smaller steps. [profile.release] codegen-units = 1 # Allows LLVM to perform better optimization. -lto = true # Enables link-time-optimizations. -opt-level = "s" # Prioritizes small binary size. Use `3` if you prefer speed. -panic = "abort" # Higher performance by disabling panic handlers. -strip = true # Ensures debug symbols are removed. +lto = true # Enables link-time-optimizations. +opt-level = "s" # Prioritizes small binary size. Use `3` if you prefer speed. +panic = "abort" # Higher performance by disabling panic handlers. +strip = true # Ensures debug symbols are removed. diff --git a/apps/app/src-tauri/capabilities/default.json b/apps/app/src-tauri/capabilities/default.json index b1a1efdd..040ba0a0 100644 --- a/apps/app/src-tauri/capabilities/default.json +++ b/apps/app/src-tauri/capabilities/default.json @@ -21,7 +21,7 @@ "safe-area-insets-css:default", "clipboard-manager:default", "clipboard-manager:allow-read-text", - "clipboard-manager:allow-write-text" + "clipboard-manager:allow-write-text", + "llm:default" ] } - diff --git a/apps/app/src-tauri/src/lib.rs b/apps/app/src-tauri/src/lib.rs index 22c8d563..c489280a 100644 --- a/apps/app/src-tauri/src/lib.rs +++ b/apps/app/src-tauri/src/lib.rs @@ -1,541 +1,8 @@ -use serde::{Deserialize, Serialize}; +mod tasks; #[cfg(all(test, not(target_os = "android")))] mod desktop_test; -#[derive(Serialize, Deserialize, Clone)] -pub struct FileNode { - pub name: String, - pub path: String, - pub is_directory: bool, - pub children: Vec, -} - -fn sort_nodes(nodes: &mut Vec) { - nodes.sort_by(|a, b| { - if a.is_directory != b.is_directory { - return if a.is_directory { - std::cmp::Ordering::Less - } else { - std::cmp::Ordering::Greater - }; - } - // Use natural ordering with case-insensitive comparison - // to match TypeScript's localeCompare with numeric: true - natord::compare_ignore_case(&a.name, &b.name) - }); - - for node in nodes { - if !node.children.is_empty() { - sort_nodes(&mut node.children); - } - } -} - -#[cfg(not(target_os = "android"))] -fn build_tree_recursive_desktop(path_str: &str) -> std::io::Result> { - use rayon::prelude::*; - use std::fs; - - // Collect entries first to handle errors and prepare for parallel iteration - let entries = fs::read_dir(path_str)? - .collect::, std::io::Error>>()?; - - let nodes = entries - .into_par_iter() - .filter_map(|entry| { - if let Ok(metadata) = entry.metadata() { - let file_name = entry.file_name().to_string_lossy().to_string(); - - let is_directory = metadata.is_dir(); - let starts_with_dot = file_name.starts_with('.'); - let ends_with_md = file_name.ends_with(".md"); - - if (is_directory && !starts_with_dot) || ends_with_md { - let path = entry.path().to_string_lossy().to_string(); - let mut children = Vec::new(); - - if is_directory { - match build_tree_recursive_desktop(&path) { - Ok(sub_children) => { - children = sub_children; - } - Err(e) => { - eprintln!("Failed to read subdirectory '{}': {}", path, e); - } - } - } - - Some(FileNode { - name: file_name.trim_end_matches(".md").to_string(), - path, - is_directory, - children, - }) - } else { - None - } - } else { - None - } - }) - .collect(); - - Ok(nodes) -} - -#[cfg(target_os = "android")] -fn build_tree_recursive_android( - app: tauri::AppHandle, - path: String, - document_top_tree_uri: Option, -) -> std::pin::Pin, String>> + Send>> { - Box::pin(async move { - use tauri_plugin_android_fs::AndroidFsExt; - use tauri_plugin_android_fs::FileUri; - - let json_obj = serde_json::json!({ - "uri": path, - "documentTopTreeUri": document_top_tree_uri - }); - let file_uri_str = json_obj.to_string(); - - let app_clone = app.clone(); - - let entries = tauri::async_runtime::spawn_blocking(move || { - let api = app_clone.android_fs(); - let file_uri = FileUri::from_json_str(&file_uri_str) - .map_err(|e| format!("Failed to create FileUri: {}", e))?; - api.read_dir(&file_uri).map_err(|e| e.to_string()) - }) - .await - .map_err(|e| format!("Task join failed: {}", e))??; - - let mut child_handles = Vec::new(); - let mut files = Vec::new(); - - for entry in entries { - let name = entry.name().to_string(); - let is_directory = entry.is_dir(); - - let starts_with_dot = name.starts_with('.'); - let ends_with_md = name.ends_with(".md"); - - if (is_directory && !starts_with_dot) || ends_with_md { - let path_uri = format!("{}%2F{}", path, urlencoding::encode(&name)); - - if is_directory { - let app_clone = app.clone(); - let path_uri_clone = path_uri.clone(); - let doc_uri_clone = document_top_tree_uri.clone(); - let name_clone = name.clone(); - - child_handles.push(tauri::async_runtime::spawn(async move { - let children = build_tree_recursive_android( - app_clone, - path_uri_clone.clone(), - doc_uri_clone, - ) - .await?; - Ok::(FileNode { - name: name_clone.trim_end_matches(".md").to_string(), - path: path_uri_clone, - is_directory: true, - children, - }) - })); - } else { - files.push(FileNode { - name: name.trim_end_matches(".md").to_string(), - path: path_uri, - is_directory: false, - children: Vec::new(), - }); - } - } - } - - let mut nodes = files; - let results = futures::future::join_all(child_handles).await; - - for res in results { - match res { - Ok(inner_res) => match inner_res { - Ok(node) => nodes.push(node), - Err(e) => return Err(e), - }, - Err(e) => return Err(format!("Task failed: {}", e)), - } - } - - Ok(nodes) - }) -} - -#[tauri::command] -#[allow(unused_variables)] -async fn build_file_tree( - app: tauri::AppHandle, - path: String, - document_top_tree_uri: Option, -) -> Result, String> { - let nodes; - - #[cfg(target_os = "android")] - { - // On Android, we need the app handle and args. - // We can use them directly. - // (Parameter names no longer start with _.) - let mut unsorted_nodes = - build_tree_recursive_android(app, path, document_top_tree_uri).await?; - sort_nodes(&mut unsorted_nodes); - nodes = unsorted_nodes; - } - - #[cfg(not(target_os = "android"))] - { - nodes = tauri::async_runtime::spawn_blocking(move || { - let mut n = build_tree_recursive_desktop(&path)?; - sort_nodes(&mut n); - Ok(n) - }) - .await - .map_err(|e| e.to_string())? - .map_err(|e: std::io::Error| e.to_string())?; - } - - Ok(nodes) -} - -#[cfg(target_os = "android")] -async fn rename_file_android_impl( - app: tauri::AppHandle, - uri: String, - new_name: String, - document_top_tree_uri: Option, -) -> Result { - use tauri_plugin_android_fs::AndroidFsExt; - use tauri_plugin_android_fs::FileUri; - - let app_clone = app.clone(); - - // 1. Derive parent URI for return value - let parent_uri = match uri.rsplit_once("%2F") { - Some((parent, _)) => parent.to_string(), - None => { - return Err("Could not determine parent URI from path".to_string()); - } - }; - - let new_name_clone = new_name.clone(); - tauri::async_runtime::spawn_blocking(move || { - let api = app_clone.android_fs(); - let source_json = serde_json::json!({ - "uri": uri, - "documentTopTreeUri": document_top_tree_uri - }); - let source_file_uri = FileUri::from_json_str(&source_json.to_string()) - .map_err(|e| format!("Failed to create Source FileUri: {}", e))?; - - api.rename(&source_file_uri, &new_name_clone) - .map_err(|e| format!("Failed to rename file: {}", e))?; - - Ok::<(), String>(()) - }).await.map_err(|e| e.to_string())??; - - let new_constructed_path = format!("{}%2F{}", parent_uri, urlencoding::encode(&new_name)); - Ok(new_constructed_path) -} - -#[cfg(target_os = "android")] -async fn move_file_android_impl( - app: tauri::AppHandle, - uri: String, - new_parent_uri: String, - document_top_tree_uri: Option, -) -> Result { - use tauri_plugin_android_fs::AndroidFsExt; - use tauri_plugin_android_fs::FileUri; - - let api = app.android_fs(); - - // 1. Derive filename from source URI - let name_encoded = match uri.rsplit_once("%2F") { - Some((_, name)) => name, - None => return Err("Could not extract filename from URI".to_string()), - }; - let name = urlencoding::decode(name_encoded) - .map_err(|e| format!("Failed to decode filename: {}", e))? - .to_string(); - - let source_json = serde_json::json!({ - "uri": uri, - "documentTopTreeUri": document_top_tree_uri - }); - let source_file_uri = FileUri::from_json_str(&source_json.to_string()) - .map_err(|e| format!("Failed to create Source FileUri: {}", e))?; - - // 2. Read content - let content = api - .read(&source_file_uri) - .map_err(|e| format!("Failed to read source file: {}", e))?; - - // 3. Create new file in new parent - let parent_json = serde_json::json!({ - "uri": new_parent_uri, - "documentTopTreeUri": document_top_tree_uri - }); - let parent_file_uri = FileUri::from_json_str(&parent_json.to_string()) - .map_err(|e| format!("Failed to create Parent FileUri: {}", e))?; - - let mime_type = if name.ends_with(".md") { - "text/markdown" - } else { - "application/octet-stream" - }; - - let new_file_uri = api - .create_new_file(&parent_file_uri, &name, Some(mime_type)) - .map_err(|e| format!("Failed to create new file: {}", e))?; - - // 4. Write content - api.write(&new_file_uri, &content) - .map_err(|e| format!("Failed to write to new file: {}", e))?; - - // 5. Delete old - api.remove_file(&source_file_uri) - .map_err(|e| format!("Failed to delete source file: {}", e))?; - - // Return constructed path - let new_constructed_path = format!("{}%2F{}", new_parent_uri, name_encoded); - Ok(new_constructed_path) -} - -#[cfg(target_os = "android")] -fn move_recursive_sync( - api: &tauri_plugin_android_fs::api::api_sync::AndroidFs, - source_uri: String, - target_parent_uri: String, - target_name: String, - document_top_tree_uri: Option, - is_directory: bool, -) -> Result { - use tauri_plugin_android_fs::FileUri; - - if !is_directory { - let source_json = serde_json::json!({ - "uri": source_uri, - "documentTopTreeUri": document_top_tree_uri - }); - let source_file_uri = FileUri::from_json_str(&source_json.to_string()) - .map_err(|e| format!("Failed to create Source FileUri: {}", e))?; - - let content = api.read(&source_file_uri) - .map_err(|e| format!("Failed to read source file: {}", e))?; - - let parent_json = serde_json::json!({ - "uri": target_parent_uri, - "documentTopTreeUri": document_top_tree_uri - }); - let parent_file_uri = FileUri::from_json_str(&parent_json.to_string()) - .map_err(|e| format!("Failed to create Parent FileUri: {}", e))?; - - let mime_type = if target_name.ends_with(".md") { - "text/markdown" - } else { - "application/octet-stream" - }; - - let new_file_uri = api - .create_new_file(&parent_file_uri, &target_name, Some(mime_type)) - .map_err(|e| format!("Failed to create new file: {}", e))?; - - api.write(&new_file_uri, &content) - .map_err(|e| format!("Failed to write to new file: {}", e))?; - - api.remove_file(&source_file_uri) - .map_err(|e| format!("Failed to delete source file: {}", e))?; - - let new_constructed_path = format!("{}%2F{}", target_parent_uri, urlencoding::encode(&target_name)); - Ok(new_constructed_path) - } else { - let parent_json = serde_json::json!({ - "uri": target_parent_uri, - "documentTopTreeUri": document_top_tree_uri - }); - let parent_file_uri = FileUri::from_json_str(&parent_json.to_string()) - .map_err(|e| format!("Failed to create Parent FileUri: {}", e))?; - - // create_dir_all is the available method for creating directories - let _ = api.create_dir_all(&parent_file_uri, &target_name) - .map_err(|e| format!("Failed to create new directory: {}", e))?; - - let new_dir_path_str = format!("{}%2F{}", target_parent_uri, urlencoding::encode(&target_name)); - - let source_json = serde_json::json!({ - "uri": source_uri, - "documentTopTreeUri": document_top_tree_uri - }); - let source_file_uri = FileUri::from_json_str(&source_json.to_string()) - .map_err(|e| format!("Failed to create Source FileUri: {}", e))?; - - let entries = api.read_dir(&source_file_uri) - .map_err(|e| format!("Failed to read source directory: {}", e))?; - - for entry in entries { - let child_name = entry.name().to_string(); - let child_is_dir = entry.is_dir(); - let child_source_uri = format!("{}%2F{}", source_uri, urlencoding::encode(&child_name)); - - move_recursive_sync( - api, - child_source_uri, - new_dir_path_str.clone(), - child_name, - document_top_tree_uri.clone(), - child_is_dir - )?; - } - - api.remove_dir(&source_file_uri) - .map_err(|e| format!("Failed to remove source directory: {}", e))?; - - Ok(new_dir_path_str) - } -} - -#[tauri::command] -async fn rename_directory_android( - app: tauri::AppHandle, - uri: String, - new_name: String, - document_top_tree_uri: Option, -) -> Result { - #[cfg(target_os = "android")] - { - use tauri_plugin_android_fs::AndroidFsExt; - use tauri_plugin_android_fs::FileUri; - - let app_clone = app.clone(); - // We need parent URI to construct the new path string at the end? - // Actually, if we rename, the ID usually stays the same in SAF, but the path string we use in the app (uri based) - // might depend on the name if we constructed it using name. - // In `build_tree_recursive_android`, we construct path as `parent_uri + encoded_name`. - // So yes, we need to return the new constructed path. - - let parent_uri = match uri.rsplit_once("%2F") { - Some((parent, _)) => parent.to_string(), - None => return Err("Could not determine parent URI".to_string()), - }; - - let new_name_clone = new_name.clone(); - tauri::async_runtime::spawn_blocking(move || { - let api = app_clone.android_fs(); - - let source_json = serde_json::json!({ - "uri": uri, - "documentTopTreeUri": document_top_tree_uri - }); - let source_file_uri = FileUri::from_json_str(&source_json.to_string()) - .map_err(|e| format!("Failed to create Source FileUri: {}", e))?; - - // Try native rename - // Note: The signature might be `rename(&self, file: &FileUri, new_name: &str)` - api.rename(&source_file_uri, &new_name_clone) - .map_err(|e| format!("Failed to rename directory: {}", e))?; - - Ok::<(), String>(()) - }).await.map_err(|e| e.to_string())??; - - // Construct new path - let new_constructed_path = format!("{}%2F{}", parent_uri, urlencoding::encode(&new_name)); - Ok(new_constructed_path) - } - #[cfg(not(target_os = "android"))] - { - Err("Not supported on this platform".to_string()) - } -} - -#[tauri::command] -async fn move_directory_android( - app: tauri::AppHandle, - uri: String, - new_parent_uri: String, - document_top_tree_uri: Option, -) -> Result { - #[cfg(target_os = "android")] - { - use tauri_plugin_android_fs::AndroidFsExt; - let app_clone = app.clone(); - - // Extract name from uri - let name_encoded = match uri.rsplit_once("%2F") { - Some((_, name)) => name, - None => return Err("Could not extract name from URI".to_string()), - }; - let name = urlencoding::decode(name_encoded) - .map_err(|e| format!("Failed to decode filename: {}", e))? - .to_string(); - - tauri::async_runtime::spawn_blocking(move || { - let api = app_clone.android_fs(); - move_recursive_sync( - &api, - uri, - new_parent_uri, - name, - document_top_tree_uri, - true // is_directory - ) - }).await.map_err(|e| e.to_string())? - } - #[cfg(not(target_os = "android"))] - { - Err("Not supported on this platform".to_string()) - } -} - -// Updating rename_file_android to just use the new sync helper if we wanted, but existing impl is fine for files. -// However, the user asked to "fix move_node for directories". -// So I will update `move_file_android` (or just leave it and use `move_directory_android` in frontend). -// The user said "implement a rename_directory_android Rust command". -// I will stick to adding the new commands. - -#[tauri::command] -async fn rename_file_android( - app: tauri::AppHandle, - uri: String, - new_name: String, - document_top_tree_uri: Option, -) -> Result { - #[cfg(target_os = "android")] - { - rename_file_android_impl(app, uri, new_name, document_top_tree_uri).await - } - #[cfg(not(target_os = "android"))] - { - Err("Not supported on this platform".to_string()) - } -} - -#[tauri::command] -async fn move_file_android( - app: tauri::AppHandle, - uri: String, - new_parent_uri: String, - document_top_tree_uri: Option, -) -> Result { - #[cfg(target_os = "android")] - { - move_file_android_impl(app, uri, new_parent_uri, document_top_tree_uri).await - } - #[cfg(not(target_os = "android"))] - { - Err("Not supported on this platform".to_string()) - } -} - #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { tauri::Builder::default() @@ -547,12 +14,18 @@ pub fn run() { .plugin(tauri_plugin_fs::init()) .plugin(tauri_plugin_android_fs::init()) .plugin(tauri_plugin_safe_area_insets_css::init()) + .plugin(tauri_plugin_llm::init()) .invoke_handler(tauri::generate_handler![ - build_file_tree, - rename_file_android, - move_file_android, - rename_directory_android, - move_directory_android + tasks::file_system_stuff::build_file_tree, + tasks::lm_management::download_and_load_model, + #[cfg(target_os = "android")] + tasks::file_system_stuff::android::rename_file_android, + #[cfg(target_os = "android")] + tasks::file_system_stuff::android::move_file_android, + #[cfg(target_os = "android")] + tasks::file_system_stuff::android::rename_directory_android, + #[cfg(target_os = "android")] + tasks::file_system_stuff::android::move_directory_android ]) .setup(|app| { if cfg!(debug_assertions) { diff --git a/apps/app/src-tauri/src/tasks/file_system_stuff/android.rs b/apps/app/src-tauri/src/tasks/file_system_stuff/android.rs new file mode 100644 index 00000000..ae04b894 --- /dev/null +++ b/apps/app/src-tauri/src/tasks/file_system_stuff/android.rs @@ -0,0 +1,431 @@ +use super::FileNode; + +pub fn build_tree_recursive_android( + app: tauri::AppHandle, + path: String, + document_top_tree_uri: Option, +) -> std::pin::Pin, String>> + Send>> { + Box::pin(async move { + use tauri_plugin_android_fs::AndroidFsExt; + use tauri_plugin_android_fs::FileUri; + + let json_obj = serde_json::json!({ + "uri": path, + "documentTopTreeUri": document_top_tree_uri + }); + let file_uri_str = json_obj.to_string(); + + let app_clone = app.clone(); + + let entries = tauri::async_runtime::spawn_blocking(move || { + let api = app_clone.android_fs(); + let file_uri = FileUri::from_json_str(&file_uri_str) + .map_err(|e| format!("Failed to create FileUri: {}", e))?; + api.read_dir(&file_uri).map_err(|e| e.to_string()) + }) + .await + .map_err(|e| format!("Task join failed: {}", e))??; + + let mut child_handles = Vec::new(); + let mut files = Vec::new(); + + for entry in entries { + let name = entry.name().to_string(); + let is_directory = entry.is_dir(); + + let starts_with_dot = name.starts_with('.'); + let ends_with_md = name.ends_with(".md"); + + if (is_directory && !starts_with_dot) || ends_with_md { + let path_uri = format!("{}%2F{}", path, urlencoding::encode(&name)); + + if is_directory { + let app_clone = app.clone(); + let path_uri_clone = path_uri.clone(); + let doc_uri_clone = document_top_tree_uri.clone(); + let name_clone = name.clone(); + + child_handles.push(tauri::async_runtime::spawn(async move { + let children = build_tree_recursive_android( + app_clone, + path_uri_clone.clone(), + doc_uri_clone, + ) + .await?; + Ok::(FileNode { + name: name_clone.trim_end_matches(".md").to_string(), + path: path_uri_clone, + is_directory: true, + children, + }) + })); + } else { + files.push(FileNode { + name: name.trim_end_matches(".md").to_string(), + path: path_uri, + is_directory: false, + children: Vec::new(), + }); + } + } + } + + let mut nodes = files; + let results = futures::future::join_all(child_handles).await; + + for res in results { + match res { + Ok(inner_res) => match inner_res { + Ok(node) => nodes.push(node), + Err(e) => return Err(e), + }, + Err(e) => return Err(format!("Task failed: {}", e)), + } + } + + Ok(nodes) + }) +} + +async fn rename_file_android_impl( + app: tauri::AppHandle, + uri: String, + new_name: String, + document_top_tree_uri: Option, +) -> Result { + use tauri_plugin_android_fs::AndroidFsExt; + use tauri_plugin_android_fs::FileUri; + + let app_clone = app.clone(); + + // 1. Derive parent URI for return value + let parent_uri = match uri.rsplit_once("%2F") { + Some((parent, _)) => parent.to_string(), + None => { + return Err("Could not determine parent URI from path".to_string()); + } + }; + + let new_name_clone = new_name.clone(); + tauri::async_runtime::spawn_blocking(move || { + let api = app_clone.android_fs(); + let source_json = serde_json::json!({ + "uri": uri, + "documentTopTreeUri": document_top_tree_uri + }); + let source_file_uri = FileUri::from_json_str(&source_json.to_string()) + .map_err(|e| format!("Failed to create Source FileUri: {}", e))?; + + api.rename(&source_file_uri, &new_name_clone) + .map_err(|e| format!("Failed to rename file: {}", e))?; + + Ok::<(), String>(()) + }) + .await + .map_err(|e| e.to_string())??; + + let new_constructed_path = format!("{}%2F{}", parent_uri, urlencoding::encode(&new_name)); + Ok(new_constructed_path) +} + +async fn move_file_android_impl( + app: tauri::AppHandle, + uri: String, + new_parent_uri: String, + document_top_tree_uri: Option, +) -> Result { + use tauri_plugin_android_fs::AndroidFsExt; + use tauri_plugin_android_fs::FileUri; + + let api = app.android_fs(); + + // 1. Derive filename from source URI + let name_encoded = match uri.rsplit_once("%2F") { + Some((_, name)) => name, + None => return Err("Could not extract filename from URI".to_string()), + }; + let name = urlencoding::decode(name_encoded) + .map_err(|e| format!("Failed to decode filename: {}", e))? + .to_string(); + + let source_json = serde_json::json!({ + "uri": uri, + "documentTopTreeUri": document_top_tree_uri + }); + let source_file_uri = FileUri::from_json_str(&source_json.to_string()) + .map_err(|e| format!("Failed to create Source FileUri: {}", e))?; + + // 2. Read content + let content = api + .read(&source_file_uri) + .map_err(|e| format!("Failed to read source file: {}", e))?; + + // 3. Create new file in new parent + let parent_json = serde_json::json!({ + "uri": new_parent_uri, + "documentTopTreeUri": document_top_tree_uri + }); + let parent_file_uri = FileUri::from_json_str(&parent_json.to_string()) + .map_err(|e| format!("Failed to create Parent FileUri: {}", e))?; + + let mime_type = if name.ends_with(".md") { + "text/markdown" + } else { + "application/octet-stream" + }; + + let new_file_uri = api + .create_new_file(&parent_file_uri, &name, Some(mime_type)) + .map_err(|e| format!("Failed to create new file: {}", e))?; + + // 4. Write content + api.write(&new_file_uri, &content) + .map_err(|e| format!("Failed to write to new file: {}", e))?; + + // 5. Delete old + api.remove_file(&source_file_uri) + .map_err(|e| format!("Failed to delete source file: {}", e))?; + + // Return constructed path + let new_constructed_path = format!("{}%2F{}", new_parent_uri, name_encoded); + Ok(new_constructed_path) +} + +fn move_recursive_sync( + api: &tauri_plugin_android_fs::api::api_sync::AndroidFs, + source_uri: String, + target_parent_uri: String, + target_name: String, + document_top_tree_uri: Option, + is_directory: bool, +) -> Result { + use tauri_plugin_android_fs::FileUri; + + if !is_directory { + let source_json = serde_json::json!({ + "uri": source_uri, + "documentTopTreeUri": document_top_tree_uri + }); + let source_file_uri = FileUri::from_json_str(&source_json.to_string()) + .map_err(|e| format!("Failed to create Source FileUri: {}", e))?; + + let content = api + .read(&source_file_uri) + .map_err(|e| format!("Failed to read source file: {}", e))?; + + let parent_json = serde_json::json!({ + "uri": target_parent_uri, + "documentTopTreeUri": document_top_tree_uri + }); + let parent_file_uri = FileUri::from_json_str(&parent_json.to_string()) + .map_err(|e| format!("Failed to create Parent FileUri: {}", e))?; + + let mime_type = if target_name.ends_with(".md") { + "text/markdown" + } else { + "application/octet-stream" + }; + + let new_file_uri = api + .create_new_file(&parent_file_uri, &target_name, Some(mime_type)) + .map_err(|e| format!("Failed to create new file: {}", e))?; + + api.write(&new_file_uri, &content) + .map_err(|e| format!("Failed to write to new file: {}", e))?; + + api.remove_file(&source_file_uri) + .map_err(|e| format!("Failed to delete source file: {}", e))?; + + let new_constructed_path = format!( + "{}%2F{}", + target_parent_uri, + urlencoding::encode(&target_name) + ); + Ok(new_constructed_path) + } else { + let parent_json = serde_json::json!({ + "uri": target_parent_uri, + "documentTopTreeUri": document_top_tree_uri + }); + let parent_file_uri = FileUri::from_json_str(&parent_json.to_string()) + .map_err(|e| format!("Failed to create Parent FileUri: {}", e))?; + + // create_dir_all is the available method for creating directories + let _ = api + .create_dir_all(&parent_file_uri, &target_name) + .map_err(|e| format!("Failed to create new directory: {}", e))?; + + let new_dir_path_str = format!( + "{}%2F{}", + target_parent_uri, + urlencoding::encode(&target_name) + ); + + let source_json = serde_json::json!({ + "uri": source_uri, + "documentTopTreeUri": document_top_tree_uri + }); + let source_file_uri = FileUri::from_json_str(&source_json.to_string()) + .map_err(|e| format!("Failed to create Source FileUri: {}", e))?; + + let entries = api + .read_dir(&source_file_uri) + .map_err(|e| format!("Failed to read source directory: {}", e))?; + + for entry in entries { + let child_name = entry.name().to_string(); + let child_is_dir = entry.is_dir(); + let child_source_uri = format!("{}%2F{}", source_uri, urlencoding::encode(&child_name)); + + move_recursive_sync( + api, + child_source_uri, + new_dir_path_str.clone(), + child_name, + document_top_tree_uri.clone(), + child_is_dir, + )?; + } + + api.remove_dir(&source_file_uri) + .map_err(|e| format!("Failed to remove source directory: {}", e))?; + + Ok(new_dir_path_str) + } +} + +#[tauri::command] +pub async fn rename_directory_android( + app: tauri::AppHandle, + uri: String, + new_name: String, + document_top_tree_uri: Option, +) -> Result { + #[cfg(target_os = "android")] + { + use tauri_plugin_android_fs::AndroidFsExt; + use tauri_plugin_android_fs::FileUri; + + let app_clone = app.clone(); + // We need parent URI to construct the new path string at the end? + // Actually, if we rename, the ID usually stays the same in SAF, but the path string we use in the app (uri based) + // might depend on the name if we constructed it using name. + // In `build_tree_recursive_android`, we construct path as `parent_uri + encoded_name`. + // So yes, we need to return the new constructed path. + + let parent_uri = match uri.rsplit_once("%2F") { + Some((parent, _)) => parent.to_string(), + None => return Err("Could not determine parent URI".to_string()), + }; + + let new_name_clone = new_name.clone(); + tauri::async_runtime::spawn_blocking(move || { + let api = app_clone.android_fs(); + + let source_json = serde_json::json!({ + "uri": uri, + "documentTopTreeUri": document_top_tree_uri + }); + let source_file_uri = FileUri::from_json_str(&source_json.to_string()) + .map_err(|e| format!("Failed to create Source FileUri: {}", e))?; + + // Try native rename + // Note: The signature might be `rename(&self, file: &FileUri, new_name: &str)` + api.rename(&source_file_uri, &new_name_clone) + .map_err(|e| format!("Failed to rename directory: {}", e))?; + + Ok::<(), String>(()) + }) + .await + .map_err(|e| e.to_string())??; + + // Construct new path + let new_constructed_path = format!("{}%2F{}", parent_uri, urlencoding::encode(&new_name)); + Ok(new_constructed_path) + } + #[cfg(not(target_os = "android"))] + { + Err("Not supported on this platform".to_string()) + } +} + +#[tauri::command] +pub async fn move_directory_android( + app: tauri::AppHandle, + uri: String, + new_parent_uri: String, + document_top_tree_uri: Option, +) -> Result { + #[cfg(target_os = "android")] + { + use tauri_plugin_android_fs::AndroidFsExt; + let app_clone = app.clone(); + + // Extract name from uri + let name_encoded = match uri.rsplit_once("%2F") { + Some((_, name)) => name, + None => return Err("Could not extract name from URI".to_string()), + }; + let name = urlencoding::decode(name_encoded) + .map_err(|e| format!("Failed to decode filename: {}", e))? + .to_string(); + + tauri::async_runtime::spawn_blocking(move || { + let api = app_clone.android_fs(); + move_recursive_sync( + &api, + uri, + new_parent_uri, + name, + document_top_tree_uri, + true, // is_directory + ) + }) + .await + .map_err(|e| e.to_string())? + } + #[cfg(not(target_os = "android"))] + { + Err("Not supported on this platform".to_string()) + } +} + +// Updating rename_file_android to just use the new sync helper if we wanted, but existing impl is fine for files. +// However, the user asked to "fix move_node for directories". +// So I will update `move_file_android` (or just leave it and use `move_directory_android` in frontend). +// The user said "implement a rename_directory_android Rust command". +// I will stick to adding the new commands. + +#[tauri::command] +pub async fn rename_file_android( + app: tauri::AppHandle, + uri: String, + new_name: String, + document_top_tree_uri: Option, +) -> Result { + #[cfg(target_os = "android")] + { + rename_file_android_impl(app, uri, new_name, document_top_tree_uri).await + } + #[cfg(not(target_os = "android"))] + { + Err("Not supported on this platform".to_string()) + } +} + +#[tauri::command] +pub async fn move_file_android( + app: tauri::AppHandle, + uri: String, + new_parent_uri: String, + document_top_tree_uri: Option, +) -> Result { + #[cfg(target_os = "android")] + { + move_file_android_impl(app, uri, new_parent_uri, document_top_tree_uri).await + } + #[cfg(not(target_os = "android"))] + { + Err("Not supported on this platform".to_string()) + } +} diff --git a/apps/app/src-tauri/src/tasks/file_system_stuff/mod.rs b/apps/app/src-tauri/src/tasks/file_system_stuff/mod.rs new file mode 100644 index 00000000..14fddd09 --- /dev/null +++ b/apps/app/src-tauri/src/tasks/file_system_stuff/mod.rs @@ -0,0 +1,119 @@ +use serde::{Deserialize, Serialize}; + +#[cfg(target_os = "android")] +pub mod android; + +#[derive(Serialize, Deserialize, Clone)] +pub struct FileNode { + pub name: String, + pub path: String, + pub is_directory: bool, + pub children: Vec, +} + +pub fn sort_nodes(nodes: &mut Vec) { + nodes.sort_by(|a, b| { + if a.is_directory != b.is_directory { + return if a.is_directory { + std::cmp::Ordering::Less + } else { + std::cmp::Ordering::Greater + }; + } + // Use natural ordering with case-insensitive comparison + // to match TypeScript's localeCompare with numeric: true + natord::compare_ignore_case(&a.name, &b.name) + }); + + for node in nodes { + if !node.children.is_empty() { + sort_nodes(&mut node.children); + } + } +} + +#[cfg(not(target_os = "android"))] +pub fn build_tree_recursive_desktop(path_str: &str) -> std::io::Result> { + use rayon::prelude::*; + use std::fs; + + // Collect entries first to handle errors and prepare for parallel iteration + let entries = fs::read_dir(path_str)?.collect::, std::io::Error>>()?; + + let nodes = entries + .into_par_iter() + .filter_map(|entry| { + if let Ok(metadata) = entry.metadata() { + let file_name = entry.file_name().to_string_lossy().to_string(); + + let is_directory = metadata.is_dir(); + let starts_with_dot = file_name.starts_with('.'); + let ends_with_md = file_name.ends_with(".md"); + + if (is_directory && !starts_with_dot) || ends_with_md { + let path = entry.path().to_string_lossy().to_string(); + let mut children = Vec::new(); + + if is_directory { + match build_tree_recursive_desktop(&path) { + Ok(sub_children) => { + children = sub_children; + } + Err(e) => { + eprintln!("Failed to read subdirectory '{}': {}", path, e); + } + } + } + + Some(FileNode { + name: file_name.trim_end_matches(".md").to_string(), + path, + is_directory, + children, + }) + } else { + None + } + } else { + None + } + }) + .collect(); + + Ok(nodes) +} + +#[tauri::command] +#[allow(unused_variables)] +pub async fn build_file_tree( + app: tauri::AppHandle, + path: String, + document_top_tree_uri: Option, +) -> Result, String> { + let nodes; + + #[cfg(target_os = "android")] + { + // On Android, we need the app handle and args. + // We can use them directly. + // (Parameter names no longer start with _.) + let mut unsorted_nodes = + android::build_tree_recursive_android(app, path, document_top_tree_uri).await?; + sort_nodes(&mut unsorted_nodes); + nodes = unsorted_nodes; + } + + #[cfg(not(target_os = "android"))] + { + nodes = tauri::async_runtime::spawn_blocking(move || { + let mut n = build_tree_recursive_desktop(&path)?; + sort_nodes(&mut n); + Ok(n) + }) + .await + .map_err(|e| e.to_string())? + .map_err(|e: std::io::Error| e.to_string())?; + } + + Ok(nodes) +} diff --git a/apps/app/src-tauri/src/tasks/lm_management/mod.rs b/apps/app/src-tauri/src/tasks/lm_management/mod.rs new file mode 100644 index 00000000..34b8976f --- /dev/null +++ b/apps/app/src-tauri/src/tasks/lm_management/mod.rs @@ -0,0 +1,22 @@ +use hf_hub::api::tokio::Api; +use tauri_plugin_llm::LLMRuntimeConfig; + +#[tauri::command] +pub async fn download_and_load_model(model_repo: String) -> Result { + let api = Api::new().map_err(|e| e.to_string())?; + let repo = api.model(model_repo.clone()); + let info = repo.info().await.map_err(|e| e.to_string())?; + + for sibling in info.siblings { + let file_name = sibling.rfilename; + if file_name.ends_with(".json") || file_name.ends_with(".safetensors") { + println!("Downloading {}...", &file_name); + repo.get(&file_name).await.map_err(|e| e.to_string())?; + } + } + + let config = LLMRuntimeConfig::from_hf_local_cache(model_repo, None::<&str>) + .map_err(|e| e.to_string())?; + + serde_json::to_string(&config).map_err(|e| e.to_string()) +} diff --git a/apps/app/src-tauri/src/tasks/mod.rs b/apps/app/src-tauri/src/tasks/mod.rs new file mode 100644 index 00000000..0e28c6f7 --- /dev/null +++ b/apps/app/src-tauri/src/tasks/mod.rs @@ -0,0 +1,2 @@ +pub mod file_system_stuff; +pub mod lm_management; diff --git a/apps/app/src-tauri/tauri.conf.json b/apps/app/src-tauri/tauri.conf.json index 35f8c816..02786870 100644 --- a/apps/app/src-tauri/tauri.conf.json +++ b/apps/app/src-tauri/tauri.conf.json @@ -35,5 +35,14 @@ "icons/icon.icns", "icons/icon.ico" ] + }, + "plugins": { + "llm": { + "llmconfig": { + "name": "", + "tokenizer_file": "", + "model_file": "" + } + } } } diff --git a/apps/app/src/App.svelte b/apps/app/src/App.svelte index fd686a94..4daa2760 100644 --- a/apps/app/src/App.svelte +++ b/apps/app/src/App.svelte @@ -1,9 +1,10 @@ + +
+

+ Language Model +

+
    +
  • +
  • +
+
diff --git a/apps/app/src/components/general/app_settings/editor/lm_config/cloud/index.svelte b/apps/app/src/components/general/app_settings/editor/lm_config/cloud/index.svelte new file mode 100644 index 00000000..8b7c3ed4 --- /dev/null +++ b/apps/app/src/components/general/app_settings/editor/lm_config/cloud/index.svelte @@ -0,0 +1,136 @@ + + +
+
+

Select Model Provider

+ (sel_provider = v)} + allowDeselect={true} + > + + {selected_provider_label || 'Select a Model Provider'} + + + + +
+
+ + {#each model_providers as model} + + + {#snippet children({ selected })} + +
+ {model.label}
+ {#if selected} +
+
+
+ {/if} + {/snippet} +
+ {/each} + +
+
+
+
+
+
+
+
+

+ Enter {selected_provider_label} + API Key +

+ + +
+
+
+

+ Enter {selected_provider_label} + Model name +

+ + click to see available models + + {#if models_list_dialog_open} + + {/if} +
+ + +
+ +
diff --git a/apps/app/src/components/general/app_settings/editor/lm_config/cloud/list_models.svelte b/apps/app/src/components/general/app_settings/editor/lm_config/cloud/list_models.svelte new file mode 100644 index 00000000..a4626a67 --- /dev/null +++ b/apps/app/src/components/general/app_settings/editor/lm_config/cloud/list_models.svelte @@ -0,0 +1,101 @@ + + + + + diff --git a/apps/app/src/components/general/app_settings/editor/lm_config/cloud/onclick.ts b/apps/app/src/components/general/app_settings/editor/lm_config/cloud/onclick.ts new file mode 100644 index 00000000..edc3070c --- /dev/null +++ b/apps/app/src/components/general/app_settings/editor/lm_config/cloud/onclick.ts @@ -0,0 +1,28 @@ +import { model } from '@/lib/features/nlp/states.svelte'; +import { createGoogleGenerativeAI } from '@ai-sdk/google'; +import { createOpenAI } from '@ai-sdk/openai'; +import { createAnthropic } from '@ai-sdk/anthropic'; + +export function apply_ai_config( + provider: string, + api_key: string, + model_id: string +) { + switch (provider) { + case 'google': + const google = createGoogleGenerativeAI({ apiKey: api_key }); + model.data = google(model_id); + break; + case 'openai': + const openai = createOpenAI({ apiKey: api_key }); + model.data = openai(model_id); + break; + case 'anthropic': + const anthropic = createAnthropic({ apiKey: api_key }); + model.data = anthropic(model_id); + break; + + default: + break; + } +} diff --git a/apps/app/src/components/general/app_settings/editor/lm_config/index.svelte b/apps/app/src/components/general/app_settings/editor/lm_config/index.svelte new file mode 100644 index 00000000..46dc3f31 --- /dev/null +++ b/apps/app/src/components/general/app_settings/editor/lm_config/index.svelte @@ -0,0 +1,28 @@ + + +
+ +
+ +
+ + +
+ +
+
diff --git a/apps/app/src/components/general/app_settings/editor/lm_config/local/index.svelte b/apps/app/src/components/general/app_settings/editor/lm_config/local/index.svelte new file mode 100644 index 00000000..b2b84489 --- /dev/null +++ b/apps/app/src/components/general/app_settings/editor/lm_config/local/index.svelte @@ -0,0 +1,59 @@ + + + + + diff --git a/apps/app/src/components/general/app_settings/index.svelte b/apps/app/src/components/general/app_settings/index.svelte new file mode 100644 index 00000000..46113eb0 --- /dev/null +++ b/apps/app/src/components/general/app_settings/index.svelte @@ -0,0 +1,70 @@ + + +{#if app_settings_dialog_open_state.data} + + + +{/if} diff --git a/apps/app/src/components/general/app_settings/sidebar_items.ts b/apps/app/src/components/general/app_settings/sidebar_items.ts new file mode 100644 index 00000000..561c8838 --- /dev/null +++ b/apps/app/src/components/general/app_settings/sidebar_items.ts @@ -0,0 +1,20 @@ +// @unocss-include +export const sidebar_items: { + category_label: string; + items: { + id: string; + label: string; + icon: string; + }[]; +}[] = [ + { + category_label: 'options', + items: [ + { + id: 'editor', + label: 'Editor', + icon: 'i-tabler:pencil-cog', + }, + ], + }, +]; diff --git a/apps/app/src/components/general/app_settings/states.svelte.ts b/apps/app/src/components/general/app_settings/states.svelte.ts new file mode 100644 index 00000000..4f044976 --- /dev/null +++ b/apps/app/src/components/general/app_settings/states.svelte.ts @@ -0,0 +1,3 @@ +export const app_settings_dialog_open_state = $state<{ data: boolean }>({ + data: false, +}); diff --git a/apps/app/src/components/general/root_folder_selector/index.svelte b/apps/app/src/components/general/root_folder_selector/index.svelte deleted file mode 100644 index f84cfbfd..00000000 --- a/apps/app/src/components/general/root_folder_selector/index.svelte +++ /dev/null @@ -1,182 +0,0 @@ - - - - - diff --git a/apps/app/src/components/general/root_folder_selector/states.svelte.ts b/apps/app/src/components/general/root_folder_selector/states.svelte.ts deleted file mode 100644 index 8fc37223..00000000 --- a/apps/app/src/components/general/root_folder_selector/states.svelte.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const root_folder_picker_dialog_state: { open: boolean } = $state({ - open: false, -}); diff --git a/apps/app/src/components/general/workspace_selector/index.svelte b/apps/app/src/components/general/workspace_selector/index.svelte new file mode 100644 index 00000000..7ae9efe4 --- /dev/null +++ b/apps/app/src/components/general/workspace_selector/index.svelte @@ -0,0 +1,184 @@ + + +{#if workspace_picker_dialog_open_state.data} + + + +{/if} diff --git a/apps/app/src/components/general/root_folder_selector/operations.svelte.ts b/apps/app/src/components/general/workspace_selector/operations.svelte.ts similarity index 92% rename from apps/app/src/components/general/root_folder_selector/operations.svelte.ts rename to apps/app/src/components/general/workspace_selector/operations.svelte.ts index 6a93a22a..c12488cf 100644 --- a/apps/app/src/components/general/root_folder_selector/operations.svelte.ts +++ b/apps/app/src/components/general/workspace_selector/operations.svelte.ts @@ -7,7 +7,7 @@ import { opened_filenode, workspace_root_path, } from '@/lib/global_states/index.svelte'; -import { root_folder_picker_dialog_state } from '@/components/general/root_folder_selector/states.svelte'; +import { workspace_picker_dialog_open_state } from '@/components/general//workspace_selector/states.svelte'; import { type Workspace, type GenericPath } from '@/types'; import { LazyStore } from '@tauri-apps/plugin-store'; import { toast } from 'svelte-sonner'; @@ -27,7 +27,7 @@ export async function update_workspace( ) { try { // Prerequisites - root_folder_picker_dialog_state.open = false; + workspace_picker_dialog_open_state.data = false; const { path, document_top_tree_uri, last_filenode_path } = new_workspace; if (old_workspace_root_path === path) return; reset_ui_states(); @@ -50,7 +50,7 @@ export async function update_workspace( } catch (e) { reset_ui_states(); toast.error('Error Opening Folder: \n' + e); - root_folder_picker_dialog_state.open = true; + workspace_picker_dialog_open_state.data = true; } } diff --git a/apps/app/src/components/general/workspace_selector/states.svelte.ts b/apps/app/src/components/general/workspace_selector/states.svelte.ts new file mode 100644 index 00000000..6c8ab053 --- /dev/null +++ b/apps/app/src/components/general/workspace_selector/states.svelte.ts @@ -0,0 +1,3 @@ +export const workspace_picker_dialog_open_state = $state({ + data: false, +}); diff --git a/apps/app/src/components/main_section/text_editor/editor/context_menu.ts b/apps/app/src/components/main_section/text_editor/editor/context_menu.ts index 53439a9e..0e577f3f 100644 --- a/apps/app/src/components/main_section/text_editor/editor/context_menu.ts +++ b/apps/app/src/components/main_section/text_editor/editor/context_menu.ts @@ -1,5 +1,6 @@ // @unocss-include +import { get_rephrased_text, get_summarized_text } from '@/lib/features/nlp'; import type { MenuItem } from '@/types'; import type { EditorView } from '@codemirror/view'; import { writeText, readText } from '@tauri-apps/plugin-clipboard-manager'; @@ -24,5 +25,38 @@ export function get_desktop_context_menu(view: EditorView): MenuItem[] { await writeText(selectedText); }, }, + { + divider: true, + label: '', + }, + { + label: 'Rephrase', + icon_class: 'i-tabler:sparkles size-4.5', + action: async () => { + const state = view.state; // 'view' is your EditorView instance + const range = state.selection.main; + const selectedText = state.sliceDoc(range.from, range.to); + const text = await get_rephrased_text(selectedText); + if (!text) return; + view.dispatch(view.state.replaceSelection(text)); + }, + }, + { + label: 'Summarize', + icon_class: 'i-tabler:sparkles size-4.5', + action: async () => { + const state = view.state; // 'view' is your EditorView instance + const range = state.selection.main; + const selectedText = state.sliceDoc(range.from, range.to); + const text = await get_summarized_text(selectedText); + if (!text) return; + view.dispatch(view.state.replaceSelection(text)); + }, + }, + { + label: 'Generate', + icon_class: 'i-tabler:sparkles size-4.5', + action: async () => {}, + }, ]; } diff --git a/apps/app/src/components/main_section/text_editor/fab/index.svelte b/apps/app/src/components/main_section/text_editor/fab/index.svelte new file mode 100644 index 00000000..f5ac6c75 --- /dev/null +++ b/apps/app/src/components/main_section/text_editor/fab/index.svelte @@ -0,0 +1,44 @@ + + +
+ +
+
+
+ + + + + + {#each items as item} + + {/each} +
diff --git a/apps/app/src/components/main_section/text_editor/index.svelte b/apps/app/src/components/main_section/text_editor/index.svelte index 60702a5d..d9deebdb 100644 --- a/apps/app/src/components/main_section/text_editor/index.svelte +++ b/apps/app/src/components/main_section/text_editor/index.svelte @@ -6,6 +6,7 @@ import { toast } from 'svelte-sonner'; import Editor from './editor/index.svelte'; import MobileToolbar from './editor_toolbar_mobile/index.svelte'; + import FloatingActionButton from './fab/index.svelte'; import { editor_view } from './editor_state.svelte'; import { focused_subtree } from '@/components/sidebar_section/file_manager/states.svelte'; @@ -91,6 +92,9 @@ }} /> + {#if current_platform_type == 'mobile'} + + {/if} {#if current_platform_type == 'mobile' && mobile_toolbar_visible && editor_view.data} diff --git a/apps/app/src/components/sidebar_section/bottom_sidebar.svelte b/apps/app/src/components/sidebar_section/bottom_sidebar.svelte index 0bb66cbc..6b517c6f 100644 --- a/apps/app/src/components/sidebar_section/bottom_sidebar.svelte +++ b/apps/app/src/components/sidebar_section/bottom_sidebar.svelte @@ -1,24 +1,35 @@
- + +
diff --git a/apps/app/src/lib/features/nlp/index.ts b/apps/app/src/lib/features/nlp/index.ts new file mode 100644 index 00000000..e5b9979b --- /dev/null +++ b/apps/app/src/lib/features/nlp/index.ts @@ -0,0 +1,49 @@ +import { generateText } from 'ai'; +import { model } from './states.svelte'; +import { toast } from 'svelte-sonner'; + +export async function get_summarized_text(text: string) { + if (!model.data) { + toast.error('Please Set your Language Model Provider First'); + return; + } + const prompt = ` +You are an Expet Markdown Writter. You job is to Summarize the text given to you to make it clearer, simpler and summarized in a short sentence. + +the markdown text you are given is this: + +'${text}' + +your job is to summarize this text and output only the markdown summary of the text. +DO NOT ouput a confirmation response like "yeah, no problems, i will do that" +DO NOT output a markdown wrapped inside a code block like \`\`\`# Markdown\`\`\`. only output pure markdown +ONLY output the summarized markdown text in the resaponse and nothing else +`; + const { text: summarized_text } = await generateText({ + model: model.data, + prompt, + }); + return summarized_text; +} +export async function get_rephrased_text(text: string) { + if (!model.data) { + toast.error('Please Set your Language Model Provider First'); + return; + } + const prompt = ` +You are an Expet Markdown Writter. You job is to Rephrase the text given to you to and make it clearer, simpler and sound good. + +the markdown text you are given is this: + +'${text}' + +DO NOT ouput a confirmation response like "yeah, no problems, i will do that" +DO NOT output a markdown wrapped inside a code block like \`\`\`# Markdown\`\`\`. only output pure markdown +ONLY output the summarized markdown text in the resaponse and nothing else +`; + const { text: rephrased_text } = await generateText({ + model: model.data, + prompt, + }); + return rephrased_text; +} diff --git a/apps/app/src/lib/features/nlp/states.svelte.ts b/apps/app/src/lib/features/nlp/states.svelte.ts new file mode 100644 index 00000000..3cf951bf --- /dev/null +++ b/apps/app/src/lib/features/nlp/states.svelte.ts @@ -0,0 +1,5 @@ +import type { LanguageModelV3 } from '@ai-sdk/provider'; + +export const model = $state<{ data: LanguageModelV3 | undefined }>({ + data: undefined, +}); diff --git a/apps/app/src/lib/window_listeners/index.ts b/apps/app/src/lib/window_listeners/index.ts index 0c01d57d..e90eeead 100644 --- a/apps/app/src/lib/window_listeners/index.ts +++ b/apps/app/src/lib/window_listeners/index.ts @@ -1,4 +1,4 @@ -import { touch_recent_workspaces } from '@/components/general/root_folder_selector/operations.svelte'; +import { touch_recent_workspaces } from '@/components/general/workspace_selector/operations.svelte'; import { getCurrentWindow } from '@tauri-apps/api/window'; import { writeTextFile } from '@tauri-apps/plugin-fs'; import { diff --git a/bun.lock b/bun.lock index 6928c152..537941da 100644 --- a/bun.lock +++ b/bun.lock @@ -25,6 +25,10 @@ "name": "cherit", "version": "0.0.1", "dependencies": { + "@ai-sdk/anthropic": "^3.0.36", + "@ai-sdk/google": "^3.0.21", + "@ai-sdk/openai": "^3.0.25", + "@ai-sdk/provider": "^3.0.7", "@iconify-json/carbon": "^1.2.18", "@iconify-json/tabler": "^1.2.26", "@saurl/tauri-plugin-safe-area-insets-css-api": "^0.1.0", @@ -39,7 +43,10 @@ "@unocss/preset-mini": "^66.6.0", "@unocss/reset": "^66.6.0", "@unocss/transformer-variant-group": "^66.6.0", + "ai": "^6.0.70", + "bits-ui": "^2.15.5", "daisyui": "5.4.7", + "tauri-plugin-llm-api": "git+https://github.com/crabnebula-dev/tauri-plugin-llm.git", "html2canvas-pro": "^1.6.6", "jspdf": "^3.0.4", "svelte-animated-details": "^1.0.2", @@ -50,7 +57,9 @@ "devDependencies": { "@0x-jerry/unocss-preset-daisyui": "0.2.3", "@iconify-json/famicons": "^1.2.2", + "@iconify-json/healthicons": "^1.2.12", "@iconify-json/line-md": "^1.2.14", + "@iconify-json/ri": "^1.2.9", "@sveltejs/vite-plugin-svelte": "^6.2.4", "@tauri-apps/cli": "^2.9.6", "@testing-library/svelte": "^5.3.1", @@ -75,6 +84,18 @@ "@acemir/cssom": ["@acemir/cssom@0.9.31", "", {}, "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA=="], + "@ai-sdk/anthropic": ["@ai-sdk/anthropic@3.0.50", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.16" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-BkCUgGTp/iZJuuFBF1wv7GGnrEJg7X7hqbaa+/t4HTBt9dZn3e6NFn5NhPUvo2p5SreUeHEl0As0r2uaVn3K9Q=="], + + "@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.59", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.16", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-MbtheWHgEFV/8HL1Z6E3hOAsmP73zZlNFg0F0nJAD0Adnjp4J/plqNK00Y896d+dWTw+r0OXzyov9/2wCFjH0Q=="], + + "@ai-sdk/google": ["@ai-sdk/google@3.0.34", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.16" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-1tXUr1W5YACXPgtHYWIU3raqMsayp6cMI8NUT4EEzzZSpvHzkkiNWHEr+bGxEGurSUukfo+pE1RKpLwBFOZtJg=="], + + "@ai-sdk/openai": ["@ai-sdk/openai@3.0.37", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.16" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-bcYjT3/58i/C0DN3AnrjiGsAb0kYivZLWWUtgTjsBurHSht/LTEy+w3dw5XQe3FmZwX7Z/mUQCiA3wB/5Kf7ow=="], + + "@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="], + + "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.16", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-kBvDqNkt5EwlzF9FujmNhhtl8FYg3e8FO8P5uneKliqfRThWemzBj+wfYr7ZCymAQhTRnwSSz1/SOqhOAwmx9g=="], + "@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="], "@asamuzakjp/css-color": ["@asamuzakjp/css-color@4.1.2", "", { "dependencies": { "@csstools/css-calc": "^3.0.0", "@csstools/css-color-parser": "^4.0.1", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", "lru-cache": "^11.2.5" } }, "sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg=="], @@ -229,18 +250,30 @@ "@exodus/bytes": ["@exodus/bytes@1.14.1", "", { "peerDependencies": { "@noble/hashes": "^1.8.0 || ^2.0.0" }, "optionalPeers": ["@noble/hashes"] }, "sha512-OhkBFWI6GcRMUroChZiopRiSp2iAMvEBK47NhJooDqz1RERO4QuZIZnjP63TXX8GAiLABkYmX+fuQsdJ1dd2QQ=="], + "@floating-ui/core": ["@floating-ui/core@1.7.4", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.7.5", "", { "dependencies": { "@floating-ui/core": "^1.7.4", "@floating-ui/utils": "^0.2.10" } }, "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], + "@iconify-json/carbon": ["@iconify-json/carbon@1.2.19", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-l89XjtEeSA5fxlxPTNSU9AA+rxaz/Dn0X/ux0/3awR+tAayY8iJqWQu3AKxhchfx3LB/fX1Nv3ZppZzrBAt7aA=="], "@iconify-json/famicons": ["@iconify-json/famicons@1.2.2", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-mFgrUk2CYKeFe9EHh6XWdtVDkX344OTb3E6X7RaOp6iwW9saJH/kknNFZRZ2UFQCcFl3RNSTN6IRpCRsRppFxw=="], + "@iconify-json/healthicons": ["@iconify-json/healthicons@1.2.12", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-0ohosj8zla9Bf+OT0wPYASVp1OvLzkdBof/B03lzGWmC5FzkvtFeAa4TtzLMCOVaeToIpT6JPs9kSfp7dJifdA=="], + "@iconify-json/line-md": ["@iconify-json/line-md@1.2.14", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-ZlgQyMcptcni3wEua+ij9hXEuYmlHKlf38/fZT4Qhds07naE9NeEmE0tqWMHAtkir+r9VRTTz3jXzwXWkLZiCg=="], + "@iconify-json/ri": ["@iconify-json/ri@1.2.10", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-WWMhoncVVM+Xmu9T5fgu2lhYRrKTEWhKk3Com0KiM111EeEsRLiASjpsFKnC/SrB6covhUp95r2mH8tGxhgd5Q=="], + "@iconify-json/tabler": ["@iconify-json/tabler@1.2.28", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-HKF7K9Ba67GdB2b2tYWF1DS2Ydpxmo1Fsda7bQRwKUPYOiYM99F7rgJp6BN7TFQiRmCaxilfro6FQeCMSjuV1g=="], "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], "@iconify/utils": ["@iconify/utils@3.1.0", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@iconify/types": "^2.0.0", "mlly": "^1.8.0" } }, "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw=="], + "@internationalized/date": ["@internationalized/date@3.11.0", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-BOx5huLAWhicM9/ZFs84CzP+V3gBW6vlpM02yzsdYC7TGlZJX1OJiEEHcSayF00Z+3jLlm4w79amvSt6RqKN3Q=="], + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], @@ -293,6 +326,8 @@ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], + "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], "@prosemark/core": ["@prosemark/core@0.0.5", "", { "dependencies": { "@lezer/common": "^1.4.0", "@lezer/markdown": "^1.6.1", "@lezer/yaml": "^1.0.4", "ajv": "^8.17.1", "node-emoji": "^2.2.0" }, "peerDependencies": { "@codemirror/autocomplete": "^6.20.0", "@codemirror/commands": "^6.10.1", "@codemirror/lang-markdown": "^6.5.0", "@codemirror/language": "^6.11.3", "@codemirror/language-data": "^6.5.2", "@codemirror/lint": "^6.9.2", "@codemirror/search": "^6.5.11", "@codemirror/state": "^6.5.2", "@codemirror/view": "^6.39.4", "@lezer/highlight": "^1.2.0" } }, "sha512-RmSIyvrwxrFXmhx0TTHtMfSH3Cv3e2bl+Oj0v+nz1hvganIfLD8nQ01J9NS+Xj+JWKqpeZzIF8e7Xr6v+D9VTw=="], @@ -363,6 +398,8 @@ "@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@5.0.2", "", { "dependencies": { "obug": "^2.1.0" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig=="], + "@swc/helpers": ["@swc/helpers@0.5.19", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA=="], + "@tauri-apps/api": ["@tauri-apps/api@2.10.1", "", {}, "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw=="], "@tauri-apps/cli": ["@tauri-apps/cli@2.10.0", "", { "optionalDependencies": { "@tauri-apps/cli-darwin-arm64": "2.10.0", "@tauri-apps/cli-darwin-x64": "2.10.0", "@tauri-apps/cli-linux-arm-gnueabihf": "2.10.0", "@tauri-apps/cli-linux-arm64-gnu": "2.10.0", "@tauri-apps/cli-linux-arm64-musl": "2.10.0", "@tauri-apps/cli-linux-riscv64-gnu": "2.10.0", "@tauri-apps/cli-linux-x64-gnu": "2.10.0", "@tauri-apps/cli-linux-x64-musl": "2.10.0", "@tauri-apps/cli-win32-arm64-msvc": "2.10.0", "@tauri-apps/cli-win32-ia32-msvc": "2.10.0", "@tauri-apps/cli-win32-x64-msvc": "2.10.0" }, "bin": { "tauri": "tauri.js" } }, "sha512-ZwT0T+7bw4+DPCSWzmviwq5XbXlM0cNoleDKOYPFYqcZqeKY31KlpoMW/MOON/tOFBPgi31a2v3w9gliqwL2+Q=="], @@ -469,6 +506,8 @@ "@unocss/vite": ["@unocss/vite@66.6.2", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "@unocss/config": "66.6.2", "@unocss/core": "66.6.2", "@unocss/inspector": "66.6.2", "chokidar": "^5.0.0", "magic-string": "^0.30.21", "pathe": "^2.0.3", "tinyglobby": "^0.2.15", "unplugin-utils": "^0.3.1" }, "peerDependencies": { "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0-0" } }, "sha512-HLmzDvde3BJ2C6iromHVE21lmNm4SmGSMlbSbFuLPOmWV11XhhHBkAOzytSxPBRG0dbuo+InSGUM14Ek2d6UDg=="], + "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="], + "@vitest/expect": ["@vitest/expect@4.0.18", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.0.18", "@vitest/utils": "4.0.18", "chai": "^6.2.1", "tinyrainbow": "^3.0.3" } }, "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ=="], "@vitest/mocker": ["@vitest/mocker@4.0.18", "", { "dependencies": { "@vitest/spy": "4.0.18", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ=="], @@ -483,10 +522,14 @@ "@vitest/utils": ["@vitest/utils@4.0.18", "", { "dependencies": { "@vitest/pretty-format": "4.0.18", "tinyrainbow": "^3.0.3" } }, "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA=="], + "a-sync-waterfall": ["a-sync-waterfall@1.0.1", "", {}, "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA=="], + "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + "ai": ["ai@6.0.105", "", { "dependencies": { "@ai-sdk/gateway": "3.0.59", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.16", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-rp+exWtZS3J0DDvZIfetpKCIg7D3cCsvBPoFN3I67IDTs9aoBZDbpecoIkmNLT+U9RBkoEial3OGHRvme23HCw=="], + "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], @@ -495,6 +538,8 @@ "aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="], + "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="], + "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], @@ -503,6 +548,8 @@ "bidi-js": ["bidi-js@1.0.3", "", { "dependencies": { "require-from-string": "^2.0.2" } }, "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw=="], + "bits-ui": ["bits-ui@2.16.2", "", { "dependencies": { "@floating-ui/core": "^1.7.1", "@floating-ui/dom": "^1.7.1", "esm-env": "^1.1.2", "runed": "^0.35.1", "svelte-toolbelt": "^0.10.6", "tabbable": "^6.2.0" }, "peerDependencies": { "@internationalized/date": "^3.8.1", "svelte": "^5.33.0" } }, "sha512-bgEpRRF7Ck9nRP1pbuKVxpaSMrz+8Pm0y+dmuvlkrSe+uUwIQECef29y6eslFHM6pCAubUh7STrsTLUUp8fzFQ=="], + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], @@ -521,6 +568,8 @@ "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + "commander": ["commander@5.1.0", "", {}, "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="], + "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], @@ -577,6 +626,8 @@ "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], + "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="], "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], @@ -613,6 +664,8 @@ "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], + "iobuffer": ["iobuffer@5.4.0", "", {}, "sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], @@ -633,6 +686,8 @@ "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "jspdf": ["jspdf@3.0.4", "", { "dependencies": { "@babel/runtime": "^7.28.4", "fast-png": "^6.2.0", "fflate": "^0.8.1" }, "optionalDependencies": { "canvg": "^3.0.11", "core-js": "^3.6.0", "dompurify": "^3.2.4", "html2canvas": "^1.0.0-rc.5" } }, "sha512-dc6oQ8y37rRcHn316s4ngz/nOjayLF/FFxBF4V9zamQKRqXxyiH1zagkCdktdWhtoQId5K20xt1lB90XzkB+hQ=="], @@ -689,6 +744,8 @@ "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], + "nunjucks": ["nunjucks@3.2.4", "", { "dependencies": { "a-sync-waterfall": "^1.0.0", "asap": "^2.0.3", "commander": "^5.1.0" }, "peerDependencies": { "chokidar": "^3.3.0" }, "optionalPeers": ["chokidar"], "bin": { "nunjucks-precompile": "bin/precompile" } }, "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ=="], + "obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="], "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], @@ -749,7 +806,7 @@ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], - "runed": ["runed@0.28.0", "", { "dependencies": { "esm-env": "^1.0.0" }, "peerDependencies": { "svelte": "^5.7.0" } }, "sha512-k2xx7RuO9hWcdd9f+8JoBeqWtYrm5CALfgpkg2YDB80ds/QE4w0qqu34A7fqiAwiBBSBQOid7TLxwxVC27ymWQ=="], + "runed": ["runed@0.35.1", "", { "dependencies": { "dequal": "^2.0.3", "esm-env": "^1.0.0", "lz-string": "^1.5.0" }, "peerDependencies": { "@sveltejs/kit": "^2.21.0", "svelte": "^5.7.0" }, "optionalPeers": ["@sveltejs/kit"] }, "sha512-2F4Q/FZzbeJTFdIS/PuOoPRSm92sA2LhzTnv6FXhCoENb3huf5+fDuNOg1LNvGOouy3u/225qxmuJvcV3IZK5Q=="], "s.color": ["s.color@0.0.15", "", {}, "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA=="], @@ -775,6 +832,8 @@ "style-mod": ["style-mod@4.1.3", "", {}, "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ=="], + "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], + "suf-log": ["suf-log@2.5.3", "", { "dependencies": { "s.color": "0.0.15" } }, "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow=="], "svelte": ["svelte@5.53.6", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.3", "esm-env": "^1.2.1", "esrap": "^2.2.2", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-lP5DGF3oDDI9fhHcSpaBiJEkFLuS16h92DhM1L5K1lFm0WjOmUh1i2sNkBBk8rkxJRpob0dBE75jRfUzGZUOGA=="], @@ -785,12 +844,18 @@ "svelte-sonner": ["svelte-sonner@1.0.7", "", { "dependencies": { "runed": "^0.28.0" }, "peerDependencies": { "svelte": "^5.0.0" } }, "sha512-1EUFYmd7q/xfs2qCHwJzGPh9n5VJ3X6QjBN10fof2vxgy8fYE7kVfZ7uGnd7i6fQaWIr5KvXcwYXE/cmTEjk5A=="], + "svelte-toolbelt": ["svelte-toolbelt@0.10.6", "", { "dependencies": { "clsx": "^2.1.1", "runed": "^0.35.1", "style-to-object": "^1.0.8" }, "peerDependencies": { "svelte": "^5.30.2" } }, "sha512-YWuX+RE+CnWYx09yseAe4ZVMM7e7GRFZM6OYWpBKOb++s+SQ8RBIMMe+Bs/CznBMc0QPLjr+vDBxTAkozXsFXQ=="], + "svg-pathdata": ["svg-pathdata@6.0.3", "", {}, "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw=="], "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="], + "tabbable": ["tabbable@6.4.0", "", {}, "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg=="], + "tauri-plugin-android-fs-api": ["tauri-plugin-android-fs-api@24.2.2", "", { "dependencies": { "@tauri-apps/api": "^2.0.0" } }, "sha512-w2OVkZExEBuepGBTI5Mlpad8GykbflFb3iWgc351WWuG3Wdndv1F6fT4zvGYdKJ9jDuhS7Rb/yhyCGkLiC1gQg=="], + "tauri-plugin-llm-api": ["tauri-plugin-llm-api@github:crabnebula-dev/tauri-plugin-llm#e8add88", { "dependencies": { "@tauri-apps/api": "^2.0.0", "nunjucks": "^3.2.4" } }, "crabnebula-dev-tauri-plugin-llm-e8add88"], + "text-segmentation": ["text-segmentation@1.0.3", "", { "dependencies": { "utrie": "^1.0.2" } }, "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw=="], "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], @@ -813,6 +878,8 @@ "tr46": ["tr46@6.0.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw=="], + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="], @@ -877,6 +944,8 @@ "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "svelte-sonner/runed": ["runed@0.28.0", "", { "dependencies": { "esm-env": "^1.0.0" }, "peerDependencies": { "svelte": "^5.7.0" } }, "sha512-k2xx7RuO9hWcdd9f+8JoBeqWtYrm5CALfgpkg2YDB80ds/QE4w0qqu34A7fqiAwiBBSBQOid7TLxwxVC27ymWQ=="], + "unocss-preset-scrollbar/@unocss/preset-mini": ["@unocss/preset-mini@65.5.0", "", { "dependencies": { "@unocss/core": "65.5.0", "@unocss/extractor-arbitrary-variants": "65.5.0", "@unocss/rule-utils": "65.5.0" } }, "sha512-oD2INmEgTOxmFsVceflv4Zs67vz9PRbpg3+CMsJLWgfX4UdQ1H4jZms72+g3N1hhXBvOFwvGvqGaMnrVMRk54g=="], "@unocss/cli/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="],