diff --git a/Cargo.lock b/Cargo.lock index d92bd37327..b2f215b3df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18,7 +18,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", @@ -40,7 +40,7 @@ dependencies = [ "actix-service", "actix-utils", "base64 0.22.1", - "bitflags 2.9.4", + "bitflags 2.10.0", "bytes", "bytestring", "derive_more 2.0.1", @@ -230,9 +230,9 @@ 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", ] @@ -247,7 +247,7 @@ dependencies = [ "bytes", "cfg-if", "http 1.3.1", - "indexmap 2.11.4", + "indexmap 2.12.0", "schemars 0.9.0", "serde", "serde_json", @@ -286,7 +286,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" dependencies = [ "alsa-sys", - "bitflags 2.9.4", + "bitflags 2.10.0", "cfg-if", "libc", ] @@ -771,7 +771,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -811,7 +811,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -848,7 +848,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1026,9 +1026,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.108.0" +version = "1.109.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200be4aed61e3c0669f7268bacb768f283f1c32a7014ce57225e1160be2f6ccb" +checksum = "3c6d81b75f8ff78882e70c5909804b44553d56136899fb4015a0a68ecc870e0e" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1082,9 +1082,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.88.0" +version = "1.89.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a68d675582afea0e94d38b6ca9c5aaae4ca14f1d36faa6edb19b42e687e70d7" +checksum = "695dc67bb861ccb8426c9129b91c30e266a0e3d85650cafdf62fcca14c8fd338" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1149,9 +1149,9 @@ dependencies = [ [[package]] name = "aws-sdk-transcribestreaming" -version = "1.89.0" +version = "1.90.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "972e22d658d1eedcff86c47c1f51c89599bd49830da8a9fc682c5ebb84f8deef" +checksum = "a5960c68943662749c752dfa3f0bbf3fb0f8d6d766b15eb20cdd3e379095830b" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1284,7 +1284,7 @@ dependencies = [ "hyper-util", "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-native-certs 0.8.2", "rustls-pki-types", "tokio", @@ -1574,9 +1574,9 @@ dependencies = [ [[package]] name = "backon" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592277618714fbcecda9a02ba7a8781f319d26532a88553bbacc77ba5d2b3a8d" +checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" dependencies = [ "fastrand 2.3.0", "gloo-timers", @@ -1660,7 +1660,7 @@ dependencies = [ "globset", "grep-cli", "home", - "indexmap 2.11.4", + "indexmap 2.12.0", "itertools 0.13.0", "nu-ansi-term", "once_cell", @@ -1697,7 +1697,7 @@ version = "0.66.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cexpr", "clang-sys", "lazy_static", @@ -1710,7 +1710,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.106", + "syn 2.0.108", "which", ] @@ -1720,7 +1720,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cexpr", "clang-sys", "itertools 0.12.1", @@ -1733,7 +1733,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.106", + "syn 2.0.108", "which", ] @@ -1743,7 +1743,7 @@ version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -1754,7 +1754,7 @@ dependencies = [ "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1763,7 +1763,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", @@ -1774,7 +1774,7 @@ dependencies = [ "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1811,11 +1811,11 @@ 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]] @@ -1895,7 +1895,7 @@ dependencies = [ "hyperlocal", "log", "pin-project-lite", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-native-certs 0.8.2", "rustls-pemfile 2.2.0", "rustls-pki-types", @@ -1953,7 +1953,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1968,7 +1968,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1994,9 +1994,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" dependencies = [ "memchr", "regex-automata", @@ -2036,7 +2036,7 @@ dependencies = [ "proc-macro2", "quote", "str_inflector", - "syn 2.0.106", + "syn 2.0.108", "thiserror 1.0.69", "try_match", ] @@ -2064,7 +2064,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2137,7 +2137,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2152,7 +2152,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", "libc", @@ -2435,9 +2435,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.41" +version = "1.2.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" +checksum = "739eb0f94557554b3ca9a86d2d37bebd49c5e6d0c1d2bda35ba5bdac830befc2" dependencies = [ "find-msvc-tools", "jobserver", @@ -2613,9 +2613,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.49" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4512b90fa68d3a9932cea5184017c5d200f5921df706d45e853537dea51508f" +checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" dependencies = [ "clap_builder", "clap_derive", @@ -2623,9 +2623,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.49" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0025e98baa12e766c67ba13ff4695a887a1eba19569aad00a472546795bd6730" +checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" dependencies = [ "anstream", "anstyle", @@ -2643,7 +2643,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2698,7 +2698,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", @@ -2714,7 +2714,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 0.2.0", @@ -2842,7 +2842,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180e549344080374f9b32ed41bf3b6b57885ff6a289367b3dbc10eea8acc1918" dependencies = [ "convert_case 0.6.0", - "indexmap 2.11.4", + "indexmap 2.12.0", "json5", "pathdiff", "ron", @@ -2991,7 +2991,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 0.2.0", "foreign-types 0.5.0", @@ -3004,7 +3004,7 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.10.1", "core-graphics-types 0.2.0", "foreign-types 0.5.0", @@ -3028,7 +3028,7 @@ 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", ] @@ -3229,7 +3229,7 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "crossterm_winapi", "mio", "parking_lot 0.12.5", @@ -3310,26 +3310,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] name = "csv" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" dependencies = [ "csv-core", "itoa", "ryu", - "serde", + "serde_core", ] [[package]] name = "csv-core" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" dependencies = [ "memchr", ] @@ -3341,16 +3341,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] name = "ctrlc" -version = "3.5.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881c5d0a13b2f1498e2306e82cbada78390e152d4b1378fb28a84f4dcd0dc4f3" +checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790" dependencies = [ - "dispatch", + "dispatch2", "nix 0.30.1", "windows-sys 0.61.2", ] @@ -3402,7 +3402,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3416,7 +3416,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3427,7 +3427,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3438,7 +3438,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3769,9 +3769,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", "serde_core", @@ -3785,7 +3785,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3806,7 +3806,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3816,7 +3816,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3829,7 +3829,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3849,7 +3849,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "unicode-xid", ] @@ -3869,6 +3869,7 @@ dependencies = [ "tauri-plugin-auth", "tauri-plugin-db2", "tauri-plugin-deep-link", + "tauri-plugin-detect", "tauri-plugin-dialog", "tauri-plugin-fs", "tauri-plugin-http", @@ -3878,6 +3879,7 @@ dependencies = [ "tauri-plugin-notification", "tauri-plugin-opener", "tauri-plugin-os", + "tauri-plugin-permissions", "tauri-plugin-process", "tauri-plugin-sentry", "tauri-plugin-shell", @@ -3899,7 +3901,6 @@ version = "0.1.0" dependencies = [ "cidre", "lazy_static", - "macos-accessibility-client", "objc2 0.6.3", "objc2-app-kit 0.3.2", "objc2-application-services", @@ -3986,7 +3987,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block2 0.6.2", "libc", "objc2 0.6.3", @@ -4000,7 +4001,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -4032,7 +4033,7 @@ checksum = "788160fb30de9cdd857af31c6a2675904b16ece8fc2737b2c7127ba368c9d0f4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -4259,7 +4260,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -4280,7 +4281,7 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -4497,7 +4498,7 @@ checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -4606,9 +4607,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", "miniz_oxide", @@ -4659,7 +4660,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -4794,7 +4795,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -5325,7 +5326,7 @@ checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -5334,7 +5335,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "libc", "libgit2-sys", "log", @@ -5426,18 +5427,18 @@ dependencies = [ [[package]] name = "gix-bitmap" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1db9765c69502650da68f0804e3dc2b5f8ccc6a2d104ca6c85bc40700d37540" +checksum = "5e150161b8a75b5860521cb876b506879a3376d3adc857ec7a9d35e7c6a5e531" dependencies = [ "thiserror 2.0.17", ] [[package]] name = "gix-chunk" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b1f1d8764958699dc764e3f727cef280ff4d1bd92c107bbf8acd85b30c1bd6f" +checksum = "5c356b3825677cb6ff579551bb8311a81821e184453cbd105e2fc5311b288eeb" dependencies = [ "thiserror 2.0.17", ] @@ -5495,7 +5496,7 @@ version = "0.14.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8dc2c844c4cf141884678cabef736fd91dd73068b9146e6f004ba1a0457944b6" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "bstr", "gix-path", "libc", @@ -5599,7 +5600,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f4399af6ec4fd9db84dd4cf9656c5c785ab492ab40a7c27ea92b4241923fed" dependencies = [ "gix-trace", - "gix-utils 0.3.0", + "gix-utils 0.3.1", "libc", "prodash", ] @@ -5649,7 +5650,7 @@ dependencies = [ "fastrand 2.3.0", "gix-features 0.42.1", "gix-path", - "gix-utils 0.3.0", + "gix-utils 0.3.1", "thiserror 2.0.17", ] @@ -5659,7 +5660,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20972499c03473e773a2099e5fd0c695b9b72465837797a51a43391a1635a030" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "bstr", "gix-features 0.41.1", "gix-path", @@ -5719,7 +5720,7 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "855bece2d4153453aa5d0a80d51deea1ce8cd6a3b4cf213da85ac344ccb908a7" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "bstr", "filetime", "fnv", @@ -5748,7 +5749,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "570f8b034659f256366dc90f1a24924902f20acccd6a15be96d44d1269e7a796" dependencies = [ "gix-tempfile", - "gix-utils 0.3.0", + "gix-utils 0.3.1", "thiserror 2.0.17", ] @@ -5838,15 +5839,14 @@ dependencies = [ [[package]] name = "gix-path" -version = "0.10.20" +version = "0.10.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06d37034a4c67bbdda76f7bcd037b2f7bc0fba0c09a6662b19697a5716e7b2fd" +checksum = "0416b41cd00ff292af9b94b0660880c44bd2ed66828ddca9a2b333535cbb71b8" dependencies = [ "bstr", "gix-trace", - "gix-validate 0.10.0", + "gix-validate 0.10.1", "home", - "once_cell", "thiserror 2.0.17", ] @@ -5856,7 +5856,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fef8422c3c9066d649074b24025125963f85232bfad32d6d16aea9453b82ec14" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "bstr", "gix-attributes", "gix-config-value", @@ -5936,7 +5936,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "342caa4e158df3020cadf62f656307c3948fe4eacfdf67171d7212811860c3e9" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "bstr", "gix-commitgraph", "gix-date", @@ -5969,7 +5969,7 @@ version = "0.10.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47aeb0f13de9ef2f3033f5ff218de30f44db827ac9f1286f9ef050aacddd5888" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "gix-path", "libc", "windows-sys 0.52.0", @@ -6043,9 +6043,9 @@ dependencies = [ [[package]] name = "gix-trace" -version = "0.1.13" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2ccaf54b0b1743a695b482ca0ab9d7603744d8d10b2e5d1a332fef337bee658" +checksum = "1d3f59a8de2934f6391b6b3a1a7654eae18961fcb9f9c843533fed34ad0f3457" [[package]] name = "gix-transport" @@ -6069,7 +6069,7 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36c0b049f8bdb61b20016694102f7b507f2e1727e83e9c5e6dad4f7d84ff7384" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "gix-commitgraph", "gix-date", "gix-hash 0.17.0", @@ -6107,9 +6107,9 @@ dependencies = [ [[package]] name = "gix-utils" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5351af2b172caf41a3728eb4455326d84e0d70fe26fc4de74ab0bd37df4191c5" +checksum = "befcdbdfb1238d2854591f760a48711bed85e72d80a10e8f2f93f656746ef7c5" dependencies = [ "fastrand 2.3.0", "unicode-normalization", @@ -6127,9 +6127,9 @@ dependencies = [ [[package]] name = "gix-validate" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77b9e00cacde5b51388d28ed746c493b18a6add1f19b5e01d686b3b9ece66d4d" +checksum = "5b1e63a5b516e970a594f870ed4571a8fdcb8a344e7bd407a20db8bd61dbfde4" dependencies = [ "bstr", "thiserror 2.0.17", @@ -6160,7 +6160,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", @@ -6188,7 +6188,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -6209,9 +6209,9 @@ checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "globset" -version = "0.4.17" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab69130804d941f8075cfd713bf8848a2c3b3f201a9457a11e6f87e1ab62305" +checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" dependencies = [ "aho-corasick", "bstr", @@ -6226,7 +6226,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "ignore", "walkdir", ] @@ -6313,7 +6313,7 @@ dependencies = [ "http 1.3.1", "reqwest 0.12.24", "rustc_version", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-pemfile 2.2.0", "serde", "serde_json", @@ -6665,7 +6665,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -6680,7 +6680,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.11.4", + "indexmap 2.12.0", "slab", "tokio", "tokio-util", @@ -6699,7 +6699,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.11.4", + "indexmap 2.12.0", "slab", "tokio", "tokio-util", @@ -6921,11 +6921,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -7191,7 +7191,7 @@ dependencies = [ "hyper 1.7.0", "hyper-util", "log", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-native-certs 0.8.2", "rustls-pki-types", "tokio", @@ -7318,22 +7318,22 @@ 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", - "yoke 0.8.0", + "yoke 0.8.1", "zerofrom", "zerovec", ] [[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", @@ -7344,11 +7344,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", @@ -7359,44 +7358,40 @@ 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 0.8.0", + "yoke 0.8.1", "zerofrom", "zerotrie", "zerovec", @@ -7493,9 +7488,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.4" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", "hashbrown 0.16.0", @@ -7518,9 +7513,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a646d946d06bedbbc4cac4c218acf4bbf2d87757a784857025f4d447e4e1cd" +checksum = "ade6dfcba0dfb62ad59e59e7241ec8912af34fd29e0e743e3db992bd278e8b65" dependencies = [ "console 0.16.1", "portable-atomic", @@ -7531,9 +7526,12 @@ dependencies = [ [[package]] name = "indoc" -version = "2.0.6" +version = "2.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] [[package]] name = "infer" @@ -7581,7 +7579,7 @@ dependencies = [ "indoc", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -7649,9 +7647,9 @@ dependencies = [ [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -7741,7 +7739,7 @@ checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -7793,9 +7791,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.81" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ "once_cell", "wasm-bindgen", @@ -7934,7 +7932,7 @@ source = "git+https://github.com/floneum/floneum?rev=52967ae#52967ae5dcd161e5cbe dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -7975,7 +7973,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", ] @@ -8031,7 +8029,7 @@ checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" dependencies = [ "cssparser", "html5ever", - "indexmap 2.11.4", + "indexmap 2.12.0", "selectors", ] @@ -8083,9 +8081,9 @@ checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" [[package]] name = "lazy-regex" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60c7310b93682b36b98fa7ea4de998d3463ccbebd94d935d6b48ba5b6ffa7126" +checksum = "191898e17ddee19e60bccb3945aa02339e81edd4a8c50e21fd4d48cdecda7b29" dependencies = [ "lazy-regex-proc_macros", "once_cell", @@ -8094,14 +8092,14 @@ dependencies = [ [[package]] name = "lazy-regex-proc_macros" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ba01db5ef81e17eb10a5e0f2109d1b3a3e29bac3070fdbd7d156bf7dbd206a1" +checksum = "c35dc8b0da83d1a9507e12122c80dea71a9c7c613014347392483a83ea593e04" dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -8210,7 +8208,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 0.5.18", ] @@ -8226,7 +8224,7 @@ dependencies = [ "async-trait", "base64 0.21.7", "bincode", - "bitflags 2.9.4", + "bitflags 2.10.0", "bytes", "chrono", "crc32fast", @@ -8285,7 +8283,7 @@ version = "0.9.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c2e7739b3828a547d21834779ea699a3b46c3dcfafba75da103d36adcb7c0ab" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "fallible-iterator 0.2.0", "fallible-streaming-iterator", "hashlink 0.8.4", @@ -8299,10 +8297,10 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15a90128c708356af8f7d767c9ac2946692c9112b4f74f07b99a01a60680e413" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cc", "fallible-iterator 0.3.0", - "indexmap 2.11.4", + "indexmap 2.12.0", "log", "memchr", "phf 0.11.3", @@ -8383,9 +8381,9 @@ 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" @@ -8625,7 +8623,7 @@ checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -8673,7 +8671,7 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -8703,9 +8701,9 @@ 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", "stable_deref_trait", @@ -8732,7 +8730,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block", "core-graphics-types 0.1.3", "foreign-types 0.5.0", @@ -8747,7 +8745,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block", "core-graphics-types 0.1.3", "foreign-types 0.5.0", @@ -8778,7 +8776,7 @@ version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c4d14bcca0fd3ed165a03000480aaa364c6860c34e900cb2dafdf3b95340e77" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "debugid", "num-derive", "num-traits", @@ -8793,7 +8791,7 @@ version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abcd9c8a1e6e1e9d56ce3627851f39a17ea83e17c96bc510f29d7e43d78a7d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "byteorder", "cfg-if", "crash-context", @@ -8847,7 +8845,7 @@ version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9f264d75233323f4b7d2f03aefe8a990690cdebfbfe26ea86bcbaec5e9ac990" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.0", "memo-map", "self_cell", "serde", @@ -8888,14 +8886,14 @@ 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]] @@ -8917,7 +8915,7 @@ checksum = "e4db6d5580af57bf992f59068d4ea26fd518574ff48d7639b255a36f9de6e7e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -8949,9 +8947,9 @@ dependencies = [ [[package]] name = "moxcms" -version = "0.7.7" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c588e11a3082784af229e23e8e4ecf5bcc6fbe4f69101e0421ce8d79da7f0b40" +checksum = "0fbdd3d7436f8b5e892b8b7ea114271ff0fa00bc5acae845d53b07d498616ef6" dependencies = [ "num-traits", "pxfm", @@ -9031,7 +9029,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "jni-sys", "log", "ndk-sys 0.5.0+25.2.9519653", @@ -9045,7 +9043,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 0.6.0+11769913", @@ -9097,7 +9095,7 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cfg-if", "cfg_aliases 0.1.1", "libc", @@ -9110,7 +9108,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 0.2.1", "libc", @@ -9273,7 +9271,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -9329,9 +9327,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", @@ -9339,14 +9337,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.108", ] [[package]] @@ -9417,7 +9415,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", @@ -9433,7 +9431,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block2 0.6.2", "libc", "objc2 0.6.3", @@ -9454,7 +9452,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69282c2b5bc58fba07cb9de2113619532eb551e98efe3d8d695509ef45fbd53b" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "libc", "objc2 0.6.3", "objc2-core-foundation", @@ -9469,7 +9467,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "478ae33fcac9df0a18db8302387c666b8ef08a3e2d62b510ca4fc278a384b6c0" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block2 0.6.2", "dispatch2", "objc2 0.6.3", @@ -9501,7 +9499,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "objc2 0.6.3", "objc2-foundation 0.3.2", ] @@ -9535,7 +9533,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a89f2ec274a0cf4a32642b2991e8b351a404d290da87bb6a9a9d8632490bd1c" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "objc2 0.6.3", ] @@ -9545,7 +9543,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", @@ -9557,7 +9555,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "objc2 0.6.3", "objc2-foundation 0.3.2", ] @@ -9568,7 +9566,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block2 0.6.2", "dispatch2", "libc", @@ -9581,7 +9579,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "dispatch2", "objc2 0.6.3", "objc2-core-foundation", @@ -9628,7 +9626,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05ec576860167a15dd9fce7fbee7512beb4e31f532159d3482d1f9c6caedf31d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "dispatch2", "objc2 0.6.3", "objc2-core-audio", @@ -9655,7 +9653,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "objc2 0.6.3", "objc2-core-foundation", "objc2-core-graphics", @@ -9667,7 +9665,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "objc2 0.6.3", "objc2-core-foundation", "objc2-core-graphics", @@ -9686,7 +9684,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b856880adb20bae9c1de8726b7218503268538775d22462eb839ed8959f05413" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block2 0.5.1", "objc2 0.5.2", "objc2-app-kit 0.2.2", @@ -9710,7 +9708,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", @@ -9722,7 +9720,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block2 0.6.2", "libc", "objc2 0.6.3", @@ -9756,7 +9754,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "objc2 0.6.3", "objc2-core-foundation", ] @@ -9777,7 +9775,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca30f6a66e39947b495622ae162d121c4e727e98c379bbed5c1b255904506368" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block2 0.5.1", "objc2 0.5.2", "objc2-app-kit 0.2.2", @@ -9804,7 +9802,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", @@ -9816,7 +9814,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f112d1746737b0da274ef79a23aac283376f335f4095a083a267a082f21db0c0" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "objc2 0.6.3", "objc2-app-kit 0.3.2", "objc2-foundation 0.3.2", @@ -9828,7 +9826,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", @@ -9841,7 +9839,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "objc2 0.6.3", "objc2-foundation 0.3.2", ] @@ -9852,7 +9850,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "objc2 0.6.3", "objc2-core-foundation", ] @@ -9863,7 +9861,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "objc2 0.6.3", "objc2-core-foundation", "objc2-foundation 0.3.2", @@ -9875,7 +9873,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block2 0.6.2", "objc2 0.6.3", "objc2-app-kit 0.3.2", @@ -9970,9 +9968,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "once_cell_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "onig" @@ -9980,7 +9978,7 @@ version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "336b9c63443aceef14bea841b899035ae3abe89b7c486aaf4c5bd8aafedac3f0" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "libc", "once_cell", "onig_sys", @@ -10041,7 +10039,7 @@ version = "0.10.74" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -10058,7 +10056,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -10069,9 +10067,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-src" -version = "300.5.3+3.5.4" +version = "300.5.4+3.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6bad8cd0233b63971e232cc9c5e83039375b8586d2312f31fda85db8f888c2" +checksum = "a507b3792995dae9b0df8a1c1e3771e8418b7c2d9f0baeba32e6fe8b06c7cb72" dependencies = [ "cc", ] @@ -10292,7 +10290,7 @@ dependencies = [ "env_logger", "file", "futures-util", - "indicatif 0.18.0", + "indicatif 0.18.2", "language", "log", "open", @@ -10302,7 +10300,7 @@ dependencies = [ "owhisper-model", "ratatui", "rodio", - "rustls 0.23.32", + "rustls 0.23.34", "schemars 0.8.22", "serde", "serde_json", @@ -10434,7 +10432,7 @@ dependencies = [ "regex", "regex-syntax", "structmeta", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -10548,7 +10546,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -10568,7 +10566,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.11.4", + "indexmap 2.12.0", ] [[package]] @@ -10685,7 +10683,7 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -10742,7 +10740,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -10807,7 +10805,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" dependencies = [ "base64 0.22.1", - "indexmap 2.11.4", + "indexmap 2.12.0", "quick-xml 0.38.3", "serde", "time", @@ -10860,7 +10858,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", @@ -10952,9 +10950,9 @@ dependencies = [ [[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", ] @@ -10987,7 +10985,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -11059,9 +11057,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", ] @@ -11072,7 +11070,7 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d3554923a69f4ce04c4a754260c338f505ce22642d3830e049a399fc2059a29" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "hex", ] @@ -11129,7 +11127,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -11254,7 +11252,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls 0.23.32", + "rustls 0.23.34", "socket2 0.6.1", "thiserror 2.0.17", "tokio", @@ -11274,7 +11272,7 @@ dependencies = [ "rand 0.9.2", "ring 0.17.14", "rustc-hash 2.1.1", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-pki-types", "slab", "thiserror 2.0.17", @@ -11314,9 +11312,9 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "ractor" -version = "0.15.8" +version = "0.15.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a03628f080f90360ed29f8a577b90ad9488820e561d33d22f34f241e58845d" +checksum = "9500e0be6f12a0539cb1154d654ef2e888bf8529164e54aff4a097baad5bb001" dependencies = [ "bon 2.3.0", "dashmap", @@ -11467,7 +11465,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cassowary", "compact_str 0.8.1", "crossterm", @@ -11497,7 +11495,7 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", ] [[package]] @@ -11582,7 +11580,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", ] [[package]] @@ -11624,7 +11622,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -11679,7 +11677,7 @@ checksum = "d7ef12e84481ab4006cb942f8682bba28ece7270743e649442027c5db87df126" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -11758,7 +11756,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-pki-types", "serde", "serde_json", @@ -12057,7 +12055,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -12080,8 +12078,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ "base64 0.21.7", - "bitflags 2.9.4", - "indexmap 2.11.4", + "bitflags 2.10.0", + "indexmap 2.12.0", "serde", "serde_derive", ] @@ -12204,7 +12202,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -12217,7 +12215,7 @@ 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 0.11.0", @@ -12252,16 +12250,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.32" +version = "0.23.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring 0.17.14", "rustls-pki-types", - "rustls-webpki 0.103.7", + "rustls-webpki 0.103.8", "subtle", "zeroize", ] @@ -12323,9 +12321,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", @@ -12354,9 +12352,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.7" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ "aws-lc-rs", "ring 0.17.14", @@ -12496,7 +12494,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" dependencies = [ "dyn-clone", - "indexmap 2.11.4", + "indexmap 2.12.0", "ref-cast", "schemars_derive 0.9.0", "serde", @@ -12526,7 +12524,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -12538,7 +12536,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -12550,7 +12548,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -12582,7 +12580,7 @@ checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -12637,7 +12635,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", @@ -12650,7 +12648,7 @@ version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -12687,9 +12685,9 @@ dependencies = [ [[package]] name = "self_cell" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" +checksum = "16c2f82143577edb4921b71ede051dac62ca3c16084e918bf7b40c96ae10eb33" [[package]] name = "semver" @@ -12835,7 +12833,7 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fac841c7050aa73fc2bec8f7d8e9cb1159af0b3095757b99820823f3e54e5080" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "sentry-backtrace", "sentry-core", "tracing-core", @@ -12936,7 +12934,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -12947,7 +12945,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -12957,7 +12955,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2f2d7ff8a2140333718bb329f5c40fc5f0865b84c426183ce14c97d2ab8154f" dependencies = [ "form_urlencoded", - "indexmap 2.11.4", + "indexmap 2.12.0", "itoa", "ryu", "serde_core", @@ -12969,7 +12967,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.0", "itoa", "memchr", "ryu", @@ -13053,7 +13051,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -13088,15 +13086,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.15.0" +version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093cd8c01b25262b84927e0f7151692158fab02d961e04c979d3903eba7ecc5" +checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.11.4", + "indexmap 2.12.0", "schemars 0.9.0", "schemars 1.0.4", "serde_core", @@ -13107,14 +13105,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.15.0" +version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e6c180db0816026a61afa1cff5344fb7ebded7e4d3062772179f2501481c27" +checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -13123,7 +13121,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.0", "itoa", "ryu", "serde", @@ -13152,7 +13150,7 @@ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -13174,7 +13172,7 @@ checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -13300,9 +13298,9 @@ dependencies = [ [[package]] name = "signal-hook-mio" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" dependencies = [ "libc", "mio", @@ -13505,7 +13503,7 @@ checksum = "0eb01866308440fc64d6c44d9e86c5cc17adfe33c4d6eed55da9145044d0ffc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -13618,7 +13616,7 @@ dependencies = [ "Inflector", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -13761,7 +13759,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -13772,7 +13770,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -13803,7 +13801,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -13816,7 +13814,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -13908,9 +13906,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.106" +version = "2.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" dependencies = [ "proc-macro2", "quote", @@ -13952,7 +13950,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -13991,7 +13989,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec7dddc5f0fee506baf8b9fdb989e242f17e4b11c61dfbb0635b705217199eea" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "byteorder", "enum-as-inner", "libc", @@ -14005,7 +14003,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "byteorder", "enum-as-inner", "libc", @@ -14058,7 +14056,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 0.6.0", ] @@ -14098,11 +14096,11 @@ dependencies = [ [[package]] name = "tao" -version = "0.34.4" +version = "0.34.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6121216ff67fe4bcfe64508ea1700bc15f74937d835a07b4a209cc00a8926a84" +checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block2 0.6.2", "core-foundation 0.10.1", "core-graphics 0.24.0", @@ -14144,7 +14142,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -14175,9 +14173,9 @@ dependencies = [ [[package]] name = "tauri" -version = "2.8.5" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d1d3b3dc4c101ac989fd7db77e045cc6d91a25349cd410455cb5c57d510c1c" +checksum = "8bceb52453e507c505b330afe3398510e87f428ea42b6e76ecb6bd63b15965b5" dependencies = [ "anyhow", "bytes", @@ -14221,7 +14219,6 @@ dependencies = [ "tokio", "tray-icon", "url", - "urlpattern", "webkit2gtk", "webview2-com", "window-vibrancy", @@ -14230,9 +14227,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.4.1" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c432ccc9ff661803dab74c6cd78de11026a578a9307610bbc39d3c55be7943f" +checksum = "a924b6c50fe83193f0f8b14072afa7c25b7a72752a2a73d9549b463f5fe91a38" dependencies = [ "anyhow", "cargo_toml", @@ -14252,9 +14249,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab3a62cf2e6253936a8b267c2e95839674e7439f104fa96ad0025e149d54d8a" +checksum = "6c1fe64c74cc40f90848281a90058a6db931eb400b60205840e09801ee30f190" dependencies = [ "base64 0.22.1", "brotli", @@ -14268,7 +14265,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "syn 2.0.106", + "syn 2.0.108", "tauri-utils", "thiserror 2.0.17", "time", @@ -14279,14 +14276,14 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4368ea8094e7045217edb690f493b55b30caf9f3e61f79b4c24b6db91f07995e" +checksum = "260c5d2eb036b76206b9fca20b7be3614cfd21046c5396f7959e0e64a4b07f2f" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "tauri-codegen", "tauri-utils", ] @@ -14296,7 +14293,7 @@ name = "tauri-nspanel" version = "2.0.1" source = "git+https://github.com/ahkohd/tauri-nspanel?branch=v2#18ffb9a201fbf6fedfaa382fd4b92315ea30ab1a" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block", "cocoa", "core-foundation 0.10.1", @@ -14309,9 +14306,9 @@ dependencies = [ [[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", @@ -14392,9 +14389,9 @@ dependencies = [ [[package]] name = "tauri-plugin-clipboard-manager" -version = "2.3.0" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adddd9e9275b20e77af3061d100a25a884cced3c4c9ef680bd94dd0f7e26c1ca" +checksum = "206dc20af4ed210748ba945c2774e60fd0acd52b9a73a028402caf809e9b6ecf" dependencies = [ "arboard", "log", @@ -14448,9 +14445,9 @@ dependencies = [ [[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", @@ -14467,11 +14464,30 @@ dependencies = [ "windows-result 0.3.4", ] +[[package]] +name = "tauri-plugin-detect" +version = "0.1.0" +dependencies = [ + "detect", + "host", + "intercept", + "serde", + "specta", + "specta-typescript", + "tauri", + "tauri-plugin", + "tauri-specta", + "thiserror 2.0.17", + "tokio", + "tracing", + "uuid", +] + [[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", @@ -14487,9 +14503,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", @@ -14509,9 +14525,9 @@ dependencies = [ [[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", @@ -14538,7 +14554,6 @@ dependencies = [ "agc", "audio", "audio-utils", - "block2 0.6.2", "bytes", "chrono", "codes-iso-639", @@ -14549,7 +14564,6 @@ dependencies = [ "insta", "language", "llm", - "objc2-av-foundation", "ordered-float 5.1.0", "owhisper-client", "owhisper-interface", @@ -14563,10 +14577,8 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-plugin-local-stt", - "tauri-plugin-shell", "tauri-plugin-tray", "tauri-specta", - "tcc", "thiserror 2.0.17", "tokio", "tokio-stream", @@ -14747,9 +14759,9 @@ dependencies = [ [[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", @@ -14769,9 +14781,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", @@ -14785,11 +14797,31 @@ dependencies = [ "thiserror 2.0.17", ] +[[package]] +name = "tauri-plugin-permissions" +version = "0.1.0" +dependencies = [ + "audio", + "block2 0.6.2", + "futures-util", + "macos-accessibility-client", + "objc2-av-foundation", + "serde", + "specta", + "specta-typescript", + "tauri", + "tauri-plugin", + "tauri-plugin-shell", + "tauri-specta", + "tcc", + "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", @@ -14829,9 +14861,9 @@ dependencies = [ [[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", @@ -14850,9 +14882,9 @@ dependencies = [ [[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", @@ -14882,9 +14914,9 @@ 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", @@ -15045,9 +15077,9 @@ dependencies = [ [[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", "dpi", @@ -15070,9 +15102,9 @@ 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", @@ -15120,14 +15152,14 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[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", @@ -15282,13 +15314,13 @@ dependencies = [ [[package]] name = "terminal-trx" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975b4233aefa1b02456d5e53b22c61653c743e308c51cf4181191d8ce41753ab" +checksum = "662a3cd5ca570df622e848ef18b50c151e65c9835257465417242243b0bce783" dependencies = [ "cfg-if", "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -15371,7 +15403,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -15382,7 +15414,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -15452,9 +15484,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", @@ -15561,7 +15593,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -15627,7 +15659,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.32", + "rustls 0.23.34", "tokio", ] @@ -15680,7 +15712,7 @@ checksum = "489a59b6730eda1b0171fcfda8b121f4bee2b35cba8645ca35c5f7ba3eb736c1" dependencies = [ "futures-util", "log", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-native-certs 0.8.2", "rustls-pki-types", "tokio", @@ -15758,7 +15790,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37e04c1865c281139e5ccf633cb9f76ffdaabeebfe53b703984cf82878e2aabb" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -15767,7 +15799,7 @@ version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.0", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", @@ -15780,7 +15812,7 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.0", "serde_core", "serde_spanned 1.0.3", "toml_datetime 0.7.3", @@ -15813,7 +15845,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.0", "toml_datetime 0.6.11", "winnow 0.5.40", ] @@ -15824,7 +15856,7 @@ version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.0", "toml_datetime 0.6.11", "winnow 0.5.40", ] @@ -15835,7 +15867,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.0", "serde", "serde_spanned 0.6.9", "toml_datetime 0.6.11", @@ -15849,7 +15881,7 @@ version = "0.23.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.0", "toml_datetime 0.7.3", "toml_parser", "winnow 0.7.13", @@ -15965,7 +15997,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "bytes", "futures-core", "futures-util", @@ -15985,7 +16017,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", @@ -16042,7 +16074,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -16279,9 +16311,9 @@ dependencies = [ [[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", @@ -16296,7 +16328,7 @@ dependencies = [ "png 0.17.16", "serde", "thiserror 2.0.17", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -16334,7 +16366,7 @@ checksum = "b9c81686f7ab4065ccac3df7a910c4249f8c0f3fb70421d6ddec19b9311f63f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -16367,7 +16399,7 @@ dependencies = [ "httparse", "log", "rand 0.9.2", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-pki-types", "sha1", "thiserror 2.0.17", @@ -16625,9 +16657,9 @@ checksum = "70ba288e709927c043cbe476718d37be306be53fb1fafecd0dbe36d072be2580" [[package]] name = "unicode-ident" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" [[package]] name = "unicode-normalization" @@ -16729,7 +16761,7 @@ dependencies = [ "log", "native-tls", "once_cell", - "rustls 0.23.32", + "rustls 0.23.34", "rustls-pki-types", "serde", "serde_json", @@ -16823,7 +16855,7 @@ version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fcc29c80c21c31608227e0912b2d7fddba57ad76b606890627ba8ee7964e993" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.0", "serde", "serde_json", "utoipa-gen", @@ -16837,7 +16869,7 @@ checksum = "6d79d08d92ab8af4c5e8a6da20c47ae3f61a0f1dabc1997cdf2d082b757ca08b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -17049,9 +17081,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if", "once_cell", @@ -17060,25 +17092,11 @@ dependencies = [ "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.106", - "wasm-bindgen-shared", -] - [[package]] name = "wasm-bindgen-futures" -version = "0.4.54" +version = "0.4.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" dependencies = [ "cfg-if", "js-sys", @@ -17089,9 +17107,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -17099,22 +17117,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.106", - "wasm-bindgen-backend", + "syn 2.0.108", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.104" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" dependencies = [ "unicode-ident", ] @@ -17167,7 +17185,7 @@ version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "rustix 1.1.2", "wayland-backend", "wayland-scanner", @@ -17179,7 +17197,7 @@ 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", @@ -17191,7 +17209,7 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -17222,9 +17240,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.81" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -17339,7 +17357,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -17646,7 +17664,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -17657,7 +17675,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -17668,7 +17686,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -17679,7 +17697,7 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -17690,7 +17708,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -17701,7 +17719,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -18204,15 +18222,15 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "wry" -version = "0.53.4" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d78ec082b80fa088569a970d043bb3050abaabf4454101d44514ee8d9a8c9f6" +checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" dependencies = [ "base64 0.22.1", "block2 0.6.2", @@ -18393,13 +18411,12 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", - "yoke-derive 0.8.0", + "yoke-derive 0.8.1", "zerofrom", ] @@ -18411,19 +18428,19 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "synstructure 0.13.2", ] [[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.108", "synstructure 0.13.2", ] @@ -18498,7 +18515,7 @@ dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "zbus_names", "zvariant", "zvariant_utils", @@ -18543,7 +18560,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -18554,7 +18571,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -18574,7 +18591,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "synstructure 0.13.2", ] @@ -18595,40 +18612,40 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[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 0.8.0", + "yoke 0.8.1", "zerofrom", ] [[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 0.8.0", + "yoke 0.8.1", "zerofrom", "zerovec-derive", ] [[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.108", ] [[package]] @@ -18641,7 +18658,7 @@ dependencies = [ "crc32fast", "crossbeam-utils", "displaydoc", - "indexmap 2.11.4", + "indexmap 2.12.0", "num_enum", "thiserror 1.0.69", ] @@ -18654,7 +18671,7 @@ checksum = "caa8cd6af31c3b31c6631b8f483848b91589021b28fffe50adada48d4f4d2ed1" dependencies = [ "arbitrary", "crc32fast", - "indexmap 2.11.4", + "indexmap 2.12.0", "memchr", ] @@ -18697,7 +18714,7 @@ dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "zvariant_utils", ] @@ -18710,6 +18727,6 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.106", + "syn 2.0.108", "winnow 0.7.13", ] diff --git a/Cargo.toml b/Cargo.toml index 1c44ece645..6e19d527f2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -113,12 +113,14 @@ tauri-plugin-apple-calendar = { path = "plugins/apple-calendar" } tauri-plugin-auth = { path = "plugins/auth" } tauri-plugin-db = { path = "plugins/db" } tauri-plugin-db2 = { path = "plugins/db2" } +tauri-plugin-detect = { path = "plugins/detect" } tauri-plugin-listener = { path = "plugins/listener" } tauri-plugin-local-llm = { path = "plugins/local-llm" } tauri-plugin-local-stt = { path = "plugins/local-stt" } tauri-plugin-mcp = { path = "plugins/mcp" } tauri-plugin-misc = { path = "plugins/misc" } tauri-plugin-notification = { path = "plugins/notification" } +tauri-plugin-permissions = { path = "plugins/permissions" } tauri-plugin-sfx = { path = "plugins/sfx" } tauri-plugin-sse = { path = "plugins/sse" } tauri-plugin-store2 = { path = "plugins/store2" } @@ -126,7 +128,7 @@ tauri-plugin-template = { path = "plugins/template" } tauri-plugin-tracing = { path = "plugins/tracing" } tauri-plugin-tray = { path = "plugins/tray" } tauri-plugin-webhook = { path = "plugins/webhook" } -tauri-plugin-windows = { path = "plugins/windows", default-features = false } +tauri-plugin-windows = { path = "plugins/windows" } async-stream = "0.3.6" futures-channel = "0.3.31" diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 89563ea7e3..ee5eff1a95 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -15,15 +15,15 @@ "gen:schema": "tsx src/devtool/seed/script.ts" }, "dependencies": { - "@ai-sdk/amazon-bedrock": "^3.0.47", - "@ai-sdk/anthropic": "^2.0.37", - "@ai-sdk/azure": "^2.0.54", - "@ai-sdk/google": "^2.0.23", - "@ai-sdk/google-vertex": "^3.0.53", - "@ai-sdk/openai": "^2.0.53", - "@ai-sdk/openai-compatible": "^1.0.22", - "@ai-sdk/react": "^2.0.78", - "@electric-sql/client": "^1.0.14", + "@ai-sdk/amazon-bedrock": "^3.0.49", + "@ai-sdk/anthropic": "^2.0.39", + "@ai-sdk/azure": "^2.0.59", + "@ai-sdk/google": "^2.0.25", + "@ai-sdk/google-vertex": "^3.0.55", + "@ai-sdk/openai": "^2.0.58", + "@ai-sdk/openai-compatible": "^1.0.24", + "@ai-sdk/react": "^2.0.82", + "@electric-sql/client": "^1.1.1", "@huggingface/languages": "^1.0.0", "@hypr/db": "workspace:*", "@hypr/plugin-analytics": "workspace:*", @@ -32,36 +32,39 @@ "@hypr/plugin-local-stt": "workspace:*", "@hypr/plugin-misc": "workspace:*", "@hypr/plugin-notification": "workspace:*", + "@hypr/plugin-detect": "workspace:*", + "@hypr/plugin-permissions": "workspace:*", "@hypr/plugin-template": "workspace:*", "@hypr/plugin-windows": "workspace:*", "@hypr/tiptap": "workspace:^", "@hypr/ui": "workspace:^", "@hypr/utils": "workspace:^", - "@iconify-icon/react": "^3.0.1", + "@iconify-icon/react": "^3.0.2", "@lobehub/icons": "^2.43.1", "@openrouter/ai-sdk-provider": "^1.2.0", "@orama/highlight": "^0.1.9", "@orama/orama": "^3.1.16", "@orama/plugin-qps": "^3.1.16", "@sentry/react": "^8.55.0", - "@supabase/supabase-js": "^2.76.1", + "@supabase/supabase-js": "^2.77.0", "@t3-oss/env-core": "^0.13.8", "@tanstack/react-form": "^1.23.8", "@tanstack/react-query": "^5.90.5", - "@tanstack/react-router": "^1.133.25", + "@tanstack/react-router": "^1.133.36", "@tanstack/react-virtual": "^3.13.12", "@tauri-apps/api": "^2.9.0", - "@tauri-apps/plugin-deep-link": "^2.4.3", - "@tauri-apps/plugin-dialog": "^2.4.0", - "@tauri-apps/plugin-http": "^2.5.2", - "@tauri-apps/plugin-opener": "^2.5.0", - "@tauri-apps/plugin-process": "^2.3.0", - "@tauri-apps/plugin-store": "^2.4.0", + "@tauri-apps/plugin-deep-link": "^2.4.5", + "@tauri-apps/plugin-dialog": "^2.4.2", + "@tauri-apps/plugin-http": "^2.5.4", + "@tauri-apps/plugin-opener": "^2.5.2", + "@tauri-apps/plugin-process": "^2.3.1", + "@tauri-apps/plugin-shell": "^2.3.3", + "@tauri-apps/plugin-store": "^2.4.1", "@tauri-apps/plugin-updater": "^2.9.0", "@uidotdev/usehooks": "^2.4.1", "@wavesurfer/react": "^1.0.11", - "@xstate/store": "^3.11.1", - "ai": "^5.0.78", + "@xstate/store": "^3.11.2", + "ai": "^5.0.82", "clsx": "^2.1.1", "date-fns": "^4.1.0", "dompurify": "^3.3.0", @@ -75,27 +78,27 @@ "react-dom": "^19.2.0", "react-hotkeys-hook": "^4.6.2", "streamdown": "^1.4.0", - "tinybase": "^6.7.1", + "tinybase": "^6.7.2", "tinytick": "^1.2.8", - "wavesurfer.js": "^7.11.0", + "wavesurfer.js": "^7.11.1", "xstate": "^5.23.0", "zod": "^4.1.12", "zustand": "^5.0.8" }, "devDependencies": { "@faker-js/faker": "^10.1.0", - "@tanstack/react-router-devtools": "^1.133.25", - "@tanstack/router-plugin": "^1.133.25", - "@tauri-apps/cli": "^2.9.1", + "@tanstack/react-router-devtools": "^1.133.36", + "@tanstack/router-plugin": "^1.133.36", + "@tauri-apps/cli": "^2.9.2", "@types/json5": "^2.2.0", - "@types/node": "^24.9.1", + "@types/node": "^24.9.2", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", "@vitejs/plugin-react": "^4.7.0", "autoprefixer": "^10.4.21", "postcss": "^8.5.6", "tailwindcss": "^3.4.18", - "tsx": "^4.19.2", + "tsx": "^4.20.6", "typescript": "~5.8.3", "vite": "^7.1.12", "vitest": "^3.2.4" diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index 92a5bb5f10..be813c6350 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -24,6 +24,7 @@ tauri-plugin-analytics = { workspace = true } tauri-plugin-auth = { workspace = true } tauri-plugin-db2 = { workspace = true } tauri-plugin-deep-link = { workspace = true } +tauri-plugin-detect = { workspace = true } tauri-plugin-dialog = { workspace = true } tauri-plugin-fs = { workspace = true } tauri-plugin-http = { workspace = true } @@ -33,6 +34,7 @@ tauri-plugin-misc = { workspace = true } tauri-plugin-notification = { workspace = true } tauri-plugin-opener = { workspace = true } tauri-plugin-os = { workspace = true } +tauri-plugin-permissions = { workspace = true } tauri-plugin-process = { workspace = true } tauri-plugin-sentry = { workspace = true } tauri-plugin-shell = { workspace = true } diff --git a/apps/desktop/src-tauri/capabilities/default.json b/apps/desktop/src-tauri/capabilities/default.json index f1452dfc82..b1db8a6de0 100644 --- a/apps/desktop/src-tauri/capabilities/default.json +++ b/apps/desktop/src-tauri/capabilities/default.json @@ -60,10 +60,11 @@ "listener:default", "template:default", "notification:default", - "shell:default", + "shell:allow-open", "misc:default", "os:default", - "http:default", + "detect:default", + "permissions:default", { "identifier": "http:default", "deny": [], diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index ffd4a76f32..bdb262b731 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -48,6 +48,7 @@ pub async fn main() { .plugin(tauri_plugin_listener::init()) .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_local_stt::init()) + .plugin(tauri_plugin_permissions::init()) .plugin(tauri_plugin_updater::Builder::new().build()) .plugin(tauri_plugin_deep_link::init()) .plugin(tauri_plugin_sentry::init_with_no_injection(&sentry_client)) @@ -57,6 +58,7 @@ pub async fn main() { .plugin(tauri_plugin_misc::init()) .plugin(tauri_plugin_template::init()) .plugin(tauri_plugin_http::init()) + .plugin(tauri_plugin_detect::init()) .plugin(tauri_plugin_notification::init()) .plugin(tauri_plugin_tray::init()) .plugin(tauri_plugin_store::Builder::default().build()) diff --git a/apps/desktop/src/components/main/body/sessions/outer-header/in-meeting-indicator.tsx b/apps/desktop/src/components/main/body/sessions/outer-header/in-meeting-indicator.tsx index d331b6282f..5c9c65b1b0 100644 --- a/apps/desktop/src/components/main/body/sessions/outer-header/in-meeting-indicator.tsx +++ b/apps/desktop/src/components/main/body/sessions/outer-header/in-meeting-indicator.tsx @@ -1,4 +1,5 @@ import { useHover } from "@uidotdev/usehooks"; +import { MicOff } from "lucide-react"; import { Button } from "@hypr/ui/components/ui/button"; import { cn } from "@hypr/utils"; @@ -8,10 +9,11 @@ import { SoundIndicator } from "../../shared"; export function InMeetingIndicator({ sessionId }: { sessionId: string }) { const [ref, hovered] = useHover(); - const { active, stop, amplitude } = useListener((state) => ({ + const { active, stop, amplitude, muted } = useListener((state) => ({ active: state.status === "running_active" && state.sessionId === sessionId, stop: state.stop, amplitude: state.amplitude, + muted: state.muted, })); if (!active) { @@ -37,6 +39,21 @@ export function InMeetingIndicator({ sessionId }: { sessionId: string }) { Stop ) + : muted + ? ( +
+ + +
+ ) : ( listenerCommands.checkMicrophoneAccess(), - refetchInterval: 1000, - select: (result) => { - if (result.status === "error") { - throw new Error(result.error); - } - - return result.data; - }, - }); - - const systemAudioPermissionStatus = useQuery({ - queryKey: ["systemAudioPermission"], - queryFn: () => listenerCommands.checkSystemAudioAccess(), - refetchInterval: 1000, - select: (result) => { - if (result.status === "error") { - throw new Error(result.error); - } - - return result.data; - }, - }); - - const micPermission = useMutation({ - mutationFn: () => listenerCommands.requestMicrophoneAccess(), - onSuccess: () => { - setTimeout(() => { - micPermissionStatus.refetch(); - }, 3000); - }, - onError: (error) => { - console.error(error); - }, - }); - - const capturePermission = useMutation({ - mutationFn: () => listenerCommands.requestSystemAudioAccess(), - onSuccess: () => { - message("The app will now restart to apply the changes", { kind: "info", title: "System Audio Status Changed" }); - setTimeout(() => { - relaunch(); - }, 2000); - }, - onError: console.error, - }); - - const handleMicPermissionAction = () => { - if (micPermissionStatus.data === "Denied") { - listenerCommands.openMicrophoneAccessSettings(); - } else { - micPermission.mutate(); - } - }; - - const handleSystemAudioPermissionAction = () => { - if (systemAudioPermissionStatus.data === "Denied") { - listenerCommands.openSystemAudioAccessSettings(); - } else { - capturePermission.mutate(undefined); - } - }; + const { + micPermissionStatus, + systemAudioPermissionStatus, + accessibilityPermissionStatus, + micPermission, + systemAudioPermission, + accessibilityPermission, + handleMicPermissionAction, + handleSystemAudioPermissionAction, + handleAccessibilityPermissionAction, + } = usePermissions(); return (
@@ -83,76 +22,24 @@ export function Permissions() { title="Microphone access" status={micPermissionStatus.data} isPending={micPermission.isPending} - onGrant={handleMicPermissionAction} + onAction={handleMicPermissionAction} + variant="compact" /> +
); } -function PermissionRow({ - title, - status, - isPending, - onGrant, -}: { - title: string; - status: PermissionStatus | undefined; - isPending: boolean; - onGrant: () => void; -}) { - const isAuthorized = status === "Authorized"; - const isDenied = status === "Denied"; - - let message = ""; - let buttonText = ""; - - if (isAuthorized) { - message = "Thanks for granting permission"; - buttonText = "Access Granted"; - } else if (isDenied) { - message = "You should toggle in the Settings manually"; - buttonText = "Open Settings"; - } else { - message = "You need to grant access to use Hyprnote"; - buttonText = "Grant Permission"; - } - - return ( -
-
-

- {title} -

-

- {message} -

-
- -
- ); -} diff --git a/apps/desktop/src/components/settings/notification.tsx b/apps/desktop/src/components/settings/notification.tsx index 32a1e6e500..e78ccf81f9 100644 --- a/apps/desktop/src/components/settings/notification.tsx +++ b/apps/desktop/src/components/settings/notification.tsx @@ -1,8 +1,10 @@ import { useForm } from "@tanstack/react-form"; +import { useQuery } from "@tanstack/react-query"; import { Plus, X } from "lucide-react"; -import { useState } from "react"; +import { useEffect, useState } from "react"; -import { commands as notificationCommands, type InstalledApp } from "@hypr/plugin-notification"; +import { commands as detectCommands } from "@hypr/plugin-detect"; +import { commands as notificationCommands } from "@hypr/plugin-notification"; import { Badge } from "@hypr/ui/components/ui/badge"; import { Button } from "@hypr/ui/components/ui/button"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem } from "@hypr/ui/components/ui/command"; @@ -15,7 +17,15 @@ export function SettingsNotifications() { const values = main.UI.useValues(main.STORE_ID); const [popoverOpen, setPopoverOpen] = useState(false); const [newAppName, setNewAppName] = useState(""); - const [applications, setApplications] = useState([]); + + useEffect(() => { + const cleanup = () => { + notificationCommands.clearNotifications(); + }; + + cleanup(); + return cleanup; + }, []); const handleSetNotificationEvent = main.UI.useSetValueCallback( "notification_event", @@ -62,34 +72,22 @@ export function SettingsNotifications() { handleSetNotificationDetect(value.notification_detect); handleSetRespectDnd(value.respect_dnd); handleSetIgnoredPlatforms(value.ignored_platforms); + }, + }); - if (value.notification_event) { - await notificationCommands.startEventNotification({ - respect_do_not_disturb: value.respect_dnd, - }); - } else { - await notificationCommands.stopEventNotification(); + const { data: installedApps } = useQuery({ + enabled: popoverOpen, + queryKey: ["installed-applications"], + queryFn: detectCommands.listInstalledApplications, + select: (result) => { + if (result.status === "error") { + throw new Error(result.error); } - if (value.notification_detect) { - await notificationCommands.startDetectNotification({ - respect_do_not_disturb: value.respect_dnd, - ignored_platforms: value.ignored_platforms, - }); - } else { - await notificationCommands.stopDetectNotification(); - } + return result.data.map((app) => app.name); }, }); - const loadApplications = async () => { - if (applications.length === 0) { - const apps = await notificationCommands.listApplications(); - const uniqueNames = Array.from(new Set(apps.map((app: InstalledApp) => app.name))) as string[]; - setApplications(uniqueNames); - } - }; - const handleAddIgnoredApp = (appName: string) => { const trimmedName = appName.trim(); if (trimmedName) { @@ -174,12 +172,7 @@ export function SettingsNotifications() { { - setPopoverOpen(open); - if (open) { - loadApplications(); - } - }} + onOpenChange={setPopoverOpen} > + + ); + } + + return ( +
+
+ {icon && ( +
+
{icon}
+
+ )} +
+
{title}
+
+ {isAuthorized + ? ( + + + Access Granted + + ) + : {displayMessage}} +
+
+
+
+ {!isAuthorized && ( + + )} + {isAuthorized && ( +
+ +
+ )} +
+
+ ); +} diff --git a/apps/desktop/src/contexts/listener.tsx b/apps/desktop/src/contexts/listener.tsx index 5bf97fcc13..959fee2f54 100644 --- a/apps/desktop/src/contexts/listener.tsx +++ b/apps/desktop/src/contexts/listener.tsx @@ -2,7 +2,9 @@ import React, { createContext, useContext, useEffect, useRef } from "react"; import { useStore } from "zustand"; import { useShallow } from "zustand/shallow"; +import { events as detectEvents } from "@hypr/plugin-detect"; import { commands as localSttCommands, type SupportedSttModel } from "@hypr/plugin-local-stt"; +import { commands as notificationCommands } from "@hypr/plugin-notification"; import * as main from "../store/tinybase/main"; import { createListenerStore, type ListenerStore } from "../store/zustand/listener"; @@ -16,6 +18,7 @@ export const ListenerProvider = ({ store: ListenerStore; }) => { useAutoStartSTT(); + useHandleMuteAndStop(store); const storeRef = useRef(null); if (!storeRef.current) { @@ -66,3 +69,48 @@ function useAutoStartSTT() { } }, [currentSttProvider, currentSttModel]); } + +const useHandleMuteAndStop = (store: ListenerStore) => { + const stop = useStore(store, (state) => state.stop); + const setMuted = useStore(store, (state) => state.setMuted); + + useEffect(() => { + let unlisten: (() => void) | undefined; + let cancelled = false; + let notificationTimerId: ReturnType; + + detectEvents.detectEvent.listen(({ payload }) => { + if (payload.type === "micStarted") { + notificationTimerId = setTimeout(() => { + notificationCommands.showNotification({ + key: payload.key, + title: "Mic Started", + message: "Mic started", + url: null, + timeout: { secs: 8, nanos: 0 }, + }); + }, 2000); + } else if (payload.type === "micStopped") { + stop(); + } else if (payload.type === "micMuted") { + setMuted(payload.value); + } + }).then((fn) => { + if (cancelled) { + fn(); + } else { + unlisten = fn; + } + }).catch((err) => { + console.error("Failed to setup detect event listener:", err); + }); + + return () => { + cancelled = true; + unlisten?.(); + if (notificationTimerId) { + clearTimeout(notificationTimerId); + } + }; + }, [stop, setMuted]); +}; diff --git a/apps/desktop/src/hooks/use-permissions.ts b/apps/desktop/src/hooks/use-permissions.ts new file mode 100644 index 0000000000..d5f8244f6e --- /dev/null +++ b/apps/desktop/src/hooks/use-permissions.ts @@ -0,0 +1,140 @@ +import { useMutation, useQuery } from "@tanstack/react-query"; +import { message } from "@tauri-apps/plugin-dialog"; +import { relaunch } from "@tauri-apps/plugin-process"; +import { Command } from "@tauri-apps/plugin-shell"; + +import { commands as permissionsCommands } from "@hypr/plugin-permissions"; + +export function usePermissions() { + const micPermissionStatus = useQuery({ + queryKey: ["micPermission"], + queryFn: () => permissionsCommands.checkMicrophonePermission(), + refetchInterval: 1000, + select: (result) => { + if (result.status === "error") { + throw new Error(result.error); + } + return result.data; + }, + }); + + const systemAudioPermissionStatus = useQuery({ + queryKey: ["systemAudioPermission"], + queryFn: () => permissionsCommands.checkSystemAudioPermission(), + refetchInterval: 1000, + select: (result) => { + if (result.status === "error") { + throw new Error(result.error); + } + return result.data; + }, + }); + + const accessibilityPermissionStatus = useQuery({ + queryKey: ["accessibilityPermission"], + queryFn: () => permissionsCommands.checkAccessibilityPermission(), + refetchInterval: 1000, + select: (result) => { + if (result.status === "error") { + throw new Error(result.error); + } + return result.data; + }, + }); + + const micPermission = useMutation({ + mutationFn: () => permissionsCommands.requestMicrophonePermission(), + onSuccess: () => { + setTimeout(() => { + micPermissionStatus.refetch(); + }, 1000); + }, + onError: (error) => { + console.error(error); + }, + }); + + const systemAudioPermission = useMutation({ + mutationFn: () => permissionsCommands.requestSystemAudioPermission(), + onSuccess: () => { + message("The app will now restart to apply the changes", { + kind: "info", + title: "System Audio Status Changed", + }); + setTimeout(() => { + relaunch(); + }, 2000); + }, + onError: console.error, + }); + + const accessibilityPermission = useMutation({ + mutationFn: () => permissionsCommands.requestAccessibilityPermission(), + onSuccess: () => { + setTimeout(() => { + accessibilityPermissionStatus.refetch(); + }, 1000); + }, + onError: console.error, + }); + + const openMicrophoneSettings = async () => { + await Command.create("exec-sh", [ + "-c", + "open 'x-apple.systempreferences:com.apple.preference.security?Privacy_Microphone'", + ]).execute(); + }; + + const openSystemAudioSettings = async () => { + await Command.create("exec-sh", [ + "-c", + "open 'x-apple.systempreferences:com.apple.preference.security?Privacy_AudioCapture'", + ]).execute(); + }; + + const openAccessibilitySettings = async () => { + await Command.create("exec-sh", [ + "-c", + "open 'x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility'", + ]).execute(); + }; + + const handleMicPermissionAction = async () => { + if (micPermissionStatus.data === "denied") { + await openMicrophoneSettings(); + } else { + micPermission.mutate(); + } + }; + + const handleSystemAudioPermissionAction = async () => { + if (systemAudioPermissionStatus.data === "denied") { + await openSystemAudioSettings(); + } else { + systemAudioPermission.mutate(undefined); + } + }; + + const handleAccessibilityPermissionAction = async () => { + if (accessibilityPermissionStatus.data === "denied") { + await openAccessibilitySettings(); + } else { + accessibilityPermission.mutate(undefined); + } + }; + + return { + micPermissionStatus, + systemAudioPermissionStatus, + accessibilityPermissionStatus, + micPermission, + systemAudioPermission, + accessibilityPermission, + openMicrophoneSettings, + openSystemAudioSettings, + openAccessibilitySettings, + handleMicPermissionAction, + handleSystemAudioPermissionAction, + handleAccessibilityPermissionAction, + }; +} diff --git a/apps/desktop/src/routes/app/onboarding.tsx b/apps/desktop/src/routes/app/onboarding.tsx index e74fb68fcf..a662e77716 100644 --- a/apps/desktop/src/routes/app/onboarding.tsx +++ b/apps/desktop/src/routes/app/onboarding.tsx @@ -1,18 +1,15 @@ import { Icon } from "@iconify-icon/react"; -import { useMutation, useQuery } from "@tanstack/react-query"; import { createFileRoute, useNavigate } from "@tanstack/react-router"; -import { message } from "@tauri-apps/plugin-dialog"; -import { relaunch } from "@tauri-apps/plugin-process"; -import { ArrowRightIcon, CheckCircle2Icon, CircleQuestionMarkIcon, MicIcon, Volume2Icon } from "lucide-react"; -import { useCallback, useState } from "react"; +import { ArrowRightIcon, CircleQuestionMarkIcon, EyeIcon, MicIcon, Volume2Icon } from "lucide-react"; +import { useCallback } from "react"; import { z } from "zod"; -import { commands as listenerCommands } from "@hypr/plugin-listener"; import { commands as windowsCommands } from "@hypr/plugin-windows"; import { Button } from "@hypr/ui/components/ui/button"; -import { Spinner } from "@hypr/ui/components/ui/spinner"; import { TextAnimate } from "@hypr/ui/components/ui/text-animate"; import { cn } from "@hypr/utils"; +import { PermissionRow } from "../../components/shared/permission-row"; +import { usePermissions } from "../../hooks/use-permissions"; const STEPS = ["welcome", "calendars", "permissions"] as const; @@ -100,71 +97,25 @@ function Welcome() { function Permissions() { const { goNext } = useOnboarding(); - const [micPermissionRequested, setMicPermissionRequested] = useState(false); - - const micPermissionStatus = useQuery({ - queryKey: ["micPermission"], - queryFn: () => listenerCommands.checkMicrophoneAccess(), - refetchInterval: 1000, - select: (result) => { - if (result.status === "error") { - throw new Error(result.error); - } - return result.data; - }, - }); - - const systemAudioPermissionStatus = useQuery({ - queryKey: ["systemAudioPermission"], - queryFn: () => listenerCommands.checkSystemAudioAccess(), - refetchInterval: 1000, - select: (result) => { - if (result.status === "error") { - throw new Error(result.error); - } - return result.data; - }, - }); - - const micPermission = useMutation({ - mutationFn: () => listenerCommands.requestMicrophoneAccess(), - onSuccess: () => { - setMicPermissionRequested(true); - setTimeout(() => { - micPermissionStatus.refetch(); - }, 3000); - }, - onError: (error) => { - setMicPermissionRequested(true); - console.error(error); - }, - }); - - const capturePermission = useMutation({ - mutationFn: () => listenerCommands.requestSystemAudioAccess(), - onSuccess: () => { - message("The app will now restart to apply the changes", { kind: "info", title: "System Audio Status Changed" }); - setTimeout(() => { - relaunch(); - }, 2000); - }, - onError: console.error, - }); - - const handleMicPermissionAction = () => { - if (micPermissionRequested && micPermissionStatus.data !== "Authorized") { - listenerCommands.openMicrophoneAccessSettings(); - } else { - micPermission.mutate(); - } - }; - - const allPermissionsGranted = micPermissionStatus.data === "Authorized" - && systemAudioPermissionStatus.data === "Authorized"; + const { + micPermissionStatus, + systemAudioPermissionStatus, + accessibilityPermissionStatus, + micPermission, + systemAudioPermission, + accessibilityPermission, + handleMicPermissionAction, + handleSystemAudioPermissionAction, + handleAccessibilityPermissionAction, + } = usePermissions(); + + const allPermissionsGranted = micPermissionStatus.data === "authorized" + && systemAudioPermissionStatus.data === "authorized" + && accessibilityPermissionStatus.data === "authorized"; return ( goNext() }} > @@ -173,19 +124,25 @@ function Permissions() { icon={} title="Microphone access" description="Required for meeting transcription" - done={micPermissionStatus.data === "Authorized"} + status={micPermissionStatus.data} isPending={micPermission.isPending} onAction={handleMicPermissionAction} - buttonText={micPermissionRequested && micPermissionStatus.data !== "Authorized" ? "Open Settings" : "Enable"} /> } title="System audio access" description="Required for meeting transcription" - done={systemAudioPermissionStatus.data === "Authorized"} - isPending={capturePermission.isPending} - onAction={() => capturePermission.mutate(undefined)} - buttonText="Enable" + status={systemAudioPermissionStatus.data} + isPending={systemAudioPermission.isPending} + onAction={handleSystemAudioPermissionAction} + /> + } + title="Accessibility access" + description="Required for detecting active applications" + status={accessibilityPermissionStatus.data} + isPending={accessibilityPermission.isPending} + onAction={handleAccessibilityPermissionAction} /> @@ -197,7 +154,7 @@ function Permissions() { {!allPermissionsGranted && (

- Grant both permissions to continue + Grant all permissions to continue

)}
@@ -298,83 +255,6 @@ function OnboardingContainer({ ); } -function PermissionRow({ - icon, - title, - description, - done, - isPending, - onAction, - buttonText, -}: { - icon: React.ReactNode; - title: string; - description: string; - done: boolean | undefined; - isPending: boolean; - onAction: () => void; - buttonText: string; -}) { - return ( -
-
-
-
{icon}
-
-
-
{title}
-
- {done - ? ( - - - Access Granted - - ) - : {description}} -
-
-
-
- {!done && ( - - )} - {done && ( -
- -
- )} -
-
- ); -} - function IntegrationRow({ icon, name, diff --git a/apps/desktop/src/store/tinybase/main.ts b/apps/desktop/src/store/tinybase/main.ts index 4ff7594e55..024f7445a5 100644 --- a/apps/desktop/src/store/tinybase/main.ts +++ b/apps/desktop/src/store/tinybase/main.ts @@ -63,6 +63,7 @@ export const StoreComponent = () => { .setTablesSchema(SCHEMA.table) .setValuesSchema(SCHEMA.value) ); + store.setValue("user_id", DEFAULT_USER_ID); useDidFinishTransactionListener( () => { @@ -97,16 +98,7 @@ export const StoreComponent = () => { storeIdColumnName: "id", }), [], - async (persister) => { - await persister.load(); - - if (!store.getValue("user_id")) { - store.setValue("user_id", DEFAULT_USER_ID); - } - - await persister.startAutoSave(); - await persister.startAutoLoad(); - }, + async (persister) => await persister.startAutoPersisting(), ); const synchronizer = useCreateSynchronizer( diff --git a/apps/desktop/src/store/zustand/listener/general.ts b/apps/desktop/src/store/zustand/listener/general.ts index 8a05840f8a..011c80511c 100644 --- a/apps/desktop/src/store/zustand/listener/general.ts +++ b/apps/desktop/src/store/zustand/listener/general.ts @@ -20,6 +20,7 @@ export type GeneralState = { seconds: number; intervalId?: NodeJS.Timeout; sessionId: string | null; + muted: boolean; }; export type GeneralActions = { @@ -28,6 +29,7 @@ export type GeneralActions = { options?: { persistFinal?: PersistFinalCallback }, ) => void; stop: () => void; + setMuted: (value: boolean) => void; }; const initialState: GeneralState = { @@ -36,6 +38,7 @@ const initialState: GeneralState = { amplitude: { mic: 0, speaker: 0 }, seconds: 0, sessionId: null, + muted: false, }; const listenToSessionEvents = ( @@ -184,4 +187,12 @@ export const createGeneralSlice = ( }); }); }, + setMuted: (value) => { + set((state) => + mutate(state, (draft) => { + draft.muted = value; + listenerCommands.setMicMuted(value); + }) + ); + }, }); diff --git a/apps/pro/package.json b/apps/pro/package.json index 72928552de..b88ec62ae7 100644 --- a/apps/pro/package.json +++ b/apps/pro/package.json @@ -14,12 +14,12 @@ "@t3-oss/env-core": "^0.13.8", "dotenv": "^17.2.3", "exa-js": "^1.10.2", - "hono": "^4.10.2", + "hono": "^4.10.4", "hono-rate-limiter": "^0.4.2", "zod": "^3.25.76" }, "devDependencies": { - "@types/node": "^20.19.23", + "@types/node": "^20.19.24", "tsx": "^4.20.6", "typescript": "^5.9.3" } diff --git a/apps/web/package.json b/apps/web/package.json index 9c37d46166..8287532dd4 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -10,35 +10,35 @@ "typecheck": "pnpm -F @hypr/web build && (cd supabase/functions/llm && deno check index.ts) && (cd supabase/functions/stripe && deno check index.ts) && tsc --noEmit" }, "dependencies": { - "@cloudflare/vite-plugin": "^1.13.15", + "@cloudflare/vite-plugin": "^1.13.17", "@hypr/ui": "workspace:*", "@hypr/utils": "workspace:*", - "@iconify-icon/react": "^3.0.1", + "@iconify-icon/react": "^3.0.2", "@mux/mux-player-react": "^3.7.0", "@nangohq/frontend": "^0.69.5", "@nangohq/node": "^0.69.5", "@sentry/tanstackstart-react": "^10.22.0", - "@stripe/stripe-js": "^8.1.0", + "@stripe/stripe-js": "^8.2.0", "@supabase/ssr": "^0.7.0", - "@supabase/supabase-js": "^2.76.1", + "@supabase/supabase-js": "^2.77.0", "@t3-oss/env-core": "^0.13.8", "@tailwindcss/vite": "^4.1.16", - "@tanstack/react-devtools": "^0.7.7", + "@tanstack/react-devtools": "^0.7.11", "@tanstack/react-form": "^1.23.8", "@tanstack/react-query": "^5.90.5", "@tanstack/react-query-devtools": "^5.90.2", - "@tanstack/react-router": "^1.133.25", - "@tanstack/react-router-devtools": "^1.133.25", - "@tanstack/react-router-ssr-query": "^1.133.25", - "@tanstack/react-start": "^1.133.26", - "@tanstack/router-plugin": "^1.133.25", + "@tanstack/react-router": "^1.133.36", + "@tanstack/react-router-devtools": "^1.133.36", + "@tanstack/react-router-ssr-query": "^1.133.36", + "@tanstack/react-start": "^1.134.0", + "@tanstack/router-plugin": "^1.133.36", "drizzle-orm": "^0.44.7", "exa-js": "^1.10.2", "lucide-react": "^0.544.0", "postgres": "^3.4.7", "react": "^19.2.0", "react-dom": "^19.2.0", - "stripe": "^19.1.0", + "stripe": "^19.2.0", "tailwindcss": "^4.1.16", "vite-tsconfig-paths": "^5.1.4", "zod": "^4.1.12" @@ -49,15 +49,15 @@ "@content-collections/vite": "^0.2.7", "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.0", - "@types/node": "^22.18.12", + "@types/node": "^22.18.13", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", - "@vitejs/plugin-react": "^5.0.4", + "@vitejs/plugin-react": "^5.1.0", "env-cmd": "^11.0.0", "jsdom": "^27.0.1", "typescript": "^5.9.3", "vite": "^7.1.12", "web-vitals": "^5.1.0", - "wrangler": "^4.45.0" + "wrangler": "^4.45.2" } } diff --git a/apps/web/src/functions/stripe.ts b/apps/web/src/functions/stripe.ts index 8132edcec0..1eb622ab2a 100644 --- a/apps/web/src/functions/stripe.ts +++ b/apps/web/src/functions/stripe.ts @@ -5,6 +5,6 @@ import { env } from "@/env"; export const getStripeClient = createServerOnlyFn(() => { return new Stripe(env.STRIPE_SECRET_KEY, { - apiVersion: "2025-09-30.clover", + apiVersion: "2025-10-29.clover", }); }); diff --git a/apps/web/supabase/functions/stripe/deno.json b/apps/web/supabase/functions/stripe/deno.json index 0900458dab..84ddc2df1e 100644 --- a/apps/web/supabase/functions/stripe/deno.json +++ b/apps/web/supabase/functions/stripe/deno.json @@ -1,8 +1,8 @@ { "imports": { "supabase-js": "npm:@supabase/supabase-js@2.76.1", - "hono": "jsr:@hono/hono@^4.10.3", - "hono/factory": "jsr:@hono/hono@^4.10.3/factory", - "stripe": "npm:stripe@^19.1.0" + "hono": "jsr:@hono/hono@^4.10.4", + "hono/factory": "jsr:@hono/hono@^4.10.4/factory", + "stripe": "npm:stripe@^19.2.0" } } diff --git a/apps/web/supabase/functions/stripe/deno.lock b/apps/web/supabase/functions/stripe/deno.lock index b9eceb3923..ecdf8d288d 100644 --- a/apps/web/supabase/functions/stripe/deno.lock +++ b/apps/web/supabase/functions/stripe/deno.lock @@ -1,13 +1,13 @@ { "version": "5", "specifiers": { - "jsr:@hono/hono@^4.10.3": "4.10.3", + "jsr:@hono/hono@^4.10.4": "4.10.4", "npm:@supabase/supabase-js@2.76.1": "2.76.1", - "npm:stripe@^19.1.0": "19.1.0" + "npm:stripe@^19.2.0": "19.2.0" }, "jsr": { - "@hono/hono@4.10.3": { - "integrity": "d37db91cace43d80dccdbb49b396bd4f97e019c8566c20201cb1d9e4a3009e45" + "@hono/hono@4.10.4": { + "integrity": "e54d00c4cf994e7ae297d7321793cf940656b9c5e934564c03ffc15499041b9e" } }, "npm": { @@ -200,8 +200,8 @@ "side-channel-weakmap" ] }, - "stripe@19.1.0": { - "integrity": "sha512-FjgIiE98dMMTNssfdjMvFdD4eZyEzdWAOwPYqzhPRNZeg9ggFWlPXmX1iJKD5pPIwZBaPlC3SayQQkwsPo6/YQ==", + "stripe@19.2.0": { + "integrity": "sha512-strzN8luMGMC1LEleGKg7pJGXFx0kSS4y/uSjK8yPQV9SUBMtJVAp/v8XMQLRnMbXaSaWLrIaHcMlKcsizdRDQ==", "dependencies": [ "qs" ] @@ -231,9 +231,9 @@ }, "workspace": { "dependencies": [ - "jsr:@hono/hono@^4.10.3", + "jsr:@hono/hono@^4.10.4", "npm:@supabase/supabase-js@2.76.1", - "npm:stripe@^19.1.0" + "npm:stripe@^19.2.0" ] } } diff --git a/apps/web/supabase/functions/stripe/index.ts b/apps/web/supabase/functions/stripe/index.ts index 83d48d75d3..6dfdac33ae 100644 --- a/apps/web/supabase/functions/stripe/index.ts +++ b/apps/web/supabase/functions/stripe/index.ts @@ -4,7 +4,7 @@ import Stripe from "stripe"; import { createClient } from "supabase-js"; const stripe = new Stripe(Deno.env.get("STRIPE_API_KEY") as string, { - apiVersion: "2025-09-30.clover", + apiVersion: "2025-10-29.clover", }); const cryptoProvider = Stripe.createSubtleCryptoProvider(); diff --git a/crates/detect/Cargo.toml b/crates/detect/Cargo.toml index 3d5e0761ab..5b60242e68 100644 --- a/crates/detect/Cargo.toml +++ b/crates/detect/Cargo.toml @@ -24,5 +24,4 @@ objc2 = { workspace = true } objc2-core-foundation = { workspace = true } objc2-application-services = { workspace = true } -macos-accessibility-client = "0.0.1" plist = "1.7" diff --git a/crates/detect/src/lib.rs b/crates/detect/src/lib.rs index 54c3ff8382..8c07186f86 100644 --- a/crates/detect/src/lib.rs +++ b/crates/detect/src/lib.rs @@ -3,16 +3,26 @@ mod list; mod mic; mod utils; +#[cfg(target_os = "macos")] +mod zoom; + pub use app::*; pub use list::*; pub use mic::*; +#[cfg(target_os = "macos")] +pub use zoom::*; + use utils::*; #[derive(Debug, Clone)] pub enum DetectEvent { MicStarted(Vec), MicStopped, + #[cfg(target_os = "macos")] + ZoomMuteStateChanged { + value: bool, + }, } pub type DetectCallback = std::sync::Arc; @@ -32,47 +42,22 @@ trait Observer: Send + Sync { #[derive(Default)] pub struct Detector { mic_detector: MicDetector, + #[cfg(target_os = "macos")] + zoom_watcher: ZoomMuteWatcher, } impl Detector { - #[cfg(target_os = "macos")] - pub fn macos_check_accessibility_permission(&self) -> Result { - let is_trusted = macos_accessibility_client::accessibility::application_is_trusted(); - Ok(is_trusted) - } - - #[cfg(target_os = "macos")] - pub fn macos_request_accessibility_permission(&self) -> Result<(), String> { - macos_accessibility_client::accessibility::application_is_trusted_with_prompt(); - Ok(()) - } - pub fn start(&mut self, f: DetectCallback) { - self.mic_detector.start(f); + self.mic_detector.start(f.clone()); + + #[cfg(target_os = "macos")] + self.zoom_watcher.start(f); } pub fn stop(&mut self) { self.mic_detector.stop(); - } -} - -#[cfg(test)] -mod tests { - use super::*; - #[test] - #[ignore] - #[cfg(target_os = "macos")] - fn test_macos_check_accessibility_permission() { - let detector = Detector::default(); - let is_trusted = detector.macos_check_accessibility_permission(); - assert!(is_trusted.is_ok()); - } - - #[test] - #[ignore] - #[cfg(target_os = "macos")] - fn test_macos_request_accessibility_permission() { - macos_accessibility_client::accessibility::application_is_trusted_with_prompt(); + #[cfg(target_os = "macos")] + self.zoom_watcher.stop(); } } diff --git a/crates/detect/src/zoom.rs b/crates/detect/src/zoom.rs new file mode 100644 index 0000000000..7f6b37c7d2 --- /dev/null +++ b/crates/detect/src/zoom.rs @@ -0,0 +1,162 @@ +use std::process::Command; +use std::time::{Duration, Instant}; + +use crate::{BackgroundTask, DetectCallback, DetectEvent}; + +const ZOOM_BUNDLE_ID: &str = "us.zoom.xos"; + +pub struct ZoomMuteWatcher { + background: BackgroundTask, +} + +impl Default for ZoomMuteWatcher { + fn default() -> Self { + Self { + background: BackgroundTask::default(), + } + } +} + +struct WatcherState { + last_mute_state: Option, + last_check: Instant, + poll_interval: Duration, +} + +impl WatcherState { + fn new() -> Self { + Self { + last_mute_state: None, + last_check: Instant::now(), + poll_interval: Duration::from_millis(1000), + } + } +} + +fn check_zoom_mute_state() -> Option { + let script = r#" +tell application "System Events" + if (get name of every application process) contains "zoom.us" then + tell application process "zoom.us" + if exists (menu item "Mute audio" of menu 1 of menu bar item "Meeting" of menu bar 1) then + return "unmuted" + else if exists (menu item "Unmute audio" of menu 1 of menu bar item "Meeting" of menu bar 1) then + return "muted" + else + return "unknown" + end if + end tell + else + return "not_running" + end if +end tell +"#; + + let output = Command::new("osascript") + .arg("-e") + .arg(script) + .output() + .ok()?; + + if !output.status.success() { + tracing::warn!( + "osascript failed: {:?}", + String::from_utf8_lossy(&output.stderr) + ); + return None; + } + + let result = String::from_utf8_lossy(&output.stdout).trim().to_string(); + + match result.as_str() { + "muted" => Some(true), + "unmuted" => Some(false), + "unknown" => { + tracing::debug!("zoom state unknown (likely not in meeting)"); + None + } + "not_running" => { + tracing::debug!("zoom not running"); + None + } + other => { + tracing::warn!("unexpected osascript output: {}", other); + None + } + } +} + +fn is_zoom_using_mic() -> bool { + let apps = crate::list_mic_using_apps(); + apps.iter().any(|app| app.id == ZOOM_BUNDLE_ID) +} + +impl crate::Observer for ZoomMuteWatcher { + fn start(&mut self, f: DetectCallback) { + if self.background.is_running() { + return; + } + + self.background.start(|running, mut rx| async move { + let mut state = WatcherState::new(); + + loop { + tokio::select! { + _ = &mut rx => { + break; + } + _ = tokio::time::sleep(state.poll_interval) => { + if !running.load(std::sync::atomic::Ordering::SeqCst) { + break; + } + + if !is_zoom_using_mic() { + if state.last_mute_state.is_some() { + tracing::debug!("zoom no longer using mic, clearing state"); + state.last_mute_state = None; + } + continue; + } + + if let Some(muted) = check_zoom_mute_state() { + if state.last_mute_state != Some(muted) { + tracing::info!(muted = muted, "zoom mute state changed"); + state.last_mute_state = Some(muted); + + let event = DetectEvent::ZoomMuteStateChanged { value: muted }; + f(event); + } + } + + state.last_check = Instant::now(); + } + } + } + + tracing::info!("zoom mute watcher stopped"); + }); + } + + fn stop(&mut self) { + self.background.stop(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + #[ignore] + fn test_check_zoom_mute_state() { + let state = check_zoom_mute_state(); + println!("Zoom mute state: {:?}", state); + } + + #[test] + #[ignore] + fn test_is_zoom_using_mic() { + let result = is_zoom_using_mic(); + println!("Is Zoom using mic: {}", result); + } +} diff --git a/crates/llama/src/lib.rs b/crates/llama/src/lib.rs index 23aaa54649..5669612a8c 100644 --- a/crates/llama/src/lib.rs +++ b/crates/llama/src/lib.rs @@ -447,11 +447,6 @@ mod tests { Llama::new(model_path).unwrap() } - #[test] - fn test_tag() { - assert!(hypr_template::ENHANCE_USER_TPL.contains("")); - } - fn get_request() -> LlamaRequest { LlamaRequest { grammar: Some(hypr_gbnf::Grammar::Enhance { sections: None }.build()), diff --git a/packages/db/package.json b/packages/db/package.json index 9983a89de7..f671436fe8 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -20,8 +20,8 @@ "zod": "^4.1.12" }, "devDependencies": { - "@types/node": "^24.9.1", - "drizzle-kit": "^0.31.5", + "@types/node": "^24.9.2", + "drizzle-kit": "^0.31.6", "pg": "^8.16.3", "typescript": "~5.8.3" } diff --git a/packages/tiptap/package.json b/packages/tiptap/package.json index 5deec45fff..5f795eb509 100644 --- a/packages/tiptap/package.json +++ b/packages/tiptap/package.json @@ -20,40 +20,40 @@ "@hypr/ui": "workspace:^", "@remixicon/react": "^4.7.0", "@tanstack/react-query": "^5.90.5", - "@tanstack/react-router": "^1.133.25", - "@tiptap/core": "^3.7.2", - "@tiptap/extension-bubble-menu": "^3.7.2", - "@tiptap/extension-document": "^3.7.2", - "@tiptap/extension-highlight": "^3.7.2", - "@tiptap/extension-history": "^3.7.2", - "@tiptap/extension-image": "^3.7.2", - "@tiptap/extension-link": "^3.7.2", - "@tiptap/extension-list-keymap": "^3.7.2", - "@tiptap/extension-mention": "^3.7.2", - "@tiptap/extension-placeholder": "^3.7.2", - "@tiptap/extension-strike": "^3.7.2", - "@tiptap/extension-task-item": "^3.7.2", - "@tiptap/extension-task-list": "^3.7.2", - "@tiptap/extension-text": "^3.7.2", - "@tiptap/extension-typography": "^3.7.2", - "@tiptap/extension-underline": "^3.7.2", - "@tiptap/markdown": "^3.7.2", - "@tiptap/pm": "^3.7.2", - "@tiptap/react": "^3.7.2", - "@tiptap/starter-kit": "^3.7.2", - "@tiptap/suggestion": "^3.7.2", + "@tanstack/react-router": "^1.133.36", + "@tiptap/core": "^3.9.1", + "@tiptap/extension-bubble-menu": "^3.9.1", + "@tiptap/extension-document": "^3.9.1", + "@tiptap/extension-highlight": "^3.9.1", + "@tiptap/extension-history": "^3.9.1", + "@tiptap/extension-image": "^3.9.1", + "@tiptap/extension-link": "^3.9.1", + "@tiptap/extension-list-keymap": "^3.9.1", + "@tiptap/extension-mention": "^3.9.1", + "@tiptap/extension-placeholder": "^3.9.1", + "@tiptap/extension-strike": "^3.9.1", + "@tiptap/extension-task-item": "^3.9.1", + "@tiptap/extension-task-list": "^3.9.1", + "@tiptap/extension-text": "^3.9.1", + "@tiptap/extension-typography": "^3.9.1", + "@tiptap/extension-underline": "^3.9.1", + "@tiptap/markdown": "^3.9.1", + "@tiptap/pm": "^3.9.1", + "@tiptap/react": "^3.9.1", + "@tiptap/starter-kit": "^3.9.1", + "@tiptap/suggestion": "^3.9.1", "clsx": "^2.1.1", "lucide-react": "^0.544.0", "prosemirror-commands": "^1.7.1", "prosemirror-model": "^1.25.4", "prosemirror-state": "^1.4.4", - "turndown": "^7.2.1" + "turndown": "^7.2.2" }, "devDependencies": { - "@types/node": "^22.18.12", + "@types/node": "^22.18.13", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", - "@types/turndown": "^5.0.5", + "@types/turndown": "^5.0.6", "vitest": "^3.2.4" }, "scripts": { diff --git a/packages/ui/package.json b/packages/ui/package.json index ee518ffdc1..5ab907feb8 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -51,7 +51,7 @@ }, "devDependencies": { "@tanstack/react-query": "^5.90.5", - "@types/node": "^22.18.12", + "@types/node": "^22.18.13", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", "autoprefixer": "^10.4.21", diff --git a/packages/utils/package.json b/packages/utils/package.json index 6167390e85..58dcb6e242 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -4,15 +4,15 @@ ".": "./src/index.ts" }, "dependencies": { - "@ai-sdk/openai-compatible": "^1.0.22", + "@ai-sdk/openai-compatible": "^1.0.24", "@date-fns/tz": "^1.4.1", "@hypr/plugin-db": "workspace:^", "@hypr/plugin-listener": "workspace:^", "@hypr/plugin-sse": "workspace:^", "@hypr/plugin-windows": "workspace:^", "@tauri-apps/api": "^2.9.0", - "@tauri-apps/plugin-http": "^2.5.2", - "ai": "^5.0.78", + "@tauri-apps/plugin-http": "^2.5.4", + "ai": "^5.0.82", "clsx": "^2.1.1", "date-fns": "^4.1.0", "mutative": "^1.3.0", diff --git a/plugins/detect/.gitignore b/plugins/detect/.gitignore new file mode 100644 index 0000000000..50d8e32e89 --- /dev/null +++ b/plugins/detect/.gitignore @@ -0,0 +1,17 @@ +/.vs +.DS_Store +.Thumbs.db +*.sublime* +.idea/ +debug.log +package-lock.json +.vscode/settings.json +yarn.lock + +/.tauri +/target +Cargo.lock +node_modules/ + +dist-js +dist diff --git a/plugins/detect/Cargo.toml b/plugins/detect/Cargo.toml new file mode 100644 index 0000000000..c78b1aab86 --- /dev/null +++ b/plugins/detect/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "tauri-plugin-detect" +version = "0.1.0" +authors = ["You"] +edition = "2021" +exclude = ["/js", "/node_modules"] +links = "tauri-plugin-detect" +description = "" + +[build-dependencies] +tauri-plugin = { workspace = true, features = ["build"] } + +[dev-dependencies] +specta-typescript = { workspace = true } + +[dependencies] +hypr-detect = { workspace = true } +hypr-host = { workspace = true } +hypr-intercept = { workspace = true } + +tauri = { workspace = true, features = ["specta", "test"] } + +specta = { workspace = true } +tauri-specta = { workspace = true, features = ["derive", "typescript"] } + +serde = { workspace = true } +thiserror = { workspace = true } +uuid = { workspace = true, features = ["v4"] } + +tokio = { workspace = true, features = ["rt-multi-thread", "macros"] } +tracing = { workspace = true } diff --git a/plugins/detect/build.rs b/plugins/detect/build.rs new file mode 100644 index 0000000000..62e1b90f2d --- /dev/null +++ b/plugins/detect/build.rs @@ -0,0 +1,10 @@ +const COMMANDS: &[&str] = &[ + "set_quit_handler", + "reset_quit_handler", + "list_installed_applications", + "list_mic_using_applications", +]; + +fn main() { + tauri_plugin::Builder::new(COMMANDS).build(); +} diff --git a/plugins/detect/js/bindings.gen.ts b/plugins/detect/js/bindings.gen.ts new file mode 100644 index 0000000000..d17a1c9cd2 --- /dev/null +++ b/plugins/detect/js/bindings.gen.ts @@ -0,0 +1,120 @@ +// @ts-nocheck + + +// This file was generated by [tauri-specta](https://github.com/oscartbeaumont/tauri-specta). Do not edit this file manually. + +/** user-defined commands **/ + + +export const commands = { +async setQuitHandler() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:detect|set_quit_handler") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} +}, +async resetQuitHandler() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:detect|reset_quit_handler") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} +}, +async listInstalledApplications() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:detect|list_installed_applications") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} +}, +async listMicUsingApplications() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:detect|list_mic_using_applications") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} +} +} + +/** user-defined events **/ + + +export const events = __makeEvents__<{ +detectEvent: DetectEvent +}>({ +detectEvent: "plugin:detect:detect-event" +}) + +/** user-defined constants **/ + + + +/** user-defined types **/ + +export type DetectEvent = { type: "micStarted"; key: string; apps: InstalledApp[] } | { type: "micStopped" } | { type: "micMuted"; value: boolean } +export type InstalledApp = { id: string; name: string } + +/** tauri-specta globals **/ + +import { + invoke as TAURI_INVOKE, + Channel as TAURI_CHANNEL, +} from "@tauri-apps/api/core"; +import * as TAURI_API_EVENT from "@tauri-apps/api/event"; +import { type WebviewWindow as __WebviewWindow__ } from "@tauri-apps/api/webviewWindow"; + +type __EventObj__ = { + listen: ( + cb: TAURI_API_EVENT.EventCallback, + ) => ReturnType>; + once: ( + cb: TAURI_API_EVENT.EventCallback, + ) => ReturnType>; + emit: null extends T + ? (payload?: T) => ReturnType + : (payload: T) => ReturnType; +}; + +export type Result = + | { status: "ok"; data: T } + | { status: "error"; error: E }; + +function __makeEvents__>( + mappings: Record, +) { + return new Proxy( + {} as unknown as { + [K in keyof T]: __EventObj__ & { + (handle: __WebviewWindow__): __EventObj__; + }; + }, + { + get: (_, event) => { + const name = mappings[event as keyof T]; + + return new Proxy((() => {}) as any, { + apply: (_, __, [window]: [__WebviewWindow__]) => ({ + listen: (arg: any) => window.listen(name, arg), + once: (arg: any) => window.once(name, arg), + emit: (arg: any) => window.emit(name, arg), + }), + get: (_, command: keyof __EventObj__) => { + switch (command) { + case "listen": + return (arg: any) => TAURI_API_EVENT.listen(name, arg); + case "once": + return (arg: any) => TAURI_API_EVENT.once(name, arg); + case "emit": + return (arg: any) => TAURI_API_EVENT.emit(name, arg); + } + }, + }); + }, + }, + ); +} diff --git a/plugins/detect/js/index.ts b/plugins/detect/js/index.ts new file mode 100644 index 0000000000..a96e122f03 --- /dev/null +++ b/plugins/detect/js/index.ts @@ -0,0 +1 @@ +export * from "./bindings.gen"; diff --git a/plugins/detect/package.json b/plugins/detect/package.json new file mode 100644 index 0000000000..d395cc37a8 --- /dev/null +++ b/plugins/detect/package.json @@ -0,0 +1,11 @@ +{ + "name": "@hypr/plugin-detect", + "private": true, + "main": "./js/index.ts", + "scripts": { + "codegen": "cargo test -p tauri-plugin-detect" + }, + "dependencies": { + "@tauri-apps/api": "^2.9.0" + } +} diff --git a/plugins/detect/permissions/autogenerated/commands/list_installed_applications.toml b/plugins/detect/permissions/autogenerated/commands/list_installed_applications.toml new file mode 100644 index 0000000000..0447bd82e8 --- /dev/null +++ b/plugins/detect/permissions/autogenerated/commands/list_installed_applications.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-list-installed-applications" +description = "Enables the list_installed_applications command without any pre-configured scope." +commands.allow = ["list_installed_applications"] + +[[permission]] +identifier = "deny-list-installed-applications" +description = "Denies the list_installed_applications command without any pre-configured scope." +commands.deny = ["list_installed_applications"] diff --git a/plugins/detect/permissions/autogenerated/commands/list_mic_using_applications.toml b/plugins/detect/permissions/autogenerated/commands/list_mic_using_applications.toml new file mode 100644 index 0000000000..7947e66a6f --- /dev/null +++ b/plugins/detect/permissions/autogenerated/commands/list_mic_using_applications.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-list-mic-using-applications" +description = "Enables the list_mic_using_applications command without any pre-configured scope." +commands.allow = ["list_mic_using_applications"] + +[[permission]] +identifier = "deny-list-mic-using-applications" +description = "Denies the list_mic_using_applications command without any pre-configured scope." +commands.deny = ["list_mic_using_applications"] diff --git a/plugins/detect/permissions/autogenerated/commands/reset_quit_handler.toml b/plugins/detect/permissions/autogenerated/commands/reset_quit_handler.toml new file mode 100644 index 0000000000..fcd826bb7d --- /dev/null +++ b/plugins/detect/permissions/autogenerated/commands/reset_quit_handler.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-reset-quit-handler" +description = "Enables the reset_quit_handler command without any pre-configured scope." +commands.allow = ["reset_quit_handler"] + +[[permission]] +identifier = "deny-reset-quit-handler" +description = "Denies the reset_quit_handler command without any pre-configured scope." +commands.deny = ["reset_quit_handler"] diff --git a/plugins/detect/permissions/autogenerated/commands/set_quit_handler.toml b/plugins/detect/permissions/autogenerated/commands/set_quit_handler.toml new file mode 100644 index 0000000000..39e96b0bf0 --- /dev/null +++ b/plugins/detect/permissions/autogenerated/commands/set_quit_handler.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-set-quit-handler" +description = "Enables the set_quit_handler command without any pre-configured scope." +commands.allow = ["set_quit_handler"] + +[[permission]] +identifier = "deny-set-quit-handler" +description = "Denies the set_quit_handler command without any pre-configured scope." +commands.deny = ["set_quit_handler"] diff --git a/plugins/detect/permissions/autogenerated/reference.md b/plugins/detect/permissions/autogenerated/reference.md new file mode 100644 index 0000000000..f85cd8f471 --- /dev/null +++ b/plugins/detect/permissions/autogenerated/reference.md @@ -0,0 +1,124 @@ +## Default Permission + +Default permissions for the plugin + +#### This default permission set includes the following: + +- `allow-set-quit-handler` +- `allow-reset-quit-handler` +- `allow-list-installed-applications` +- `allow-list-mic-using-applications` + +## Permission Table + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentifierDescription
+ +`detect:allow-list-installed-applications` + + + +Enables the list_installed_applications command without any pre-configured scope. + +
+ +`detect:deny-list-installed-applications` + + + +Denies the list_installed_applications command without any pre-configured scope. + +
+ +`detect:allow-list-mic-using-applications` + + + +Enables the list_mic_using_applications command without any pre-configured scope. + +
+ +`detect:deny-list-mic-using-applications` + + + +Denies the list_mic_using_applications command without any pre-configured scope. + +
+ +`detect:allow-reset-quit-handler` + + + +Enables the reset_quit_handler command without any pre-configured scope. + +
+ +`detect:deny-reset-quit-handler` + + + +Denies the reset_quit_handler command without any pre-configured scope. + +
+ +`detect:allow-set-quit-handler` + + + +Enables the set_quit_handler command without any pre-configured scope. + +
+ +`detect:deny-set-quit-handler` + + + +Denies the set_quit_handler command without any pre-configured scope. + +
diff --git a/plugins/detect/permissions/default.toml b/plugins/detect/permissions/default.toml new file mode 100644 index 0000000000..bb43cf9ab6 --- /dev/null +++ b/plugins/detect/permissions/default.toml @@ -0,0 +1,8 @@ +[default] +description = "Default permissions for the plugin" +permissions = [ + "allow-set-quit-handler", + "allow-reset-quit-handler", + "allow-list-installed-applications", + "allow-list-mic-using-applications", +] diff --git a/plugins/detect/permissions/schemas/schema.json b/plugins/detect/permissions/schemas/schema.json new file mode 100644 index 0000000000..71cf31fc77 --- /dev/null +++ b/plugins/detect/permissions/schemas/schema.json @@ -0,0 +1,354 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "PermissionFile", + "description": "Permission file that can define a default permission, a set of permissions or a list of inlined permissions.", + "type": "object", + "properties": { + "default": { + "description": "The default permission set for the plugin", + "anyOf": [ + { + "$ref": "#/definitions/DefaultPermission" + }, + { + "type": "null" + } + ] + }, + "set": { + "description": "A list of permissions sets defined", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionSet" + } + }, + "permission": { + "description": "A list of inlined permissions", + "default": [], + "type": "array", + "items": { + "$ref": "#/definitions/Permission" + } + } + }, + "definitions": { + "DefaultPermission": { + "description": "The default permission set of the plugin.\n\nWorks similarly to a permission with the \"default\" identifier.", + "type": "object", + "required": [ + "permissions" + ], + "properties": { + "version": { + "description": "The version of the permission.", + "type": [ + "integer", + "null" + ], + "format": "uint64", + "minimum": 1.0 + }, + "description": { + "description": "Human-readable description of what the permission does. Tauri convention is to use `

` headings in markdown content for Tauri documentation generation purposes.", + "type": [ + "string", + "null" + ] + }, + "permissions": { + "description": "All permissions this set contains.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PermissionSet": { + "description": "A set of direct permissions grouped together under a new name.", + "type": "object", + "required": [ + "description", + "identifier", + "permissions" + ], + "properties": { + "identifier": { + "description": "A unique identifier for the permission.", + "type": "string" + }, + "description": { + "description": "Human-readable description of what the permission does.", + "type": "string" + }, + "permissions": { + "description": "All permissions this set contains.", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionKind" + } + } + } + }, + "Permission": { + "description": "Descriptions of explicit privileges of commands.\n\nIt can enable commands to be accessible in the frontend of the application.\n\nIf the scope is defined it can be used to fine grain control the access of individual or multiple commands.", + "type": "object", + "required": [ + "identifier" + ], + "properties": { + "version": { + "description": "The version of the permission.", + "type": [ + "integer", + "null" + ], + "format": "uint64", + "minimum": 1.0 + }, + "identifier": { + "description": "A unique identifier for the permission.", + "type": "string" + }, + "description": { + "description": "Human-readable description of what the permission does. Tauri internal convention is to use `

` headings in markdown content for Tauri documentation generation purposes.", + "type": [ + "string", + "null" + ] + }, + "commands": { + "description": "Allowed or denied commands when using this permission.", + "default": { + "allow": [], + "deny": [] + }, + "allOf": [ + { + "$ref": "#/definitions/Commands" + } + ] + }, + "scope": { + "description": "Allowed or denied scoped when using this permission.", + "allOf": [ + { + "$ref": "#/definitions/Scopes" + } + ] + }, + "platforms": { + "description": "Target platforms this permission applies. By default all platforms are affected by this permission.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Target" + } + } + } + }, + "Commands": { + "description": "Allowed and denied commands inside a permission.\n\nIf two commands clash inside of `allow` and `deny`, it should be denied by default.", + "type": "object", + "properties": { + "allow": { + "description": "Allowed command.", + "default": [], + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Denied command, which takes priority.", + "default": [], + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "Scopes": { + "description": "An argument for fine grained behavior control of Tauri commands.\n\nIt can be of any serde serializable type and is used to allow or prevent certain actions inside a Tauri command. The configured scope is passed to the command and will be enforced by the command implementation.\n\n## Example\n\n```json { \"allow\": [{ \"path\": \"$HOME/**\" }], \"deny\": [{ \"path\": \"$HOME/secret.txt\" }] } ```", + "type": "object", + "properties": { + "allow": { + "description": "Data that defines what is allowed by the scope.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + }, + "deny": { + "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + } + } + }, + "Value": { + "description": "All supported ACL values.", + "anyOf": [ + { + "description": "Represents a null JSON value.", + "type": "null" + }, + { + "description": "Represents a [`bool`].", + "type": "boolean" + }, + { + "description": "Represents a valid ACL [`Number`].", + "allOf": [ + { + "$ref": "#/definitions/Number" + } + ] + }, + { + "description": "Represents a [`String`].", + "type": "string" + }, + { + "description": "Represents a list of other [`Value`]s.", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, + { + "description": "Represents a map of [`String`] keys to [`Value`]s.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Value" + } + } + ] + }, + "Number": { + "description": "A valid ACL number.", + "anyOf": [ + { + "description": "Represents an [`i64`].", + "type": "integer", + "format": "int64" + }, + { + "description": "Represents a [`f64`].", + "type": "number", + "format": "double" + } + ] + }, + "Target": { + "description": "Platform target.", + "oneOf": [ + { + "description": "MacOS.", + "type": "string", + "enum": [ + "macOS" + ] + }, + { + "description": "Windows.", + "type": "string", + "enum": [ + "windows" + ] + }, + { + "description": "Linux.", + "type": "string", + "enum": [ + "linux" + ] + }, + { + "description": "Android.", + "type": "string", + "enum": [ + "android" + ] + }, + { + "description": "iOS.", + "type": "string", + "enum": [ + "iOS" + ] + } + ] + }, + "PermissionKind": { + "type": "string", + "oneOf": [ + { + "description": "Enables the list_installed_applications command without any pre-configured scope.", + "type": "string", + "const": "allow-list-installed-applications", + "markdownDescription": "Enables the list_installed_applications command without any pre-configured scope." + }, + { + "description": "Denies the list_installed_applications command without any pre-configured scope.", + "type": "string", + "const": "deny-list-installed-applications", + "markdownDescription": "Denies the list_installed_applications command without any pre-configured scope." + }, + { + "description": "Enables the list_mic_using_applications command without any pre-configured scope.", + "type": "string", + "const": "allow-list-mic-using-applications", + "markdownDescription": "Enables the list_mic_using_applications command without any pre-configured scope." + }, + { + "description": "Denies the list_mic_using_applications command without any pre-configured scope.", + "type": "string", + "const": "deny-list-mic-using-applications", + "markdownDescription": "Denies the list_mic_using_applications command without any pre-configured scope." + }, + { + "description": "Enables the reset_quit_handler command without any pre-configured scope.", + "type": "string", + "const": "allow-reset-quit-handler", + "markdownDescription": "Enables the reset_quit_handler command without any pre-configured scope." + }, + { + "description": "Denies the reset_quit_handler command without any pre-configured scope.", + "type": "string", + "const": "deny-reset-quit-handler", + "markdownDescription": "Denies the reset_quit_handler command without any pre-configured scope." + }, + { + "description": "Enables the set_quit_handler command without any pre-configured scope.", + "type": "string", + "const": "allow-set-quit-handler", + "markdownDescription": "Enables the set_quit_handler command without any pre-configured scope." + }, + { + "description": "Denies the set_quit_handler command without any pre-configured scope.", + "type": "string", + "const": "deny-set-quit-handler", + "markdownDescription": "Denies the set_quit_handler command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-set-quit-handler`\n- `allow-reset-quit-handler`\n- `allow-list-installed-applications`\n- `allow-list-mic-using-applications`", + "type": "string", + "const": "default", + "markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-set-quit-handler`\n- `allow-reset-quit-handler`\n- `allow-list-installed-applications`\n- `allow-list-mic-using-applications`" + } + ] + } + } +} \ No newline at end of file diff --git a/plugins/detect/src/commands.rs b/plugins/detect/src/commands.rs new file mode 100644 index 0000000000..843fbe8915 --- /dev/null +++ b/plugins/detect/src/commands.rs @@ -0,0 +1,45 @@ +use tauri::Manager; + +#[tauri::command] +#[specta::specta] +pub(crate) async fn set_quit_handler( + app: tauri::AppHandle, +) -> Result<(), String> { + hypr_intercept::setup_quit_handler(move || { + for (_, window) in app.webview_windows() { + let _ = window.close(); + } + + let _ = app.set_activation_policy(tauri::ActivationPolicy::Accessory); + hypr_host::kill_processes_by_matcher(hypr_host::ProcessMatcher::Sidecar); + + false + }); + + Ok(()) +} + +#[tauri::command] +#[specta::specta] +pub(crate) async fn reset_quit_handler( + _app: tauri::AppHandle, +) -> Result<(), String> { + hypr_intercept::reset_quit_handler(); + Ok(()) +} + +#[tauri::command] +#[specta::specta] +pub(crate) async fn list_installed_applications( + _app: tauri::AppHandle, +) -> Result, String> { + Ok(hypr_detect::list_installed_apps()) +} + +#[tauri::command] +#[specta::specta] +pub(crate) async fn list_mic_using_applications( + _app: tauri::AppHandle, +) -> Result, String> { + Ok(hypr_detect::list_mic_using_apps()) +} diff --git a/plugins/detect/src/error.rs b/plugins/detect/src/error.rs new file mode 100644 index 0000000000..6958de1b98 --- /dev/null +++ b/plugins/detect/src/error.rs @@ -0,0 +1,15 @@ +use serde::{ser::Serializer, Serialize}; + +pub type Result = std::result::Result; + +#[derive(Debug, thiserror::Error)] +pub enum Error {} + +impl Serialize for Error { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: Serializer, + { + serializer.serialize_str(self.to_string().as_ref()) + } +} diff --git a/plugins/detect/src/events.rs b/plugins/detect/src/events.rs new file mode 100644 index 0000000000..5b6ad4a6b8 --- /dev/null +++ b/plugins/detect/src/events.rs @@ -0,0 +1,38 @@ +#[macro_export] +macro_rules! common_event_derives { + ($item:item) => { + #[derive(serde::Serialize, Clone, specta::Type, tauri_specta::Event)] + $item + }; +} + +common_event_derives! { + #[serde(tag = "type")] + pub enum DetectEvent { + #[serde(rename = "micStarted")] + MicStarted { + key: String, + apps: Vec, + }, + #[serde(rename = "micStopped")] + MicStopped {}, + #[serde(rename = "micMuted")] + MicMuteStateChanged { value: bool }, + } +} + +impl From for DetectEvent { + fn from(event: hypr_detect::DetectEvent) -> Self { + match event { + hypr_detect::DetectEvent::MicStarted(apps) => Self::MicStarted { + key: uuid::Uuid::new_v4().to_string(), + apps, + }, + hypr_detect::DetectEvent::MicStopped => Self::MicStopped {}, + #[cfg(target_os = "macos")] + hypr_detect::DetectEvent::ZoomMuteStateChanged { value } => { + Self::MicMuteStateChanged { value } + } + } + } +} diff --git a/plugins/detect/src/ext.rs b/plugins/detect/src/ext.rs new file mode 100644 index 0000000000..f4e539e142 --- /dev/null +++ b/plugins/detect/src/ext.rs @@ -0,0 +1,3 @@ +pub trait DetectPluginExt {} + +impl> DetectPluginExt for T {} diff --git a/plugins/detect/src/lib.rs b/plugins/detect/src/lib.rs new file mode 100644 index 0000000000..390b07135f --- /dev/null +++ b/plugins/detect/src/lib.rs @@ -0,0 +1,78 @@ +use tauri::Manager; +use tauri_specta::Event; +use tokio::sync::Mutex; + +mod commands; +mod error; +mod events; +mod ext; + +pub use error::*; +pub use events::*; +pub use ext::*; + +const PLUGIN_NAME: &str = "detect"; + +pub type SharedState = Mutex; + +pub struct State { + #[allow(dead_code)] + detector: hypr_detect::Detector, +} + +fn make_specta_builder() -> tauri_specta::Builder { + tauri_specta::Builder::::new() + .plugin_name(PLUGIN_NAME) + .commands(tauri_specta::collect_commands![ + commands::set_quit_handler::, + commands::reset_quit_handler::, + commands::list_installed_applications::, + commands::list_mic_using_applications::, + ]) + .events(tauri_specta::collect_events![DetectEvent]) + .error_handling(tauri_specta::ErrorHandlingMode::Result) +} + +pub fn init() -> tauri::plugin::TauriPlugin { + let specta_builder = make_specta_builder(); + + tauri::plugin::Builder::new(PLUGIN_NAME) + .invoke_handler(specta_builder.invoke_handler()) + .setup(move |app, _api| { + specta_builder.mount_events(app); + + let app_handle = app.app_handle().clone(); + let mut detector = hypr_detect::Detector::default(); + + let callback = hypr_detect::new_callback(move |event| { + let detect_event = DetectEvent::from(event); + let _ = detect_event.emit(&app_handle); + }); + + detector.start(callback); + + let state = State { detector }; + + app.manage(Mutex::new(state)); + Ok(()) + }) + .build() +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn export_types() { + make_specta_builder::() + .export( + specta_typescript::Typescript::default() + .header("// @ts-nocheck\n\n") + .formatter(specta_typescript::formatter::prettier) + .bigint(specta_typescript::BigIntExportBehavior::Number), + "./js/bindings.gen.ts", + ) + .unwrap() + } +} diff --git a/plugins/detect/tsconfig.json b/plugins/detect/tsconfig.json new file mode 100644 index 0000000000..13b985325d --- /dev/null +++ b/plugins/detect/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../tsconfig.base.json", + "include": ["./js/*.ts"], + "exclude": ["node_modules"] +} diff --git a/plugins/listener/Cargo.toml b/plugins/listener/Cargo.toml index 6f40bde92a..5a71ff2532 100644 --- a/plugins/listener/Cargo.toml +++ b/plugins/listener/Cargo.toml @@ -24,14 +24,12 @@ hypr-audio-utils = { workspace = true } hypr-data = { workspace = true } hypr-language = { workspace = true } hypr-llm = { workspace = true } -hypr-tcc = { workspace = true } hypr-vad2 = { workspace = true } owhisper-client = { workspace = true } owhisper-interface = { workspace = true } tauri-plugin-local-stt = { workspace = true } -tauri-plugin-shell = { workspace = true } tauri-plugin-tray = { workspace = true } tauri = { workspace = true, features = ["specta", "test"] } @@ -60,7 +58,3 @@ tokio = { workspace = true, features = ["rt-multi-thread", "macros"] } tokio-stream = { workspace = true } tokio-util = { workspace = true } tracing = { workspace = true } - -[target."cfg(target_os = \"macos\")".dependencies] -block2 = { workspace = true } -objc2-av-foundation = { workspace = true } diff --git a/plugins/listener/build.rs b/plugins/listener/build.rs index 810b6416f1..ec8472e874 100644 --- a/plugins/listener/build.rs +++ b/plugins/listener/build.rs @@ -2,16 +2,8 @@ const COMMANDS: &[&str] = &[ "list_microphone_devices", "get_current_microphone_device", "set_microphone_device", - "check_microphone_access", - "check_system_audio_access", - "request_microphone_access", - "request_system_audio_access", - "open_microphone_access_settings", - "open_system_audio_access_settings", "get_mic_muted", "set_mic_muted", - "get_speaker_muted", - "set_speaker_muted", "start_session", "stop_session", "get_state", diff --git a/plugins/listener/js/bindings.gen.ts b/plugins/listener/js/bindings.gen.ts index c7f3c0f1ba..ecc00f03ce 100644 --- a/plugins/listener/js/bindings.gen.ts +++ b/plugins/listener/js/bindings.gen.ts @@ -31,54 +31,6 @@ async setMicrophoneDevice(deviceName: string) : Promise> { else return { status: "error", error: e as any }; } }, -async checkMicrophoneAccess() : Promise> { - try { - return { status: "ok", data: await TAURI_INVOKE("plugin:listener|check_microphone_access") }; -} catch (e) { - if(e instanceof Error) throw e; - else return { status: "error", error: e as any }; -} -}, -async checkSystemAudioAccess() : Promise> { - try { - return { status: "ok", data: await TAURI_INVOKE("plugin:listener|check_system_audio_access") }; -} catch (e) { - if(e instanceof Error) throw e; - else return { status: "error", error: e as any }; -} -}, -async requestMicrophoneAccess() : Promise> { - try { - return { status: "ok", data: await TAURI_INVOKE("plugin:listener|request_microphone_access") }; -} catch (e) { - if(e instanceof Error) throw e; - else return { status: "error", error: e as any }; -} -}, -async requestSystemAudioAccess() : Promise> { - try { - return { status: "ok", data: await TAURI_INVOKE("plugin:listener|request_system_audio_access") }; -} catch (e) { - if(e instanceof Error) throw e; - else return { status: "error", error: e as any }; -} -}, -async openMicrophoneAccessSettings() : Promise> { - try { - return { status: "ok", data: await TAURI_INVOKE("plugin:listener|open_microphone_access_settings") }; -} catch (e) { - if(e instanceof Error) throw e; - else return { status: "error", error: e as any }; -} -}, -async openSystemAudioAccessSettings() : Promise> { - try { - return { status: "ok", data: await TAURI_INVOKE("plugin:listener|open_system_audio_access_settings") }; -} catch (e) { - if(e instanceof Error) throw e; - else return { status: "error", error: e as any }; -} -}, async getMicMuted() : Promise> { try { return { status: "ok", data: await TAURI_INVOKE("plugin:listener|get_mic_muted") }; @@ -95,22 +47,6 @@ async setMicMuted(muted: boolean) : Promise> { else return { status: "error", error: e as any }; } }, -async getSpeakerMuted() : Promise> { - try { - return { status: "ok", data: await TAURI_INVOKE("plugin:listener|get_speaker_muted") }; -} catch (e) { - if(e instanceof Error) throw e; - else return { status: "error", error: e as any }; -} -}, -async setSpeakerMuted(muted: boolean) : Promise> { - try { - return { status: "ok", data: await TAURI_INVOKE("plugin:listener|set_speaker_muted", { muted }) }; -} catch (e) { - if(e instanceof Error) throw e; - else return { status: "error", error: e as any }; -} -}, async startSession(params: SessionParams) : Promise> { try { return { status: "ok", data: await TAURI_INVOKE("plugin:listener|start_session", { params }) }; @@ -156,8 +92,7 @@ export type Alternatives = { transcript: string; words: Word[]; confidence: numb export type Channel = { alternatives: Alternatives[] } export type Metadata = { request_id: string; model_info: ModelInfo; model_uuid: string } export type ModelInfo = { name: string; version: string; arch: string } -export type PermissionStatus = "NeverRequested" | "Denied" | "Authorized" -export type SessionEvent = { type: "inactive" } | { type: "running_active" } | { type: "audioAmplitude"; mic: number; speaker: number } | { type: "micMuted"; value: boolean } | { type: "speakerMuted"; value: boolean } | { type: "streamResponse"; response: StreamResponse } +export type SessionEvent = { type: "inactive" } | { type: "running_active" } | { type: "audioAmplitude"; mic: number; speaker: number } | { type: "micMuted"; value: boolean } | { type: "streamResponse"; response: StreamResponse } export type SessionParams = { session_id: string; languages: string[]; onboarding: boolean; record_enabled: boolean; model: string; base_url: string; api_key: string; keywords: string[] } export type StreamResponse = { type: "Results"; start: number; duration: number; is_final: boolean; speech_final: boolean; from_finalize: boolean; channel: Channel; metadata: Metadata; channel_index: number[] } | { type: "Metadata"; request_id: string; created: string; duration: number; channels: number } | { type: "SpeechStarted"; channel: number[]; timestamp: number } | { type: "UtteranceEnd"; channel: number[]; last_word_end: number } export type Word = { word: string; start: number; end: number; confidence: number; speaker: number | null; punctuated_word: string | null; language: string | null } diff --git a/plugins/listener/permissions/autogenerated/commands/check_microphone_access.toml b/plugins/listener/permissions/autogenerated/commands/check_microphone_access.toml deleted file mode 100644 index 1f42890238..0000000000 --- a/plugins/listener/permissions/autogenerated/commands/check_microphone_access.toml +++ /dev/null @@ -1,13 +0,0 @@ -# Automatically generated - DO NOT EDIT! - -"$schema" = "../../schemas/schema.json" - -[[permission]] -identifier = "allow-check-microphone-access" -description = "Enables the check_microphone_access command without any pre-configured scope." -commands.allow = ["check_microphone_access"] - -[[permission]] -identifier = "deny-check-microphone-access" -description = "Denies the check_microphone_access command without any pre-configured scope." -commands.deny = ["check_microphone_access"] diff --git a/plugins/listener/permissions/autogenerated/commands/check_system_audio_access.toml b/plugins/listener/permissions/autogenerated/commands/check_system_audio_access.toml deleted file mode 100644 index c8c46a3c2f..0000000000 --- a/plugins/listener/permissions/autogenerated/commands/check_system_audio_access.toml +++ /dev/null @@ -1,13 +0,0 @@ -# Automatically generated - DO NOT EDIT! - -"$schema" = "../../schemas/schema.json" - -[[permission]] -identifier = "allow-check-system-audio-access" -description = "Enables the check_system_audio_access command without any pre-configured scope." -commands.allow = ["check_system_audio_access"] - -[[permission]] -identifier = "deny-check-system-audio-access" -description = "Denies the check_system_audio_access command without any pre-configured scope." -commands.deny = ["check_system_audio_access"] diff --git a/plugins/listener/permissions/autogenerated/commands/get_speaker_muted.toml b/plugins/listener/permissions/autogenerated/commands/get_speaker_muted.toml deleted file mode 100644 index 8985aa4e45..0000000000 --- a/plugins/listener/permissions/autogenerated/commands/get_speaker_muted.toml +++ /dev/null @@ -1,13 +0,0 @@ -# Automatically generated - DO NOT EDIT! - -"$schema" = "../../schemas/schema.json" - -[[permission]] -identifier = "allow-get-speaker-muted" -description = "Enables the get_speaker_muted command without any pre-configured scope." -commands.allow = ["get_speaker_muted"] - -[[permission]] -identifier = "deny-get-speaker-muted" -description = "Denies the get_speaker_muted command without any pre-configured scope." -commands.deny = ["get_speaker_muted"] diff --git a/plugins/listener/permissions/autogenerated/commands/open_microphone_access_settings.toml b/plugins/listener/permissions/autogenerated/commands/open_microphone_access_settings.toml deleted file mode 100644 index 2e392a1268..0000000000 --- a/plugins/listener/permissions/autogenerated/commands/open_microphone_access_settings.toml +++ /dev/null @@ -1,13 +0,0 @@ -# Automatically generated - DO NOT EDIT! - -"$schema" = "../../schemas/schema.json" - -[[permission]] -identifier = "allow-open-microphone-access-settings" -description = "Enables the open_microphone_access_settings command without any pre-configured scope." -commands.allow = ["open_microphone_access_settings"] - -[[permission]] -identifier = "deny-open-microphone-access-settings" -description = "Denies the open_microphone_access_settings command without any pre-configured scope." -commands.deny = ["open_microphone_access_settings"] diff --git a/plugins/listener/permissions/autogenerated/commands/open_system_audio_access_settings.toml b/plugins/listener/permissions/autogenerated/commands/open_system_audio_access_settings.toml deleted file mode 100644 index bdf41b119f..0000000000 --- a/plugins/listener/permissions/autogenerated/commands/open_system_audio_access_settings.toml +++ /dev/null @@ -1,13 +0,0 @@ -# Automatically generated - DO NOT EDIT! - -"$schema" = "../../schemas/schema.json" - -[[permission]] -identifier = "allow-open-system-audio-access-settings" -description = "Enables the open_system_audio_access_settings command without any pre-configured scope." -commands.allow = ["open_system_audio_access_settings"] - -[[permission]] -identifier = "deny-open-system-audio-access-settings" -description = "Denies the open_system_audio_access_settings command without any pre-configured scope." -commands.deny = ["open_system_audio_access_settings"] diff --git a/plugins/listener/permissions/autogenerated/commands/request_microphone_access.toml b/plugins/listener/permissions/autogenerated/commands/request_microphone_access.toml deleted file mode 100644 index 09f966eb1a..0000000000 --- a/plugins/listener/permissions/autogenerated/commands/request_microphone_access.toml +++ /dev/null @@ -1,13 +0,0 @@ -# Automatically generated - DO NOT EDIT! - -"$schema" = "../../schemas/schema.json" - -[[permission]] -identifier = "allow-request-microphone-access" -description = "Enables the request_microphone_access command without any pre-configured scope." -commands.allow = ["request_microphone_access"] - -[[permission]] -identifier = "deny-request-microphone-access" -description = "Denies the request_microphone_access command without any pre-configured scope." -commands.deny = ["request_microphone_access"] diff --git a/plugins/listener/permissions/autogenerated/commands/request_system_audio_access.toml b/plugins/listener/permissions/autogenerated/commands/request_system_audio_access.toml deleted file mode 100644 index becb5c7c4c..0000000000 --- a/plugins/listener/permissions/autogenerated/commands/request_system_audio_access.toml +++ /dev/null @@ -1,13 +0,0 @@ -# Automatically generated - DO NOT EDIT! - -"$schema" = "../../schemas/schema.json" - -[[permission]] -identifier = "allow-request-system-audio-access" -description = "Enables the request_system_audio_access command without any pre-configured scope." -commands.allow = ["request_system_audio_access"] - -[[permission]] -identifier = "deny-request-system-audio-access" -description = "Denies the request_system_audio_access command without any pre-configured scope." -commands.deny = ["request_system_audio_access"] diff --git a/plugins/listener/permissions/autogenerated/commands/set_speaker_muted.toml b/plugins/listener/permissions/autogenerated/commands/set_speaker_muted.toml deleted file mode 100644 index c05c7035f5..0000000000 --- a/plugins/listener/permissions/autogenerated/commands/set_speaker_muted.toml +++ /dev/null @@ -1,13 +0,0 @@ -# Automatically generated - DO NOT EDIT! - -"$schema" = "../../schemas/schema.json" - -[[permission]] -identifier = "allow-set-speaker-muted" -description = "Enables the set_speaker_muted command without any pre-configured scope." -commands.allow = ["set_speaker_muted"] - -[[permission]] -identifier = "deny-set-speaker-muted" -description = "Denies the set_speaker_muted command without any pre-configured scope." -commands.deny = ["set_speaker_muted"] diff --git a/plugins/listener/permissions/autogenerated/reference.md b/plugins/listener/permissions/autogenerated/reference.md index 38d9579e61..03b0dd4765 100644 --- a/plugins/listener/permissions/autogenerated/reference.md +++ b/plugins/listener/permissions/autogenerated/reference.md @@ -7,18 +7,10 @@ Default permissions for the plugin - `allow-list-microphone-devices` - `allow-get-current-microphone-device` - `allow-set-microphone-device` -- `allow-check-microphone-access` -- `allow-check-system-audio-access` -- `allow-request-microphone-access` -- `allow-request-system-audio-access` -- `allow-open-microphone-access-settings` -- `allow-open-system-audio-access-settings` - `allow-start-session` - `allow-stop-session` - `allow-get-mic-muted` - `allow-set-mic-muted` -- `allow-get-speaker-muted` -- `allow-set-speaker-muted` - `allow-get-state` ## Permission Table @@ -30,58 +22,6 @@ Default permissions for the plugin - - - -`listener:allow-check-microphone-access` - - - - -Enables the check_microphone_access command without any pre-configured scope. - - - - - - - -`listener:deny-check-microphone-access` - - - - -Denies the check_microphone_access command without any pre-configured scope. - - - - - - - -`listener:allow-check-system-audio-access` - - - - -Enables the check_system_audio_access command without any pre-configured scope. - - - - - - - -`listener:deny-check-system-audio-access` - - - - -Denies the check_system_audio_access command without any pre-configured scope. - - - - @@ -137,32 +77,6 @@ Denies the get_mic_muted command without any pre-configured scope. -`listener:allow-get-speaker-muted` - - - - -Enables the get_speaker_muted command without any pre-configured scope. - - - - - - - -`listener:deny-get-speaker-muted` - - - - -Denies the get_speaker_muted command without any pre-configured scope. - - - - - - - `listener:allow-get-state` @@ -241,110 +155,6 @@ Denies the list_microphone_devices command without any pre-configured scope. -`listener:allow-open-microphone-access-settings` - - - - -Enables the open_microphone_access_settings command without any pre-configured scope. - - - - - - - -`listener:deny-open-microphone-access-settings` - - - - -Denies the open_microphone_access_settings command without any pre-configured scope. - - - - - - - -`listener:allow-open-system-audio-access-settings` - - - - -Enables the open_system_audio_access_settings command without any pre-configured scope. - - - - - - - -`listener:deny-open-system-audio-access-settings` - - - - -Denies the open_system_audio_access_settings command without any pre-configured scope. - - - - - - - -`listener:allow-request-microphone-access` - - - - -Enables the request_microphone_access command without any pre-configured scope. - - - - - - - -`listener:deny-request-microphone-access` - - - - -Denies the request_microphone_access command without any pre-configured scope. - - - - - - - -`listener:allow-request-system-audio-access` - - - - -Enables the request_system_audio_access command without any pre-configured scope. - - - - - - - -`listener:deny-request-system-audio-access` - - - - -Denies the request_system_audio_access command without any pre-configured scope. - - - - - - - `listener:allow-set-mic-muted` @@ -397,32 +207,6 @@ Denies the set_microphone_device command without any pre-configured scope. -`listener:allow-set-speaker-muted` - - - - -Enables the set_speaker_muted command without any pre-configured scope. - - - - - - - -`listener:deny-set-speaker-muted` - - - - -Denies the set_speaker_muted command without any pre-configured scope. - - - - - - - `listener:allow-start-session` diff --git a/plugins/listener/permissions/default.toml b/plugins/listener/permissions/default.toml index e46470fa04..623c122ca1 100644 --- a/plugins/listener/permissions/default.toml +++ b/plugins/listener/permissions/default.toml @@ -4,17 +4,9 @@ permissions = [ "allow-list-microphone-devices", "allow-get-current-microphone-device", "allow-set-microphone-device", - "allow-check-microphone-access", - "allow-check-system-audio-access", - "allow-request-microphone-access", - "allow-request-system-audio-access", - "allow-open-microphone-access-settings", - "allow-open-system-audio-access-settings", "allow-start-session", "allow-stop-session", "allow-get-mic-muted", "allow-set-mic-muted", - "allow-get-speaker-muted", - "allow-set-speaker-muted", "allow-get-state", ] diff --git a/plugins/listener/permissions/schemas/schema.json b/plugins/listener/permissions/schemas/schema.json index 41fe9c5043..a27c30a074 100644 --- a/plugins/listener/permissions/schemas/schema.json +++ b/plugins/listener/permissions/schemas/schema.json @@ -294,30 +294,6 @@ "PermissionKind": { "type": "string", "oneOf": [ - { - "description": "Enables the check_microphone_access command without any pre-configured scope.", - "type": "string", - "const": "allow-check-microphone-access", - "markdownDescription": "Enables the check_microphone_access command without any pre-configured scope." - }, - { - "description": "Denies the check_microphone_access command without any pre-configured scope.", - "type": "string", - "const": "deny-check-microphone-access", - "markdownDescription": "Denies the check_microphone_access command without any pre-configured scope." - }, - { - "description": "Enables the check_system_audio_access command without any pre-configured scope.", - "type": "string", - "const": "allow-check-system-audio-access", - "markdownDescription": "Enables the check_system_audio_access command without any pre-configured scope." - }, - { - "description": "Denies the check_system_audio_access command without any pre-configured scope.", - "type": "string", - "const": "deny-check-system-audio-access", - "markdownDescription": "Denies the check_system_audio_access command without any pre-configured scope." - }, { "description": "Enables the get_current_microphone_device command without any pre-configured scope.", "type": "string", @@ -342,18 +318,6 @@ "const": "deny-get-mic-muted", "markdownDescription": "Denies the get_mic_muted command without any pre-configured scope." }, - { - "description": "Enables the get_speaker_muted command without any pre-configured scope.", - "type": "string", - "const": "allow-get-speaker-muted", - "markdownDescription": "Enables the get_speaker_muted command without any pre-configured scope." - }, - { - "description": "Denies the get_speaker_muted command without any pre-configured scope.", - "type": "string", - "const": "deny-get-speaker-muted", - "markdownDescription": "Denies the get_speaker_muted command without any pre-configured scope." - }, { "description": "Enables the get_state command without any pre-configured scope.", "type": "string", @@ -390,54 +354,6 @@ "const": "deny-list-microphone-devices", "markdownDescription": "Denies the list_microphone_devices command without any pre-configured scope." }, - { - "description": "Enables the open_microphone_access_settings command without any pre-configured scope.", - "type": "string", - "const": "allow-open-microphone-access-settings", - "markdownDescription": "Enables the open_microphone_access_settings command without any pre-configured scope." - }, - { - "description": "Denies the open_microphone_access_settings command without any pre-configured scope.", - "type": "string", - "const": "deny-open-microphone-access-settings", - "markdownDescription": "Denies the open_microphone_access_settings command without any pre-configured scope." - }, - { - "description": "Enables the open_system_audio_access_settings command without any pre-configured scope.", - "type": "string", - "const": "allow-open-system-audio-access-settings", - "markdownDescription": "Enables the open_system_audio_access_settings command without any pre-configured scope." - }, - { - "description": "Denies the open_system_audio_access_settings command without any pre-configured scope.", - "type": "string", - "const": "deny-open-system-audio-access-settings", - "markdownDescription": "Denies the open_system_audio_access_settings command without any pre-configured scope." - }, - { - "description": "Enables the request_microphone_access command without any pre-configured scope.", - "type": "string", - "const": "allow-request-microphone-access", - "markdownDescription": "Enables the request_microphone_access command without any pre-configured scope." - }, - { - "description": "Denies the request_microphone_access command without any pre-configured scope.", - "type": "string", - "const": "deny-request-microphone-access", - "markdownDescription": "Denies the request_microphone_access command without any pre-configured scope." - }, - { - "description": "Enables the request_system_audio_access command without any pre-configured scope.", - "type": "string", - "const": "allow-request-system-audio-access", - "markdownDescription": "Enables the request_system_audio_access command without any pre-configured scope." - }, - { - "description": "Denies the request_system_audio_access command without any pre-configured scope.", - "type": "string", - "const": "deny-request-system-audio-access", - "markdownDescription": "Denies the request_system_audio_access command without any pre-configured scope." - }, { "description": "Enables the set_mic_muted command without any pre-configured scope.", "type": "string", @@ -462,18 +378,6 @@ "const": "deny-set-microphone-device", "markdownDescription": "Denies the set_microphone_device command without any pre-configured scope." }, - { - "description": "Enables the set_speaker_muted command without any pre-configured scope.", - "type": "string", - "const": "allow-set-speaker-muted", - "markdownDescription": "Enables the set_speaker_muted command without any pre-configured scope." - }, - { - "description": "Denies the set_speaker_muted command without any pre-configured scope.", - "type": "string", - "const": "deny-set-speaker-muted", - "markdownDescription": "Denies the set_speaker_muted command without any pre-configured scope." - }, { "description": "Enables the start_session command without any pre-configured scope.", "type": "string", @@ -499,10 +403,10 @@ "markdownDescription": "Denies the stop_session command without any pre-configured scope." }, { - "description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-list-microphone-devices`\n- `allow-get-current-microphone-device`\n- `allow-set-microphone-device`\n- `allow-check-microphone-access`\n- `allow-check-system-audio-access`\n- `allow-request-microphone-access`\n- `allow-request-system-audio-access`\n- `allow-open-microphone-access-settings`\n- `allow-open-system-audio-access-settings`\n- `allow-start-session`\n- `allow-stop-session`\n- `allow-get-mic-muted`\n- `allow-set-mic-muted`\n- `allow-get-speaker-muted`\n- `allow-set-speaker-muted`\n- `allow-get-state`", + "description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-list-microphone-devices`\n- `allow-get-current-microphone-device`\n- `allow-set-microphone-device`\n- `allow-start-session`\n- `allow-stop-session`\n- `allow-get-mic-muted`\n- `allow-set-mic-muted`\n- `allow-get-state`", "type": "string", "const": "default", - "markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-list-microphone-devices`\n- `allow-get-current-microphone-device`\n- `allow-set-microphone-device`\n- `allow-check-microphone-access`\n- `allow-check-system-audio-access`\n- `allow-request-microphone-access`\n- `allow-request-system-audio-access`\n- `allow-open-microphone-access-settings`\n- `allow-open-system-audio-access-settings`\n- `allow-start-session`\n- `allow-stop-session`\n- `allow-get-mic-muted`\n- `allow-set-mic-muted`\n- `allow-get-speaker-muted`\n- `allow-set-speaker-muted`\n- `allow-get-state`" + "markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-list-microphone-devices`\n- `allow-get-current-microphone-device`\n- `allow-set-microphone-device`\n- `allow-start-session`\n- `allow-stop-session`\n- `allow-get-mic-muted`\n- `allow-set-mic-muted`\n- `allow-get-state`" } ] } diff --git a/plugins/listener/src/actors/session.rs b/plugins/listener/src/actors/session.rs index fa32f768c3..f8859fd5e7 100644 --- a/plugins/listener/src/actors/session.rs +++ b/plugins/listener/src/actors/session.rs @@ -18,9 +18,7 @@ use crate::{ #[derive(Debug)] pub enum SessionMsg { SetMicMute(bool), - SetSpeakerMute(bool), GetMicMute(RpcReplyPort), - GetSpeakerMute(RpcReplyPort), GetMicDeviceName(RpcReplyPort>), ChangeMicDevice(Option), } @@ -103,14 +101,6 @@ impl Actor for SessionActor { SessionEvent::MicMuted { value: muted }.emit(&state.app)?; } - SessionMsg::SetSpeakerMute(muted) => { - if let Some(cell) = registry::where_is(SourceActor::name()) { - let actor: ActorRef = cell.into(); - actor.cast(SourceMsg::SetSpkMute(muted))?; - } - SessionEvent::SpeakerMuted { value: muted }.emit(&state.app)?; - } - SessionMsg::GetMicDeviceName(reply) => { if !reply.is_closed() { let device_name = if let Some(cell) = registry::where_is(SourceActor::name()) { @@ -137,19 +127,6 @@ impl Actor for SessionActor { } } - SessionMsg::GetSpeakerMute(reply) => { - let muted = if let Some(cell) = registry::where_is(SourceActor::name()) { - let actor: ActorRef = cell.into(); - call_t!(actor, SourceMsg::GetSpkMute, 100)? - } else { - false - }; - - if !reply.is_closed() { - let _ = reply.send(muted); - } - } - SessionMsg::ChangeMicDevice(device) => { if let Some(cell) = registry::where_is(SourceActor::name()) { let actor: ActorRef = cell.into(); diff --git a/plugins/listener/src/actors/source.rs b/plugins/listener/src/actors/source.rs index d3067654ab..36bbdba997 100644 --- a/plugins/listener/src/actors/source.rs +++ b/plugins/listener/src/actors/source.rs @@ -18,8 +18,6 @@ const SAMPLE_RATE: u32 = 16000; pub enum SourceMsg { SetMicMute(bool), GetMicMute(RpcReplyPort), - SetSpkMute(bool), - GetSpkMute(RpcReplyPort), SetMicDevice(Option), GetMicDevice(RpcReplyPort>), } @@ -35,7 +33,6 @@ pub struct SourceState { token: CancellationToken, onboarding: bool, mic_muted: Arc, - spk_muted: Arc, run_task: Option>, stream_cancel_token: Option, _device_monitor_handle: Option, @@ -115,7 +112,6 @@ impl Actor for SourceActor { token: args.token, onboarding: args.onboarding, mic_muted: Arc::new(AtomicBool::new(false)), - spk_muted: Arc::new(AtomicBool::new(false)), run_task: None, stream_cancel_token: None, _device_monitor_handle: Some(device_monitor_handle), @@ -142,14 +138,6 @@ impl Actor for SourceActor { let _ = reply.send(st.mic_muted.load(Ordering::Relaxed)); } } - SourceMsg::SetSpkMute(muted) => { - st.spk_muted.store(muted, Ordering::Relaxed); - } - SourceMsg::GetSpkMute(reply) => { - if !reply.is_closed() { - let _ = reply.send(st.spk_muted.load(Ordering::Relaxed)); - } - } SourceMsg::GetMicDevice(reply) => { if !reply.is_closed() { let _ = reply.send(st.mic_device.clone()); @@ -195,7 +183,6 @@ async fn start_source_loop( let myself2 = myself.clone(); let token = st.token.clone(); let mic_muted = st.mic_muted.clone(); - let spk_muted = st.spk_muted.clone(); let mic_device = st.mic_device.clone(); let stream_cancel_token = CancellationToken::new(); @@ -213,43 +200,58 @@ async fn start_source_loop( #[cfg(target_os = "macos")] { tokio::spawn(async move { - let mixed_stream = { - let mut mixed_input = AudioInput::from_mic(mic_device).unwrap(); - ResampledAsyncSource::new(mixed_input.stream(), SAMPLE_RATE) + let mic_stream = { + let mut mic_input = AudioInput::from_mic(mic_device).unwrap(); + ResampledAsyncSource::new(mic_input.stream(), SAMPLE_RATE) + .chunks(AEC_BLOCK_SIZE) + }; + tokio::time::sleep(tokio::time::Duration::from_millis(50)).await; + let spk_stream = { + let mut spk_input = hypr_audio::AudioInput::from_speaker(); + ResampledAsyncSource::new(spk_input.stream(), SAMPLE_RATE) .chunks(AEC_BLOCK_SIZE) }; - tokio::pin!(mixed_stream); + tokio::pin!(mic_stream); + tokio::pin!(spk_stream); loop { + let Some(cell) = registry::where_is(ProcessorActor::name()) else { + tracing::warn!("processor_actor_not_found"); + continue; + }; + let proc: ActorRef = cell.into(); + tokio::select! { _ = token.cancelled() => { - drop(mixed_stream); + drop(mic_stream); + drop(spk_stream); myself2.stop(None); return; } _ = stream_cancel_token.cancelled() => { - drop(mixed_stream); + drop(mic_stream); + drop(spk_stream); return; } - mixed_next = mixed_stream.next() => { - if let Some(data) = mixed_next { - // TODO: should be able to mute each stream - let output_data = if mic_muted.load(Ordering::Relaxed) && spk_muted.load(Ordering::Relaxed) { - vec![0.0; data.len()] + mic_next = mic_stream.next() => { + if let Some(data) = mic_next { + if mic_muted.load(Ordering::Relaxed) { + let msg = ProcMsg::Mic(AudioChunk{ data: vec![0.0; data.len()] }); + let _ = proc.cast(msg); } else { - data - }; - let msg = ProcMsg::Mixed(AudioChunk{ data: output_data }); - - let Some(cell) = registry::where_is(ProcessorActor::name()) else { - tracing::warn!("processor_actor_not_found"); - continue; - }; - - let actor: ActorRef = cell.into(); - if let Err(e) = actor.cast(msg) { - tracing::error!(error = %e, "cast_error"); + let msg = ProcMsg::Mixed(AudioChunk{ data }); + let _ = proc.cast(msg); + } + } else { + break; + } + } + spk_next = spk_stream.next() => { + if let Some(data) = spk_next { + if mic_muted.load(Ordering::Relaxed) { + let msg = ProcMsg::Speaker(AudioChunk{ data }); + let _ = proc.cast(msg); } } else { break; @@ -312,13 +314,7 @@ async fn start_source_loop( } spk_next = spk_stream.next() => { if let Some(data) = spk_next { - let output_data = if spk_muted.load(Ordering::Relaxed) { - vec![0.0; data.len()] - } else { - data - }; - - let msg = ProcMsg::Speaker(AudioChunk{ data: output_data }); + let msg = ProcMsg::Speaker(AudioChunk{ data }); let _ = proc.cast(msg); } else { break; diff --git a/plugins/listener/src/commands.rs b/plugins/listener/src/commands.rs index a532cb2028..50dee1e00d 100644 --- a/plugins/listener/src/commands.rs +++ b/plugins/listener/src/commands.rs @@ -1,4 +1,4 @@ -use crate::{actors::SessionParams, ListenerPluginExt, PermissionStatus}; +use crate::{actors::SessionParams, ListenerPluginExt}; #[tauri::command] #[specta::specta] @@ -31,80 +31,12 @@ pub async fn set_microphone_device( .map_err(|e| e.to_string()) } -#[tauri::command] -#[specta::specta] -pub async fn check_microphone_access( - app: tauri::AppHandle, -) -> Result { - app.check_microphone_access() - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -#[specta::specta] -pub async fn check_system_audio_access( - app: tauri::AppHandle, -) -> Result { - app.check_system_audio_access() - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -#[specta::specta] -pub async fn request_microphone_access( - app: tauri::AppHandle, -) -> Result<(), String> { - app.request_microphone_access() - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -#[specta::specta] -pub async fn request_system_audio_access( - app: tauri::AppHandle, -) -> Result<(), String> { - app.request_system_audio_access() - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -#[specta::specta] -pub async fn open_microphone_access_settings( - app: tauri::AppHandle, -) -> Result<(), String> { - app.open_microphone_access_settings() - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -#[specta::specta] -pub async fn open_system_audio_access_settings( - app: tauri::AppHandle, -) -> Result<(), String> { - app.open_system_audio_access_settings() - .await - .map_err(|e| e.to_string()) -} - #[tauri::command] #[specta::specta] pub async fn get_mic_muted(app: tauri::AppHandle) -> Result { Ok(app.get_mic_muted().await) } -#[tauri::command] -#[specta::specta] -pub async fn get_speaker_muted( - app: tauri::AppHandle, -) -> Result { - Ok(app.get_speaker_muted().await) -} - #[tauri::command] #[specta::specta] pub async fn set_mic_muted( @@ -115,16 +47,6 @@ pub async fn set_mic_muted( Ok(()) } -#[tauri::command] -#[specta::specta] -pub async fn set_speaker_muted( - app: tauri::AppHandle, - muted: bool, -) -> Result<(), String> { - app.set_speaker_muted(muted).await; - Ok(()) -} - #[tauri::command] #[specta::specta] pub async fn start_session( diff --git a/plugins/listener/src/events.rs b/plugins/listener/src/events.rs index dde66a3746..f46219036d 100644 --- a/plugins/listener/src/events.rs +++ b/plugins/listener/src/events.rs @@ -17,8 +17,6 @@ common_event_derives! { AudioAmplitude { mic: u16, speaker: u16 }, #[serde(rename = "micMuted")] MicMuted { value: bool }, - #[serde(rename = "speakerMuted")] - SpeakerMuted { value: bool }, #[serde(rename = "streamResponse")] StreamResponse { response: owhisper_interface::StreamResponse }, } diff --git a/plugins/listener/src/ext.rs b/plugins/listener/src/ext.rs index ae94a606d1..0947bd3223 100644 --- a/plugins/listener/src/ext.rs +++ b/plugins/listener/src/ext.rs @@ -1,15 +1,8 @@ use std::future::Future; -use futures_util::StreamExt; use ractor::{call_t, concurrency, registry, Actor, ActorRef}; use tauri_specta::Event; -#[cfg(target_os = "macos")] -use { - block2::StackBlock, - objc2_av_foundation::{AVAuthorizationStatus, AVCaptureDevice, AVMediaTypeAudio}, -}; - use crate::{ actors::{SessionActor, SessionArgs, SessionMsg, SessionParams}, SessionEvent, @@ -25,21 +18,8 @@ pub trait ListenerPluginExt { device_name: impl Into, ) -> impl Future>; - fn check_microphone_access( - &self, - ) -> impl Future>; - fn check_system_audio_access( - &self, - ) -> impl Future>; - fn request_microphone_access(&self) -> impl Future>; - fn request_system_audio_access(&self) -> impl Future>; - fn open_microphone_access_settings(&self) -> impl Future>; - fn open_system_audio_access_settings(&self) -> impl Future>; - fn get_mic_muted(&self) -> impl Future; - fn get_speaker_muted(&self) -> impl Future; fn set_mic_muted(&self, muted: bool) -> impl Future; - fn set_speaker_muted(&self, muted: bool) -> impl Future; fn get_state(&self) -> impl Future; fn stop_session(&self) -> impl Future; @@ -79,95 +59,6 @@ impl> ListenerPluginExt for T { Ok(()) } - #[tracing::instrument(skip_all)] - async fn check_microphone_access(&self) -> Result { - #[cfg(target_os = "macos")] - { - let status = unsafe { - let media_type = AVMediaTypeAudio.unwrap(); - AVCaptureDevice::authorizationStatusForMediaType(media_type) - }; - - tracing::info!(status = ?status, "microphone_permission_check"); - Ok(status.into()) - } - - #[cfg(not(target_os = "macos"))] - { - let mut mic_sample_stream = hypr_audio::AudioInput::from_mic(None).unwrap().stream(); - let sample = mic_sample_stream.next().await; - Ok(sample.is_some()) - } - } - - #[tracing::instrument(skip_all)] - async fn check_system_audio_access(&self) -> Result { - let status = hypr_tcc::audio_capture_permission_status(); - tracing::info!(status = status, "system_audio_permission_check"); - Ok(status.into()) - } - - #[tracing::instrument(skip_all)] - async fn request_microphone_access(&self) -> Result<(), crate::Error> { - #[cfg(target_os = "macos")] - { - unsafe { - let media_type = AVMediaTypeAudio.unwrap(); - let block = StackBlock::new(|_granted| {}); - AVCaptureDevice::requestAccessForMediaType_completionHandler(media_type, &block); - } - } - - #[cfg(not(target_os = "macos"))] - { - let mut mic_sample_stream = hypr_audio::AudioInput::from_mic(None).unwrap().stream(); - mic_sample_stream.next().await; - } - - Ok(()) - } - - #[tracing::instrument(skip_all)] - async fn request_system_audio_access(&self) -> Result<(), crate::Error> { - { - use tauri_plugin_shell::ShellExt; - - let bundle_id = self.config().identifier.clone(); - self.app_handle() - .shell() - .command("tccutil") - .args(["reset", "AudioCapture", &bundle_id]) - .spawn() - .ok(); - } - - let stop = hypr_audio::AudioOutput::silence(); - - let mut speaker_sample_stream = hypr_audio::AudioInput::from_speaker().stream(); - speaker_sample_stream.next().await; - - let _ = stop.send(()); - Ok(()) - } - - #[tracing::instrument(skip_all)] - async fn open_microphone_access_settings(&self) -> Result<(), crate::Error> { - std::process::Command::new("open") - .arg("x-apple.systempreferences:com.apple.preference.security?Privacy_Microphone") - .spawn()? - .wait()?; - Ok(()) - } - - #[tracing::instrument(skip_all)] - async fn open_system_audio_access_settings(&self) -> Result<(), crate::Error> { - std::process::Command::new("open") - .arg("x-apple.systempreferences:com.apple.preference.security?Privacy_AudioCapture") - .spawn()? - .wait()?; - Ok(()) - } - #[tracing::instrument(skip_all)] async fn get_state(&self) -> crate::fsm::State { if let Some(_) = registry::where_is(SessionActor::name()) { @@ -191,20 +82,6 @@ impl> ListenerPluginExt for T { } } - #[tracing::instrument(skip_all)] - async fn get_speaker_muted(&self) -> bool { - if let Some(cell) = registry::where_is(SessionActor::name()) { - let actor: ActorRef = cell.into(); - - match call_t!(actor, SessionMsg::GetSpeakerMute, 100) { - Ok(muted) => muted, - Err(_) => false, - } - } else { - false - } - } - #[tracing::instrument(skip_all)] async fn set_mic_muted(&self, muted: bool) { if let Some(cell) = registry::where_is(SessionActor::name()) { @@ -213,14 +90,6 @@ impl> ListenerPluginExt for T { } } - #[tracing::instrument(skip_all)] - async fn set_speaker_muted(&self, muted: bool) { - if let Some(cell) = registry::where_is(SessionActor::name()) { - let actor: ActorRef = cell.into(); - let _ = actor.cast(SessionMsg::SetSpeakerMute(muted)); - } - } - #[tracing::instrument(skip_all)] async fn start_session(&self, params: SessionParams) { let state = self.state::(); @@ -253,30 +122,3 @@ impl> ListenerPluginExt for T { } } } - -#[derive(Debug, serde::Serialize, serde::Deserialize, specta::Type)] -pub enum PermissionStatus { - NeverRequested, - Denied, - Authorized, -} - -impl From for PermissionStatus { - fn from(status: isize) -> Self { - match status { - hypr_tcc::GRANTED => Self::Authorized, - hypr_tcc::NEVER_ASKED => Self::NeverRequested, - _ => Self::Denied, - } - } -} - -impl From for PermissionStatus { - fn from(status: AVAuthorizationStatus) -> Self { - match status { - AVAuthorizationStatus::NotDetermined => Self::NeverRequested, - AVAuthorizationStatus::Authorized => Self::Authorized, - _ => Self::Denied, - } - } -} diff --git a/plugins/listener/src/lib.rs b/plugins/listener/src/lib.rs index 52244a3fb9..77fbe16185 100644 --- a/plugins/listener/src/lib.rs +++ b/plugins/listener/src/lib.rs @@ -37,16 +37,8 @@ fn make_specta_builder() -> tauri_specta::Builder { commands::list_microphone_devices::, commands::get_current_microphone_device::, commands::set_microphone_device::, - commands::check_microphone_access::, - commands::check_system_audio_access::, - commands::request_microphone_access::, - commands::request_system_audio_access::, - commands::open_microphone_access_settings::, - commands::open_system_audio_access_settings::, commands::get_mic_muted::, commands::set_mic_muted::, - commands::get_speaker_muted::, - commands::set_speaker_muted::, commands::start_session::, commands::stop_session::, commands::get_state::, diff --git a/plugins/local-llm/build.rs b/plugins/local-llm/build.rs index 2b40c5401d..f5ff80785f 100644 --- a/plugins/local-llm/build.rs +++ b/plugins/local-llm/build.rs @@ -14,8 +14,6 @@ const COMMANDS: &[&str] = &[ "list_custom_models", "get_current_model_selection", "set_current_model_selection", - "generate_title", - "generate_tags", ]; fn main() { diff --git a/plugins/local-llm/js/bindings.gen.ts b/plugins/local-llm/js/bindings.gen.ts index 0720eedd63..71f488a897 100644 --- a/plugins/local-llm/js/bindings.gen.ts +++ b/plugins/local-llm/js/bindings.gen.ts @@ -7,56 +7,120 @@ export const commands = { -async modelsDir() : Promise { - return await TAURI_INVOKE("plugin:local-llm|models_dir"); +async modelsDir() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:local-llm|models_dir") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} }, -async listSupportedModel() : Promise { - return await TAURI_INVOKE("plugin:local-llm|list_supported_model"); +async listSupportedModel() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:local-llm|list_supported_model") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} }, async isServerRunning() : Promise { return await TAURI_INVOKE("plugin:local-llm|is_server_running"); }, -async isModelDownloaded(model: SupportedModel) : Promise { - return await TAURI_INVOKE("plugin:local-llm|is_model_downloaded", { model }); -}, -async isModelDownloading(model: SupportedModel) : Promise { - return await TAURI_INVOKE("plugin:local-llm|is_model_downloading", { model }); -}, -async downloadModel(model: SupportedModel, channel: TAURI_CHANNEL) : Promise { - return await TAURI_INVOKE("plugin:local-llm|download_model", { model, channel }); +async isModelDownloaded(model: SupportedModel) : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:local-llm|is_model_downloaded", { model }) }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} }, -async startServer() : Promise { - return await TAURI_INVOKE("plugin:local-llm|start_server"); +async isModelDownloading(model: SupportedModel) : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:local-llm|is_model_downloading", { model }) }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} }, -async stopServer() : Promise { - return await TAURI_INVOKE("plugin:local-llm|stop_server"); +async downloadModel(model: SupportedModel, channel: TAURI_CHANNEL) : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:local-llm|download_model", { model, channel }) }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} }, -async restartServer() : Promise { - return await TAURI_INVOKE("plugin:local-llm|restart_server"); +async startServer() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:local-llm|start_server") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} }, -async getCurrentModel() : Promise { - return await TAURI_INVOKE("plugin:local-llm|get_current_model"); +async stopServer() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:local-llm|stop_server") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} }, -async setCurrentModel(model: SupportedModel) : Promise { - return await TAURI_INVOKE("plugin:local-llm|set_current_model", { model }); +async restartServer() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:local-llm|restart_server") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} }, -async listDownloadedModel() : Promise { - return await TAURI_INVOKE("plugin:local-llm|list_downloaded_model"); +async getCurrentModel() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:local-llm|get_current_model") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} }, -async listCustomModels() : Promise { - return await TAURI_INVOKE("plugin:local-llm|list_custom_models"); +async setCurrentModel(model: SupportedModel) : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:local-llm|set_current_model", { model }) }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} }, -async getCurrentModelSelection() : Promise { - return await TAURI_INVOKE("plugin:local-llm|get_current_model_selection"); +async listDownloadedModel() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:local-llm|list_downloaded_model") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} }, -async setCurrentModelSelection(model: ModelSelection) : Promise { - return await TAURI_INVOKE("plugin:local-llm|set_current_model_selection", { model }); +async listCustomModels() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:local-llm|list_custom_models") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} }, -async generateTitle(ctx: Partial<{ [key in string]: JsonValue }>) : Promise { - return await TAURI_INVOKE("plugin:local-llm|generate_title", { ctx }); +async getCurrentModelSelection() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:local-llm|get_current_model_selection") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} }, -async generateTags(ctx: Partial<{ [key in string]: JsonValue }>) : Promise { - return await TAURI_INVOKE("plugin:local-llm|generate_tags", { ctx }); +async setCurrentModelSelection(model: ModelSelection) : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:local-llm|set_current_model_selection", { model }) }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} } } @@ -76,7 +140,6 @@ llmEvent: "plugin:local-llm:llm-event" /** user-defined types **/ export type CustomModelInfo = { path: string; name: string } -export type JsonValue = null | boolean | number | string | JsonValue[] | Partial<{ [key in string]: JsonValue }> export type LLMEvent = { progress: number } export type ModelInfo = { key: SupportedModel; name: string; description: string; size_bytes: number } export type ModelSelection = { type: "Predefined"; content: { key: SupportedModel } } | { type: "Custom"; content: { path: string } } diff --git a/plugins/local-llm/permissions/autogenerated/commands/generate_tags.toml b/plugins/local-llm/permissions/autogenerated/commands/generate_tags.toml deleted file mode 100644 index 7726575b60..0000000000 --- a/plugins/local-llm/permissions/autogenerated/commands/generate_tags.toml +++ /dev/null @@ -1,13 +0,0 @@ -# Automatically generated - DO NOT EDIT! - -"$schema" = "../../schemas/schema.json" - -[[permission]] -identifier = "allow-generate-tags" -description = "Enables the generate_tags command without any pre-configured scope." -commands.allow = ["generate_tags"] - -[[permission]] -identifier = "deny-generate-tags" -description = "Denies the generate_tags command without any pre-configured scope." -commands.deny = ["generate_tags"] diff --git a/plugins/local-llm/permissions/autogenerated/commands/generate_title.toml b/plugins/local-llm/permissions/autogenerated/commands/generate_title.toml deleted file mode 100644 index 50dd8e0237..0000000000 --- a/plugins/local-llm/permissions/autogenerated/commands/generate_title.toml +++ /dev/null @@ -1,13 +0,0 @@ -# Automatically generated - DO NOT EDIT! - -"$schema" = "../../schemas/schema.json" - -[[permission]] -identifier = "allow-generate-title" -description = "Enables the generate_title command without any pre-configured scope." -commands.allow = ["generate_title"] - -[[permission]] -identifier = "deny-generate-title" -description = "Denies the generate_title command without any pre-configured scope." -commands.deny = ["generate_title"] diff --git a/plugins/local-llm/permissions/autogenerated/reference.md b/plugins/local-llm/permissions/autogenerated/reference.md index 72d7004c97..0cec420fca 100644 --- a/plugins/local-llm/permissions/autogenerated/reference.md +++ b/plugins/local-llm/permissions/autogenerated/reference.md @@ -19,7 +19,6 @@ Default permissions for the plugin - `allow-list-custom-models` - `allow-get-current-model-selection` - `allow-set-current-model-selection` -- `allow-generate-title` ## Permission Table @@ -59,58 +58,6 @@ Denies the download_model command without any pre-configured scope. -`local-llm:allow-generate-tags` - - - - -Enables the generate_tags command without any pre-configured scope. - - - - - - - -`local-llm:deny-generate-tags` - - - - -Denies the generate_tags command without any pre-configured scope. - - - - - - - -`local-llm:allow-generate-title` - - - - -Enables the generate_title command without any pre-configured scope. - - - - - - - -`local-llm:deny-generate-title` - - - - -Denies the generate_title command without any pre-configured scope. - - - - - - - `local-llm:allow-get-current-model` diff --git a/plugins/local-llm/permissions/default.toml b/plugins/local-llm/permissions/default.toml index 742a7bc1d7..eb58684d89 100644 --- a/plugins/local-llm/permissions/default.toml +++ b/plugins/local-llm/permissions/default.toml @@ -16,5 +16,4 @@ permissions = [ "allow-list-custom-models", "allow-get-current-model-selection", "allow-set-current-model-selection", - "allow-generate-title", ] diff --git a/plugins/local-llm/permissions/schemas/schema.json b/plugins/local-llm/permissions/schemas/schema.json index 9c327ed0dc..5ef4923f85 100644 --- a/plugins/local-llm/permissions/schemas/schema.json +++ b/plugins/local-llm/permissions/schemas/schema.json @@ -306,30 +306,6 @@ "const": "deny-download-model", "markdownDescription": "Denies the download_model command without any pre-configured scope." }, - { - "description": "Enables the generate_tags command without any pre-configured scope.", - "type": "string", - "const": "allow-generate-tags", - "markdownDescription": "Enables the generate_tags command without any pre-configured scope." - }, - { - "description": "Denies the generate_tags command without any pre-configured scope.", - "type": "string", - "const": "deny-generate-tags", - "markdownDescription": "Denies the generate_tags command without any pre-configured scope." - }, - { - "description": "Enables the generate_title command without any pre-configured scope.", - "type": "string", - "const": "allow-generate-title", - "markdownDescription": "Enables the generate_title command without any pre-configured scope." - }, - { - "description": "Denies the generate_title command without any pre-configured scope.", - "type": "string", - "const": "deny-generate-title", - "markdownDescription": "Denies the generate_title command without any pre-configured scope." - }, { "description": "Enables the get_current_model command without any pre-configured scope.", "type": "string", @@ -511,10 +487,10 @@ "markdownDescription": "Denies the stop_server command without any pre-configured scope." }, { - "description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-models-dir`\n- `allow-is-server-running`\n- `allow-is-model-downloading`\n- `allow-is-model-downloaded`\n- `allow-download-model`\n- `allow-start-server`\n- `allow-stop-server`\n- `allow-restart-server`\n- `allow-get-current-model`\n- `allow-set-current-model`\n- `allow-list-downloaded-model`\n- `allow-list-supported-model`\n- `allow-list-custom-models`\n- `allow-get-current-model-selection`\n- `allow-set-current-model-selection`\n- `allow-generate-title`", + "description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-models-dir`\n- `allow-is-server-running`\n- `allow-is-model-downloading`\n- `allow-is-model-downloaded`\n- `allow-download-model`\n- `allow-start-server`\n- `allow-stop-server`\n- `allow-restart-server`\n- `allow-get-current-model`\n- `allow-set-current-model`\n- `allow-list-downloaded-model`\n- `allow-list-supported-model`\n- `allow-list-custom-models`\n- `allow-get-current-model-selection`\n- `allow-set-current-model-selection`", "type": "string", "const": "default", - "markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-models-dir`\n- `allow-is-server-running`\n- `allow-is-model-downloading`\n- `allow-is-model-downloaded`\n- `allow-download-model`\n- `allow-start-server`\n- `allow-stop-server`\n- `allow-restart-server`\n- `allow-get-current-model`\n- `allow-set-current-model`\n- `allow-list-downloaded-model`\n- `allow-list-supported-model`\n- `allow-list-custom-models`\n- `allow-get-current-model-selection`\n- `allow-set-current-model-selection`\n- `allow-generate-title`" + "markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-models-dir`\n- `allow-is-server-running`\n- `allow-is-model-downloading`\n- `allow-is-model-downloaded`\n- `allow-download-model`\n- `allow-start-server`\n- `allow-stop-server`\n- `allow-restart-server`\n- `allow-get-current-model`\n- `allow-set-current-model`\n- `allow-list-downloaded-model`\n- `allow-list-supported-model`\n- `allow-list-custom-models`\n- `allow-get-current-model-selection`\n- `allow-set-current-model-selection`" } ] } diff --git a/plugins/local-llm/src/commands.rs b/plugins/local-llm/src/commands.rs index 67870bb182..83d5be7912 100644 --- a/plugins/local-llm/src/commands.rs +++ b/plugins/local-llm/src/commands.rs @@ -1,6 +1,4 @@ -use crate::{ - CustomModelInfo, LocalLlmPluginExt, LocalLlmTaskExt, ModelInfo, ModelSelection, SupportedModel, -}; +use crate::{CustomModelInfo, LocalLlmPluginExt, ModelInfo, ModelSelection, SupportedModel}; use tauri::ipc::Channel; @@ -142,21 +140,3 @@ pub async fn set_current_model_selection( app.set_current_model_selection(model) .map_err(|e| e.to_string()) } - -#[tauri::command] -#[specta::specta] -pub async fn generate_title( - app: tauri::AppHandle, - ctx: serde_json::Map, -) -> Result { - app.generate_title(ctx).await.map_err(|e| e.to_string()) -} - -#[tauri::command] -#[specta::specta] -pub async fn generate_tags( - app: tauri::AppHandle, - ctx: serde_json::Map, -) -> Result, String> { - app.generate_tags(ctx).await.map_err(|e| e.to_string()) -} diff --git a/plugins/local-llm/src/events.rs b/plugins/local-llm/src/events.rs index 49ef08f298..bdd044e7a8 100644 --- a/plugins/local-llm/src/events.rs +++ b/plugins/local-llm/src/events.rs @@ -1,38 +1,3 @@ -#[cfg(feature = "tauri-plugin-windows")] -use tauri_plugin_windows::AppWindow; - -pub fn on_event(app: &tauri::AppHandle, event: &tauri::RunEvent) { - match event { - #[cfg(feature = "tauri-plugin-windows")] - tauri::RunEvent::WindowEvent { label, event, .. } => { - let hypr_window = match label.parse::() { - Ok(window) => window, - Err(e) => { - tracing::warn!("parse_error: {:?}", e); - return; - } - }; - - if hypr_window != AppWindow::Main { - return; - } - - match event { - tauri::WindowEvent::Focused(true) => { - tokio::task::block_in_place(|| { - tokio::runtime::Handle::current().block_on(async { - use crate::LocalLlmPluginExt; - let _ = app.start_server().await; - }); - }); - } - _ => {} - } - } - _ => {} - } -} - #[derive(serde::Serialize, Clone, specta::Type, tauri_specta::Event)] pub enum LLMEvent { #[serde(rename = "progress")] diff --git a/plugins/local-llm/src/ext/mod.rs b/plugins/local-llm/src/ext/mod.rs index 04286dc9ee..a866635277 100644 --- a/plugins/local-llm/src/ext/mod.rs +++ b/plugins/local-llm/src/ext/mod.rs @@ -1,5 +1,2 @@ mod plugin; pub use plugin::*; - -mod task; -pub use task::*; diff --git a/plugins/local-llm/src/ext/task.rs b/plugins/local-llm/src/ext/task.rs deleted file mode 100644 index e8617878f4..0000000000 --- a/plugins/local-llm/src/ext/task.rs +++ /dev/null @@ -1,51 +0,0 @@ -use std::future::Future; -use tauri::{Manager, Runtime}; - -pub trait LocalLlmTaskExt { - fn generate_title( - &self, - ctx: serde_json::Map, - ) -> impl Future>; - - fn generate_tags( - &self, - ctx: serde_json::Map, - ) -> impl Future, crate::Error>>; - - fn postprocess_transcript( - &self, - ctx: serde_json::Map, - ) -> impl Future>; -} - -impl> LocalLlmTaskExt for T { - async fn generate_title( - &self, - ctx: serde_json::Map, - ) -> Result { - let state = self.state::(); - let s = state.lock().await; - let v = hypr_llm::generate_title(&s.builtin_model, ctx).await?; - Ok(v) - } - - async fn generate_tags( - &self, - ctx: serde_json::Map, - ) -> Result, crate::Error> { - let state = self.state::(); - let s = state.lock().await; - let v = hypr_llm::generate_tags(&s.builtin_model, ctx).await?; - Ok(v) - } - - async fn postprocess_transcript( - &self, - ctx: serde_json::Map, - ) -> Result { - let state = self.state::(); - let s = state.lock().await; - let v = hypr_llm::postprocess_transcript(&s.builtin_model, ctx).await?; - Ok(v) - } -} diff --git a/plugins/local-llm/src/lib.rs b/plugins/local-llm/src/lib.rs index 71b404a8af..51eb8663ca 100644 --- a/plugins/local-llm/src/lib.rs +++ b/plugins/local-llm/src/lib.rs @@ -57,8 +57,6 @@ fn make_specta_builder() -> tauri_specta::Builder { commands::list_custom_models::, commands::get_current_model_selection::, commands::set_current_model_selection::, - commands::generate_title::, - commands::generate_tags::, ]) .error_handling(tauri_specta::ErrorHandlingMode::Result) } @@ -108,7 +106,6 @@ pub fn init() -> tauri::plugin::TauriPlugin { Ok(()) }) - .on_event(on_event) .build() } diff --git a/plugins/notification/build.rs b/plugins/notification/build.rs index c6b5c3c2e8..df7f1b9b41 100644 --- a/plugins/notification/build.rs +++ b/plugins/notification/build.rs @@ -1,11 +1,4 @@ -const COMMANDS: &[&str] = &[ - "list_applications", - "show_notification", - "start_detect_notification", - "stop_detect_notification", - "start_event_notification", - "stop_event_notification", -]; +const COMMANDS: &[&str] = &["show_notification", "clear_notifications"]; fn main() { tauri_plugin::Builder::new(COMMANDS).build(); diff --git a/plugins/notification/js/bindings.gen.ts b/plugins/notification/js/bindings.gen.ts index b99678bfb0..574a5c8f43 100644 --- a/plugins/notification/js/bindings.gen.ts +++ b/plugins/notification/js/bindings.gen.ts @@ -7,9 +7,6 @@ export const commands = { -async listApplications() : Promise { - return await TAURI_INVOKE("plugin:notification|list_applications"); -}, async showNotification(v: Notification) : Promise> { try { return { status: "ok", data: await TAURI_INVOKE("plugin:notification|show_notification", { v }) }; @@ -18,33 +15,9 @@ async showNotification(v: Notification) : Promise> { else return { status: "error", error: e as any }; } }, -async startDetectNotification(params: DetectNotificationParams) : Promise> { - try { - return { status: "ok", data: await TAURI_INVOKE("plugin:notification|start_detect_notification", { params }) }; -} catch (e) { - if(e instanceof Error) throw e; - else return { status: "error", error: e as any }; -} -}, -async stopDetectNotification() : Promise> { - try { - return { status: "ok", data: await TAURI_INVOKE("plugin:notification|stop_detect_notification") }; -} catch (e) { - if(e instanceof Error) throw e; - else return { status: "error", error: e as any }; -} -}, -async startEventNotification(params: EventNotificationParams) : Promise> { - try { - return { status: "ok", data: await TAURI_INVOKE("plugin:notification|start_event_notification", { params }) }; -} catch (e) { - if(e instanceof Error) throw e; - else return { status: "error", error: e as any }; -} -}, -async stopEventNotification() : Promise> { +async clearNotifications() : Promise> { try { - return { status: "ok", data: await TAURI_INVOKE("plugin:notification|stop_event_notification") }; + return { status: "ok", data: await TAURI_INVOKE("plugin:notification|clear_notifications") }; } catch (e) { if(e instanceof Error) throw e; else return { status: "error", error: e as any }; @@ -62,10 +35,7 @@ async stopEventNotification() : Promise> { /** user-defined types **/ -export type DetectNotificationParams = { respect_do_not_disturb: boolean; ignored_platforms: string[] } export type Duration = { secs: number; nanos: number } -export type EventNotificationParams = { respect_do_not_disturb: boolean } -export type InstalledApp = { id: string; name: string } export type Notification = { key: string | null; title: string; message: string; url: string | null; timeout: Duration | null } /** tauri-specta globals **/ diff --git a/plugins/notification/permissions/autogenerated/commands/clear_notifications.toml b/plugins/notification/permissions/autogenerated/commands/clear_notifications.toml new file mode 100644 index 0000000000..098823fb4e --- /dev/null +++ b/plugins/notification/permissions/autogenerated/commands/clear_notifications.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-clear-notifications" +description = "Enables the clear_notifications command without any pre-configured scope." +commands.allow = ["clear_notifications"] + +[[permission]] +identifier = "deny-clear-notifications" +description = "Denies the clear_notifications command without any pre-configured scope." +commands.deny = ["clear_notifications"] diff --git a/plugins/notification/permissions/autogenerated/commands/list_applications.toml b/plugins/notification/permissions/autogenerated/commands/list_applications.toml deleted file mode 100644 index ff235c4922..0000000000 --- a/plugins/notification/permissions/autogenerated/commands/list_applications.toml +++ /dev/null @@ -1,13 +0,0 @@ -# Automatically generated - DO NOT EDIT! - -"$schema" = "../../schemas/schema.json" - -[[permission]] -identifier = "allow-list-applications" -description = "Enables the list_applications command without any pre-configured scope." -commands.allow = ["list_applications"] - -[[permission]] -identifier = "deny-list-applications" -description = "Denies the list_applications command without any pre-configured scope." -commands.deny = ["list_applications"] diff --git a/plugins/notification/permissions/autogenerated/commands/start_detect_notification.toml b/plugins/notification/permissions/autogenerated/commands/start_detect_notification.toml deleted file mode 100644 index baf519300b..0000000000 --- a/plugins/notification/permissions/autogenerated/commands/start_detect_notification.toml +++ /dev/null @@ -1,13 +0,0 @@ -# Automatically generated - DO NOT EDIT! - -"$schema" = "../../schemas/schema.json" - -[[permission]] -identifier = "allow-start-detect-notification" -description = "Enables the start_detect_notification command without any pre-configured scope." -commands.allow = ["start_detect_notification"] - -[[permission]] -identifier = "deny-start-detect-notification" -description = "Denies the start_detect_notification command without any pre-configured scope." -commands.deny = ["start_detect_notification"] diff --git a/plugins/notification/permissions/autogenerated/commands/start_event_notification.toml b/plugins/notification/permissions/autogenerated/commands/start_event_notification.toml deleted file mode 100644 index 5516b36931..0000000000 --- a/plugins/notification/permissions/autogenerated/commands/start_event_notification.toml +++ /dev/null @@ -1,13 +0,0 @@ -# Automatically generated - DO NOT EDIT! - -"$schema" = "../../schemas/schema.json" - -[[permission]] -identifier = "allow-start-event-notification" -description = "Enables the start_event_notification command without any pre-configured scope." -commands.allow = ["start_event_notification"] - -[[permission]] -identifier = "deny-start-event-notification" -description = "Denies the start_event_notification command without any pre-configured scope." -commands.deny = ["start_event_notification"] diff --git a/plugins/notification/permissions/autogenerated/commands/stop_detect_notification.toml b/plugins/notification/permissions/autogenerated/commands/stop_detect_notification.toml deleted file mode 100644 index dbc12944f9..0000000000 --- a/plugins/notification/permissions/autogenerated/commands/stop_detect_notification.toml +++ /dev/null @@ -1,13 +0,0 @@ -# Automatically generated - DO NOT EDIT! - -"$schema" = "../../schemas/schema.json" - -[[permission]] -identifier = "allow-stop-detect-notification" -description = "Enables the stop_detect_notification command without any pre-configured scope." -commands.allow = ["stop_detect_notification"] - -[[permission]] -identifier = "deny-stop-detect-notification" -description = "Denies the stop_detect_notification command without any pre-configured scope." -commands.deny = ["stop_detect_notification"] diff --git a/plugins/notification/permissions/autogenerated/commands/stop_event_notification.toml b/plugins/notification/permissions/autogenerated/commands/stop_event_notification.toml deleted file mode 100644 index 4001cff472..0000000000 --- a/plugins/notification/permissions/autogenerated/commands/stop_event_notification.toml +++ /dev/null @@ -1,13 +0,0 @@ -# Automatically generated - DO NOT EDIT! - -"$schema" = "../../schemas/schema.json" - -[[permission]] -identifier = "allow-stop-event-notification" -description = "Enables the stop_event_notification command without any pre-configured scope." -commands.allow = ["stop_event_notification"] - -[[permission]] -identifier = "deny-stop-event-notification" -description = "Denies the stop_event_notification command without any pre-configured scope." -commands.deny = ["stop_event_notification"] diff --git a/plugins/notification/permissions/autogenerated/reference.md b/plugins/notification/permissions/autogenerated/reference.md index 86f347d29d..2e14eba3c4 100644 --- a/plugins/notification/permissions/autogenerated/reference.md +++ b/plugins/notification/permissions/autogenerated/reference.md @@ -4,12 +4,8 @@ Default permissions for the plugin #### This default permission set includes the following: -- `allow-list-applications` - `allow-show-notification` -- `allow-start-detect-notification` -- `allow-stop-detect-notification` -- `allow-start-event-notification` -- `allow-stop-event-notification` +- `allow-clear-notifications` ## Permission Table @@ -23,12 +19,12 @@ Default permissions for the plugin -`notification:allow-list-applications` +`notification:allow-clear-notifications` -Enables the list_applications command without any pre-configured scope. +Enables the clear_notifications command without any pre-configured scope. @@ -36,12 +32,12 @@ Enables the list_applications command without any pre-configured scope. -`notification:deny-list-applications` +`notification:deny-clear-notifications` -Denies the list_applications command without any pre-configured scope. +Denies the clear_notifications command without any pre-configured scope. @@ -69,110 +65,6 @@ Enables the show_notification command without any pre-configured scope. Denies the show_notification command without any pre-configured scope. - - - - - - -`notification:allow-start-detect-notification` - - - - -Enables the start_detect_notification command without any pre-configured scope. - - - - - - - -`notification:deny-start-detect-notification` - - - - -Denies the start_detect_notification command without any pre-configured scope. - - - - - - - -`notification:allow-start-event-notification` - - - - -Enables the start_event_notification command without any pre-configured scope. - - - - - - - -`notification:deny-start-event-notification` - - - - -Denies the start_event_notification command without any pre-configured scope. - - - - - - - -`notification:allow-stop-detect-notification` - - - - -Enables the stop_detect_notification command without any pre-configured scope. - - - - - - - -`notification:deny-stop-detect-notification` - - - - -Denies the stop_detect_notification command without any pre-configured scope. - - - - - - - -`notification:allow-stop-event-notification` - - - - -Enables the stop_event_notification command without any pre-configured scope. - - - - - - - -`notification:deny-stop-event-notification` - - - - -Denies the stop_event_notification command without any pre-configured scope. - diff --git a/plugins/notification/permissions/default.toml b/plugins/notification/permissions/default.toml index b47f595a29..b56a19825b 100644 --- a/plugins/notification/permissions/default.toml +++ b/plugins/notification/permissions/default.toml @@ -1,10 +1,6 @@ [default] description = "Default permissions for the plugin" permissions = [ - "allow-list-applications", "allow-show-notification", - "allow-start-detect-notification", - "allow-stop-detect-notification", - "allow-start-event-notification", - "allow-stop-event-notification" + "allow-clear-notifications", ] diff --git a/plugins/notification/permissions/schemas/schema.json b/plugins/notification/permissions/schemas/schema.json index d2e5cb2710..224df41ca9 100644 --- a/plugins/notification/permissions/schemas/schema.json +++ b/plugins/notification/permissions/schemas/schema.json @@ -295,16 +295,16 @@ "type": "string", "oneOf": [ { - "description": "Enables the list_applications command without any pre-configured scope.", + "description": "Enables the clear_notifications command without any pre-configured scope.", "type": "string", - "const": "allow-list-applications", - "markdownDescription": "Enables the list_applications command without any pre-configured scope." + "const": "allow-clear-notifications", + "markdownDescription": "Enables the clear_notifications command without any pre-configured scope." }, { - "description": "Denies the list_applications command without any pre-configured scope.", + "description": "Denies the clear_notifications command without any pre-configured scope.", "type": "string", - "const": "deny-list-applications", - "markdownDescription": "Denies the list_applications command without any pre-configured scope." + "const": "deny-clear-notifications", + "markdownDescription": "Denies the clear_notifications command without any pre-configured scope." }, { "description": "Enables the show_notification command without any pre-configured scope.", @@ -319,58 +319,10 @@ "markdownDescription": "Denies the show_notification command without any pre-configured scope." }, { - "description": "Enables the start_detect_notification command without any pre-configured scope.", - "type": "string", - "const": "allow-start-detect-notification", - "markdownDescription": "Enables the start_detect_notification command without any pre-configured scope." - }, - { - "description": "Denies the start_detect_notification command without any pre-configured scope.", - "type": "string", - "const": "deny-start-detect-notification", - "markdownDescription": "Denies the start_detect_notification command without any pre-configured scope." - }, - { - "description": "Enables the start_event_notification command without any pre-configured scope.", - "type": "string", - "const": "allow-start-event-notification", - "markdownDescription": "Enables the start_event_notification command without any pre-configured scope." - }, - { - "description": "Denies the start_event_notification command without any pre-configured scope.", - "type": "string", - "const": "deny-start-event-notification", - "markdownDescription": "Denies the start_event_notification command without any pre-configured scope." - }, - { - "description": "Enables the stop_detect_notification command without any pre-configured scope.", - "type": "string", - "const": "allow-stop-detect-notification", - "markdownDescription": "Enables the stop_detect_notification command without any pre-configured scope." - }, - { - "description": "Denies the stop_detect_notification command without any pre-configured scope.", - "type": "string", - "const": "deny-stop-detect-notification", - "markdownDescription": "Denies the stop_detect_notification command without any pre-configured scope." - }, - { - "description": "Enables the stop_event_notification command without any pre-configured scope.", - "type": "string", - "const": "allow-stop-event-notification", - "markdownDescription": "Enables the stop_event_notification command without any pre-configured scope." - }, - { - "description": "Denies the stop_event_notification command without any pre-configured scope.", - "type": "string", - "const": "deny-stop-event-notification", - "markdownDescription": "Denies the stop_event_notification command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-list-applications`\n- `allow-show-notification`\n- `allow-start-detect-notification`\n- `allow-stop-detect-notification`\n- `allow-start-event-notification`\n- `allow-stop-event-notification`", + "description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-show-notification`\n- `allow-clear-notifications`", "type": "string", "const": "default", - "markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-list-applications`\n- `allow-show-notification`\n- `allow-start-detect-notification`\n- `allow-stop-detect-notification`\n- `allow-start-event-notification`\n- `allow-stop-event-notification`" + "markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-show-notification`\n- `allow-clear-notifications`" } ] } diff --git a/plugins/notification/src/commands.rs b/plugins/notification/src/commands.rs index 2ae27c7311..275d944c6a 100644 --- a/plugins/notification/src/commands.rs +++ b/plugins/notification/src/commands.rs @@ -1,24 +1,5 @@ use crate::NotificationPluginExt; -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, specta::Type)] -pub struct DetectNotificationParams { - pub respect_do_not_disturb: bool, - pub ignored_platforms: Vec, -} - -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, specta::Type)] -pub struct EventNotificationParams { - pub respect_do_not_disturb: bool, -} - -#[tauri::command] -#[specta::specta] -pub(crate) async fn list_applications( - app: tauri::AppHandle, -) -> Vec { - app.list_applications() -} - #[tauri::command] #[specta::specta] pub(crate) async fn show_notification( @@ -30,37 +11,8 @@ pub(crate) async fn show_notification( #[tauri::command] #[specta::specta] -pub(crate) async fn start_detect_notification( - app: tauri::AppHandle, - params: DetectNotificationParams, -) -> Result<(), String> { - app.start_detect_notification(params) - .map_err(|e| e.to_string()) -} - -#[tauri::command] -#[specta::specta] -pub(crate) async fn stop_detect_notification( - app: tauri::AppHandle, -) -> Result<(), String> { - app.stop_detect_notification().map_err(|e| e.to_string()) -} - -#[tauri::command] -#[specta::specta] -pub(crate) async fn start_event_notification( - app: tauri::AppHandle, - params: EventNotificationParams, -) -> Result<(), String> { - app.start_event_notification(params) - .await - .map_err(|e| e.to_string()) -} - -#[tauri::command] -#[specta::specta] -pub(crate) async fn stop_event_notification( +pub(crate) async fn clear_notifications( app: tauri::AppHandle, ) -> Result<(), String> { - app.stop_event_notification().map_err(|e| e.to_string()) + app.clear_notifications().map_err(|e| e.to_string()) } diff --git a/plugins/notification/src/detect.rs b/plugins/notification/src/detect.rs deleted file mode 100644 index 89b5d09393..0000000000 --- a/plugins/notification/src/detect.rs +++ /dev/null @@ -1,59 +0,0 @@ -use crate::{ - handler::{NotificationHandler, NotificationTrigger, NotificationTriggerDetect}, - Error, -}; - -pub struct DetectState { - detector: Option, - notification_tx: Option>, -} - -impl DetectState { - pub fn new(notification_handler: &NotificationHandler) -> Self { - Self { - detector: None, - notification_tx: notification_handler.sender(), - } - } - - pub fn start(&mut self) -> Result<(), Error> { - self.stop()?; - - { - let notification_tx = self.notification_tx.as_ref().unwrap().clone(); - let mut detector = hypr_detect::Detector::default(); - - detector.start(hypr_detect::new_callback(move |event| { - if let Err(e) = - notification_tx.send(NotificationTrigger::Detect(NotificationTriggerDetect { - event, - timestamp: std::time::SystemTime::now(), - })) - { - tracing::error!("{}", e); - } - })); - self.detector = Some(detector); - } - - Ok(()) - } - - pub fn stop(&mut self) -> Result<(), Error> { - if let Some(mut detector) = self.detector.take() { - detector.stop(); - } - - Ok(()) - } - - pub fn _is_running(&self) -> bool { - self.detector.is_some() - } -} - -impl Drop for DetectState { - fn drop(&mut self) { - let _ = self.stop(); - } -} diff --git a/plugins/notification/src/error.rs b/plugins/notification/src/error.rs index 886651fa7b..b01547df08 100644 --- a/plugins/notification/src/error.rs +++ b/plugins/notification/src/error.rs @@ -1,16 +1,7 @@ use serde::{ser::Serializer, Serialize}; #[derive(Debug, thiserror::Error)] -pub enum Error { - #[error(transparent)] - Io(#[from] std::io::Error), - #[error(transparent)] - Db(#[from] hypr_db_user::Error), - #[error("Channel closed unexpectedly")] - ChannelClosed, - #[error("Timeout waiting for notification permission response")] - PermissionTimeout, -} +pub enum Error {} impl Serialize for Error { fn serialize(&self, serializer: S) -> std::result::Result diff --git a/plugins/notification/src/event.rs b/plugins/notification/src/event.rs deleted file mode 100644 index bf88f4d135..0000000000 --- a/plugins/notification/src/event.rs +++ /dev/null @@ -1,83 +0,0 @@ -use apalis::prelude::{Data, Error, WorkerBuilder, WorkerFactoryFn}; -use chrono::{DateTime, Duration, Utc}; -use hypr_db_user::{ListEventFilter, ListEventFilterCommon, ListEventFilterSpecific}; - -use crate::handler::{NotificationTrigger, NotificationTriggerEvent}; - -#[allow(unused)] -#[derive(Default, Debug, Clone)] -pub struct Job(DateTime); - -#[derive(Clone)] -pub struct WorkerState { - pub db: hypr_db_user::UserDatabase, - pub user_id: String, - pub notification_tx: std::sync::mpsc::Sender, -} - -impl From> for Job { - fn from(t: DateTime) -> Self { - Job(t) - } -} - -const EVENT_NOTIFICATION_WORKER_NAKE: &str = "event_notification_worker"; - -#[tracing::instrument(skip(ctx), name = EVENT_NOTIFICATION_WORKER_NAKE)] -pub async fn perform_event_notification(_job: Job, ctx: Data) -> Result<(), Error> { - tracing::info!("Event notification worker executing - checking for events in next 5 minutes"); - let latest_event = ctx - .db - .list_events(Some(ListEventFilter { - common: ListEventFilterCommon { - user_id: ctx.user_id.clone(), - limit: Some(1), - }, - specific: ListEventFilterSpecific::DateRange { - start: Utc::now(), - end: Utc::now() + Duration::minutes(5), - }, - })) - .await - .map_err(|e| crate::Error::Db(e).as_worker_error())?; - - if let Some(event) = latest_event.first() { - tracing::info!("found_upcoming_event: {}", event.name); - - let seconds_until_start = event - .start_date - .signed_duration_since(Utc::now()) - .num_seconds(); - - if let Err(e) = - ctx.notification_tx - .send(NotificationTrigger::Event(NotificationTriggerEvent { - event_id: event.id.clone(), - event_name: event.name.clone(), - seconds_until_start, - })) - { - tracing::error!("{}", e); - } - } - - Ok(()) -} - -pub async fn monitor(state: WorkerState) -> Result<(), std::io::Error> { - use std::str::FromStr; - - apalis::prelude::Monitor::new() - .register({ - WorkerBuilder::new(EVENT_NOTIFICATION_WORKER_NAKE) - .data(state.clone()) - .backend(apalis_cron::CronStream::new( - apalis_cron::Schedule::from_str("0 * * * * *").unwrap(), - )) - .build_fn(perform_event_notification) - }) - .run() - .await?; - - Ok(()) -} diff --git a/plugins/notification/src/ext.rs b/plugins/notification/src/ext.rs index 6863bbe590..73ba35aa09 100644 --- a/plugins/notification/src/ext.rs +++ b/plugins/notification/src/ext.rs @@ -1,37 +1,11 @@ -use std::future::Future; - use crate::error::Error; pub trait NotificationPluginExt { - fn list_applications(&self) -> Vec; - fn clear_notifications(&self) -> Result<(), Error>; fn show_notification(&self, v: hypr_notification::Notification) -> Result<(), Error>; - - fn start_event_notification( - &self, - params: crate::commands::EventNotificationParams, - ) -> impl Future>; - fn stop_event_notification(&self) -> Result<(), Error>; - - fn start_detect_notification( - &self, - params: crate::commands::DetectNotificationParams, - ) -> Result<(), Error>; - fn stop_detect_notification(&self) -> Result<(), Error>; - - fn start_notification_analytics(&self, user_id: String) -> Result<(), Error>; - fn stop_notification_analytics(&self) -> Result<(), Error>; + fn clear_notifications(&self) -> Result<(), Error>; } impl> NotificationPluginExt for T { - fn list_applications(&self) -> Vec { - #[cfg(target_os = "macos")] - return hypr_detect::list_installed_apps(); - - #[cfg(not(target_os = "macos"))] - return Vec::new(); - } - #[tracing::instrument(skip(self))] fn show_notification(&self, v: hypr_notification::Notification) -> Result<(), Error> { hypr_notification::show(&v); @@ -43,147 +17,4 @@ impl> NotificationPluginExt for T { hypr_notification::clear(); Ok(()) } - - #[tracing::instrument(skip(self))] - async fn start_event_notification( - &self, - params: crate::commands::EventNotificationParams, - ) -> Result<(), Error> { - let db_state = self.state::(); - let (db, user_id) = { - let guard = db_state.lock().await; - ( - guard.db.clone().expect("db"), - guard.user_id.clone().expect("user_id"), - ) - }; - - { - let state = self.state::(); - let mut s = state.lock().unwrap(); - - { - let mut config = s.config.write().unwrap(); - config.respect_do_not_disturb = params.respect_do_not_disturb; - } - - let notification_tx = s.notification_handler.sender().unwrap(); - - if let Some(h) = s.worker_handle.take() { - h.abort(); - } - s.worker_handle = Some(tokio::runtime::Handle::current().spawn(async move { - let _ = crate::event::monitor(crate::event::WorkerState { - db, - user_id, - notification_tx, - }) - .await; - })); - } - - Ok(()) - } - - #[tracing::instrument(skip(self))] - fn stop_event_notification(&self) -> Result<(), Error> { - let state = self.state::(); - let mut guard = state.lock().unwrap(); - - if let Some(handle) = guard.worker_handle.take() { - handle.abort(); - } - - Ok(()) - } - - #[tracing::instrument(skip(self))] - fn start_detect_notification( - &self, - params: crate::commands::DetectNotificationParams, - ) -> Result<(), Error> { - let state = self.state::(); - let mut guard = state.lock().unwrap(); - - { - let mut config = guard.config.write().unwrap(); - config.respect_do_not_disturb = params.respect_do_not_disturb; - config.ignored_platforms = params.ignored_platforms; - } - - guard.detect_state.start() - } - - #[tracing::instrument(skip(self))] - fn stop_detect_notification(&self) -> Result<(), Error> { - let state = self.state::(); - let mut guard = state.lock().unwrap(); - - guard.detect_state.stop() - } - - fn start_notification_analytics(&self, user_id: String) -> Result<(), Error> { - use hypr_notification::NotificationMutation; - use tauri_plugin_analytics::{AnalyticsPayload, AnalyticsPluginExt}; - - let (tx, mut rx) = tokio::sync::mpsc::unbounded_channel::(); - let app_handle = self.app_handle().clone(); - - let confirm_tx = tx.clone(); - hypr_notification::setup_notification_confirm_handler(move |_id| { - let _ = confirm_tx.send(NotificationMutation::Confirm); - }); - - let dismiss_tx = tx.clone(); - hypr_notification::setup_notification_dismiss_handler(move |_id| { - let _ = dismiss_tx.send(NotificationMutation::Dismiss); - }); - - let analytics_task = tokio::spawn(async move { - while let Some(event) = rx.recv().await { - match event { - NotificationMutation::Confirm => { - let _ = app_handle - .event( - AnalyticsPayload::for_user(&user_id) - .event("notification_confirm") - .build(), - ) - .await; - } - NotificationMutation::Dismiss => { - let _ = app_handle - .event( - AnalyticsPayload::for_user(&user_id) - .event("notification_dismiss") - .build(), - ) - .await; - } - } - } - }); - - let state = self.state::(); - let mut guard = state.lock().unwrap(); - - if let Some(h) = guard.analytics_task.take() { - h.abort(); - } - guard.analytics_task = Some(analytics_task); - - Ok(()) - } - - #[tracing::instrument(skip(self))] - fn stop_notification_analytics(&self) -> Result<(), Error> { - let state = self.state::(); - let mut guard = state.lock().unwrap(); - - if let Some(h) = guard.analytics_task.take() { - h.abort(); - } - - Ok(()) - } } diff --git a/plugins/notification/src/handler.rs b/plugins/notification/src/handler.rs deleted file mode 100644 index f1a67a5dda..0000000000 --- a/plugins/notification/src/handler.rs +++ /dev/null @@ -1,222 +0,0 @@ -use std::sync::mpsc::{Receiver, Sender}; -use std::sync::{Arc, RwLock}; -use std::thread::JoinHandle; - -use tauri::AppHandle; -use tauri_plugin_windows::{AppWindow, WindowsPluginExt}; - -use crate::NotificationConfig; - -#[derive(Debug, Clone)] -pub enum NotificationTrigger { - Detect(NotificationTriggerDetect), - Event(NotificationTriggerEvent), -} - -#[derive(Debug, Clone)] -pub struct NotificationTriggerDetect { - pub event: hypr_detect::DetectEvent, - pub timestamp: std::time::SystemTime, -} - -#[derive(Debug, Clone)] -pub struct NotificationTriggerEvent { - pub event_id: String, - pub event_name: String, - pub seconds_until_start: i64, -} - -pub struct NotificationHandler { - tx: Option>, - handle: Option>, - config: Arc>, -} - -impl NotificationHandler { - pub fn new(app_handle: AppHandle, config: Arc>) -> Self { - let (tx, rx) = std::sync::mpsc::channel::(); - let config_clone = config.clone(); - - let handle = std::thread::spawn(move || { - Self::worker_loop(rx, app_handle, config_clone); - }); - - Self { - tx: Some(tx), - handle: Some(handle), - config, - } - } - - pub fn sender(&self) -> Option> { - self.tx.clone() - } - - fn worker_loop( - rx: Receiver, - app_handle: AppHandle, - config: Arc>, - ) { - while let Ok(trigger) = rx.recv() { - match trigger { - NotificationTrigger::Detect(t) => { - Self::handle_detect_event(&app_handle, t, &config); - } - NotificationTrigger::Event(e) => { - Self::handle_calendar_event(&app_handle, e, &config); - } - } - } - } - - fn handle_detect_event( - app_handle: &AppHandle, - trigger: NotificationTriggerDetect, - config: &Arc>, - ) { - let main_window_focused = app_handle - .window_is_focused(AppWindow::Main) - .unwrap_or(false); - - let respect_do_not_disturb = config.read().unwrap().respect_do_not_disturb; - - if main_window_focused { - tracing::info!(reason = "main_window_focused", "skip_handle_detect_event"); - return; - } - - match trigger.event { - hypr_detect::DetectEvent::MicStarted(apps) => { - if apps.is_empty() { - tracing::info!(reason = "apps.is_empty", "skip_notification"); - return; - } - - if apps.iter().any(|app| { - vec![ - "com.electron.wispr-flow", - "com.seewillow.WillowMac", - "com.superduper.superwhisper", - "dev.warp.Warp-Stable", - "so.cap.desktop", - "com.timpler.screenstudio", - "com.loom.desktop", - "com.obsproject.obs-studio", - "com.prakashjoshipax.VoiceInk", - "com.goodsnooze.macwhisper", - "com.descript.beachcube", - "com.openai.chat", - "com.anthropic.claudefordesktop", - "com.raycast.macos", - "com.apple.VoiceMemos", - "com.exafunction.windsurf", - "dev.zed.Zed", - "com.microsoft.VSCode", - "com.todesktop.230313mzl4w4u92", - "com.apple.garageband10", - ] - .contains(&app.id.as_str()) - }) { - tracing::info!(reason = "ignore_platforms_default", "skip_notification"); - return; - } - - if apps - .iter() - .any(|app| config.read().unwrap().ignored_platforms.contains(&app.name)) - { - tracing::info!(reason = "ignore_platforms_user", "skip_notification"); - return; - } - - if respect_do_not_disturb && hypr_notification::is_do_not_disturb() { - tracing::info!(reason = "respect_do_not_disturb", "skip_notification"); - return; - } - - let timestamp_secs = trigger - .timestamp - .duration_since(std::time::UNIX_EPOCH) - .unwrap_or(std::time::Duration::from_secs(0)) - .as_secs(); - let window_key = timestamp_secs / 10; - let key = format!("mic-detection-{}", window_key); - - hypr_notification::show( - &hypr_notification::Notification::builder() - .title("Meeting detected") - .key(key) - .message("Based on your microphone activity") - .url("hypr://hyprnote.com/app/new?record=true") - .timeout(std::time::Duration::from_secs(5)) - .build(), - ); - } - hypr_detect::DetectEvent::MicStopped => { - use tauri_plugin_listener::ListenerPluginExt; - - let app_handle = app_handle.clone(); - tauri::async_runtime::spawn(async move { - app_handle.stop_session().await; - }); - } - } - } - - fn handle_calendar_event( - app_handle: &AppHandle, - trigger: NotificationTriggerEvent, - config: &Arc>, - ) { - let main_window_focused = app_handle - .window_is_focused(AppWindow::Main) - .unwrap_or(false); - - let respect_do_not_disturb = config.read().unwrap().respect_do_not_disturb; - - if main_window_focused { - tracing::info!(reason = "main_window_focused", "handle_calendar_event"); - return; - } - - if respect_do_not_disturb && hypr_notification::is_do_not_disturb() { - tracing::info!(reason = "respect_do_not_disturb", "skip_notification"); - return; - } - - if trigger.seconds_until_start < 180 { - if let Err(e) = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { - hypr_notification::show( - &hypr_notification::Notification::builder() - .key(&format!("event_{}", trigger.event_id,)) - .title(trigger.event_name.clone()) - .message("Meeting starting soon!") - .url(format!( - "hypr://hyprnote.com/app/new?calendarEventId={}&record=true", - trigger.event_id - )) - .timeout(std::time::Duration::from_secs( - trigger.seconds_until_start as u64, - )) - .build(), - ); - })) { - tracing::error!("{:?}", e); - } - } - } - - pub fn stop(&mut self) { - self.tx = None; - - if let Some(handle) = self.handle.take() { - let _ = handle.join(); - } - } -} - -impl Drop for NotificationHandler { - fn drop(&mut self) { - self.stop(); - } -} diff --git a/plugins/notification/src/lib.rs b/plugins/notification/src/lib.rs index bfff0791f7..2569006fdf 100644 --- a/plugins/notification/src/lib.rs +++ b/plugins/notification/src/lib.rs @@ -1,67 +1,21 @@ use std::str::FromStr; -use std::sync::{Arc, Mutex, RwLock}; -use tauri::Manager; mod commands; -mod detect; mod error; -mod event; mod ext; -mod handler; -mod quit; pub use error::*; pub use ext::*; -pub use quit::*; const PLUGIN_NAME: &str = "notification"; -pub type SharedState = Mutex; - -#[derive(Debug, Clone, Default)] -pub struct NotificationConfig { - pub respect_do_not_disturb: bool, - pub ignored_platforms: Vec, -} - -pub struct State { - worker_handle: Option>, - detect_state: detect::DetectState, - notification_handler: handler::NotificationHandler, - analytics_task: Option>, - config: Arc>, -} - -impl State { - pub fn new(app_handle: tauri::AppHandle) -> Self { - let config = Arc::new(RwLock::new(NotificationConfig::default())); - let notification_handler = - handler::NotificationHandler::new(app_handle.clone(), config.clone()); - let detect_state = detect::DetectState::new(¬ification_handler); - - Self { - worker_handle: None, - detect_state, - notification_handler, - analytics_task: None, - config, - } - } -} - fn make_specta_builder() -> tauri_specta::Builder { tauri_specta::Builder::::new() .plugin_name(PLUGIN_NAME) .commands(tauri_specta::collect_commands![ - commands::list_applications::, commands::show_notification::, - commands::start_detect_notification::, - commands::stop_detect_notification::, - commands::start_event_notification::, - commands::stop_event_notification::, + commands::clear_notifications::, ]) - .typ::() - .typ::() .error_handling(tauri_specta::ErrorHandlingMode::Result) } @@ -70,11 +24,7 @@ pub fn init() -> tauri::plugin::TauriPlugin { tauri::plugin::Builder::new(PLUGIN_NAME) .invoke_handler(specta_builder.invoke_handler()) - .setup(|app, _api| { - let state = State::new(app.clone()); - app.manage(Mutex::new(state)); - Ok(()) - }) + .setup(|_app, _api| Ok(())) .on_event(|app, event| match event { tauri::RunEvent::MainEventsCleared => {} tauri::RunEvent::Ready => {} diff --git a/plugins/notification/src/quit.rs b/plugins/notification/src/quit.rs deleted file mode 100644 index 1dba04c7f9..0000000000 --- a/plugins/notification/src/quit.rs +++ /dev/null @@ -1,51 +0,0 @@ -use tauri::Manager; -use tauri_plugin_dialog::DialogExt; -use tauri_plugin_listener::ListenerPluginExt; - -#[cfg(target_os = "macos")] -pub fn create_quit_handler( - app_handle: tauri::AppHandle, -) -> impl Fn() -> bool { - move || { - let mut is_exit_intent = false; - - if let Some(shared_state) = app_handle.try_state::() { - if let Ok(guard) = shared_state.try_lock() { - let state = tokio::task::block_in_place(|| { - tokio::runtime::Handle::current().block_on(guard.get_state()) - }); - - if !matches!(state, tauri_plugin_listener::fsm::State::RunningActive) { - is_exit_intent = true; - } else { - is_exit_intent = app_handle - .dialog() - .message("Hyprnote is currently recording.") - .title("Do you really want to quit?") - .buttons(tauri_plugin_dialog::MessageDialogButtons::OkCancelCustom( - "Quit".to_string(), - "Cancel".to_string(), - )) - .kind(tauri_plugin_dialog::MessageDialogKind::Info) - .blocking_show() - } - } - } - - if is_exit_intent { - for (_, window) in app_handle.webview_windows() { - let _ = window.close(); - } - - let _ = app_handle.set_activation_policy(tauri::ActivationPolicy::Accessory); - hypr_host::kill_processes_by_matcher(hypr_host::ProcessMatcher::Sidecar); - - let app_handle_clone = app_handle.clone(); - tokio::spawn(async move { - let _ = app_handle_clone.stop_session().await; - }); - } - - false - } -} diff --git a/plugins/permissions/.gitignore b/plugins/permissions/.gitignore new file mode 100644 index 0000000000..50d8e32e89 --- /dev/null +++ b/plugins/permissions/.gitignore @@ -0,0 +1,17 @@ +/.vs +.DS_Store +.Thumbs.db +*.sublime* +.idea/ +debug.log +package-lock.json +.vscode/settings.json +yarn.lock + +/.tauri +/target +Cargo.lock +node_modules/ + +dist-js +dist diff --git a/plugins/permissions/Cargo.toml b/plugins/permissions/Cargo.toml new file mode 100644 index 0000000000..ffae6dbb17 --- /dev/null +++ b/plugins/permissions/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "tauri-plugin-permissions" +version = "0.1.0" +authors = [ "You" ] +description = "" +edition = "2021" +rust-version = "1.77.2" +exclude = ["/examples", "/dist-js", "/guest-js", "/node_modules"] +links = "tauri-plugin-permissions" + +[build-dependencies] +tauri-plugin = { workspace = true, features = ["build"] } + +[dev-dependencies] +specta-typescript = { workspace = true } + +[dependencies] +hypr-audio = { workspace = true } +hypr-tcc = { workspace = true } + +tauri = { workspace = true, features = ["specta", "test"] } +tauri-plugin-shell = { workspace = true } + +specta = { workspace = true } +tauri-specta = { workspace = true, features = ["derive", "typescript"] } + +serde = { workspace = true } +thiserror = { workspace = true } +futures-util = { workspace = true } + +[target."cfg(target_os = \"macos\")".dependencies] +block2 = { workspace = true } +objc2-av-foundation = { workspace = true } +macos-accessibility-client = "0.0.1" diff --git a/plugins/permissions/build.rs b/plugins/permissions/build.rs new file mode 100644 index 0000000000..2e08e7298c --- /dev/null +++ b/plugins/permissions/build.rs @@ -0,0 +1,12 @@ +const COMMANDS: &[&str] = &[ + "check_microphone_permission", + "request_microphone_permission", + "check_system_audio_permission", + "request_system_audio_permission", + "check_accessibility_permission", + "request_accessibility_permission", +]; + +fn main() { + tauri_plugin::Builder::new(COMMANDS).build(); +} diff --git a/plugins/permissions/js/bindings.gen.ts b/plugins/permissions/js/bindings.gen.ts new file mode 100644 index 0000000000..c7b8b90c7e --- /dev/null +++ b/plugins/permissions/js/bindings.gen.ts @@ -0,0 +1,130 @@ +// @ts-nocheck + + +// This file was generated by [tauri-specta](https://github.com/oscartbeaumont/tauri-specta). Do not edit this file manually. + +/** user-defined commands **/ + + +export const commands = { +async checkMicrophonePermission() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:permissions|check_microphone_permission") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} +}, +async requestMicrophonePermission() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:permissions|request_microphone_permission") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} +}, +async checkSystemAudioPermission() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:permissions|check_system_audio_permission") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} +}, +async requestSystemAudioPermission() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:permissions|request_system_audio_permission") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} +}, +async checkAccessibilityPermission() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:permissions|check_accessibility_permission") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} +}, +async requestAccessibilityPermission() : Promise> { + try { + return { status: "ok", data: await TAURI_INVOKE("plugin:permissions|request_accessibility_permission") }; +} catch (e) { + if(e instanceof Error) throw e; + else return { status: "error", error: e as any }; +} +} +} + +/** user-defined events **/ + + + +/** user-defined constants **/ + + + +/** user-defined types **/ + +export type PermissionStatus = "neverRequested" | "denied" | "authorized" + +/** tauri-specta globals **/ + +import { + invoke as TAURI_INVOKE, + Channel as TAURI_CHANNEL, +} from "@tauri-apps/api/core"; +import * as TAURI_API_EVENT from "@tauri-apps/api/event"; +import { type WebviewWindow as __WebviewWindow__ } from "@tauri-apps/api/webviewWindow"; + +type __EventObj__ = { + listen: ( + cb: TAURI_API_EVENT.EventCallback, + ) => ReturnType>; + once: ( + cb: TAURI_API_EVENT.EventCallback, + ) => ReturnType>; + emit: null extends T + ? (payload?: T) => ReturnType + : (payload: T) => ReturnType; +}; + +export type Result = + | { status: "ok"; data: T } + | { status: "error"; error: E }; + +function __makeEvents__>( + mappings: Record, +) { + return new Proxy( + {} as unknown as { + [K in keyof T]: __EventObj__ & { + (handle: __WebviewWindow__): __EventObj__; + }; + }, + { + get: (_, event) => { + const name = mappings[event as keyof T]; + + return new Proxy((() => {}) as any, { + apply: (_, __, [window]: [__WebviewWindow__]) => ({ + listen: (arg: any) => window.listen(name, arg), + once: (arg: any) => window.once(name, arg), + emit: (arg: any) => window.emit(name, arg), + }), + get: (_, command: keyof __EventObj__) => { + switch (command) { + case "listen": + return (arg: any) => TAURI_API_EVENT.listen(name, arg); + case "once": + return (arg: any) => TAURI_API_EVENT.once(name, arg); + case "emit": + return (arg: any) => TAURI_API_EVENT.emit(name, arg); + } + }, + }); + }, + }, + ); +} diff --git a/plugins/permissions/js/index.ts b/plugins/permissions/js/index.ts new file mode 100644 index 0000000000..c1e919e037 --- /dev/null +++ b/plugins/permissions/js/index.ts @@ -0,0 +1 @@ +export * from './bindings.gen'; \ No newline at end of file diff --git a/plugins/permissions/package.json b/plugins/permissions/package.json new file mode 100644 index 0000000000..88e0e8d707 --- /dev/null +++ b/plugins/permissions/package.json @@ -0,0 +1,11 @@ +{ + "name": "@hypr/plugin-permissions", + "private": true, + "main": "./js/index.ts", + "scripts": { + "codegen": "cargo test -p tauri-plugin-permissions" + }, + "dependencies": { + "@tauri-apps/api": "^2.9.0" + } +} diff --git a/plugins/permissions/permissions/autogenerated/commands/check_accessibility_permission.toml b/plugins/permissions/permissions/autogenerated/commands/check_accessibility_permission.toml new file mode 100644 index 0000000000..0eea690fd5 --- /dev/null +++ b/plugins/permissions/permissions/autogenerated/commands/check_accessibility_permission.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-check-accessibility-permission" +description = "Enables the check_accessibility_permission command without any pre-configured scope." +commands.allow = ["check_accessibility_permission"] + +[[permission]] +identifier = "deny-check-accessibility-permission" +description = "Denies the check_accessibility_permission command without any pre-configured scope." +commands.deny = ["check_accessibility_permission"] diff --git a/plugins/permissions/permissions/autogenerated/commands/check_microphone_permission.toml b/plugins/permissions/permissions/autogenerated/commands/check_microphone_permission.toml new file mode 100644 index 0000000000..6c75a57f57 --- /dev/null +++ b/plugins/permissions/permissions/autogenerated/commands/check_microphone_permission.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-check-microphone-permission" +description = "Enables the check_microphone_permission command without any pre-configured scope." +commands.allow = ["check_microphone_permission"] + +[[permission]] +identifier = "deny-check-microphone-permission" +description = "Denies the check_microphone_permission command without any pre-configured scope." +commands.deny = ["check_microphone_permission"] diff --git a/plugins/permissions/permissions/autogenerated/commands/check_system_audio_permission.toml b/plugins/permissions/permissions/autogenerated/commands/check_system_audio_permission.toml new file mode 100644 index 0000000000..a0f4a9820d --- /dev/null +++ b/plugins/permissions/permissions/autogenerated/commands/check_system_audio_permission.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-check-system-audio-permission" +description = "Enables the check_system_audio_permission command without any pre-configured scope." +commands.allow = ["check_system_audio_permission"] + +[[permission]] +identifier = "deny-check-system-audio-permission" +description = "Denies the check_system_audio_permission command without any pre-configured scope." +commands.deny = ["check_system_audio_permission"] diff --git a/plugins/permissions/permissions/autogenerated/commands/request_accessibility_permission.toml b/plugins/permissions/permissions/autogenerated/commands/request_accessibility_permission.toml new file mode 100644 index 0000000000..d26437c4fa --- /dev/null +++ b/plugins/permissions/permissions/autogenerated/commands/request_accessibility_permission.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-request-accessibility-permission" +description = "Enables the request_accessibility_permission command without any pre-configured scope." +commands.allow = ["request_accessibility_permission"] + +[[permission]] +identifier = "deny-request-accessibility-permission" +description = "Denies the request_accessibility_permission command without any pre-configured scope." +commands.deny = ["request_accessibility_permission"] diff --git a/plugins/permissions/permissions/autogenerated/commands/request_microphone_permission.toml b/plugins/permissions/permissions/autogenerated/commands/request_microphone_permission.toml new file mode 100644 index 0000000000..b4770acb9b --- /dev/null +++ b/plugins/permissions/permissions/autogenerated/commands/request_microphone_permission.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-request-microphone-permission" +description = "Enables the request_microphone_permission command without any pre-configured scope." +commands.allow = ["request_microphone_permission"] + +[[permission]] +identifier = "deny-request-microphone-permission" +description = "Denies the request_microphone_permission command without any pre-configured scope." +commands.deny = ["request_microphone_permission"] diff --git a/plugins/permissions/permissions/autogenerated/commands/request_system_audio_permission.toml b/plugins/permissions/permissions/autogenerated/commands/request_system_audio_permission.toml new file mode 100644 index 0000000000..1ea16337fd --- /dev/null +++ b/plugins/permissions/permissions/autogenerated/commands/request_system_audio_permission.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-request-system-audio-permission" +description = "Enables the request_system_audio_permission command without any pre-configured scope." +commands.allow = ["request_system_audio_permission"] + +[[permission]] +identifier = "deny-request-system-audio-permission" +description = "Denies the request_system_audio_permission command without any pre-configured scope." +commands.deny = ["request_system_audio_permission"] diff --git a/plugins/permissions/permissions/autogenerated/reference.md b/plugins/permissions/permissions/autogenerated/reference.md new file mode 100644 index 0000000000..bb7997589d --- /dev/null +++ b/plugins/permissions/permissions/autogenerated/reference.md @@ -0,0 +1,178 @@ +## Default Permission + +Default permissions for the plugin + +#### This default permission set includes the following: + +- `allow-check-microphone-permission` +- `allow-request-microphone-permission` +- `allow-check-system-audio-permission` +- `allow-request-system-audio-permission` +- `allow-check-accessibility-permission` +- `allow-request-accessibility-permission` + +## Permission Table + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentifierDescription
+ +`permissions:allow-check-accessibility-permission` + + + +Enables the check_accessibility_permission command without any pre-configured scope. + +
+ +`permissions:deny-check-accessibility-permission` + + + +Denies the check_accessibility_permission command without any pre-configured scope. + +
+ +`permissions:allow-check-microphone-permission` + + + +Enables the check_microphone_permission command without any pre-configured scope. + +
+ +`permissions:deny-check-microphone-permission` + + + +Denies the check_microphone_permission command without any pre-configured scope. + +
+ +`permissions:allow-check-system-audio-permission` + + + +Enables the check_system_audio_permission command without any pre-configured scope. + +
+ +`permissions:deny-check-system-audio-permission` + + + +Denies the check_system_audio_permission command without any pre-configured scope. + +
+ +`permissions:allow-request-accessibility-permission` + + + +Enables the request_accessibility_permission command without any pre-configured scope. + +
+ +`permissions:deny-request-accessibility-permission` + + + +Denies the request_accessibility_permission command without any pre-configured scope. + +
+ +`permissions:allow-request-microphone-permission` + + + +Enables the request_microphone_permission command without any pre-configured scope. + +
+ +`permissions:deny-request-microphone-permission` + + + +Denies the request_microphone_permission command without any pre-configured scope. + +
+ +`permissions:allow-request-system-audio-permission` + + + +Enables the request_system_audio_permission command without any pre-configured scope. + +
+ +`permissions:deny-request-system-audio-permission` + + + +Denies the request_system_audio_permission command without any pre-configured scope. + +
diff --git a/plugins/permissions/permissions/default.toml b/plugins/permissions/permissions/default.toml new file mode 100644 index 0000000000..155901d40e --- /dev/null +++ b/plugins/permissions/permissions/default.toml @@ -0,0 +1,10 @@ +[default] +description = "Default permissions for the plugin" +permissions = [ + "allow-check-microphone-permission", + "allow-request-microphone-permission", + "allow-check-system-audio-permission", + "allow-request-system-audio-permission", + "allow-check-accessibility-permission", + "allow-request-accessibility-permission", +] diff --git a/plugins/permissions/permissions/schemas/schema.json b/plugins/permissions/permissions/schemas/schema.json new file mode 100644 index 0000000000..0252121c6a --- /dev/null +++ b/plugins/permissions/permissions/schemas/schema.json @@ -0,0 +1,378 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "PermissionFile", + "description": "Permission file that can define a default permission, a set of permissions or a list of inlined permissions.", + "type": "object", + "properties": { + "default": { + "description": "The default permission set for the plugin", + "anyOf": [ + { + "$ref": "#/definitions/DefaultPermission" + }, + { + "type": "null" + } + ] + }, + "set": { + "description": "A list of permissions sets defined", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionSet" + } + }, + "permission": { + "description": "A list of inlined permissions", + "default": [], + "type": "array", + "items": { + "$ref": "#/definitions/Permission" + } + } + }, + "definitions": { + "DefaultPermission": { + "description": "The default permission set of the plugin.\n\nWorks similarly to a permission with the \"default\" identifier.", + "type": "object", + "required": [ + "permissions" + ], + "properties": { + "version": { + "description": "The version of the permission.", + "type": [ + "integer", + "null" + ], + "format": "uint64", + "minimum": 1.0 + }, + "description": { + "description": "Human-readable description of what the permission does. Tauri convention is to use `

` headings in markdown content for Tauri documentation generation purposes.", + "type": [ + "string", + "null" + ] + }, + "permissions": { + "description": "All permissions this set contains.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PermissionSet": { + "description": "A set of direct permissions grouped together under a new name.", + "type": "object", + "required": [ + "description", + "identifier", + "permissions" + ], + "properties": { + "identifier": { + "description": "A unique identifier for the permission.", + "type": "string" + }, + "description": { + "description": "Human-readable description of what the permission does.", + "type": "string" + }, + "permissions": { + "description": "All permissions this set contains.", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionKind" + } + } + } + }, + "Permission": { + "description": "Descriptions of explicit privileges of commands.\n\nIt can enable commands to be accessible in the frontend of the application.\n\nIf the scope is defined it can be used to fine grain control the access of individual or multiple commands.", + "type": "object", + "required": [ + "identifier" + ], + "properties": { + "version": { + "description": "The version of the permission.", + "type": [ + "integer", + "null" + ], + "format": "uint64", + "minimum": 1.0 + }, + "identifier": { + "description": "A unique identifier for the permission.", + "type": "string" + }, + "description": { + "description": "Human-readable description of what the permission does. Tauri internal convention is to use `

` headings in markdown content for Tauri documentation generation purposes.", + "type": [ + "string", + "null" + ] + }, + "commands": { + "description": "Allowed or denied commands when using this permission.", + "default": { + "allow": [], + "deny": [] + }, + "allOf": [ + { + "$ref": "#/definitions/Commands" + } + ] + }, + "scope": { + "description": "Allowed or denied scoped when using this permission.", + "allOf": [ + { + "$ref": "#/definitions/Scopes" + } + ] + }, + "platforms": { + "description": "Target platforms this permission applies. By default all platforms are affected by this permission.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Target" + } + } + } + }, + "Commands": { + "description": "Allowed and denied commands inside a permission.\n\nIf two commands clash inside of `allow` and `deny`, it should be denied by default.", + "type": "object", + "properties": { + "allow": { + "description": "Allowed command.", + "default": [], + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Denied command, which takes priority.", + "default": [], + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "Scopes": { + "description": "An argument for fine grained behavior control of Tauri commands.\n\nIt can be of any serde serializable type and is used to allow or prevent certain actions inside a Tauri command. The configured scope is passed to the command and will be enforced by the command implementation.\n\n## Example\n\n```json { \"allow\": [{ \"path\": \"$HOME/**\" }], \"deny\": [{ \"path\": \"$HOME/secret.txt\" }] } ```", + "type": "object", + "properties": { + "allow": { + "description": "Data that defines what is allowed by the scope.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + }, + "deny": { + "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + } + } + }, + "Value": { + "description": "All supported ACL values.", + "anyOf": [ + { + "description": "Represents a null JSON value.", + "type": "null" + }, + { + "description": "Represents a [`bool`].", + "type": "boolean" + }, + { + "description": "Represents a valid ACL [`Number`].", + "allOf": [ + { + "$ref": "#/definitions/Number" + } + ] + }, + { + "description": "Represents a [`String`].", + "type": "string" + }, + { + "description": "Represents a list of other [`Value`]s.", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, + { + "description": "Represents a map of [`String`] keys to [`Value`]s.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Value" + } + } + ] + }, + "Number": { + "description": "A valid ACL number.", + "anyOf": [ + { + "description": "Represents an [`i64`].", + "type": "integer", + "format": "int64" + }, + { + "description": "Represents a [`f64`].", + "type": "number", + "format": "double" + } + ] + }, + "Target": { + "description": "Platform target.", + "oneOf": [ + { + "description": "MacOS.", + "type": "string", + "enum": [ + "macOS" + ] + }, + { + "description": "Windows.", + "type": "string", + "enum": [ + "windows" + ] + }, + { + "description": "Linux.", + "type": "string", + "enum": [ + "linux" + ] + }, + { + "description": "Android.", + "type": "string", + "enum": [ + "android" + ] + }, + { + "description": "iOS.", + "type": "string", + "enum": [ + "iOS" + ] + } + ] + }, + "PermissionKind": { + "type": "string", + "oneOf": [ + { + "description": "Enables the check_accessibility_permission command without any pre-configured scope.", + "type": "string", + "const": "allow-check-accessibility-permission", + "markdownDescription": "Enables the check_accessibility_permission command without any pre-configured scope." + }, + { + "description": "Denies the check_accessibility_permission command without any pre-configured scope.", + "type": "string", + "const": "deny-check-accessibility-permission", + "markdownDescription": "Denies the check_accessibility_permission command without any pre-configured scope." + }, + { + "description": "Enables the check_microphone_permission command without any pre-configured scope.", + "type": "string", + "const": "allow-check-microphone-permission", + "markdownDescription": "Enables the check_microphone_permission command without any pre-configured scope." + }, + { + "description": "Denies the check_microphone_permission command without any pre-configured scope.", + "type": "string", + "const": "deny-check-microphone-permission", + "markdownDescription": "Denies the check_microphone_permission command without any pre-configured scope." + }, + { + "description": "Enables the check_system_audio_permission command without any pre-configured scope.", + "type": "string", + "const": "allow-check-system-audio-permission", + "markdownDescription": "Enables the check_system_audio_permission command without any pre-configured scope." + }, + { + "description": "Denies the check_system_audio_permission command without any pre-configured scope.", + "type": "string", + "const": "deny-check-system-audio-permission", + "markdownDescription": "Denies the check_system_audio_permission command without any pre-configured scope." + }, + { + "description": "Enables the request_accessibility_permission command without any pre-configured scope.", + "type": "string", + "const": "allow-request-accessibility-permission", + "markdownDescription": "Enables the request_accessibility_permission command without any pre-configured scope." + }, + { + "description": "Denies the request_accessibility_permission command without any pre-configured scope.", + "type": "string", + "const": "deny-request-accessibility-permission", + "markdownDescription": "Denies the request_accessibility_permission command without any pre-configured scope." + }, + { + "description": "Enables the request_microphone_permission command without any pre-configured scope.", + "type": "string", + "const": "allow-request-microphone-permission", + "markdownDescription": "Enables the request_microphone_permission command without any pre-configured scope." + }, + { + "description": "Denies the request_microphone_permission command without any pre-configured scope.", + "type": "string", + "const": "deny-request-microphone-permission", + "markdownDescription": "Denies the request_microphone_permission command without any pre-configured scope." + }, + { + "description": "Enables the request_system_audio_permission command without any pre-configured scope.", + "type": "string", + "const": "allow-request-system-audio-permission", + "markdownDescription": "Enables the request_system_audio_permission command without any pre-configured scope." + }, + { + "description": "Denies the request_system_audio_permission command without any pre-configured scope.", + "type": "string", + "const": "deny-request-system-audio-permission", + "markdownDescription": "Denies the request_system_audio_permission command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-check-microphone-permission`\n- `allow-request-microphone-permission`\n- `allow-check-system-audio-permission`\n- `allow-request-system-audio-permission`\n- `allow-check-accessibility-permission`\n- `allow-request-accessibility-permission`", + "type": "string", + "const": "default", + "markdownDescription": "Default permissions for the plugin\n#### This default permission set includes:\n\n- `allow-check-microphone-permission`\n- `allow-request-microphone-permission`\n- `allow-check-system-audio-permission`\n- `allow-request-system-audio-permission`\n- `allow-check-accessibility-permission`\n- `allow-request-accessibility-permission`" + } + ] + } + } +} \ No newline at end of file diff --git a/plugins/permissions/src/commands.rs b/plugins/permissions/src/commands.rs new file mode 100644 index 0000000000..05d6a19ba5 --- /dev/null +++ b/plugins/permissions/src/commands.rs @@ -0,0 +1,129 @@ +use futures_util::StreamExt; + +use crate::models::PermissionStatus; + +#[cfg(target_os = "macos")] +use block2::StackBlock; +#[cfg(target_os = "macos")] +use objc2_av_foundation::{AVCaptureDevice, AVMediaTypeAudio}; + +#[tauri::command] +#[specta::specta] +pub async fn check_microphone_permission( + _app: tauri::AppHandle, +) -> Result { + #[cfg(target_os = "macos")] + { + let status = unsafe { + let media_type = AVMediaTypeAudio.unwrap(); + AVCaptureDevice::authorizationStatusForMediaType(media_type) + }; + Ok(status.into()) + } + + #[cfg(not(target_os = "macos"))] + { + let mut mic_sample_stream = hypr_audio::AudioInput::from_mic(None) + .map_err(|e| e.to_string())? + .stream(); + let sample = mic_sample_stream.next().await; + Ok(if sample.is_some() { + PermissionStatus::Authorized + } else { + PermissionStatus::Denied + }) + } +} + +#[tauri::command] +#[specta::specta] +pub async fn request_microphone_permission( + _app: tauri::AppHandle, +) -> Result<(), String> { + #[cfg(target_os = "macos")] + { + unsafe { + let media_type = AVMediaTypeAudio.unwrap(); + let block = StackBlock::new(|_granted| {}); + AVCaptureDevice::requestAccessForMediaType_completionHandler(media_type, &block); + } + } + + #[cfg(not(target_os = "macos"))] + { + let mut mic_sample_stream = hypr_audio::AudioInput::from_mic(None) + .map_err(|e| e.to_string())? + .stream(); + mic_sample_stream.next().await; + } + + Ok(()) +} + +#[tauri::command] +#[specta::specta] +pub async fn check_system_audio_permission( + _app: tauri::AppHandle, +) -> Result { + let status = hypr_tcc::audio_capture_permission_status(); + Ok(status.into()) +} + +#[tauri::command] +#[specta::specta] +pub async fn request_system_audio_permission( + app: tauri::AppHandle, +) -> Result<(), String> { + { + use tauri_plugin_shell::ShellExt; + + let bundle_id = app.config().identifier.clone(); + app.shell() + .command("tccutil") + .args(["reset", "AudioCapture", &bundle_id]) + .spawn() + .ok(); + } + + let stop = hypr_audio::AudioOutput::silence(); + + let mut speaker_sample_stream = hypr_audio::AudioInput::from_speaker().stream(); + speaker_sample_stream.next().await; + + let _ = stop.send(()); + Ok(()) +} + +#[tauri::command] +#[specta::specta] +pub async fn check_accessibility_permission( + _app: tauri::AppHandle, +) -> Result { + #[cfg(target_os = "macos")] + { + let is_trusted = macos_accessibility_client::accessibility::application_is_trusted(); + Ok(if is_trusted { + PermissionStatus::Authorized + } else { + PermissionStatus::Denied + }) + } + + #[cfg(not(target_os = "macos"))] + { + Ok(PermissionStatus::Denied) + } +} + +#[tauri::command] +#[specta::specta] +pub async fn request_accessibility_permission( + _app: tauri::AppHandle, +) -> Result<(), String> { + #[cfg(target_os = "macos")] + { + macos_accessibility_client::accessibility::application_is_trusted_with_prompt(); + } + + Ok(()) +} diff --git a/plugins/permissions/src/error.rs b/plugins/permissions/src/error.rs new file mode 100644 index 0000000000..895220da77 --- /dev/null +++ b/plugins/permissions/src/error.rs @@ -0,0 +1,21 @@ +use serde::{ser::Serializer, Serialize}; + +pub type Result = std::result::Result; + +#[derive(Debug, thiserror::Error)] +pub enum Error { + #[error(transparent)] + Io(#[from] std::io::Error), + #[cfg(mobile)] + #[error(transparent)] + PluginInvoke(#[from] tauri::plugin::mobile::PluginInvokeError), +} + +impl Serialize for Error { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: Serializer, + { + serializer.serialize_str(self.to_string().as_ref()) + } +} diff --git a/plugins/permissions/src/lib.rs b/plugins/permissions/src/lib.rs new file mode 100644 index 0000000000..f26801a8f8 --- /dev/null +++ b/plugins/permissions/src/lib.rs @@ -0,0 +1,49 @@ +mod commands; +mod error; +mod models; + +pub use error::{Error, Result}; +pub use models::PermissionStatus; + +const PLUGIN_NAME: &str = "permissions"; + +fn make_specta_builder() -> tauri_specta::Builder { + tauri_specta::Builder::::new() + .plugin_name(PLUGIN_NAME) + .commands(tauri_specta::collect_commands![ + commands::check_microphone_permission::, + commands::request_microphone_permission::, + commands::check_system_audio_permission::, + commands::request_system_audio_permission::, + commands::check_accessibility_permission::, + commands::request_accessibility_permission::, + ]) + .error_handling(tauri_specta::ErrorHandlingMode::Result) +} + +pub fn init() -> tauri::plugin::TauriPlugin { + let specta_builder = make_specta_builder(); + + tauri::plugin::Builder::new(PLUGIN_NAME) + .invoke_handler(specta_builder.invoke_handler()) + .setup(move |_app, _api| Ok(())) + .build() +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn export_types() { + make_specta_builder::() + .export( + specta_typescript::Typescript::default() + .header("// @ts-nocheck\n\n") + .formatter(specta_typescript::formatter::prettier) + .bigint(specta_typescript::BigIntExportBehavior::Number), + "./js/bindings.gen.ts", + ) + .unwrap() + } +} diff --git a/plugins/permissions/src/models.rs b/plugins/permissions/src/models.rs new file mode 100644 index 0000000000..1f87a7de68 --- /dev/null +++ b/plugins/permissions/src/models.rs @@ -0,0 +1,31 @@ +#[derive(Debug, serde::Serialize, serde::Deserialize, specta::Type)] +#[serde(rename_all = "camelCase")] +pub enum PermissionStatus { + NeverRequested, + Denied, + Authorized, +} + +#[cfg(target_os = "macos")] +use objc2_av_foundation::AVAuthorizationStatus; + +impl From for PermissionStatus { + fn from(status: isize) -> Self { + match status { + hypr_tcc::GRANTED => Self::Authorized, + hypr_tcc::NEVER_ASKED => Self::NeverRequested, + _ => Self::Denied, + } + } +} + +#[cfg(target_os = "macos")] +impl From for PermissionStatus { + fn from(status: AVAuthorizationStatus) -> Self { + match status { + AVAuthorizationStatus::NotDetermined => Self::NeverRequested, + AVAuthorizationStatus::Authorized => Self::Authorized, + _ => Self::Denied, + } + } +} diff --git a/plugins/permissions/tsconfig.json b/plugins/permissions/tsconfig.json new file mode 100644 index 0000000000..13b985325d --- /dev/null +++ b/plugins/permissions/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../tsconfig.base.json", + "include": ["./js/*.ts"], + "exclude": ["node_modules"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ffbcf02fbf..dc62453cc3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,32 +21,32 @@ importers: apps/desktop: dependencies: '@ai-sdk/amazon-bedrock': - specifier: ^3.0.47 - version: 3.0.47(zod@4.1.12) + specifier: ^3.0.49 + version: 3.0.49(zod@4.1.12) '@ai-sdk/anthropic': - specifier: ^2.0.37 - version: 2.0.37(zod@4.1.12) + specifier: ^2.0.39 + version: 2.0.39(zod@4.1.12) '@ai-sdk/azure': - specifier: ^2.0.54 - version: 2.0.54(zod@4.1.12) + specifier: ^2.0.59 + version: 2.0.59(zod@4.1.12) '@ai-sdk/google': - specifier: ^2.0.23 - version: 2.0.23(zod@4.1.12) + specifier: ^2.0.25 + version: 2.0.25(zod@4.1.12) '@ai-sdk/google-vertex': - specifier: ^3.0.53 - version: 3.0.53(zod@4.1.12) + specifier: ^3.0.55 + version: 3.0.55(zod@4.1.12) '@ai-sdk/openai': - specifier: ^2.0.53 - version: 2.0.53(zod@4.1.12) + specifier: ^2.0.58 + version: 2.0.58(zod@4.1.12) '@ai-sdk/openai-compatible': - specifier: ^1.0.22 - version: 1.0.22(zod@4.1.12) + specifier: ^1.0.24 + version: 1.0.24(zod@4.1.12) '@ai-sdk/react': - specifier: ^2.0.78 - version: 2.0.78(react@19.2.0)(zod@4.1.12) + specifier: ^2.0.82 + version: 2.0.82(react@19.2.0)(zod@4.1.12) '@electric-sql/client': - specifier: ^1.0.14 - version: 1.0.14 + specifier: ^1.1.1 + version: 1.1.1 '@huggingface/languages': specifier: ^1.0.0 version: 1.0.0 @@ -59,6 +59,9 @@ importers: '@hypr/plugin-db2': specifier: workspace:* version: link:../../plugins/db2 + '@hypr/plugin-detect': + specifier: workspace:* + version: link:../../plugins/detect '@hypr/plugin-listener': specifier: workspace:* version: link:../../plugins/listener @@ -71,6 +74,9 @@ importers: '@hypr/plugin-notification': specifier: workspace:* version: link:../../plugins/notification + '@hypr/plugin-permissions': + specifier: workspace:* + version: link:../../plugins/permissions '@hypr/plugin-template': specifier: workspace:* version: link:../../plugins/template @@ -87,14 +93,14 @@ importers: specifier: workspace:^ version: link:../../packages/utils '@iconify-icon/react': - specifier: ^3.0.1 - version: 3.0.1(react@19.2.0) + specifier: ^3.0.2 + version: 3.0.2(react@19.2.0) '@lobehub/icons': specifier: ^2.43.1 version: 2.43.1(@babel/core@7.28.5)(@types/mdast@4.0.4)(@types/react@19.2.2)(antd@5.27.5(date-fns@4.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(framer-motion@12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(micromark-util-types@2.0.2)(micromark@4.0.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@openrouter/ai-sdk-provider': specifier: ^1.2.0 - version: 1.2.0(ai@5.0.78(zod@4.1.12))(zod@4.1.12) + version: 1.2.0(ai@5.0.82(zod@4.1.12))(zod@4.1.12) '@orama/highlight': specifier: ^0.1.9 version: 0.1.9 @@ -108,20 +114,20 @@ importers: specifier: ^8.55.0 version: 8.55.0(react@19.2.0) '@supabase/supabase-js': - specifier: ^2.76.1 - version: 2.76.1 + specifier: ^2.77.0 + version: 2.77.0 '@t3-oss/env-core': specifier: ^0.13.8 version: 0.13.8(typescript@5.8.3)(zod@4.1.12) '@tanstack/react-form': specifier: ^1.23.8 - version: 1.23.8(@tanstack/react-start@1.133.26(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.23.8(@tanstack/react-start@1.134.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-query': specifier: ^5.90.5 version: 5.90.5(react@19.2.0) '@tanstack/react-router': - specifier: ^1.133.25 - version: 1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^1.133.36 + version: 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-virtual': specifier: ^3.13.12 version: 3.13.12(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -129,23 +135,26 @@ importers: specifier: ^2.9.0 version: 2.9.0 '@tauri-apps/plugin-deep-link': - specifier: ^2.4.3 - version: 2.4.3 + specifier: ^2.4.5 + version: 2.4.5 '@tauri-apps/plugin-dialog': - specifier: ^2.4.0 - version: 2.4.0 + specifier: ^2.4.2 + version: 2.4.2 '@tauri-apps/plugin-http': + specifier: ^2.5.4 + version: 2.5.4 + '@tauri-apps/plugin-opener': specifier: ^2.5.2 version: 2.5.2 - '@tauri-apps/plugin-opener': - specifier: ^2.5.0 - version: 2.5.0 '@tauri-apps/plugin-process': - specifier: ^2.3.0 - version: 2.3.0 + specifier: ^2.3.1 + version: 2.3.1 + '@tauri-apps/plugin-shell': + specifier: ^2.3.3 + version: 2.3.3 '@tauri-apps/plugin-store': - specifier: ^2.4.0 - version: 2.4.0 + specifier: ^2.4.1 + version: 2.4.1 '@tauri-apps/plugin-updater': specifier: ^2.9.0 version: 2.9.0 @@ -154,13 +163,13 @@ importers: version: 2.4.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@wavesurfer/react': specifier: ^1.0.11 - version: 1.0.11(react@19.2.0)(wavesurfer.js@7.11.0) + version: 1.0.11(react@19.2.0)(wavesurfer.js@7.11.1) '@xstate/store': - specifier: ^3.11.1 - version: 3.11.1(react@19.2.0)(solid-js@1.9.9) + specifier: ^3.11.2 + version: 3.11.2(react@19.2.0)(solid-js@1.9.9) ai: - specifier: ^5.0.78 - version: 5.0.78(zod@4.1.12) + specifier: ^5.0.82 + version: 5.0.82(zod@4.1.12) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -201,14 +210,14 @@ importers: specifier: ^1.4.0 version: 1.4.0(@types/react@19.2.2)(react@19.2.0) tinybase: - specifier: ^6.7.1 - version: 6.7.1(postgres@3.4.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(ws@8.18.3) + specifier: ^6.7.2 + version: 6.7.2(postgres@3.4.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(ws@8.18.3) tinytick: specifier: ^1.2.8 version: 1.2.8 wavesurfer.js: - specifier: ^7.11.0 - version: 7.11.0 + specifier: ^7.11.1 + version: 7.11.1 xstate: specifier: ^5.23.0 version: 5.23.0 @@ -217,26 +226,26 @@ importers: version: 4.1.12 zustand: specifier: ^5.0.8 - version: 5.0.8(@types/react@19.2.2)(immer@10.1.3)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) + version: 5.0.8(@types/react@19.2.2)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) devDependencies: '@faker-js/faker': specifier: ^10.1.0 version: 10.1.0 '@tanstack/react-router-devtools': - specifier: ^1.133.25 - version: 1.133.25(@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.25)(@types/node@24.9.1)(csstype@3.1.3)(jiti@1.21.7)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^1.133.36 + version: 1.133.36(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.36)(@types/node@24.9.2)(csstype@3.1.3)(jiti@1.21.7)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) '@tanstack/router-plugin': - specifier: ^1.133.25 - version: 1.133.25(@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^1.133.36 + version: 1.133.36(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) '@tauri-apps/cli': - specifier: ^2.9.1 - version: 2.9.1 + specifier: ^2.9.2 + version: 2.9.2 '@types/json5': specifier: ^2.2.0 version: 2.2.0 '@types/node': - specifier: ^24.9.1 - version: 24.9.1 + specifier: ^24.9.2 + version: 24.9.2 '@types/react': specifier: ^19.2.2 version: 19.2.2 @@ -245,7 +254,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.7.0 - version: 4.7.0(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.6) @@ -256,17 +265,17 @@ importers: specifier: ^3.4.18 version: 3.4.18(tsx@4.20.6)(yaml@2.8.1) tsx: - specifier: ^4.19.2 + specifier: ^4.20.6 version: 4.20.6 typescript: specifier: ~5.8.3 version: 5.8.3 vite: specifier: ^7.1.12 - version: 7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + version: 7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.1)(jiti@1.21.7)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(jiti@1.21.7)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) apps/pro: dependencies: @@ -275,10 +284,10 @@ importers: version: 1.0.1 '@hono/mcp': specifier: ^0.1.4 - version: 0.1.4(@modelcontextprotocol/sdk@1.20.2)(hono@4.10.2) + version: 0.1.4(@modelcontextprotocol/sdk@1.20.2)(hono@4.10.4) '@hono/node-server': specifier: ^1.19.5 - version: 1.19.5(hono@4.10.2) + version: 1.19.5(hono@4.10.4) '@modelcontextprotocol/sdk': specifier: ^1.20.2 version: 1.20.2 @@ -292,18 +301,18 @@ importers: specifier: ^1.10.2 version: 1.10.2(ws@8.18.3) hono: - specifier: ^4.10.2 - version: 4.10.2 + specifier: ^4.10.4 + version: 4.10.4 hono-rate-limiter: specifier: ^0.4.2 - version: 0.4.2(hono@4.10.2) + version: 0.4.2(hono@4.10.4) zod: specifier: ^3.25.76 version: 3.25.76 devDependencies: '@types/node': - specifier: ^20.19.23 - version: 20.19.23 + specifier: ^20.19.24 + version: 20.19.24 tsx: specifier: ^4.20.6 version: 4.20.6 @@ -314,8 +323,8 @@ importers: apps/web: dependencies: '@cloudflare/vite-plugin': - specifier: ^1.13.15 - version: 1.13.15(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))(workerd@1.20251011.0)(wrangler@4.45.0) + specifier: ^1.13.17 + version: 1.13.17(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))(workerd@1.20251011.0)(wrangler@4.45.2) '@hypr/ui': specifier: workspace:* version: link:../../packages/ui @@ -323,8 +332,8 @@ importers: specifier: workspace:* version: link:../../packages/utils '@iconify-icon/react': - specifier: ^3.0.1 - version: 3.0.1(react@19.2.0) + specifier: ^3.0.2 + version: 3.0.2(react@19.2.0) '@mux/mux-player-react': specifier: ^3.7.0 version: 3.7.0(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -338,26 +347,26 @@ importers: specifier: ^10.22.0 version: 10.22.0(react@19.2.0) '@stripe/stripe-js': - specifier: ^8.1.0 - version: 8.1.0 + specifier: ^8.2.0 + version: 8.2.0 '@supabase/ssr': specifier: ^0.7.0 - version: 0.7.0(@supabase/supabase-js@2.76.1) + version: 0.7.0(@supabase/supabase-js@2.77.0) '@supabase/supabase-js': - specifier: ^2.76.1 - version: 2.76.1 + specifier: ^2.77.0 + version: 2.77.0 '@t3-oss/env-core': specifier: ^0.13.8 version: 0.13.8(typescript@5.9.3)(zod@4.1.12) '@tailwindcss/vite': specifier: ^4.1.16 - version: 4.1.16(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.1.16(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/react-devtools': - specifier: ^0.7.7 - version: 0.7.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(csstype@3.1.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.9) + specifier: ^0.7.11 + version: 0.7.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(csstype@3.1.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.9) '@tanstack/react-form': specifier: ^1.23.8 - version: 1.23.8(@tanstack/react-start@1.133.26(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.23.8(@tanstack/react-start@1.134.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-query': specifier: ^5.90.5 version: 5.90.5(react@19.2.0) @@ -365,20 +374,20 @@ importers: specifier: ^5.90.2 version: 5.90.2(@tanstack/react-query@5.90.5(react@19.2.0))(react@19.2.0) '@tanstack/react-router': - specifier: ^1.133.25 - version: 1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^1.133.36 + version: 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-router-devtools': - specifier: ^1.133.25 - version: 1.133.25(@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.25)(@types/node@22.18.12)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^1.133.36 + version: 1.133.36(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.36)(@types/node@22.18.13)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) '@tanstack/react-router-ssr-query': - specifier: ^1.133.25 - version: 1.133.25(@tanstack/query-core@5.90.5)(@tanstack/react-query@5.90.5(react@19.2.0))(@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.25)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^1.133.36 + version: 1.133.36(@tanstack/query-core@5.90.5)(@tanstack/react-query@5.90.5(react@19.2.0))(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.36)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/react-start': - specifier: ^1.133.26 - version: 1.133.26(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^1.134.0 + version: 1.134.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/router-plugin': - specifier: ^1.133.25 - version: 1.133.25(@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^1.133.36 + version: 1.133.36(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) drizzle-orm: specifier: ^0.44.7 version: 0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.5)(pg@8.16.3)(postgres@3.4.7) @@ -398,14 +407,14 @@ importers: specifier: ^19.2.0 version: 19.2.0(react@19.2.0) stripe: - specifier: ^19.1.0 - version: 19.1.0(@types/node@22.18.12) + specifier: ^19.2.0 + version: 19.2.0(@types/node@22.18.13) tailwindcss: specifier: ^4.1.16 version: 4.1.16 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) zod: specifier: ^4.1.12 version: 4.1.12 @@ -418,7 +427,7 @@ importers: version: 0.2.2(@content-collections/core@0.11.1(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@content-collections/vite': specifier: ^0.2.7 - version: 0.2.7(@content-collections/core@0.11.1(typescript@5.9.3))(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + version: 0.2.7(@content-collections/core@0.11.1(typescript@5.9.3))(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) '@testing-library/dom': specifier: ^10.4.1 version: 10.4.1 @@ -426,8 +435,8 @@ importers: specifier: ^16.3.0 version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/node': - specifier: ^22.18.12 - version: 22.18.12 + specifier: ^22.18.13 + version: 22.18.13 '@types/react': specifier: ^19.2.2 version: 19.2.2 @@ -435,8 +444,8 @@ importers: specifier: ^19.2.2 version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': - specifier: ^5.0.4 - version: 5.0.4(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^5.1.0 + version: 5.1.0(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) env-cmd: specifier: ^11.0.0 version: 11.0.0 @@ -448,13 +457,13 @@ importers: version: 5.9.3 vite: specifier: ^7.1.12 - version: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + version: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) web-vitals: specifier: ^5.1.0 version: 5.1.0 wrangler: - specifier: ^4.45.0 - version: 4.45.0 + specifier: ^4.45.2 + version: 4.45.2 packages/db: dependencies: @@ -469,11 +478,11 @@ importers: version: 4.1.12 devDependencies: '@types/node': - specifier: ^24.9.1 - version: 24.9.1 + specifier: ^24.9.2 + version: 24.9.2 drizzle-kit: - specifier: ^0.31.5 - version: 0.31.5 + specifier: ^0.31.6 + version: 0.31.6 pg: specifier: ^8.16.3 version: 8.16.3 @@ -485,7 +494,7 @@ importers: devDependencies: nango: specifier: 0.69.2 - version: 0.69.2(@types/node@24.9.1)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1) + version: 0.69.2(@types/node@24.9.2)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1) zod: specifier: 4.0.5 version: 4.0.5 @@ -521,71 +530,71 @@ importers: specifier: ^5.90.5 version: 5.90.5(react@19.2.0) '@tanstack/react-router': - specifier: ^1.133.25 - version: 1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^1.133.36 + version: 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tiptap/core': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/pm@3.7.2) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/pm@3.9.1) '@tiptap/extension-bubble-menu': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) '@tiptap/extension-document': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) '@tiptap/extension-highlight': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) '@tiptap/extension-history': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/extensions@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/extensions@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)) '@tiptap/extension-image': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) '@tiptap/extension-link': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) '@tiptap/extension-list-keymap': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/extension-list@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/extension-list@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)) '@tiptap/extension-mention': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)(@tiptap/suggestion@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)(@tiptap/suggestion@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)) '@tiptap/extension-placeholder': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/extensions@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/extensions@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)) '@tiptap/extension-strike': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) '@tiptap/extension-task-item': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/extension-list@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/extension-list@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)) '@tiptap/extension-task-list': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/extension-list@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/extension-list@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)) '@tiptap/extension-text': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) '@tiptap/extension-typography': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) '@tiptap/extension-underline': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) '@tiptap/markdown': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) '@tiptap/pm': - specifier: ^3.7.2 - version: 3.7.2 + specifier: ^3.9.1 + version: 3.9.1 '@tiptap/react': - specifier: ^3.7.2 - version: 3.7.2(@floating-ui/dom@1.7.4)(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^3.9.1 + version: 3.9.1(@floating-ui/dom@1.7.4)(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tiptap/starter-kit': - specifier: ^3.7.2 - version: 3.7.2 + specifier: ^3.9.1 + version: 3.9.1 '@tiptap/suggestion': - specifier: ^3.7.2 - version: 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) + specifier: ^3.9.1 + version: 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -608,12 +617,12 @@ importers: specifier: ^19.2 version: 19.2.0(react@19.2.0) turndown: - specifier: ^7.2.1 - version: 7.2.1 + specifier: ^7.2.2 + version: 7.2.2 devDependencies: '@types/node': - specifier: ^22.18.12 - version: 22.18.12 + specifier: ^22.18.13 + version: 22.18.13 '@types/react': specifier: ^19.2.2 version: 19.2.2 @@ -621,11 +630,11 @@ importers: specifier: ^19.2.2 version: 19.2.2(@types/react@19.2.2) '@types/turndown': - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.6 + version: 5.0.6 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.13)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) packages/ui: dependencies: @@ -730,8 +739,8 @@ importers: specifier: ^5.90.5 version: 5.90.5(react@19.2.0) '@types/node': - specifier: ^22.18.12 - version: 22.18.12 + specifier: ^22.18.13 + version: 22.18.13 '@types/react': specifier: ^19.2.2 version: 19.2.2 @@ -766,8 +775,8 @@ importers: packages/utils: dependencies: '@ai-sdk/openai-compatible': - specifier: ^1.0.22 - version: 1.0.22(zod@4.1.12) + specifier: ^1.0.24 + version: 1.0.24(zod@4.1.12) '@date-fns/tz': specifier: ^1.4.1 version: 1.4.1 @@ -787,11 +796,11 @@ importers: specifier: ^2.9.0 version: 2.9.0 '@tauri-apps/plugin-http': - specifier: ^2.5.2 - version: 2.5.2 + specifier: ^2.5.4 + version: 2.5.4 ai: - specifier: ^5.0.78 - version: 5.0.78(zod@4.1.12) + specifier: ^5.0.82 + version: 5.0.82(zod@4.1.12) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -818,14 +827,14 @@ importers: version: https://codeload.github.com/bagindo/tauri-plugin-keygen/tar.gz/e0de03a76a5c82c36adb347e43e4bff4f78c87de zustand: specifier: ^5.0.8 - version: 5.0.8(@types/react@19.2.2)(immer@10.1.3)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) + version: 5.0.8(@types/react@19.2.2)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)) devDependencies: '@types/react': specifier: ^19.2.2 version: 19.2.2 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.1)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) plugins/analytics: dependencies: @@ -857,6 +866,12 @@ importers: specifier: ^2.9.0 version: 2.9.0 + plugins/detect: + dependencies: + '@tauri-apps/api': + specifier: ^2.9.0 + version: 2.9.0 + plugins/listener: dependencies: '@tauri-apps/api': @@ -893,6 +908,12 @@ importers: specifier: ^2.9.0 version: 2.9.0 + plugins/permissions: + dependencies: + '@tauri-apps/api': + specifier: ^2.9.0 + version: 2.9.0 + plugins/sfx: dependencies: '@tauri-apps/api': @@ -943,56 +964,56 @@ importers: packages: - '@ai-sdk/amazon-bedrock@3.0.47': - resolution: {integrity: sha512-oTAxTU4k1+EIKP41nvLGN7dWwoK7dg1JptrX6csn7abmSfQSsygDrfeMf8/7Mdnr+frt9i5ogvpQkp1ak0916Q==} + '@ai-sdk/amazon-bedrock@3.0.49': + resolution: {integrity: sha512-XxmZnXjURRcfct/jkx5VXXjKpcI+xjeXkmWDmvmdLuUEZL9L+J/OZZj1XiiVh6jHTr+27lK66zMCcNBoNw4DBA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@2.0.37': - resolution: {integrity: sha512-r2e9BWoobisH9B5b7x3yYG/k9WlsZqa4D94o7gkwktReqrjjv83zNMop4KmlJsh/zBhbsaP8S8SUfiwK+ESxgg==} + '@ai-sdk/anthropic@2.0.39': + resolution: {integrity: sha512-8YckXsPN9e0NfU4zZvP23xCIKNESyYb1Y/xVllI1fZ+uVsd/shoz2zplbeGVQHPjXHWfY9aT5tF98Lp920HDIQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/azure@2.0.54': - resolution: {integrity: sha512-nJtKcv2+4WmwfRpzc6GcVy3OlKjs7MiHhuNeibxDcDIST3h+qEX1UZYw9FDwjRFhWKbRyjSFwWxnoEP+Zwd6kQ==} + '@ai-sdk/azure@2.0.59': + resolution: {integrity: sha512-Sa4DBIPycltgb1z5ENWZD4GEiLcct2jgJOjjNpiE8NAsqxSYrJBgBwur2E3zaYEDJyHQShChldMMll8COHJgZA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@2.0.1': - resolution: {integrity: sha512-vPVIbnP35ZnayS937XLo85vynR85fpBQWHCdUweq7apzqFOTU2YkUd4V3msebEHbQ2Zro60ZShDDy9SMiyWTqA==} + '@ai-sdk/gateway@2.0.3': + resolution: {integrity: sha512-/vCoMKtod+A74/BbkWsaAflWKz1ovhX5lmJpIaXQXtd6gyexZncjotBTbFM8rVJT9LKJ/Kx7iVVo3vh+KT+IJg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/google-vertex@3.0.53': - resolution: {integrity: sha512-Y8LJGPXKLi8HuoLvhSvzK7ZVPEV7nSHgJcVFDmVu1h6UhjKM6EMafSt0wXa9HznEVX3GgntlEPnrcBAlBZ4mFg==} + '@ai-sdk/google-vertex@3.0.55': + resolution: {integrity: sha512-nUAIQywTzVXbKMYibq2vbjTRorrhWQcKJ/j1mwZKyPahLX41wh1kn8Fbwjxhd7ECeEJEZpJCnQh8OlQ1CeTO7Q==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/google@2.0.23': - resolution: {integrity: sha512-VbCnKR+6aWUVLkAiSW5gUEtST7KueEmlt+d6qwDikxlLnFG9pzy59je8MiDVeM5G2tuSXbvZQF78PGIfXDBmow==} + '@ai-sdk/google@2.0.25': + resolution: {integrity: sha512-tH2rA3428jnY6COoPfKB/BoQMs57sv9t+PEdyIB9ePtlV9dnVUbfKcdKoEcAaVffNZ6pzk8otrQYnu67pyn8TQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai-compatible@1.0.22': - resolution: {integrity: sha512-Q+lwBIeMprc/iM+vg1yGjvzRrp74l316wDpqWdbmd4VXXlllblzGsUgBLTeKvcEapFTgqk0FRETvSb58Y6dsfA==} + '@ai-sdk/openai-compatible@1.0.24': + resolution: {integrity: sha512-dzhh6NjcSEmhvOPTy1PXFUZ6X4J4IHZqtuo/HNTXWo5OPqwcgSMm9NizTbe8NMmeSXgE3Eim6v6Nuj7yHcpbMw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@2.0.53': - resolution: {integrity: sha512-GIkR3+Fyif516ftXv+YPSPstnAHhcZxNoR2s8uSHhQ1yBT7I7aQYTVwpjAuYoT3GR+TeP50q7onj2/nDRbT2FQ==} + '@ai-sdk/openai@2.0.58': + resolution: {integrity: sha512-eBEpuO6DF4j+ZESs0JPtT9+xjkdnTvOqEHZ3D8JTnCk0HZ/xMR3WQGXqolzckcQS+qzMXCiefDX2gk8cTP9M7A==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@3.0.12': - resolution: {integrity: sha512-ZtbdvYxdMoria+2SlNarEk6Hlgyf+zzcznlD55EAl+7VZvJaSg2sqPvwArY7L6TfDEDJsnCq0fdhBSkYo0Xqdg==} + '@ai-sdk/provider-utils@3.0.14': + resolution: {integrity: sha512-CYRU6L7IlR7KslSBVxvlqlybQvXJln/PI57O8swhOaDIURZbjRP2AY3igKgUsrmWqqnFFUHP+AwTN8xqJAknnA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -1001,8 +1022,8 @@ packages: resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} engines: {node: '>=18'} - '@ai-sdk/react@2.0.78': - resolution: {integrity: sha512-f5inDBHJyUEzbtNxc9HiTxbcGjtot0uuc//0/khGrl8IZlLxw+yTxO/T1Qq95Rw5QPwTx9/Aw7wIZei3qws9hA==} + '@ai-sdk/react@2.0.82': + resolution: {integrity: sha512-InaGqykKGFq/XA6Vhh2Hyy38nzeMpqp8eWxjTNEQA5Gwcal0BVNuZyTbTIL5t5VNXV+pQPDhe9ak1+mc9qxjog==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -1068,8 +1089,8 @@ packages: '@asamuzakjp/css-color@4.0.5': resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==} - '@asamuzakjp/dom-selector@6.7.2': - resolution: {integrity: sha512-ccKogJI+0aiDhOahdjANIc9SDixSud1gbwdVrhn7kMopAtLXqsz9MKmQQtIl6Y5aC2IYq+j4dz/oedL2AVMmVQ==} + '@asamuzakjp/dom-selector@6.7.3': + resolution: {integrity: sha512-kiGFeY+Hxf5KbPpjRLf+ffWbkos1aGo8MBfd91oxS3O57RgU3XhZrt/6UzoVF9VMpWbC3v87SRc9jxGrc9qHtQ==} '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} @@ -1081,8 +1102,8 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/types@3.914.0': - resolution: {integrity: sha512-kQWPsRDmom4yvAfyG6L1lMmlwnTzm1XwMHOU+G5IFlsP4YEaMtXidDzW/wiivY0QFrhfCz/4TVmu0a2aPU57ug==} + '@aws-sdk/types@3.920.0': + resolution: {integrity: sha512-W8FI6HteaMwACb49IQzNABjbaGM/fP0t4lLBHeL6KXBmXung2S9FMIBHGxoZvBCRt5omFF31yDCbFaDN/1BPYQ==} engines: {node: '>=18.0.0'} '@babel/code-frame@7.26.2': @@ -1356,11 +1377,11 @@ packages: workerd: optional: true - '@cloudflare/vite-plugin@1.13.15': - resolution: {integrity: sha512-tVkdkRmwGzqs7RzRIwKkJp/FvRZ0YL108jXhQRYTSCDcuDVROK4O1hjf9bcC7Gr0KISSaEPj9oJtR5eTSNN+Ag==} + '@cloudflare/vite-plugin@1.13.17': + resolution: {integrity: sha512-JYBs+KwN/fcqcOwa4hZ5SPLUAZ2idksZ4umeja4TWPPUWvO2f0Lm0bOjVHI+rFuq72b2vixx2coNJSyntEBUsA==} peerDependencies: vite: ^6.1.0 || ^7.0.0 - wrangler: ^4.45.0 + wrangler: ^4.45.2 '@cloudflare/workerd-darwin-64@1.20251011.0': resolution: {integrity: sha512-0DirVP+Z82RtZLlK2B+VhLOkk+ShBqDYO/jhcRw4oVlp0TOvk3cOVZChrt3+y3NV8Y/PYgTEywzLKFSziK4wCg==} @@ -1492,8 +1513,8 @@ packages: '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} - '@electric-sql/client@1.0.14': - resolution: {integrity: sha512-LtPAfeMxXRiYS0hyDQ5hue2PjljUiK9stvzsVyVb4nwxWQxfOWTSF42bHTs/o5i3x1T4kAQ7mwHpxa4A+f8X7Q==} + '@electric-sql/client@1.1.1': + resolution: {integrity: sha512-E9aZ3PJ/kBRmuxth9fKNt72wTqP5XjXUPu3V2SxNugAFWMgdJ++ErwGtskuUG8W3js7fGeP545yNQTeVlCQRmg==} '@emnapi/runtime@1.6.0': resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==} @@ -1807,10 +1828,10 @@ packages: '@huggingface/languages@1.0.0': resolution: {integrity: sha512-EtU6RwSRyiKiRHsdalP84vOV7Wrde6IbPums6XeOOD8peq8ttWfSdXIq00OF5T5OH9aCUf/pbOtg6Pxpus9vfw==} - '@iconify-icon/react@3.0.1': - resolution: {integrity: sha512-/4CAVpk8HDyKS78r1G0rZhML7hI6jLxb8kAmjEXsCtuVUDwdGqicGCRg0T14mqeHNImrQPR49MhbuSSS++JlUA==} + '@iconify-icon/react@3.0.2': + resolution: {integrity: sha512-XCYzkovmRkg6Hv2VjqBw4kyvp0acBAHa3lGFle74TldWx0VK3JAuUU+dDLj+6eUKqHceuTFSUiavuEqnM6UPMA==} peerDependencies: - react: '>=16' + react: '>=19.2.0' '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -3050,12 +3071,12 @@ packages: '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} - '@rolldown/pluginutils@1.0.0-beta.38': - resolution: {integrity: sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==} - '@rolldown/pluginutils@1.0.0-beta.40': resolution: {integrity: sha512-s3GeJKSQOwBlzdUrj4ISjJj5SfSh+aqn0wjOar4Bx95iV1ETI7F6S/5hLcfAxZ9kXDcyrAkxPlqmd1ZITttf+w==} + '@rolldown/pluginutils@1.0.0-beta.43': + resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==} + '@rollup/rollup-android-arm-eabi@4.52.5': resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} cpu: [arm] @@ -3256,26 +3277,26 @@ packages: resolution: {integrity: sha512-qRHikkH1CwAYuGkcDlMy08Ly3P+TUhR+LvKyuA1uIInHx8Z3oILVH8csS8tA9y282Ey0/Hny2pf98eWb6yxuJA==} engines: {node: '>=18'} - '@shikijs/core@3.13.0': - resolution: {integrity: sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA==} + '@shikijs/core@3.14.0': + resolution: {integrity: sha512-qRSeuP5vlYHCNUIrpEBQFO7vSkR7jn7Kv+5X3FO/zBKVDGQbcnlScD3XhkrHi/R8Ltz0kEjvFR9Szp/XMRbFMw==} - '@shikijs/engine-javascript@3.13.0': - resolution: {integrity: sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg==} + '@shikijs/engine-javascript@3.14.0': + resolution: {integrity: sha512-3v1kAXI2TsWQuwv86cREH/+FK9Pjw3dorVEykzQDhwrZj0lwsHYlfyARaKmn6vr5Gasf8aeVpb8JkzeWspxOLQ==} - '@shikijs/engine-oniguruma@3.13.0': - resolution: {integrity: sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==} + '@shikijs/engine-oniguruma@3.14.0': + resolution: {integrity: sha512-TNcYTYMbJyy+ZjzWtt0bG5y4YyMIWC2nyePz+CFMWqm+HnZZyy9SWMgo8Z6KBJVIZnx8XUXS8U2afO6Y0g1Oug==} - '@shikijs/langs@3.13.0': - resolution: {integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==} + '@shikijs/langs@3.14.0': + resolution: {integrity: sha512-DIB2EQY7yPX1/ZH7lMcwrK5pl+ZkP/xoSpUzg9YC8R+evRCCiSQ7yyrvEyBsMnfZq4eBzLzBlugMyTAf13+pzg==} - '@shikijs/themes@3.13.0': - resolution: {integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==} + '@shikijs/themes@3.14.0': + resolution: {integrity: sha512-fAo/OnfWckNmv4uBoUu6dSlkcBc+SA1xzj5oUSaz5z3KqHtEbUypg/9xxgJARtM6+7RVm0Q6Xnty41xA1ma1IA==} - '@shikijs/transformers@3.13.0': - resolution: {integrity: sha512-833lcuVzcRiG+fXvgslWsM2f4gHpjEgui1ipIknSizRuTgMkNZupiXE5/TVJ6eSYfhNBFhBZKkReKWO2GgYmqA==} + '@shikijs/transformers@3.14.0': + resolution: {integrity: sha512-i67zQnY9wLMMnKasonVW1L9fKneSLZDj1ePsA4o0AZWU4uUobmJY9baRDa36z+a9/g0aG76/2tybQvm4hrwxIQ==} - '@shikijs/types@3.13.0': - resolution: {integrity: sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==} + '@shikijs/types@3.14.0': + resolution: {integrity: sha512-bQGgC6vrY8U/9ObG1Z/vTro+uclbjjD/uG58RvfxKZVD5p9Yc1ka3tVyEFy7BNJLzxuWyHH5NWynP9zZZS59eQ==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -3350,8 +3371,8 @@ packages: peerDependencies: solid-js: ^1.6.12 - '@speed-highlight/core@1.2.7': - resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} + '@speed-highlight/core@1.2.8': + resolution: {integrity: sha512-IGytNtnUnPIobIbOq5Y6LIlqiHNX+vnToQIS7lj6L5819C+rA8TXRDkkG8vePsiBOGcoW9R6i+dp2YBUKdB09Q==} '@splinetool/runtime@0.9.526': resolution: {integrity: sha512-qznHbXA5aKwDbCgESAothCNm1IeEZcmNWG145p5aXj4w5uoqR1TZ9qkTHTKLTsUbHeitCwdhzmRqan1kxboLgQ==} @@ -3367,36 +3388,36 @@ packages: peerDependencies: react: '>= 16.3.0' - '@stripe/stripe-js@8.1.0': - resolution: {integrity: sha512-bhhi0iSHDFRa2pPVv3WOHC6x/iGEu5AZqIiAvXsT8VOucsEre9gzgsK0jFzbzfGW2eeubF+mCdTTYwNAQCMJKg==} + '@stripe/stripe-js@8.2.0': + resolution: {integrity: sha512-CSfD8HO5lKCEklhkV/WjusWqiU4j8JQl7X69CfslESmkUQ+E9/clmzuUbYnEnvNaFQRbYvryfkht/SpirGb2iA==} engines: {node: '>=12.16'} - '@supabase/auth-js@2.76.1': - resolution: {integrity: sha512-bxmcgPuyjTUBg7+jAohJ15TDh3ph4hXcv7QkRsQgnIpszurD5LYaJPzX638ETQ8zDL4fvHZRHfGrcmHV8C91jA==} + '@supabase/auth-js@2.77.0': + resolution: {integrity: sha512-IRxyj2l46EutSX7AbGkHA7LSmrgqnXjPfKouBlGT6NqS1YOm+jMMwfdhf6zP5EZ4giUfdt2u+yHIBgyXU/LEtg==} - '@supabase/functions-js@2.76.1': - resolution: {integrity: sha512-+zJym/GC1sofm5QYKGxHSszCpMW4Ao2dj/WC3YlffAGuIlIhUtWTJvKsv5q7sWaSKUKdDhGpWhZ2OD++fW5BtQ==} + '@supabase/functions-js@2.77.0': + resolution: {integrity: sha512-MxNW3YoQysbiVEiLAozCTqk1urswtVjAZggeZ5Sw+vJ+u1EvFNmTnirzwTj7M8XjTOMmorheruPmNtfHEwudvw==} '@supabase/node-fetch@2.6.15': resolution: {integrity: sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==} engines: {node: 4.x || >=6.0.0} - '@supabase/postgrest-js@2.76.1': - resolution: {integrity: sha512-QJ1Cwim6L9gzWKP8U4Lgw9x/4lMWkZSVMDRYFCH+vVGitVbtfU885swTiioOjjUe4EYGZm+Xktg90twzSVv6IA==} + '@supabase/postgrest-js@2.77.0': + resolution: {integrity: sha512-Ly8C48x875JcUXBdML7SPRjO1Bpmjo6Sax/Tz4Ij6YU5paCrGKxEYDBVLP2eHKkQvf+LQ+GIbRFF1DorRvyfwQ==} - '@supabase/realtime-js@2.76.1': - resolution: {integrity: sha512-B5Lfmprea2fx2FS7obp4uAWiRUlEa6j9J3+BvvETGp/2LdkSRBaLEJCBylfcZTXk67ajNPX6ppvKvAZsckqXYg==} + '@supabase/realtime-js@2.77.0': + resolution: {integrity: sha512-Ycv2VZ8yTjvlR2NQecGJUlP0Dh4LhF1Y1oZ3IMQcjjTbDriWSQgfc9HSLIQUaY/eTdtfXfyVKOGE+tieWneV8Q==} '@supabase/ssr@0.7.0': resolution: {integrity: sha512-G65t5EhLSJ5c8hTCcXifSL9Q/ZRXvqgXeNo+d3P56f4U1IxwTqjB64UfmfixvmMcjuxnq2yGqEWVJqUcO+AzAg==} peerDependencies: '@supabase/supabase-js': ^2.43.4 - '@supabase/storage-js@2.76.1': - resolution: {integrity: sha512-OJiNT8tocI9tcTjTjv1SBVLabzgEnS1NorZuqivkiJ0gTYmeg2c2PFmqCARhoQ4whF6zR9MVsX/Mtj2oSv4i/w==} + '@supabase/storage-js@2.77.0': + resolution: {integrity: sha512-4+OpVA4U0C4HM1QuINlgjqFxnRsmqPnuurTDN4m6nRanafuqQQ/UtMjdUU57iygBo70IGBlBefZ8gGNWzD1sLg==} - '@supabase/supabase-js@2.76.1': - resolution: {integrity: sha512-dYMh9EsTVXZ6WbQ0QmMGIhbXct5+x636tXXaaxUmwjj3kY1jyBTQU8QehxAIfjyRu1mWGV07hoYmTYakkxdSGQ==} + '@supabase/supabase-js@2.77.0': + resolution: {integrity: sha512-s6OQ8RZ0ioQCwVDh2Tv502XaUQCuRbbjpujYJB1h0JWELRsqjLDsgB5kZUkETPgtTAjJk7z97YPUsRg80PohfA==} '@swc/core-darwin-arm64@1.13.2': resolution: {integrity: sha512-44p7ivuLSGFJ15Vly4ivLJjg3ARo4879LtEBAabcHhSZygpmkP8eyjyWxrH3OxkY1eRZSIJe8yRZPFw4kPXFPw==} @@ -3584,22 +3605,22 @@ packages: resolution: {integrity: sha512-kl0r6N5iIL3t9gGDRAv55VRM3UIyMKVH83esRGq7xBjYsRLe/BeCIN2HqrlJkObUXQMKhy7i8ejuGOn+bDqDBw==} engines: {node: '>=18'} - '@tanstack/devtools-event-bus@0.3.2': - resolution: {integrity: sha512-yJT2As/drc+Epu0nsqCsJaKaLcaNGufiNxSlp/+/oeTD0jsBxF9/PJBfh66XVpYXkKr97b8689mSu7QMef0Rrw==} + '@tanstack/devtools-event-bus@0.3.3': + resolution: {integrity: sha512-lWl88uLAz7ZhwNdLH6A3tBOSEuBCrvnY9Fzr5JPdzJRFdM5ZFdyNWz1Bf5l/F3GU57VodrN0KCFi9OA26H5Kpg==} engines: {node: '>=18'} - '@tanstack/devtools-event-client@0.3.3': - resolution: {integrity: sha512-RfV+OPV/M3CGryYqTue684u10jUt55PEqeBOnOtCe6tAmHI9Iqyc8nHeDhWPEV9715gShuauFVaMc9RiUVNdwg==} + '@tanstack/devtools-event-client@0.3.4': + resolution: {integrity: sha512-eq+PpuutUyubXu+ycC1GIiVwBs86NF/8yYJJAKSpPcJLWl6R/761F1H4F/9ziX6zKezltFUH1ah3Cz8Ah+KJrw==} engines: {node: '>=18'} - '@tanstack/devtools-ui@0.4.3': - resolution: {integrity: sha512-7QshnQIHifURyMwl/qmYm4KDpsf8UJrJ8BUu+YvPx35RJBe2EO5qHPsefzWh6MlG/dUdVMBxP9nPqchESyuNFg==} + '@tanstack/devtools-ui@0.4.4': + resolution: {integrity: sha512-5xHXFyX3nom0UaNfiOM92o6ziaHjGo3mcSGe2HD5Xs8dWRZNpdZ0Smd0B9ddEhy0oB+gXyMzZgUJb9DmrZV0Mg==} engines: {node: '>=18'} peerDependencies: solid-js: '>=1.9.7' - '@tanstack/devtools@0.6.21': - resolution: {integrity: sha512-j8cCmrOz7wu4G4jJ2ZZCo3fIGGDMygSQVPZDtyFylKtKC5i88Hnu6YioODP6I+0mbn9Qvr4eWgPHEONXAViXeA==} + '@tanstack/devtools@0.7.0': + resolution: {integrity: sha512-AlAoCqJhWLg9GBEaoV1g/j+X/WA1aJSWOsekxeuZpYeS2hdVuKAjj04KQLUMJhtLfNl2s2E+TCj7ZRtWyY3U4w==} engines: {node: '>=18'} peerDependencies: solid-js: '>=1.9.7' @@ -3613,8 +3634,8 @@ packages: '@tanstack/form-core@1.24.4': resolution: {integrity: sha512-+eIR7DiDamit1zvTVgaHxuIRA02YFgJaXMUGxsLRJoBpUjGl/g/nhUocQoNkRyfXqOlh8OCMTanjwDprWSRq6w==} - '@tanstack/history@1.133.19': - resolution: {integrity: sha512-Y866qBVVprdQkmO0/W1AFBI8tiQy398vFeIwP+VrRWCOzs3VecxSVzAvaOM4iHfkJz81fFAZMhLLjDVoPikD+w==} + '@tanstack/history@1.133.28': + resolution: {integrity: sha512-B7+x7eP2FFvi3fgd3rNH9o/Eixt+pp0zCIdGhnQbAJjFrlwIKGjGnwyJjhWJ5fMQlGks/E2LdDTqEV4W9Plx7g==} engines: {node: '>=12'} '@tanstack/pacer@0.15.4': @@ -3627,8 +3648,8 @@ packages: '@tanstack/query-devtools@5.90.1': resolution: {integrity: sha512-GtINOPjPUH0OegJExZ70UahT9ykmAhmtNVcmtdnOZbxLwT7R5OmRztR5Ahe3/Cu7LArEmR6/588tAycuaWb1xQ==} - '@tanstack/react-devtools@0.7.7': - resolution: {integrity: sha512-mJ7Ixa+AadGF1b13tLkC8lX0JrM7CrH/SJMOqcCWot9l80KZCWeFnDF1+Ww25QosVbZ1db611LNcgsGz8pv3Zg==} + '@tanstack/react-devtools@0.7.11': + resolution: {integrity: sha512-a2Lmz8x+JoDrsU6f7uKRcyyY+k8mA/n5mb9h7XJ3Fz/y3+sPV9t7vAW1s5lyNkQyyDt6V1Oim99faLthoJSxMw==} engines: {node: '>=18'} peerDependencies: '@types/react': '>=16.8' @@ -3656,47 +3677,47 @@ packages: peerDependencies: react: ^18 || ^19 - '@tanstack/react-router-devtools@1.133.25': - resolution: {integrity: sha512-MidzhULcDABhc7qRz4RAN2ktDsmfAzhTxZMCHDJASmqeDD6NH986I4HEYhEbZoaC+RtfkV1bHt18CFZVn/LBKw==} + '@tanstack/react-router-devtools@1.133.36': + resolution: {integrity: sha512-il+DNzc8Ia54N+HOmIlY10NBk7rp0N7Nyysk8eeC1ZSIXImC3MPchdAspwioE6DI7WfK+MfpTav2m9zoOL8wSQ==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.133.25 + '@tanstack/react-router': ^1.133.36 react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-router-ssr-query@1.133.25': - resolution: {integrity: sha512-XE74D4HvLunA6rXdGQwpSz/pymL5AFGZmtsDA0wtOOZRJ/mqr7OGEHW6ez10NVEff77KpFcBUCbxfq4L3y3WXw==} + '@tanstack/react-router-ssr-query@1.133.36': + resolution: {integrity: sha512-LdQT573vuwbu0WVoFpJbKp98HKkLiHtUeXJM57Zv3K1tyxwKrxhOZBGSRIulFtHDimyMO4ooYBlDaCdj8zBOCA==} engines: {node: '>=12'} peerDependencies: - '@tanstack/query-core': '>=5.66.0' - '@tanstack/react-query': '>=5.66.2' + '@tanstack/query-core': '>=5.90.0' + '@tanstack/react-query': '>=5.90.0' '@tanstack/react-router': '>=1.127.0' react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-router@1.133.25': - resolution: {integrity: sha512-NGm5b8KgCdlNr6H/bhtyqFOGflqrbF7c2GGha9E2Ab8Wt1iajnXK+Ba7Y7+Am+zFVCrF5+AL6NCq+8Z1qKO8KA==} + '@tanstack/react-router@1.133.36': + resolution: {integrity: sha512-pT4d2uEucDQ3SAIQ0pLUw6RUKwkB5pHzpBB6otaoKpO0cAwHkRPi+p59DivuzSANJLHLVEiXyJCCk72EeHMRxA==} engines: {node: '>=12'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-client@1.133.25': - resolution: {integrity: sha512-UWMPJIgG+6E1mFidX18OwVcM/SvM/ne0AQF0CY7eJFo/XL4KbZJXYwK6yanQZs7SATgBarARGsVfUrg8KU1RXQ==} + '@tanstack/react-start-client@1.133.36': + resolution: {integrity: sha512-hNBgpWKbXTYhgw8VbqxHUTz/Nh/Qt/zfmCotz2kydkPbq1dSEALyoiyveVni8bHCTCMFSPRznI3O6yWjQdWJOA==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-server@1.133.26': - resolution: {integrity: sha512-veSeovBI4LOoHXEHI0WQDhJcdgrW6kXvkXvXTD4Zwks8T/0x3NOhzQoY15xk/C7SLgzc7y5Q74+MiYUT5F7FEQ==} + '@tanstack/react-start-server@1.133.36': + resolution: {integrity: sha512-w3QEMR4JlR6Iiks6cqp4vqFuvBmiE6Zkv7qYa2p9QY8LVsUDtejSKrNdDgdk1Io+tiXEEbPqWnZN7eDQqVuzIw==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start@1.133.26': - resolution: {integrity: sha512-1SW61YdxAKUZfLfG1F1VqT5PdppyFlJsXDa3HertIsMbZBYzhNpgmDhcHBTEbe3zIzuiTq1xXS4TjeLxS9czOA==} + '@tanstack/react-start@1.134.0': + resolution: {integrity: sha512-H2aKbmuywNcOrRI5LXiakr2q1r73wFLfPzoVp7DLqyG5kEQ8ntzF4pMPWaX1BQZuAuobG44hEIYwsxRRZmX72A==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' @@ -3709,21 +3730,27 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@tanstack/react-store@0.8.0': + resolution: {integrity: sha512-1vG9beLIuB7q69skxK9r5xiLN3ztzIPfSQSs0GfeqWGO2tGIyInZx0x1COhpx97RKaONSoAb8C3dxacWksm1ow==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@tanstack/react-virtual@3.13.12': resolution: {integrity: sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/router-core@1.133.25': - resolution: {integrity: sha512-u3lBGKsGbt0i66qTBaqMCGPnE9yZrxeMi2Al3ZRaikOmSnTeuxXExbX+QAW4cI6GtFigdI3Ec8KW5M29Uft7Hg==} + '@tanstack/router-core@1.133.36': + resolution: {integrity: sha512-VJ9kFduePsxgjhDW+uKxL6ol9ZpJlaUO2EI9Zmq8AA6uhW/LRg+0/365OZOZaVqNqvx2eKt3MZKHLN+29jd5Uw==} engines: {node: '>=12'} - '@tanstack/router-devtools-core@1.133.25': - resolution: {integrity: sha512-Bz1ASxeoJRzm2K7OTVU0aw5ZsVwA2Q/ugp3HheIAu3UlSG8teLiymu/l9avHFPht+bt5xH5yGkpB2SqhArtndA==} + '@tanstack/router-devtools-core@1.133.36': + resolution: {integrity: sha512-jgXSCfWPLukcjXDf4thpk/0QgLXv61mrvmfh9xc8+xeC5TMeLyz2xBaTghniD2PtdF6eII3vMaTWOpMHj4+cVQ==} engines: {node: '>=12'} peerDependencies: - '@tanstack/router-core': ^1.133.25 + '@tanstack/router-core': ^1.133.36 csstype: ^3.0.10 solid-js: '>=1.9.5' tiny-invariant: ^1.3.3 @@ -3731,16 +3758,16 @@ packages: csstype: optional: true - '@tanstack/router-generator@1.133.25': - resolution: {integrity: sha512-tHEqokiyFhcwZCBu52PYQ+J9zuUNbKuYb/taYjXHKDZRGXhmC+H5raJTucwGmaCh/JFuBNgZ9mq6kmVqwb6RLw==} + '@tanstack/router-generator@1.133.36': + resolution: {integrity: sha512-3+pJBqkm95/zV7INyhbr688lp1PklZT3wtNNwW9oIxmsBiUJg5hqHWh7z4JgP9E+0D0KAwT535wncWUFfMMZwA==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.133.25': - resolution: {integrity: sha512-DgwHoHmL+6qgrM+Fu0fnKINqf0e7u096W/6cwMq33ADtD+LwjQbJ6D8KyL1TscNjOMpp+NrFWJYS/+lspXwnDg==} + '@tanstack/router-plugin@1.133.36': + resolution: {integrity: sha512-y0vttpDRFbniPk2EOS93wxfNA0SqvD/anj6kXTIl/3caW0rvOC4MzMXV09atJ+3jMSOgHFniljKQj/66AY5dZg==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.133.25 + '@tanstack/react-router': ^1.133.36 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' vite-plugin-solid: ^2.11.10 webpack: '>=5.92.0' @@ -3756,11 +3783,11 @@ packages: webpack: optional: true - '@tanstack/router-ssr-query-core@1.133.25': - resolution: {integrity: sha512-VmyqbPPgYx0TBTzPb80oJ6hcvB9jHWvbvfBD1PQSRrLIWVh0vGYTQiT8T2X+GweE2GNdKH0Pe/Gopzkfnelf0Q==} + '@tanstack/router-ssr-query-core@1.133.36': + resolution: {integrity: sha512-ydXTU+sDbwEX5BEaKdgY8Ey2le61vB8Vtp32wqNy1vH50Gpys+kI1Rn6NZ5rrvZ6y/uEmKs1jomcfMWK9e1Niw==} engines: {node: '>=12'} peerDependencies: - '@tanstack/query-core': '>=5.66.0' + '@tanstack/query-core': '>=5.90.0' '@tanstack/router-core': '>=1.127.0' '@tanstack/router-utils@1.133.19': @@ -3771,27 +3798,30 @@ packages: resolution: {integrity: sha512-jyb+Z6umAgZncEAB4OKLJiP8338n17xxxw3tO344gcnYCcqeZ9VAOMq3RVOoBUBDtV2DTLj/LVO62A5vDZ6WJw==} engines: {node: '>=12'} - '@tanstack/start-client-core@1.133.25': - resolution: {integrity: sha512-AJLFhfYuCVWbJd5zks6lhCvJxlbNa/bR1SFqxG7XcY3E4eSAJDjl6ZsghEGkzRZ8dZSRM40MoGj77mrLt4yGqA==} + '@tanstack/start-client-core@1.133.36': + resolution: {integrity: sha512-SrjeR9c/1VzV3FM1Sxk5Pdv1rufrhb2gixerAPQoZhsxzuv/nYYKzplXpmT+Ec3vi5IzGYA4cXhh5F00sGnP0A==} engines: {node: '>=22.12.0'} - '@tanstack/start-plugin-core@1.133.26': - resolution: {integrity: sha512-RqUhBG4bvpunb8kxAMOdB7g/LihDqZnvF+5wVr3F5IHKhu2Va/+vupKabkE9q31XRZJ5nVPNs4nmju7J2cx1tA==} + '@tanstack/start-plugin-core@1.133.37': + resolution: {integrity: sha512-660IX2cpBvXweblYyUfFFFVciP3DhYazBG3c3JI+mbBaNKXd9iCslunzKlWo6bwp90XAFSZzveKoGOBHXUiPQw==} engines: {node: '>=22.12.0'} peerDependencies: vite: '>=7.0.0' - '@tanstack/start-server-core@1.133.26': - resolution: {integrity: sha512-v5gsQb1Ql43zT/dqHtbsw40Q4YyaWw6Ihw7LZl0TBqAxYoPmkZ9AOzporZ8HMew4qeAF+QgHVrT+YahSYEHAkA==} + '@tanstack/start-server-core@1.133.36': + resolution: {integrity: sha512-W8YHCpEpKZ5EZ6dVQ84fRond7CX2r/UUXwR87aLUL8M3GOORTR+HOK/tSWPo/sMjEUlatmFT0ra387rI9J3wyA==} engines: {node: '>=22.12.0'} - '@tanstack/start-storage-context@1.133.25': - resolution: {integrity: sha512-NKhCNq8A1f1crjI99dIOfSR/sE+UpHMacF+NfZQAEV+51bkADE+Ih78NrHaSRSbOmjjFzS62LScvG/2zd/lPlg==} + '@tanstack/start-storage-context@1.133.36': + resolution: {integrity: sha512-onQiqjNQU9txFSTs2TKbxvW3vWMp+utWZEsxgfh9BOZtjYbhl9pM/1HoxX5R/cdi4k2tyX5OUrHGS05bhbhObg==} engines: {node: '>=22.12.0'} '@tanstack/store@0.7.7': resolution: {integrity: sha512-xa6pTan1bcaqYDS9BDpSiS63qa6EoDkPN9RsRaxHuDdVDNntzq3xNwR5YKTU/V3SkSyC9T4YVOPh2zRQN0nhIQ==} + '@tanstack/store@0.8.0': + resolution: {integrity: sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==} + '@tanstack/virtual-core@3.13.12': resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} @@ -3805,94 +3835,97 @@ packages: '@tauri-apps/api@2.9.0': resolution: {integrity: sha512-qD5tMjh7utwBk9/5PrTA/aGr3i5QaJ/Mlt7p8NilQ45WgbifUNPyKWsA63iQ8YfQq6R8ajMapU+/Q8nMcPRLNw==} - '@tauri-apps/cli-darwin-arm64@2.9.1': - resolution: {integrity: sha512-sdwhtsE/6njD0AjgfYEj1JyxZH4SBmCJSXpRm6Ph5fQeuZD6MyjzjdVOrrtFguyREVQ7xn0Ujkwvbo01ULthNg==} + '@tauri-apps/cli-darwin-arm64@2.9.2': + resolution: {integrity: sha512-g1OtCXydOZFYRUEAyGYdJ2lLaE3l5jk8o+Bro8y2WOLwBLtbWjBoJIVobOKFanfjG/Xr8H/UA+umEVILPhMc2A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tauri-apps/cli-darwin-x64@2.9.1': - resolution: {integrity: sha512-c86g+67wTdI4TUCD7CaSd/13+oYuLQxVST4ZNJ5C+6i1kdnU3Us1L68N9MvbDLDQGJc9eo0pvuK6sCWkee+BzA==} + '@tauri-apps/cli-darwin-x64@2.9.2': + resolution: {integrity: sha512-nHHIY33noUmMOyFwAJz0xQyrYIXU+bae8MNos4TGsTo491YWAF2uzr6iW+Bq0N530xDcbe7EyRvDHgK43RmmVw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tauri-apps/cli-linux-arm-gnueabihf@2.9.1': - resolution: {integrity: sha512-IrB3gFQmueQKJjjisOcMktW/Gh6gxgqYO419doA3YZ7yIV5rbE8ZW52Q3I4AO+SlFEyVYer5kpi066p0JBlLGw==} + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.2': + resolution: {integrity: sha512-Dq17LBdSuzf+fWOKMIyiSao+Fcq4FiQwYYlx3Nk8oafDINc8sVBjC5gv2xp18KzYhk9teSWfmDpD1sj+D3t7uw==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tauri-apps/cli-linux-arm64-gnu@2.9.1': - resolution: {integrity: sha512-Ke7TyXvu6HbWSkmVkFbbH19D3cLsd117YtXP/u9NIvSpYwKeFtnbpirrIUfPm44Q+PZFZ2Hvg8X9qoUiAK0zKw==} + '@tauri-apps/cli-linux-arm64-gnu@2.9.2': + resolution: {integrity: sha512-Pxj5k29Rxj9xEht4gdE744t5HLXTwBojkjYDXXyJ3mE+BEg9hFX5WkStg7OkyZwH60u8NSkDSMpo7MJTH9srmA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tauri-apps/cli-linux-arm64-musl@2.9.1': - resolution: {integrity: sha512-sGvy75sv55oeMulR5ArwPD28DsDQxqTzLhXCrpU9/nbFg/JImmI7k994YE9fr3V0qE3Cjk5gjLldRNv7I9sjwQ==} + '@tauri-apps/cli-linux-arm64-musl@2.9.2': + resolution: {integrity: sha512-mx82BuD4q3Yj5Zw+LXveZgPaDCnmH2At2LosX1siK77kaD5Ap5FF+FN0V4y+3cwq+Hcrk9AhEUPbHqoNOx1R2g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tauri-apps/cli-linux-riscv64-gnu@2.9.1': - resolution: {integrity: sha512-tEKbJydV3BdIxpAx8aGHW6VDg1xW4LlQuRD/QeFZdZNTreHJpMbJEcdvAcI+Hg6vgQpVpaoEldR9W4F6dYSLqQ==} + '@tauri-apps/cli-linux-riscv64-gnu@2.9.2': + resolution: {integrity: sha512-Ypm1nnr7k+ECC1+JfDcnxROHt6BX8t/4GplxBvdY68BDXtIcBbdhPWDos7MK+3bDmoaA0WSJbW+DUjpfSkyKgw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] - '@tauri-apps/cli-linux-x64-gnu@2.9.1': - resolution: {integrity: sha512-mg5msXHagtHpyCVWgI01M26JeSrgE/otWyGdYcuTwyRYZYEJRTbcNt7hscOkdNlPBe7isScW7PVKbxmAjJJl4g==} + '@tauri-apps/cli-linux-x64-gnu@2.9.2': + resolution: {integrity: sha512-tg85cGIM9PWwsbQg8m3uah3SfoNapgUr4vhWtkqgeTDZOjQuQ2duTwCH4UiM7acBpbZHNzvRrxSFpv0U53TqQQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tauri-apps/cli-linux-x64-musl@2.9.1': - resolution: {integrity: sha512-lFZEXkpDreUe3zKilvnMsrnKP9gwQudaEjDnOz/GMzbzNceIuPfFZz0cR/ky1Aoq4eSvZonPKHhROq4owz4fzg==} + '@tauri-apps/cli-linux-x64-musl@2.9.2': + resolution: {integrity: sha512-xW8qaz9bcwR35W2gIg7fKG9e1Z34idOsGpD2zIPgxlJyF314B/1qie50hbOqt5AbbXHR4iRpxKE4kA2grqMmkg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tauri-apps/cli-win32-arm64-msvc@2.9.1': - resolution: {integrity: sha512-ejc5RAp/Lm1Aj0EQHaT+Wdt5PHfdgQV5hIDV00MV6HNbIb5W4ZUFxMDaRkAg65gl9MvY2fH396riePW3RoKXDw==} + '@tauri-apps/cli-win32-arm64-msvc@2.9.2': + resolution: {integrity: sha512-A1PshB8oHdY7zYOPlLD7Om7/aD9sOUVREd765ElIzYDtptWcALwOP9jb22Wi01vDTqxf98E4ZGIcG2gxr4FhiA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tauri-apps/cli-win32-ia32-msvc@2.9.1': - resolution: {integrity: sha512-fSATtJDc0fNjVB6ystyi8NbwhNFk8i8E05h6KrsC8Fio5eaJIJvPCbC9pdrPl6kkxN1X7fj25ErBbgfqgcK8Fg==} + '@tauri-apps/cli-win32-ia32-msvc@2.9.2': + resolution: {integrity: sha512-AuCi0Vnc4qkXRLCC58das0u45SmXAjqcOjqF324CBKa1Z7jjNJESm0Sc2oc2G2q6f2eAbAfi34s2iJNaJU1hlQ==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@tauri-apps/cli-win32-x64-msvc@2.9.1': - resolution: {integrity: sha512-/JHlOzpUDhjBOO9w167bcYxfJbcMQv7ykS/Y07xjtcga8np0rzUzVGWYmLMH7orKcDMC7wjhheEW1x8cbGma/Q==} + '@tauri-apps/cli-win32-x64-msvc@2.9.2': + resolution: {integrity: sha512-kDoejyfvME/mLkR4VofQnmVPTt/smJvoXuE3xgTbUwcUQKqawM8EyQvxOHQosaJYfQphHi7G0ya8UZo3PlDZig==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tauri-apps/cli@2.9.1': - resolution: {integrity: sha512-kKi2/WWsNXKoMdatBl4xrT7e1Ce27JvsetBVfWuIb6D3ep/Y0WO5SIr70yarXOSWam8NyDur4ipzjZkg6m7VDg==} + '@tauri-apps/cli@2.9.2': + resolution: {integrity: sha512-aGzdVgxQW6WQ7e5nydPZ/30u8HvltHjO3Ytzf1wOxX1N5Yj2TsjKWRb/AWJlB95Huml3k3c/b6s0ijAvlSo9xw==} engines: {node: '>= 10'} hasBin: true - '@tauri-apps/plugin-deep-link@2.4.3': - resolution: {integrity: sha512-yVCZpVG1ZrtfCvE7K5LRSrGqlyPlCrqlKgoREJHnfjyYdDtUhFmZqScOXpL8XL2PizJHDsoahEweuTaUPEokPA==} + '@tauri-apps/plugin-deep-link@2.4.5': + resolution: {integrity: sha512-Zf2RTj1D9IQQ45/jqW8XTKvql24HqlPjcpv0mV/O2jHQkNe11HOTZBVj6IK37qs+MWV7xZzcmazx/QVZnhAwaQ==} - '@tauri-apps/plugin-dialog@2.4.0': - resolution: {integrity: sha512-OvXkrEBfWwtd8tzVCEXIvRfNEX87qs2jv6SqmVPiHcJjBhSF/GUvjqUNIDmKByb5N8nvDqVUM7+g1sXwdC/S9w==} + '@tauri-apps/plugin-dialog@2.4.2': + resolution: {integrity: sha512-lNIn5CZuw8WZOn8zHzmFmDSzg5zfohWoa3mdULP0YFh/VogVdMVWZPcWSHlydsiJhRQYaTNSYKN7RmZKE2lCYQ==} - '@tauri-apps/plugin-http@2.5.2': - resolution: {integrity: sha512-x1mQKHSLDk4mS2S938OTeyk8L7QyLpCrKZCZcjkljGsvTvRMojCvI9SeJ1kaxc7t8xSilkC7WdId8xER9TIGLg==} + '@tauri-apps/plugin-http@2.5.4': + resolution: {integrity: sha512-/i4U/9za3mrytTgfRn5RHneKubZE/dwRmshYwyMvNRlkWjvu1m4Ma72kcbVJMZFGXpkbl+qLyWMGrihtWB76Zg==} - '@tauri-apps/plugin-opener@2.5.0': - resolution: {integrity: sha512-B0LShOYae4CZjN8leiNDbnfjSrTwoZakqKaWpfoH6nXiJwt6Rgj6RnVIffG3DoJiKsffRhMkjmBV9VeilSb4TA==} + '@tauri-apps/plugin-opener@2.5.2': + resolution: {integrity: sha512-ei/yRRoCklWHImwpCcDK3VhNXx+QXM9793aQ64YxpqVF0BDuuIlXhZgiAkc15wnPVav+IbkYhmDJIv5R326Mew==} - '@tauri-apps/plugin-process@2.3.0': - resolution: {integrity: sha512-0DNj6u+9csODiV4seSxxRbnLpeGYdojlcctCuLOCgpH9X3+ckVZIEj6H7tRQ7zqWr7kSTEWnrxtAdBb0FbtrmQ==} + '@tauri-apps/plugin-process@2.3.1': + resolution: {integrity: sha512-nCa4fGVaDL/B9ai03VyPOjfAHRHSBz5v6F/ObsB73r/dA3MHHhZtldaDMIc0V/pnUw9ehzr2iEG+XkSEyC0JJA==} - '@tauri-apps/plugin-store@2.4.0': - resolution: {integrity: sha512-PjBnlnH6jyI71MGhrPaxUUCsOzc7WO1mbc4gRhME0m2oxLgCqbksw6JyeKQimuzv4ysdpNO3YbmaY2haf82a3A==} + '@tauri-apps/plugin-shell@2.3.3': + resolution: {integrity: sha512-Xod+pRcFxmOWFWEnqH5yZcA7qwAMuaaDkMR1Sply+F8VfBj++CGnj2xf5UoialmjZ2Cvd8qrvSCbU+7GgNVsKQ==} + + '@tauri-apps/plugin-store@2.4.1': + resolution: {integrity: sha512-ckGSEzZ5Ii4Hf2D5x25Oqnm2Zf9MfDWAzR+volY0z/OOBz6aucPKEY0F649JvQ0Vupku6UJo7ugpGRDOFOunkA==} '@tauri-apps/plugin-updater@2.9.0': resolution: {integrity: sha512-j++sgY8XpeDvzImTrzWA08OqqGqgkNyxczLD7FjNJJx/uXxMZFz5nDcfkyoI/rCjYuj2101Tci/r/HFmOmoxCg==} @@ -3916,208 +3949,208 @@ packages: '@types/react-dom': optional: true - '@tiptap/core@3.7.2': - resolution: {integrity: sha512-fJwNpTx0aq4UU0HNkxPvPYfNBcTHQ/q5xBUdOB5Mgu6clwGES38jVsNNSudB8g53APUmJIS+2fJbkxl3V+0jww==} + '@tiptap/core@3.9.1': + resolution: {integrity: sha512-qfqeR2WN9qr/3+29ocT7EgEBNP2sLHWwGYOEd++hgYixC3tOY4Juw90z1MUqVEOcUqswPDE1CrBNSgbFAitTDQ==} peerDependencies: - '@tiptap/pm': ^3.7.2 + '@tiptap/pm': ^3.9.1 - '@tiptap/extension-blockquote@3.7.2': - resolution: {integrity: sha512-8rNDh1E1ratex9KicvNNnjJGtF313Kpf5hXHOUcIm8FQwvA/0Tu6jq7r6VgESMyo95R3EmzRpnCYQef+zDm6OQ==} + '@tiptap/extension-blockquote@3.9.1': + resolution: {integrity: sha512-OL0px9tge5SHE6SeMcM6H5Q0aczCPh820nnFGNFH1d6Cr35pKKNyC3rXcUfsbySxsJNz5zetTE5s/oyqUWfM/Q==} peerDependencies: - '@tiptap/core': ^3.7.2 + '@tiptap/core': ^3.9.1 - '@tiptap/extension-bold@3.7.2': - resolution: {integrity: sha512-bwCn9lQEXnEi7LfIx3G/oaH4I0ZapAgrHzLCNJH/tNgRKVWym1H1Oa8PlkiFDbalWOdUkbgeAUqUaIB13k408Q==} + '@tiptap/extension-bold@3.9.1': + resolution: {integrity: sha512-48jgjazCkvQh0sOmiDi8xQQg62o3iGEcZci0Qow3MRGKetVC0aSwmV0VuF4ai3rABPDxrlZbBP2EGq5PBoIfQw==} peerDependencies: - '@tiptap/core': ^3.7.2 + '@tiptap/core': ^3.9.1 - '@tiptap/extension-bubble-menu@3.7.2': - resolution: {integrity: sha512-rCJu/X7sZEYWkOwLO342JP06f4giVBECPzr/SzG/fQdAidPW96eilPk3L82w5j24kS9odTlxSLlFlIf6UZ2b9w==} + '@tiptap/extension-bubble-menu@3.9.1': + resolution: {integrity: sha512-rUV7Q/dLxYX1CS0RqSYIYRXGZ4ePFbmzQlzYsCfGKmTVTMNinJXQnltq92iVXa2/dfgg/iWNS73azPaJ0NP1Bg==} peerDependencies: - '@tiptap/core': ^3.7.2 - '@tiptap/pm': ^3.7.2 + '@tiptap/core': ^3.9.1 + '@tiptap/pm': ^3.9.1 - '@tiptap/extension-bullet-list@3.7.2': - resolution: {integrity: sha512-OHYYXKjmxisLQws0tW8Dz14PcyIJmaed7eypZvIm/R3hxa/7lJY/2EM/Ti5g/w1U8WPBEH1hX3icRtiulserKw==} + '@tiptap/extension-bullet-list@3.9.1': + resolution: {integrity: sha512-NMigWhqpnPgaDz6xZtu13dnRoSqu8muPOzBDEPHlYASqamZQlWJvcPTd+wxngBbjL7cXEp8KChfujhM4xTREnA==} peerDependencies: - '@tiptap/extension-list': ^3.7.2 + '@tiptap/extension-list': ^3.9.1 - '@tiptap/extension-code-block@3.7.2': - resolution: {integrity: sha512-TfixutvvbGCrSSCsfDK/PBm6A5FIzcPTSVDrmmsiAfqldj/Woy1T42dads+wv9SjKG06GlWDwYtDGAk2Uun8NA==} + '@tiptap/extension-code-block@3.9.1': + resolution: {integrity: sha512-wwQ3DFH8hIYI4qNbZA1dOfJ8Y7XPnJIpc5pIENb9JAtTNkR0WbX1hc3g2tbRTxBu9HBqaOQOWygMTufntetNtg==} peerDependencies: - '@tiptap/core': ^3.7.2 - '@tiptap/pm': ^3.7.2 + '@tiptap/core': ^3.9.1 + '@tiptap/pm': ^3.9.1 - '@tiptap/extension-code@3.7.2': - resolution: {integrity: sha512-J8FaCiKJJnHvQiPcbfbUtc5RNmGx/Gui/K5CDMPc17jhCiQ9JhR9idRPREV24Z2t7GujWX7LG6ZDDR82pSns+g==} + '@tiptap/extension-code@3.9.1': + resolution: {integrity: sha512-fNhNDzZ7WQU7MdafH1XruoxCBQdVaUoevnOfH+CtXebbXnSw6LWZ/l9LHTP9Ng3bVijcoloxqtkfBNXinQeouA==} peerDependencies: - '@tiptap/core': ^3.7.2 + '@tiptap/core': ^3.9.1 - '@tiptap/extension-document@3.7.2': - resolution: {integrity: sha512-OrHl402v2FWCUKR1Xi5MTNBAkKYQh7mtpw/WlJDFnk5z1qHLqz4UIcbGilDYzVPrNUZPhA1p3c+V5UUVUFzUfg==} + '@tiptap/extension-document@3.9.1': + resolution: {integrity: sha512-hzeWra07/9tdjwHJAASBlkk3S8urkiQvsRKcdGjEsjhLCzp0sJyuMQKRdOjv3dwBI+SDtEZGj53P2mpJ0KVzXw==} peerDependencies: - '@tiptap/core': ^3.7.2 + '@tiptap/core': ^3.9.1 - '@tiptap/extension-dropcursor@3.7.2': - resolution: {integrity: sha512-79y6M9pJYwqcqBHIWoomfptJp0QB/TP3Y+2NOL09sMNeSdUgmz5pCVObA4H48YMkoB0EcUtux2IUOM66e4nsJA==} + '@tiptap/extension-dropcursor@3.9.1': + resolution: {integrity: sha512-maKd2r95J9HPLGtnHU5x3XP7GIeIIfWACQhumylDtC8SYzce33cygb0Yh8jRzr3GSz39PWW34cQ6+reLhXaPWA==} peerDependencies: - '@tiptap/extensions': ^3.7.2 + '@tiptap/extensions': ^3.9.1 - '@tiptap/extension-floating-menu@3.7.2': - resolution: {integrity: sha512-g19ratrXlplYDS29VLQa1y/IM/ro0UFhSS4fQokiQKkazwnA1ZVnebjw8ERYg5lkMm/hiImqstpgdO0LtoivvQ==} + '@tiptap/extension-floating-menu@3.9.1': + resolution: {integrity: sha512-9T1wkfDsGbm+uMlN9OcwRAefrbAOYxE2hWB+mW2J4qoDl3BZLdFjH/HW11xBHz+sjekDw/4xx+zyDNVwqu1RMA==} peerDependencies: '@floating-ui/dom': ^1.0.0 - '@tiptap/core': ^3.7.2 - '@tiptap/pm': ^3.7.2 + '@tiptap/core': ^3.9.1 + '@tiptap/pm': ^3.9.1 - '@tiptap/extension-gapcursor@3.7.2': - resolution: {integrity: sha512-vCLo2dL2SfeWjh/gJKDiu0/fz6OF7obGTJvHg/yStkoUqlAEiwKoyHP/NXeTGYJMzZzUi0kY9DtTEJdGFvphuQ==} + '@tiptap/extension-gapcursor@3.9.1': + resolution: {integrity: sha512-+POd1gdTU+OOwWN544BoIOBN/WwRKE+WGGwUNY7mmCai9gLDxCXKXkY89yQW5rwzOHdHU/GapgjkSPNTstWG1g==} peerDependencies: - '@tiptap/extensions': ^3.7.2 + '@tiptap/extensions': ^3.9.1 - '@tiptap/extension-hard-break@3.7.2': - resolution: {integrity: sha512-nNDo+5S1yRQ3JkBM+gwpEEVZ/Kw9qWoG/cpShyGYDHo1/y8MgO+VI0kSb/LuBTw7g+jmNXdf+ZaRRI/pXsUihg==} + '@tiptap/extension-hard-break@3.9.1': + resolution: {integrity: sha512-Uc4TjNdwjMp4zUFmmzGYmBicgy5cHNhz6vd0eBZAzWSf3qqTdfER3B91ktM0d7hjhaNc2g6sl45W+PvzSthSwQ==} peerDependencies: - '@tiptap/core': ^3.7.2 + '@tiptap/core': ^3.9.1 - '@tiptap/extension-heading@3.7.2': - resolution: {integrity: sha512-eH/G66FIRlTQz4MhEmlNNNQgVTxhoqlkyFzgeG5aipIplYOdYa5Y6Wl0NF4xqr1jAHGLAK6LaYS4FXp3TE7LyA==} + '@tiptap/extension-heading@3.9.1': + resolution: {integrity: sha512-r3H5nejZ/SYUF9DUbDT2rZS3ZeQkHUNljP7lmI5JdHDrFc5/UrvtkQr+E2mLwmn0xA+8Dwccoc9fPwnTh3YyeA==} peerDependencies: - '@tiptap/core': ^3.7.2 + '@tiptap/core': ^3.9.1 - '@tiptap/extension-highlight@3.7.2': - resolution: {integrity: sha512-+R10j0BaN3J8XeZM/RHIiYNpEHBetTtZQVDsEwmG5QBPzOTItvCc4qNaJjpoCPhkwTd5EQdmW7feUDPsTW+bgw==} + '@tiptap/extension-highlight@3.9.1': + resolution: {integrity: sha512-KAcvZPr5WwPFpIs2ZrxEE8SMxyXeOpxWFb2TZCmolgxp8DJU96IRsExjOmBCFkczqtAk758hE0HuCmHFmejVTQ==} peerDependencies: - '@tiptap/core': ^3.7.2 + '@tiptap/core': ^3.9.1 - '@tiptap/extension-history@3.7.2': - resolution: {integrity: sha512-iAGTUxAr7r+tQ/PtIG94jqTJLy/S/VwE43USfWzXCHvbLn60cPJJG7MTCZxYbd+ZuivZVhEhp3EbzCNmHxjp8A==} + '@tiptap/extension-history@3.9.1': + resolution: {integrity: sha512-5VM6OIapiKsdquGHfnqFVhOpRcy8zf17fwfNbNyCGX5mzuQiltcID+d6QNUnyJxiFAgu84y9fYOA5lL7UPRYhQ==} peerDependencies: - '@tiptap/extensions': ^3.7.2 + '@tiptap/extensions': ^3.9.1 - '@tiptap/extension-horizontal-rule@3.7.2': - resolution: {integrity: sha512-pN+1hJAVVP3uqtpZ5Rm7z5XUB/NGprK6wExJ04xG117E4rTVcaEb1FnMILY3J3A5XbdC3vHX+cblR8mOl1PAMw==} + '@tiptap/extension-horizontal-rule@3.9.1': + resolution: {integrity: sha512-Ar4jRvsQXgE6oUxWGrNrSUXO/Q6yHNjLqdEKXvZw1KeahbHwtgsgDscVSCr8Oi6JS8z9JWfh7Xm2fAqb5Xdgkg==} peerDependencies: - '@tiptap/core': ^3.7.2 - '@tiptap/pm': ^3.7.2 + '@tiptap/core': ^3.9.1 + '@tiptap/pm': ^3.9.1 - '@tiptap/extension-image@3.7.2': - resolution: {integrity: sha512-GlFdoZULF9mEG3tMRqB1DDlyA75NIRHS5NKuoicQTAX9OegiZfTPYRmVOpLNaTunTt8mFL6Wx2Z9x5ZN2WdNBg==} + '@tiptap/extension-image@3.9.1': + resolution: {integrity: sha512-pRKNL6fnp6Uyug9DRe/DK13W5sfz6IAv8RnzW2FG4ejubdyg4K2KS8deubiv+Ltfyo3LLSTy+eNhWCdRRBVN6Q==} peerDependencies: - '@tiptap/core': ^3.7.2 + '@tiptap/core': ^3.9.1 - '@tiptap/extension-italic@3.7.2': - resolution: {integrity: sha512-1tfF37LvKgA5hg09UBgOjdMLNRb1C6keIOBF0r5oHKeWPYOf4z3j5IU9PsFUoOn53XRMb1aiD/TNbGPyoT3Fyw==} + '@tiptap/extension-italic@3.9.1': + resolution: {integrity: sha512-0OTn+ZZcI/9CIDVMQH3byilzIUgfDkX/l5NhWpLeUBlqrGfgt61g5jwkYyy49uuVQfbxHwZHpDptkdnJGrfpkw==} peerDependencies: - '@tiptap/core': ^3.7.2 + '@tiptap/core': ^3.9.1 - '@tiptap/extension-link@3.7.2': - resolution: {integrity: sha512-9K54PxBiDSWAMfICqkb8jcQ6cL7vDAtjTk0zqBw4d+XuaUy0FC9QUdbx7r1Pkbf36K1/ApbvM9a7qpOirWk8Xw==} + '@tiptap/extension-link@3.9.1': + resolution: {integrity: sha512-Q+5uYN8rvC+O00ec5m8mRTm5MZnvtkvhKq6bhgdPnQGggN3PIQ1+OSP0/9wu+leB+Ydk4PZMTPVxMtOhj55hRA==} peerDependencies: - '@tiptap/core': ^3.7.2 - '@tiptap/pm': ^3.7.2 + '@tiptap/core': ^3.9.1 + '@tiptap/pm': ^3.9.1 - '@tiptap/extension-list-item@3.7.2': - resolution: {integrity: sha512-962TFsx4eF5NMyLVhGFGF/btt5j3MipPhDiUsxzBgnlW8o5OonVepb9cDrqpEDQ2/wLvheWnCKuvmG7umasldQ==} + '@tiptap/extension-list-item@3.9.1': + resolution: {integrity: sha512-Z+PHGPNVmRcC+J5qYL9ZQWp7Fq5XRg4EGfmmrYFANQn4UjYK3iushSmB0L0/npJfLdqxMZi+wtymNk7pVw7Zcg==} peerDependencies: - '@tiptap/extension-list': ^3.7.2 + '@tiptap/extension-list': ^3.9.1 - '@tiptap/extension-list-keymap@3.7.2': - resolution: {integrity: sha512-1du9eo+NPIkuRT258yUn9bovhip556aJo/yDtRbswEVNScP1E8y/kFRWvw0HD7/YWcNqok1ZteoSwShWnKAXRQ==} + '@tiptap/extension-list-keymap@3.9.1': + resolution: {integrity: sha512-lX8VxXavya+BsBLi+QOwAMY+rZcGUIA/2XEYr5VFSqs5CHfl9R6exj8B+eHEmlCHg1hcj15DpV+eYfgb1tAHUQ==} peerDependencies: - '@tiptap/extension-list': ^3.7.2 + '@tiptap/extension-list': ^3.9.1 - '@tiptap/extension-list@3.7.2': - resolution: {integrity: sha512-/tYHmEkOGcVweAc9ZgnAXkzua5aJfu7TjZcKTq5fmDt6x9MY1eY1+egS7D9hVR2sUSAC10VgXmYdYPDsKF3p2g==} + '@tiptap/extension-list@3.9.1': + resolution: {integrity: sha512-nqWP4GEWKUtlh2fOZcw7mHv73TFCstSfqymnwIa7bWGpGO3fmRnEiow/X6TeKC9MeOasNvEyaHgaYefnzbaANg==} peerDependencies: - '@tiptap/core': ^3.7.2 - '@tiptap/pm': ^3.7.2 + '@tiptap/core': ^3.9.1 + '@tiptap/pm': ^3.9.1 - '@tiptap/extension-mention@3.7.2': - resolution: {integrity: sha512-y8ldoGItWii6DY+db37BqdmHIbwrIV7b7Lz0uI3lhb3tNNkjaa84XRTUK7mySXrkzp/FMvw8MXCTUF44aQdFZQ==} + '@tiptap/extension-mention@3.9.1': + resolution: {integrity: sha512-JF+QV2OMlx9LMOaBTEiHcaR3IwwwIX9QB4ddDGVRxWAZJZzbHpvn4j8MEDXtsnLNe+RfX5iGI7ggG+FCCL60LA==} peerDependencies: - '@tiptap/core': ^3.7.2 - '@tiptap/pm': ^3.7.2 - '@tiptap/suggestion': ^3.7.2 + '@tiptap/core': ^3.9.1 + '@tiptap/pm': ^3.9.1 + '@tiptap/suggestion': ^3.9.1 - '@tiptap/extension-ordered-list@3.7.2': - resolution: {integrity: sha512-Tu61/JXh1RRd3Kb+s7A7jmpnB+w1pqGSRfMXBtYHDHDIGyXu255ru7soX44lJfHGq/zYcTFSHGSsi8o23QONJg==} + '@tiptap/extension-ordered-list@3.9.1': + resolution: {integrity: sha512-EOq7D/aX8xFrLcGZnGMxWWHlwZWfuVjwTSqjtyPJ6voYTzgfkbsvAbx1tGTwOMK4dk1S9wno6QHVj1ifzzBJcQ==} peerDependencies: - '@tiptap/extension-list': ^3.7.2 + '@tiptap/extension-list': ^3.9.1 - '@tiptap/extension-paragraph@3.7.2': - resolution: {integrity: sha512-HmDuAixTcvP4A/v6OLkh/C6nB86i7/DRNswBf/Udak8TgWUIcSUK0iActxxm5+B3MZTSf3U87JzyI6IeuElLIQ==} + '@tiptap/extension-paragraph@3.9.1': + resolution: {integrity: sha512-1p/teor132DpJoc8krgSRH6tdgA+0VysUAGfH7Cqq177bi6A0QFC1tF1reBdEmUg5dFrVs4sAIKdIbS6ayw0Hg==} peerDependencies: - '@tiptap/core': ^3.7.2 + '@tiptap/core': ^3.9.1 - '@tiptap/extension-placeholder@3.7.2': - resolution: {integrity: sha512-YUr1rlxkgEBQDsMLpU8ruA4Uet37kXvwwFwIbDgaFd4NpfAD0fvX2zmPhHIBzsdH3e4V6eNp6IkmoYCWvugAAA==} + '@tiptap/extension-placeholder@3.9.1': + resolution: {integrity: sha512-wiOqlH3t7VEhYUwMDwYSIKhlAkV7v1Hpwz/vsDptHlQfGgwzeRBljY63iUL5M7BIXk6AaI3gtX8wlIa+mcrTiw==} peerDependencies: - '@tiptap/extensions': ^3.7.2 + '@tiptap/extensions': ^3.9.1 - '@tiptap/extension-strike@3.7.2': - resolution: {integrity: sha512-I1G+4vZbCBTpAMmyVwaO8cLBJgXEf1DyEzc0B+HhTJiBa9qA9OKgRQEGFgisxu1kggjbzB6+d0+taHfjsZC1SQ==} + '@tiptap/extension-strike@3.9.1': + resolution: {integrity: sha512-CiprEfK1daPMQDKlnqEXpsJRIu2VepMVTiOwx1H/gV4Ug/pDE06fgPWvI0XV03mN2/+d9sDWpF5gSqIV5ZtVjw==} peerDependencies: - '@tiptap/core': ^3.7.2 + '@tiptap/core': ^3.9.1 - '@tiptap/extension-task-item@3.7.2': - resolution: {integrity: sha512-idfQUeMm1wxJBZMe52YdGnQ/4PI9H6nKL9TxlvqqXDVKD8XHrGguI/9OSnPsDLN/Yqc4tzXFnPH+8NkL7esdYQ==} + '@tiptap/extension-task-item@3.9.1': + resolution: {integrity: sha512-fFvDzo1htLlcnD92jmfKEfnT2V8oQHNzDxRwEH1FuHE7b3Pk9TWuVZ7selFkG2ULc6KGMMPHahT5xbKOn2iapQ==} peerDependencies: - '@tiptap/extension-list': ^3.7.2 + '@tiptap/extension-list': ^3.9.1 - '@tiptap/extension-task-list@3.7.2': - resolution: {integrity: sha512-6ZdSiHeS69iuGkWE1DFhVtC1xwokWtqtQuEJU6Mlh7g+UvEVEn+QGAjUXzUWPqFHjlXUvmTvhYOeqMjKL/FzVQ==} + '@tiptap/extension-task-list@3.9.1': + resolution: {integrity: sha512-WNLbtHTLn6cRvp5PGL9QPzu15HUdc2/EDahDX6CWHP+uzGvjoDbmDCPVg3aX2hphinE8GOq68OYJTvSazJWZrw==} peerDependencies: - '@tiptap/extension-list': ^3.7.2 + '@tiptap/extension-list': ^3.9.1 - '@tiptap/extension-text@3.7.2': - resolution: {integrity: sha512-sKaeGYNP1+bAe2rvmzWLW5qH9DsSFOJlOUEOFchR0OX0rC7bbGS6/KuyAq0w6UkL+cMJnDyAbv3KeD2WEA192w==} + '@tiptap/extension-text@3.9.1': + resolution: {integrity: sha512-giNTcXxG2DP/B5xU8wNM9d441f6FNMYCkbW6bUtjg3USLUWazYmEvp/F6vJ2wa4PSnahH+mNiiylUi2imTnzDg==} peerDependencies: - '@tiptap/core': ^3.7.2 + '@tiptap/core': ^3.9.1 - '@tiptap/extension-typography@3.7.2': - resolution: {integrity: sha512-2yW3gRVm+9G7INEFj9jaL5otCw7I/271VJW25PNYNh3ERtV54rO0UjfSykMSqu70OkNzGQtYE7nixPGXpOrulQ==} + '@tiptap/extension-typography@3.9.1': + resolution: {integrity: sha512-LaVynluqzlljqwUymdHSfYUQSHPMQJt7D3OK62NrHk/gWfQsPL6zNd9yijZL/v0nFf0+7/i7Br6a0PMFICsQaA==} peerDependencies: - '@tiptap/core': ^3.7.2 + '@tiptap/core': ^3.9.1 - '@tiptap/extension-underline@3.7.2': - resolution: {integrity: sha512-GDpUZllTD7uIdHjTzYJ6i4jUgCeviW40SCpLVVv1xH0gj1t1xu0Rnxmk+bXkF2XNe8jPXkMCgYNr6DR6eO8roQ==} + '@tiptap/extension-underline@3.9.1': + resolution: {integrity: sha512-0TmC2gR+VAUvqhJvdHamqTcwC+sBo3uO0X7A45xpWuECUlBFD22VJB8aQg892FyfsRGxIuPFaAS5W7WaLGp9Tw==} peerDependencies: - '@tiptap/core': ^3.7.2 + '@tiptap/core': ^3.9.1 - '@tiptap/extensions@3.7.2': - resolution: {integrity: sha512-FaToSdU9fhQk2swkaXrAQNgdaE0dwLbUHcvilW5F4xTpQfZ3J535u5U2TUYf+f9KKSV5fTmD4QGNY9qxY7ihTg==} + '@tiptap/extensions@3.9.1': + resolution: {integrity: sha512-cFo3zsuqHvOo7wtUJ8+0wxdXq4L2iIupRJ3yjWKQ8q1Ajb6WYHXxiH4Q1rhZP6qHKdDZTrj/KP6YvadXZaZ8kw==} peerDependencies: - '@tiptap/core': ^3.7.2 - '@tiptap/pm': ^3.7.2 + '@tiptap/core': ^3.9.1 + '@tiptap/pm': ^3.9.1 - '@tiptap/markdown@3.7.2': - resolution: {integrity: sha512-0cdCYYHdBDXcwjZsTOSySbdHQuHZct6nxvcp4dSVpP25kbZL3ONSJvLY5Nsy3rkXlmhk9qbyFwsexGiSIdFy8Q==} + '@tiptap/markdown@3.9.1': + resolution: {integrity: sha512-9RyqD29Cs1DiVTYZp6nmWH3zRqCZpWvCKyBvf1rnu18vStfLBds+6Dx+akA6OpFtJwD/2rFqkTjCTfhKlBRNkQ==} peerDependencies: - '@tiptap/core': ^3.7.2 - '@tiptap/pm': ^3.7.2 + '@tiptap/core': ^3.9.1 + '@tiptap/pm': ^3.9.1 - '@tiptap/pm@3.7.2': - resolution: {integrity: sha512-i2fvXDapwo/TWfHM6STYEbkYyF3qyfN6KEBKPrleX/Z80G5bLxom0gB79TsjLNxTLi6mdf0vTHgAcXMG1avc2g==} + '@tiptap/pm@3.9.1': + resolution: {integrity: sha512-9GnmyMgC0sZYxqgmoZ1ULETl+J+IRC2noG2+bVYHjxeQn3G3+R5W/APKmIA1DDWG1ShY1LP/htHlrCWswYMozA==} - '@tiptap/react@3.7.2': - resolution: {integrity: sha512-tka4ioSmsGI4TyGZ7jAUoIw8t8DVjr1It0B38vZVLqg8M/ZFgR1NkF50TJ6qAkhy8Uz12AO50so0v79tV2pmEA==} + '@tiptap/react@3.9.1': + resolution: {integrity: sha512-mT+aaZc5wkrIsCB3kO6cz1HHDH6Bp7lQHTCnwq4kvilvRewVUaAX2qUXaVPzTLUixXFwO9ugQLdaDcY7CdSHKw==} peerDependencies: - '@tiptap/core': ^3.7.2 - '@tiptap/pm': ^3.7.2 + '@tiptap/core': ^3.9.1 + '@tiptap/pm': ^3.9.1 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 '@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@3.7.2': - resolution: {integrity: sha512-43GwI+2Mtc/ci7J4eJOE02wZxp5KIsDTMMb0peNksPcEGaURGdDhav9zbAW24NRjRxU7Auk/zaQu9O8+ZE0v0A==} + '@tiptap/starter-kit@3.9.1': + resolution: {integrity: sha512-qnrb02VioVb1/MJyzMUw5+73/uA5GNtSBiA+n1BX36o5aCq51zZajU0z7Nm/9+JgHRFm0rlPDP0rFhmvxQ+vrg==} - '@tiptap/suggestion@3.7.2': - resolution: {integrity: sha512-CYmIMeLqeGBotl7+4TrnGux/ov9IJoWTUQN/JcHp0aOoN3z8c/dQ6cziXXknr51jGHSdVYMWEyamLDZfcaGC1w==} + '@tiptap/suggestion@3.9.1': + resolution: {integrity: sha512-+fB91280PI11vWlEAY9ny0W05r+MCQKWq2FhhZzPq1no92V2G9PC7HH7VX8rpkHaipdh1j++4v3UNnH37JmEAQ==} peerDependencies: - '@tiptap/core': ^3.7.2 - '@tiptap/pm': ^3.7.2 + '@tiptap/core': ^3.9.1 + '@tiptap/pm': ^3.9.1 '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -4297,14 +4330,14 @@ packages: '@types/mysql@2.15.27': resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} - '@types/node@20.19.23': - resolution: {integrity: sha512-yIdlVVVHXpmqRhtyovZAcSy0MiPcYWGkoO4CGe/+jpP0hmNuihm4XhHbADpK++MsiLHP5MVlv+bcgdF99kSiFQ==} + '@types/node@20.19.24': + resolution: {integrity: sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==} - '@types/node@22.18.12': - resolution: {integrity: sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog==} + '@types/node@22.18.13': + resolution: {integrity: sha512-Bo45YKIjnmFtv6I1TuC8AaHBbqXtIo+Om5fE4QiU1Tj8QR/qt+8O3BAtOimG5IFmwaWiPmB3Mv3jtYzBA4Us2A==} - '@types/node@24.9.1': - resolution: {integrity: sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==} + '@types/node@24.9.2': + resolution: {integrity: sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -4338,8 +4371,8 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/turndown@5.0.5': - resolution: {integrity: sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w==} + '@types/turndown@5.0.6': + resolution: {integrity: sha512-ru00MoyeeouE5BX4gRL+6m/BsDfbRayOskWqUvh7CLGW+UXxHQItqALa38kKnOiZPqJrtzJUgAC2+F0rL1S4Pg==} '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -4384,8 +4417,8 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitejs/plugin-react@5.0.4': - resolution: {integrity: sha512-La0KD0vGkVkSk6K+piWDKRUyg8Rl5iAIKRMH0vMJI0Eg47bq1eOxmoObAaQG37WMW9MSyk7Cs8EIWwJC1PtzKA==} + '@vitejs/plugin-react@5.1.0': + resolution: {integrity: sha512-4LuWrg7EKWgQaMJfnN+wcmbAW+VSsCmqGohftWjuct47bv8uE4n/nPpq4XjJPsxgq00GGG5J8dvBczp8uxScew==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -4425,8 +4458,8 @@ packages: react: ^18.2.0 || ^19.0.0 wavesurfer.js: '>=7.7.14' - '@xstate/store@3.11.1': - resolution: {integrity: sha512-IneCkipaR1FCl6eW+mLeAtjZw99l/nnKQyF9u9Pmy/Jm/wo1gWrBQcZqkmZ+ea6iQ/+GFzsO3LVGYh16fBZKtA==} + '@xstate/store@3.11.2': + resolution: {integrity: sha512-AleJBq1k2UMiDEslIahAQgQKjLHWJERVKbVqw+ZBnyP3GsNuz05K4RugTHGkJBF5MpcB5xwlRRFcjABRoiF7mQ==} peerDependencies: react: ^18.2.0 || ^19.0.0 solid-js: ^1.7.6 @@ -4472,15 +4505,14 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ahooks@3.9.5: - resolution: {integrity: sha512-TrjXie49Q8HuHKTa84Fm9A+famMDAG1+7a9S9Gq6RQ0h90Jgqmiq3CkObuRjWT/C4d6nRZCw35Y2k2fmybb5eA==} - engines: {node: '>=18'} + ahooks@3.9.6: + resolution: {integrity: sha512-Mr7f05swd5SmKlR9SZo5U6M0LsL4ErweLzpdgXjA1JPmnZ78Vr6wzx0jUtvoxrcqGKYnX0Yjc02iEASVxHFPjQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - ai@5.0.78: - resolution: {integrity: sha512-ec77fmQwJGLduswMrW4AAUGSOiu8dZaIwMmWHHGKsrMUFFS6ugfkTyx0srtuKYHNRRLRC2dT7cPirnUl98VnxA==} + ai@5.0.82: + resolution: {integrity: sha512-wmZZfsU40qB77umrcj3YzMSk6cUP5gxLXZDPfiSQLBLegTVXPUdSJC603tR7JB5JkhBDzN5VLaliuRKQGKpUXg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -4600,8 +4632,8 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - atomically@2.0.3: - resolution: {integrity: sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==} + atomically@2.1.0: + resolution: {integrity: sha512-+gDffFXRW6sl/HCwbta7zK4uNqbPjv4YJEAdz7Vu+FLQHe77eZ4bvbJGi4hE0QPeJlMYMA3piXEr1UL3dAwx7Q==} attr-accept@2.2.5: resolution: {integrity: sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==} @@ -4651,8 +4683,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.20: - resolution: {integrity: sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==} + baseline-browser-mapping@2.8.21: + resolution: {integrity: sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==} hasBin: true bidi-js@1.0.3: @@ -5192,8 +5224,8 @@ packages: resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} engines: {node: '>=12'} - dagre-d3-es@7.0.11: - resolution: {integrity: sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==} + dagre-d3-es@7.0.13: + resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==} data-urls@6.0.0: resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} @@ -5337,8 +5369,8 @@ packages: resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} - drizzle-kit@0.31.5: - resolution: {integrity: sha512-+CHgPFzuoTQTt7cOYCV6MOw2w8vqEn/ap1yv4bpZOWL03u7rlVRQhUY0WYT3rHsgVTXwYQDZaSUJSQrMBUKuWg==} + drizzle-kit@0.31.6: + resolution: {integrity: sha512-/B4e/4pwnx25QwD5xXgdpo1S+077a2VZdosXbItE/oNmUgQwZydGDz9qJYmnQl/b+5IX0rLfwRhrPnroGtrg8Q==} hasBin: true drizzle-orm@0.44.7: @@ -5463,8 +5495,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.240: - resolution: {integrity: sha512-OBwbZjWgrCOH+g6uJsA2/7Twpas2OlepS9uvByJjR2datRDuKGYeD+nP8lBBks2qnB7bGJNHDUx7c/YLaT3QMQ==} + electron-to-chromium@1.5.243: + resolution: {integrity: sha512-ZCphxFW3Q1TVhcgS9blfut1PX8lusVi2SvXQgmEEnK4TCmE1JhH2JkjJN+DNt0pJJwfBri5AROBnz2b/C+YU9g==} embla-carousel-react@8.6.0: resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==} @@ -6010,8 +6042,8 @@ packages: peerDependencies: hono: ^4.1.1 - hono@4.10.2: - resolution: {integrity: sha512-p6fyzl+mQo6uhESLxbF5WlBOAJMDh36PljwlKtP5V1v09NxlqGru3ShK+4wKhSuhuYf8qxMmrivHOa/M7q0sMg==} + hono@4.10.4: + resolution: {integrity: sha512-YG/fo7zlU3KwrBL5vDpWKisLYiM+nVstBQqfr7gCPbSYURnNEP9BDxEMz8KfsDR9JX0lJWDRNc6nXX31v7ZEyg==} engines: {node: '>=16.9.0'} hookified@1.12.2: @@ -6046,8 +6078,8 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - iconify-icon@3.0.1: - resolution: {integrity: sha512-M3/kH3C+e/ufhmQuOSYSb1Ri1ImJ+ZEQYcVRMKnlSc8Nrdoy+iY9YvFnplX8t/3aCRuo5wN4RVPtCSHGnbt8dg==} + iconify-icon@3.0.2: + resolution: {integrity: sha512-DYPAumiUeUeT/GHT8x2wrAVKn1FqZJqFH0Y5pBefapWRreV1BBvqBVMb0020YQ2njmbR59r/IathL2d2OrDrxA==} iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} @@ -6057,8 +6089,8 @@ packages: resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} engines: {node: '>=0.10.0'} - immer@10.1.3: - resolution: {integrity: sha512-tmjF/k8QDKydUlm3mZU+tjM6zeq9/fFpPqH9SzWmBnVVKsPBg/V66qsMwb3/Bo90cgUN+ghdVBess+hPsxUyRw==} + immer@10.2.0: + resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} @@ -6648,8 +6680,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - mermaid@11.12.0: - resolution: {integrity: sha512-ZudVx73BwrMJfCFmSSJT84y6u5brEoV8DOItdHomNLz32uBjNrelm7mg95X7g+C6UoQH/W6mBLGDEDv73JdxBg==} + mermaid@11.12.1: + resolution: {integrity: sha512-UlIZrRariB11TY1RtTgUWp65tphtBv4CSq7vyS2ZZ2TgoMjs2nloq+wFqxiwcxlhHUvs7DPGgMjs2aeQxz5h9g==} micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -6819,8 +6851,8 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - minimatch@10.0.3: - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} minimatch@3.1.2: @@ -6955,8 +6987,8 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.26: - resolution: {integrity: sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} noms@0.0.0: resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} @@ -7477,8 +7509,8 @@ packages: react: '>=16.11.0' react-dom: '>=16.11.0' - rc-field-form@2.7.0: - resolution: {integrity: sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==} + rc-field-form@2.7.1: + resolution: {integrity: sha512-vKeSifSJ6HoLaAB+B8aq/Qgm8a3dyxROzCtKNCsBQgiverpc4kWDQihoUwzUj+zNWJOykwSY4dNX3QrGwtVb9A==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -7776,6 +7808,10 @@ packages: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -7982,8 +8018,8 @@ packages: rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} - rou3@0.7.8: - resolution: {integrity: sha512-21X/el5fdOaEsqwl3an/d9kpZ8hshVIyrwFCpsoleJ4ccAGRbN+PVoxyXzWXkHDxfMkVnLe4yzx+imz2qoem2Q==} + rou3@0.7.9: + resolution: {integrity: sha512-+JM7c8swGkoXkWRkIz7qpYN9Bls7Rj/vuSGaxtoKHIe8Ba1ci+mXnqzqtJFrXSbvEazNL9v83P2RiXae9NSbfQ==} roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} @@ -8105,8 +8141,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@3.13.0: - resolution: {integrity: sha512-aZW4l8Og16CokuCLf8CF8kq+KK2yOygapU5m3+hoGw0Mdosc6fPitjM+ujYarppj5ZIKGyPDPP1vqmQhr+5/0g==} + shiki@3.14.0: + resolution: {integrity: sha512-J0yvpLI7LSig3Z3acIuDLouV5UCKQqu8qOArwMx+/yPVC3WRMgrP67beaG8F+j4xfEWE0eVC4GeBCIXeOPra1g==} shimmer@1.2.1: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} @@ -8259,8 +8295,8 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - stripe@19.1.0: - resolution: {integrity: sha512-FjgIiE98dMMTNssfdjMvFdD4eZyEzdWAOwPYqzhPRNZeg9ggFWlPXmX1iJKD5pPIwZBaPlC3SayQQkwsPo6/YQ==} + stripe@19.2.0: + resolution: {integrity: sha512-strzN8luMGMC1LEleGKg7pJGXFx0kSS4y/uSjK8yPQV9SUBMtJVAp/v8XMQLRnMbXaSaWLrIaHcMlKcsizdRDQ==} engines: {node: '>=16'} peerDependencies: '@types/node': '>=16' @@ -8268,8 +8304,11 @@ packages: '@types/node': optional: true - stubborn-fs@1.2.5: - resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} + stubborn-fs@2.0.0: + resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} + + stubborn-utils@1.0.1: + resolution: {integrity: sha512-bwtct4FpoH1eYdSMFc84fxnYynWwsy2u0joj94K+6caiPnjZIpwTLHT2u7CFAS0GumaBZVB5Y2GkJ46mJS76qg==} style-to-js@1.1.18: resolution: {integrity: sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==} @@ -8357,17 +8396,17 @@ packages: tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - tinybase@6.7.1: - resolution: {integrity: sha512-Y6KzQX4j8PFisFc7gnrlB5A2ZJzEwjCW8Eq3QYAHQzZFM1TOj2zWjPrsl1W/s3c9JSjUsfD8tsKw6a91qn0IbA==} + tinybase@6.7.2: + resolution: {integrity: sha512-2ufO+vqyhGu93IkYZgtzr3S7O7/e2uEN2o+FpZ/j1h2ZS8VpKllbgxP2pcL/k/fK3kChdpu3nUvyHldcZH9epQ==} peerDependencies: '@automerge/automerge-repo': ^1.2.1 - '@cloudflare/workers-types': ^4.20251011.0 - '@electric-sql/pglite': ^0.3.10 + '@cloudflare/workers-types': ^4.20251014.0 + '@electric-sql/pglite': ^0.3.11 '@libsql/client': ^0.15.15 '@powersync/common': ^1.40.0 '@sqlite.org/sqlite-wasm': ^3.50.4-build1 '@vlcn.io/crsqlite-wasm': ^0.16.0 - bun: ^1.3.0 + bun: ^1.3.1 electric-sql: ^0.12.1 expo: ^54.0.10 expo-sqlite: ^16.0.8 @@ -8376,7 +8415,7 @@ packages: postgres: ^3.4.7 react: ^19.0.0 react-dom: ^19.0.0 - react-native-mmkv: 3.3.0 + react-native-mmkv: 4.0.0 react-native-sqlite-storage: ^6.0.1 sqlite3: ^5.1.7 ws: ^8.18.3 @@ -8609,8 +8648,8 @@ packages: resolution: {integrity: sha512-5c9Fdsr9qfpT3hA0EyYSFRZj1dVVsb6KIWubA9JBYZ/9ZEAijgUEae0BBR/Xl/wekt4w65/lYLTFaP3JmwSO8w==} hasBin: true - turndown@7.2.1: - resolution: {integrity: sha512-7YiPJw6rLClQL3oUKN3KgMaXeJJ2lAyZItclgKDurqnH61so4k4IH/qwmMva0zpuJc/FhRExBBnk7EbeFANlgQ==} + turndown@7.2.2: + resolution: {integrity: sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ==} type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} @@ -8923,8 +8962,8 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} - wavesurfer.js@7.11.0: - resolution: {integrity: sha512-LOGdIBIKv/roYuQYClhoqhwbIdQL1GfobLnS2vx0heoLD9lu57OUHWE2DIsCNXBvCsmmbkUvJq9W8bPLPbikGw==} + wavesurfer.js@7.11.1: + resolution: {integrity: sha512-8Q+wwItpjJAlhQ7crQLtKwgfbqqczm5/wx+76K4PptP+MBAjB0OA78+A9OuLnULz/8GpAQ+fKM6s81DonEO0Sg==} wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -8966,8 +9005,8 @@ packages: whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - when-exit@2.1.4: - resolution: {integrity: sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==} + when-exit@2.1.5: + resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} @@ -8987,8 +9026,8 @@ packages: engines: {node: '>=16'} hasBin: true - wrangler@4.45.0: - resolution: {integrity: sha512-2qM6bHw8l7r89Z9Y5A7Wn4L9U+dFoLjYgEUVpqy7CcmXpppL3QIYqU6rU5lre7/SRzBuPu/H93Vwfh538gZ3iw==} + wrangler@4.45.2: + resolution: {integrity: sha512-+G24gD+Rh7iBus5QiVBhNgSLzyAiyuZSm+3Ih5li8+PEA+gosAXfDSZlNZwsVmXd8VJTjq+BR4vhUiruQRWgTw==} engines: {node: '>=18.0.0'} hasBin: true peerDependencies: @@ -9144,67 +9183,67 @@ packages: snapshots: - '@ai-sdk/amazon-bedrock@3.0.47(zod@4.1.12)': + '@ai-sdk/amazon-bedrock@3.0.49(zod@4.1.12)': dependencies: - '@ai-sdk/anthropic': 2.0.37(zod@4.1.12) + '@ai-sdk/anthropic': 2.0.39(zod@4.1.12) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + '@ai-sdk/provider-utils': 3.0.14(zod@4.1.12) '@smithy/eventstream-codec': 4.2.3 '@smithy/util-utf8': 4.2.0 aws4fetch: 1.0.20 zod: 4.1.12 - '@ai-sdk/anthropic@2.0.37(zod@4.1.12)': + '@ai-sdk/anthropic@2.0.39(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + '@ai-sdk/provider-utils': 3.0.14(zod@4.1.12) zod: 4.1.12 - '@ai-sdk/azure@2.0.54(zod@4.1.12)': + '@ai-sdk/azure@2.0.59(zod@4.1.12)': dependencies: - '@ai-sdk/openai': 2.0.53(zod@4.1.12) + '@ai-sdk/openai': 2.0.58(zod@4.1.12) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + '@ai-sdk/provider-utils': 3.0.14(zod@4.1.12) zod: 4.1.12 - '@ai-sdk/gateway@2.0.1(zod@4.1.12)': + '@ai-sdk/gateway@2.0.3(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + '@ai-sdk/provider-utils': 3.0.14(zod@4.1.12) '@vercel/oidc': 3.0.3 zod: 4.1.12 - '@ai-sdk/google-vertex@3.0.53(zod@4.1.12)': + '@ai-sdk/google-vertex@3.0.55(zod@4.1.12)': dependencies: - '@ai-sdk/anthropic': 2.0.37(zod@4.1.12) - '@ai-sdk/google': 2.0.23(zod@4.1.12) + '@ai-sdk/anthropic': 2.0.39(zod@4.1.12) + '@ai-sdk/google': 2.0.25(zod@4.1.12) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + '@ai-sdk/provider-utils': 3.0.14(zod@4.1.12) google-auth-library: 9.15.1 zod: 4.1.12 transitivePeerDependencies: - encoding - supports-color - '@ai-sdk/google@2.0.23(zod@4.1.12)': + '@ai-sdk/google@2.0.25(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + '@ai-sdk/provider-utils': 3.0.14(zod@4.1.12) zod: 4.1.12 - '@ai-sdk/openai-compatible@1.0.22(zod@4.1.12)': + '@ai-sdk/openai-compatible@1.0.24(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + '@ai-sdk/provider-utils': 3.0.14(zod@4.1.12) zod: 4.1.12 - '@ai-sdk/openai@2.0.53(zod@4.1.12)': + '@ai-sdk/openai@2.0.58(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + '@ai-sdk/provider-utils': 3.0.14(zod@4.1.12) zod: 4.1.12 - '@ai-sdk/provider-utils@3.0.12(zod@4.1.12)': + '@ai-sdk/provider-utils@3.0.14(zod@4.1.12)': dependencies: '@ai-sdk/provider': 2.0.0 '@standard-schema/spec': 1.0.0 @@ -9215,10 +9254,10 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/react@2.0.78(react@19.2.0)(zod@4.1.12)': + '@ai-sdk/react@2.0.82(react@19.2.0)(zod@4.1.12)': dependencies: - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) - ai: 5.0.78(zod@4.1.12) + '@ai-sdk/provider-utils': 3.0.14(zod@4.1.12) + ai: 5.0.82(zod@4.1.12) react: 19.2.0 swr: 2.3.6(react@19.2.0) throttleit: 2.1.0 @@ -9306,7 +9345,7 @@ snapshots: '@csstools/css-tokenizer': 3.0.4 lru-cache: 11.2.2 - '@asamuzakjp/dom-selector@6.7.2': + '@asamuzakjp/dom-selector@6.7.3': dependencies: '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 @@ -9319,16 +9358,16 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.914.0 + '@aws-sdk/types': 3.920.0 tslib: 2.8.1 '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.914.0 + '@aws-sdk/types': 3.920.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/types@3.914.0': + '@aws-sdk/types@3.920.0': dependencies: '@smithy/types': 4.8.0 tslib: 2.8.1 @@ -9771,7 +9810,7 @@ snapshots: optionalDependencies: workerd: 1.20251011.0 - '@cloudflare/vite-plugin@1.13.15(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))(workerd@1.20251011.0)(wrangler@4.45.0)': + '@cloudflare/vite-plugin@1.13.17(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))(workerd@1.20251011.0)(wrangler@4.45.2)': dependencies: '@cloudflare/unenv-preset': 2.7.8(unenv@2.0.0-rc.21)(workerd@1.20251011.0) '@remix-run/node-fetch-server': 0.8.1 @@ -9780,8 +9819,8 @@ snapshots: picocolors: 1.1.1 tinyglobby: 0.2.15 unenv: 2.0.0-rc.21 - vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) - wrangler: 4.45.0 + vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + wrangler: 4.45.2 ws: 8.18.0 transitivePeerDependencies: - bufferutil @@ -9838,11 +9877,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@content-collections/vite@0.2.7(@content-collections/core@0.11.1(typescript@5.9.3))(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@content-collections/vite@0.2.7(@content-collections/core@0.11.1(typescript@5.9.3))(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@content-collections/core': 0.11.1(typescript@5.9.3) '@content-collections/integrations': 0.3.0(@content-collections/core@0.11.1(typescript@5.9.3)) - vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) '@cspotcode/source-map-support@0.8.1': dependencies: @@ -9908,7 +9947,7 @@ snapshots: '@drizzle-team/brocli@0.10.2': {} - '@electric-sql/client@1.0.14': + '@electric-sql/client@1.1.1': dependencies: '@microsoft/fetch-event-source': 2.0.1 optionalDependencies: @@ -10174,14 +10213,14 @@ snapshots: transitivePeerDependencies: - magicast - '@hono/mcp@0.1.4(@modelcontextprotocol/sdk@1.20.2)(hono@4.10.2)': + '@hono/mcp@0.1.4(@modelcontextprotocol/sdk@1.20.2)(hono@4.10.4)': dependencies: '@modelcontextprotocol/sdk': 1.20.2 - hono: 4.10.2 + hono: 4.10.4 - '@hono/node-server@1.19.5(hono@4.10.2)': + '@hono/node-server@1.19.5(hono@4.10.4)': dependencies: - hono: 4.10.2 + hono: 4.10.4 '@hookform/resolvers@5.2.2(react-hook-form@7.65.0(react@19.2.0))': dependencies: @@ -10190,9 +10229,9 @@ snapshots: '@huggingface/languages@1.0.0': {} - '@iconify-icon/react@3.0.1(react@19.2.0)': + '@iconify-icon/react@3.0.2(react@19.2.0)': dependencies: - iconify-icon: 3.0.1 + iconify-icon: 3.0.2 react: 19.2.0 '@iconify/types@2.0.0': {} @@ -10398,9 +10437,9 @@ snapshots: '@mdx-js/mdx': 3.1.1 '@mdx-js/react': 3.1.1(@types/react@19.2.2)(react@19.2.0) '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@shikijs/transformers': 3.13.0 + '@shikijs/transformers': 3.14.0 '@splinetool/runtime': 0.9.526 - ahooks: 3.9.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + ahooks: 3.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) antd: 5.27.5(date-fns@4.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) antd-style: 3.7.1(@types/react@19.2.2)(antd@5.27.5(date-fns@4.1.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) chroma-js: 3.1.2 @@ -10409,13 +10448,13 @@ snapshots: emoji-mart: 5.6.0 fast-deep-equal: 3.1.3 framer-motion: 12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - immer: 10.1.3 + immer: 10.2.0 katex: 0.16.25 leva: 0.10.0(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) lodash-es: 4.17.21 lucide-react: 0.543.0(react@19.2.0) marked: 16.4.1 - mermaid: 11.12.0 + mermaid: 11.12.1 numeral: 2.0.6 polished: 4.3.1 query-string: 9.3.1 @@ -10442,7 +10481,7 @@ snapshots: remark-gfm: 4.0.1 remark-github: 12.0.0 remark-math: 6.0.0 - shiki: 3.13.0 + shiki: 3.14.0 swr: 2.3.6(react@19.2.0) ts-md5: 2.0.1 unified: 11.0.5 @@ -10652,9 +10691,9 @@ snapshots: '@oozcitak/util@8.3.8': {} - '@openrouter/ai-sdk-provider@1.2.0(ai@5.0.78(zod@4.1.12))(zod@4.1.12)': + '@openrouter/ai-sdk-provider@1.2.0(ai@5.0.82(zod@4.1.12))(zod@4.1.12)': dependencies: - ai: 5.0.78(zod@4.1.12) + ai: 5.0.82(zod@4.1.12) zod: 4.1.12 '@opentelemetry/api-logs@0.204.0': @@ -11739,10 +11778,10 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.27': {} - '@rolldown/pluginutils@1.0.0-beta.38': {} - '@rolldown/pluginutils@1.0.0-beta.40': {} + '@rolldown/pluginutils@1.0.0-beta.43': {} + '@rollup/rollup-android-arm-eabi@4.52.5': optional: true @@ -11956,38 +11995,38 @@ snapshots: - react - supports-color - '@shikijs/core@3.13.0': + '@shikijs/core@3.14.0': dependencies: - '@shikijs/types': 3.13.0 + '@shikijs/types': 3.14.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@3.13.0': + '@shikijs/engine-javascript@3.14.0': dependencies: - '@shikijs/types': 3.13.0 + '@shikijs/types': 3.14.0 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.3.3 - '@shikijs/engine-oniguruma@3.13.0': + '@shikijs/engine-oniguruma@3.14.0': dependencies: - '@shikijs/types': 3.13.0 + '@shikijs/types': 3.14.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.13.0': + '@shikijs/langs@3.14.0': dependencies: - '@shikijs/types': 3.13.0 + '@shikijs/types': 3.14.0 - '@shikijs/themes@3.13.0': + '@shikijs/themes@3.14.0': dependencies: - '@shikijs/types': 3.13.0 + '@shikijs/types': 3.14.0 - '@shikijs/transformers@3.13.0': + '@shikijs/transformers@3.14.0': dependencies: - '@shikijs/core': 3.13.0 - '@shikijs/types': 3.13.0 + '@shikijs/core': 3.14.0 + '@shikijs/types': 3.14.0 - '@shikijs/types@3.13.0': + '@shikijs/types@3.14.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -12073,7 +12112,7 @@ snapshots: dependencies: solid-js: 1.9.9 - '@speed-highlight/core@1.2.7': {} + '@speed-highlight/core@1.2.8': {} '@splinetool/runtime@0.9.526': dependencies: @@ -12088,14 +12127,14 @@ snapshots: dependencies: react: 19.2.0 - '@stripe/stripe-js@8.1.0': {} + '@stripe/stripe-js@8.2.0': {} - '@supabase/auth-js@2.76.1': + '@supabase/auth-js@2.77.0': dependencies: '@supabase/node-fetch': 2.6.15 tslib: 2.8.1 - '@supabase/functions-js@2.76.1': + '@supabase/functions-js@2.77.0': dependencies: '@supabase/node-fetch': 2.6.15 tslib: 2.8.1 @@ -12104,12 +12143,12 @@ snapshots: dependencies: whatwg-url: 5.0.0 - '@supabase/postgrest-js@2.76.1': + '@supabase/postgrest-js@2.77.0': dependencies: '@supabase/node-fetch': 2.6.15 tslib: 2.8.1 - '@supabase/realtime-js@2.76.1': + '@supabase/realtime-js@2.77.0': dependencies: '@supabase/node-fetch': 2.6.15 '@types/phoenix': 1.6.6 @@ -12120,24 +12159,24 @@ snapshots: - bufferutil - utf-8-validate - '@supabase/ssr@0.7.0(@supabase/supabase-js@2.76.1)': + '@supabase/ssr@0.7.0(@supabase/supabase-js@2.77.0)': dependencies: - '@supabase/supabase-js': 2.76.1 + '@supabase/supabase-js': 2.77.0 cookie: 1.0.2 - '@supabase/storage-js@2.76.1': + '@supabase/storage-js@2.77.0': dependencies: '@supabase/node-fetch': 2.6.15 tslib: 2.8.1 - '@supabase/supabase-js@2.76.1': + '@supabase/supabase-js@2.77.0': dependencies: - '@supabase/auth-js': 2.76.1 - '@supabase/functions-js': 2.76.1 + '@supabase/auth-js': 2.77.0 + '@supabase/functions-js': 2.77.0 '@supabase/node-fetch': 2.6.15 - '@supabase/postgrest-js': 2.76.1 - '@supabase/realtime-js': 2.76.1 - '@supabase/storage-js': 2.76.1 + '@supabase/postgrest-js': 2.77.0 + '@supabase/realtime-js': 2.77.0 + '@supabase/storage-js': 2.77.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -12270,27 +12309,27 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.16 '@tailwindcss/oxide-win32-x64-msvc': 4.1.16 - '@tailwindcss/vite@4.1.16(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@tailwindcss/vite@4.1.16(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@tailwindcss/node': 4.1.16 '@tailwindcss/oxide': 4.1.16 tailwindcss: 4.1.16 - vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) '@tanstack/devtools-client@0.0.3': dependencies: - '@tanstack/devtools-event-client': 0.3.3 + '@tanstack/devtools-event-client': 0.3.4 - '@tanstack/devtools-event-bus@0.3.2': + '@tanstack/devtools-event-bus@0.3.3': dependencies: ws: 8.18.3 transitivePeerDependencies: - bufferutil - utf-8-validate - '@tanstack/devtools-event-client@0.3.3': {} + '@tanstack/devtools-event-client@0.3.4': {} - '@tanstack/devtools-ui@0.4.3(csstype@3.1.3)(solid-js@1.9.9)': + '@tanstack/devtools-ui@0.4.4(csstype@3.1.3)(solid-js@1.9.9)': dependencies: clsx: 2.1.1 goober: 2.1.18(csstype@3.1.3) @@ -12298,14 +12337,14 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/devtools@0.6.21(csstype@3.1.3)(solid-js@1.9.9)': + '@tanstack/devtools@0.7.0(csstype@3.1.3)(solid-js@1.9.9)': dependencies: '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.9) '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.9) '@solid-primitives/resize-observer': 2.1.3(solid-js@1.9.9) '@tanstack/devtools-client': 0.0.3 - '@tanstack/devtools-event-bus': 0.3.2 - '@tanstack/devtools-ui': 0.4.3(csstype@3.1.3)(solid-js@1.9.9) + '@tanstack/devtools-event-bus': 0.3.3 + '@tanstack/devtools-ui': 0.4.4(csstype@3.1.3)(solid-js@1.9.9) clsx: 2.1.1 goober: 2.1.18(csstype@3.1.3) solid-js: 1.9.9 @@ -12314,7 +12353,7 @@ snapshots: - csstype - utf-8-validate - '@tanstack/directive-functions-plugin@1.133.19(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/directive-functions-plugin@1.133.19(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.5 @@ -12324,11 +12363,11 @@ snapshots: babel-dead-code-elimination: 1.0.10 pathe: 2.0.3 tiny-invariant: 1.3.3 - vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@tanstack/directive-functions-plugin@1.133.19(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/directive-functions-plugin@1.133.19(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.5 @@ -12338,31 +12377,31 @@ snapshots: babel-dead-code-elimination: 1.0.10 pathe: 2.0.3 tiny-invariant: 1.3.3 - vite: 7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color optional: true '@tanstack/form-core@1.24.4': dependencies: - '@tanstack/devtools-event-client': 0.3.3 + '@tanstack/devtools-event-client': 0.3.4 '@tanstack/pacer': 0.15.4 '@tanstack/store': 0.7.7 - '@tanstack/history@1.133.19': {} + '@tanstack/history@1.133.28': {} '@tanstack/pacer@0.15.4': dependencies: - '@tanstack/devtools-event-client': 0.3.3 + '@tanstack/devtools-event-client': 0.3.4 '@tanstack/store': 0.7.7 '@tanstack/query-core@5.90.5': {} '@tanstack/query-devtools@5.90.1': {} - '@tanstack/react-devtools@0.7.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(csstype@3.1.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.9)': + '@tanstack/react-devtools@0.7.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(csstype@3.1.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.9)': dependencies: - '@tanstack/devtools': 0.6.21(csstype@3.1.3)(solid-js@1.9.9) + '@tanstack/devtools': 0.7.0(csstype@3.1.3)(solid-js@1.9.9) '@types/react': 19.2.2 '@types/react-dom': 19.2.2(@types/react@19.2.2) react: 19.2.0 @@ -12373,7 +12412,7 @@ snapshots: - solid-js - utf-8-validate - '@tanstack/react-form@1.23.8(@tanstack/react-start@1.133.26(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-form@1.23.8(@tanstack/react-start@1.134.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@tanstack/form-core': 1.24.4 '@tanstack/react-store': 0.7.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -12381,11 +12420,11 @@ snapshots: devalue: 5.4.2 react: 19.2.0 optionalDependencies: - '@tanstack/react-start': 1.133.26(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/react-start': 1.134.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - react-dom - '@tanstack/react-form@1.23.8(@tanstack/react-start@1.133.26(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-form@1.23.8(@tanstack/react-start@1.134.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@tanstack/form-core': 1.24.4 '@tanstack/react-store': 0.7.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -12393,7 +12432,7 @@ snapshots: devalue: 5.4.2 react: 19.2.0 optionalDependencies: - '@tanstack/react-start': 1.133.26(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/react-start': 1.134.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - react-dom @@ -12408,13 +12447,13 @@ snapshots: '@tanstack/query-core': 5.90.5 react: 19.2.0 - '@tanstack/react-router-devtools@1.133.25(@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.25)(@types/node@22.18.12)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/react-router-devtools@1.133.36(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.36)(@types/node@22.18.13)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: - '@tanstack/react-router': 1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-devtools-core': 1.133.25(@tanstack/router-core@1.133.25)(@types/node@22.18.12)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.2)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + '@tanstack/react-router': 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-devtools-core': 1.133.36(@tanstack/router-core@1.133.36)(@types/node@22.18.13)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.2)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@tanstack/router-core' - '@types/node' @@ -12432,13 +12471,13 @@ snapshots: - tsx - yaml - '@tanstack/react-router-devtools@1.133.25(@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.25)(@types/node@24.9.1)(csstype@3.1.3)(jiti@1.21.7)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/react-router-devtools@1.133.36(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.36)(@types/node@24.9.2)(csstype@3.1.3)(jiti@1.21.7)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: - '@tanstack/react-router': 1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-devtools-core': 1.133.25(@tanstack/router-core@1.133.25)(@types/node@24.9.1)(csstype@3.1.3)(jiti@1.21.7)(lightningcss@1.30.2)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + '@tanstack/react-router': 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-devtools-core': 1.133.36(@tanstack/router-core@1.133.36)(@types/node@24.9.2)(csstype@3.1.3)(jiti@1.21.7)(lightningcss@1.30.2)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - vite: 7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@tanstack/router-core' - '@types/node' @@ -12456,63 +12495,63 @@ snapshots: - tsx - yaml - '@tanstack/react-router-ssr-query@1.133.25(@tanstack/query-core@5.90.5)(@tanstack/react-query@5.90.5(react@19.2.0))(@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.25)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-router-ssr-query@1.133.36(@tanstack/query-core@5.90.5)(@tanstack/react-query@5.90.5(react@19.2.0))(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.36)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@tanstack/query-core': 5.90.5 '@tanstack/react-query': 5.90.5(react@19.2.0) - '@tanstack/react-router': 1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-ssr-query-core': 1.133.25(@tanstack/query-core@5.90.5)(@tanstack/router-core@1.133.25) + '@tanstack/react-router': 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-ssr-query-core': 1.133.36(@tanstack/query-core@5.90.5)(@tanstack/router-core@1.133.36) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: - '@tanstack/router-core' - '@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@tanstack/history': 1.133.19 - '@tanstack/react-store': 0.7.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-core': 1.133.25 + '@tanstack/history': 1.133.28 + '@tanstack/react-store': 0.8.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-core': 1.133.36 isbot: 5.1.31 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-client@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-start-client@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@tanstack/react-router': 1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-core': 1.133.25 - '@tanstack/start-client-core': 1.133.25 + '@tanstack/react-router': 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-core': 1.133.36 + '@tanstack/start-client-core': 1.133.36 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-server@1.133.26(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tanstack/react-start-server@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@tanstack/history': 1.133.19 - '@tanstack/react-router': 1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-core': 1.133.25 - '@tanstack/start-client-core': 1.133.25 - '@tanstack/start-server-core': 1.133.26 + '@tanstack/history': 1.133.28 + '@tanstack/react-router': 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/router-core': 1.133.36 + '@tanstack/start-client-core': 1.133.36 + '@tanstack/start-server-core': 1.133.36 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: - crossws - '@tanstack/react-start@1.133.26(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/react-start@1.134.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@tanstack/react-router': 1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/react-start-client': 1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/react-start-server': 1.133.26(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/react-router': 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/react-start-client': 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/react-start-server': 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/router-utils': 1.133.19 - '@tanstack/start-client-core': 1.133.25 - '@tanstack/start-plugin-core': 1.133.26(@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/start-server-core': 1.133.26 + '@tanstack/start-client-core': 1.133.36 + '@tanstack/start-plugin-core': 1.133.37(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-server-core': 1.133.36 pathe: 2.0.3 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@rsbuild/core' - crossws @@ -12520,19 +12559,19 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/react-start@1.133.26(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/react-start@1.134.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@tanstack/react-router': 1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/react-start-client': 1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/react-start-server': 1.133.26(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/react-router': 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/react-start-client': 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tanstack/react-start-server': 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tanstack/router-utils': 1.133.19 - '@tanstack/start-client-core': 1.133.25 - '@tanstack/start-plugin-core': 1.133.26(@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/start-server-core': 1.133.26 + '@tanstack/start-client-core': 1.133.36 + '@tanstack/start-plugin-core': 1.133.37(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-server-core': 1.133.36 pathe: 2.0.3 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - vite: 7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@rsbuild/core' - crossws @@ -12548,30 +12587,37 @@ snapshots: react-dom: 19.2.0(react@19.2.0) use-sync-external-store: 1.6.0(react@19.2.0) + '@tanstack/react-store@0.8.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@tanstack/store': 0.8.0 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + use-sync-external-store: 1.6.0(react@19.2.0) + '@tanstack/react-virtual@3.13.12(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@tanstack/virtual-core': 3.13.12 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@tanstack/router-core@1.133.25': + '@tanstack/router-core@1.133.36': dependencies: - '@tanstack/history': 1.133.19 - '@tanstack/store': 0.7.7 + '@tanstack/history': 1.133.28 + '@tanstack/store': 0.8.0 cookie-es: 2.0.0 seroval: 1.3.2 seroval-plugins: 1.3.3(seroval@1.3.2) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-devtools-core@1.133.25(@tanstack/router-core@1.133.25)(@types/node@22.18.12)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.2)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/router-devtools-core@1.133.36(@tanstack/router-core@1.133.36)(@types/node@22.18.13)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.2)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: - '@tanstack/router-core': 1.133.25 + '@tanstack/router-core': 1.133.36 clsx: 2.1.1 goober: 2.1.18(csstype@3.1.3) solid-js: 1.9.9 tiny-invariant: 1.3.3 - vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: csstype: 3.1.3 transitivePeerDependencies: @@ -12587,14 +12633,14 @@ snapshots: - tsx - yaml - '@tanstack/router-devtools-core@1.133.25(@tanstack/router-core@1.133.25)(@types/node@24.9.1)(csstype@3.1.3)(jiti@1.21.7)(lightningcss@1.30.2)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/router-devtools-core@1.133.36(@tanstack/router-core@1.133.36)(@types/node@24.9.2)(csstype@3.1.3)(jiti@1.21.7)(lightningcss@1.30.2)(solid-js@1.9.9)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: - '@tanstack/router-core': 1.133.25 + '@tanstack/router-core': 1.133.36 clsx: 2.1.1 goober: 2.1.18(csstype@3.1.3) solid-js: 1.9.9 tiny-invariant: 1.3.3 - vite: 7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: csstype: 3.1.3 transitivePeerDependencies: @@ -12610,9 +12656,9 @@ snapshots: - tsx - yaml - '@tanstack/router-generator@1.133.25': + '@tanstack/router-generator@1.133.36': dependencies: - '@tanstack/router-core': 1.133.25 + '@tanstack/router-core': 1.133.36 '@tanstack/router-utils': 1.133.19 '@tanstack/virtual-file-routes': 1.133.19 prettier: 3.6.2 @@ -12623,7 +12669,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.133.25(@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/router-plugin@1.133.36(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) @@ -12631,8 +12677,8 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.5 '@babel/types': 7.28.5 - '@tanstack/router-core': 1.133.25 - '@tanstack/router-generator': 1.133.25 + '@tanstack/router-core': 1.133.36 + '@tanstack/router-generator': 1.133.36 '@tanstack/router-utils': 1.133.19 '@tanstack/virtual-file-routes': 1.133.19 babel-dead-code-elimination: 1.0.10 @@ -12640,12 +12686,12 @@ snapshots: unplugin: 2.3.10 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + '@tanstack/react-router': 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.133.25(@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/router-plugin@1.133.36(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) @@ -12653,8 +12699,8 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.5 '@babel/types': 7.28.5 - '@tanstack/router-core': 1.133.25 - '@tanstack/router-generator': 1.133.25 + '@tanstack/router-core': 1.133.36 + '@tanstack/router-generator': 1.133.36 '@tanstack/router-utils': 1.133.19 '@tanstack/virtual-file-routes': 1.133.19 babel-dead-code-elimination: 1.0.10 @@ -12662,15 +12708,15 @@ snapshots: unplugin: 2.3.10 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - vite: 7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + '@tanstack/react-router': 1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + vite: 7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@tanstack/router-ssr-query-core@1.133.25(@tanstack/query-core@5.90.5)(@tanstack/router-core@1.133.25)': + '@tanstack/router-ssr-query-core@1.133.36(@tanstack/query-core@5.90.5)(@tanstack/router-core@1.133.36)': dependencies: '@tanstack/query-core': 5.90.5 - '@tanstack/router-core': 1.133.25 + '@tanstack/router-core': 1.133.36 '@tanstack/router-utils@1.133.19': dependencies: @@ -12685,7 +12731,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/server-functions-plugin@1.133.25(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/server-functions-plugin@1.133.25(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.5 @@ -12694,14 +12740,14 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.5 '@babel/types': 7.28.5 - '@tanstack/directive-functions-plugin': 1.133.19(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/directive-functions-plugin': 1.133.19(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 transitivePeerDependencies: - supports-color - vite - '@tanstack/server-functions-plugin@1.133.25(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/server-functions-plugin@1.133.25(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.5 @@ -12710,7 +12756,7 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.5 '@babel/types': 7.28.5 - '@tanstack/directive-functions-plugin': 1.133.19(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/directive-functions-plugin': 1.133.19(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 transitivePeerDependencies: @@ -12718,27 +12764,27 @@ snapshots: - vite optional: true - '@tanstack/start-client-core@1.133.25': + '@tanstack/start-client-core@1.133.36': dependencies: - '@tanstack/router-core': 1.133.25 - '@tanstack/start-storage-context': 1.133.25 + '@tanstack/router-core': 1.133.36 + '@tanstack/start-storage-context': 1.133.36 seroval: 1.3.2 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/start-plugin-core@1.133.26(@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/start-plugin-core@1.133.37(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.28.5 '@babel/types': 7.28.5 '@rolldown/pluginutils': 1.0.0-beta.40 - '@tanstack/router-core': 1.133.25 - '@tanstack/router-generator': 1.133.25 - '@tanstack/router-plugin': 1.133.25(@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/router-core': 1.133.36 + '@tanstack/router-generator': 1.133.36 + '@tanstack/router-plugin': 1.133.36(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/router-utils': 1.133.19 - '@tanstack/server-functions-plugin': 1.133.25(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/start-client-core': 1.133.25 - '@tanstack/start-server-core': 1.133.26 + '@tanstack/server-functions-plugin': 1.133.25(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-client-core': 1.133.36 + '@tanstack/start-server-core': 1.133.36 babel-dead-code-elimination: 1.0.10 cheerio: 1.1.2 exsolve: 1.0.7 @@ -12746,8 +12792,8 @@ snapshots: srvx: 0.8.16 tinyglobby: 0.2.15 ufo: 1.6.1 - vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) xmlbuilder2: 3.1.1 zod: 3.25.76 transitivePeerDependencies: @@ -12758,19 +12804,19 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-plugin-core@1.133.26(@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/start-plugin-core@1.133.37(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.28.5 '@babel/types': 7.28.5 '@rolldown/pluginutils': 1.0.0-beta.40 - '@tanstack/router-core': 1.133.25 - '@tanstack/router-generator': 1.133.25 - '@tanstack/router-plugin': 1.133.25(@tanstack/react-router@1.133.25(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/router-core': 1.133.36 + '@tanstack/router-generator': 1.133.36 + '@tanstack/router-plugin': 1.133.36(@tanstack/react-router@1.133.36(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) '@tanstack/router-utils': 1.133.19 - '@tanstack/server-functions-plugin': 1.133.25(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) - '@tanstack/start-client-core': 1.133.25 - '@tanstack/start-server-core': 1.133.26 + '@tanstack/server-functions-plugin': 1.133.25(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + '@tanstack/start-client-core': 1.133.36 + '@tanstack/start-server-core': 1.133.36 babel-dead-code-elimination: 1.0.10 cheerio: 1.1.2 exsolve: 1.0.7 @@ -12778,8 +12824,8 @@ snapshots: srvx: 0.8.16 tinyglobby: 0.2.15 ufo: 1.6.1 - vite: 7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + vite: 7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) xmlbuilder2: 3.1.1 zod: 3.25.76 transitivePeerDependencies: @@ -12791,24 +12837,26 @@ snapshots: - webpack optional: true - '@tanstack/start-server-core@1.133.26': + '@tanstack/start-server-core@1.133.36': dependencies: - '@tanstack/history': 1.133.19 - '@tanstack/router-core': 1.133.25 - '@tanstack/start-client-core': 1.133.25 - '@tanstack/start-storage-context': 1.133.25 + '@tanstack/history': 1.133.28 + '@tanstack/router-core': 1.133.36 + '@tanstack/start-client-core': 1.133.36 + '@tanstack/start-storage-context': 1.133.36 h3-v2: h3@2.0.0-beta.4 seroval: 1.3.2 tiny-invariant: 1.3.3 transitivePeerDependencies: - crossws - '@tanstack/start-storage-context@1.133.25': + '@tanstack/start-storage-context@1.133.36': dependencies: - '@tanstack/router-core': 1.133.25 + '@tanstack/router-core': 1.133.36 '@tanstack/store@0.7.7': {} + '@tanstack/store@0.8.0': {} + '@tanstack/virtual-core@3.13.12': {} '@tanstack/virtual-file-routes@1.133.19': {} @@ -12817,74 +12865,78 @@ snapshots: '@tauri-apps/api@2.9.0': {} - '@tauri-apps/cli-darwin-arm64@2.9.1': + '@tauri-apps/cli-darwin-arm64@2.9.2': optional: true - '@tauri-apps/cli-darwin-x64@2.9.1': + '@tauri-apps/cli-darwin-x64@2.9.2': optional: true - '@tauri-apps/cli-linux-arm-gnueabihf@2.9.1': + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.2': optional: true - '@tauri-apps/cli-linux-arm64-gnu@2.9.1': + '@tauri-apps/cli-linux-arm64-gnu@2.9.2': optional: true - '@tauri-apps/cli-linux-arm64-musl@2.9.1': + '@tauri-apps/cli-linux-arm64-musl@2.9.2': optional: true - '@tauri-apps/cli-linux-riscv64-gnu@2.9.1': + '@tauri-apps/cli-linux-riscv64-gnu@2.9.2': optional: true - '@tauri-apps/cli-linux-x64-gnu@2.9.1': + '@tauri-apps/cli-linux-x64-gnu@2.9.2': optional: true - '@tauri-apps/cli-linux-x64-musl@2.9.1': + '@tauri-apps/cli-linux-x64-musl@2.9.2': optional: true - '@tauri-apps/cli-win32-arm64-msvc@2.9.1': + '@tauri-apps/cli-win32-arm64-msvc@2.9.2': optional: true - '@tauri-apps/cli-win32-ia32-msvc@2.9.1': + '@tauri-apps/cli-win32-ia32-msvc@2.9.2': optional: true - '@tauri-apps/cli-win32-x64-msvc@2.9.1': + '@tauri-apps/cli-win32-x64-msvc@2.9.2': optional: true - '@tauri-apps/cli@2.9.1': + '@tauri-apps/cli@2.9.2': optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 2.9.1 - '@tauri-apps/cli-darwin-x64': 2.9.1 - '@tauri-apps/cli-linux-arm-gnueabihf': 2.9.1 - '@tauri-apps/cli-linux-arm64-gnu': 2.9.1 - '@tauri-apps/cli-linux-arm64-musl': 2.9.1 - '@tauri-apps/cli-linux-riscv64-gnu': 2.9.1 - '@tauri-apps/cli-linux-x64-gnu': 2.9.1 - '@tauri-apps/cli-linux-x64-musl': 2.9.1 - '@tauri-apps/cli-win32-arm64-msvc': 2.9.1 - '@tauri-apps/cli-win32-ia32-msvc': 2.9.1 - '@tauri-apps/cli-win32-x64-msvc': 2.9.1 - - '@tauri-apps/plugin-deep-link@2.4.3': + '@tauri-apps/cli-darwin-arm64': 2.9.2 + '@tauri-apps/cli-darwin-x64': 2.9.2 + '@tauri-apps/cli-linux-arm-gnueabihf': 2.9.2 + '@tauri-apps/cli-linux-arm64-gnu': 2.9.2 + '@tauri-apps/cli-linux-arm64-musl': 2.9.2 + '@tauri-apps/cli-linux-riscv64-gnu': 2.9.2 + '@tauri-apps/cli-linux-x64-gnu': 2.9.2 + '@tauri-apps/cli-linux-x64-musl': 2.9.2 + '@tauri-apps/cli-win32-arm64-msvc': 2.9.2 + '@tauri-apps/cli-win32-ia32-msvc': 2.9.2 + '@tauri-apps/cli-win32-x64-msvc': 2.9.2 + + '@tauri-apps/plugin-deep-link@2.4.5': + dependencies: + '@tauri-apps/api': 2.9.0 + + '@tauri-apps/plugin-dialog@2.4.2': dependencies: '@tauri-apps/api': 2.9.0 - '@tauri-apps/plugin-dialog@2.4.0': + '@tauri-apps/plugin-http@2.5.4': dependencies: '@tauri-apps/api': 2.9.0 - '@tauri-apps/plugin-http@2.5.2': + '@tauri-apps/plugin-opener@2.5.2': dependencies: '@tauri-apps/api': 2.9.0 - '@tauri-apps/plugin-opener@2.5.0': + '@tauri-apps/plugin-process@2.3.1': dependencies: '@tauri-apps/api': 2.9.0 - '@tauri-apps/plugin-process@2.3.0': + '@tauri-apps/plugin-shell@2.3.3': dependencies: '@tauri-apps/api': 2.9.0 - '@tauri-apps/plugin-store@2.4.0': + '@tauri-apps/plugin-store@2.4.1': dependencies: '@tauri-apps/api': 2.9.0 @@ -12913,158 +12965,158 @@ snapshots: '@types/react': 19.2.2 '@types/react-dom': 19.2.2(@types/react@19.2.2) - '@tiptap/core@3.7.2(@tiptap/pm@3.7.2)': + '@tiptap/core@3.9.1(@tiptap/pm@3.9.1)': dependencies: - '@tiptap/pm': 3.7.2 + '@tiptap/pm': 3.9.1 - '@tiptap/extension-blockquote@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))': + '@tiptap/extension-blockquote@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) - '@tiptap/extension-bold@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))': + '@tiptap/extension-bold@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) - '@tiptap/extension-bubble-menu@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)': + '@tiptap/extension-bubble-menu@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)': dependencies: '@floating-ui/dom': 1.7.4 - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) - '@tiptap/pm': 3.7.2 + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) + '@tiptap/pm': 3.9.1 - '@tiptap/extension-bullet-list@3.7.2(@tiptap/extension-list@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2))': + '@tiptap/extension-bullet-list@3.9.1(@tiptap/extension-list@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/extension-list': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) + '@tiptap/extension-list': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) - '@tiptap/extension-code-block@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)': + '@tiptap/extension-code-block@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) - '@tiptap/pm': 3.7.2 + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) + '@tiptap/pm': 3.9.1 - '@tiptap/extension-code@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))': + '@tiptap/extension-code@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) - '@tiptap/extension-document@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))': + '@tiptap/extension-document@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) - '@tiptap/extension-dropcursor@3.7.2(@tiptap/extensions@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2))': + '@tiptap/extension-dropcursor@3.9.1(@tiptap/extensions@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/extensions': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) + '@tiptap/extensions': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) - '@tiptap/extension-floating-menu@3.7.2(@floating-ui/dom@1.7.4)(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)': + '@tiptap/extension-floating-menu@3.9.1(@floating-ui/dom@1.7.4)(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)': dependencies: '@floating-ui/dom': 1.7.4 - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) - '@tiptap/pm': 3.7.2 + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) + '@tiptap/pm': 3.9.1 optional: true - '@tiptap/extension-gapcursor@3.7.2(@tiptap/extensions@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2))': + '@tiptap/extension-gapcursor@3.9.1(@tiptap/extensions@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/extensions': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) + '@tiptap/extensions': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) - '@tiptap/extension-hard-break@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))': + '@tiptap/extension-hard-break@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) - '@tiptap/extension-heading@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))': + '@tiptap/extension-heading@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) - '@tiptap/extension-highlight@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))': + '@tiptap/extension-highlight@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) - '@tiptap/extension-history@3.7.2(@tiptap/extensions@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2))': + '@tiptap/extension-history@3.9.1(@tiptap/extensions@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/extensions': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) + '@tiptap/extensions': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) - '@tiptap/extension-horizontal-rule@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)': + '@tiptap/extension-horizontal-rule@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) - '@tiptap/pm': 3.7.2 + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) + '@tiptap/pm': 3.9.1 - '@tiptap/extension-image@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))': + '@tiptap/extension-image@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) - '@tiptap/extension-italic@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))': + '@tiptap/extension-italic@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) - '@tiptap/extension-link@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)': + '@tiptap/extension-link@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) - '@tiptap/pm': 3.7.2 + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) + '@tiptap/pm': 3.9.1 linkifyjs: 4.3.2 - '@tiptap/extension-list-item@3.7.2(@tiptap/extension-list@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2))': + '@tiptap/extension-list-item@3.9.1(@tiptap/extension-list@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/extension-list': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) + '@tiptap/extension-list': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) - '@tiptap/extension-list-keymap@3.7.2(@tiptap/extension-list@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2))': + '@tiptap/extension-list-keymap@3.9.1(@tiptap/extension-list@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/extension-list': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) + '@tiptap/extension-list': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) - '@tiptap/extension-list@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)': + '@tiptap/extension-list@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) - '@tiptap/pm': 3.7.2 + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) + '@tiptap/pm': 3.9.1 - '@tiptap/extension-mention@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)(@tiptap/suggestion@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2))': + '@tiptap/extension-mention@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)(@tiptap/suggestion@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) - '@tiptap/pm': 3.7.2 - '@tiptap/suggestion': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) + '@tiptap/pm': 3.9.1 + '@tiptap/suggestion': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) - '@tiptap/extension-ordered-list@3.7.2(@tiptap/extension-list@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2))': + '@tiptap/extension-ordered-list@3.9.1(@tiptap/extension-list@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/extension-list': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) + '@tiptap/extension-list': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) - '@tiptap/extension-paragraph@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))': + '@tiptap/extension-paragraph@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) - '@tiptap/extension-placeholder@3.7.2(@tiptap/extensions@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2))': + '@tiptap/extension-placeholder@3.9.1(@tiptap/extensions@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/extensions': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) + '@tiptap/extensions': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) - '@tiptap/extension-strike@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))': + '@tiptap/extension-strike@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) - '@tiptap/extension-task-item@3.7.2(@tiptap/extension-list@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2))': + '@tiptap/extension-task-item@3.9.1(@tiptap/extension-list@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/extension-list': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) + '@tiptap/extension-list': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) - '@tiptap/extension-task-list@3.7.2(@tiptap/extension-list@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2))': + '@tiptap/extension-task-list@3.9.1(@tiptap/extension-list@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/extension-list': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) + '@tiptap/extension-list': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) - '@tiptap/extension-text@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))': + '@tiptap/extension-text@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) - '@tiptap/extension-typography@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))': + '@tiptap/extension-typography@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) - '@tiptap/extension-underline@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))': + '@tiptap/extension-underline@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) - '@tiptap/extensions@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)': + '@tiptap/extensions@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) - '@tiptap/pm': 3.7.2 + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) + '@tiptap/pm': 3.9.1 - '@tiptap/markdown@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)': + '@tiptap/markdown@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) - '@tiptap/pm': 3.7.2 + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) + '@tiptap/pm': 3.9.1 marked: 16.4.1 - '@tiptap/pm@3.7.2': + '@tiptap/pm@3.9.1': dependencies: prosemirror-changeset: 2.3.1 prosemirror-collab: 1.3.1 @@ -13085,10 +13137,10 @@ snapshots: prosemirror-transform: 1.10.4 prosemirror-view: 1.41.3 - '@tiptap/react@3.7.2(@floating-ui/dom@1.7.4)(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tiptap/react@3.9.1(@floating-ui/dom@1.7.4)(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) - '@tiptap/pm': 3.7.2 + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) + '@tiptap/pm': 3.9.1 '@types/react': 19.2.2 '@types/react-dom': 19.2.2(@types/react@19.2.2) '@types/use-sync-external-store': 0.0.6 @@ -13097,42 +13149,42 @@ snapshots: react-dom: 19.2.0(react@19.2.0) use-sync-external-store: 1.6.0(react@19.2.0) optionalDependencies: - '@tiptap/extension-bubble-menu': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) - '@tiptap/extension-floating-menu': 3.7.2(@floating-ui/dom@1.7.4)(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) + '@tiptap/extension-bubble-menu': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) + '@tiptap/extension-floating-menu': 3.9.1(@floating-ui/dom@1.7.4)(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) transitivePeerDependencies: - '@floating-ui/dom' - '@tiptap/starter-kit@3.7.2': - dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) - '@tiptap/extension-blockquote': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) - '@tiptap/extension-bold': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) - '@tiptap/extension-bullet-list': 3.7.2(@tiptap/extension-list@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)) - '@tiptap/extension-code': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) - '@tiptap/extension-code-block': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) - '@tiptap/extension-document': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) - '@tiptap/extension-dropcursor': 3.7.2(@tiptap/extensions@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)) - '@tiptap/extension-gapcursor': 3.7.2(@tiptap/extensions@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)) - '@tiptap/extension-hard-break': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) - '@tiptap/extension-heading': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) - '@tiptap/extension-horizontal-rule': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) - '@tiptap/extension-italic': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) - '@tiptap/extension-link': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) - '@tiptap/extension-list': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) - '@tiptap/extension-list-item': 3.7.2(@tiptap/extension-list@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)) - '@tiptap/extension-list-keymap': 3.7.2(@tiptap/extension-list@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)) - '@tiptap/extension-ordered-list': 3.7.2(@tiptap/extension-list@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)) - '@tiptap/extension-paragraph': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) - '@tiptap/extension-strike': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) - '@tiptap/extension-text': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) - '@tiptap/extension-underline': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2)) - '@tiptap/extensions': 3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2) - '@tiptap/pm': 3.7.2 - - '@tiptap/suggestion@3.7.2(@tiptap/core@3.7.2(@tiptap/pm@3.7.2))(@tiptap/pm@3.7.2)': - dependencies: - '@tiptap/core': 3.7.2(@tiptap/pm@3.7.2) - '@tiptap/pm': 3.7.2 + '@tiptap/starter-kit@3.9.1': + dependencies: + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) + '@tiptap/extension-blockquote': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) + '@tiptap/extension-bold': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) + '@tiptap/extension-bullet-list': 3.9.1(@tiptap/extension-list@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)) + '@tiptap/extension-code': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) + '@tiptap/extension-code-block': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) + '@tiptap/extension-document': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) + '@tiptap/extension-dropcursor': 3.9.1(@tiptap/extensions@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)) + '@tiptap/extension-gapcursor': 3.9.1(@tiptap/extensions@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)) + '@tiptap/extension-hard-break': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) + '@tiptap/extension-heading': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) + '@tiptap/extension-horizontal-rule': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) + '@tiptap/extension-italic': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) + '@tiptap/extension-link': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) + '@tiptap/extension-list': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) + '@tiptap/extension-list-item': 3.9.1(@tiptap/extension-list@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)) + '@tiptap/extension-list-keymap': 3.9.1(@tiptap/extension-list@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)) + '@tiptap/extension-ordered-list': 3.9.1(@tiptap/extension-list@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)) + '@tiptap/extension-paragraph': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) + '@tiptap/extension-strike': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) + '@tiptap/extension-text': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) + '@tiptap/extension-underline': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1)) + '@tiptap/extensions': 3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1) + '@tiptap/pm': 3.9.1 + + '@tiptap/suggestion@3.9.1(@tiptap/core@3.9.1(@tiptap/pm@3.9.1))(@tiptap/pm@3.9.1)': + dependencies: + '@tiptap/core': 3.9.1(@tiptap/pm@3.9.1) + '@tiptap/pm': 3.9.1 '@tsconfig/node10@1.0.11': {} @@ -13172,7 +13224,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 22.18.12 + '@types/node': 22.18.13 '@types/d3-array@3.2.2': {} @@ -13338,17 +13390,17 @@ snapshots: '@types/mysql@2.15.27': dependencies: - '@types/node': 22.18.12 + '@types/node': 22.18.13 - '@types/node@20.19.23': + '@types/node@20.19.24': dependencies: undici-types: 6.21.0 - '@types/node@22.18.12': + '@types/node@22.18.13': dependencies: undici-types: 6.21.0 - '@types/node@24.9.1': + '@types/node@24.9.2': dependencies: undici-types: 7.16.0 @@ -13360,7 +13412,7 @@ snapshots: '@types/pg@8.15.5': dependencies: - '@types/node': 22.18.12 + '@types/node': 22.18.13 pg-protocol: 1.10.3 pg-types: 2.2.0 @@ -13380,11 +13432,11 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 22.18.12 + '@types/node': 22.18.13 '@types/trusted-types@2.0.7': {} - '@types/turndown@5.0.5': {} + '@types/turndown@5.0.6': {} '@types/unist@2.0.11': {} @@ -13392,13 +13444,13 @@ snapshots: '@types/unzipper@0.10.11': dependencies: - '@types/node': 24.9.1 + '@types/node': 24.9.2 '@types/use-sync-external-store@0.0.6': {} '@types/ws@8.18.1': dependencies: - '@types/node': 24.9.1 + '@types/node': 24.9.2 '@uidotdev/usehooks@2.4.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: @@ -13416,7 +13468,7 @@ snapshots: '@vercel/oidc@3.0.3': {} - '@vitejs/plugin-react@4.7.0(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@vitejs/plugin-react@4.7.0(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -13424,19 +13476,19 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@5.0.4(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@vitejs/plugin-react@5.1.0(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) - '@rolldown/pluginutils': 1.0.0-beta.38 + '@rolldown/pluginutils': 1.0.0-beta.43 '@types/babel__core': 7.20.5 - react-refresh: 0.17.0 - vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + react-refresh: 0.18.0 + vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -13448,29 +13500,29 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/mocker@3.2.4(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/mocker@3.2.4(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -13498,12 +13550,12 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 - '@wavesurfer/react@1.0.11(react@19.2.0)(wavesurfer.js@7.11.0)': + '@wavesurfer/react@1.0.11(react@19.2.0)(wavesurfer.js@7.11.1)': dependencies: react: 19.2.0 - wavesurfer.js: 7.11.0 + wavesurfer.js: 7.11.1 - '@xstate/store@3.11.1(react@19.2.0)(solid-js@1.9.9)': + '@xstate/store@3.11.2(react@19.2.0)(solid-js@1.9.9)': optionalDependencies: react: 19.2.0 solid-js: 1.9.9 @@ -13533,7 +13585,7 @@ snapshots: agent-base@7.1.4: {} - ahooks@3.9.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + ahooks@3.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@babel/runtime': 7.28.4 '@types/js-cookie': 3.0.6 @@ -13548,11 +13600,11 @@ snapshots: screenfull: 5.2.0 tslib: 2.8.1 - ai@5.0.78(zod@4.1.12): + ai@5.0.82(zod@4.1.12): dependencies: - '@ai-sdk/gateway': 2.0.1(zod@4.1.12) + '@ai-sdk/gateway': 2.0.3(zod@4.1.12) '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.12(zod@4.1.12) + '@ai-sdk/provider-utils': 3.0.14(zod@4.1.12) '@opentelemetry/api': 1.9.0 zod: 4.1.12 @@ -13638,7 +13690,7 @@ snapshots: rc-dialog: 9.6.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) rc-drawer: 7.3.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) rc-dropdown: 4.2.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - rc-field-form: 2.7.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + rc-field-form: 2.7.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) rc-image: 7.12.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) rc-input: 1.8.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) rc-input-number: 9.5.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -13712,10 +13764,10 @@ snapshots: asynckit@0.4.0: {} - atomically@2.0.3: + atomically@2.1.0: dependencies: - stubborn-fs: 1.2.5 - when-exit: 2.1.4 + stubborn-fs: 2.0.0 + when-exit: 2.1.5 attr-accept@2.2.5: {} @@ -13784,7 +13836,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.8.20: {} + baseline-browser-mapping@2.8.21: {} bidi-js@1.0.3: dependencies: @@ -13829,10 +13881,10 @@ snapshots: browserslist@4.27.0: dependencies: - baseline-browser-mapping: 2.8.20 + baseline-browser-mapping: 2.8.21 caniuse-lite: 1.0.30001751 - electron-to-chromium: 1.5.240 - node-releases: 2.0.26 + electron-to-chromium: 1.5.243 + node-releases: 2.0.27 update-browserslist-db: 1.1.4(browserslist@4.27.0) buffer-equal-constant-time@1.0.1: {} @@ -14087,7 +14139,7 @@ snapshots: dependencies: ajv: 8.17.1 ajv-formats: 2.1.1(ajv@8.17.1) - atomically: 2.0.3 + atomically: 2.1.0 debounce-fn: 5.1.2 dot-prop: 8.0.2 env-paths: 3.0.0 @@ -14384,7 +14436,7 @@ snapshots: d3-transition: 3.0.1(d3-selection@3.0.0) d3-zoom: 3.0.0 - dagre-d3-es@7.0.11: + dagre-d3-es@7.0.13: dependencies: d3: 7.9.0 lodash-es: 4.17.21 @@ -14499,7 +14551,7 @@ snapshots: dotenv@17.2.3: {} - drizzle-kit@0.31.5: + drizzle-kit@0.31.6: dependencies: '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 @@ -14547,7 +14599,7 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.240: {} + electron-to-chromium@1.5.243: {} embla-carousel-react@8.6.0(react@19.2.0): dependencies: @@ -15025,7 +15077,7 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 4.1.1 - minimatch: 10.0.3 + minimatch: 10.1.1 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 2.0.0 @@ -15084,7 +15136,7 @@ snapshots: dependencies: cookie-es: 2.0.0 fetchdts: 0.1.7 - rou3: 0.7.8 + rou3: 0.7.9 srvx: 0.8.16 hachure-fill@0.5.2: {} @@ -15255,11 +15307,11 @@ snapshots: dependencies: react-is: 16.13.1 - hono-rate-limiter@0.4.2(hono@4.10.2): + hono-rate-limiter@0.4.2(hono@4.10.4): dependencies: - hono: 4.10.2 + hono: 4.10.4 - hono@4.10.2: {} + hono@4.10.4: {} hookified@1.12.2: {} @@ -15304,7 +15356,7 @@ snapshots: transitivePeerDependencies: - supports-color - iconify-icon@3.0.1: + iconify-icon@3.0.2: dependencies: '@iconify/types': 2.0.0 @@ -15316,7 +15368,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - immer@10.1.3: {} + immer@10.2.0: {} import-fresh@3.3.1: dependencies: @@ -15496,7 +15548,7 @@ snapshots: jsdom@27.0.1(postcss@8.5.6): dependencies: - '@asamuzakjp/dom-selector': 6.7.2 + '@asamuzakjp/dom-selector': 6.7.3 cssstyle: 5.3.1(postcss@8.5.6) data-urls: 6.0.0 decimal.js: 10.6.0 @@ -16013,7 +16065,7 @@ snapshots: merge2@1.4.1: {} - mermaid@11.12.0: + mermaid@11.12.1: dependencies: '@braintree/sanitize-url': 7.1.1 '@iconify/utils': 3.0.2 @@ -16024,7 +16076,7 @@ snapshots: cytoscape-fcose: 2.2.0(cytoscape@3.33.1) d3: 7.9.0 d3-sankey: 0.12.3 - dagre-d3-es: 7.0.11 + dagre-d3-es: 7.0.13 dayjs: 1.11.18 dompurify: 3.3.0 katex: 0.16.25 @@ -16379,7 +16431,7 @@ snapshots: - bufferutil - utf-8-validate - minimatch@10.0.3: + minimatch@10.1.1: dependencies: '@isaacs/brace-expansion': 5.0.0 @@ -16464,7 +16516,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nango@0.69.2(@types/node@24.9.1)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1): + nango@0.69.2(@types/node@24.9.2)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@babel/core': 7.28.0 '@babel/parser': 7.28.0 @@ -16500,7 +16552,7 @@ snapshots: semver: 7.5.4 serialize-error: 11.0.3 ts-json-schema-generator: 2.4.0 - ts-node: 10.9.2(@swc/core@1.13.2)(@types/node@24.9.1)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.13.2)(@types/node@24.9.2)(typescript@5.8.3) tsup: 8.5.0(@swc/core@1.13.2)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1) typescript: 5.8.3 unzipper: 0.12.3 @@ -16537,7 +16589,7 @@ snapshots: node-int64@0.4.0: {} - node-releases@2.0.26: {} + node-releases@2.0.27: {} noms@0.0.0: dependencies: @@ -17104,7 +17156,7 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - rc-field-form@2.7.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + rc-field-form@2.7.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@babel/runtime': 7.28.4 '@rc-component/async-validator': 5.0.4 @@ -17487,6 +17539,8 @@ snapshots: react-refresh@0.17.0: {} + react-refresh@0.18.0: {} + react-remove-scroll-bar@2.3.8(@types/react@19.2.2)(react@19.2.0): dependencies: react: 19.2.0 @@ -17803,7 +17857,7 @@ snapshots: rope-sequence@1.3.4: {} - rou3@0.7.8: {} + rou3@0.7.9: {} roughjs@4.6.6: dependencies: @@ -17953,14 +18007,14 @@ snapshots: shebang-regex@3.0.0: {} - shiki@3.13.0: + shiki@3.14.0: dependencies: - '@shikijs/core': 3.13.0 - '@shikijs/engine-javascript': 3.13.0 - '@shikijs/engine-oniguruma': 3.13.0 - '@shikijs/langs': 3.13.0 - '@shikijs/themes': 3.13.0 - '@shikijs/types': 3.13.0 + '@shikijs/core': 3.14.0 + '@shikijs/engine-javascript': 3.14.0 + '@shikijs/engine-oniguruma': 3.14.0 + '@shikijs/langs': 3.14.0 + '@shikijs/themes': 3.14.0 + '@shikijs/types': 3.14.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -18062,7 +18116,7 @@ snapshots: katex: 0.16.25 lucide-react: 0.542.0(react@19.2.0) marked: 16.4.1 - mermaid: 11.12.0 + mermaid: 11.12.1 react: 19.2.0 react-markdown: 10.1.0(@types/react@19.2.2)(react@19.2.0) rehype-harden: 1.1.5 @@ -18070,7 +18124,7 @@ snapshots: rehype-raw: 7.0.0 remark-gfm: 4.0.1 remark-math: 6.0.0 - shiki: 3.13.0 + shiki: 3.14.0 tailwind-merge: 3.3.1 transitivePeerDependencies: - '@types/react' @@ -18121,13 +18175,17 @@ snapshots: dependencies: js-tokens: 9.0.1 - stripe@19.1.0(@types/node@22.18.12): + stripe@19.2.0(@types/node@22.18.13): dependencies: qs: 6.14.0 optionalDependencies: - '@types/node': 22.18.12 + '@types/node': 22.18.13 + + stubborn-fs@2.0.0: + dependencies: + stubborn-utils: 1.0.1 - stubborn-fs@1.2.5: {} + stubborn-utils@1.0.1: {} style-to-js@1.1.18: dependencies: @@ -18236,7 +18294,7 @@ snapshots: tiny-warning@1.0.3: {} - tinybase@6.7.1(postgres@3.4.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(ws@8.18.3): + tinybase@6.7.2(postgres@3.4.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(ws@8.18.3): optionalDependencies: postgres: 3.4.7 react: 19.2.0 @@ -18321,14 +18379,14 @@ snapshots: ts-md5@2.0.1: {} - ts-node@10.9.2(@swc/core@1.13.2)(@types/node@24.9.1)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.13.2)(@types/node@24.9.2)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.9.1 + '@types/node': 24.9.2 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -18412,7 +18470,7 @@ snapshots: turbo-windows-64: 2.5.8 turbo-windows-arm64: 2.5.8 - turndown@7.2.1: + turndown@7.2.2: dependencies: '@mixmark-io/domino': 2.2.0 @@ -18597,13 +18655,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@3.2.4(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): + vite-node@3.2.4(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -18618,13 +18676,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): + vite-node@3.2.4(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -18639,13 +18697,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): + vite-node@3.2.4(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -18660,18 +18718,18 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): + vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) @@ -18680,14 +18738,14 @@ snapshots: rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.18.12 + '@types/node': 22.18.13 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 tsx: 4.20.6 yaml: 2.8.1 - vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): + vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) @@ -18696,14 +18754,14 @@ snapshots: rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 24.9.2 fsevents: 2.3.3 jiti: 1.21.7 lightningcss: 1.30.2 tsx: 4.20.6 yaml: 2.8.1 - vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): + vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) @@ -18712,27 +18770,27 @@ snapshots: rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 24.9.2 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 tsx: 4.20.6 yaml: 2.8.1 - vitefu@1.1.1(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)): + vitefu@1.1.1(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)): optionalDependencies: - vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) - vitefu@1.1.1(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)): + vitefu@1.1.1(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)): optionalDependencies: - vite: 7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) optional: true - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.13)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -18750,12 +18808,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.18.13)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.18.12 + '@types/node': 22.18.13 jsdom: 27.0.1(postcss@8.5.6) transitivePeerDependencies: - jiti @@ -18771,11 +18829,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.9.1)(jiti@1.21.7)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(jiti@1.21.7)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -18793,12 +18851,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.12(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.9.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.9.2)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 24.9.1 + '@types/node': 24.9.2 jsdom: 27.0.1(postcss@8.5.6) transitivePeerDependencies: - jiti @@ -18814,11 +18872,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.9.1)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(jiti@2.6.1)(jsdom@27.0.1(postcss@8.5.6))(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -18836,12 +18894,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 24.9.1 + '@types/node': 24.9.2 jsdom: 27.0.1(postcss@8.5.6) transitivePeerDependencies: - jiti @@ -18880,7 +18938,7 @@ snapshots: dependencies: xml-name-validator: 5.0.0 - wavesurfer.js@7.11.0: {} + wavesurfer.js@7.11.1: {} wcwidth@1.0.1: dependencies: @@ -18920,7 +18978,7 @@ snapshots: tr46: 1.0.1 webidl-conversions: 4.0.2 - when-exit@2.1.4: {} + when-exit@2.1.5: {} which@2.0.2: dependencies: @@ -18941,7 +18999,7 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20251011.0 '@cloudflare/workerd-windows-64': 1.20251011.0 - wrangler@4.45.0: + wrangler@4.45.2: dependencies: '@cloudflare/kv-asset-handler': 0.4.0 '@cloudflare/unenv-preset': 2.7.8(unenv@2.0.0-rc.21)(workerd@1.20251011.0) @@ -19030,7 +19088,7 @@ snapshots: dependencies: '@poppinss/colors': 4.1.5 '@poppinss/dumper': 0.6.4 - '@speed-highlight/core': 1.2.7 + '@speed-highlight/core': 1.2.8 cookie: 1.0.2 youch-core: 0.3.3 @@ -19050,10 +19108,10 @@ snapshots: optionalDependencies: react: 19.2.0 - zustand@5.0.8(@types/react@19.2.2)(immer@10.1.3)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)): + zustand@5.0.8(@types/react@19.2.2)(immer@10.2.0)(react@19.2.0)(use-sync-external-store@1.6.0(react@19.2.0)): optionalDependencies: '@types/react': 19.2.2 - immer: 10.1.3 + immer: 10.2.0 react: 19.2.0 use-sync-external-store: 1.6.0(react@19.2.0)