diff --git a/frontend/bun.lock b/frontend/bun.lock index c6f3e148d..581a3f12b 100644 --- a/frontend/bun.lock +++ b/frontend/bun.lock @@ -18,10 +18,12 @@ "@radix-ui/react-tooltip": "^1.1.2", "@tanstack/react-query": "^5.56.2", "@tanstack/react-router": "^1.50.1", - "@tauri-apps/api": "^2.4.1", + "@tauri-apps/api": "^2.8", "@tauri-apps/plugin-deep-link": "^2.0.0", + "@tauri-apps/plugin-dialog": "^2.4.0", + "@tauri-apps/plugin-fs": "^2.4.2", "@tauri-apps/plugin-opener": "^2.2.6", - "@tauri-apps/plugin-os": "^2.2.1", + "@tauri-apps/plugin-os": "^2.3", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "gpt-tokenizer": "^3.0.1", @@ -403,7 +405,7 @@ "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.99.0", "", {}, "sha512-XvX8bfdo4CYiCW+ItVdBfCorh3PwQFqYqd7ll+XKWiWOJpqUGIG7VlziVavARZpUySiY2VBlHadiUYS7jhgjRg=="], - "@tauri-apps/api": ["@tauri-apps/api@2.4.1", "", {}, "sha512-5sYwZCSJb6PBGbBL4kt7CnE5HHbBqwH+ovmOW6ZVju3nX4E3JX6tt2kRklFEH7xMOIwR0btRkZktuLhKvyEQYg=="], + "@tauri-apps/api": ["@tauri-apps/api@2.8.0", "", {}, "sha512-ga7zdhbS2GXOMTIZRT0mYjKJtR9fivsXzsyq5U3vjDL0s6DTMwYRm0UHNjzTY5dh4+LSC68Sm/7WEiimbQNYlw=="], "@tauri-apps/cli": ["@tauri-apps/cli@2.5.0", "", { "optionalDependencies": { "@tauri-apps/cli-darwin-arm64": "2.5.0", "@tauri-apps/cli-darwin-x64": "2.5.0", "@tauri-apps/cli-linux-arm-gnueabihf": "2.5.0", "@tauri-apps/cli-linux-arm64-gnu": "2.5.0", "@tauri-apps/cli-linux-arm64-musl": "2.5.0", "@tauri-apps/cli-linux-riscv64-gnu": "2.5.0", "@tauri-apps/cli-linux-x64-gnu": "2.5.0", "@tauri-apps/cli-linux-x64-musl": "2.5.0", "@tauri-apps/cli-win32-arm64-msvc": "2.5.0", "@tauri-apps/cli-win32-ia32-msvc": "2.5.0", "@tauri-apps/cli-win32-x64-msvc": "2.5.0" }, "bin": { "tauri": "tauri.js" } }, "sha512-rAtHqG0Gh/IWLjN2zTf3nZqYqbo81oMbqop56rGTjrlWk9pTTAjkqOjSL9XQLIMZ3RbeVjveCqqCA0s8RnLdMg=="], @@ -431,9 +433,13 @@ "@tauri-apps/plugin-deep-link": ["@tauri-apps/plugin-deep-link@2.2.1", "", { "dependencies": { "@tauri-apps/api": "^2.0.0" } }, "sha512-8skZ6qIH/kWaV8d6jj3aPvvkIOuqkVk0APRDey9n9N3Ueu3n4MIbuxpAKR2EdoAyQxnXxPTNVyjw2D35/vfGyg=="], + "@tauri-apps/plugin-dialog": ["@tauri-apps/plugin-dialog@2.4.0", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-OvXkrEBfWwtd8tzVCEXIvRfNEX87qs2jv6SqmVPiHcJjBhSF/GUvjqUNIDmKByb5N8nvDqVUM7+g1sXwdC/S9w=="], + + "@tauri-apps/plugin-fs": ["@tauri-apps/plugin-fs@2.4.2", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-YGhmYuTgXGsi6AjoV+5mh2NvicgWBfVJHHheuck6oHD+HC9bVWPaHvCP0/Aw4pHDejwrvT8hE3+zZAaWf+hrig=="], + "@tauri-apps/plugin-opener": ["@tauri-apps/plugin-opener@2.2.6", "", { "dependencies": { "@tauri-apps/api": "^2.0.0" } }, "sha512-bSdkuP71ZQRepPOn8BOEdBKYJQvl6+jb160QtJX/i2H9BF6ZySY/kYljh76N2Ne5fJMQRge7rlKoStYQY5Jq1w=="], - "@tauri-apps/plugin-os": ["@tauri-apps/plugin-os@2.2.1", "", { "dependencies": { "@tauri-apps/api": "^2.0.0" } }, "sha512-cNYpNri2CCc6BaNeB6G/mOtLvg8dFyFQyCUdf2y0K8PIAKGEWdEcu8DECkydU2B+oj4OJihDPD2de5K6cbVl9A=="], + "@tauri-apps/plugin-os": ["@tauri-apps/plugin-os@2.3.1", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-ty5V8XDUIFbSnrk3zsFoP3kzN+vAufYzalJSlmrVhQTImIZa1aL1a03bOaP2vuBvfR+WDRC6NgV2xBl8G07d+w=="], "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], @@ -1265,6 +1271,10 @@ "@radix-ui/react-use-effect-event/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], + "@tauri-apps/plugin-deep-link/@tauri-apps/api": ["@tauri-apps/api@2.4.1", "", {}, "sha512-5sYwZCSJb6PBGbBL4kt7CnE5HHbBqwH+ovmOW6ZVju3nX4E3JX6tt2kRklFEH7xMOIwR0btRkZktuLhKvyEQYg=="], + + "@tauri-apps/plugin-opener/@tauri-apps/api": ["@tauri-apps/api@2.4.1", "", {}, "sha512-5sYwZCSJb6PBGbBL4kt7CnE5HHbBqwH+ovmOW6ZVju3nX4E3JX6tt2kRklFEH7xMOIwR0btRkZktuLhKvyEQYg=="], + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], "@typescript-eslint/typescript-estree/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], diff --git a/frontend/package.json b/frontend/package.json index 6cfaf65b2..f46b9e463 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -30,10 +30,12 @@ "@radix-ui/react-tooltip": "^1.1.2", "@tanstack/react-query": "^5.56.2", "@tanstack/react-router": "^1.50.1", - "@tauri-apps/api": "^2.4.1", + "@tauri-apps/api": "^2.8", "@tauri-apps/plugin-deep-link": "^2.0.0", + "@tauri-apps/plugin-dialog": "^2.4.0", + "@tauri-apps/plugin-fs": "^2.4.2", "@tauri-apps/plugin-opener": "^2.2.6", - "@tauri-apps/plugin-os": "^2.2.1", + "@tauri-apps/plugin-os": "^2.3", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "gpt-tokenizer": "^3.0.1", diff --git a/frontend/src-tauri/Cargo.lock b/frontend/src-tauri/Cargo.lock index d37b2760d..2f5332b0f 100644 --- a/frontend/src-tauri/Cargo.lock +++ b/frontend/src-tauri/Cargo.lock @@ -17,6 +17,15 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "adobe-cmap-parser" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8abfa9a4688de8fc9f42b3f013b6fffec18ed8a554f5f113577e0b9b3212a3" +dependencies = [ + "pom", +] + [[package]] name = "aead" version = "0.5.2" @@ -438,7 +447,7 @@ dependencies = [ "http-body-util", "hyper", "hyper-util", - "itoa 1.0.14", + "itoa", "matchit", "memchr", "mime", @@ -607,9 +616,9 @@ dependencies = [ [[package]] name = "brotli" -version = "7.0.0" +version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -618,9 +627,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.2" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -750,7 +759,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02260d489095346e5cafd04dea8e8cb54d1d74fcd759022a9b72986ebe9a1257" dependencies = [ "serde", - "toml", + "toml 0.8.20", ] [[package]] @@ -1054,15 +1063,15 @@ dependencies = [ [[package]] name = "cssparser" -version = "0.27.2" +version = "0.29.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" dependencies = [ "cssparser-macros", "dtoa-short", - "itoa 0.4.8", + "itoa", "matches", - "phf 0.8.0", + "phf 0.10.1", "proc-macro2", "quote", "smallvec", @@ -1266,9 +1275,9 @@ dependencies = [ [[package]] name = "dlopen2" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" +checksum = "b54f373ccf864bf587a89e880fb7610f8d73f3045f13580948ccbcaff26febff" dependencies = [ "dlopen2_derive", "libc", @@ -1347,7 +1356,7 @@ dependencies = [ "cc", "memchr", "rustc_version", - "toml", + "toml 0.8.20", "vswhom", "winreg", ] @@ -1430,6 +1439,15 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "euclid" +version = "0.20.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bb7ef65b3777a325d1eeefefab5b6d4959da54747e33bd6258e789640f307ad" +dependencies = [ + "num-traits", +] + [[package]] name = "event-listener" version = "5.4.0" @@ -2099,16 +2117,14 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "html5ever" -version = "0.26.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" +checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" dependencies = [ "log", "mac", "markup5ever", - "proc-macro2", - "quote", - "syn 1.0.109", + "match_token", ] [[package]] @@ -2119,7 +2135,7 @@ checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", - "itoa 1.0.14", + "itoa", ] [[package]] @@ -2171,7 +2187,7 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.14", + "itoa", "pin-project-lite", "smallvec", "tokio", @@ -2491,12 +2507,6 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - [[package]] name = "itoa" version = "1.0.14" @@ -2593,14 +2603,13 @@ dependencies = [ [[package]] name = "kuchikiki" -version = "0.8.2" +version = "0.8.8-speedreader" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" dependencies = [ "cssparser", "html5ever", - "indexmap 1.9.3", - "matches", + "indexmap 2.7.1", "selectors", ] @@ -2698,6 +2707,24 @@ dependencies = [ "value-bag", ] +[[package]] +name = "lopdf" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5c8ecfc6c72051981c0459f75ccc585e7ff67c70829560cda8e647882a9abff" +dependencies = [ + "encoding_rs", + "flate2", + "indexmap 2.7.1", + "itoa", + "log", + "md-5", + "nom", + "rangemap", + "time", + "weezl", +] + [[package]] name = "mac" version = "0.1.1" @@ -2710,9 +2737,11 @@ version = "1.3.1" dependencies = [ "anyhow", "axum", + "base64 0.22.1", "log", "maple-proxy", "once_cell", + "pdf-extract", "serde", "serde_json", "tauri", @@ -2754,18 +2783,29 @@ dependencies = [ [[package]] name = "markup5ever" -version = "0.11.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" +checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" dependencies = [ "log", - "phf 0.10.1", - "phf_codegen 0.10.0", + "phf 0.11.3", + "phf_codegen 0.11.3", "string_cache", "string_cache_codegen", "tendril", ] +[[package]] +name = "match_token" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "matchers" version = "0.1.0" @@ -2787,6 +2827,16 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "memchr" version = "2.7.4" @@ -2843,9 +2893,9 @@ dependencies = [ [[package]] name = "muda" -version = "0.16.1" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de14a9b5d569ca68d7c891d613b390cf5ab4f851c77aaa2f9e435555d3d9492" +checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" dependencies = [ "crossbeam-channel", "dpi", @@ -2859,7 +2909,7 @@ dependencies = [ "png", "serde", "thiserror 2.0.11", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -3216,6 +3266,17 @@ dependencies = [ "objc2-foundation 0.3.0", ] +[[package]] +name = "objc2-security" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3126341c65c5d5728423ae95d788e1b660756486ad0592307ab87ba02d9a7268" +dependencies = [ + "bitflags 2.8.0", + "objc2 0.6.0", + "objc2-core-foundation", +] + [[package]] name = "objc2-ui-kit" version = "0.3.0" @@ -3240,6 +3301,7 @@ dependencies = [ "objc2-app-kit", "objc2-core-foundation", "objc2-foundation 0.3.0", + "objc2-security", ] [[package]] @@ -3485,6 +3547,21 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" +[[package]] +name = "pdf-extract" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbb3a5387b94b9053c1e69d8abfd4dd6dae7afda65a5c5279bc1f42ab39df575" +dependencies = [ + "adobe-cmap-parser", + "encoding_rs", + "euclid", + "lopdf", + "postscript", + "type1-encoding-parser", + "unicode-normalization", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -3497,9 +3574,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" dependencies = [ - "phf_macros 0.8.0", "phf_shared 0.8.0", - "proc-macro-hack", ] [[package]] @@ -3508,7 +3583,9 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" dependencies = [ + "phf_macros 0.10.0", "phf_shared 0.10.0", + "proc-macro-hack", ] [[package]] @@ -3533,12 +3610,12 @@ dependencies = [ [[package]] name = "phf_codegen" -version = "0.10.0" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", + "phf_generator 0.11.3", + "phf_shared 0.11.3", ] [[package]] @@ -3573,12 +3650,12 @@ dependencies = [ [[package]] name = "phf_macros" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", + "phf_generator 0.10.0", + "phf_shared 0.10.0", "proc-macro-hack", "proc-macro2", "quote", @@ -3726,6 +3803,18 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "pom" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60f6ce597ecdcc9a098e7fddacb1065093a3d66446fa16c675e7e71d1b5c28e6" + +[[package]] +name = "postscript" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78451badbdaebaf17f053fd9152b3ffb33b516104eacb45e7864aaa9c712f306" + [[package]] name = "powerfmt" version = "0.2.0" @@ -4021,6 +4110,12 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rangemap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93e7e49bb0bf967717f7bd674458b3d6b0c5f48ec7e3038166026a69fc22223" + [[package]] name = "raw-window-handle" version = "0.6.2" @@ -4439,22 +4534,20 @@ dependencies = [ [[package]] name = "selectors" -version = "0.22.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" dependencies = [ "bitflags 1.3.2", "cssparser", "derive_more", "fxhash", "log", - "matches", "phf 0.8.0", "phf_codegen 0.8.0", "precomputed-hash", "servo_arc", "smallvec", - "thin-slice", ] [[package]] @@ -4524,7 +4617,7 @@ version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" dependencies = [ - "itoa 1.0.14", + "itoa", "memchr", "ryu", "serde", @@ -4536,7 +4629,7 @@ version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" dependencies = [ - "itoa 1.0.14", + "itoa", "serde", ] @@ -4560,6 +4653,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -4567,7 +4669,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.14", + "itoa", "ryu", "serde", ] @@ -4604,9 +4706,9 @@ dependencies = [ [[package]] name = "serialize-to-javascript" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" dependencies = [ "serde", "serde_json", @@ -4615,20 +4717,20 @@ dependencies = [ [[package]] name = "serialize-to-javascript-impl" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.98", ] [[package]] name = "servo_arc" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" dependencies = [ "nodrop", "stable_deref_trait", @@ -4917,17 +5019,18 @@ dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml", + "toml 0.8.20", "version-compare", ] [[package]] name = "tao" -version = "0.32.8" +version = "0.34.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63c8b1020610b9138dd7b1e06cf259ae91aa05c30f3bd0d6b42a03997b92dec1" +checksum = "959469667dbcea91e5485fc48ba7dd6023face91bb0f1a14681a70f99847c3f7" dependencies = [ "bitflags 2.8.0", + "block2 0.6.0", "core-foundation 0.10.0", "core-graphics", "crossbeam-channel", @@ -4954,8 +5057,8 @@ dependencies = [ "tao-macros", "unicode-segmentation", "url", - "windows", - "windows-core 0.60.1", + "windows 0.61.3", + "windows-core 0.61.2", "windows-version", "x11-dl", ] @@ -4996,17 +5099,17 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.4.1" +version = "2.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d08db1ff9e011e04014e737ec022610d756c0eae0b3b3a9037bccaf3003173a" +checksum = "d4d1d3b3dc4c101ac989fd7db77e045cc6d91a25349cd410455cb5c57d510c1c" dependencies = [ "anyhow", "bytes", + "cookie", "dirs", "dunce", "embed_plist", - "futures-util", - "getrandom 0.2.15", + "getrandom 0.3.1", "glob", "gtk", "heck 0.5.0", @@ -5019,6 +5122,8 @@ dependencies = [ "objc2 0.6.0", "objc2-app-kit", "objc2-foundation 0.3.0", + "objc2-ui-kit", + "objc2-web-kit", "percent-encoding", "plist", "raw-window-handle", @@ -5041,14 +5146,14 @@ dependencies = [ "webkit2gtk", "webview2-com", "window-vibrancy", - "windows", + "windows 0.61.3", ] [[package]] name = "tauri-build" -version = "2.2.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a0350f0df1db385ca5c02888a83e0e66655c245b7443db8b78a70da7d7f8fc" +checksum = "9c432ccc9ff661803dab74c6cd78de11026a578a9307610bbc39d3c55be7943f" dependencies = [ "anyhow", "cargo_toml", @@ -5062,15 +5167,15 @@ dependencies = [ "serde_json", "tauri-utils", "tauri-winres", - "toml", + "toml 0.9.5", "walkdir", ] [[package]] name = "tauri-codegen" -version = "2.1.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458258b19032450ccf975840116ecf013e539eadbb74420bd890e8c56ab2b1a4" +checksum = "1ab3a62cf2e6253936a8b267c2e95839674e7439f104fa96ad0025e149d54d8a" dependencies = [ "base64 0.22.1", "brotli", @@ -5095,9 +5200,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.1.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d402813d3b9c773a0fa58697c457c771f10e735498fdcb7b343264d18e5a601f" +checksum = "4368ea8094e7045217edb690f493b55b30caf9f3e61f79b4c24b6db91f07995e" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -5109,9 +5214,9 @@ dependencies = [ [[package]] name = "tauri-plugin" -version = "2.1.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4190775d6ff73fe66d9af44c012739a2659720efd9c0e1e56a918678038699d" +checksum = "9946a3cede302eac0c6eb6c6070ac47b1768e326092d32efbb91f21ed58d978f" dependencies = [ "anyhow", "glob", @@ -5120,7 +5225,7 @@ dependencies = [ "serde", "serde_json", "tauri-utils", - "toml", + "toml 0.9.5", "walkdir", ] @@ -5141,14 +5246,14 @@ dependencies = [ "tracing", "url", "windows-registry 0.5.1", - "windows-result 0.3.2", + "windows-result 0.3.4", ] [[package]] name = "tauri-plugin-dialog" -version = "2.2.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcaf6e5d6062423a0f711a23c2a573ccba222b6a16a9322d8499928f27e41376" +checksum = "0beee42a4002bc695550599b011728d9dfabf82f767f134754ed6655e434824e" dependencies = [ "log", "raw-window-handle", @@ -5164,9 +5269,9 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" -version = "2.2.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88371e340ad2f07409a3b68294abe73f20bc9c1bc1b631a31dc37a3d0161f682" +checksum = "315784ec4be45e90a987687bae7235e6be3d6e9e350d2b75c16b8a4bf22c1db7" dependencies = [ "anyhow", "dunce", @@ -5180,9 +5285,8 @@ dependencies = [ "tauri-plugin", "tauri-utils", "thiserror 2.0.11", - "toml", + "toml 0.9.5", "url", - "uuid", ] [[package]] @@ -5225,15 +5329,15 @@ dependencies = [ "tauri-plugin", "thiserror 2.0.11", "url", - "windows", + "windows 0.60.0", "zbus", ] [[package]] name = "tauri-plugin-os" -version = "2.2.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "424f19432397850c2ddd42aa58078630c15287bbce3866eb1d90e7dbee680637" +checksum = "77a1c77ebf6f20417ab2a74e8c310820ba52151406d0c80fbcea7df232e3f6ba" dependencies = [ "gethostname", "log", @@ -5293,29 +5397,34 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.5.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00ada7ac2f9276f09b8c3afffd3215fd5d9bff23c22df8a7c70e7ef67cacd532" +checksum = "d4cfc9ad45b487d3fded5a4731a567872a4812e9552e3964161b08edabf93846" dependencies = [ "cookie", "dpi", "gtk", "http", "jni", + "objc2 0.6.0", + "objc2-ui-kit", + "objc2-web-kit", "raw-window-handle", "serde", "serde_json", "tauri-utils", "thiserror 2.0.11", "url", - "windows", + "webkit2gtk", + "webview2-com", + "windows 0.61.3", ] [[package]] name = "tauri-runtime-wry" -version = "2.5.1" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2e5842c57e154af43a20a49c7efee0ce2578c20b4c2bdf266852b422d2e421" +checksum = "c1fe9d48bd122ff002064e88cfcd7027090d789c4302714e68fcccba0f4b7807" dependencies = [ "gtk", "http", @@ -5334,15 +5443,15 @@ dependencies = [ "url", "webkit2gtk", "webview2-com", - "windows", + "windows 0.61.3", "wry", ] [[package]] name = "tauri-utils" -version = "2.4.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2900399c239a471bcff7f15c4399eb1a8c4fe511ba2853e07c996d771a5e0a4" +checksum = "41a3852fdf9a4f8fbeaa63dc3e9a85284dd6ef7200751f0bd66ceee30c93f212" dependencies = [ "anyhow", "brotli", @@ -5369,7 +5478,7 @@ dependencies = [ "serde_with", "swift-rs", "thiserror 2.0.11", - "toml", + "toml 0.9.5", "url", "urlpattern", "uuid", @@ -5383,7 +5492,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56eaa45f707bedf34d19312c26d350bc0f3c59a47e58e8adbeecdc850d2c13a0" dependencies = [ "embed-resource", - "toml", + "toml 0.8.20", ] [[package]] @@ -5410,12 +5519,6 @@ dependencies = [ "utf-8", ] -[[package]] -name = "thin-slice" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" - [[package]] name = "thiserror" version = "1.0.69" @@ -5472,7 +5575,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", - "itoa 1.0.14", + "itoa", "libc", "num-conv", "num_threads", @@ -5604,11 +5707,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" dependencies = [ "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.8", + "toml_datetime 0.6.8", "toml_edit 0.22.24", ] +[[package]] +name = "toml" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75129e1dc5000bfbaa9fee9d1b21f974f9fbad9daec557a521ee6e080825f6e8" +dependencies = [ + "indexmap 2.7.1", + "serde", + "serde_spanned 1.0.0", + "toml_datetime 0.7.0", + "toml_parser", + "toml_writer", + "winnow 0.7.13", +] + [[package]] name = "toml_datetime" version = "0.6.8" @@ -5618,6 +5736,15 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +dependencies = [ + "serde", +] + [[package]] name = "toml_edit" version = "0.19.15" @@ -5625,7 +5752,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.7.1", - "toml_datetime", + "toml_datetime 0.6.8", "winnow 0.5.40", ] @@ -5636,7 +5763,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ "indexmap 2.7.1", - "toml_datetime", + "toml_datetime 0.6.8", "winnow 0.5.40", ] @@ -5648,11 +5775,26 @@ checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ "indexmap 2.7.1", "serde", - "serde_spanned", - "toml_datetime", - "winnow 0.7.2", + "serde_spanned 0.6.8", + "toml_datetime 0.6.8", + "winnow 0.7.13", +] + +[[package]] +name = "toml_parser" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10" +dependencies = [ + "winnow 0.7.13", ] +[[package]] +name = "toml_writer" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" + [[package]] name = "tower" version = "0.5.2" @@ -5765,9 +5907,9 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.20.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d433764348e7084bad2c5ea22c96c71b61b17afe3a11645710f533bd72b6a2b5" +checksum = "a0d92153331e7d02ec09137538996a7786fe679c629c279e82a6be762b7e6fe2" dependencies = [ "crossbeam-channel", "dirs", @@ -5797,6 +5939,15 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "type1-encoding-parser" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3d6cc09e1a99c7e01f2afe4953789311a1c50baebbdac5b477ecf78e2e92a5b" +dependencies = [ + "pom", +] + [[package]] name = "typeid" version = "1.0.2" @@ -5867,6 +6018,15 @@ version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-segmentation" version = "1.12.0" @@ -6202,15 +6362,15 @@ dependencies = [ [[package]] name = "webview2-com" -version = "0.36.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0d606f600e5272b514dbb66539dd068211cc20155be8d3958201b4b5bd79ed3" +checksum = "d4ba622a989277ef3886dd5afb3e280e3dd6d974b766118950a08f8f678ad6a4" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows", - "windows-core 0.60.1", - "windows-implement", + "windows 0.61.3", + "windows-core 0.61.2", + "windows-implement 0.60.0", "windows-interface", ] @@ -6227,15 +6387,21 @@ dependencies = [ [[package]] name = "webview2-com-sys" -version = "0.36.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb27fccd3c27f68e9a6af1bcf48c2d82534b8675b83608a4d81446d095a17ac" +checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" dependencies = [ "thiserror 2.0.11", - "windows", - "windows-core 0.60.1", + "windows 0.61.3", + "windows-core 0.61.2", ] +[[package]] +name = "weezl" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" + [[package]] name = "winapi" version = "0.3.9" @@ -6288,11 +6454,24 @@ version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddf874e74c7a99773e62b1c671427abf01a425e77c3d3fb9fb1e4883ea934529" dependencies = [ - "windows-collections", + "windows-collections 0.1.1", "windows-core 0.60.1", - "windows-future", + "windows-future 0.1.1", "windows-link", - "windows-numerics", + "windows-numerics 0.1.1", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections 0.2.0", + "windows-core 0.61.2", + "windows-future 0.2.1", + "windows-link", + "windows-numerics 0.2.0", ] [[package]] @@ -6304,6 +6483,15 @@ dependencies = [ "windows-core 0.60.1", ] +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + [[package]] name = "windows-core" version = "0.52.0" @@ -6319,13 +6507,26 @@ version = "0.60.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca21a92a9cae9bf4ccae5cf8368dce0837100ddf6e6d57936749e85f152f6247" dependencies = [ - "windows-implement", + "windows-implement 0.59.0", "windows-interface", "windows-link", - "windows-result 0.3.2", + "windows-result 0.3.4", "windows-strings 0.3.1", ] +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement 0.60.0", + "windows-interface", + "windows-link", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + [[package]] name = "windows-future" version = "0.1.1" @@ -6336,6 +6537,17 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link", + "windows-threading", +] + [[package]] name = "windows-implement" version = "0.59.0" @@ -6347,6 +6559,17 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "windows-interface" version = "0.59.1" @@ -6360,9 +6583,9 @@ dependencies = [ [[package]] name = "windows-link" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-numerics" @@ -6374,6 +6597,16 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link", +] + [[package]] name = "windows-registry" version = "0.2.0" @@ -6392,8 +6625,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad1da3e436dc7653dfdf3da67332e22bff09bb0e28b0239e1624499c7830842e" dependencies = [ "windows-link", - "windows-result 0.3.2", - "windows-strings 0.4.0", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] @@ -6407,9 +6640,9 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ "windows-link", ] @@ -6435,9 +6668,9 @@ dependencies = [ [[package]] name = "windows-strings" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ "windows-link", ] @@ -6478,6 +6711,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -6526,10 +6768,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.0" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -6540,13 +6783,22 @@ dependencies = [ "windows_x86_64_msvc 0.53.0", ] +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-version" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c12476c23a74725c539b24eae8bfc0dac4029c39cdb561d9f23616accd4ae26d" dependencies = [ - "windows-targets 0.53.0", + "windows-targets 0.53.3", ] [[package]] @@ -6740,9 +6992,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.2" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] @@ -6780,14 +7032,15 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wry" -version = "0.50.5" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b19b78efae8b853c6c817e8752fc1dbf9cab8a8ffe9c30f399bd750ccf0f0730" +checksum = "31f0e9642a0d061f6236c54ccae64c2722a7879ad4ec7dff59bd376d446d8e90" dependencies = [ "base64 0.22.1", "block2 0.6.0", "cookie", "crossbeam-channel", + "dirs", "dpi", "dunce", "gdkx11", @@ -6816,8 +7069,8 @@ dependencies = [ "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows", - "windows-core 0.60.1", + "windows 0.61.3", + "windows-core 0.61.2", "windows-version", "x11-dl", ] @@ -6961,7 +7214,7 @@ dependencies = [ "tracing", "uds_windows", "windows-sys 0.59.0", - "winnow 0.7.2", + "winnow 0.7.13", "xdg-home", "zbus_macros", "zbus_names", @@ -6991,7 +7244,7 @@ checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" dependencies = [ "serde", "static_assertions", - "winnow 0.7.2", + "winnow 0.7.13", "zvariant", ] @@ -7123,7 +7376,7 @@ dependencies = [ "serde", "static_assertions", "url", - "winnow 0.7.2", + "winnow 0.7.13", "zvariant_derive", "zvariant_utils", ] @@ -7152,5 +7405,5 @@ dependencies = [ "serde", "static_assertions", "syn 2.0.98", - "winnow 0.7.2", + "winnow 0.7.13", ] diff --git a/frontend/src-tauri/Cargo.toml b/frontend/src-tauri/Cargo.toml index e3f77a3cc..f8837b511 100644 --- a/frontend/src-tauri/Cargo.toml +++ b/frontend/src-tauri/Cargo.toml @@ -15,16 +15,16 @@ name = "app_lib" crate-type = ["staticlib", "cdylib", "rlib"] [build-dependencies] -tauri-build = { version = "2.2.0", features = [] } +tauri-build = { version = "2.4.1", features = [] } [dependencies] serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } log = "0.4" -tauri = { version = "2.4.1", features = [] } +tauri = { version = "2.8", features = [] } tauri-plugin-log = "2.3.1" tauri-plugin-updater = "2.7.0" -tauri-plugin-dialog = "2.2.1" +tauri-plugin-dialog = "2.4" tauri-plugin = "2.1.1" tauri-plugin-deep-link = "2" tauri-plugin-opener = "2" @@ -33,6 +33,8 @@ tauri-plugin-sign-in-with-apple = "1.0.2" tokio = { version = "1.0", features = ["net", "sync", "rt-multi-thread", "macros", "time"] } once_cell = "1.18.0" maple-proxy = "0.1.2" -tauri-plugin-fs = "2" +tauri-plugin-fs = "2.4" anyhow = "1.0" axum = "0.8" +pdf-extract = "0.7" +base64 = "0.22" diff --git a/frontend/src-tauri/capabilities/default.json b/frontend/src-tauri/capabilities/default.json index d30e3e95c..d3d3ad810 100644 --- a/frontend/src-tauri/capabilities/default.json +++ b/frontend/src-tauri/capabilities/default.json @@ -8,6 +8,7 @@ "permissions": [ "core:default", "updater:default", + "dialog:default", "fs:default", { "identifier": "fs:allow-read-file", diff --git a/frontend/src-tauri/capabilities/mobile-ios.json b/frontend/src-tauri/capabilities/mobile-ios.json index 6adf773ba..283d8ae87 100644 --- a/frontend/src-tauri/capabilities/mobile-ios.json +++ b/frontend/src-tauri/capabilities/mobile-ios.json @@ -9,6 +9,7 @@ "permissions": [ "core:default", "updater:default", + "dialog:default", { "identifier": "opener:allow-open-url", "allow": [ @@ -31,4 +32,4 @@ }, "sign-in-with-apple:default" ] -} \ No newline at end of file +} diff --git a/frontend/src-tauri/src/lib.rs b/frontend/src-tauri/src/lib.rs index 6de9bde36..aece2ebee 100644 --- a/frontend/src-tauri/src/lib.rs +++ b/frontend/src-tauri/src/lib.rs @@ -3,6 +3,7 @@ use tauri_plugin_deep_link::DeepLinkExt; use tauri_plugin_opener; mod proxy; +mod pdf_extractor; // This handles incoming deep links fn handle_deep_link_event(url: &str, app: &tauri::AppHandle) { @@ -32,6 +33,7 @@ pub fn run() { proxy::load_proxy_config, proxy::save_proxy_settings, proxy::test_proxy_port, + pdf_extractor::extract_document_content, ]) .setup(|app| { // Initialize proxy auto-start @@ -227,9 +229,11 @@ pub fn run() { .level(log::LevelFilter::Info) .build(), ) + .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_deep_link::init()) .plugin(tauri_plugin_opener::init()) - .plugin(tauri_plugin_os::init()); + .plugin(tauri_plugin_os::init()) + .plugin(tauri_plugin_fs::init()); // Only add the Apple Sign In plugin on iOS #[cfg(all(not(desktop), target_os = "ios"))] @@ -239,6 +243,9 @@ pub fn run() { #[cfg(not(desktop))] let app = builder + .invoke_handler(tauri::generate_handler![ + pdf_extractor::extract_document_content, + ]) .setup(|app| { // Set up the deep link handler for mobile let app_handle = app.handle().clone(); diff --git a/frontend/src-tauri/src/pdf_extractor.rs b/frontend/src-tauri/src/pdf_extractor.rs new file mode 100644 index 000000000..243e52671 --- /dev/null +++ b/frontend/src-tauri/src/pdf_extractor.rs @@ -0,0 +1,51 @@ +use base64::{engine::general_purpose::STANDARD as BASE64, Engine}; +use pdf_extract::extract_text_from_mem; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct DocumentData { + pub filename: String, + pub text_content: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct DocumentResponse { + pub document: DocumentData, + pub status: String, +} + +#[tauri::command] +pub async fn extract_document_content( + file_base64: String, + filename: String, + file_type: String +) -> Result { + // Decode base64 file data + let file_bytes = BASE64 + .decode(&file_base64) + .map_err(|e| format!("Failed to decode base64 file: {}", e))?; + + let text_content = match file_type.as_str() { + "pdf" | "application/pdf" => { + // Extract text from PDF + extract_text_from_mem(&file_bytes) + .map_err(|e| format!("Failed to extract text from PDF: {}", e))? + }, + "txt" | "text/plain" | "md" | "text/markdown" => { + // For text files, just convert bytes to string + String::from_utf8(file_bytes) + .map_err(|e| format!("Failed to decode text file: {}", e))? + }, + _ => { + return Err(format!("Unsupported file type: {}", file_type)); + } + }; + + Ok(DocumentResponse { + document: DocumentData { + filename, + text_content, + }, + status: "completed".to_string(), + }) +} \ No newline at end of file diff --git a/frontend/src/components/ChatBox.tsx b/frontend/src/components/ChatBox.tsx index a046d71d5..8a937f753 100644 --- a/frontend/src/components/ChatBox.tsx +++ b/frontend/src/components/ChatBox.tsx @@ -20,16 +20,18 @@ import { encode } from "gpt-tokenizer"; interface ParsedDocument { document: { filename: string; - md_content: string | null; - json_content: string | null; - html_content: string | null; text_content: string | null; - doctags_content: string | null; }; status: string; errors: unknown[]; - processing_time: number; - timings: Record; +} + +interface RustDocumentResponse { + document: { + filename: string; + text_content: string; + }; + status: string; } // Accurate token counting using gpt-tokenizer @@ -238,10 +240,11 @@ export default function Component({ const [isUploadingDocument, setIsUploadingDocument] = useState(false); const [documentError, setDocumentError] = useState(null); const [imageError, setImageError] = useState(null); + const [isTauriEnv, setIsTauriEnv] = useState(false); const fileInputRef = useRef(null); const documentInputRef = useRef(null); const [upgradeDialogOpen, setUpgradeDialogOpen] = useState(false); - const [upgradeFeature, setUpgradeFeature] = useState<"image" | "voice">("image"); + const [upgradeFeature, setUpgradeFeature] = useState<"image" | "voice" | "document">("image"); const os = useOpenSecret(); // Audio recording state @@ -286,7 +289,7 @@ export default function Component({ if (!e.target.files) return; const supportedTypes = ["image/jpeg", "image/jpg", "image/png", "image/webp"]; - const maxSizeInBytes = 5 * 1024 * 1024; // 5MB for images + const maxSizeInBytes = 10 * 1024 * 1024; // 10MB for images const errors: string[] = []; const validFiles = Array.from(e.target.files).filter((file) => { @@ -310,7 +313,7 @@ export default function Component({ const typeErrors = e.target.files.length - validFiles.length - errors.length; if (errors.length > 0) { - setImageError(`${errors.join(", ")}. Max size is 5MB per image.`); + setImageError(`${errors.join(", ")}. Max size is 10MB per image.`); } else if (typeErrors > 0) { setImageError( `${skippedCount} file(s) skipped. Only JPEG, PNG, and WebP images are supported.` @@ -364,16 +367,10 @@ export default function Component({ const parsedDocument: ParsedDocument = { document: { filename: file.name, - md_content: null, - json_content: null, - html_content: null, - text_content: content, - doctags_content: null + text_content: content }, status: "completed", - errors: [], - processing_time: 0, - timings: {} + errors: [] }; resolve(parsedDocument); @@ -392,11 +389,11 @@ export default function Component({ const file = e.target.files[0]; - // Check file size (5MB limit = 1024 * 1024 bytes) - const maxSizeInBytes = 5 * 1024 * 1024; // 5MB + // Check file size (10MB limit for local processing) + const maxSizeInBytes = 10 * 1024 * 1024; // 10MB if (file.size > maxSizeInBytes) { const sizeInMB = (file.size / (1024 * 1024)).toFixed(2); - setDocumentError(`File too large (${sizeInMB}MB). Maximum size is 5MB.`); + setDocumentError(`File too large (${sizeInMB}MB). Maximum size is 10MB.`); e.target.value = ""; // Reset input return; } @@ -408,46 +405,90 @@ export default function Component({ let parsed: ParsedDocument; let result: DocumentResponse | undefined; - // Check if it's a text file (.txt or .md) - if (file.type === "text/plain" || file.name.endsWith(".txt") || file.name.endsWith(".md")) { - // Process text files locally + // Use the existing isTauriEnv state instead of checking again + if ( + isTauriEnv && + (file.type === "application/pdf" || + file.name.endsWith(".pdf") || + file.type === "text/plain" || + file.name.endsWith(".txt") || + file.name.endsWith(".md")) + ) { + // Process documents locally using Rust in Tauri + const { invoke } = await import("@tauri-apps/api/core"); + + // Convert file to base64 + const reader = new FileReader(); + const base64Data = await new Promise((resolve, reject) => { + reader.onload = () => { + const base64 = (reader.result as string).split(",")[1]; // Remove data:type;base64, prefix + resolve(base64); + }; + reader.onerror = reject; + reader.readAsDataURL(file); + }); + + // Determine file type + let fileType = file.type; + if (file.name.endsWith(".pdf")) fileType = "pdf"; + else if (file.name.endsWith(".txt")) fileType = "txt"; + else if (file.name.endsWith(".md")) fileType = "md"; + + // Call Rust function to extract content + const rustResponse = await invoke("extract_document_content", { + fileBase64: base64Data, + filename: file.name, + fileType: fileType + }); + + // Convert Rust response to ParsedDocument format + parsed = { + document: { + filename: rustResponse.document.filename, + text_content: rustResponse.document.text_content + }, + status: rustResponse.status, + errors: [] + }; + } else if ( + file.type === "text/plain" || + file.name.endsWith(".txt") || + file.name.endsWith(".md") + ) { + // Process text files locally in browser parsed = await processTextFileLocally(file); } else { - // Upload other document types to the processing endpoint - result = await os.uploadDocumentWithPolling(file); - // Parse the JSON response - parsed = JSON.parse(result.text) as ParsedDocument; + // PDF files in browser are not supported without Tauri + setDocumentError("PDF files can only be processed in the desktop app"); + e.target.value = ""; // Reset input + return; + // REMOVED: Cloud API fallback for document processing + // result = await os.uploadDocumentWithPolling(file); + // parsed = JSON.parse(result.text) as ParsedDocument; } - // Extract content with fallbacks (currently not used since we pass the full JSON) - // const content = - // parsed.document.md_content || - // parsed.document.json_content || - // parsed.document.html_content || - // parsed.document.text_content || - // parsed.document.doctags_content || - // ""; + // Extract content + // const content = parsed.document.text_content || ""; - // Create a cleaned version of the parsed document with image tags stripped from md_content + // Create a cleaned version of the parsed document const cleanedParsed = { ...parsed, document: { ...parsed.document, - md_content: parsed.document.md_content - ? parsed.document.md_content.replace(/!\[Image\]\([^)]+\)/g, "") - : parsed.document.md_content + text_content: parsed.document.text_content + ? parsed.document.text_content.replace(/!\[Image\]\([^)]+\)/g, "") + : parsed.document.text_content } }; - // For locally processed text files, create a mock original response - const originalResponse = - file.type === "text/plain" || file.name.endsWith(".txt") || file.name.endsWith(".md") - ? ({ - text: JSON.stringify(parsed), - filename: file.name, - size: file.size - } as DocumentResponse) - : result!; + // Always provide a valid original-like payload; Tauri-local paths have no server result + const originalResponse: DocumentResponse = + result ?? + ({ + text: JSON.stringify(parsed), + filename: file.name, + size: file.size + } as DocumentResponse); setUploadedDocument({ original: originalResponse, @@ -458,7 +499,7 @@ export default function Component({ console.error("Document upload failed:", error); if (error instanceof Error) { if (error.message.includes("exceeds maximum limit")) { - setDocumentError("File too large. Maximum size is 5MB."); + setDocumentError("File too large. Maximum size is 10MB."); } else if (error.message.includes("401")) { setDocumentError("Authentication required. Please log in to upload documents."); } else if (error.message.includes("403")) { @@ -603,13 +644,7 @@ export default function Component({ uploadedDocument ? { filename: uploadedDocument.parsed.document.filename, - fullContent: - uploadedDocument.parsed.document.md_content || - uploadedDocument.parsed.document.json_content || - uploadedDocument.parsed.document.html_content || - uploadedDocument.parsed.document.text_content || - uploadedDocument.parsed.document.doctags_content || - "" + fullContent: uploadedDocument.parsed.document.text_content || "" } : undefined, true // sentViaVoice flag @@ -700,6 +735,14 @@ export default function Component({ // Use the centralized hook for mobile detection directly const isMobile = useIsMobile(); + // Check if we're in Tauri environment on component mount + useEffect(() => { + import("@tauri-apps/api/core") + .then((m) => m.isTauri()) + .then(setIsTauriEnv) + .catch(() => setIsTauriEnv(false)); + }, []); + // Check if user can use system prompts (paid users only - exclude free plans) const canUseSystemPrompt = freshBillingStatus && !freshBillingStatus.product_name?.toLowerCase().includes("free"); @@ -724,6 +767,7 @@ export default function Component({ const canUseImages = hasStarterAccess; const canUseVoice = hasProTeamAccess; + const canUseDocuments = hasProTeamAccess; const handleSubmit = (e?: React.FormEvent) => { e?.preventDefault(); @@ -750,17 +794,11 @@ export default function Component({ inputValue.trim(), isFirstMessage ? systemPromptValue.trim() || undefined : undefined, images, - uploadedDocument?.cleanedText, // Now contains the full JSON with cleaned md_content + uploadedDocument?.cleanedText, // Now contains the full JSON with cleaned text_content uploadedDocument ? { filename: uploadedDocument.parsed.document.filename, - fullContent: - uploadedDocument.parsed.document.md_content || - uploadedDocument.parsed.document.json_content || - uploadedDocument.parsed.document.html_content || - uploadedDocument.parsed.document.text_content || - uploadedDocument.parsed.document.doctags_content || - "" + fullContent: uploadedDocument.parsed.document.text_content || "" } : undefined ); @@ -1150,7 +1188,7 @@ export default function Component({ /> )} + {/* Document upload button - only show in Tauri environments */} + {!uploadedDocument && isTauriEnv && ( + + )} + {/* Microphone button - show if whisper model is available */} {hasWhisperModel && (