diff --git a/.vscode/settings.json b/.vscode/settings.json index dfcf7bc7..a2d168d4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,6 +14,7 @@ "dyld", "elif", "errmsg", + "frontmost", "fullscreen", "fulltext", "headlessui", @@ -40,6 +41,7 @@ "nowrap", "nspanel", "nsstring", + "objc", "overscan", "partialize", "patchelf", diff --git a/docs/content.en/docs/release-notes/_index.md b/docs/content.en/docs/release-notes/_index.md index 93a37bf9..2b3a75af 100644 --- a/docs/content.en/docs/release-notes/_index.md +++ b/docs/content.en/docs/release-notes/_index.md @@ -13,6 +13,7 @@ Information about release notes of Coco App is provided here. ### 🚀 Features +- feat: add selection toolbar window for mac #980 - feat: add a heartbeat worker to check Coco server availability #988 ### 🐛 Bug fix diff --git a/package.json b/package.json index a8933ae9..da6f1407 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,11 @@ }, "dependencies": { "@headlessui/react": "^2.2.2", + "@radix-ui/react-separator": "^1.1.8", "@radix-ui/react-slot": "^1.2.3", "@tauri-apps/api": "^2.5.0", "@tauri-apps/plugin-autostart": "~2.2.0", + "@tauri-apps/plugin-clipboard-manager": "~2.3.2", "@tauri-apps/plugin-deep-link": "^2.2.1", "@tauri-apps/plugin-dialog": "^2.2.1", "@tauri-apps/plugin-global-shortcut": "~2.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0cf3f128..26529e98 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@headlessui/react': specifier: ^2.2.2 version: 2.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-separator': + specifier: ^1.1.8 + version: 1.1.8(@types/react-dom@18.3.7(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': specifier: ^1.2.3 version: 1.2.3(@types/react@18.3.26)(react@18.3.1) @@ -20,6 +23,9 @@ importers: '@tauri-apps/plugin-autostart': specifier: ~2.2.0 version: 2.2.0 + '@tauri-apps/plugin-clipboard-manager': + specifier: ~2.3.2 + version: 2.3.2 '@tauri-apps/plugin-deep-link': specifier: ^2.2.1 version: 2.4.5 @@ -1029,6 +1035,32 @@ packages: '@types/react': optional: true + '@radix-ui/react-primitive@2.1.4': + resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.8': + resolution: {integrity: sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-slot@1.2.3': resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} peerDependencies: @@ -1038,6 +1070,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-slot@1.2.4': + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@react-aria/focus@3.20.2': resolution: {integrity: sha512-Q3rouk/rzoF/3TuH6FzoAIKrl+kzZi9LHmr8S5EqLAOyP9TXIKG34x2j42dZsAhrw7TbF9gA8tBKwnCNH4ZV+Q==} peerDependencies: @@ -1286,6 +1327,9 @@ packages: '@tauri-apps/plugin-autostart@2.2.0': resolution: {integrity: sha512-TzVcDZdOvdot0avkpstUWJKKEl4cyxLpFB9DZZRW5zH8k+Bv8IVJmO0zyYuw+7oKlGdHOINbD/7Je7GHMViw5w==} + '@tauri-apps/plugin-clipboard-manager@2.3.2': + resolution: {integrity: sha512-CUlb5Hqi2oZbcZf4VUyUH53XWPPdtpw43EUpCza5HWZJwxEoDowFzNUDt1tRUXA8Uq+XPn17Ysfptip33sG4eQ==} + '@tauri-apps/plugin-deep-link@2.4.5': resolution: {integrity: sha512-Zf2RTj1D9IQQ45/jqW8XTKvql24HqlPjcpv0mV/O2jHQkNe11HOTZBVj6IK37qs+MWV7xZzcmazx/QVZnhAwaQ==} @@ -4553,6 +4597,24 @@ snapshots: optionalDependencies: '@types/react': 18.3.26 + '@radix-ui/react-primitive@2.1.4(@types/react-dom@18.3.7(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.2.4(@types/react@18.3.26)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.26 + '@types/react-dom': 18.3.7(@types/react@18.3.26) + + '@radix-ui/react-separator@1.1.8(@types/react-dom@18.3.7(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@18.3.7(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.26 + '@types/react-dom': 18.3.7(@types/react@18.3.26) + '@radix-ui/react-slot@1.2.3(@types/react@18.3.26)(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.26)(react@18.3.1) @@ -4560,6 +4622,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.26 + '@radix-ui/react-slot@1.2.4(@types/react@18.3.26)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.26)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.26 + '@react-aria/focus@3.20.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@react-aria/interactions': 3.25.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -4746,6 +4815,10 @@ snapshots: dependencies: '@tauri-apps/api': 2.9.0 + '@tauri-apps/plugin-clipboard-manager@2.3.2': + dependencies: + '@tauri-apps/api': 2.9.0 + '@tauri-apps/plugin-deep-link@2.4.5': dependencies: '@tauri-apps/api': 2.9.0 diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 3824653e..1ca41a03 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "bytes", "futures-core", "futures-sink", @@ -29,7 +29,7 @@ dependencies = [ "actix-service", "actix-utils", "actix-web", - "bitflags 2.9.4", + "bitflags 2.10.0", "bytes", "derive_more 2.0.1", "futures-core", @@ -53,7 +53,7 @@ dependencies = [ "actix-service", "actix-utils", "base64 0.22.1", - "bitflags 2.9.4", + "bitflags 2.10.0", "brotli", "bytes", "bytestring", @@ -88,7 +88,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -127,7 +127,7 @@ dependencies = [ "actix-utils", "futures-core", "futures-util", - "mio 1.0.4", + "mio 1.1.0", "socket2 0.5.10", "tokio", "tracing", @@ -155,9 +155,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.11.0" +version = "4.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a597b77b5c6d6a1e1097fddde329a83665e25c5437c696a3a9a4aa514a614dea" +checksum = "2233f53f6cb18ae038ce1f0713ca0c72ca0c4b71fe9aaeb59924ce2c89c6dd85" dependencies = [ "actix-codec", "actix-http", @@ -190,7 +190,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.5.10", + "socket2 0.6.1", "time", "tracing", "url", @@ -205,16 +205,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.106", -] - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", + "syn 2.0.111", ] [[package]] @@ -252,7 +243,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.3.3", + "getrandom 0.3.4", "once_cell", "version_check", "zerocopy", @@ -260,13 +251,22 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] +[[package]] +name = "aligned" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "377e4c0ba83e4431b10df45c1d4666f178ea9c552cac93e60c3a88bf32785923" +dependencies = [ + "as-slice", +] + [[package]] name = "aligned-vec" version = "0.6.4" @@ -362,6 +362,27 @@ dependencies = [ "derive_arbitrary", ] +[[package]] +name = "arboard" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" +dependencies = [ + "clipboard-win", + "image", + "log", + "objc2 0.6.3", + "objc2-app-kit 0.3.1", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.2", + "parking_lot", + "percent-encoding", + "windows-sys 0.60.2", + "wl-clipboard-rs", + "x11rb", +] + [[package]] name = "arg_enum_proc_macro" version = "0.3.4" @@ -370,7 +391,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -379,6 +400,15 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "ashpd" version = "0.11.0" @@ -451,9 +481,9 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix", + "rustix 1.1.2", "slab", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -482,7 +512,7 @@ dependencies = [ "cfg-if", "event-listener", "futures-lite", - "rustix", + "rustix 1.1.2", ] [[package]] @@ -493,7 +523,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -508,10 +538,10 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix", + "rustix 1.1.2", "signal-hook-registry", "slab", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -528,7 +558,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -578,15 +608,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] -name = "av1-grain" -version = "0.2.4" +name = "av-scenechange" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3efb2ca85bc610acfa917b5aaa36f3fcbebed5b3182d7f877b02531c4b80c8" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +dependencies = [ + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey", + "rayon", + "thiserror 2.0.17", + "v_frame", + "y4m", +] + +[[package]] +name = "av1-grain" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" dependencies = [ "anyhow", "arrayvec", "log", - "nom 7.1.3", + "nom 8.0.0", "num-rational", "v_frame", ] @@ -600,21 +650,6 @@ dependencies = [ "arrayvec", ] -[[package]] -name = "backtrace" -version = "0.3.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - [[package]] name = "base64" version = "0.13.1" @@ -639,7 +674,7 @@ version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -650,7 +685,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -667,18 +702,21 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.4" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" dependencies = [ - "serde", + "serde_core", ] [[package]] name = "bitstream-io" -version = "2.6.0" +version = "4.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" +checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757" +dependencies = [ + "core2", +] [[package]] name = "bitvec" @@ -718,11 +756,11 @@ dependencies = [ [[package]] name = "block2" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" dependencies = [ - "objc2 0.6.2", + "objc2 0.6.3", ] [[package]] @@ -755,7 +793,7 @@ checksum = "b00f4d9b344db5782c18429dac7a9af047d522f1d9ba1617d715aaffbdc040d0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -778,7 +816,7 @@ dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -804,9 +842,9 @@ dependencies = [ [[package]] name = "built" -version = "0.7.7" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" +checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" [[package]] name = "bumpalo" @@ -816,11 +854,12 @@ checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "byte-unit" -version = "5.1.6" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cd29c3c585209b0cbc7309bfe3ed7efd8c84c21b7af29c8bfae908f8777174" +checksum = "8c6d47a4e2961fb8721bcfc54feae6455f2f64e7054f9bc67e875f0e77f4c58d" dependencies = [ "rust_decimal", + "schemars 1.1.0", "serde", "utf8-width", ] @@ -849,9 +888,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.23.2" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" [[package]] name = "byteorder" @@ -867,9 +906,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" dependencies = [ "serde", ] @@ -885,9 +924,9 @@ dependencies = [ [[package]] name = "bzip2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea8dcd42434048e4f7a304411d9273a411f647446c1234a65ce0554923f4cff" +checksum = "f3a53fac24f34a81bc9954b5d6cfce0c21e18ec6959f44f56e8e90e4bb7c346c" dependencies = [ "libbz2-rs-sys", ] @@ -898,7 +937,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cairo-sys-rs", "glib 0.18.5", "libc", @@ -919,9 +958,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1de8bc0aa9e9385ceb3bf0c152e3a9b9544f6c4a912c8ae504e80c1f0368603" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" dependencies = [ "serde_core", ] @@ -946,7 +985,7 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -956,14 +995,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" dependencies = [ "serde", - "toml 0.9.7", + "toml 0.9.8", ] [[package]] name = "cc" -version = "1.2.38" +version = "1.2.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" +checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07" dependencies = [ "find-msvc-tools", "jobserver", @@ -1009,19 +1048,19 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.20.3" +version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a2c5f3bf25ec225351aa1c8e230d04d880d3bd89dea133537dafad4ae291e5c" +checksum = "9acd0bdbbf4b2612d09f52ba61da432140cb10930354079d0d53fafc12968726" dependencies = [ "smallvec", - "target-lexicon 0.13.2", + "target-lexicon 0.13.3", ] [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -1058,7 +1097,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -1082,6 +1121,15 @@ dependencies = [ "libloading 0.8.9", ] +[[package]] +name = "clipboard-win" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +dependencies = [ + "error-code", +] + [[package]] name = "coco" version = "0.9.0" @@ -1094,7 +1142,7 @@ dependencies = [ "async-trait", "base64 0.13.1", "bindgen", - "bitflags 2.9.4", + "bitflags 2.10.0", "borrowme", "camino", "cfg-if", @@ -1108,18 +1156,19 @@ dependencies = [ "function_name", "futures", "futures-util", - "gio 0.21.2", - "glib 0.21.3", + "gio 0.21.4", + "glib 0.21.4", "hostname", "http 1.3.1", "hyper 0.14.32", - "indexmap 2.11.4", + "indexmap 2.12.1", "lazy_static", "log", + "macos-accessibility-client", "meval", "notify 5.2.0", "num2words", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit 0.3.1", "objc2-application-services", "objc2-core-foundation", @@ -1145,6 +1194,7 @@ dependencies = [ "tauri-build", "tauri-nspanel", "tauri-plugin-autostart", + "tauri-plugin-clipboard-manager", "tauri-plugin-deep-link", "tauri-plugin-dialog", "tauri-plugin-drag", @@ -1179,7 +1229,7 @@ dependencies = [ "walkdir", "which", "windows 0.61.3", - "windows-sys 0.61.0", + "windows-sys 0.61.2", "zip 4.6.1", ] @@ -1189,7 +1239,7 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad36507aeb7e16159dfe68db81ccc27571c3ccd4b76fb2fb72fc59e7a4b1b64c" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block", "cocoa-foundation", "core-foundation 0.10.1", @@ -1205,7 +1255,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81411967c50ee9a1fc11365f8c585f863a22a9697c89239c452292c40ba79b0d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block", "core-foundation 0.10.1", "core-graphics-types", @@ -1347,7 +1397,7 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.10.1", "core-graphics-types", "foreign-types 0.5.0", @@ -1360,11 +1410,20 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.10.1", "libc", ] +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + [[package]] name = "cpufeatures" version = "0.2.17" @@ -1425,9 +1484,9 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -1470,7 +1529,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -1480,7 +1539,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -1504,7 +1563,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -1515,7 +1574,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -1543,18 +1602,18 @@ dependencies = [ [[package]] name = "deflate64" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" +checksum = "26bf8fc351c5ed29b5c2f0cbbac1b209b74f60ecd62e675a998df72c49af5204" [[package]] name = "deranged" -version = "0.5.3" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] @@ -1565,7 +1624,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -1578,7 +1637,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -1598,7 +1657,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", "unicode-xid", ] @@ -1672,7 +1731,7 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.2", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -1687,10 +1746,10 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ - "bitflags 2.9.4", - "block2 0.6.1", + "bitflags 2.10.0", + "block2 0.6.2", "libc", - "objc2 0.6.2", + "objc2 0.6.3", ] [[package]] @@ -1701,7 +1760,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -1733,7 +1792,7 @@ checksum = "788160fb30de9cdd857af31c6a2675904b16ece8fc2737b2c7127ba368c9d0f4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -1747,9 +1806,9 @@ dependencies = [ [[package]] name = "document-features" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" dependencies = [ "litrs", ] @@ -1838,7 +1897,7 @@ dependencies = [ "cc", "memchr", "rustc_version", - "toml 0.9.7", + "toml 0.9.8", "vswhom", "winreg 0.55.0", ] @@ -1885,22 +1944,22 @@ dependencies = [ [[package]] name = "enum-ordinalize" -version = "4.3.0" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" dependencies = [ "enum-ordinalize-derive", ] [[package]] name = "enum-ordinalize-derive" -version = "4.3.1" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -1921,14 +1980,14 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "env_filter" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" dependencies = [ "log", "regex", @@ -1957,7 +2016,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -1968,9 +2027,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "259d404d09818dec19332e31d94558aeb442fea04c817006456c24b5460bbd4b" +checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" dependencies = [ "serde", "serde_core", @@ -1984,9 +2043,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] +[[package]] +name = "error-code" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" + [[package]] name = "event-listener" version = "5.4.1" @@ -2010,9 +2075,9 @@ dependencies = [ [[package]] name = "exr" -version = "1.73.0" +version = "1.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" dependencies = [ "bit_field", "half", @@ -2046,7 +2111,7 @@ checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -2106,15 +2171,21 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.2" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.1.2" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", "libz-rs-sys", @@ -2160,7 +2231,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -2191,7 +2262,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1998b5ee36700463150124ac6d6d6128a5a4da453a6f6777a26810f05539f41" dependencies = [ "freedesktop-icons", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -2323,7 +2394,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -2476,12 +2547,12 @@ dependencies = [ [[package]] name = "gethostname" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc257fdb4038301ce4b9cd1b3b51704509692bb3ff716a410cbd07925d9dae55" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" dependencies = [ - "rustix", - "windows-targets 0.52.6", + "rustix 1.1.2", + "windows-link 0.2.1", ] [[package]] @@ -2519,34 +2590,28 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasi 0.14.7+wasi-0.2.4", + "wasip2", "wasm-bindgen", ] [[package]] name = "gif" -version = "0.13.3" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" +checksum = "f954a9e9159ec994f73a30a12b96a702dde78f5547bcb561174597924f7d4162" dependencies = [ "color_quant", "weezl", ] -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - [[package]] name = "gio" version = "0.18.4" @@ -2585,16 +2650,16 @@ dependencies = [ [[package]] name = "gio" -version = "0.21.2" +version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed68efc12b748a771be2dccc49480d8584004382967c98323245fc3c38b74a42" +checksum = "daeff3dd716d1ba91850b976b76a1c2d28f99ef6c1602cd8fdaa8fab8017fd9c" dependencies = [ "futures-channel", "futures-core", "futures-io", "futures-util", "gio-sys 0.21.2", - "glib 0.21.3", + "glib 0.21.4", "libc", "pin-project-lite", "smallvec", @@ -2622,7 +2687,7 @@ dependencies = [ "glib-sys 0.20.10", "gobject-sys 0.20.10", "libc", - "system-deps 7.0.5", + "system-deps 7.0.7", "windows-sys 0.59.0", ] @@ -2635,8 +2700,8 @@ dependencies = [ "glib-sys 0.21.2", "gobject-sys 0.21.2", "libc", - "system-deps 7.0.5", - "windows-sys 0.61.0", + "system-deps 7.0.7", + "windows-sys 0.61.2", ] [[package]] @@ -2645,7 +2710,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "futures-channel", "futures-core", "futures-executor", @@ -2668,7 +2733,7 @@ version = "0.20.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffc4b6e352d4716d84d7dde562dd9aee2a7d48beb872dd9ece7f2d1515b2d683" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "futures-channel", "futures-core", "futures-executor", @@ -2685,18 +2750,18 @@ dependencies = [ [[package]] name = "glib" -version = "0.21.3" +version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1f2cbc4577536c849335878552f42086bfd25a8dcd6f54a18655cf818b20c8f" +checksum = "5b9dbecb1c33e483a98be4acfea2ab369e1c28f517c6eadb674537409c25c4b2" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "futures-channel", "futures-core", "futures-executor", "futures-task", "futures-util", "gio-sys 0.21.2", - "glib-macros 0.21.2", + "glib-macros 0.21.4", "glib-sys 0.21.2", "gobject-sys 0.21.2", "libc", @@ -2715,7 +2780,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -2728,20 +2793,20 @@ dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "glib-macros" -version = "0.21.2" +version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55eda916eecdae426d78d274a17b48137acdca6fba89621bd3705f2835bc719f" +checksum = "880e524e0085f3546cfb38532b2c202c0d64741d9977a6e4aa24704bfc9f19fb" dependencies = [ "heck 0.5.0", "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -2761,7 +2826,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ab79e1ed126803a8fb827e3de0e2ff95191912b8db65cee467edb56fc4cc215" dependencies = [ "libc", - "system-deps 7.0.5", + "system-deps 7.0.7", ] [[package]] @@ -2771,7 +2836,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d09d3d0fddf7239521674e57b0465dfbd844632fec54f059f7f56112e3f927e1" dependencies = [ "libc", - "system-deps 7.0.5", + "system-deps 7.0.7", ] [[package]] @@ -2788,11 +2853,11 @@ checksum = "b9247516746aa8e53411a0db9b62b0e24efbcf6a76e0ba73e5a91b512ddabed7" dependencies = [ "crossbeam-channel", "keyboard-types", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit 0.3.1", "once_cell", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", "windows-sys 0.59.0", "x11rb", "xkeysym", @@ -2817,7 +2882,7 @@ checksum = "ec9aca94bb73989e3cfdbf8f2e0f1f6da04db4d291c431f444838925c4c63eda" dependencies = [ "glib-sys 0.20.10", "libc", - "system-deps 7.0.5", + "system-deps 7.0.7", ] [[package]] @@ -2828,7 +2893,7 @@ checksum = "538e41d8776173ec107e7b0f2aceced60abc368d7e1d81c1f0e2ecd35f59080d" dependencies = [ "glib-sys 0.21.2", "libc", - "system-deps 7.0.5", + "system-deps 7.0.7", ] [[package]] @@ -2880,7 +2945,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -2895,7 +2960,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.11.4", + "indexmap 2.12.1", "slab", "tokio", "tokio-util", @@ -2914,7 +2979,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.11.4", + "indexmap 2.12.1", "slab", "tokio", "tokio-util", @@ -2923,12 +2988,13 @@ dependencies = [ [[package]] name = "half" -version = "2.6.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", + "zerocopy", ] [[package]] @@ -2952,9 +3018,18 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.0" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] name = "heck" @@ -3124,9 +3199,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ "atomic-waker", "bytes", @@ -3151,7 +3226,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ "http 1.3.1", - "hyper 1.7.0", + "hyper 1.8.1", "hyper-util", "rustls", "rustls-pki-types", @@ -3169,7 +3244,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.7.0", + "hyper 1.8.1", "hyper-util", "native-tls", "tokio", @@ -3179,9 +3254,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" dependencies = [ "base64 0.22.1", "bytes", @@ -3190,17 +3265,17 @@ dependencies = [ "futures-util", "http 1.3.1", "http-body 1.0.1", - "hyper 1.7.0", + "hyper 1.8.1", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.0", + "socket2 0.6.1", "system-configuration", "tokio", "tower-service", "tracing", - "windows-registry", + "windows-registry 0.6.1", ] [[package]] @@ -3215,7 +3290,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.62.0", + "windows-core 0.62.2", ] [[package]] @@ -3239,9 +3314,9 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", @@ -3252,9 +3327,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -3265,11 +3340,10 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -3280,42 +3354,38 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", "icu_locale_core", - "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", @@ -3352,9 +3422,9 @@ dependencies = [ [[package]] name = "image" -version = "0.25.8" +version = "0.25.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" +checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" dependencies = [ "bytemuck", "byteorder-lite", @@ -3370,8 +3440,8 @@ dependencies = [ "rayon", "rgb", "tiff", - "zune-core", - "zune-jpeg", + "zune-core 0.5.0", + "zune-jpeg 0.5.5", ] [[package]] @@ -3386,9 +3456,9 @@ dependencies = [ [[package]] name = "imgref" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" +checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" [[package]] name = "impl-more" @@ -3409,12 +3479,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.4" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.16.1", "serde", "serde_core", ] @@ -3454,7 +3524,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "inotify-sys", "libc", ] @@ -3485,18 +3555,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", -] - -[[package]] -name = "io-uring" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" -dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "libc", + "syn 2.0.111", ] [[package]] @@ -3507,9 +3566,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" dependencies = [ "memchr", "serde", @@ -3534,15 +3593,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.13.0" @@ -3618,15 +3668,15 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "libc", ] [[package]] name = "js-sys" -version = "0.3.80" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ "once_cell", "wasm-bindgen", @@ -3660,7 +3710,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "serde", "unicode-segmentation", ] @@ -3693,7 +3743,7 @@ checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" dependencies = [ "cssparser 0.29.6", "html5ever 0.29.1", - "indexmap 2.11.4", + "indexmap 2.12.1", "selectors 0.24.0", ] @@ -3747,9 +3797,9 @@ checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" [[package]] name = "libc" -version = "0.2.175" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libdbus-sys" @@ -3787,14 +3837,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] name = "liblzma" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10bf66f4598dc77ff96677c8e763655494f00ff9c1cf79e2eb5bb07bc31f807d" +checksum = "73c36d08cad03a3fbe2c4e7bb3a9e84c57e4ee4135ed0b065cade3d98480c648" dependencies = [ "liblzma-sys", ] @@ -3816,7 +3866,7 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "libc", "redox_syscall", ] @@ -3830,6 +3880,12 @@ dependencies = [ "zlib-rs", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + [[package]] name = "linux-raw-sys" version = "0.11.0" @@ -3838,15 +3894,15 @@ checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "litrs" -version = "0.4.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] name = "lnk" @@ -3881,11 +3937,10 @@ checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] @@ -3980,7 +4035,7 @@ checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -4001,15 +4056,15 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memmap2" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" +checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" dependencies = [ "libc", ] @@ -4084,21 +4139,21 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", "log", "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "moxcms" -version = "0.7.5" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd32fa8935aeadb8a8a6b6b351e40225570a37c43de67690383d87ef170cd08" +checksum = "0fbdd3d7436f8b5e892b8b7ea114271ff0fa00bc5acae845d53b07d498616ef6" dependencies = [ "num-traits", "pxfm", @@ -4114,14 +4169,14 @@ dependencies = [ "dpi", "gtk", "keyboard-types", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit 0.3.1", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "once_cell", "png 0.17.16", "serde", - "thiserror 2.0.16", + "thiserror 2.0.17", "windows-sys 0.60.2", ] @@ -4148,7 +4203,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "jni-sys", "log", "ndk-sys", @@ -4184,7 +4239,7 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cfg-if", "cfg_aliases", "libc", @@ -4246,13 +4301,13 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "fsevent-sys", "inotify 0.11.0", "kqueue", "libc", "log", - "mio 1.0.4", + "mio 1.1.0", "notify-types", "walkdir", "windows-sys 0.60.2", @@ -4314,7 +4369,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -4357,9 +4412,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" dependencies = [ "num_enum_derive", "rustversion", @@ -4367,14 +4422,14 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -4413,9 +4468,9 @@ dependencies = [ [[package]] name = "objc2" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561f357ba7f3a2a61563a186a163d0a3a5247e1089524a3981d49adb775078bc" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" dependencies = [ "objc2-encode", "objc2-exception-helper", @@ -4427,7 +4482,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -4443,17 +4498,17 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" dependencies = [ - "bitflags 2.9.4", - "block2 0.6.1", + "bitflags 2.10.0", + "block2 0.6.2", "libc", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-cloud-kit", - "objc2-core-data 0.3.1", + "objc2-core-data 0.3.2", "objc2-core-foundation", "objc2-core-graphics", - "objc2-core-image 0.3.1", - "objc2-foundation 0.3.1", - "objc2-quartz-core 0.3.1", + "objc2-core-image 0.3.2", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", ] [[package]] @@ -4462,24 +4517,24 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9abc05b1f757ebfbd72f4f3f9a515662c67dfe66b26e71b37d818f56a1c2f17" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "libc", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-core-foundation", "objc2-core-graphics", "objc2-core-services", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-cloud-kit" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.2", - "objc2-foundation 0.3.1", + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] @@ -4488,7 +4543,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4496,26 +4551,26 @@ dependencies = [ [[package]] name = "objc2-core-data" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.2", - "objc2-foundation 0.3.1", + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-core-foundation" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.9.4", - "block2 0.6.1", + "bitflags 2.10.0", + "block2 0.6.2", "dispatch2", "libc", - "objc2 0.6.2", + "objc2 0.6.3", ] [[package]] @@ -4524,14 +4579,14 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" dependencies = [ - "bitflags 2.9.4", - "block2 0.6.1", + "bitflags 2.10.0", + "block2 0.6.2", "dispatch2", "libc", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-core-foundation", "objc2-io-surface", - "objc2-metal 0.3.1", + "objc2-metal 0.3.2", ] [[package]] @@ -4548,22 +4603,22 @@ dependencies = [ [[package]] name = "objc2-core-image" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" dependencies = [ - "objc2 0.6.2", - "objc2-foundation 0.3.1", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-core-services" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "159be6e4cd366c7d236d798daa2aa71855230e5691cde045a0670ce01a06d664" +checksum = "583300ad934cba24ff5292aee751ecc070f7ca6b39a574cc21b7b5e588e06a0b" dependencies = [ "dispatch2", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-core-foundation", "objc2-security", ] @@ -4589,7 +4644,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -4597,22 +4652,22 @@ dependencies = [ [[package]] name = "objc2-foundation" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.9.4", - "block2 0.6.1", + "bitflags 2.10.0", + "block2 0.6.2", "libc", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-core-foundation", ] [[package]] name = "objc2-io-kit" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71c1c64d6120e51cd86033f67176b1cb66780c2efe34dec55176f77befd93c0a" +checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" dependencies = [ "libc", "objc2-core-foundation", @@ -4620,22 +4675,22 @@ dependencies = [ [[package]] name = "objc2-io-surface" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.2", + "bitflags 2.10.0", + "objc2 0.6.3", "objc2-core-foundation", ] [[package]] name = "objc2-javascript-core" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9052cb1bb50a4c161d934befcf879526fb87ae9a68858f241e693ca46225cf5a" +checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" dependencies = [ - "objc2 0.6.2", + "objc2 0.6.3", "objc2-core-foundation", ] @@ -4645,7 +4700,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4653,13 +4708,13 @@ dependencies = [ [[package]] name = "objc2-metal" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f246c183239540aab1782457b35ab2040d4259175bd1d0c58e46ada7b47a874" +checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.2", - "objc2-foundation 0.3.1", + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] @@ -4668,10 +4723,10 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26bb88504b5a050dbba515d2414607bf5e57dd56b107bc5f0351197a3e7bdc5d" dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.2", + "bitflags 2.10.0", + "objc2 0.6.3", "objc2-app-kit 0.3.1", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", ] [[package]] @@ -4680,7 +4735,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4689,36 +4744,36 @@ dependencies = [ [[package]] name = "objc2-quartz-core" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.2", - "objc2-foundation 0.3.1", + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-security" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1f8e0ef3ab66b08c42644dcb34dba6ec0a574bbd8adbb8bdbdc7a2779731a44" +checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.2", + "bitflags 2.10.0", + "objc2 0.6.3", "objc2-core-foundation", ] [[package]] name = "objc2-ui-kit" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.2", + "bitflags 2.10.0", + "objc2 0.6.3", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", ] [[package]] @@ -4727,25 +4782,16 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad" dependencies = [ - "bitflags 2.9.4", - "block2 0.6.1", - "objc2 0.6.2", + "bitflags 2.10.0", + "block2 0.6.2", + "objc2 0.6.3", "objc2-app-kit 0.3.1", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "objc2-javascript-core", "objc2-security", ] -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.21.3" @@ -4760,9 +4806,9 @@ checksum = "b4ce411919553d3f9fa53a0880544cda985a112117a0444d5ff1e870a893d6ea" [[package]] name = "open" -version = "5.3.2" +version = "5.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2483562e62ea94312f3576a7aca397306df7990b8d89033e18766744377ef95" +checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" dependencies = [ "dunce", "is-wsl", @@ -4772,11 +4818,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.73" +version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -4793,7 +4839,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -4804,9 +4850,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.109" +version = "0.9.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ "cc", "libc", @@ -4863,12 +4909,12 @@ dependencies = [ [[package]] name = "os_pipe" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db335f4760b14ead6290116f2427bf33a14d4f0617d49f78a246de10c1831224" +checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -4877,12 +4923,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "732c71caeaa72c065bb69d7ea08717bd3f4863a4f451402fc9513e29dbd5261b" dependencies = [ - "objc2 0.6.2", - "objc2-foundation 0.3.1", + "objc2 0.6.3", + "objc2-foundation 0.3.2", "objc2-osa-kit", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -4918,9 +4964,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -4928,15 +4974,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -4992,6 +5038,17 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" +dependencies = [ + "fixedbitset", + "hashbrown 0.15.5", + "indexmap 2.12.1", +] + [[package]] name = "phf" version = "0.8.0" @@ -5106,7 +5163,7 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -5190,8 +5247,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" dependencies = [ "base64 0.22.1", - "indexmap 2.11.4", - "quick-xml 0.38.3", + "indexmap 2.12.1", + "quick-xml 0.38.4", "serde", "time", ] @@ -5215,7 +5272,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "crc32fast", "fdeflate", "flate2", @@ -5232,15 +5289,15 @@ dependencies = [ "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix", - "windows-sys 0.61.0", + "rustix 1.1.2", + "windows-sys 0.61.2", ] [[package]] name = "potential_utf" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ "zerovec", ] @@ -5253,9 +5310,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppmd-rust" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c834641d8ad1b348c9ee86dec3b9840d805acd5f24daa5f90c788951a52ff59b" +checksum = "d558c559f0450f16f2a27a1f017ef38468c1090c9ce63c8e51366232d53717b4" [[package]] name = "ppv-lite86" @@ -5279,7 +5336,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -5308,7 +5365,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.23.6", + "toml_edit 0.23.7", ] [[package]] @@ -5343,9 +5400,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -5366,7 +5423,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -5407,9 +5464,9 @@ dependencies = [ [[package]] name = "pxfm" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83f9b339b02259ada5c0f4a389b7fb472f933aa17ce176fd2ad98f28bb401fde" +checksum = "a3cbdf373972bf78df4d3b518d07003938e2c7d1fb5891e55f9cb6df57009d84" dependencies = [ "num-traits", ] @@ -5449,9 +5506,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.38.3" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" dependencies = [ "memchr", ] @@ -5469,8 +5526,8 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.6.0", - "thiserror 2.0.16", + "socket2 0.6.1", + "thiserror 2.0.17", "tokio", "tracing", "web-time", @@ -5483,7 +5540,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", - "getrandom 0.3.3", + "getrandom 0.3.4", "lru-slab", "rand 0.9.2", "ring", @@ -5491,7 +5548,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.16", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -5506,16 +5563,16 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.0", + "socket2 0.6.1", "tracing", "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.40" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -5621,7 +5678,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", ] [[package]] @@ -5644,19 +5701,21 @@ dependencies = [ [[package]] name = "rav1e" -version = "0.7.1" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" dependencies = [ + "aligned-vec", "arbitrary", "arg_enum_proc_macro", "arrayvec", + "av-scenechange", "av1-grain", "bitstream-io", "built", "cfg-if", "interpolate_name", - "itertools 0.12.1", + "itertools 0.14.0", "libc", "libfuzzer-sys", "log", @@ -5665,23 +5724,21 @@ dependencies = [ "noop_proc_macro", "num-derive 0.4.2", "num-traits", - "once_cell", "paste", "profiling", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand 0.9.2", + "rand_chacha 0.9.0", "simd_helpers", - "system-deps 6.2.2", - "thiserror 1.0.69", + "thiserror 2.0.17", "v_frame", "wasm-bindgen", ] [[package]] name = "ravif" -version = "0.11.20" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" +checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285" dependencies = [ "avif-serialize", "imgref", @@ -5720,11 +5777,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", ] [[package]] @@ -5746,34 +5803,34 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "ref-cast" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "regex" -version = "1.11.2" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -5783,9 +5840,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.10" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -5800,9 +5857,9 @@ checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" [[package]] name = "regex-syntax" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "rend" @@ -5815,9 +5872,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.23" +version = "0.12.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" dependencies = [ "base64 0.22.1", "bytes", @@ -5830,7 +5887,7 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.7.0", + "hyper 1.8.1", "hyper-rustls", "hyper-tls", "hyper-util", @@ -5870,17 +5927,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" dependencies = [ "ashpd", - "block2 0.6.1", + "block2 0.6.2", "dispatch2", "glib-sys 0.18.1", "gobject-sys 0.18.0", "gtk-sys", "js-sys", "log", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit 0.3.1", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "raw-window-handle", "wasm-bindgen", "wasm-bindgen-futures", @@ -5949,9 +6006,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.38.0" +version = "1.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8975fc98059f365204d635119cf9c5a60ae67b841ed49b5422a9a7e56cdfac0" +checksum = "35affe401787a9bd846712274d97654355d21b2a2c092a3139aabe31e9022282" dependencies = [ "arrayvec", "borsh", @@ -5963,12 +6020,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "rustc-demangle" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" - [[package]] name = "rustc-hash" version = "2.1.1" @@ -5984,24 +6035,37 @@ dependencies = [ "semver", ] +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + [[package]] name = "rustix" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "errno", "libc", - "linux-raw-sys", - "windows-sys 0.61.0", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.32" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ "once_cell", "ring", @@ -6013,9 +6077,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" dependencies = [ "web-time", "zeroize", @@ -6023,9 +6087,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.6" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ "ring", "rustls-pki-types", @@ -6059,7 +6123,7 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -6091,9 +6155,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" dependencies = [ "dyn-clone", "ref-cast", @@ -6110,7 +6174,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -6154,7 +6218,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -6195,7 +6259,7 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4eb30575f3638fc8f6815f448d50cb1a2e255b0897985c8c59f4d37b72a07b06" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cssparser 0.31.2", "derive_more 0.99.20", "fxhash", @@ -6220,9 +6284,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.226" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", "serde_derive", @@ -6242,22 +6306,22 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.226" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.226" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -6268,7 +6332,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -6277,7 +6341,7 @@ version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.1", "itoa", "memchr", "ryu", @@ -6302,7 +6366,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -6316,9 +6380,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5417783452c2be558477e104686f7de5dae53dba813c28435e0e70f82d9b04ee" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" dependencies = [ "serde_core", ] @@ -6337,19 +6401,18 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.14.1" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c522100790450cf78eeac1507263d0a350d4d5b30df0c8e1fe051a10c22b376e" +checksum = "10574371d41b0d9b2cff89418eda27da52bcaff2cc8741db26382a77c29131f1" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.11.4", + "indexmap 2.12.1", "schemars 0.9.0", - "schemars 1.0.4", - "serde", - "serde_derive", + "schemars 1.1.0", + "serde_core", "serde_json", "serde_with_macros", "time", @@ -6357,14 +6420,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.14.1" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327ada00f7d64abaac1e55a6911e90cf665aa051b9a561c7006c157f4633135e" +checksum = "08a72d8216842fdd57820dc78d840bef99248e35fb2554ff923319e60f2d686b" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -6386,7 +6449,7 @@ checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -6470,9 +6533,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.6" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" dependencies = [ "libc", ] @@ -6534,12 +6597,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -6592,9 +6655,9 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -6657,7 +6720,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -6690,9 +6753,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.106" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -6716,7 +6779,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -6748,7 +6811,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -6778,25 +6841,25 @@ dependencies = [ [[package]] name = "system-deps" -version = "7.0.5" +version = "7.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4be53aa0cba896d2dc615bd42bbc130acdcffa239e0a2d965ea5b3b2a86ffdb" +checksum = "48c8f33736f986f16d69b6cb8b03f55ddcad5c41acc4ccc39dd88e84aa805e7f" dependencies = [ - "cfg-expr 0.20.3", + "cfg-expr 0.20.4", "heck 0.5.0", "pkg-config", - "toml 0.8.2", + "toml 0.9.8", "version-compare", ] [[package]] name = "tao" -version = "0.34.3" +version = "0.34.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "959469667dbcea91e5485fc48ba7dd6023face91bb0f1a14681a70f99847c3f7" +checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" dependencies = [ - "bitflags 2.9.4", - "block2 0.6.1", + "bitflags 2.10.0", + "block2 0.6.2", "core-foundation 0.10.1", "core-graphics", "crossbeam-channel", @@ -6813,9 +6876,9 @@ dependencies = [ "ndk", "ndk-context", "ndk-sys", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit 0.3.1", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "once_cell", "parking_lot", "raw-window-handle", @@ -6837,7 +6900,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -6865,15 +6928,15 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "target-lexicon" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" +checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" [[package]] name = "tauri" -version = "2.8.5" +version = "2.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d1d3b3dc4c101ac989fd7db77e045cc6d91a25349cd410455cb5c57d510c1c" +checksum = "9e492485dd390b35f7497401f67694f46161a2a00ffd800938d5dd3c898fb9d8" dependencies = [ "anyhow", "bytes", @@ -6881,7 +6944,7 @@ dependencies = [ "dirs 6.0.0", "dunce", "embed_plist", - "getrandom 0.3.3", + "getrandom 0.3.4", "glob", "gtk", "heck 0.5.0", @@ -6893,9 +6956,9 @@ dependencies = [ "log", "mime", "muda", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit 0.3.1", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "objc2-ui-kit", "objc2-web-kit", "percent-encoding", @@ -6912,11 +6975,10 @@ dependencies = [ "tauri-runtime", "tauri-runtime-wry", "tauri-utils", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tray-icon", "url", - "urlpattern", "webkit2gtk", "webview2-com", "window-vibrancy", @@ -6925,9 +6987,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.4.1" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c432ccc9ff661803dab74c6cd78de11026a578a9307610bbc39d3c55be7943f" +checksum = "87d6f8cafe6a75514ce5333f115b7b1866e8e68d9672bf4ca89fc0f35697ea9d" dependencies = [ "anyhow", "cargo_toml", @@ -6941,15 +7003,15 @@ dependencies = [ "serde_json", "tauri-utils", "tauri-winres", - "toml 0.9.7", + "toml 0.9.8", "walkdir", ] [[package]] name = "tauri-codegen" -version = "2.4.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab3a62cf2e6253936a8b267c2e95839674e7439f104fa96ad0025e149d54d8a" +checksum = "b7ef707148f0755110ca54377560ab891d722de4d53297595380a748026f139f" dependencies = [ "base64 0.22.1", "brotli", @@ -6963,9 +7025,9 @@ dependencies = [ "serde", "serde_json", "sha2", - "syn 2.0.106", + "syn 2.0.111", "tauri-utils", - "thiserror 2.0.16", + "thiserror 2.0.17", "time", "url", "uuid", @@ -6984,14 +7046,14 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.4.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4368ea8094e7045217edb690f493b55b30caf9f3e61f79b4c24b6db91f07995e" +checksum = "71664fd715ee6e382c05345ad258d6d1d50f90cf1b58c0aa726638b33c2a075d" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", "tauri-codegen", "tauri-utils", ] @@ -7001,18 +7063,18 @@ name = "tauri-nspanel" version = "2.1.0" source = "git+https://github.com/ahkohd/tauri-nspanel?branch=v2.1#da9c9a8d4eb7f0524a2508988df1a7d9585b4904" dependencies = [ - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit 0.3.1", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "pastey", "tauri", ] [[package]] name = "tauri-plugin" -version = "2.4.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9946a3cede302eac0c6eb6c6070ac47b1768e326092d32efbb91f21ed58d978f" +checksum = "076c78a474a7247c90cad0b6e87e593c4c620ed4efdb79cbe0214f0021f6c39d" dependencies = [ "anyhow", "glob", @@ -7021,29 +7083,44 @@ dependencies = [ "serde", "serde_json", "tauri-utils", - "toml 0.9.7", + "toml 0.9.8", "walkdir", ] [[package]] name = "tauri-plugin-autostart" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062cdcd483d5e3148c9a64dabf8c574e239e2aa1193cf208d95cf89a676f87a5" +checksum = "459383cebc193cdd03d1ba4acc40f2c408a7abce419d64bdcd2d745bc2886f70" dependencies = [ "auto-launch", "serde", "serde_json", "tauri", "tauri-plugin", - "thiserror 2.0.16", + "thiserror 2.0.17", +] + +[[package]] +name = "tauri-plugin-clipboard-manager" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "206dc20af4ed210748ba945c2774e60fd0acd52b9a73a028402caf809e9b6ecf" +dependencies = [ + "arboard", + "log", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.17", ] [[package]] name = "tauri-plugin-deep-link" -version = "2.4.3" +version = "2.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd67112fb1131834c2a7398ffcba520dbbf62c17de3b10329acd1a3554b1a9bb" +checksum = "6e82759f7c7d51de3cbde51c04b3f2332de52436ed84541182cd8944b04e9e73" dependencies = [ "dunce", "plist", @@ -7053,18 +7130,18 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-utils", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", "url", - "windows-registry", + "windows-registry 0.5.3", "windows-result 0.3.4", ] [[package]] name = "tauri-plugin-dialog" -version = "2.4.0" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beee42a4002bc695550599b011728d9dfabf82f767f134754ed6655e434824e" +checksum = "313f8138692ddc4a2127c4c9607d616a46f5c042e77b3722450866da0aad2f19" dependencies = [ "log", "raw-window-handle", @@ -7074,7 +7151,7 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-plugin-fs", - "thiserror 2.0.16", + "thiserror 2.0.17", "url", ] @@ -7095,9 +7172,9 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" -version = "2.4.2" +version = "2.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "315784ec4be45e90a987687bae7235e6be3d6e9e350d2b75c16b8a4bf22c1db7" +checksum = "47df422695255ecbe7bac7012440eddaeefd026656171eac9559f5243d3230d9" dependencies = [ "anyhow", "dunce", @@ -7110,8 +7187,8 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-utils", - "thiserror 2.0.16", - "toml 0.9.7", + "thiserror 2.0.17", + "toml 0.9.8", "url", ] @@ -7129,14 +7206,14 @@ dependencies = [ "tar", "tauri", "tauri-plugin", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "tauri-plugin-global-shortcut" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6df9f0f7bf2fe768b85fee4951c2505a35b72c44df1f6403e74e110bc13c5f58" +checksum = "424af23c7e88d05e4a1a6fc2c7be077912f8c76bd7900fd50aa2b7cbf5a2c405" dependencies = [ "global-hotkey", "log", @@ -7144,14 +7221,14 @@ dependencies = [ "serde_json", "tauri", "tauri-plugin", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "tauri-plugin-http" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938a3d7051c9a82b431e3a0f3468f85715b3442b3c3a3913095e9fa509e2652c" +checksum = "c00685aceab12643cf024f712ab0448ba8fcadf86f2391d49d2e5aa732aacc70" dependencies = [ "bytes", "cookie_store", @@ -7165,7 +7242,7 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-plugin-fs", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "url", "urlpattern", @@ -7173,23 +7250,23 @@ dependencies = [ [[package]] name = "tauri-plugin-log" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c1438bc7662acd16d508c919b3c087efd63669a4c75625dff829b1c75975ec" +checksum = "d5709c792b8630290b5d9811a1f8fe983dd925fc87c7fc7f4923616458cd00b6" dependencies = [ "android_logger", "byte-unit", "fern", "log", - "objc2 0.6.2", - "objc2-foundation 0.3.1", + "objc2 0.6.3", + "objc2-foundation 0.3.2", "serde", "serde_json", "serde_repr", "swift-rs", "tauri", "tauri-plugin", - "thiserror 2.0.16", + "thiserror 2.0.17", "time", ] @@ -7200,31 +7277,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5607e0707d37d7b20e287cf0ce396d1efebe7b833b8e9cbd2ea4257091d9c604" dependencies = [ "macos-accessibility-client", - "objc2 0.6.2", - "objc2-foundation 0.3.1", + "objc2 0.6.3", + "objc2-foundation 0.3.2", "serde", "tauri", "tauri-plugin", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "tauri-plugin-opener" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786156aa8e89e03d271fbd3fe642207da8e65f3c961baa9e2930f332bf80a1f5" +checksum = "c26b72571d25dee25667940027114e60f569fc3974f8cefbe50c2cbc5fd65e3b" dependencies = [ "dunce", "glob", "objc2-app-kit 0.3.1", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "open", "schemars 0.8.22", "serde", "serde_json", "tauri", "tauri-plugin", - "thiserror 2.0.16", + "thiserror 2.0.17", "url", "windows 0.61.3", "zbus", @@ -7232,9 +7309,9 @@ dependencies = [ [[package]] name = "tauri-plugin-os" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a1c77ebf6f20417ab2a74e8c310820ba52151406d0c80fbcea7df232e3f6ba" +checksum = "d8f08346c8deb39e96f86973da0e2d76cbb933d7ac9b750f6dc4daf955a6f997" dependencies = [ "gethostname", "log", @@ -7245,7 +7322,7 @@ dependencies = [ "sys-locale", "tauri", "tauri-plugin", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -7254,20 +7331,20 @@ version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20327367bca73bc4a08973592b0e6fe716321566207c52c79234876a5467c4ac" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "itertools 0.14.0", "serde", "strum", "tauri", "tauri-plugin", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] name = "tauri-plugin-process" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7461c622a5ea00eb9cd9f7a08dbd3bf79484499fd5c21aa2964677f64ca651ab" +checksum = "d55511a7bf6cd70c8767b02c97bf8134fa434daf3926cfc1be0a0f94132d165a" dependencies = [ "tauri", "tauri-plugin", @@ -7282,15 +7359,15 @@ dependencies = [ "serde", "tauri", "tauri-plugin", - "thiserror 2.0.16", + "thiserror 2.0.17", "xcap", ] [[package]] name = "tauri-plugin-shell" -version = "2.3.1" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54777d0c0d8add34eea3ced84378619ef5b97996bd967d3038c668feefd21071" +checksum = "c374b6db45f2a8a304f0273a15080d98c70cde86178855fc24653ba657a1144c" dependencies = [ "encoding_rs", "log", @@ -7303,21 +7380,21 @@ dependencies = [ "shared_child", "tauri", "tauri-plugin", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", ] [[package]] name = "tauri-plugin-single-instance" -version = "2.3.4" +version = "2.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb9cac815bf11c4a80fb498666bcdad66d65b89e3ae24669e47806febb76389c" +checksum = "dd707f8c86b4e3004e2c141fa24351f1909ba40ce1b8437e30d5ed5277dd3710" dependencies = [ "serde", "serde_json", "tauri", "tauri-plugin-deep-link", - "thiserror 2.0.16", + "thiserror 2.0.17", "tracing", "windows-sys 0.60.2", "zbus", @@ -7325,16 +7402,16 @@ dependencies = [ [[package]] name = "tauri-plugin-store" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d85dd80d60a76ee2c2fdce09e9ef30877b239c2a6bb76e6d7d03708aa5f13a19" +checksum = "59a77036340a97eb5bbe1b3209c31e5f27f75e6f92a52fd9dd4b211ef08bf310" dependencies = [ "dunce", "serde", "serde_json", "tauri", "tauri-plugin", - "thiserror 2.0.16", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -7362,7 +7439,7 @@ dependencies = [ "tauri", "tauri-plugin", "tempfile", - "thiserror 2.0.16", + "thiserror 2.0.17", "time", "tokio", "url", @@ -7379,29 +7456,29 @@ dependencies = [ "serde", "tauri", "tauri-plugin", - "thiserror 2.0.16", + "thiserror 2.0.17", "windows-version", ] [[package]] name = "tauri-runtime" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4cfc9ad45b487d3fded5a4731a567872a4812e9552e3964161b08edabf93846" +checksum = "9368f09358496f2229313fccb37682ad116b7f46fa76981efe116994a0628926" dependencies = [ "cookie 0.18.1", "dpi", "gtk", "http 1.3.1", "jni", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-ui-kit", "objc2-web-kit", "raw-window-handle", "serde", "serde_json", "tauri-utils", - "thiserror 2.0.16", + "thiserror 2.0.17", "url", "webkit2gtk", "webview2-com", @@ -7410,17 +7487,17 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.8.1" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fe9d48bd122ff002064e88cfcd7027090d789c4302714e68fcccba0f4b7807" +checksum = "929f5df216f5c02a9e894554401bcdab6eec3e39ec6a4a7731c7067fc8688a93" dependencies = [ "gtk", "http 1.3.1", "jni", "log", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit 0.3.1", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "once_cell", "percent-encoding", "raw-window-handle", @@ -7437,9 +7514,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a3852fdf9a4f8fbeaa63dc3e9a85284dd6ef7200751f0bd66ceee30c93f212" +checksum = "f6b8bbe426abdbf52d050e52ed693130dbd68375b9ad82a3fb17efb4c8d85673" dependencies = [ "anyhow", "brotli", @@ -7465,8 +7542,8 @@ dependencies = [ "serde_json", "serde_with", "swift-rs", - "thiserror 2.0.16", - "toml 0.9.7", + "thiserror 2.0.17", + "toml 0.9.8", "url", "urlpattern", "uuid", @@ -7475,12 +7552,13 @@ dependencies = [ [[package]] name = "tauri-winres" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd21509dd1fa9bd355dc29894a6ff10635880732396aa38c0066c1e6c1ab8074" +checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" dependencies = [ + "dunce", "embed-resource", - "toml 0.9.7", + "toml 0.9.8", ] [[package]] @@ -7490,10 +7568,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom 0.3.3", + "getrandom 0.3.4", "once_cell", - "rustix", - "windows-sys 0.61.0", + "rustix 1.1.2", + "windows-sys 0.61.2", ] [[package]] @@ -7518,11 +7596,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.16", + "thiserror-impl 2.0.17", ] [[package]] @@ -7533,18 +7611,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "thiserror-impl" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -7558,7 +7636,7 @@ dependencies = [ "half", "quick-error", "weezl", - "zune-jpeg", + "zune-jpeg 0.4.21", ] [[package]] @@ -7605,9 +7683,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -7630,34 +7708,31 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", - "mio 1.0.4", + "mio 1.1.0", "parking_lot", "pin-project-lite", "signal-hook-registry", - "slab", - "socket2 0.6.0", + "socket2 0.6.1", "tokio-macros", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -7672,9 +7747,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f63835928ca123f1bef57abbcd23bb2ba0ac9ae1235f1e65bda0d06e7786bd" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -7707,9 +7782,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.16" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", @@ -7732,14 +7807,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.1", "serde_core", - "serde_spanned 1.0.2", - "toml_datetime 0.7.2", + "serde_spanned 1.0.3", + "toml_datetime 0.7.3", "toml_parser", "toml_writer", "winnow 0.7.13", @@ -7756,9 +7831,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ "serde_core", ] @@ -7769,7 +7844,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.1", "toml_datetime 0.6.3", "winnow 0.5.40", ] @@ -7780,7 +7855,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.1", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.3", @@ -7789,30 +7864,30 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.23.6" +version = "0.23.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3effe7c0e86fdff4f69cdd2ccc1b96f933e24811c5441d44904e8683e27184b" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" dependencies = [ - "indexmap 2.11.4", - "toml_datetime 0.7.2", + "indexmap 2.12.1", + "toml_datetime 0.7.3", "toml_parser", "winnow 0.7.13", ] [[package]] name = "toml_parser" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ "winnow 0.7.13", ] [[package]] name = "toml_writer" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d163a63c116ce562a22cda521fcc4d79152e7aba014456fb5eb442f6d6a10109" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" [[package]] name = "tower" @@ -7835,7 +7910,7 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "bytes", "futures-util", "http 1.3.1", @@ -7879,7 +7954,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -7897,8 +7972,8 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f6db4619caf27601f2ee31ce19fe9ddd6f7ebdedf6de3eef5399707f820b671" dependencies = [ - "gio 0.21.2", - "glib 0.21.3", + "gio 0.21.4", + "glib 0.21.4", "glib-sys 0.21.2", "libc", "tracker-sys", @@ -7914,29 +7989,40 @@ dependencies = [ "glib-sys 0.21.2", "gobject-sys 0.21.2", "libc", - "system-deps 7.0.5", + "system-deps 7.0.7", ] [[package]] name = "tray-icon" -version = "0.21.1" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d92153331e7d02ec09137538996a7786fe679c629c279e82a6be762b7e6fe2" +checksum = "e3d5572781bee8e3f994d7467084e1b1fd7a93ce66bd480f8156ba89dee55a2b" dependencies = [ "crossbeam-channel", "dirs 6.0.0", "libappindicator", "muda", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit 0.3.1", "objc2-core-foundation", "objc2-core-graphics", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "once_cell", "png 0.17.16", "serde", - "thiserror 2.0.16", - "windows-sys 0.59.0", + "thiserror 2.0.17", + "windows-sys 0.60.2", +] + +[[package]] +name = "tree_magic_mini" +version = "3.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8765b90061cba6c22b5831f675da109ae5561588290f9fa2317adab2714d5a6" +dependencies = [ + "memchr", + "nom 8.0.0", + "petgraph", ] [[package]] @@ -7991,9 +8077,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "uds_windows" @@ -8055,9 +8141,9 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.19" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-segmentation" @@ -8067,9 +8153,9 @@ checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "unicode-xid" @@ -8121,9 +8207,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "utf8-width" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" +checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" [[package]] name = "utf8_iter" @@ -8137,7 +8223,7 @@ version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "js-sys", "serde", "wasm-bindgen", @@ -8162,9 +8248,9 @@ checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" [[package]] name = "value-bag" -version = "1.11.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" +checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" [[package]] name = "vcpkg" @@ -8174,9 +8260,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version-compare" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" [[package]] name = "version_check" @@ -8235,15 +8321,6 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" -[[package]] -name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] - [[package]] name = "wasip2" version = "1.0.1+wasi-0.2.4" @@ -8255,9 +8332,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.103" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if", "once_cell", @@ -8266,25 +8343,11 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.106", - "wasm-bindgen-shared", -] - [[package]] name = "wasm-bindgen-futures" -version = "0.4.53" +version = "0.4.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0b221ff421256839509adbb55998214a70d829d3a28c69b4a6672e9d2a42f67" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" dependencies = [ "cfg-if", "js-sys", @@ -8295,9 +8358,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.103" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -8305,22 +8368,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.103" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.106", - "wasm-bindgen-backend", + "syn 2.0.111", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.103" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" dependencies = [ "unicode-ident", ] @@ -8346,7 +8409,7 @@ checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" dependencies = [ "cc", "downcast-rs", - "rustix", + "rustix 1.1.2", "scoped-tls", "smallvec", "wayland-sys", @@ -8358,8 +8421,8 @@ version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" dependencies = [ - "bitflags 2.9.4", - "rustix", + "bitflags 2.10.0", + "rustix 1.1.2", "wayland-backend", "wayland-scanner", ] @@ -8370,12 +8433,25 @@ version = "0.32.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "wayland-backend", "wayland-client", "wayland-scanner", ] +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" +dependencies = [ + "bitflags 2.10.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + [[package]] name = "wayland-scanner" version = "0.31.7" @@ -8400,9 +8476,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.80" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbe734895e869dc429d78c4b433f8d17d95f8d05317440b4fad5ab2d33e596dc" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -8464,9 +8540,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" dependencies = [ "rustls-pki-types", ] @@ -8481,8 +8557,8 @@ dependencies = [ "webview2-com-sys", "windows 0.61.3", "windows-core 0.61.2", - "windows-implement 0.60.0", - "windows-interface 0.59.1", + "windows-implement 0.60.2", + "windows-interface 0.59.3", ] [[package]] @@ -8493,7 +8569,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -8502,16 +8578,16 @@ version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" dependencies = [ - "thiserror 2.0.16", + "thiserror 2.0.17", "windows 0.61.3", "windows-core 0.61.2", ] [[package]] name = "weezl" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "which" @@ -8520,7 +8596,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3fabb953106c3c8eea8306e4393700d7657561cb43122571b172bbfb7c7ba1d" dependencies = [ "env_home", - "rustix", + "rustix 1.1.2", "winsafe", ] @@ -8532,9 +8608,9 @@ checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" [[package]] name = "widestring" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" [[package]] name = "winapi" @@ -8558,7 +8634,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.0", + "windows-sys 0.61.2", ] [[package]] @@ -8573,10 +8649,10 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" dependencies = [ - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit 0.3.1", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "raw-window-handle", "windows-sys 0.59.0", "windows-version", @@ -8611,7 +8687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f919aee0a93304be7f62e8e5027811bbba96bcb1de84d6618be56e43f8a32a1" dependencies = [ "windows-core 0.59.0", - "windows-targets 0.53.3", + "windows-targets 0.53.5", ] [[package]] @@ -8665,10 +8741,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "810ce18ed2112484b0d4e15d022e5f598113e220c53e373fb31e67e21670c1ce" dependencies = [ "windows-implement 0.59.0", - "windows-interface 0.59.1", + "windows-interface 0.59.3", "windows-result 0.3.4", "windows-strings 0.3.1", - "windows-targets 0.53.3", + "windows-targets 0.53.5", ] [[package]] @@ -8677,8 +8753,8 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-implement 0.60.0", - "windows-interface 0.59.1", + "windows-implement 0.60.2", + "windows-interface 0.59.3", "windows-link 0.1.3", "windows-result 0.3.4", "windows-strings 0.4.2", @@ -8686,15 +8762,15 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.62.0" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-implement 0.60.0", - "windows-interface 0.59.1", - "windows-link 0.2.0", - "windows-result 0.4.0", - "windows-strings 0.5.0", + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] @@ -8729,7 +8805,7 @@ checksum = "12168c33176773b86799be25e2a2ba07c7aab9968b37541f1094dbd7a60c8946" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -8740,7 +8816,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -8751,18 +8827,18 @@ checksum = "83577b051e2f49a058c308f17f273b570a6a758386fc291b5f6a934dd84e48c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -8773,7 +8849,7 @@ checksum = "9d8dc32e0095a7eeccebd0e3f09e9509365ecb3fc6ac4d6f5f14a3f6392942d1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -8784,18 +8860,18 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -8806,9 +8882,9 @@ checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-link" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-numerics" @@ -8831,6 +8907,17 @@ dependencies = [ "windows-strings 0.4.2", ] +[[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.2.0" @@ -8851,11 +8938,11 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -8888,11 +8975,11 @@ dependencies = [ [[package]] name = "windows-strings" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -8937,16 +9024,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.5", ] [[package]] name = "windows-sys" -version = "0.61.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -8997,19 +9084,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link 0.1.3", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -9023,11 +9110,11 @@ dependencies = [ [[package]] name = "windows-version" -version = "0.1.5" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e061eb0a22b4a1d778ad70f7575ec7845490abb35b08fa320df7895882cacb" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" dependencies = [ - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -9050,9 +9137,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -9074,9 +9161,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -9098,9 +9185,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -9110,9 +9197,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -9134,9 +9221,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -9158,9 +9245,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -9182,9 +9269,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -9206,9 +9293,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" @@ -9270,19 +9357,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] -name = "writeable" -version = "0.6.1" +name = "wl-clipboard-rs" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "8e5ff8d0e60065f549fafd9d6cb626203ea64a798186c80d8e7df4f8af56baeb" +dependencies = [ + "libc", + "log", + "os_pipe", + "rustix 0.38.44", + "tempfile", + "thiserror 2.0.17", + "tree_magic_mini", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-wlr", +] + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "wry" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f0e9642a0d061f6236c54ccae64c2722a7879ad4ec7dff59bd376d446d8e90" +checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" dependencies = [ "base64 0.22.1", - "block2 0.6.1", + "block2 0.6.2", "cookie 0.18.1", "crossbeam-channel", "dirs 6.0.0", @@ -9297,10 +9403,10 @@ dependencies = [ "kuchikiki", "libc", "ndk", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit 0.3.1", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "objc2-ui-kit", "objc2-web-kit", "once_cell", @@ -9309,7 +9415,7 @@ dependencies = [ "sha2", "soup3", "tao-macros", - "thiserror 2.0.16", + "thiserror 2.0.17", "url", "webkit2gtk", "webkit2gtk-sys", @@ -9357,7 +9463,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" dependencies = [ "gethostname", - "rustix", + "rustix 1.1.2", "x11rb-protocol", ] @@ -9374,7 +9480,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", - "rustix", + "rustix 1.1.2", ] [[package]] @@ -9386,15 +9492,15 @@ dependencies = [ "dbus", "image", "log", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit 0.3.1", "objc2-core-foundation", "objc2-core-graphics", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "percent-encoding", "scopeguard", - "thiserror 2.0.16", - "widestring 1.2.0", + "thiserror 2.0.17", + "widestring 1.2.1", "windows 0.59.0", "xcb", ] @@ -9434,12 +9540,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] -name = "yoke" +name = "y4m" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -9447,21 +9558,21 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", "synstructure", ] [[package]] name = "zbus" -version = "5.11.0" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d07e46d035fb8e375b2ce63ba4e4ff90a7f73cf2ffb0138b29e1158d2eaadf7" +checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" dependencies = [ "async-broadcast", "async-executor", @@ -9484,7 +9595,8 @@ dependencies = [ "tokio", "tracing", "uds_windows", - "windows-sys 0.60.2", + "uuid", + "windows-sys 0.61.2", "winnow 0.7.13", "zbus_macros", "zbus_names", @@ -9493,14 +9605,14 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.11.0" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57e797a9c847ed3ccc5b6254e8bcce056494b375b511b3d6edcec0aeb4defaca" +checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", "zbus_names", "zvariant", "zvariant_utils", @@ -9520,22 +9632,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.27" +version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "43fa6694ed34d6e57407afbccdeecfa268c470a7d2a5b0cf49ce9fcc345afb90" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "c640b22cd9817fae95be82f0d2f90b11f7605f6c319d16705c459b27ac2cbc26" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -9555,15 +9667,15 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" dependencies = [ "zeroize_derive", ] @@ -9576,14 +9688,14 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", "yoke", @@ -9592,9 +9704,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "yoke", "zerofrom", @@ -9603,13 +9715,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -9622,9 +9734,9 @@ dependencies = [ "crc32fast", "crossbeam-utils", "displaydoc", - "indexmap 2.11.4", + "indexmap 2.12.1", "memchr", - "thiserror 2.0.16", + "thiserror 2.0.17", ] [[package]] @@ -9640,9 +9752,9 @@ dependencies = [ "crc32fast", "deflate64", "flate2", - "getrandom 0.3.3", + "getrandom 0.3.4", "hmac", - "indexmap 2.11.4", + "indexmap 2.12.1", "liblzma", "memchr", "pbkdf2", @@ -9662,9 +9774,9 @@ checksum = "2f06ae92f42f5e5c42443fd094f245eb656abf56dd7cce9b8b263236565e00f2" [[package]] name = "zopfli" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" dependencies = [ "bumpalo", "crc32fast", @@ -9706,6 +9818,12 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" +[[package]] +name = "zune-core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "111f7d9820f05fd715df3144e254d6fc02ee4088b0644c0ffd0efc9e6d9d2773" + [[package]] name = "zune-inflate" version = "0.2.54" @@ -9721,14 +9839,23 @@ version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" dependencies = [ - "zune-core", + "zune-core 0.4.12", +] + +[[package]] +name = "zune-jpeg" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6fb7703e32e9a07fb3f757360338b3a567a5054f21b5f52a666752e333d58e" +dependencies = [ + "zune-core 0.5.0", ] [[package]] name = "zvariant" -version = "5.7.0" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "999dd3be73c52b1fccd109a4a81e4fcd20fab1d3599c8121b38d04e1419498db" +checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" dependencies = [ "endi", "enumflags2", @@ -9741,14 +9868,14 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "5.7.0" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6643fd0b26a46d226bd90d3f07c1b5321fe9bb7f04673cb37ac6d6883885b68e" +checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", "zvariant_utils", ] @@ -9761,6 +9888,6 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.106", + "syn 2.0.111", "winnow 0.7.13", ] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 6f02c9b4..eabbc175 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -119,6 +119,7 @@ toml = "0.8" path-clean = "1.0.1" actix-files = "0.6.8" actix-web = "4.11.0" +tauri-plugin-clipboard-manager = "2" [dev-dependencies] tempfile = "3.23.0" @@ -130,6 +131,8 @@ objc2 = "0.6.2" objc2-core-foundation = {version = "0.3.1", features = ["CFString", "CFCGTypes", "CFArray"] } objc2-application-services = { version = "0.3.1", features = ["HIServices"] } objc2-core-graphics = { version = "=0.3.1", features = ["CGEvent"] } +# macOS-only: used by selection_monitor.rs to check AX trust/prompt +macos-accessibility-client = "0.0.1" [target."cfg(target_os = \"linux\")".dependencies] gio = "0.21.2" diff --git a/src-tauri/Info.plist b/src-tauri/Info.plist index b48b0d28..d81e5b92 100644 --- a/src-tauri/Info.plist +++ b/src-tauri/Info.plist @@ -38,5 +38,9 @@ Coco AI requires camera access for scanning documents and capturing images. NSSpeechRecognitionUsageDescription Coco AI uses speech recognition to convert your voice into text for a hands-free experience. + NSAppleEventsUsageDescription + Coco AI requires access to Apple Events to enable certain features, such as opening files and applications. + NSAccessibility + \ No newline at end of file diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 468feb1e..bde04f3d 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -2,7 +2,7 @@ "$schema": "../gen/schemas/desktop-schema.json", "identifier": "default", "description": "Capability for the main window", - "windows": ["main", "chat", "settings", "check"], + "windows": ["main", "chat", "settings", "check", "selection"], "permissions": [ "core:default", "core:event:allow-emit", @@ -30,6 +30,7 @@ "core:window:allow-set-always-on-top", "core:window:deny-internal-toggle-maximize", "core:window:allow-set-shadow", + "core:window:allow-set-position", "core:app:allow-set-app-theme", "shell:default", "http:default", diff --git a/src-tauri/src/common/auth.rs b/src-tauri/src/common/auth.rs deleted file mode 100644 index 84ecdb38..00000000 --- a/src-tauri/src/common/auth.rs +++ /dev/null @@ -1,9 +0,0 @@ -// use std::collections::HashMap; -use serde::{Deserialize, Serialize}; -// use crate::common::health::Status; - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct RequestAccessTokenResponse { - pub access_token: String, - pub expire_in: u32, -} diff --git a/src-tauri/src/common/http.rs b/src-tauri/src/common/http.rs index f6165252..fad7f4af 100644 --- a/src-tauri/src/common/http.rs +++ b/src-tauri/src/common/http.rs @@ -1,26 +1,8 @@ use crate::common; use reqwest::Response; -use serde::{Deserialize, Serialize}; -use serde_json::Value; use std::collections::HashMap; use tauri_plugin_store::JsonValue; -#[derive(Debug, Serialize, Deserialize)] -pub struct GetResponse { - pub _id: String, - pub _source: Source, - pub result: String, - pub payload: Option, -} - -#[derive(Debug, Serialize, Deserialize)] -pub struct Source { - pub id: String, - pub created: String, - pub updated: String, - pub status: String, -} - pub async fn get_response_body_text(response: Response) -> Result { let status = response.status().as_u16(); let body = response diff --git a/src-tauri/src/common/mod.rs b/src-tauri/src/common/mod.rs index 769948ef..034dc553 100644 --- a/src-tauri/src/common/mod.rs +++ b/src-tauri/src/common/mod.rs @@ -1,5 +1,4 @@ pub mod assistant; -pub mod auth; pub mod connector; pub mod datasource; pub mod document; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 81eb65fe..59a5a014 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -3,6 +3,7 @@ mod autostart; mod common; mod extension; mod search; +mod selection_monitor; mod server; mod settings; mod setup; @@ -72,24 +73,13 @@ async fn change_window_height(handle: AppHandle, height: u32) { } } -#[derive(serde::Deserialize)] -struct ThemeChangedPayload { - #[allow(dead_code)] - is_dark_mode: bool, -} - -#[derive(Clone, serde::Serialize)] -#[allow(dead_code)] -struct Payload { - args: Vec, - cwd: String, -} +// Removed unused Payload to avoid unnecessary serde derive macro invocations #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { let ctx = tauri::generate_context!(); - let mut app_builder = tauri::Builder::default(); + let mut app_builder = tauri::Builder::default().plugin(tauri_plugin_clipboard_manager::init()); // Set up logger first app_builder = app_builder.plugin(set_up_tauri_logger()); @@ -208,7 +198,9 @@ pub fn run() { setup::backend_setup, util::app_lang::update_app_lang, util::path::path_absolute, - util::logging::app_log_dir + util::logging::app_log_dir, + selection_monitor::set_selection_enabled, + selection_monitor::get_selection_enabled, ]) .setup(|app| { #[cfg(target_os = "macos")] @@ -218,7 +210,6 @@ pub fn run() { log::trace!("Dock icon should be hidden now"); } - /* ----------- This code must be executed on the main thread and must not be relocated. ----------- */ let app_handle = app.app_handle(); let main_window = app_handle.get_webview_window(MAIN_WINDOW_LABEL).unwrap(); diff --git a/src-tauri/src/selection_monitor.rs b/src-tauri/src/selection_monitor.rs new file mode 100644 index 00000000..36f807f5 --- /dev/null +++ b/src-tauri/src/selection_monitor.rs @@ -0,0 +1,373 @@ +/// Event payload sent to the frontend when selection is detected. +/// Coordinates use logical (Quartz) points with a top-left origin. +/// Note: `y` is flipped on the backend to match the frontend’s usage. +use tauri::Emitter; + +#[derive(serde::Serialize, Clone)] +struct SelectionEventPayload { + text: String, + x: i32, + y: i32, +} + +use std::sync::atomic::{AtomicBool, Ordering}; + +/// Global toggle: selection monitoring enabled by default. +static SELECTION_ENABLED: AtomicBool = AtomicBool::new(true); + +#[derive(serde::Serialize, Clone)] +struct SelectionEnabledPayload { + enabled: bool, +} + +/// Read the current selection monitoring state. +pub fn is_selection_enabled() -> bool { + SELECTION_ENABLED.load(Ordering::Relaxed) +} + +/// Update the monitoring state and broadcast to the frontend. +fn set_selection_enabled_internal(app_handle: &tauri::AppHandle, enabled: bool) { + SELECTION_ENABLED.store(enabled, Ordering::Relaxed); + let _ = app_handle.emit("selection-enabled", SelectionEnabledPayload { enabled }); +} + +/// Tauri command: set selection monitoring state. +#[tauri::command] +pub fn set_selection_enabled(app_handle: tauri::AppHandle, enabled: bool) { + set_selection_enabled_internal(&app_handle, enabled); +} + +/// Tauri command: get selection monitoring state. +#[tauri::command] +pub fn get_selection_enabled() -> bool { + is_selection_enabled() +} + +#[cfg(target_os = "macos")] +pub fn start_selection_monitor(app_handle: tauri::AppHandle) { + // Entrypoint: checks permissions (macOS), initializes, and starts a background watcher thread. + log::info!("start_selection_monitor: 入口函数启动"); + use std::time::Duration; + use tauri::Emitter; + + // Sync initial enabled state to the frontend on startup. + set_selection_enabled_internal(&app_handle, is_selection_enabled()); + + // Accessibility permission is required to read selected text in the foreground app. + // If not granted, prompt the user once; if still not granted, skip starting the watcher. + #[cfg(target_os = "macos")] + { + let trusted_before = macos_accessibility_client::accessibility::application_is_trusted(); + if !trusted_before { + let _ = macos_accessibility_client::accessibility::application_is_trusted_with_prompt(); + } + let trusted_after = macos_accessibility_client::accessibility::application_is_trusted(); + if !trusted_after { + return; + } + } + #[cfg(not(target_os = "macos"))] + { + log::info!("start_selection_monitor: 非 macOS 平台,无划词监控"); + } + + // Background thread: drives popup show/hide based on mouse and AX selection state. + std::thread::spawn(move || { + #[cfg(target_os = "macos")] + use objc2_app_kit::NSWorkspace; + use objc2_core_graphics::CGEvent; + use objc2_core_graphics::{CGDisplayBounds, CGGetActiveDisplayList, CGMainDisplayID}; + + // Get current mouse position (logical top-left origin), flipping `y` to match frontend usage. + let current_mouse_point_global = || -> (i32, i32) { + unsafe { + let event = CGEvent::new(None); + let pt = objc2_core_graphics::CGEvent::location(event.as_deref()); + + // Enumerate active displays to compute global bounds and pick the display containing the cursor. + let mut displays: [u32; 16] = [0; 16]; + let mut display_count: u32 = 0; + let _ = CGGetActiveDisplayList( + displays.len() as u32, + displays.as_mut_ptr(), + &mut display_count, + ); + if display_count == 0 { + // Fallback to main display. + let did = CGMainDisplayID(); + let b = CGDisplayBounds(did); + let min_x_pt = b.origin.x as f64; + let max_top_pt = (b.origin.y + b.size.height) as f64; + let min_bottom_pt = b.origin.y as f64; + let total_h_pt = max_top_pt - min_bottom_pt; + + let x_top_left = (pt.x as f64 - min_x_pt).round() as i32; + let y_top_left = (max_top_pt - pt.y as f64).round() as i32; + let y_flipped = (total_h_pt.round() as i32 - y_top_left).max(0); + + return (x_top_left, y_flipped); + } + + let mut chosen = CGMainDisplayID(); // default fallback + log::info!( + "current_mouse: pt=({:.1},{:.1}) → display={}", + pt.x as f64, + pt.y as f64, + chosen + ); + + let mut min_x_pt = f64::INFINITY; + let mut max_top_pt = f64::NEG_INFINITY; + let mut min_bottom_pt = f64::INFINITY; + for i in 0..display_count as usize { + let did = displays[i]; + let b = CGDisplayBounds(did); + if (b.origin.x as f64) < min_x_pt { + min_x_pt = b.origin.x as f64; + } + let top = (b.origin.y + b.size.height) as f64; + if top > max_top_pt { + max_top_pt = top; + } + if (b.origin.y as f64) < min_bottom_pt { + min_bottom_pt = b.origin.y as f64; + } + + let in_x = pt.x >= b.origin.x && pt.x <= b.origin.x + b.size.width; + let in_y = pt.y >= b.origin.y && pt.y <= b.origin.y + b.size.height; + if in_x && in_y { + chosen = did; + log::info!( + "current_mouse: pt=({:.1},{:.1}) → display={} → point_global_top_left=(x={}, y={})", + pt.x as f64, + pt.y as f64, + chosen, + b.origin.x, + b.origin.y + ); + } + } + + let total_h_pt = max_top_pt - min_bottom_pt; + + let x_top_left = (pt.x as f64 - min_x_pt).round() as i32; + let y_top_left = (max_top_pt - pt.y as f64).round() as i32; + let y_flipped = (total_h_pt.round() as i32 - y_top_left).max(0); + + (x_top_left, y_flipped) + } + }; + + // Determine whether the frontmost app is this process (Coco). + // Avoid misinterpreting empty selection when interacting with the popup itself. + let is_frontmost_app_me = || -> bool { + #[cfg(target_os = "macos")] + unsafe { + let workspace = NSWorkspace::sharedWorkspace(); + if let Some(frontmost) = workspace.frontmostApplication() { + let pid = frontmost.processIdentifier(); + let my_pid = std::process::id() as i32; + return pid == my_pid; + } + } + false + }; + + // Selection-driven state machine. + let mut popup_visible = false; + let mut last_text = String::new(); + + // Stability and hide thresholds (tunable). + let stable_threshold = 2; // same content ≥2 times → stable selection + let empty_threshold = 2; // empty value ≥2 times → stable empty + let mut stable_text = String::new(); + let mut stable_count = 0; + let mut empty_count = 0; + + loop { + std::thread::sleep(Duration::from_millis(30)); + + // If disabled: do not read AX / do not show popup; hide if currently visible. + if !is_selection_enabled() { + if popup_visible { + let _ = app_handle.emit("selection-detected", ""); + popup_visible = false; + last_text.clear(); + stable_text.clear(); + } + continue; + } + + // Skip empty-selection hide checks while interacting with the Coco popup. + let front_is_me = is_frontmost_app_me(); + + // Lightweight retries to smooth out transient AX focus instability. + let selected_text = if front_is_me { + // Do not read selection during popup interaction to avoid false empty. + None + } else { + // Up to 2 retries, 35ms apart. + read_selected_text_with_retries(2, 35) + }; + + match selected_text { + Some(text) if !text.is_empty() => { + empty_count = 0; + if text == stable_text { + stable_count += 1; + } else { + stable_text = text.clone(); + stable_count = 1; + } + + // Update/show only when selection is stable to avoid flicker. + if stable_count >= stable_threshold { + if !popup_visible || text != last_text { + let (x, y) = current_mouse_point_global(); + let payload = SelectionEventPayload { + text: text.clone(), + x, + y, + }; + + let _ = app_handle.emit("selection-detected", payload); + last_text = text; + popup_visible = true; + } + } + } + _ => { + // If not Coco in front and selection is empty: accumulate empties, then hide. + if !front_is_me { + stable_count = 0; + empty_count += 1; + if popup_visible && empty_count >= empty_threshold { + let _ = app_handle.emit("selection-detected", ""); + popup_visible = false; + last_text.clear(); + stable_text.clear(); + } + } else { + // When Coco is frontmost: do not hide or clear state during interaction. + } + } + } + } + }); +} + +// macOS-wide accessibility entry point: allows reading system-level focused elements. +#[cfg(target_os = "macos")] +unsafe extern "C" { + fn AXUIElementCreateSystemWide() -> *mut objc2_application_services::AXUIElement; +} + +/// Read the selected text of the frontmost application (without using the clipboard). +/// macOS only. Returns `None` when the frontmost app is Coco to avoid false empties. +#[cfg(target_os = "macos")] +fn read_selected_text() -> Option { + use objc2_app_kit::NSWorkspace; + use objc2_application_services::{AXError, AXUIElement}; + use objc2_core_foundation::{CFRetained, CFString, CFType}; + use std::ptr::NonNull; + + // Prefer system-wide focused element; if unavailable, fall back to app/window focused element. + let mut focused_ui_ptr: *const CFType = std::ptr::null(); + let focused_attr = CFString::from_static_str("AXFocusedUIElement"); + + // System-wide focused UI element. + let system_elem = unsafe { AXUIElementCreateSystemWide() }; + if !system_elem.is_null() { + let system_elem_retained: CFRetained = + unsafe { CFRetained::from_raw(NonNull::new(system_elem).unwrap()) }; + let err = unsafe { + system_elem_retained + .copy_attribute_value(&focused_attr, NonNull::new(&mut focused_ui_ptr).unwrap()) + }; + if err != AXError::Success { + focused_ui_ptr = std::ptr::null(); + } + } + + // Fallback to the frontmost app's focused/window element. + if focused_ui_ptr.is_null() { + let workspace = unsafe { NSWorkspace::sharedWorkspace() }; + let frontmost_app = unsafe { workspace.frontmostApplication() }?; + let pid = unsafe { frontmost_app.processIdentifier() }; + + // Skip if frontmost is Coco (this process). + let my_pid = std::process::id() as i32; + if pid == my_pid { + return None; + } + + let app_element = unsafe { AXUIElement::new_application(pid) }; + let err = unsafe { + app_element + .copy_attribute_value(&focused_attr, NonNull::new(&mut focused_ui_ptr).unwrap()) + }; + if err != AXError::Success || focused_ui_ptr.is_null() { + // Try `AXFocusedWindow` as a lightweight fallback. + let mut focused_window_ptr: *const CFType = std::ptr::null(); + let focused_window_attr = CFString::from_static_str("AXFocusedWindow"); + let w_err = unsafe { + app_element.copy_attribute_value( + &focused_window_attr, + NonNull::new(&mut focused_window_ptr).unwrap(), + ) + }; + if w_err != AXError::Success || focused_window_ptr.is_null() { + return None; + } + focused_ui_ptr = focused_window_ptr; + } + } + + let focused_ui_elem: *mut AXUIElement = focused_ui_ptr.cast::().cast_mut(); + let focused_ui: CFRetained = + unsafe { CFRetained::from_raw(NonNull::new(focused_ui_elem).unwrap()) }; + + // Prefer `AXSelectedText`; otherwise return None (can be extended to read ranges). + let mut selected_text_ptr: *const CFType = std::ptr::null(); + let selected_text_attr = CFString::from_static_str("AXSelectedText"); + let err = unsafe { + focused_ui.copy_attribute_value( + &selected_text_attr, + NonNull::new(&mut selected_text_ptr).unwrap(), + ) + }; + if err != AXError::Success || selected_text_ptr.is_null() { + return None; + } + + // CFString → Rust String + let selected_cfstr: CFRetained = unsafe { + CFRetained::from_raw(NonNull::new(selected_text_ptr.cast::().cast_mut()).unwrap()) + }; + + Some(selected_cfstr.to_string()) +} + +/// Read selected text with lightweight retries to handle transient AX focus instability. +#[cfg(target_os = "macos")] +fn read_selected_text_with_retries(retries: u32, delay_ms: u64) -> Option { + use std::thread; + use std::time::Duration; + for attempt in 0..=retries { + if let Some(text) = read_selected_text() { + if !text.is_empty() { + if attempt > 0 { + log::info!( + "read_selected_text: 第{}次重试成功,获取到选中文本", + attempt + ); + } + return Some(text); + } + } + if attempt < retries { + thread::sleep(Duration::from_millis(delay_ms)); + } + } + None +} diff --git a/src-tauri/src/setup/mod.rs b/src-tauri/src/setup/mod.rs index 7b895535..f8cab3c1 100644 --- a/src-tauri/src/setup/mod.rs +++ b/src-tauri/src/setup/mod.rs @@ -107,6 +107,12 @@ pub(crate) async fn backend_setup(tauri_app_handle: AppHandle, app_lang: String) }) .expect("failed to run this closure on the main thread"); + // Start system-wide selection monitor (macOS-only currently) + #[cfg(target_os = "macos")] + { + crate::selection_monitor::start_selection_monitor(tauri_app_handle.clone()); + } + crate::init(&tauri_app_handle).await; if let Err(err) = crate::extension::init_extensions(&tauri_app_handle).await { diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index b4bea35f..ef369f93 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -78,6 +78,29 @@ "state": "active", "radius": 7 } + }, + { + "label": "selection", + "title": "Selection", + "alwaysOnTop": true, + "shadow": false, + "decorations": false, + "transparent": true, + "closable": true, + "minimizable": false, + "maximizable": false, + "dragDropEnabled": false, + "resizable": false, + "center": false, + "url": "/ui/selection", + "hiddenTitle": true, + "visible": false, + "acceptFirstMouse": true, + "windowEffects": { + "effects": [], + "state": "active", + "radius": 7 + } } ], "security": { diff --git a/src/components/Assistant/AssistantFetcher.tsx b/src/components/Assistant/AssistantFetcher.tsx index 8fa62bfe..7917d9b8 100644 --- a/src/components/Assistant/AssistantFetcher.tsx +++ b/src/components/Assistant/AssistantFetcher.tsx @@ -25,7 +25,8 @@ export const AssistantFetcher = ({ query?: string; }) => { try { - if (await unrequitable()) { + // Only gate by current window service when no explicit serverId provided. + if (!params.serverId && (await unrequitable())) { return { total: 0, list: [], diff --git a/src/components/Assistant/AssistantList.tsx b/src/components/Assistant/AssistantList.tsx index b1122eae..278685aa 100644 --- a/src/components/Assistant/AssistantList.tsx +++ b/src/components/Assistant/AssistantList.tsx @@ -47,6 +47,10 @@ export function AssistantList({ assistantIDs = [] }: AssistantListProps) { const setAskAiAssistantId = useSearchStore((state) => { return state.setAskAiAssistantId; }); + const targetAssistantId = useSearchStore((state) => state.targetAssistantId); + const setTargetAssistantId = useSearchStore((state) => { + return state.setTargetAssistantId; + }); const { fetchAssistant } = AssistantFetcher({ debounceKeyword, @@ -81,17 +85,22 @@ export function AssistantList({ assistantIDs = [] }: AssistantListProps) { const [isKeyboardActive, setIsKeyboardActive] = useState(false); useEffect(() => { - if (!askAiAssistantId || assistantList.length === 0) return; - - const matched = assistantList.find((item) => { - return item._id === askAiAssistantId; - }); + const targetId = askAiAssistantId ?? targetAssistantId; + if (!targetId || assistantList.length === 0) return; + const matched = assistantList.find((item) => item._id === targetId); if (!matched) return; - setCurrentAssistant(matched); - setAskAiAssistantId(void 0); - }, [assistantList, askAiAssistantId]); + if (currentAssistant?._id !== matched._id) { + setCurrentAssistant(matched); + } + + if (askAiAssistantId) { + setAskAiAssistantId(void 0); + } else if (targetAssistantId) { + setTargetAssistantId(void 0); + } + }, [assistantList, askAiAssistantId, targetAssistantId]); useKeyPress( ["uparrow", "downarrow", "enter"], diff --git a/src/components/SearchChat/index.tsx b/src/components/SearchChat/index.tsx index bf8afdc4..5495b2a8 100644 --- a/src/components/SearchChat/index.tsx +++ b/src/components/SearchChat/index.tsx @@ -10,6 +10,7 @@ import { } from "react"; import clsx from "clsx"; import { useMount, useMutationObserver } from "ahooks"; +import { debounce } from "lodash-es"; import Search from "@/components/Search/Search"; import InputBox from "@/components/Search/InputBox"; @@ -36,7 +37,7 @@ import { import { useTauriFocus } from "@/hooks/useTauriFocus"; import { POPOVER_PANEL_SELECTOR } from "@/constants"; import { useChatStore } from "@/stores/chatStore"; -import { debounce } from "lodash-es"; +import { useSearchStore } from "@/stores/searchStore"; interface SearchChatProps { isTauri?: boolean; @@ -314,6 +315,43 @@ function SearchChat({ const { normalOpacity, blurOpacity } = useAppearanceStore(); + useEffect(() => { + const unlistenAsk = platformAdapter.listenEvent("selection-ask-ai", ({ payload }: any) => { + const value = typeof payload === "string" ? payload : String(payload?.text ?? ""); + dispatch({ type: "SET_CHAT_MODE", payload: true }); + dispatch({ type: "SET_INPUT", payload: value }); + platformAdapter.showWindow(); + }); + + const unlistenAction = platformAdapter.listenEvent("selection-action", ({ payload }: any) => { + const { action, text, assistantId } = payload || {}; + const value = String(text ?? ""); + if (action === "search") { + dispatch({ type: "SET_CHAT_MODE", payload: false }); + dispatch({ type: "SET_INPUT", payload: value }); + const { setSearchValue } = useSearchStore.getState(); + setSearchValue(value); + platformAdapter.showWindow(); + } else if (action === "chat") { + dispatch({ type: "SET_CHAT_MODE", payload: true }); + dispatch({ type: "SET_INPUT", payload: value }); + + const { assistantList } = useConnectStore.getState(); + const assistant = assistantList.find((item) => item._source?.id === assistantId); + if (assistant) { + const { setTargetAssistantId } = useSearchStore.getState(); + setTargetAssistantId(assistant._id); + } + platformAdapter.showWindow(); + } + }); + + return () => { + unlistenAsk.then((fn) => fn()); + unlistenAction.then((fn) => fn()); + }; + }, []); + useEffect(() => { if (isTauri) { changeMode(defaultStartupWindow === "chatMode"); diff --git a/src/components/Settings/Advanced/components/Selection/ButtonsList.tsx b/src/components/Settings/Advanced/components/Selection/ButtonsList.tsx new file mode 100644 index 00000000..37ea8946 --- /dev/null +++ b/src/components/Settings/Advanced/components/Selection/ButtonsList.tsx @@ -0,0 +1,304 @@ +import { useEffect, useRef, useState } from "react"; +import { + GripVertical, + Bot, + Copy, + Languages, + Search, + Volume2, + FileText, +} from "lucide-react"; +import clsx from "clsx"; +import { useTranslation } from "react-i18next"; + +import { AssistantFetcher } from "@/components/Assistant/AssistantFetcher"; +import { setCurrentWindowService } from "@/commands/windowService"; + +type ActionType = + | "search" + | "ask_ai" + | "translate" + | "summary" + | "copy" + | "speak" + | "custom"; + +type LucideIconName = + | "Search" + | "Bot" + | "Languages" + | "FileText" + | "Copy" + | "Volume2"; + +type IconConfig = + | { type: "lucide"; name: LucideIconName; color?: string } + | { type: "custom"; dataUrl: string; color?: string }; + +export type ButtonConfig = { + id: string; + label: string; + icon: IconConfig; + action: { + type: ActionType; + assistantId?: string; + assistantServerId?: string; + eventName?: string; + }; + labelKey?: string; +}; + +const LUCIDE_ICON_MAP: Record = { + Search, + Bot, + Languages, + FileText, + Copy, + Volume2, +}; + +const ASSISTANT_CACHE_KEY = "assistant_list_cache"; + +type AssistantCacheItem = { + list: any[]; + updatedAt: number; +}; + +function loadAssistantCache(): Record { + try { + const raw = localStorage.getItem(ASSISTANT_CACHE_KEY); + if (!raw) return {}; + const parsed = JSON.parse(raw); + if (parsed && typeof parsed === "object") return parsed; + return {}; + } catch { + return {}; + } +} + +function saveAssistantCache(cache: Record) { + try { + localStorage.setItem(ASSISTANT_CACHE_KEY, JSON.stringify(cache)); + } catch (e) { + console.error("Persist assistant cache failed:", e); + } +} + +type ButtonsListProps = { + buttons: ButtonConfig[]; + setButtons: React.Dispatch>; + serverList: any[]; +}; + +const ButtonsList = ({ buttons, setButtons, serverList }: ButtonsListProps) => { + const { t } = useTranslation(); + const { fetchAssistant } = AssistantFetcher({}); + + const [assistantByServer, setAssistantByServer] = useState>({}); + const [assistantLoadingByServer, setAssistantLoadingByServer] = useState>({}); + const [assistantCache, setAssistantCacheState] = useState>(() => loadAssistantCache()); + + const dragIndexRef = useRef(null); + const initializedServiceRef = useRef(false); + + const onDragStart = (index: number) => { + dragIndexRef.current = index; + }; + + const onDrop = (index: number) => { + const from = dragIndexRef.current; + dragIndexRef.current = null; + if (from === null || from === index) return; + setButtons((prev) => { + const next = [...prev]; + const [moved] = next.splice(from, 1); + next.splice(index, 0, moved); + return next; + }); + }; + + const updateAction = (id: string, patch: Partial) => { + setButtons((prev) => prev.map((b) => (b.id === id ? { ...b, action: { ...b.action, ...patch } } : b))); + }; + + const handleAssistantSelect = (btn: ButtonConfig, value: string) => { + const id = value || undefined; + updateAction(btn.id, { assistantId: id }); + }; + + const handleServerSelect = async (btn: ButtonConfig, serverId: string) => { + const sid = serverId || undefined; + try { + const target = serverList.find((s: any) => s.id === sid); + if (target) { + await setCurrentWindowService(target); + } + } catch (e) { + console.error("setCurrentWindowService failed:", e); + } + updateAction(btn.id, { assistantServerId: sid, assistantId: undefined }); + if (!sid) return; + + const cached = assistantCache[sid]; + if (cached && Array.isArray(cached.list)) { + setAssistantByServer((prev) => ({ ...prev, [sid]: cached.list })); + } + setAssistantLoadingByServer((prev) => ({ ...prev, [sid]: true })); + try { + const data = await fetchAssistant({ current: 1, pageSize: 1000, serverId: sid }); + const list = data.list || []; + setAssistantByServer((prev) => ({ ...prev, [sid]: list })); + const nextCache = { ...assistantCache, [sid]: { list, updatedAt: Date.now() } }; + setAssistantCacheState(nextCache); + saveAssistantCache(nextCache); + } catch (err) { + console.error("Fetch assistants for server failed:", err); + setAssistantByServer((prev) => ({ ...prev, [sid]: [] })); + } finally { + setAssistantLoadingByServer((prev) => ({ ...prev, [sid]: false })); + } + }; + + useEffect(() => { + if (initializedServiceRef.current) return; + initializedServiceRef.current = true; + + const preferredSid = + buttons.find((b) => b.action.assistantServerId)?.action.assistantServerId || + Object.keys(assistantCache)[0]; + + if (!preferredSid) return; + const target = serverList.find((s: any) => s.id === preferredSid); + if (!target) return; + + setCurrentWindowService(target).catch((e) => { + console.error("init setCurrentWindowService failed:", e); + }); + }, [serverList, buttons]); + + useEffect(() => { + const uniqueServerIds = Array.from( + new Set( + buttons + .map((b) => b.action.assistantServerId) + .filter((sid): sid is string => Boolean(sid)) + ) + ); + + uniqueServerIds.forEach(async (sid) => { + if (!sid) return; + const cached = assistantCache[sid]; + if (cached && Array.isArray(cached.list)) { + setAssistantByServer((prev) => ({ ...prev, [sid]: cached.list })); + } + setAssistantLoadingByServer((prev) => ({ ...prev, [sid]: true })); + try { + const data = await fetchAssistant({ current: 1, pageSize: 1000, serverId: sid }); + const list = data.list || []; + setAssistantByServer((prev) => ({ ...prev, [sid]: list })); + const nextCache = { ...assistantCache, [sid]: { list, updatedAt: Date.now() } }; + setAssistantCacheState(nextCache); + saveAssistantCache(nextCache); + } catch (err) { + console.error("Prefetch assistants for stored server failed:", err); + } finally { + setAssistantLoadingByServer((prev) => ({ ...prev, [sid]: false })); + } + }); + }, [buttons]); + + return ( +
+ {buttons.map((btn, index) => { + const IconComp = btn.icon.type === "lucide" ? LUCIDE_ICON_MAP[btn.icon.name] : null; + const isChat = ["ask_ai", "translate", "summary"].includes(btn.action.type); + const visualType: "Chat" | "Search" | "Tool" = isChat ? "Chat" : btn.action.type === "search" ? "Search" : "Tool"; + + return ( +
onDragStart(index)} + onDragOver={(e) => e.preventDefault()} + onDrop={() => onDrop(index)} + > +
+ + {IconComp ? ( + + ) : ( + icon + )} + {btn.labelKey ? t(btn.labelKey) : btn.label} + + {visualType} + + +
+ {isChat && ( + <> + + + {(() => { + const sid = btn.action.assistantServerId; + const list = (sid && assistantByServer[sid]) || []; + const loading = !!(sid && assistantLoadingByServer[sid]); + return ( + + ); + })()} + + )} +
+
+
+ ); + })} +
+ ); +}; + +export default ButtonsList; \ No newline at end of file diff --git a/src/components/Settings/Advanced/components/Selection/index.tsx b/src/components/Settings/Advanced/components/Selection/index.tsx new file mode 100644 index 00000000..91ec5538 --- /dev/null +++ b/src/components/Settings/Advanced/components/Selection/index.tsx @@ -0,0 +1,202 @@ +import { useEffect, useState } from "react"; +import { Sparkles } from "lucide-react"; +import { useTranslation } from "react-i18next"; + +import { useSelectionStore } from "@/stores/selectionStore"; +import SettingsToggle from "@/components/Settings/SettingsToggle"; +import SettingsItem from "@/components/Settings/SettingsItem"; +import platformAdapter from "@/utils/platformAdapter"; +import { useEnabledServers } from "@/hooks/useEnabledServers"; +import ButtonsList from "./ButtonsList"; + +/** + * Selection toolbar button config types + */ +type IconConfig = + | { type: "lucide"; name: LucideIconName; color?: string } + | { type: "custom"; dataUrl: string; color?: string }; + +type ActionType = + | "search" + | "ask_ai" + | "translate" + | "summary" + | "copy" + | "speak" + | "custom"; + +type ButtonConfig = { + id: string; + label: string; + icon: IconConfig; + action: { + type: ActionType; + assistantId?: string; + assistantServerId?: string; + eventName?: string; + }; + // i18n key for built-in labels; if present, render by t(labelKey) + labelKey?: string; +}; + +type LucideIconName = + | "Search" + | "Bot" + | "Languages" + | "FileText" + | "Copy" + | "Volume2"; + + +const DEFAULT_CONFIG: ButtonConfig[] = [ + { + id: "search", + label: "搜索", + labelKey: "selection.actions.search", + icon: { type: "lucide", name: "Search", color: "#6366F1" }, + action: { type: "search" }, + }, + { + id: "ask_ai", + label: "问答", + labelKey: "selection.actions.ask_ai", + icon: { type: "lucide", name: "Bot", color: "#0287FF" }, + action: { type: "ask_ai" }, + }, + { + id: "translate", + label: "翻译", + labelKey: "selection.actions.translate", + icon: { type: "lucide", name: "Languages", color: "#14B8A6" }, + action: { type: "translate" }, + }, + { + id: "summary", + label: "总结", + labelKey: "selection.actions.summary", + icon: { type: "lucide", name: "FileText", color: "#0EA5E9" }, + action: { type: "summary" }, + }, + { + id: "copy", + label: "复制", + labelKey: "selection.actions.copy", + icon: { type: "lucide", name: "Copy", color: "#64748B" }, + action: { type: "copy" }, + }, + { + id: "speak", + label: "朗读", + labelKey: "selection.actions.speak", + icon: { type: "lucide", name: "Volume2", color: "#F59E0B" }, + action: { type: "speak" }, + }, +]; + +const STORAGE_KEY = "selection_toolbar_config"; + +/** + * Utilities: load/save local toolbar config + */ +function loadToolbarConfig(): ButtonConfig[] { + try { + const raw = localStorage.getItem(STORAGE_KEY); + if (!raw) return DEFAULT_CONFIG; + const parsed = JSON.parse(raw); + if (Array.isArray(parsed) && parsed.length > 0) + return parsed as ButtonConfig[]; + return DEFAULT_CONFIG; + } catch { + return DEFAULT_CONFIG; + } +} +function saveToolbarConfig(cfg: ButtonConfig[]) { + localStorage.setItem(STORAGE_KEY, JSON.stringify(cfg)); +} + +/** + * Selection settings panel: toolbar buttons with sorting and assistant mapping + */ +const SelectionSettings = () => { + const { t } = useTranslation(); + // Reactive service and assistant list + const { enabledServers: serverList } = useEnabledServers(); + + const selectionEnabled = useSelectionStore((state) => state.selectionEnabled); + const iconsOnly = useSelectionStore((state) => state.iconsOnly); + const setIconsOnly = useSelectionStore((state) => state.setIconsOnly); + + useEffect(() => { + useSelectionStore.getState().initSync(); + }, []); + + // Initialize from global store; write back on change for multi-window sync + const toolbarConfig = useSelectionStore((s) => s.toolbarConfig); + const setToolbarConfig = useSelectionStore((s) => s.setToolbarConfig); + + const [buttons, setButtons] = useState(() => + loadToolbarConfig() + ); + + useEffect(() => { + // prefer store config if present + if (Array.isArray(toolbarConfig) && toolbarConfig.length > 0) { + setButtons(toolbarConfig as ButtonConfig[]); + } + }, []); + + useEffect(() => { + saveToolbarConfig(buttons); + setToolbarConfig(buttons); // push to store for multi-window + }, [buttons]); + + return ( +
+
+

{t("selection.title")}

+
+ + + { + try { + await platformAdapter.invokeBackend("set_selection_enabled", { + enabled: value, + }); + } catch (e) { + console.error("set_selection_enabled invoke failed:", e); + } + }} + label={t("settings.ai.toggle")} + /> + + + {selectionEnabled && ( +
+ + { + // Update local store + setIconsOnly(value); + }} + label={t("selection.display.iconsOnlyLabel")} + /> + + +
+ )} +
+ ); +}; + +export default SelectionSettings; diff --git a/src/components/Settings/Advanced/index.tsx b/src/components/Settings/Advanced/index.tsx index c3d3a1b6..4a7f64f6 100644 --- a/src/components/Settings/Advanced/index.tsx +++ b/src/components/Settings/Advanced/index.tsx @@ -10,6 +10,7 @@ import { Unplug, } from "lucide-react"; import { useMount } from "ahooks"; +import { isNil } from "lodash-es"; import Shortcuts from "./components/Shortcuts"; import SettingsItem from "../SettingsItem"; @@ -20,7 +21,7 @@ import SettingsInput from "@/components//Settings/SettingsInput"; import platformAdapter from "@/utils/platformAdapter"; import UpdateSettings from "./components/UpdateSettings"; import SettingsToggle from "../SettingsToggle"; -import { isNil } from "lodash-es"; +import SelectionSettings from "./components/Selection"; const Advanced = () => { const { t } = useTranslation(); @@ -189,6 +190,8 @@ const Advanced = () => { })} + + diff --git a/src/components/Settings/GeneralSettings.tsx b/src/components/Settings/GeneralSettings.tsx index 970ef8ed..a458c9c5 100644 --- a/src/components/Settings/GeneralSettings.tsx +++ b/src/components/Settings/GeneralSettings.tsx @@ -18,6 +18,7 @@ import { isTauri } from "@tauri-apps/api/core"; import { isEnabled } from "@tauri-apps/plugin-autostart"; import { emit } from "@tauri-apps/api/event"; import { useCreation } from "ahooks"; +import clsx from "clsx"; import SettingsItem from "./SettingsItem"; import SettingsToggle from "./SettingsToggle"; @@ -34,7 +35,6 @@ import { unregister_shortcut, } from "@/commands"; import platformAdapter from "@/utils/platformAdapter"; -import clsx from "clsx"; import { useAppearanceStore, WindowMode } from "@/stores/appearanceStore"; export function ThemeOption({ @@ -83,6 +83,8 @@ export default function GeneralSettings() { const { showTooltip, setShowTooltip, language, setLanguage } = useAppStore(); const { windowMode, setWindowMode } = useAppearanceStore(); + + const fetchAutoStartStatus = async () => { if (isTauri()) { try { @@ -305,6 +307,8 @@ export default function GeneralSettings() { })} + + , + React.ComponentPropsWithoutRef +>( + ( + { className, orientation = "horizontal", decorative = true, ...props }, + ref + ) => ( + + ) +) +Separator.displayName = SeparatorPrimitive.Root.displayName + +export { Separator } diff --git a/src/hooks/useEnabledServers.ts b/src/hooks/useEnabledServers.ts new file mode 100644 index 00000000..726a2bab --- /dev/null +++ b/src/hooks/useEnabledServers.ts @@ -0,0 +1,21 @@ +import { useMemo } from "react"; + +import { useConnectStore } from "@/stores/connectStore"; +import { getEnabledServers } from "@/utils/servers"; +import { useServers } from "./useServers"; + +/** + * Hook: returns enabled & available servers, plus refresh function. + */ +export function useEnabledServers() { + const serverList = useConnectStore((s) => s.serverList); + const { refreshServerList } = useServers(); + + const enabledServers = useMemo(() => { + const list = getEnabledServers(serverList); + // Further filter to public servers or those with user profile (logged-in) + return list.filter((s) => s.public || s.profile); + }, [serverList]); + + return { enabledServers, refreshServerList }; +} \ No newline at end of file diff --git a/src/hooks/useSelectionPanel.ts b/src/hooks/useSelectionPanel.ts new file mode 100644 index 00000000..e06c5a5f --- /dev/null +++ b/src/hooks/useSelectionPanel.ts @@ -0,0 +1,77 @@ +import { useCallback, useEffect, useRef, useState } from "react"; +import { debounce } from "lodash-es"; + +export interface SelectionState { + text: string; + rect: DOMRect | null; + visible: boolean; +} + +export function useSelectionPanel() { + const [state, setState] = useState({ + text: "", + rect: null, + visible: false, + }); + + const latestTextRef = useRef(""); + + const computeRect = useCallback((): DOMRect | null => { + const sel = window.getSelection(); + if (!sel || sel.isCollapsed || sel.rangeCount === 0) return null; + + const range = sel.getRangeAt(0); + const rect = range.getBoundingClientRect(); + if (!rect || rect.width === 0 || rect.height === 0) return null; + return rect; + }, []); + + const updateSelection = useCallback(() => { + const sel = window.getSelection(); + const text = sel?.toString().trim() ?? ""; + const rect = computeRect(); + + if (!text || !rect) { + setState((prev) => ({ ...prev, visible: false })); + latestTextRef.current = ""; + return; + } + + // Suppress duplicates to avoid flicker and needless IPC + if (text === latestTextRef.current && state.visible) { + // Only reposition on scroll/resize + setState((prev) => ({ ...prev, rect })); + return; + } + + latestTextRef.current = text; + setState({ text, rect, visible: true }); + }, [computeRect, state.visible]); + + useEffect(() => { + const onMouseUp = debounce(updateSelection, 50); + const onSelectionChange = debounce(updateSelection, 80); + + document.addEventListener("selectionchange", onSelectionChange); + document.addEventListener("mouseup", onMouseUp); + window.addEventListener("scroll", onSelectionChange, { passive: true }); + window.addEventListener("resize", onSelectionChange); + + return () => { + document.removeEventListener("selectionchange", onSelectionChange); + document.removeEventListener("mouseup", onMouseUp); + window.removeEventListener("scroll", onSelectionChange); + window.removeEventListener("resize", onSelectionChange); + }; + }, [updateSelection]); + + const close = useCallback(() => { + setState({ text: "", rect: null, visible: false }); + latestTextRef.current = ""; + }, []); + + return { + state, + close, + }; +} \ No newline at end of file diff --git a/src/hooks/useSelectionWindow.ts b/src/hooks/useSelectionWindow.ts new file mode 100644 index 00000000..3bb8a8b8 --- /dev/null +++ b/src/hooks/useSelectionWindow.ts @@ -0,0 +1,138 @@ +import { useEffect, useRef } from "react"; + +import platformAdapter from "@/utils/platformAdapter"; +import { useSelectionStore } from "@/stores/selectionStore"; +import { useSelectionPanel } from "@/hooks/useSelectionPanel"; + +export function useSelectionWindow() { + const { state: panelState, close: onClose } = useSelectionPanel(); + const lastWidthRef = useRef(null); + + // Subscribe to store for reactive updates + const iconsOnly = useSelectionStore((s) => s.iconsOnly); + const selectionEnabled = useSelectionStore((s) => s.selectionEnabled); + + const WIDTH_ICONS_ONLY = 250; + const WIDTH_FULL = 470; + const HEIGHT = 32; + const getSelectionWidth = (isIconsOnly: boolean) => + isIconsOnly ? WIDTH_ICONS_ONLY : WIDTH_FULL; + + useEffect(() => { + const openSelectionWindow = async (payload: any) => { + // console.log("[selection] openSelectionWindow payload", payload); + // when selection is disabled, hide the existing window and return + if (!selectionEnabled) { + const existing = await platformAdapter.getWindowByLabel("selection"); + if (existing) { + await existing.hide(); + } + return; + } + + const label = "selection"; + const width = getSelectionWidth(iconsOnly); + const height = HEIGHT; + + const options: any = { + label, + title: "Selection", + width, + height, + alwaysOnTop: true, + shadow: false, + decorations: false, + transparent: true, + closable: true, + minimizable: false, + maximizable: false, + dragDropEnabled: false, + resizable: false, + center: false, + url: "/ui/selection", + windowEffects: { + effects: [], + state: "active", + radius: 7, + }, + hiddenTitle: true, + visible: false, + acceptFirstMouse: true, + data: { timestamp: Date.now() }, + }; + + const raw = typeof payload === "string" ? payload : String(payload?.text ?? ""); + const text = raw.trim(); + + // Receive backend "top-left origin + logical coordinates (Quartz point)" directly, no need for dpr conversion + const xLogical = Math.round(Number(payload?.x ?? 0)); + const yLogical = Math.round(Number(payload?.y ?? 0)); + + const existingWindow = await platformAdapter.getWindowByLabel(label); + + // Empty text: hide existing window and emit empty event + if (!text) { + if (existingWindow) { + await existingWindow.hide(); + } + await platformAdapter.emitEvent("selection-text", ""); + return; + } + + if (!existingWindow) { + await platformAdapter.createWindow(label, options); + } + const win = await platformAdapter.getWindowByLabel(label); + if (!win) return; + + // Set window size to fixed width and height + // Avoid redundant setSize calls if width is unchanged + if (lastWidthRef.current !== width) { + // @ts-ignore + await win.setSize({ type: "Logical", width, height }); + lastWidthRef.current = width; + } + + await win.show(); + + // Position window based on "top-left origin + logical coordinates" directly + // X offset 0, Y offset -40px (not subtracting window height) + if (xLogical > 0 || yLogical > 0) { + const offsetX = 0; + const offsetY = 40; + const targetX = Math.max(0, xLogical + offsetX); + const targetY = Math.max(0, yLogical - offsetY); + // @ts-ignore + await win.setPosition({ type: "Logical", x: targetX, y: targetY }); + } + + await platformAdapter.emitEvent("selection-text", text); + }; + + // DOM fallback: when panel is visible and has text, use its position + if (panelState?.visible && panelState?.text) { + const rect = panelState.rect || null; + const screenX = window.screenX || 0; // CSS pixel (logical coordinate) + const screenY = window.screenY || 0; // CSS pixel (logical coordinate) + const xLogical = rect ? Math.round(screenX + rect.left) : 0; + const yLogical = rect ? Math.round(screenY + rect.top) : 0; + console.log("[selection] DOM fallback logical", { screenX, screenY, rect, xLogical, yLogical }); + + openSelectionWindow({ text: panelState.text, x: xLogical, y: yLogical }); + onClose?.(); + } + + // Listen to selection-detected event from backend + const unlistenSelection = platformAdapter.listenEvent( + "selection-detected", + async (event: any) => { + const payload = event?.payload; + await openSelectionWindow(payload); + } + ); + + return () => { + unlistenSelection.then((fn) => fn()); + }; + }, [panelState?.visible, panelState?.text, onClose, iconsOnly, selectionEnabled]); +} \ No newline at end of file diff --git a/src/hooks/useTray.ts b/src/hooks/useTray.ts index fe8879ae..a2fb37de 100644 --- a/src/hooks/useTray.ts +++ b/src/hooks/useTray.ts @@ -9,6 +9,7 @@ import { isMac } from "@/utils/platform"; import { useAppStore } from "@/stores/appStore"; import platformAdapter from "@/utils/platformAdapter"; import { show_coco, show_settings, show_check } from "@/commands"; +import { useSelectionStore } from "@/stores/selectionStore"; const TRAY_ID = "COCO_TRAY"; @@ -16,11 +17,13 @@ export const useTray = () => { const { t, i18n } = useTranslation(); const showCocoShortcuts = useAppStore((state) => state.showCocoShortcuts); + const selectionEnabled = useSelectionStore((state) => state.selectionEnabled); + useUpdateEffect(() => { if (showCocoShortcuts.length === 0) return; updateTrayMenu(); - }, [i18n.language, showCocoShortcuts]); + }, [i18n.language, showCocoShortcuts, selectionEnabled]); const getTrayById = () => { return TrayIcon.getById(TRAY_ID); @@ -56,6 +59,18 @@ export const useTray = () => { }, }), PredefinedMenuItem.new({ item: "Separator" }), + MenuItem.new({ + text: selectionEnabled + ? t("tray.selectionDisable") + : t("tray.selectionEnable"), + action: async () => { + try { + await platformAdapter.invokeBackend("set_selection_enabled", { enabled: !selectionEnabled }); + } catch (e) { + console.error("set_selection_enabled invoke failed:", e); + } + }, + }), MenuItem.new({ text: t("tray.settings"), // accelerator: "CommandOrControl+,", diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index bdcaa2fa..95c27e9a 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -23,6 +23,11 @@ "default": "Default", "compact": "Compact" }, + "ai": { + "title": "Selection Toolbar", + "description": "Show selection toolbar after text selection", + "toggle": "Enable selection toolbar" + }, "language": { "title": "Language", "description": "Choose your preferred language", @@ -534,6 +539,8 @@ }, "tray": { "showCoco": "Show Coco", + "selectionDisable": "Disable Selection Toolbar", + "selectionEnable": "Enable Selection Toolbar", "settings": "Settings", "quitCoco": "Quit Coco", "checkUpdate": "Check for Updates" @@ -628,5 +635,42 @@ "buttons": { "login": "Login" } + }, + "selection": { + "title": "Selection Toolbar Settings", + "actions": { + "search": "Search", + "ask_ai": "Q&A", + "translate": "Translate", + "summary": "Summary", + "copy": "Copy", + "speak": "Read Aloud" + }, + "noText": "No text detected", + "copied": "Copied", + "speak": { + "stopTitle": "Stop speaking", + "stopAria": "Stop speaking", + "stopLabel": "Stop", + "pauseTitle": "Pause speaking", + "pauseAria": "Pause speaking", + "pauseLabel": "Pause", + "resumeTitle": "Resume speaking", + "resumeAria": "Resume speaking", + "resumeLabel": "Resume", + "volumeSr": "Volume", + "volumeAria": "Speech volume" + }, + "display": { + "title": "Display Style", + "iconsOnlyDesc": "Show icons only (hide text labels)", + "iconsOnlyLabel": "Icons only" + }, + "bind": { + "service": "Select Service", + "defaultService": "Default service", + "assistant": "Bind Assistant (Chat only)", + "defaultAssistant": "Default assistant" + } } } diff --git a/src/locales/zh/translation.json b/src/locales/zh/translation.json index dfa5bad4..a86f3b99 100644 --- a/src/locales/zh/translation.json +++ b/src/locales/zh/translation.json @@ -23,6 +23,11 @@ "default": "默认", "compact": "紧凑" }, + "ai": { + "title": "划词工具栏", + "description": "选择文本后显示独立可操作窗口", + "toggle": "启用划词工具栏" + }, "language": { "title": "语言", "description": "选择您的首选语言", @@ -534,6 +539,8 @@ }, "tray": { "showCoco": "显示 Coco", + "selectionDisable": "禁用划词工具栏", + "selectionEnable": "启用划词工具栏", "settings": "偏好设置", "quitCoco": "退出 Coco", "checkUpdate": "检查更新" @@ -627,5 +634,42 @@ "buttons": { "login": "登录" } + }, + "selection": { + "title": "划词工具栏设置", + "actions": { + "search": "搜索", + "ask_ai": "问答", + "translate": "翻译", + "summary": "总结", + "copy": "复制", + "speak": "朗读" + }, + "noText": "未检测到文本", + "copied": "已复制", + "speak": { + "stopTitle": "停止朗读", + "stopAria": "停止朗读", + "stopLabel": "停止", + "pauseTitle": "暂停朗读", + "pauseAria": "暂停朗读", + "pauseLabel": "暂停", + "resumeTitle": "继续朗读", + "resumeAria": "继续朗读", + "resumeLabel": "继续", + "volumeSr": "音量", + "volumeAria": "朗读音量" + }, + "display": { + "title": "显示样式", + "iconsOnlyDesc": "仅显示图标(隐藏文字标签)", + "iconsOnlyLabel": "仅显示图标" + }, + "bind": { + "service": "选择服务", + "defaultService": "默认服务", + "assistant": "绑定小助手(仅聊天)", + "defaultAssistant": "默认小助手" + } } } diff --git a/src/pages/selection/index.tsx b/src/pages/selection/index.tsx new file mode 100644 index 00000000..dc3e43eb --- /dev/null +++ b/src/pages/selection/index.tsx @@ -0,0 +1,518 @@ +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { + Bot, + Copy, + Languages, + Search, + X, + Volume2, + Pause, + Play, + FileText, +} from "lucide-react"; +import clsx from "clsx"; +import { useTranslation } from "react-i18next"; +import { Separator } from "@radix-ui/react-separator"; + +import { useSelectionStore } from "@/stores/selectionStore"; +import { copyToClipboard } from "@/utils"; +import cocoLogoImg from "@/assets/app-icon.png"; +import platformAdapter from "@/utils/platformAdapter"; + +// Simple animated selection window content +export default function SelectionWindow() { + const { t } = useTranslation(); + + const [text, setText] = useState(""); + const [visible, setVisible] = useState(false); + const [animatingOut, setAnimatingOut] = useState(false); + const containerRef = useRef(null); + const [copied, setCopied] = useState(false); + const [isSpeaking, setIsSpeaking] = useState(false); + const [isPaused, setIsPaused] = useState(false); + const [volume, setVolume] = useState(1); + const utteranceRef = useRef(null); + const voicesRef = useRef([]); + const textRef = useRef(""); + + const AUTO_HIDE_KEY = "selection_auto_hide_ms"; + const autoHideMs = useMemo(() => { + const v = Number(localStorage.getItem(AUTO_HIDE_KEY)); + return Number.isFinite(v) && v > 0 ? v : 5000; + }, []); + const timerRef = useRef(null); + + const scheduleAutoHide = () => { + if (timerRef.current) { + clearTimeout(timerRef.current); + } + timerRef.current = window.setTimeout(() => { + close(); + }, autoHideMs); + }; + + useEffect(() => { + try { + const updateVoices = () => { + voicesRef.current = window.speechSynthesis.getVoices(); + }; + updateVoices(); + window.speechSynthesis.onvoiceschanged = updateVoices; + } catch {} + + const unlistenPromise = platformAdapter.listenEvent( + "selection-text", + async ({ payload }: any) => { + const incoming = + typeof payload === "string" ? payload : String(payload?.text ?? ""); + const trimmed = incoming.trim(); + + const getCurrentWinSafe = async () => { + try { + return await platformAdapter.getCurrentWebviewWindow(); + } catch { + return null; + } + }; + + if (!useSelectionStore.getState().selectionEnabled) { + setVisible(false); + const win = await getCurrentWinSafe(); + win?.hide(); + return; + } + + if (!trimmed) { + setText(""); + textRef.current = ""; // sync ref immediately to avoid stale value + setVisible(false); + const win = await getCurrentWinSafe(); + win?.hide(); + return; + } + + setText(incoming); + textRef.current = incoming; // sync ref immediately to avoid relying on render + setAnimatingOut(false); + setVisible(true); + + if (timerRef.current) { + clearTimeout(timerRef.current); + timerRef.current = null; + } + scheduleAutoHide(); + } + ); + + return () => { + unlistenPromise + .then((fn) => { + try { + fn(); + } catch {} + }) + .catch(() => {}); + if (timerRef.current) { + clearTimeout(timerRef.current); + timerRef.current = null; + } + }; + }, [autoHideMs]); + + useEffect(() => { + useSelectionStore.getState().initSync(); + }, []); + + const close = async () => { + if (timerRef.current) { + clearTimeout(timerRef.current); + timerRef.current = null; + } + try { + window.speechSynthesis.cancel(); + } catch {} + setIsSpeaking(false); + setIsPaused(false); + setAnimatingOut(true); + setTimeout(async () => { + setVisible(false); + const win = await platformAdapter.getCurrentWebviewWindow(); + win?.hide(); + }, 150); + }; + + const openMain = async () => { + try { + await platformAdapter.commands("show_coco"); + } catch { + await platformAdapter.emitEvent("show-coco"); + await platformAdapter.showWindow(); + } + }; + + const handleChatAction = useCallback( + async (assistantId?: string) => { + const payloadText = (textRef.current || "").trim(); + if (!payloadText) return; + + await openMain(); + await new Promise((r) => setTimeout(r, 120)); + + await platformAdapter.emitEvent("selection-action", { + action: "chat", + text: payloadText, + assistantId, + }); + + if (!isSpeaking) { + await close(); + } + }, + [openMain, isSpeaking, close] + ); + + const searchMain = useCallback(async () => { + const payloadText = (textRef.current || "").trim(); + console.log("searchMain payload", payloadText); + if (!payloadText) return; + + await openMain(); + await new Promise((r) => setTimeout(r, 120)); + await platformAdapter.emitEvent("selection-action", { + action: "search", + text: payloadText, + }); + if (!isSpeaking) { + await close(); + } + }, []); + + const stopSpeak = () => { + window.speechSynthesis.cancel(); + utteranceRef.current = null; + setIsSpeaking(false); + setIsPaused(false); + }; + + const speak = useCallback(async () => { + try { + const trimmed = text.trim(); + if (!trimmed) return; + + if (isSpeaking && !isPaused) { + window.speechSynthesis.pause(); + setIsPaused(true); + return; + } + if (isSpeaking && isPaused) { + window.speechSynthesis.resume(); + setIsPaused(false); + return; + } + + const utterance = new SpeechSynthesisUtterance(trimmed); + const zhVoice = + voicesRef.current.find((v) => /zh|cn/i.test(v.lang)) || + window.speechSynthesis.getVoices().find((v) => /zh|cn/i.test(v.lang)); + if (zhVoice) utterance.voice = zhVoice; + utterance.rate = 1; + utterance.volume = volume; + + // pause auto-hide while speaking + if (timerRef.current) { + clearTimeout(timerRef.current); + timerRef.current = null; + } + + utterance.onend = () => { + setIsSpeaking(false); + setIsPaused(false); + utteranceRef.current = null; + scheduleAutoHide(); + }; + utterance.onerror = () => { + setIsSpeaking(false); + setIsPaused(false); + utteranceRef.current = null; + scheduleAutoHide(); + }; + + utteranceRef.current = utterance; + window.speechSynthesis.cancel(); + window.speechSynthesis.speak(utterance); + setIsSpeaking(true); + setIsPaused(false); + } catch (e) { + console.error("TTS 播放失败", e); + stopSpeak(); + scheduleAutoHide(); + } + }, [text]); + + const handleCopy = useCallback(async () => { + const payloadText = (textRef.current || "").trim(); + if (!payloadText) return; + + try { + await copyToClipboard(payloadText, true); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } catch (e) { + console.warn("Copy failed:", e); + } + }, []); + + const getActionHandler = (type: string, assistantId?: string) => { + switch (type) { + case "ask_ai": + case "translate": + case "summary": + return () => handleChatAction(assistantId); + case "copy": + return handleCopy; + case "search": + return searchMain; + case "speak": + return speak; + default: + return () => {}; + } + }; + + // Render buttons from store; hide ones requiring assistant without assistantId + const toolbarConfig = useSelectionStore((s) => s.toolbarConfig); + const iconsOnly = useSelectionStore((s) => s.iconsOnly); + + const requiresAssistant = (type?: string) => + type === "ask_ai" || type === "translate" || type === "summary"; + + const visibleButtons = useMemo( + () => + (Array.isArray(toolbarConfig) ? toolbarConfig : []).filter((btn: any) => { + const type = btn?.action?.type; + if (requiresAssistant(type)) { + return Boolean(btn?.action?.assistantId); + } + return true; + }), + [toolbarConfig] + ); + + // Lucide icon map for dynamic rendering + const LUCIDE_ICON_MAP: Record = { + Search, + Bot, + Languages, + FileText, + Copy, + Volume2, + }; + + // Component: render icon (lucide or custom) + const IconRenderer = ({ icon }: { icon?: any }) => { + // Support lucide icon or custom image + if (icon?.type === "lucide") { + const Icon = + LUCIDE_ICON_MAP[icon?.name as string] || LUCIDE_ICON_MAP.Search; + return ( + + ); + } + if (icon?.type === "custom" && icon?.dataUrl) { + return ( + + ); + } + // default + return ; + }; + + // Component: single toolbar button + const ToolbarButton = ({ + btn, + onClick, + }: { + btn: any; + onClick: () => void; + }) => { + const label = btn?.labelKey ? t(btn.labelKey) : btn?.label || btn?.id || ""; + return ( + + ); + }; + + // Component: header logo + const HeaderLogo = () => { + return ( + Coco Logo { + try { + (e.target as HTMLImageElement).src = "/src-tauri/assets/logo.png"; + } catch {} + }} + /> + ); + }; + + // Component: selected text preview + const TextPreview = ({ text }: { text: string }) => { + return ( +
+
+ {text || t("selection.noText")} +
+ {copied && ( +
+ + {t("selection.copied")} + +
+ )} +
+ ); + }; + + // Component: speak controls + const SpeakControls = () => { + return ( +
+ + + +
+ ); + }; + + return ( +
{ + if (e.target === containerRef.current && !isSpeaking) { + close(); + } + }} + className={clsx( + "m-0 p-0 w-full h-full overflow-hidden", + "text-[13px] select-none", + "bg-white dark:bg-[#1E293B]", + "text-[#111] dark:text-[#ddd]", + "rounded-xl", + "transition-all duration-150", + { + "translate-y-0": visible && !animatingOut, + "translate-y-1": !visible || animatingOut, + } + )} + > +
+ +
+ +
+ + + + + {visibleButtons.map((btn: any) => { + const { type, assistantId } = btn?.action; + return ( + + ); + })} + + {isSpeaking && } +
+
+ ); +} diff --git a/src/routes/index.tsx b/src/routes/index.tsx index adb3196a..7479f07f 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -7,6 +7,7 @@ import SettingsPage from "@/pages/settings/index"; import StandaloneChat from "@/pages/chat/index"; import WebPage from "@/pages/web/index"; import CheckPage from "@/pages/check/index"; +import SelectionWindow from "@/pages/selection/index"; const routerOptions = { basename: "/", @@ -27,6 +28,7 @@ export const router = createBrowserRouter( { path: "/ui/settings", element: }, { path: "/ui/chat", element: }, { path: "/ui/check", element: }, + { path: "/ui/selection", element: }, { path: "/web", element: }, ], }, diff --git a/src/routes/outlet.tsx b/src/routes/outlet.tsx index 8ba79b54..12b5e5b6 100644 --- a/src/routes/outlet.tsx +++ b/src/routes/outlet.tsx @@ -17,6 +17,8 @@ import { Extension } from "@/components/Settings/Extensions"; import { useExtensionsStore } from "@/stores/extensionsStore"; import { useServers } from "@/hooks/useServers"; import { useDeepLinkManager } from "@/hooks/useDeepLinkManager"; +import { useSelectionWindow } from "../hooks/useSelectionWindow"; +import { useSelectionStore } from "@/stores/selectionStore"; export default function LayoutOutlet() { const location = useLocation(); @@ -30,6 +32,27 @@ export default function LayoutOutlet() { // init deep link manager useDeepLinkManager(); + // --- Selection state: init + subscribe backend as SSOT --- + useMount(async () => { + try { + const enabled = await platformAdapter.invokeBackend("get_selection_enabled"); + useSelectionStore.getState().setSelectionEnabled(!!enabled); + } catch (e) { + console.error("get_selection_enabled failed:", e); + } + + const unlisten = await platformAdapter.listenEvent( + "selection-enabled", + ({ payload }: any) => { + useSelectionStore.getState().setSelectionEnabled(!!payload?.enabled); + } + ); + + return () => { + unlisten && unlisten(); + }; + }); + useEffect(() => { i18n.changeLanguage(language); }, [language]); @@ -119,6 +142,9 @@ export default function LayoutOutlet() { setDisabledExtensions(disabledExtensions.map((item) => item.id)); }); + // --- Selection window --- + useSelectionWindow(); + return ( <> diff --git a/src/stores/searchStore.ts b/src/stores/searchStore.ts index ecd1c3a4..7ee729d3 100644 --- a/src/stores/searchStore.ts +++ b/src/stores/searchStore.ts @@ -44,6 +44,8 @@ export type ISearchStore = { setEnabledAiOverview: (enabledAiOverview: boolean) => void; askAiAssistantId?: string; setAskAiAssistantId: (askAiAssistantId?: string) => void; + targetAssistantId?: string; + setTargetAssistantId: (targetAssistantId?: string) => void; visibleExtensionStore: boolean; setVisibleExtensionStore: (visibleExtensionStore: boolean) => void; searchValue: string; @@ -102,6 +104,9 @@ export const useSearchStore = create()( setAskAiAssistantId: (askAiAssistantId) => { return set({ askAiAssistantId }); }, + setTargetAssistantId: (targetAssistantId) => { + return set({ targetAssistantId }); + }, visibleExtensionStore: false, setVisibleExtensionStore: (visibleExtensionStore) => { return set({ visibleExtensionStore }); diff --git a/src/stores/selectionStore.ts b/src/stores/selectionStore.ts new file mode 100644 index 00000000..435b924f --- /dev/null +++ b/src/stores/selectionStore.ts @@ -0,0 +1,65 @@ +import { create } from "zustand"; +import { persist, subscribeWithSelector } from "zustand/middleware"; +import platformAdapter from "@/utils/platformAdapter"; + +export type ISelectionStore = { + // whether selection is enabled + selectionEnabled: boolean; + setSelectionEnabled: (selectionEnabled: boolean) => void; + // toolbar buttons configuration for selection window + toolbarConfig: any[]; + setToolbarConfig: (toolbarConfig: any[]) => void; + // whether to show icons only (hide labels) in selection window + iconsOnly: boolean; + setIconsOnly: (iconsOnly: boolean) => void; + // initialize cross-window sync listeners once + initSync: () => Promise; +}; + +export const useSelectionStore = create()( + subscribeWithSelector( + persist( + (set) => ({ + selectionEnabled: false, + setSelectionEnabled(selectionEnabled) { + set({ selectionEnabled }); + }, + toolbarConfig: [], + setToolbarConfig(toolbarConfig) { + return set({ toolbarConfig }); + }, + iconsOnly: false, + setIconsOnly(iconsOnly) { + set({ iconsOnly }); + // broadcast to other windows + try { + platformAdapter.emitEvent("selection-icons-only", { value: iconsOnly }); + } catch {} + }, + initSync: async () => { + // ensure listener only initialized once per window context + const hasInit = (window as any).__selectionIconsOnlyInit__; + if (hasInit) return; + (window as any).__selectionIconsOnlyInit__ = true; + try { + await platformAdapter.listenEvent( + "selection-icons-only", + ({ payload }: any) => { + const next = Boolean(payload?.value); + // apply without re-broadcast to avoid echo + set({ iconsOnly: next }); + } + ); + } catch {} + }, + }), + { + name: "selection-store", + partialize: (state) => ({ + toolbarConfig: state.toolbarConfig, + iconsOnly: state.iconsOnly, + }), + } + ) + ) +); \ No newline at end of file diff --git a/src/types/platform.ts b/src/types/platform.ts index 8b1c9deb..8bc5c966 100644 --- a/src/types/platform.ts +++ b/src/types/platform.ts @@ -51,6 +51,15 @@ export interface EventPayloads { extension_install_success: any; open_view_extension: ViewExtensionOpened; "server-list-changed": Server[]; + "selection-text": string; + "selection-ask-ai": any; + "selection-action": { + action: "translate" | "search" | "copy" | "summary"; + text: string; + }; + "selection-detected": string; + "selection-enabled": boolean; + "selection-icons-only": { value: boolean }; } // Window operation interface @@ -65,6 +74,7 @@ export interface WindowOperations { setFocus: () => Promise; center: () => Promise; close: () => Promise; + hide: () => Promise; } | null>; createWindow: (label: string, options: any) => Promise; createWebviewWindow: (label: string, options: any) => Promise; diff --git a/src/utils/index.ts b/src/utils/index.ts index 12695f72..251efb6b 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -10,7 +10,7 @@ import { getCurrentWindowService } from "@/commands/windowService"; import { useSearchStore } from "@/stores/searchStore"; import i18next from "i18next"; -export async function copyToClipboard(text: string) { +export async function copyToClipboard(text: string, noTip = false) { const addError = useAppStore.getState().addError; const language = useAppStore.getState().language; @@ -37,7 +37,7 @@ export async function copyToClipboard(text: string) { document.body.removeChild(textArea); } - addError(language === "zh" ? "复制成功" : "Copy Success", "info"); + !noTip && addError(language === "zh" ? "复制成功" : "Copy Success", "info"); } // 2 diff --git a/src/utils/servers.ts b/src/utils/servers.ts new file mode 100644 index 00000000..fde41d80 --- /dev/null +++ b/src/utils/servers.ts @@ -0,0 +1,9 @@ +import type { Server } from "@/types/server"; + +/** + * Return enabled and available servers from a server list. + */ +export function getEnabledServers(list: Server[] | any[]): Server[] { + if (!Array.isArray(list)) return [] as Server[]; + return (list as Server[]).filter((s) => s.enabled && s.available); +} \ No newline at end of file