diff --git a/Cargo.lock b/Cargo.lock index 5f1e86a8f6..930b776b59 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,7 +56,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand 0.9.1", + "rand 0.9.2", "sha1", "smallvec 1.15.1", "tokio", @@ -100,7 +100,7 @@ dependencies = [ "futures-core", "futures-util", "mio", - "socket2", + "socket2 0.5.10", "tokio", "tracing", ] @@ -158,7 +158,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec 1.15.1", - "socket2", + "socket2 0.5.10", "time", "tracing", "url", @@ -618,13 +618,16 @@ dependencies = [ "enumflags2", "futures-channel", "futures-util", - "rand 0.9.1", + "rand 0.9.2", "raw-window-handle", "serde", "serde_repr", "tokio", "url", - "zbus 5.8.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "zbus 5.9.0", ] [[package]] @@ -713,9 +716,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.25" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40f6024f3f856663b45fd0c9b6f2024034a702f453549449e0d84a305900dad4" +checksum = "ddb939d66e4ae03cee6091612804ba446b12878410cfa17f785f4dd67d4014e8" dependencies = [ "flate2", "futures-core", @@ -740,9 +743,9 @@ dependencies = [ [[package]] name = "async-fs" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" +checksum = "09f7e37c0ed80b2a977691c47dae8625cfb21e205827106c64f7c588766b2e50" dependencies = [ "async-lock", "blocking", @@ -751,9 +754,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1237c0ae75a0f3765f58910ff9cdd0a12eeb39ab2f4c7de23262f337f0aacbb3" +checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" dependencies = [ "async-lock", "cfg-if", @@ -762,10 +765,9 @@ dependencies = [ "futures-lite 2.6.0", "parking", "polling", - "rustix 1.0.7", + "rustix 1.0.8", "slab", - "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -819,9 +821,9 @@ dependencies = [ [[package]] name = "async-process" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde3f4e40e6021d7acffc90095cbd6dc54cb593903d1de5832f435eb274b85dc" +checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" dependencies = [ "async-channel 2.5.0", "async-io", @@ -832,8 +834,7 @@ dependencies = [ "cfg-if", "event-listener 5.4.0", "futures-lite 2.6.0", - "rustix 1.0.7", - "tracing", + "rustix 1.0.8", ] [[package]] @@ -849,9 +850,9 @@ dependencies = [ [[package]] name = "async-signal" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7605a4e50d4b06df3898d5a70bf5fde51ed9059b0434b73105193bc27acce0d" +checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" dependencies = [ "async-io", "async-lock", @@ -859,10 +860,10 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 1.0.7", + "rustix 1.0.8", "signal-hook-registry", "slab", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -1024,9 +1025,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-config" -version = "1.8.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c18d005c70d2b9c0c1ea8876c039db0ec7fb71164d25c73ccea21bf41fd02171" +checksum = "c0baa720ebadea158c5bda642ac444a2af0cdf7bb66b46d1e4533de5d1f449d0" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1054,9 +1055,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.3" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687bc16bc431a8533fe0097c7f0182874767f920989d7260950172ae8e3c4465" +checksum = "b68c2194a190e1efc999612792e25b1ab3abfefe4306494efaaabc25933c0cbe" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -1066,9 +1067,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.13.2" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08b5d4e069cbc868041a64bd68dc8cb39a0d79585cd6c5a24caa8c2d622121be" +checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba" dependencies = [ "aws-lc-sys", "zeroize", @@ -1089,9 +1090,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.5.8" +version = "1.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f6c68419d8ba16d9a7463671593c54f81ba58cab466e9b759418da606dcc2e2" +checksum = "b2090e664216c78e766b6bac10fe74d2f451c02441d43484cd76ac9a295075f7" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -1114,9 +1115,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.96.0" +version = "1.100.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e25d24de44b34dcdd5182ac4e4c6f07bcec2661c505acef94c0d293b65505fe" +checksum = "8c5eafbdcd898114b839ba68ac628e31c4cfc3e11dfca38dc1b2de2f35bb6270" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1148,9 +1149,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.74.0" +version = "1.78.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a69de9c1b9272da2872af60c7402683e7f45c06267735b4332deacb203239b" +checksum = "dbd7bc4bd34303733bded362c4c997a39130eac4310257c79aae8484b1c4b724" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1170,9 +1171,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.75.0" +version = "1.79.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b161d836fac72bdd5ac1a4cd1cdc38ab888c7af26cfd95f661be4409505e63" +checksum = "77358d25f781bb106c1a69531231d4fd12c6be904edb0c47198c604df5a2dbca" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1192,9 +1193,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.76.0" +version = "1.80.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb1cd79a3412751a341a28e2cd0d6fa4345241976da427b075a0c0cd5409f886" +checksum = "06e3ed2a9b828ae7763ddaed41d51724d2661a50c45f845b08967e52f4939cfc" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1254,9 +1255,9 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.63.4" +version = "0.63.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "244f00666380d35c1c76b90f7b88a11935d11b84076ac22a4c014ea0939627af" +checksum = "5ab9472f7a8ec259ddb5681d2ef1cb1cf16c0411890063e67cdc7b62562cc496" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -1274,9 +1275,9 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.60.9" +version = "0.60.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338a3642c399c0a5d157648426110e199ca7fd1c689cc395676b81aa563700c4" +checksum = "604c7aec361252b8f1c871a7641d5e0ba3a7f5a586e51b66bc9510a5519594d9" dependencies = [ "aws-smithy-types", "bytes", @@ -1285,9 +1286,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.1" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99335bec6cdc50a346fda1437f9fefe33abf8c99060739a546a16457f2862ca9" +checksum = "43c82ba4cab184ea61f6edaafc1072aad3c2a17dcf4c0fce19ac5694b90d8b5f" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", @@ -1363,9 +1364,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.8.4" +version = "1.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3aaec682eb189e43c8a19c3dab2fe54590ad5f2cc2d26ab27608a20f2acf81c" +checksum = "660f70d9d8af6876b4c9aa8dcb0dbaf0f89b04ee9a4455bea1b4ba03b15f26f6" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -1387,9 +1388,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.8.3" +version = "1.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852b9226cb60b78ce9369022c0df678af1cac231c882d5da97a0c4e03be6e67" +checksum = "937a49ecf061895fca4a6dd8e864208ed9be7546c0527d04bc07d502ec5fba1c" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -1439,9 +1440,9 @@ dependencies = [ [[package]] name = "aws-types" -version = "1.3.7" +version = "1.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a322fec39e4df22777ed3ad8ea868ac2f94cd15e1a55f6ee8d8d6305057689a" +checksum = "b069d19bf01e46298eaedd7c6f283fe565a59263e53eebec945f3e6398f42390" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -2043,9 +2044,9 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.9.3" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" +checksum = "441473f2b4b0459a68628c744bc61d23e730fb00128b841d30fa4bb3972257e4" dependencies = [ "proc-macro2", "quote", @@ -2213,7 +2214,7 @@ dependencies = [ "memmap2", "num-traits", "num_cpus", - "rand 0.9.1", + "rand 0.9.2", "rand_distr", "rayon", "safetensors", @@ -2249,7 +2250,7 @@ dependencies = [ "candle-nn", "fancy-regex 0.13.0", "num-traits", - "rand 0.9.1", + "rand 0.9.2", "rayon", "serde", "serde_json", @@ -2288,12 +2289,12 @@ dependencies = [ [[package]] name = "cargo_toml" -version = "0.22.1" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02260d489095346e5cafd04dea8e8cb54d1d74fcd759022a9b72986ebe9a1257" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" dependencies = [ "serde", - "toml 0.8.23", + "toml 0.9.2", ] [[package]] @@ -2304,9 +2305,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "castaway" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" dependencies = [ "rustversion", ] @@ -2322,9 +2323,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.29" +version = "1.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362" +checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" dependencies = [ "jobserver", "libc", @@ -2591,9 +2592,9 @@ dependencies = [ [[package]] name = "clipboard-win" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" dependencies = [ "error-code", ] @@ -2994,15 +2995,15 @@ dependencies = [ "crc", "digest 0.10.7", "libc", - "rand 0.9.1", + "rand 0.9.2", "regex", ] [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -3224,6 +3225,33 @@ dependencies = [ "zeroize", ] +[[package]] +name = "curve25519-dalek" +version = "4.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "darling" version = "0.20.11" @@ -3542,26 +3570,27 @@ dependencies = [ [[package]] name = "deepgram" -version = "0.6.9" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "818713217b9075f8676e4a1290d84fa6ae9eea2b43ad0482de3eff43c018a079" +checksum = "b7e55d68eeaf55308feb5cb6e948d49efa8564d0536a7375d8a9e06acbb5773a" dependencies = [ "anyhow", "bytes", "futures", - "http 0.2.12", + "http 1.3.1", "pin-project", - "reqwest 0.11.27", + "reqwest 0.12.22", "serde", "serde_json", "serde_urlencoded", "sha256", - "thiserror 1.0.69", + "thiserror 2.0.12", "tokio", "tokio-stream", - "tokio-tungstenite 0.20.1", + "tokio-tungstenite 0.27.0", "tokio-util", - "tungstenite 0.20.1", + "tracing", + "tungstenite 0.27.0", "url", "uuid", ] @@ -3592,6 +3621,7 @@ version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ + "const-oid 0.9.6", "pem-rfc7468", "zeroize", ] @@ -3708,7 +3738,7 @@ dependencies = [ "bytemuck_derive", "hashbrown 0.15.4", "regex-syntax 0.8.5", - "strum 0.27.1", + "strum 0.27.2", ] [[package]] @@ -3748,6 +3778,7 @@ dependencies = [ "tauri-plugin-fs", "tauri-plugin-global-shortcut", "tauri-plugin-http", + "tauri-plugin-keygen", "tauri-plugin-listener", "tauri-plugin-local-llm", "tauri-plugin-local-stt", @@ -3907,18 +3938,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" -[[package]] -name = "dispatch2" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a0d569e003ff27784e0e14e4a594048698e0c0f0b66cabcb51511be55a7caa0" -dependencies = [ - "bitflags 2.9.1", - "block2 0.6.1", - "libc", - "objc2 0.6.1", -] - [[package]] name = "dispatch2" version = "0.3.0" @@ -3926,6 +3945,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ "bitflags 2.9.1", + "block2 0.6.1", + "libc", "objc2 0.6.1", ] @@ -3940,6 +3961,15 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading 0.8.8", +] + [[package]] name = "dlopen2" version = "0.7.0" @@ -4080,7 +4110,7 @@ dependencies = [ "der 0.6.1", "elliptic-curve", "rfc6979", - "signature", + "signature 1.6.4", ] [[package]] @@ -4089,7 +4119,18 @@ version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" dependencies = [ - "signature", + "signature 1.6.4", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8 0.10.2", + "serde", + "signature 2.2.0", ] [[package]] @@ -4098,14 +4139,28 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ - "curve25519-dalek", - "ed25519", + "curve25519-dalek 3.2.0", + "ed25519 1.5.3", "rand 0.7.3", "serde", "sha2 0.9.9", "zeroize", ] +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek 4.1.3", + "ed25519 2.2.3", + "serde", + "sha2 0.10.9", + "subtle", + "zeroize", +] + [[package]] name = "either" version = "1.15.0" @@ -4125,7 +4180,7 @@ dependencies = [ "ff", "generic-array", "group", - "pkcs8", + "pkcs8 0.9.0", "rand_core 0.6.4", "sec1", "subtle", @@ -4414,6 +4469,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + [[package]] name = "field-offset" version = "0.3.6" @@ -5142,7 +5203,7 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc257fdb4038301ce4b9cd1b3b51704509692bb3ff716a410cbd07925d9dae55" dependencies = [ - "rustix 1.0.7", + "rustix 1.0.8", "windows-targets 0.52.6", ] @@ -5749,9 +5810,9 @@ dependencies = [ [[package]] name = "gix-path" -version = "0.10.18" +version = "0.10.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567f65fec4ef10dfab97ae71f26a27fd4d7fe7b8e3f90c8a58551c41ff3fb65b" +checksum = "c6279d323d925ad4790602105ae27df4b915e7a7d81e4cdba2603121c03ad111" dependencies = [ "bstr", "gix-trace", @@ -5954,9 +6015,9 @@ dependencies = [ [[package]] name = "gix-trace" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c396a2036920c69695f760a65e7f2677267ccf483f25046977d87e4cb2665f7" +checksum = "e2ccaf54b0b1743a695b482ca0ab9d7603744d8d10b2e5d1a332fef337bee658" [[package]] name = "gix-transport" @@ -6463,7 +6524,7 @@ dependencies = [ "cfg-if", "crunchy", "num-traits", - "rand 0.9.1", + "rand 0.9.2", "rand_distr", ] @@ -6602,7 +6663,7 @@ dependencies = [ "log", "native-tls", "num_cpus", - "rand 0.9.1", + "rand 0.9.2", "reqwest 0.12.22", "serde", "serde_json", @@ -6813,7 +6874,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -6906,7 +6967,7 @@ dependencies = [ "tokio", "tokio-rustls 0.26.2", "tower-service", - "webpki-roots 1.0.1", + "webpki-roots 1.0.2", ] [[package]] @@ -6965,9 +7026,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" dependencies = [ "base64 0.22.1", "bytes", @@ -6981,7 +7042,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.0", "system-configuration 0.6.1", "tokio", "tower-service", @@ -7321,9 +7382,9 @@ dependencies = [ [[package]] name = "io-uring" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" dependencies = [ "bitflags 2.9.1", "cfg-if", @@ -7702,7 +7763,7 @@ dependencies = [ "base64 0.21.7", "chrono", "dotenv", - "ed25519-dalek", + "ed25519-dalek 1.0.1", "futures", "futures-timer", "hex", @@ -7942,20 +8003,20 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1580801010e535496706ba011c15f8532df6b42297d2e471fec38ceadd8c0638" +checksum = "4488594b9328dee448adb906d8b126d9b7deb7cf5c22161ee591610bb1be83c0" dependencies = [ "bitflags 2.9.1", "libc", - "redox_syscall 0.5.13", + "redox_syscall 0.5.15", ] [[package]] name = "libsql" -version = "0.9.17" +version = "0.9.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d445da25d61b9413dae38d481799cfe5054502fb849c18f7a4a1ffeff39ef19" +checksum = "c92f460194a673c29e82520a061a82f83892faca9ce6881db93d591cd38cb3dc" dependencies = [ "anyhow", "async-stream", @@ -7993,9 +8054,9 @@ dependencies = [ [[package]] name = "libsql-ffi" -version = "0.9.17" +version = "0.9.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5a6c4c1d1ff03ed18f10ce9d1ee6b3820b0ef77e5656ccbfdb02388c025937d" +checksum = "64691b229b9d5c0754115f59a0e5c0d1bcc102bfe402b96f2bbf9d5150a4ab3c" dependencies = [ "bindgen 0.66.1", "cc", @@ -8005,9 +8066,9 @@ dependencies = [ [[package]] name = "libsql-hrana" -version = "0.9.17" +version = "0.9.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9d38212a209cbecb16dabd681afaa3cd4498c5ccef46d838ad7162aed9a86c" +checksum = "c18b78daf4af8603c048f584faada18c8970f4f3af16df0c3319a92c90d0d696" dependencies = [ "base64 0.21.7", "bytes", @@ -8017,9 +8078,9 @@ dependencies = [ [[package]] name = "libsql-rusqlite" -version = "0.9.17" +version = "0.9.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310b02070aa2098e6706ccade6b6bbb3c696b207bf23cd20e9635c4a2dbabde0" +checksum = "c502ebc6fd1a7ba1b686c47226016fb8e913080c4021491bda33ca33c6fa1ab4" dependencies = [ "bitflags 2.9.1", "fallible-iterator 0.2.0", @@ -8049,9 +8110,9 @@ dependencies = [ [[package]] name = "libsql-sys" -version = "0.9.17" +version = "0.9.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec1127725da9cfb9fc473b281ee09c1a8a3e103785e663b2e8391f11f0c119f" +checksum = "9e7b9ab82fa6122efe2b2fe066043d6330aa4a7aa656b4ec0df9768ffd1ea6a0" dependencies = [ "bytes", "libsql-ffi", @@ -8063,9 +8124,9 @@ dependencies = [ [[package]] name = "libsql_replication" -version = "0.9.17" +version = "0.9.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff72eb531eb84fa38d6683f5af31668ea59fd52ac1b461515e82bcf4b21ba98f" +checksum = "aa911faee7c1e039a44aeced5e61b5106fb714782e26d89216c87c83eb1ce410" dependencies = [ "aes 0.8.4", "async-stream", @@ -8122,9 +8183,9 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "litrs" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" [[package]] name = "llama" @@ -8142,7 +8203,7 @@ dependencies = [ "llama-cpp-2", "llama-cpp-sys-2", "llguidance", - "rand 0.9.1", + "rand 0.9.2", "serde", "serde_json", "template", @@ -8181,9 +8242,9 @@ dependencies = [ [[package]] name = "llguidance" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "774e5b64a925b938af54dd53a8dd767e1d6575ea8b8cc850a483d6e42d437d64" +checksum = "5ed44400c69591dcf106e666fb4504d35598eaaafbf78237ebc9d4e1ee3a51cf" dependencies = [ "anyhow", "derivre", @@ -8439,9 +8500,9 @@ checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memmap2" -version = "0.9.5" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28" dependencies = [ "libc", "stable_deref_trait", @@ -9262,7 +9323,7 @@ checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" dependencies = [ "bitflags 2.9.1", "block2 0.6.1", - "dispatch2 0.3.0", + "dispatch2", "libc", "objc2 0.6.1", ] @@ -9274,7 +9335,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" dependencies = [ "bitflags 2.9.1", - "dispatch2 0.3.0", + "dispatch2", "objc2 0.6.1", "objc2-core-foundation", "objc2-io-surface", @@ -9330,7 +9391,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "159be6e4cd366c7d236d798daa2aa71855230e5691cde045a0670ce01a06d664" dependencies = [ - "dispatch2 0.3.0", + "dispatch2", "objc2 0.6.1", "objc2-core-foundation", "objc2-security", @@ -10004,7 +10065,7 @@ checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.13", + "redox_syscall 0.5.15", "smallvec 1.15.1", "windows-targets 0.52.6", ] @@ -10365,7 +10426,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" dependencies = [ "der 0.6.1", - "spki", + "spki 0.6.0", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der 0.7.10", + "spki 0.7.3", ] [[package]] @@ -10436,17 +10507,16 @@ dependencies = [ [[package]] name = "polling" -version = "3.8.0" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" +checksum = "8ee9b2fa7a4517d2c91ff5bc6c297a427a96749d15f98fcdbb22c05571a4d4b7" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix 1.0.7", - "tracing", - "windows-sys 0.59.0", + "rustix 1.0.8", + "windows-sys 0.60.2", ] [[package]] @@ -10519,9 +10589,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "prettyplease" -version = "0.2.35" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a" +checksum = "ff24dfcda44452b9816fff4cd4227e1bb73ff5a2f1bc1105aa92fb8565ce44d2" dependencies = [ "proc-macro2", "syn 2.0.104", @@ -10806,7 +10876,7 @@ dependencies = [ "quinn-udp", "rustc-hash 2.1.1", "rustls 0.23.29", - "socket2", + "socket2 0.5.10", "thiserror 2.0.12", "tokio", "tracing", @@ -10822,7 +10892,7 @@ dependencies = [ "bytes", "getrandom 0.3.3", "lru-slab", - "rand 0.9.1", + "rand 0.9.2", "ring 0.17.14", "rustc-hash 2.1.1", "rustls 0.23.29", @@ -10843,7 +10913,7 @@ dependencies = [ "cfg_aliases 0.2.1", "libc", "once_cell", - "socket2", + "socket2 0.5.10", "tracing", "windows-sys 0.59.0", ] @@ -10890,9 +10960,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -10962,7 +11032,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand 0.9.1", + "rand 0.9.2", ] [[package]] @@ -11088,9 +11158,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "7e8af0dde094006011e6a740d4879319439489813bd0bcdc7d821beaeeff48ec" dependencies = [ "bitflags 2.9.1", ] @@ -11213,9 +11283,9 @@ dependencies = [ [[package]] name = "regress" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ef7fa9ed0256d64a688a3747d0fef7a88851c18a5e1d57f115f38ec2e09366" +checksum = "145bb27393fe455dd64d6cbc8d059adfa392590a45eadf079c01b11857e7b010" dependencies = [ "hashbrown 0.15.4", "memchr", @@ -11268,12 +11338,10 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-rustls 0.24.1", - "tokio-util", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", - "wasm-streams", "web-sys", "webpki-roots 0.25.4", "winreg 0.50.0", @@ -11328,7 +11396,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 1.0.1", + "webpki-roots 1.0.2", ] [[package]] @@ -11497,8 +11565,8 @@ dependencies = [ "jsonptr 0.5.1", "pin-project-lite", "prettyplease", - "rand 0.9.1", - "regress 0.10.3", + "rand 0.9.2", + "regress 0.10.4", "restate-sdk-macros", "restate-sdk-shared-core", "serde", @@ -11539,7 +11607,7 @@ dependencies = [ "ring 0.17.14", "serde", "sha2 0.11.0-pre.3", - "strum 0.27.1", + "strum 0.27.2", "thiserror 2.0.12", "tracing", ] @@ -11583,13 +11651,13 @@ dependencies = [ [[package]] name = "rfd" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80c844748fdc82aae252ee4594a89b6e7ebef1063de7951545564cbc4e57075d" +checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" dependencies = [ "ashpd", "block2 0.6.1", - "dispatch2 0.2.0", + "dispatch2", "glib-sys", "gobject-sys", "gtk-sys", @@ -11766,15 +11834,15 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.9.4", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -12079,6 +12147,12 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -12117,9 +12191,9 @@ dependencies = [ [[package]] name = "sdd" -version = "3.0.9" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f5557d2bbddd5afd236ba7856b0e494f5acc7ce805bb0774cc5674b20a06b4" +checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" [[package]] name = "seahash" @@ -12136,7 +12210,7 @@ dependencies = [ "base16ct", "der 0.6.1", "generic-array", - "pkcs8", + "pkcs8 0.9.0", "subtle", "zeroize", ] @@ -12342,7 +12416,7 @@ version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7426d4beec270cfdbb50f85f0bb2ce176ea57eed0b11741182a163055a558187" dependencies = [ - "rand 0.9.1", + "rand 0.9.2", "sentry-types 0.38.1", "serde", "serde_json", @@ -12449,7 +12523,7 @@ checksum = "04b6c9287202294685cb1f749b944dbbce8160b81a1061ecddc073025fed129f" dependencies = [ "debugid", "hex", - "rand 0.9.1", + "rand 0.9.2", "serde", "serde_json", "thiserror 2.0.12", @@ -12552,9 +12626,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.141" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" dependencies = [ "indexmap 2.10.0", "itoa", @@ -12954,6 +13028,15 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "silero" version = "0.1.0" @@ -13054,7 +13137,7 @@ dependencies = [ "lazy_static", "mime", "mime_guess", - "rand 0.9.1", + "rand 0.9.2", "rsb_derive", "rvstruct", "serde", @@ -13135,6 +13218,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "socks" version = "0.3.4" @@ -13162,7 +13255,7 @@ dependencies = [ "objc2-foundation 0.2.2", "objc2-quartz-core 0.2.2", "raw-window-handle", - "redox_syscall 0.5.13", + "redox_syscall 0.5.15", "wasm-bindgen", "web-sys", "windows-sys 0.59.0", @@ -13265,6 +13358,16 @@ dependencies = [ "der 0.6.1", ] +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der 0.7.10", +] + [[package]] name = "spm_precompiled" version = "0.1.4" @@ -13390,11 +13493,11 @@ dependencies = [ [[package]] name = "strum" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ - "strum_macros 0.27.1", + "strum_macros 0.27.2", ] [[package]] @@ -13425,14 +13528,13 @@ dependencies = [ [[package]] name = "strum_macros" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "rustversion", "syn 2.0.104", ] @@ -13875,9 +13977,9 @@ dependencies = [ [[package]] name = "tauri" -version = "2.6.2" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "124e129c9c0faa6bec792c5948c89e86c90094133b0b9044df0ce5f0a8efaa0d" +checksum = "352a4bc7bf6c25f5624227e3641adf475a6535707451b09bb83271df8b7a6ac7" dependencies = [ "anyhow", "bytes", @@ -13927,9 +14029,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f025c389d3adb83114bec704da973142e82fc6ec799c7c750c5e21cefaec83" +checksum = "182d688496c06bf08ea896459bf483eb29cdff35c1c4c115fb14053514303064" dependencies = [ "anyhow", "cargo_toml", @@ -13949,9 +14051,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5df493a1075a241065bc865ed5ef8d0fbc1e76c7afdc0bf0eccfaa7d4f0e406" +checksum = "b54a99a6cd8e01abcfa61508177e6096a4fe2681efecee9214e962f2f073ae4a" dependencies = [ "base64 0.22.1", "brotli", @@ -13976,9 +14078,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f237fbea5866fa5f2a60a21bea807a2d6e0379db070d89c3a10ac0f2d4649bbc" +checksum = "7945b14dc45e23532f2ded6e120170bbdd4af5ceaa45784a6b33d250fbce3f9e" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -14006,9 +14108,9 @@ dependencies = [ [[package]] name = "tauri-plugin" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d9a0bd00bf1930ad1a604d08b0eb6b2a9c1822686d65d7f4731a7723b8901d3" +checksum = "5bd5c1e56990c70a906ef67a9851bbdba9136d26075ee9a2b19c8b46986b3e02" dependencies = [ "anyhow", "glob", @@ -14157,9 +14259,9 @@ dependencies = [ [[package]] name = "tauri-plugin-deep-link" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab261eb006db10ab478e3fbb5a4e2692df3f7eb3e28300ee2b64428979167ed0" +checksum = "1fec67f32d7a06d80bd3dc009fdb678c35a66116d9cb8cd2bb32e406c2b5bbd2" dependencies = [ "dunce", "rust-ini", @@ -14177,9 +14279,9 @@ dependencies = [ [[package]] name = "tauri-plugin-dialog" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aefb14219b492afb30b12647b5b1247cadd2c0603467310c36e0f7ae1698c28" +checksum = "05bedd4c3cf6f7aa97918a8814a736bd3695c9ddf3ede2d50eda6069c3290edc" dependencies = [ "log", "raw-window-handle", @@ -14210,9 +14312,9 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c341290d31991dbca38b31d412c73dfbdb070bb11536784f19dd2211d13b778f" +checksum = "8c6ef84ee2f2094ce093e55106d90d763ba343fad57566992962e8f76d113f99" dependencies = [ "anyhow", "dunce", @@ -14249,9 +14351,9 @@ dependencies = [ [[package]] name = "tauri-plugin-http" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c1a38da944b357ffa23bafd563b1579f18e6fbd118fcd84769406d35dcc5c7" +checksum = "fcde333d97e565a7765aad82f32d8672458f7bd77b6ee653830d5dded9d7b5c2" dependencies = [ "bytes", "cookie_store", @@ -14271,6 +14373,29 @@ dependencies = [ "urlpattern", ] +[[package]] +name = "tauri-plugin-keygen" +version = "2.0.0" +source = "git+https://github.com/bagindo/tauri-plugin-keygen?branch=v2#e0de03a76a5c82c36adb347e43e4bff4f78c87de" +dependencies = [ + "aes-gcm", + "base64 0.21.7", + "chrono", + "ed25519-dalek 2.2.0", + "hex", + "machine-uid", + "reqwest 0.12.22", + "serde", + "serde_json", + "sha2 0.10.9", + "tauri", + "tauri-plugin", + "tauri-plugin-os", + "thiserror 1.0.69", + "tokio", + "whoami", +] + [[package]] name = "tauri-plugin-listener" version = "0.1.0" @@ -14518,7 +14643,7 @@ dependencies = [ "thiserror 2.0.12", "url", "windows 0.61.3", - "zbus 5.8.0", + "zbus 5.9.0", ] [[package]] @@ -14548,7 +14673,7 @@ dependencies = [ "bitflags 2.9.1", "itertools 0.14.0", "serde", - "strum 0.27.1", + "strum 0.27.2", "tauri", "tauri-plugin", "thiserror 2.0.12", @@ -14621,9 +14746,9 @@ dependencies = [ [[package]] name = "tauri-plugin-single-instance" -version = "2.3.0" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b441b6d5d1a194e9fee0b358fe0d602ded845d0f580e1f8c8ef78ebc3c8b225d" +checksum = "50a0e5a4ce43cb3a733c3aef85e8478bc769dac743c615e26639cbf5d953faf7" dependencies = [ "serde", "serde_json", @@ -14632,7 +14757,7 @@ dependencies = [ "thiserror 2.0.12", "tracing", "windows-sys 0.60.2", - "zbus 5.8.0", + "zbus 5.9.0", ] [[package]] @@ -14724,6 +14849,7 @@ dependencies = [ name = "tauri-plugin-tray" version = "0.1.0" dependencies = [ + "serde_json", "specta", "specta-typescript", "tauri", @@ -14770,9 +14896,9 @@ dependencies = [ [[package]] name = "tauri-plugin-window-state" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3d22b21b9cec73601b512a868f7c74f93c044d44fd6ca1c84e9d6afb6b1559" +checksum = "2d5f6fe3291bfa609c7e0b0ee3bedac294d94c7018934086ce782c1d0f2a468e" dependencies = [ "bitflags 2.9.1", "log", @@ -14792,6 +14918,7 @@ dependencies = [ "objc2-foundation 0.3.1", "once_cell", "serde", + "serde_json", "specta", "specta-typescript", "strum 0.26.3", @@ -14809,9 +14936,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e7bb73d1bceac06c20b3f755b2c8a2cb13b20b50083084a8cf3700daf397ba4" +checksum = "2b1cc885be806ea15ff7b0eb47098a7b16323d9228876afda329e34e2d6c4676" dependencies = [ "cookie", "dpi", @@ -14831,9 +14958,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "902b5aa9035e16f342eb64f8bf06ccdc2808e411a2525ed1d07672fa4e780bad" +checksum = "fe653a2fbbef19fe898efc774bc52c8742576342a33d3d028c189b57eb1d2439" dependencies = [ "gtk", "http 1.3.1", @@ -14886,9 +15013,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41743bbbeb96c3a100d234e5a0b60a46d5aa068f266160862c7afdbf828ca02e" +checksum = "9330c15cabfe1d9f213478c9e8ec2b0c76dab26bb6f314b8ad1c8a568c1d186e" dependencies = [ "anyhow", "brotli", @@ -14949,7 +15076,7 @@ dependencies = [ "fastrand 2.3.0", "getrandom 0.3.3", "once_cell", - "rustix 1.0.7", + "rustix 1.0.8", "windows-sys 0.59.0", ] @@ -15205,7 +15332,7 @@ dependencies = [ "monostate", "onig", "paste", - "rand 0.9.1", + "rand 0.9.2", "rayon", "rayon-cond", "regex", @@ -15234,7 +15361,7 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", - "socket2", + "socket2 0.5.10", "tokio-macros", "tracing", "windows-sys 0.52.0", @@ -15242,9 +15369,9 @@ dependencies = [ [[package]] name = "tokio-io-timeout" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +checksum = "0bd86198d9ee903fedd2f9a2e72014287c0d9167e4ae43b5853007205dda1b76" dependencies = [ "pin-project-lite", "tokio", @@ -15328,21 +15455,6 @@ dependencies = [ "xattr", ] -[[package]] -name = "tokio-tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" -dependencies = [ - "futures-util", - "log", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", - "tungstenite 0.20.1", - "webpki-roots 0.25.4", -] - [[package]] name = "tokio-tungstenite" version = "0.26.2" @@ -15371,6 +15483,7 @@ dependencies = [ "tokio", "tokio-rustls 0.26.2", "tungstenite 0.27.0", + "webpki-roots 0.26.11", ] [[package]] @@ -15388,9 +15501,9 @@ dependencies = [ [[package]] name = "toktrie" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747b19d4f97f841cc720aaffb1fa3dbf08bc72abd9199dcf34b0fad7b1a3691c" +checksum = "1c01fe70e9a91498c029fb6d5aacf9a648bb1bf30a5db4c344d3effb6367b1f3" dependencies = [ "anyhow", "bytemuck", @@ -15401,9 +15514,9 @@ dependencies = [ [[package]] name = "toktrie_hf_downloader" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9a8a6313b9f5701d44ceb4e70529b7fe9e1cdb3d86b8d2e88eea1b29e543fb5" +checksum = "3f3c731f3d9ecd85cadc5cac6556bc71de2e67aa384327f5bba9f8fbb16f0999" dependencies = [ "anyhow", "hf-hub 0.4.3", @@ -15414,9 +15527,9 @@ dependencies = [ [[package]] name = "toktrie_hf_tokenizers" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f942aa9bcd67f39dfeec0d5b80a40ae32e5ae38c0c58777b7d47fa393177f" +checksum = "759491ad9b56050f817e24d68f48eb7f13bee5f8b48127ba3a9079a579726f40" dependencies = [ "anyhow", "log", @@ -15578,7 +15691,7 @@ dependencies = [ "prost 0.13.5", "rustls-native-certs 0.8.1", "rustls-pemfile 2.2.0", - "socket2", + "socket2 0.5.10", "tokio", "tokio-rustls 0.26.2", "tokio-stream", @@ -15889,26 +16002,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 0.2.12", - "httparse", - "log", - "rand 0.8.5", - "rustls 0.21.12", - "sha1", - "thiserror 1.0.69", - "url", - "utf-8", -] - [[package]] name = "tungstenite" version = "0.26.2" @@ -15921,7 +16014,7 @@ dependencies = [ "httparse", "log", "native-tls", - "rand 0.9.1", + "rand 0.9.2", "sha1", "thiserror 2.0.12", "utf-8", @@ -15938,7 +16031,7 @@ dependencies = [ "http 1.3.1", "httparse", "log", - "rand 0.9.1", + "rand 0.9.2", "rustls 0.23.29", "rustls-pki-types", "sha1", @@ -16070,7 +16163,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "470dbf6591da1b39d43c14523b2b469c86879a53e8b758c8e090a470fe7b1fbe" dependencies = [ - "rand 0.9.1", + "rand 0.9.2", "uuid", "web-time", ] @@ -16349,7 +16442,7 @@ checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" dependencies = [ "getrandom 0.3.3", "js-sys", - "rand 0.9.1", + "rand 0.9.2", "serde", "wasm-bindgen", ] @@ -16503,6 +16596,12 @@ dependencies = [ "wit-bindgen-rt", ] +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -16611,6 +16710,7 @@ dependencies = [ "cc", "downcast-rs", "rustix 0.38.44", + "scoped-tls", "smallvec 1.15.1", "wayland-sys", ] @@ -16669,6 +16769,8 @@ version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" dependencies = [ + "dlib", + "log", "pkg-config", ] @@ -16742,14 +16844,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" dependencies = [ - "webpki-root-certs 1.0.1", + "webpki-root-certs 1.0.2", ] [[package]] name = "webpki-root-certs" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86138b15b2b7d561bc4469e77027b8dd005a43dc502e9031d1f5afc8ce1f280e" +checksum = "4e4ffd8df1c57e87c325000a3d6ef93db75279dc3a231125aac571650f22b12a" dependencies = [ "rustls-pki-types", ] @@ -16766,14 +16868,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.1", + "webpki-roots 1.0.2", ] [[package]] name = "webpki-roots" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] @@ -16957,6 +17059,17 @@ dependencies = [ "fs_extra", ] +[[package]] +name = "whoami" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" +dependencies = [ + "redox_syscall 0.5.15", + "wasite", + "web-sys", +] + [[package]] name = "widestring" version = "1.2.0" @@ -17820,7 +17933,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" dependencies = [ "libc", - "rustix 1.0.7", + "rustix 1.0.8", ] [[package]] @@ -17966,9 +18079,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.8.0" +version = "5.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597f45e98bc7e6f0988276012797855613cd8269e23b5be62cc4e5d28b7e515d" +checksum = "4bb4f9a464286d42851d18a605f7193b8febaf5b0919d71c6399b7b26e5b0aad" dependencies = [ "async-broadcast", "async-executor", @@ -17993,7 +18106,7 @@ dependencies = [ "uds_windows", "windows-sys 0.59.0", "winnow 0.7.12", - "zbus_macros 5.8.0", + "zbus_macros 5.9.0", "zbus_names 4.2.0", "zvariant 5.6.0", ] @@ -18013,9 +18126,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.8.0" +version = "5.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c8e4e14dcdd9d97a98b189cd1220f30e8394ad271e8c987da84f73693862c2" +checksum = "ef9859f68ee0c4ee2e8cde84737c78e3f4c54f946f2a38645d0d4c7a95327659" dependencies = [ "proc-macro-crate 3.3.0", "proc-macro2", diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 4aabd09199..eed779ca80 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -93,6 +93,8 @@ "remixicon": "^4.6.0", "sonner": "^1.7.4", "tailwind-merge": "^2.6.0", + "tauri-plugin-keygen-api": "github:bagindo/tauri-plugin-keygen#v2", + "tauri-plugin-keygen-rs2-api": "^0.2.3", "tauri-plugin-sentry-api": "^0.4.1", "tippy.js": "^6.3.7", "zod": "^3.25.46", diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index 05b9f9d6fe..a0d80e61e1 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -58,6 +58,7 @@ tauri-plugin-dialog = { workspace = true } tauri-plugin-fs = { workspace = true, features = ["watch"] } tauri-plugin-global-shortcut = "2" tauri-plugin-http = { workspace = true } +tauri-plugin-keygen = { git = "https://github.com/bagindo/tauri-plugin-keygen", branch = "v2" } tauri-plugin-os = "2" tauri-plugin-prevent-default = { version = "1.2", features = ["unstable-windows"] } tauri-plugin-process = "2" diff --git a/apps/desktop/src-tauri/capabilities/default.json b/apps/desktop/src-tauri/capabilities/default.json index 4c1a00bb04..8041764075 100644 --- a/apps/desktop/src-tauri/capabilities/default.json +++ b/apps/desktop/src-tauri/capabilities/default.json @@ -88,6 +88,7 @@ { "url": "http://**" } ] }, - "dialog:allow-save" + "dialog:allow-save", + "keygen:default" ] } diff --git a/apps/desktop/src-tauri/src/deeplink.rs b/apps/desktop/src-tauri/src/deeplink.rs index a2493a036a..ceeb177368 100644 --- a/apps/desktop/src-tauri/src/deeplink.rs +++ b/apps/desktop/src-tauri/src/deeplink.rs @@ -24,8 +24,12 @@ pub fn parse(url: String) -> Vec { }; let dests = match parsed_url.path() { + // Specified in notification related codebase "/notification" => parse_notification_query(&parsed_url), + // Specified in /apps/admin "/register" => parse_register_query(&parsed_url), + // Specified in email template + "/license" => parse_license_query(&parsed_url), _ => vec![Destination::default()], }; @@ -80,6 +84,29 @@ fn parse_register_query(parsed_url: &url::Url) -> Vec { ] } +fn parse_license_query(parsed_url: &url::Url) -> Vec { + let main_url = "/app".to_string(); + + let settings_url = match parsed_url.query() { + Some(query) => match serde_qs::from_str::(query) { + Ok(params) => format!("/app/settings?tab=billing&key={}", params.key), + Err(_) => "/app/settings".to_string(), + }, + None => "/app/settings".to_string(), + }; + + vec![ + Destination { + window: HyprWindow::Main, + url: main_url, + }, + Destination { + window: HyprWindow::Settings, + url: settings_url, + }, + ] +} + #[derive(serde::Serialize, serde::Deserialize)] struct NotificationQuery { event_id: Option, @@ -91,6 +118,11 @@ struct RegisterQuery { api_key: String, } +#[derive(serde::Serialize, serde::Deserialize)] +struct LicenseQuery { + key: String, +} + #[cfg(test)] mod tests { use super::*; @@ -109,4 +141,16 @@ mod tests { "/app/register?base_url=http://localhost:3000&api_key=123" ); } + + #[test] + fn test_parse_license_query() { + let url = "hypr://hyprnote.com/license?key=123"; + + let dests = parse(url.to_string()); + assert_eq!(dests.len(), 1); + + let dest = dests.first().unwrap(); + assert_eq!(dest.window, HyprWindow::Main); + assert_eq!(dest.url, "/app"); + } } diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 17b58b2472..4ff4cafbcf 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -99,6 +99,13 @@ pub async fn main() { .plugin(tauri_plugin_membership::init()) .plugin(tauri_plugin_process::init()) .plugin(tauri_plugin_global_shortcut::Builder::new().build()) + .plugin( + tauri_plugin_keygen::Builder::new( + "76dfe152-397c-4689-9c5e-3669cefa34b9", + "13f18c98b8c1e5539d92df4aad2d51f4d203d5aead296215df7c3d6376b78b13", + ) + .build(), + ) .plugin(tauri_plugin_autostart::init( tauri_plugin_autostart::MacosLauncher::LaunchAgent, Some(vec![]), diff --git a/apps/desktop/src/components/human-profile/past-notes.tsx b/apps/desktop/src/components/human-profile/past-notes.tsx index c25757e4e0..438d4c5200 100644 --- a/apps/desktop/src/components/human-profile/past-notes.tsx +++ b/apps/desktop/src/components/human-profile/past-notes.tsx @@ -43,7 +43,7 @@ export function PastNotes({ human }: { human: Human }) { } else { const params = { to: "/app/new" } as const satisfies LinkProps; - windowsCommands.windowEmitNavigate({ type: "main" }, params.to).then(() => { + windowsCommands.windowEmitNavigate({ type: "main" }, { path: params.to, search: {} }).then(() => { windowsCommands.windowDestroy({ type: "human", value: human.id }); }); } diff --git a/apps/desktop/src/components/left-sidebar/top-area/settings-button.tsx b/apps/desktop/src/components/left-sidebar/top-area/settings-button.tsx index ef5555725a..09abc779d1 100644 --- a/apps/desktop/src/components/left-sidebar/top-area/settings-button.tsx +++ b/apps/desktop/src/components/left-sidebar/top-area/settings-button.tsx @@ -1,10 +1,12 @@ import { Trans } from "@lingui/react/macro"; +import type { LinkProps } from "@tanstack/react-router"; import { getName, getVersion } from "@tauri-apps/api/app"; -import { CogIcon, CpuIcon } from "lucide-react"; +import { CastleIcon, CogIcon, ShieldIcon } from "lucide-react"; import { useState } from "react"; import Shortcut from "@/components/shortcut"; import { useHypr } from "@/contexts"; +import { useLicense } from "@/hooks/use-license"; import { openURL } from "@/utils/shell"; import { commands as windowsCommands } from "@hypr/plugin-windows"; import { Button } from "@hypr/ui/components/ui/button"; @@ -21,6 +23,9 @@ export function SettingsButton() { const [open, setOpen] = useState(false); const { userId } = useHypr(); + const { getLicense } = useLicense(); + const isPro = !!getLicense.data?.valid; + const versionQuery = useQuery({ queryKey: ["appVersion"], queryFn: async () => { @@ -41,7 +46,13 @@ export function SettingsButton() { const handleClickPlans = () => { setOpen(false); - windowsCommands.windowShow({ type: "plans" }); + + windowsCommands.windowShow({ type: "settings" }).then(() => { + const params = { to: "/app/settings", search: { tab: "billing" } } as const satisfies LinkProps; + setTimeout(() => { + windowsCommands.windowEmitNavigate({ type: "settings" }, { path: params.to, search: params.search }); + }, 500); + }); }; const handleClickChangelog = async () => { @@ -71,27 +82,7 @@ export function SettingsButton() { -
-
-
-
- -
-
- Local mode -
-
- Privacy-focused AI -
-
-
-
+
); } + +function DropdownHeader({ + isPro, + handleClick, +}: { + isPro: boolean; + handleClick: () => void; +}) { + return ( +
+
+
+
+ {isPro ? : } +
+
+ {isPro ? "Pro Plan" : "Free Plan"} +
+
+ {isPro ? "Full features" : "Basic features"} +
+
+
+
+ ); +} diff --git a/apps/desktop/src/components/license.tsx b/apps/desktop/src/components/license.tsx new file mode 100644 index 0000000000..b38549a2cf --- /dev/null +++ b/apps/desktop/src/components/license.tsx @@ -0,0 +1,26 @@ +import { useEffect } from "react"; + +import { useLicense } from "@/hooks/use-license"; + +export function LicenseRefreshProvider({ children }: { children: React.ReactNode }) { + const { shouldRefresh, refreshLicense, getLicense } = useLicense(); + + useEffect(() => { + if (getLicense.isLoading) { + return; + } + + const checkAndRefresh = () => { + if (shouldRefresh() && !refreshLicense.isPending) { + refreshLicense.mutate({}); + } + }; + + checkAndRefresh(); + const interval = setInterval(checkAndRefresh, 1000 * 60 * 10); // 10min + + return () => clearInterval(interval); + }, [shouldRefresh, refreshLicense, getLicense.isLoading, refreshLicense.isPending]); + + return <>{children}; +} diff --git a/apps/desktop/src/components/right-panel/components/chat/empty-chat-state.tsx b/apps/desktop/src/components/right-panel/components/chat/empty-chat-state.tsx index 41e66b9e9a..ecac335aa9 100644 --- a/apps/desktop/src/components/right-panel/components/chat/empty-chat-state.tsx +++ b/apps/desktop/src/components/right-panel/components/chat/empty-chat-state.tsx @@ -1,8 +1,10 @@ -import { commands as windowsCommands } from "@hypr/plugin-windows"; -import { Badge } from "@hypr/ui/components/ui/badge"; import { Trans } from "@lingui/react/macro"; +import type { LinkProps } from "@tanstack/react-router"; import { memo, useCallback } from "react"; +import { commands as windowsCommands } from "@hypr/plugin-windows"; +import { Badge } from "@hypr/ui/components/ui/badge"; + interface EmptyChatStateProps { onQuickAction: (prompt: string) => void; onFocusInput: () => void; @@ -20,7 +22,11 @@ export const EmptyChatState = memo(({ onQuickAction, onFocusInput }: EmptyChatSt const handleCustomEndpointsClick = useCallback((e: React.MouseEvent) => { e.stopPropagation(); windowsCommands.windowShow({ type: "settings" }).then(() => { - windowsCommands.windowNavigate({ type: "settings" }, "/app/settings?tab=ai"); + const params = { to: "/app/settings", search: { tab: "ai" } } as const satisfies LinkProps; + + setTimeout(() => { + windowsCommands.windowEmitNavigate({ type: "settings" }, { path: params.to, search: params.search }); + }, 500); }); }, []); diff --git a/apps/desktop/src/components/settings/components/tab-icon.tsx b/apps/desktop/src/components/settings/components/tab-icon.tsx index 6ab5ef941c..285b2ef41c 100644 --- a/apps/desktop/src/components/settings/components/tab-icon.tsx +++ b/apps/desktop/src/components/settings/components/tab-icon.tsx @@ -3,7 +3,7 @@ import { BellIcon, BlocksIcon, CalendarIcon, - FlaskConicalIcon, + CreditCardIcon, LayoutTemplateIcon, MessageSquareIcon, SettingsIcon, @@ -20,8 +20,6 @@ export function TabIcon({ tab }: { tab: Tab }) { return ; case "sound": return ; - case "lab": - return ; case "feedback": return ; case "ai": @@ -32,6 +30,8 @@ export function TabIcon({ tab }: { tab: Tab }) { return ; case "integrations": return ; + case "billing": + return ; default: return null; } diff --git a/apps/desktop/src/components/settings/components/types.ts b/apps/desktop/src/components/settings/components/types.ts index 8362bd0a94..fd9aa08073 100644 --- a/apps/desktop/src/components/settings/components/types.ts +++ b/apps/desktop/src/components/settings/components/types.ts @@ -1,5 +1,15 @@ import type { LucideIcon } from "lucide-react"; -import { Bell, Calendar, LayoutTemplate, MessageSquare, Settings, Sparkles, Volume2 } from "lucide-react"; +import { + Bell, + BlocksIcon, + Calendar, + CreditCard, + LayoutTemplate, + MessageSquare, + Settings, + Sparkles, + Volume2, +} from "lucide-react"; export type Tab = | "general" @@ -8,9 +18,9 @@ export type Tab = | "notifications" | "sound" | "templates" - | "lab" | "feedback" - | "integrations"; + | "integrations" + | "billing"; export const TABS: { name: Tab; icon: LucideIcon }[] = [ { name: "general", icon: Settings }, @@ -19,7 +29,7 @@ export const TABS: { name: Tab; icon: LucideIcon }[] = [ { name: "notifications", icon: Bell }, { name: "sound", icon: Volume2 }, { name: "templates", icon: LayoutTemplate }, - // { name: "lab", icon: FlaskConical }, { name: "integrations", icon: MessageSquare }, - { name: "feedback", icon: MessageSquare }, + { name: "feedback", icon: BlocksIcon }, + { name: "billing", icon: CreditCard }, ]; diff --git a/apps/desktop/src/components/settings/views/billing.tsx b/apps/desktop/src/components/settings/views/billing.tsx index 5049c75daa..449eb68b1f 100644 --- a/apps/desktop/src/components/settings/views/billing.tsx +++ b/apps/desktop/src/components/settings/views/billing.tsx @@ -1,208 +1,265 @@ -import { Trans, useLingui } from "@lingui/react/macro"; -import { CheckIcon, ExternalLinkIcon } from "lucide-react"; -import { useState } from "react"; +import { openUrl } from "@tauri-apps/plugin-opener"; +import { ArrowRight, CreditCard, ExternalLink, Shield } from "lucide-react"; +import { useEffect, useState } from "react"; + +import { useBilling } from "@/hooks/use-billing"; +import { useLicense } from "@/hooks/use-license"; import { Button } from "@hypr/ui/components/ui/button"; -import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@hypr/ui/components/ui/card"; -import { Tabs, TabsList, TabsTrigger } from "@hypr/ui/components/ui/tabs"; +import { Card } from "@hypr/ui/components/ui/card"; +import { Input } from "@hypr/ui/components/ui/input"; +import { Label } from "@hypr/ui/components/ui/label"; +import { RadioGroup, RadioGroupItem } from "@hypr/ui/components/ui/radio-group"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@hypr/ui/components/ui/tabs"; + +export default function Billing() { + const { getLicense } = useLicense(); + const isPro = getLicense.data?.valid === true; -interface BillingProps { - currentPlan?: string; - trialDaysLeft?: number; + return ( +
+ + {isPro ? : } + +
+ ); } -export default function Billing({ currentPlan, trialDaysLeft }: BillingProps) { - const [billingCycle, setBillingCycle] = useState<"monthly" | "annual">("monthly"); - const { t } = useLingui(); - - const pricingPlans = [ - { - name: t`Free`, - description: t`For those who are serious about their privacy`, - monthlyPrice: 0, - annualPrice: 0, - features: [ - t`Works both in-person and remotely`, - t`Format notes using templates`, - t`Ask questions about past meetings`, - t`Live summary of the meeting`, - t`Works offline`, - ], - }, - { - name: t`Pro`, - description: t`For those who are serious about their performance`, - monthlyPrice: 19, - annualPrice: 15, - features: [ - t`Integration with other apps like Notion and Google Calendar`, - t`Long-term memory for past meetings and attendees`, - t`Much better AI performance`, - t`Meeting note sharing via links`, - t`Synchronization across multiple devices`, - ], - }, - { - name: t`Team`, - description: t`For fast growing teams like energetic startups`, - monthlyPrice: 25, - annualPrice: 20, - features: [ - t`Search & ask across all notes in workspace`, - t`Collaborate with others in meetings`, - t`Single sign-on for all users`, - ], - isPerSeat: true, - comingSoon: true, - }, - ]; - - const getButtonText = (planName: string) => { - const plan = planName.toLowerCase(); - if (plan === "team") { - return t`Coming Soon`; - } - if (currentPlan === plan) { - return t`Current Plan`; - } - if (currentPlan === "basic" && plan === "pro") { - return t`Upgrade`; +function FreeSection() { + return ( + + + + + Get Pro Access + + + Have a License? + + + + + + + + + + + + + ); +} + +function FreeSectionCheckout() { + const { checkout } = useBilling(); + + const [email, setEmail] = useState(""); + const [interval, setInterval] = useState<"monthly" | "yearly">("yearly"); + + useEffect(() => { + if (checkout.status === "success") { + openUrl(checkout.data.url); } - if (trialDaysLeft && plan === "pro") { - return t`Free Trial`; + }, [checkout.status]); + + return ( +
+
+
+ + setEmail(e.target.value)} + className="transition-colors focus:border-primary/20" + /> +
+
+ + setInterval(value as "monthly" | "yearly")} + className="flex gap-6" + > +
+ + +
+
+ + +
+
+
+
+
+ + + Learn more about Pro features + + +
+
+ ); +} + +function FreeSectionActivate() { + const { activateLicense } = useLicense(); + + const [licenseKey, setLicenseKey] = useState(""); + + return ( +
+ setLicenseKey(e.target.value)} + className="font-mono transition-colors focus:border-primary/20" + /> + +
+ ); +} + +function ProSection() { + const l = useLicense(); + + const { stripeCustomerId, stripeSubscriptionId } = l.getLicense.data?.metadata || {}; + const b = useBilling({ stripe_customer_id: stripeCustomerId, stripe_subscription_id: stripeSubscriptionId }); + + const getSubtitle = () => { + if (!b.info.data) { + return "..."; } - return billingCycle === "monthly" - ? t`Start Monthly Plan` - : t`Start Annual Plan`; - }; - const getButtonProps = (planName: string) => { - const plan = planName.toLowerCase(); - if (plan === "team") { - return { - disabled: true, - variant: "outline" as const, - }; + const { price, current_period_end, cancel_at_period_end, status } = b.info.data; + + if (status !== "active") { + return "Subscription inactive"; } - if (currentPlan === plan) { - return { - variant: "outline" as const, - }; + + if (cancel_at_period_end) { + const endDate = new Date(current_period_end * 1000).toLocaleDateString(); + return `Subscription ends on ${endDate}`; } - return { - variant: "default" as const, - }; + + const interval = price?.recurring?.interval; + const amount = price?.unit_amount ? (price.unit_amount / 100).toFixed(2) : "0.00"; + const nextChargeDate = new Date(current_period_end * 1000).toLocaleDateString(); + + const intervalText = interval === "year" ? "yearly" : interval === "month" ? "monthly" : interval; + + return `$${amount} ${intervalText} • Next charge: ${nextChargeDate}`; }; - return ( -
-
-
- Coming Soon -
-

- - Billing features are currently under development and will be available in a future update. - -

-
+ const headerAction = ( + + ); + return ( +
-
-

- There's a plan for everyone -

- - setBillingCycle(value as "monthly" | "annual")} +
+ + +
+
+ +

+ This will allow you to use your license on another device +

+
+ + ); +} -
-
- {pricingPlans.map((plan) => ( - - -
- {plan.name} - {plan.name === "Pro" && ( - - Best - - )} -
- {plan.description} -
- -
- $ - {billingCycle === "monthly" - ? plan.monthlyPrice - : plan.annualPrice} - - {plan.isPerSeat ? "/seat" : ""} /month - -
-
- {plan.features.map((feature) => ( -
-
- -
- {feature} -
- ))} -
-
- - - {trialDaysLeft && plan.name.toLowerCase() === "pro" && ( -

- {trialDaysLeft} days left in trial -

- )} -
-
- ))} +function SectionContainer({ title, subtitle, headerAction, children }: { + title: string; + subtitle?: string; + headerAction?: React.ReactNode; + children: React.ReactNode; +}) { + return ( + <> +
+
+
+
- - {billingCycle === "annual" && ( -

- Save up to 20% with annual billing -

- )} - -
- - Learn more about our pricing plans - - +
+

+ {title} +

+ {subtitle && ( +

+ {subtitle} +

+ )}
+ {headerAction}
-
+ {children} + ); } diff --git a/apps/desktop/src/components/toast/model-select.tsx b/apps/desktop/src/components/toast/model-select.tsx index 57286c94f8..1bab9fc874 100644 --- a/apps/desktop/src/components/toast/model-select.tsx +++ b/apps/desktop/src/components/toast/model-select.tsx @@ -1,3 +1,5 @@ +import type { LinkProps } from "@tanstack/react-router"; + import { commands as localSttCommands, SupportedModel } from "@hypr/plugin-local-stt"; import { commands as windowsCommands } from "@hypr/plugin-windows"; import { Button } from "@hypr/ui/components/ui/button"; @@ -12,7 +14,19 @@ export async function showModelSelectToast(language: string) { } const id = "language-model-mismatch"; - // TODO: this should not pop up if using Cloud + + const handleClick = () => { + const url = { to: "/app/settings", search: { tab: "ai" } } as const satisfies LinkProps; + + windowsCommands.windowShow({ type: "settings" }).then(() => { + setTimeout(() => { + windowsCommands.windowEmitNavigate({ type: "settings" }, { path: url.to, search: url.search }); + }, 500); + }); + + sonnerToast.dismiss(id); + }; + toast({ id, title: "Speech-to-Text Model Mismatch", @@ -23,13 +37,7 @@ export async function showModelSelectToast(language: string) {
diff --git a/apps/desktop/src/components/toolbar/index.tsx b/apps/desktop/src/components/toolbar/index.tsx index c573b429ce..8da00aef8e 100644 --- a/apps/desktop/src/components/toolbar/index.tsx +++ b/apps/desktop/src/components/toolbar/index.tsx @@ -2,13 +2,12 @@ import { useMatch } from "@tanstack/react-router"; import { useEditMode } from "@/contexts/edit-mode-context"; import { getCurrentWebviewWindowLabel } from "@hypr/plugin-windows"; -import { DefaultToolbar, EntityToolbar, MainToolbar, NoteToolbar } from "./bars"; +import { EntityToolbar, MainToolbar, NoteToolbar } from "./bars"; export default function Toolbar() { const noteMatch = useMatch({ from: "/app/note/$id", shouldThrow: false }); const organizationMatch = useMatch({ from: "/app/organization/$id", shouldThrow: false }); const humanMatch = useMatch({ from: "/app/human/$id", shouldThrow: false }); - const plansMatch = useMatch({ from: "/app/plans", shouldThrow: false }); const { isEditing, toggleEditMode } = useEditMode(); @@ -16,11 +15,6 @@ export default function Toolbar() { const isNote = !!noteMatch; const isOrg = !!organizationMatch; const isHuman = !!humanMatch; - const isPlans = !!plansMatch; - - if (isPlans) { - return ; - } if (!isMain) { if (isNote) { diff --git a/apps/desktop/src/hooks/use-billing.ts b/apps/desktop/src/hooks/use-billing.ts new file mode 100644 index 0000000000..bc748f62fd --- /dev/null +++ b/apps/desktop/src/hooks/use-billing.ts @@ -0,0 +1,70 @@ +import { useMutation, useQuery } from "@tanstack/react-query"; + +const SERVER_BASE_URL = import.meta.env.DEV + ? "http://localhost:8082" + : "https://server.hyprnote.com"; + +export function useBilling({ + stripe_customer_id, + stripe_subscription_id, +}: { + stripe_customer_id?: string | null; + stripe_subscription_id?: string | null; +} = {}) { + const checkout = useMutation({ + mutationFn: async ({ email, interval }: { email: string; interval: "monthly" | "yearly" }) => { + const response = await fetch(`${SERVER_BASE_URL}/checkout`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + productType: "hyprnote_pro", + email, + interval, + }), + }); + + if (!response.ok) { + throw new Error(`failed_to_start_checkout: ${response.statusText}`); + } + + const data = await response.json() as { url: string | null }; + if (!data.url) { + throw new Error(`failed_to_retrieve_checkout: ${response.statusText}`); + } + + return data as { url: string }; + }, + onError: console.error, + }); + + const info = useQuery({ + enabled: !!stripe_customer_id && !!stripe_subscription_id, + queryKey: ["billing", stripe_customer_id, stripe_subscription_id], + queryFn: async () => { + const response = await fetch(`${SERVER_BASE_URL}/info/${stripe_customer_id}/${stripe_subscription_id}`, { + method: "GET", + headers: { "Accept": "application/json" }, + }); + return response.json(); + }, + refetchInterval: 1000 * 30, + refetchOnWindowFocus: true, + refetchIntervalInBackground: false, + }); + + const portal = useMutation({ + mutationFn: async () => { + const response = await fetch(`${SERVER_BASE_URL}/portal`, { + method: "POST", + headers: { "Accept": "application/json" }, + }); + return response.json() as Promise<{ url: string }>; + }, + onError: console.error, + onSuccess: ({ url }) => { + window.open(url, "_blank"); + }, + }); + + return { info, portal, checkout }; +} diff --git a/apps/desktop/src/hooks/use-license.ts b/apps/desktop/src/hooks/use-license.ts new file mode 100644 index 0000000000..8d3ace98a3 --- /dev/null +++ b/apps/desktop/src/hooks/use-license.ts @@ -0,0 +1,99 @@ +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import * as keygen from "tauri-plugin-keygen-api"; + +const LICENSE_QUERY_KEY = ["license"] as const; + +// https://github.com/bagindo/tauri-plugin-keygen +export function useLicense() { + const queryClient = useQueryClient(); + + const getLicense = useQuery({ + queryKey: LICENSE_QUERY_KEY, + queryFn: async () => { + const license = await keygen.getLicense(); + if (license?.valid) { + return license; + } + return null; + }, + refetchInterval: 1000 * 60 * 5, + }); + + const refreshLicense = useMutation({ + mutationFn: async () => { + const cachedKey = await keygen.getLicenseKey(); + if (!cachedKey) { + throw new Error("no_license_key_found"); + } + + const license = await keygen.validateCheckoutKey({ + key: cachedKey, + entitlements: [], + ttlSeconds: 60 * 60 * 24 * 7, // 7 days + ttlForever: false, + }); + + return license; + }, + onError: console.error, + onSuccess: (license) => { + queryClient.setQueryData(LICENSE_QUERY_KEY, license); + }, + }); + + const shouldRefresh = () => { + const license = getLicense.data; + if (!license || !license.valid) { + return false; + } + + if (!license.expiry) { + throw new Error("license.expiry is null"); + } + + const daysUntilExpiry = Math.floor( + (new Date(license.expiry).getTime() - Date.now()) / (1000 * 60 * 60 * 24), + ); + + return daysUntilExpiry <= 3 && daysUntilExpiry > 0; + }; + + const activateLicense = useMutation({ + mutationFn: async (key: string) => { + const license = await keygen.validateCheckoutKey({ + key, + entitlements: [], + ttlSeconds: 60 * 60 * 24 * 7, // 7 days + ttlForever: false, + }); + console.log("Activated license", license); + return license; + }, + onError: console.error, + onSuccess: (license) => { + queryClient.setQueryData(LICENSE_QUERY_KEY, license); + }, + }); + + const deactivateLicense = useMutation({ + mutationFn: async () => { + await Promise.all([ + keygen.resetLicense(), + keygen.resetLicenseKey(), + ]); + return null; + }, + onError: console.error, + onSuccess: (license) => { + queryClient.setQueryData(LICENSE_QUERY_KEY, license); + }, + }); + + return { + getLicense, + activateLicense, + deactivateLicense, + shouldRefresh, + refreshLicense, + }; +} diff --git a/apps/desktop/src/locales/en/messages.po b/apps/desktop/src/locales/en/messages.po index 6ca5479c0b..0d784512bf 100644 --- a/apps/desktop/src/locales/en/messages.po +++ b/apps/desktop/src/locales/en/messages.po @@ -329,7 +329,7 @@ msgstr "Add specific terms or jargon for improved transcription accuracy" msgid "Admin" msgstr "Admin" -#: src/routes/app.settings.tsx:67 +#: src/routes/app.settings.tsx:68 msgid "AI" msgstr "AI" @@ -347,8 +347,8 @@ msgid "and {0} more members" msgstr "and {0} more members" #: src/components/settings/views/billing.tsx:131 -msgid "Annual" -msgstr "Annual" +#~ msgid "Annual" +#~ msgstr "Annual" #: src/components/share-and-permission/publish.tsx:18 msgid "Anyone with the link can view this page" @@ -373,8 +373,8 @@ msgid "Are you sure you want to delete this note?" msgstr "Are you sure you want to delete this note?" #: src/components/settings/views/billing.tsx:27 -msgid "Ask questions about past meetings" -msgstr "Ask questions about past meetings" +#~ msgid "Ask questions about past meetings" +#~ msgstr "Ask questions about past meetings" #: src/components/right-panel/components/chat/chat-message.tsx:22 msgid "Assistant:" @@ -397,15 +397,15 @@ msgstr "Base URL" #~ msgstr "Billing" #: src/components/settings/views/billing.tsx:104 -msgid "Billing features are currently under development and will be available in a future update." -msgstr "Billing features are currently under development and will be available in a future update." +#~ msgid "Billing features are currently under development and will be available in a future update." +#~ msgstr "Billing features are currently under development and will be available in a future update." #: src/components/settings/views/templates.tsx:279 #: src/components/settings/components/templates-sidebar.tsx:68 msgid "Built-in Templates" msgstr "Built-in Templates" -#: src/routes/app.settings.tsx:69 +#: src/routes/app.settings.tsx:70 msgid "Calendar" msgstr "Calendar" @@ -429,11 +429,11 @@ msgstr "Cancel" msgid "CEO" msgstr "CEO" -#: src/components/right-panel/components/chat/empty-chat-state.tsx:43 +#: src/components/right-panel/components/chat/empty-chat-state.tsx:49 msgid "Chat feature is in beta. For best results, we recommend you to use <0>custom endpoints." msgstr "Chat feature is in beta. For best results, we recommend you to use <0>custom endpoints." -#: src/components/right-panel/components/chat/empty-chat-state.tsx:34 +#: src/components/right-panel/components/chat/empty-chat-state.tsx:40 msgid "Chat with meeting notes" msgstr "Chat with meeting notes" @@ -458,12 +458,10 @@ msgid "Close" msgstr "Close" #: src/components/settings/views/billing.tsx:52 -msgid "Collaborate with others in meetings" -msgstr "Collaborate with others in meetings" +#~ msgid "Collaborate with others in meetings" +#~ msgstr "Collaborate with others in meetings" #: src/components/settings/views/team.tsx:69 -#: src/components/settings/views/billing.tsx:63 -#: src/components/settings/views/billing.tsx:101 msgid "Coming Soon" msgstr "Coming Soon" @@ -520,7 +518,7 @@ msgstr "Control how creative the AI enhancement should be" msgid "Create" msgstr "Create" -#: src/components/right-panel/components/chat/empty-chat-state.tsx:79 +#: src/components/right-panel/components/chat/empty-chat-state.tsx:85 msgid "Create agenda" msgstr "Create agenda" @@ -541,8 +539,8 @@ msgid "Creativity Level" msgstr "Creativity Level" #: src/components/settings/views/billing.tsx:66 -msgid "Current Plan" -msgstr "Current Plan" +#~ msgid "Current Plan" +#~ msgstr "Current Plan" #: src/components/settings/views/ai.tsx:743 msgid "Custom Endpoint" @@ -655,44 +653,44 @@ msgstr "Enter the base URL for your custom LLM endpoint" #~ msgid "Extensions" #~ msgstr "Extensions" -#: src/components/right-panel/components/chat/empty-chat-state.tsx:73 +#: src/components/right-panel/components/chat/empty-chat-state.tsx:79 msgid "Extract action items" msgstr "Extract action items" -#: src/routes/app.settings.tsx:77 -#: src/routes/app.settings.tsx:110 +#: src/routes/app.settings.tsx:78 +#: src/routes/app.settings.tsx:111 msgid "Feedback" msgstr "Feedback" #: src/components/settings/views/billing.tsx:47 -msgid "For fast growing teams like energetic startups" -msgstr "For fast growing teams like energetic startups" +#~ msgid "For fast growing teams like energetic startups" +#~ msgstr "For fast growing teams like energetic startups" #: src/components/settings/views/billing.tsx:34 -msgid "For those who are serious about their performance" -msgstr "For those who are serious about their performance" +#~ msgid "For those who are serious about their performance" +#~ msgstr "For those who are serious about their performance" #: src/components/settings/views/billing.tsx:21 -msgid "For those who are serious about their privacy" -msgstr "For those who are serious about their privacy" +#~ msgid "For those who are serious about their privacy" +#~ msgstr "For those who are serious about their privacy" #: src/components/settings/views/billing.tsx:26 -msgid "Format notes using templates" -msgstr "Format notes using templates" +#~ msgid "Format notes using templates" +#~ msgstr "Format notes using templates" #: src/components/settings/views/billing.tsx:20 -msgid "Free" -msgstr "Free" +#~ msgid "Free" +#~ msgstr "Free" #: src/components/settings/views/billing.tsx:72 -msgid "Free Trial" -msgstr "Free Trial" +#~ msgid "Free Trial" +#~ msgstr "Free Trial" #: src/components/settings/views/profile.tsx:119 msgid "Full name" msgstr "Full name" -#: src/routes/app.settings.tsx:65 +#: src/routes/app.settings.tsx:66 msgid "General" msgstr "General" @@ -741,10 +739,10 @@ msgid "How did you hear about Hyprnote?" msgstr "How did you hear about Hyprnote?" #: src/components/settings/views/billing.tsx:38 -msgid "Integration with other apps like Notion and Google Calendar" -msgstr "Integration with other apps like Notion and Google Calendar" +#~ msgid "Integration with other apps like Notion and Google Calendar" +#~ msgstr "Integration with other apps like Notion and Google Calendar" -#: src/routes/app.settings.tsx:75 +#: src/routes/app.settings.tsx:76 #: src/components/settings/views/integrations.tsx:118 msgid "Integrations" msgstr "Integrations" @@ -769,7 +767,7 @@ msgstr "Job title" msgid "Join meeting" msgstr "Join meeting" -#: src/components/right-panel/components/chat/empty-chat-state.tsx:67 +#: src/components/right-panel/components/chat/empty-chat-state.tsx:73 msgid "Key decisions" msgstr "Key decisions" @@ -782,16 +780,16 @@ msgstr "Key decisions" #~ msgstr "Language" #: src/components/settings/views/billing.tsx:200 -msgid "Learn more about our pricing plans" -msgstr "Learn more about our pricing plans" +#~ msgid "Learn more about our pricing plans" +#~ msgstr "Learn more about our pricing plans" #: src/components/settings/views/profile.tsx:210 msgid "LinkedIn username" msgstr "LinkedIn username" #: src/components/settings/views/billing.tsx:28 -msgid "Live summary of the meeting" -msgstr "Live summary of the meeting" +#~ msgid "Live summary of the meeting" +#~ msgstr "Live summary of the meeting" #: src/components/settings/views/ai.tsx:829 msgid "Loading available models..." @@ -810,20 +808,20 @@ msgid "Loading..." msgstr "Loading..." #: src/components/left-sidebar/top-area/settings-button.tsx:87 -msgid "Local mode" -msgstr "Local mode" +#~ msgid "Local mode" +#~ msgstr "Local mode" #: src/components/settings/views/billing.tsx:39 -msgid "Long-term memory for past meetings and attendees" -msgstr "Long-term memory for past meetings and attendees" +#~ msgid "Long-term memory for past meetings and attendees" +#~ msgstr "Long-term memory for past meetings and attendees" #: src/components/share-and-permission/publish.tsx:24 msgid "Make it public" msgstr "Make it public" #: src/components/settings/views/billing.tsx:41 -msgid "Meeting note sharing via links" -msgstr "Meeting note sharing via links" +#~ msgid "Meeting note sharing via links" +#~ msgstr "Meeting note sharing via links" #: src/components/settings/views/team.tsx:145 #: src/components/settings/views/team.tsx:232 @@ -843,18 +841,18 @@ msgid "Model Name" msgstr "Model Name" #: src/components/settings/views/billing.tsx:125 -msgid "Monthly" -msgstr "Monthly" +#~ msgid "Monthly" +#~ msgstr "Monthly" #: src/components/settings/views/integrations.tsx:272 msgid "More integrations coming soon..." msgstr "More integrations coming soon..." #: src/components/settings/views/billing.tsx:40 -msgid "Much better AI performance" -msgstr "Much better AI performance" +#~ msgid "Much better AI performance" +#~ msgstr "Much better AI performance" -#: src/components/left-sidebar/top-area/settings-button.tsx:108 +#: src/components/left-sidebar/top-area/settings-button.tsx:99 msgid "My Profile" msgstr "My Profile" @@ -923,7 +921,7 @@ msgstr "No upcoming events for this organization" msgid "No upcoming events with this contact" msgstr "No upcoming events with this contact" -#: src/routes/app.settings.tsx:71 +#: src/routes/app.settings.tsx:72 msgid "Notifications" msgstr "Notifications" @@ -992,8 +990,8 @@ msgid "Primary language for the interface" msgstr "Primary language for the interface" #: src/components/settings/views/billing.tsx:33 -msgid "Pro" -msgstr "Pro" +#~ msgid "Pro" +#~ msgstr "Pro" #: src/routes/app.settings.tsx:62 #~ msgid "Profile" @@ -1049,8 +1047,8 @@ msgid "Save recordings" msgstr "Save recordings" #: src/components/settings/views/billing.tsx:51 -msgid "Search & ask across all notes in workspace" -msgstr "Search & ask across all notes in workspace" +#~ msgid "Search & ask across all notes in workspace" +#~ msgstr "Search & ask across all notes in workspace" #: src/components/settings/views/team.tsx:204 msgid "Search names or emails" @@ -1101,7 +1099,7 @@ msgstr "Select languages you speak for better transcription" msgid "Send invite" msgstr "Send invite" -#: src/components/left-sidebar/top-area/settings-button.tsx:101 +#: src/components/left-sidebar/top-area/settings-button.tsx:92 msgid "Settings" msgstr "Settings" @@ -1118,8 +1116,8 @@ msgid "Show notifications when you join a meeting." msgstr "Show notifications when you join a meeting." #: src/components/settings/views/billing.tsx:53 -msgid "Single sign-on for all users" -msgstr "Single sign-on for all users" +#~ msgid "Single sign-on for all users" +#~ msgstr "Single sign-on for all users" #: src/routes/app.settings.tsx:116 #~ msgid "Sound" @@ -1130,12 +1128,12 @@ msgid "Spoken languages" msgstr "Spoken languages" #: src/components/settings/views/billing.tsx:76 -msgid "Start Annual Plan" -msgstr "Start Annual Plan" +#~ msgid "Start Annual Plan" +#~ msgstr "Start Annual Plan" #: src/components/settings/views/billing.tsx:75 -msgid "Start Monthly Plan" -msgstr "Start Monthly Plan" +#~ msgid "Start Monthly Plan" +#~ msgstr "Start Monthly Plan" #: src/components/editor-area/note-header/listen-button.tsx:164 msgid "Start recording" @@ -1149,25 +1147,25 @@ msgstr "Stop" #~ msgid "Submit Feedback" #~ msgstr "Submit Feedback" -#: src/components/right-panel/components/chat/empty-chat-state.tsx:61 +#: src/components/right-panel/components/chat/empty-chat-state.tsx:67 msgid "Summarize meeting" msgstr "Summarize meeting" #: src/components/settings/views/billing.tsx:42 -msgid "Synchronization across multiple devices" -msgstr "Synchronization across multiple devices" +#~ msgid "Synchronization across multiple devices" +#~ msgstr "Synchronization across multiple devices" #: src/components/settings/views/sound.tsx:106 msgid "System Audio Access" msgstr "System Audio Access" -#: src/components/left-sidebar/top-area/settings-button.tsx:114 +#: src/components/left-sidebar/top-area/settings-button.tsx:105 msgid "Talk to Founders" msgstr "Talk to Founders" #: src/components/settings/views/billing.tsx:46 -msgid "Team" -msgstr "Team" +#~ msgid "Team" +#~ msgstr "Team" #: src/components/settings/views/team.tsx:72 msgid "Team management features are currently under development and will be available in a future update." @@ -1177,7 +1175,7 @@ msgstr "Team management features are currently under development and will be ava msgid "Teamspace" msgstr "Teamspace" -#: src/routes/app.settings.tsx:73 +#: src/routes/app.settings.tsx:74 msgid "Templates" msgstr "Templates" @@ -1194,8 +1192,8 @@ msgid "The name of your Obsidian vault." msgstr "The name of your Obsidian vault." #: src/components/settings/views/billing.tsx:113 -msgid "There's a plan for everyone" -msgstr "There's a plan for everyone" +#~ msgid "There's a plan for everyone" +#~ msgstr "There's a plan for everyone" #: src/components/settings/views/profile.tsx:188 msgid "This is a short description of your company." @@ -1258,8 +1256,8 @@ msgid "Upcoming Events" msgstr "Upcoming Events" #: src/components/settings/views/billing.tsx:69 -msgid "Upgrade" -msgstr "Upgrade" +#~ msgid "Upgrade" +#~ msgstr "Upgrade" #: src/components/settings/components/ai/llm-view.tsx:155 #~ msgid "Use the local Llama 3.2 model for enhanced privacy and offline capability." @@ -1327,12 +1325,12 @@ msgid "Word Error Rate (WER) indicates transcription accuracy (lower is better). msgstr "Word Error Rate (WER) indicates transcription accuracy (lower is better). Data based on the FLEURS dataset, measured with OpenAI's Whisper <0>large-v3-turbo model. <1>More info" #: src/components/settings/views/billing.tsx:25 -msgid "Works both in-person and remotely" -msgstr "Works both in-person and remotely" +#~ msgid "Works both in-person and remotely" +#~ msgstr "Works both in-person and remotely" #: src/components/settings/views/billing.tsx:29 -msgid "Works offline" -msgstr "Works offline" +#~ msgid "Works offline" +#~ msgstr "Works offline" #: src/components/editor-area/note-header/listen-button.tsx:358 #~ msgid "Yes, activate speaker" diff --git a/apps/desktop/src/locales/ko/messages.po b/apps/desktop/src/locales/ko/messages.po index af8640fb57..5b654deedc 100644 --- a/apps/desktop/src/locales/ko/messages.po +++ b/apps/desktop/src/locales/ko/messages.po @@ -329,7 +329,7 @@ msgstr "" msgid "Admin" msgstr "" -#: src/routes/app.settings.tsx:67 +#: src/routes/app.settings.tsx:68 msgid "AI" msgstr "" @@ -347,8 +347,8 @@ msgid "and {0} more members" msgstr "" #: src/components/settings/views/billing.tsx:131 -msgid "Annual" -msgstr "" +#~ msgid "Annual" +#~ msgstr "" #: src/components/share-and-permission/publish.tsx:18 msgid "Anyone with the link can view this page" @@ -373,8 +373,8 @@ msgid "Are you sure you want to delete this note?" msgstr "" #: src/components/settings/views/billing.tsx:27 -msgid "Ask questions about past meetings" -msgstr "" +#~ msgid "Ask questions about past meetings" +#~ msgstr "" #: src/components/right-panel/components/chat/chat-message.tsx:22 msgid "Assistant:" @@ -397,15 +397,15 @@ msgstr "" #~ msgstr "" #: src/components/settings/views/billing.tsx:104 -msgid "Billing features are currently under development and will be available in a future update." -msgstr "" +#~ msgid "Billing features are currently under development and will be available in a future update." +#~ msgstr "" #: src/components/settings/views/templates.tsx:279 #: src/components/settings/components/templates-sidebar.tsx:68 msgid "Built-in Templates" msgstr "" -#: src/routes/app.settings.tsx:69 +#: src/routes/app.settings.tsx:70 msgid "Calendar" msgstr "" @@ -429,11 +429,11 @@ msgstr "" msgid "CEO" msgstr "" -#: src/components/right-panel/components/chat/empty-chat-state.tsx:43 +#: src/components/right-panel/components/chat/empty-chat-state.tsx:49 msgid "Chat feature is in beta. For best results, we recommend you to use <0>custom endpoints." msgstr "" -#: src/components/right-panel/components/chat/empty-chat-state.tsx:34 +#: src/components/right-panel/components/chat/empty-chat-state.tsx:40 msgid "Chat with meeting notes" msgstr "" @@ -458,12 +458,10 @@ msgid "Close" msgstr "" #: src/components/settings/views/billing.tsx:52 -msgid "Collaborate with others in meetings" -msgstr "" +#~ msgid "Collaborate with others in meetings" +#~ msgstr "" #: src/components/settings/views/team.tsx:69 -#: src/components/settings/views/billing.tsx:63 -#: src/components/settings/views/billing.tsx:101 msgid "Coming Soon" msgstr "" @@ -520,7 +518,7 @@ msgstr "" msgid "Create" msgstr "" -#: src/components/right-panel/components/chat/empty-chat-state.tsx:79 +#: src/components/right-panel/components/chat/empty-chat-state.tsx:85 msgid "Create agenda" msgstr "" @@ -541,8 +539,8 @@ msgid "Creativity Level" msgstr "" #: src/components/settings/views/billing.tsx:66 -msgid "Current Plan" -msgstr "" +#~ msgid "Current Plan" +#~ msgstr "" #: src/components/settings/views/ai.tsx:743 msgid "Custom Endpoint" @@ -655,44 +653,44 @@ msgstr "" #~ msgid "Extensions" #~ msgstr "" -#: src/components/right-panel/components/chat/empty-chat-state.tsx:73 +#: src/components/right-panel/components/chat/empty-chat-state.tsx:79 msgid "Extract action items" msgstr "" -#: src/routes/app.settings.tsx:77 -#: src/routes/app.settings.tsx:110 +#: src/routes/app.settings.tsx:78 +#: src/routes/app.settings.tsx:111 msgid "Feedback" msgstr "" #: src/components/settings/views/billing.tsx:47 -msgid "For fast growing teams like energetic startups" -msgstr "" +#~ msgid "For fast growing teams like energetic startups" +#~ msgstr "" #: src/components/settings/views/billing.tsx:34 -msgid "For those who are serious about their performance" -msgstr "" +#~ msgid "For those who are serious about their performance" +#~ msgstr "" #: src/components/settings/views/billing.tsx:21 -msgid "For those who are serious about their privacy" -msgstr "" +#~ msgid "For those who are serious about their privacy" +#~ msgstr "" #: src/components/settings/views/billing.tsx:26 -msgid "Format notes using templates" -msgstr "" +#~ msgid "Format notes using templates" +#~ msgstr "" #: src/components/settings/views/billing.tsx:20 -msgid "Free" -msgstr "" +#~ msgid "Free" +#~ msgstr "" #: src/components/settings/views/billing.tsx:72 -msgid "Free Trial" -msgstr "" +#~ msgid "Free Trial" +#~ msgstr "" #: src/components/settings/views/profile.tsx:119 msgid "Full name" msgstr "" -#: src/routes/app.settings.tsx:65 +#: src/routes/app.settings.tsx:66 msgid "General" msgstr "" @@ -741,10 +739,10 @@ msgid "How did you hear about Hyprnote?" msgstr "" #: src/components/settings/views/billing.tsx:38 -msgid "Integration with other apps like Notion and Google Calendar" -msgstr "" +#~ msgid "Integration with other apps like Notion and Google Calendar" +#~ msgstr "" -#: src/routes/app.settings.tsx:75 +#: src/routes/app.settings.tsx:76 #: src/components/settings/views/integrations.tsx:118 msgid "Integrations" msgstr "" @@ -769,7 +767,7 @@ msgstr "" msgid "Join meeting" msgstr "" -#: src/components/right-panel/components/chat/empty-chat-state.tsx:67 +#: src/components/right-panel/components/chat/empty-chat-state.tsx:73 msgid "Key decisions" msgstr "" @@ -782,16 +780,16 @@ msgstr "" #~ msgstr "" #: src/components/settings/views/billing.tsx:200 -msgid "Learn more about our pricing plans" -msgstr "" +#~ msgid "Learn more about our pricing plans" +#~ msgstr "" #: src/components/settings/views/profile.tsx:210 msgid "LinkedIn username" msgstr "" #: src/components/settings/views/billing.tsx:28 -msgid "Live summary of the meeting" -msgstr "" +#~ msgid "Live summary of the meeting" +#~ msgstr "" #: src/components/settings/views/ai.tsx:829 msgid "Loading available models..." @@ -810,20 +808,20 @@ msgid "Loading..." msgstr "" #: src/components/left-sidebar/top-area/settings-button.tsx:87 -msgid "Local mode" -msgstr "" +#~ msgid "Local mode" +#~ msgstr "" #: src/components/settings/views/billing.tsx:39 -msgid "Long-term memory for past meetings and attendees" -msgstr "" +#~ msgid "Long-term memory for past meetings and attendees" +#~ msgstr "" #: src/components/share-and-permission/publish.tsx:24 msgid "Make it public" msgstr "" #: src/components/settings/views/billing.tsx:41 -msgid "Meeting note sharing via links" -msgstr "" +#~ msgid "Meeting note sharing via links" +#~ msgstr "" #: src/components/settings/views/team.tsx:145 #: src/components/settings/views/team.tsx:232 @@ -843,18 +841,18 @@ msgid "Model Name" msgstr "" #: src/components/settings/views/billing.tsx:125 -msgid "Monthly" -msgstr "" +#~ msgid "Monthly" +#~ msgstr "" #: src/components/settings/views/integrations.tsx:272 msgid "More integrations coming soon..." msgstr "" #: src/components/settings/views/billing.tsx:40 -msgid "Much better AI performance" -msgstr "" +#~ msgid "Much better AI performance" +#~ msgstr "" -#: src/components/left-sidebar/top-area/settings-button.tsx:108 +#: src/components/left-sidebar/top-area/settings-button.tsx:99 msgid "My Profile" msgstr "" @@ -923,7 +921,7 @@ msgstr "" msgid "No upcoming events with this contact" msgstr "" -#: src/routes/app.settings.tsx:71 +#: src/routes/app.settings.tsx:72 msgid "Notifications" msgstr "" @@ -992,8 +990,8 @@ msgid "Primary language for the interface" msgstr "" #: src/components/settings/views/billing.tsx:33 -msgid "Pro" -msgstr "" +#~ msgid "Pro" +#~ msgstr "" #: src/routes/app.settings.tsx:62 #~ msgid "Profile" @@ -1049,8 +1047,8 @@ msgid "Save recordings" msgstr "" #: src/components/settings/views/billing.tsx:51 -msgid "Search & ask across all notes in workspace" -msgstr "" +#~ msgid "Search & ask across all notes in workspace" +#~ msgstr "" #: src/components/settings/views/team.tsx:204 msgid "Search names or emails" @@ -1101,7 +1099,7 @@ msgstr "" msgid "Send invite" msgstr "" -#: src/components/left-sidebar/top-area/settings-button.tsx:101 +#: src/components/left-sidebar/top-area/settings-button.tsx:92 msgid "Settings" msgstr "" @@ -1118,8 +1116,8 @@ msgid "Show notifications when you join a meeting." msgstr "" #: src/components/settings/views/billing.tsx:53 -msgid "Single sign-on for all users" -msgstr "" +#~ msgid "Single sign-on for all users" +#~ msgstr "" #: src/routes/app.settings.tsx:116 #~ msgid "Sound" @@ -1130,12 +1128,12 @@ msgid "Spoken languages" msgstr "" #: src/components/settings/views/billing.tsx:76 -msgid "Start Annual Plan" -msgstr "" +#~ msgid "Start Annual Plan" +#~ msgstr "" #: src/components/settings/views/billing.tsx:75 -msgid "Start Monthly Plan" -msgstr "" +#~ msgid "Start Monthly Plan" +#~ msgstr "" #: src/components/editor-area/note-header/listen-button.tsx:164 msgid "Start recording" @@ -1149,25 +1147,25 @@ msgstr "" #~ msgid "Submit Feedback" #~ msgstr "" -#: src/components/right-panel/components/chat/empty-chat-state.tsx:61 +#: src/components/right-panel/components/chat/empty-chat-state.tsx:67 msgid "Summarize meeting" msgstr "" #: src/components/settings/views/billing.tsx:42 -msgid "Synchronization across multiple devices" -msgstr "" +#~ msgid "Synchronization across multiple devices" +#~ msgstr "" #: src/components/settings/views/sound.tsx:106 msgid "System Audio Access" msgstr "" -#: src/components/left-sidebar/top-area/settings-button.tsx:114 +#: src/components/left-sidebar/top-area/settings-button.tsx:105 msgid "Talk to Founders" msgstr "" #: src/components/settings/views/billing.tsx:46 -msgid "Team" -msgstr "" +#~ msgid "Team" +#~ msgstr "" #: src/components/settings/views/team.tsx:72 msgid "Team management features are currently under development and will be available in a future update." @@ -1177,7 +1175,7 @@ msgstr "" msgid "Teamspace" msgstr "" -#: src/routes/app.settings.tsx:73 +#: src/routes/app.settings.tsx:74 msgid "Templates" msgstr "" @@ -1194,8 +1192,8 @@ msgid "The name of your Obsidian vault." msgstr "" #: src/components/settings/views/billing.tsx:113 -msgid "There's a plan for everyone" -msgstr "" +#~ msgid "There's a plan for everyone" +#~ msgstr "" #: src/components/settings/views/profile.tsx:188 msgid "This is a short description of your company." @@ -1258,8 +1256,8 @@ msgid "Upcoming Events" msgstr "" #: src/components/settings/views/billing.tsx:69 -msgid "Upgrade" -msgstr "" +#~ msgid "Upgrade" +#~ msgstr "" #: src/components/settings/components/ai/llm-view.tsx:155 #~ msgid "Use the local Llama 3.2 model for enhanced privacy and offline capability." @@ -1327,12 +1325,12 @@ msgid "Word Error Rate (WER) indicates transcription accuracy (lower is better). msgstr "" #: src/components/settings/views/billing.tsx:25 -msgid "Works both in-person and remotely" -msgstr "" +#~ msgid "Works both in-person and remotely" +#~ msgstr "" #: src/components/settings/views/billing.tsx:29 -msgid "Works offline" -msgstr "" +#~ msgid "Works offline" +#~ msgstr "" #: src/components/editor-area/note-header/listen-button.tsx:358 #~ msgid "Yes, activate speaker" diff --git a/apps/desktop/src/routeTree.gen.ts b/apps/desktop/src/routeTree.gen.ts index 2389b77444..2f08fa0b05 100644 --- a/apps/desktop/src/routeTree.gen.ts +++ b/apps/desktop/src/routeTree.gen.ts @@ -13,7 +13,6 @@ import { Route as VideoRouteImport } from './routes/video' import { Route as AppRouteImport } from './routes/app' import { Route as AppIndexRouteImport } from './routes/app.index' import { Route as AppSettingsRouteImport } from './routes/app.settings' -import { Route as AppPlansRouteImport } from './routes/app.plans' import { Route as AppNewRouteImport } from './routes/app.new' import { Route as AppFinderRouteImport } from './routes/app.finder' import { Route as AppControlRouteImport } from './routes/app.control' @@ -42,11 +41,6 @@ const AppSettingsRoute = AppSettingsRouteImport.update({ path: '/settings', getParentRoute: () => AppRoute, } as any) -const AppPlansRoute = AppPlansRouteImport.update({ - id: '/plans', - path: '/plans', - getParentRoute: () => AppRoute, -} as any) const AppNewRoute = AppNewRouteImport.update({ id: '/new', path: '/new', @@ -89,7 +83,6 @@ export interface FileRoutesByFullPath { '/app/control': typeof AppControlRoute '/app/finder': typeof AppFinderRoute '/app/new': typeof AppNewRoute - '/app/plans': typeof AppPlansRoute '/app/settings': typeof AppSettingsRoute '/app/': typeof AppIndexRoute '/app/human/$id': typeof AppHumanIdRoute @@ -102,7 +95,6 @@ export interface FileRoutesByTo { '/app/control': typeof AppControlRoute '/app/finder': typeof AppFinderRoute '/app/new': typeof AppNewRoute - '/app/plans': typeof AppPlansRoute '/app/settings': typeof AppSettingsRoute '/app': typeof AppIndexRoute '/app/human/$id': typeof AppHumanIdRoute @@ -117,7 +109,6 @@ export interface FileRoutesById { '/app/control': typeof AppControlRoute '/app/finder': typeof AppFinderRoute '/app/new': typeof AppNewRoute - '/app/plans': typeof AppPlansRoute '/app/settings': typeof AppSettingsRoute '/app/': typeof AppIndexRoute '/app/human/$id': typeof AppHumanIdRoute @@ -133,7 +124,6 @@ export interface FileRouteTypes { | '/app/control' | '/app/finder' | '/app/new' - | '/app/plans' | '/app/settings' | '/app/' | '/app/human/$id' @@ -146,7 +136,6 @@ export interface FileRouteTypes { | '/app/control' | '/app/finder' | '/app/new' - | '/app/plans' | '/app/settings' | '/app' | '/app/human/$id' @@ -160,7 +149,6 @@ export interface FileRouteTypes { | '/app/control' | '/app/finder' | '/app/new' - | '/app/plans' | '/app/settings' | '/app/' | '/app/human/$id' @@ -204,13 +192,6 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof AppSettingsRouteImport parentRoute: typeof AppRoute } - '/app/plans': { - id: '/app/plans' - path: '/plans' - fullPath: '/app/plans' - preLoaderRoute: typeof AppPlansRouteImport - parentRoute: typeof AppRoute - } '/app/new': { id: '/app/new' path: '/new' @@ -267,7 +248,6 @@ interface AppRouteChildren { AppControlRoute: typeof AppControlRoute AppFinderRoute: typeof AppFinderRoute AppNewRoute: typeof AppNewRoute - AppPlansRoute: typeof AppPlansRoute AppSettingsRoute: typeof AppSettingsRoute AppIndexRoute: typeof AppIndexRoute AppHumanIdRoute: typeof AppHumanIdRoute @@ -280,7 +260,6 @@ const AppRouteChildren: AppRouteChildren = { AppControlRoute: AppControlRoute, AppFinderRoute: AppFinderRoute, AppNewRoute: AppNewRoute, - AppPlansRoute: AppPlansRoute, AppSettingsRoute: AppSettingsRoute, AppIndexRoute: AppIndexRoute, AppHumanIdRoute: AppHumanIdRoute, diff --git a/apps/desktop/src/routes/__root.tsx b/apps/desktop/src/routes/__root.tsx index a7baf28543..8919a3e673 100644 --- a/apps/desktop/src/routes/__root.tsx +++ b/apps/desktop/src/routes/__root.tsx @@ -1,4 +1,5 @@ // react-scan must be imported before React +// @ts-nocheck import { scan } from "react-scan"; import { useQuery } from "@tanstack/react-query"; @@ -54,7 +55,7 @@ function Component() { const webview = getCurrentWebviewWindow(); windowsEvents.navigate(webview).listen(({ payload }) => { - navigate({ to: payload.path }); + navigate({ to: payload.path, search: payload.search }); }).then((fn) => { unlisten = fn; }); @@ -64,7 +65,7 @@ function Component() { useEffect(() => { windowsInit(); - scan({ enabled: true }); + // scan({ enabled: true }); }, []); // Listen for debug events from control window diff --git a/apps/desktop/src/routes/app.plans.tsx b/apps/desktop/src/routes/app.plans.tsx deleted file mode 100644 index 19e61df3bc..0000000000 --- a/apps/desktop/src/routes/app.plans.tsx +++ /dev/null @@ -1,176 +0,0 @@ -import { Button } from "@hypr/ui/components/ui/button"; -import { ProgressiveBlur } from "@hypr/ui/components/ui/progressive-blur"; -import { cn } from "@hypr/ui/lib/utils"; -import { createFileRoute } from "@tanstack/react-router"; -import { Check } from "lucide-react"; - -export const Route = createFileRoute("/app/plans")({ - component: Component, -}); - -function Component() { - return ( -
-
-
- - - -
-
-
- ); -} - -interface PricingCardProps { - title: string; - description: string; - buttonText: string; - buttonVariant: "default" | "outline"; - features: string[]; - className?: string; - secondaryAction?: { - text: string; - onClick: () => void; - }; -} - -function PricingCard({ - title, - description, - buttonText, - buttonVariant, - features, - className, - secondaryAction, -}: PricingCardProps) { - const isLocalPlan = title === "Free"; - const bgImage = isLocalPlan ? "/assets/bg-local-card.jpg" : "/assets/bg-pro-card.jpg"; - - return ( -
- {isLocalPlan - ?
- :
} - -
-
- {isLocalPlan ? "Free" : "Private Beta"} -
-
- - - - {/* Wrapper for content to ensure it's above the blur */} -
-
-

{title}

-

{description}

-
- - {secondaryAction && ( - - )} - -
- {features.map((feature, i) => ( -
-
- -
- {feature} -
- ))} -
- - {isLocalPlan - ? ( - - ) - : ( - - {buttonText} - - )} -
-
- ); -} diff --git a/apps/desktop/src/routes/app.settings.tsx b/apps/desktop/src/routes/app.settings.tsx index c5388319c2..7dfe35fd9b 100644 --- a/apps/desktop/src/routes/app.settings.tsx +++ b/apps/desktop/src/routes/app.settings.tsx @@ -9,6 +9,7 @@ import { z } from "zod"; import { TabIcon } from "@/components/settings/components/tab-icon"; import { type Tab, TABS } from "@/components/settings/components/types"; import { + Billing, Calendar, General, Integrations, @@ -141,6 +142,7 @@ function Component() { {search.tab === "ai" && } {search.tab === "templates" && } {search.tab === "integrations" && } + {search.tab === "billing" && }
diff --git a/apps/desktop/src/routes/app.tsx b/apps/desktop/src/routes/app.tsx index 4efad68f4e..e95c00aa56 100644 --- a/apps/desktop/src/routes/app.tsx +++ b/apps/desktop/src/routes/app.tsx @@ -7,6 +7,7 @@ import { useEffect, useState } from "react"; import { IndividualizationModal } from "@/components/individualization-modal"; import LeftSidebar from "@/components/left-sidebar"; +import { LicenseRefreshProvider } from "@/components/license"; import RightPanel from "@/components/right-panel"; import Notifications from "@/components/toast"; import Toolbar from "@/components/toolbar"; @@ -51,7 +52,7 @@ function Component() { && !onboardingCompletedThisSession; return ( - <> + @@ -106,7 +107,7 @@ function Component() { {showNotifications && } - + ); } diff --git a/packages/ui/src/hooks/use-mobile.tsx b/packages/ui/src/hooks/use-mobile.tsx index a93d583938..dd429a6f19 100644 --- a/packages/ui/src/hooks/use-mobile.tsx +++ b/packages/ui/src/hooks/use-mobile.tsx @@ -1,17 +1,16 @@ -import * as React from "react"; +import { useEffect, useState } from "react"; const MOBILE_BREAKPOINT = 768; export function useIsMobile() { - const [isMobile, setIsMobile] = React.useState( - undefined, - ); + const [isMobile, setIsMobile] = useState(undefined); - React.useEffect(() => { + useEffect(() => { const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`); const onChange = () => { setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); }; + mql.addEventListener("change", onChange); setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); return () => mql.removeEventListener("change", onChange); diff --git a/plugins/tray/Cargo.toml b/plugins/tray/Cargo.toml index 8a68fd5b2d..fd213efa78 100644 --- a/plugins/tray/Cargo.toml +++ b/plugins/tray/Cargo.toml @@ -23,3 +23,5 @@ tauri-plugin-windows = { workspace = true } specta = { workspace = true } tauri-specta = { workspace = true, features = ["derive", "typescript"] } + +serde_json = { workspace = true } diff --git a/plugins/tray/src/ext.rs b/plugins/tray/src/ext.rs index abb2b9d70b..d18a4a1c7e 100644 --- a/plugins/tray/src/ext.rs +++ b/plugins/tray/src/ext.rs @@ -111,10 +111,20 @@ impl> TrayPluginExt for T { let _ = HyprWindow::Main.show(app); } HyprMenuItem::TrayStart => { - use tauri_plugin_windows::{HyprWindow, WindowsPluginExt}; + use tauri_plugin_windows::{HyprWindow, Navigate, WindowsPluginExt}; if let Ok(_) = app.window_show(HyprWindow::Main) { - let _ = - app.window_emit_navigate(HyprWindow::Main, "/app/new?record=true"); + let _ = app.window_emit_navigate( + HyprWindow::Main, + Navigate { + path: "/app/new".to_string(), + search: Some( + serde_json::json!({ "record": true }) + .as_object() + .cloned() + .unwrap(), + ), + }, + ); } } HyprMenuItem::TrayQuit => { @@ -151,9 +161,15 @@ impl> TrayPluginExt for T { }); } HyprMenuItem::AppNew => { - use tauri_plugin_windows::{HyprWindow, WindowsPluginExt}; + use tauri_plugin_windows::{HyprWindow, Navigate, WindowsPluginExt}; if let Ok(_) = app.window_show(HyprWindow::Main) { - let _ = app.window_emit_navigate(HyprWindow::Main, "/app/new"); + let _ = app.window_emit_navigate( + HyprWindow::Main, + Navigate { + path: "/app/new".to_string(), + search: None, + }, + ); } } } diff --git a/plugins/windows/Cargo.toml b/plugins/windows/Cargo.toml index f084a93700..c9f6a4b0a1 100644 --- a/plugins/windows/Cargo.toml +++ b/plugins/windows/Cargo.toml @@ -21,10 +21,11 @@ objc2-foundation = { workspace = true } [dependencies] serde = { workspace = true } -specta = { workspace = true } +serde_json = { workspace = true } strum = { workspace = true, features = ["derive"] } uuid = { workspace = true, features = ["v4"] } +specta = { workspace = true } tauri = { workspace = true, features = ["test", "macos-private-api"] } tauri-specta = { workspace = true, features = ["derive", "typescript"] } diff --git a/plugins/windows/js/bindings.gen.ts b/plugins/windows/js/bindings.gen.ts index 9373783a0f..321828e175 100644 --- a/plugins/windows/js/bindings.gen.ts +++ b/plugins/windows/js/bindings.gen.ts @@ -31,8 +31,8 @@ async windowSetFloating(window: HyprWindow, v: boolean) : Promise { async windowNavigate(window: HyprWindow, path: string) : Promise { return await TAURI_INVOKE("plugin:windows|window_navigate", { window, path }); }, -async windowEmitNavigate(window: HyprWindow, path: string) : Promise { - return await TAURI_INVOKE("plugin:windows|window_emit_navigate", { window, path }); +async windowEmitNavigate(window: HyprWindow, event: Navigate) : Promise { + return await TAURI_INVOKE("plugin:windows|window_emit_navigate", { window, event }); }, async windowIsVisible(window: HyprWindow) : Promise { return await TAURI_INVOKE("plugin:windows|window_is_visible", { window }); @@ -73,7 +73,7 @@ windowDestroyed: "plugin:windows:window-destroyed" export type HyprWindow = { type: "main" } | { type: "note"; value: string } | { type: "human"; value: string } | { type: "organization"; value: string } | { type: "finder" } | { type: "settings" } | { type: "video"; value: string } | { type: "plans" } | { type: "control" } export type KnownPosition = "left-half" | "right-half" | "center" export type MainWindowState = { left_sidebar_expanded: boolean | null; right_panel_expanded: boolean | null } -export type Navigate = { path: string } +export type Navigate = { path: string; search: Partial<{ [key in string]: JsonValue }> } export type OverlayBound = { x: number; y: number; width: number; height: number } export type WindowDestroyed = { window: HyprWindow } diff --git a/plugins/windows/src/commands.rs b/plugins/windows/src/commands.rs index a4d28a6143..0b25dbe4d0 100644 --- a/plugins/windows/src/commands.rs +++ b/plugins/windows/src/commands.rs @@ -1,4 +1,4 @@ -use crate::{FakeWindowBounds, HyprWindow, KnownPosition, OverlayBound, WindowsPluginExt}; +use crate::{events, FakeWindowBounds, HyprWindow, KnownPosition, OverlayBound, WindowsPluginExt}; #[tauri::command] #[specta::specta] @@ -101,9 +101,9 @@ pub async fn window_navigate( pub async fn window_emit_navigate( app: tauri::AppHandle, window: HyprWindow, - path: String, + event: events::Navigate, ) -> Result<(), String> { - app.window_emit_navigate(window, path) + app.window_emit_navigate(window, event) .map_err(|e| e.to_string())?; Ok(()) } diff --git a/plugins/windows/src/events.rs b/plugins/windows/src/events.rs index 2c9096e799..ffae19e85e 100644 --- a/plugins/windows/src/events.rs +++ b/plugins/windows/src/events.rs @@ -52,7 +52,9 @@ pub fn on_window_event(window: &tauri::Window, event: &tauri::Window #[macro_export] macro_rules! common_event_derives { ($item:item) => { - #[derive(serde::Serialize, Clone, specta::Type, tauri_specta::Event)] + #[derive( + serde::Serialize, serde::Deserialize, Clone, specta::Type, tauri_specta::Event, + )] $item }; } @@ -60,6 +62,7 @@ macro_rules! common_event_derives { common_event_derives! { pub struct Navigate { pub path: String, + pub search: Option>, } } diff --git a/plugins/windows/src/ext.rs b/plugins/windows/src/ext.rs index 14532fae2a..08da7b25a1 100644 --- a/plugins/windows/src/ext.rs +++ b/plugins/windows/src/ext.rs @@ -24,8 +24,6 @@ pub enum HyprWindow { Settings, #[serde(rename = "video")] Video(String), - #[serde(rename = "plans")] - Plans, #[serde(rename = "control")] Control, } @@ -40,7 +38,6 @@ impl std::fmt::Display for HyprWindow { Self::Finder => write!(f, "finder"), Self::Settings => write!(f, "settings"), Self::Video(id) => write!(f, "video-{}", id), - Self::Plans => write!(f, "plans"), Self::Control => write!(f, "control"), } } @@ -63,7 +60,6 @@ impl std::str::FromStr for HyprWindow { "human" => return Ok(Self::Human(id.to_string())), "organization" => return Ok(Self::Organization(id.to_string())), "video" => return Ok(Self::Video(id.to_string())), - "plans" => return Ok(Self::Plans), _ => {} } } @@ -99,15 +95,9 @@ impl HyprWindow { pub fn emit_navigate( &self, app: &AppHandle, - path: impl AsRef, + event: events::Navigate, ) -> Result<(), crate::Error> { - if let Some(window) = self.get(app) { - let mut url = window.url().unwrap(); - url.set_path(path.as_ref()); - - let event = events::Navigate { - path: path.as_ref().into(), - }; + if let Some(_) = self.get(app) { events::Navigate::emit_to(&event, app, self.label())?; } Ok(()) @@ -146,7 +136,6 @@ impl HyprWindow { Self::Finder => "Finder".into(), Self::Settings => "Settings".into(), Self::Video(_) => "Video".into(), - Self::Plans => "Plans".into(), Self::Control => "Control".into(), } } @@ -333,13 +322,6 @@ impl HyprWindow { .inner_size(640.0, 360.0) .min_inner_size(640.0, 360.0) .build()?, - Self::Plans => self - .window_builder(app, "/app/plans") - .maximizable(false) - .minimizable(false) - .inner_size(900.0, 600.0) - .min_inner_size(900.0, 600.0) - .build()?, Self::Control => { let window_width = (monitor.size().width as f64) / monitor.scale_factor(); let window_height = (monitor.size().height as f64) / monitor.scale_factor(); @@ -487,7 +469,7 @@ pub trait WindowsPluginExt { fn window_emit_navigate( &self, window: HyprWindow, - path: impl AsRef, + event: events::Navigate, ) -> Result<(), crate::Error>; fn window_navigate( @@ -610,9 +592,9 @@ impl WindowsPluginExt for AppHandle { fn window_emit_navigate( &self, window: HyprWindow, - path: impl AsRef, + event: events::Navigate, ) -> Result<(), crate::Error> { - window.emit_navigate(self, path) + window.emit_navigate(self, event) } fn window_navigate( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dd6056030f..fca5de0aeb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -463,6 +463,12 @@ importers: tailwind-merge: specifier: ^2.6.0 version: 2.6.0 + tauri-plugin-keygen-api: + specifier: github:bagindo/tauri-plugin-keygen#v2 + version: https://codeload.github.com/bagindo/tauri-plugin-keygen/tar.gz/e0de03a76a5c82c36adb347e43e4bff4f78c87de + tauri-plugin-keygen-rs2-api: + specifier: ^0.2.3 + version: 0.2.3 tauri-plugin-sentry-api: specifier: ^0.4.1 version: 0.4.1 @@ -3947,6 +3953,9 @@ packages: resolution: {integrity: sha512-fN5u+9HsSfhRaXGOdD2kPGbqDgyX+nkm1XF/4d/LNuM4WiNfvHjjRAqWQYBhQsg1aF9nsTPmSW+tmy+Yn5T5+A==} engines: {node: '>= 18', npm: '>= 6.6.0', yarn: '>= 1.19.1'} + '@tauri-apps/api@2.0.2': + resolution: {integrity: sha512-3wSwmG+1kr6WrgAFKK5ijkNFPp8TT3FLj3YHUb5EwMO+3FxX4uWlfSWkeeBy+Kc1RsKzugtYLuuya+98Flj+3w==} + '@tauri-apps/api@2.6.0': resolution: {integrity: sha512-hRNcdercfgpzgFrMXWwNDBN0B7vNzOzRepy6ZAmhxi5mDLVPNrTpo9MGg2tN/F7JRugj4d2aF7E1rtPXAHaetg==} @@ -9139,6 +9148,13 @@ packages: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} + tauri-plugin-keygen-api@https://codeload.github.com/bagindo/tauri-plugin-keygen/tar.gz/e0de03a76a5c82c36adb347e43e4bff4f78c87de: + resolution: {tarball: https://codeload.github.com/bagindo/tauri-plugin-keygen/tar.gz/e0de03a76a5c82c36adb347e43e4bff4f78c87de} + version: 2.0.0 + + tauri-plugin-keygen-rs2-api@0.2.3: + resolution: {integrity: sha512-xgqa2X1KbpLHMyxZK7UbCxoHCIB8hOBOZ3qY1X9Fgyf0jX+jTrCepvDoTBoQ2IgAaYVnBx7psgPC9cAznCtjSg==} + tauri-plugin-sentry-api@0.4.1: resolution: {integrity: sha512-KgfL7JhN51TOA3e0UYDu6UkdwgH+wC1/RC3qIHJOZIAsvyTfde4uifUFB11GfgXfHgY33xUkIGgqWKkaK5lg6Q==} @@ -13131,6 +13147,8 @@ snapshots: '@tauri-apps/api@2.0.0-beta.8': {} + '@tauri-apps/api@2.0.2': {} + '@tauri-apps/api@2.6.0': {} '@tauri-apps/cli-darwin-arm64@2.6.2': @@ -19220,6 +19238,15 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 + tauri-plugin-keygen-api@https://codeload.github.com/bagindo/tauri-plugin-keygen/tar.gz/e0de03a76a5c82c36adb347e43e4bff4f78c87de: + dependencies: + '@tauri-apps/api': 2.0.2 + tslib: 2.8.1 + + tauri-plugin-keygen-rs2-api@0.2.3: + dependencies: + '@tauri-apps/api': 2.6.0 + tauri-plugin-sentry-api@0.4.1: dependencies: '@tauri-apps/api': 2.0.0-beta.8 diff --git a/scripts/s3/upload.sh b/scripts/s3/upload.sh index 5ce36a404d..00f11a401b 100644 --- a/scripts/s3/upload.sh +++ b/scripts/s3/upload.sh @@ -1,6 +1,9 @@ -CREDENTIALS_FILE="$HOME/hyprnote-r2.toml" -ENDPOINT_URL="https://3db5267cdeb5f79263ede3ec58090fe0.r2.cloudflarestorage.com" -BUCKET="hyprnote-cache" +# CREDENTIALS_FILE="$HOME/hyprnote-r2.toml" +CREDENTIALS_FILE="$HOME/hyprnote-tigris.toml" +# ENDPOINT_URL="https://3db5267cdeb5f79263ede3ec58090fe0.r2.cloudflarestorage.com" +ENDPOINT_URL="https://hyprnote-models.t3.storage.dev/hypo-llm/?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=tid_jMCCPSPwjkhTVegMJMCLU_uamBoBNYeuKYZVnoCiWlVvyDTkRX%2F20250721%2Fauto%2Fs3%2Faws4_request&X-Amz-Date=20250721T235903Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=aa0f515992dd70d1ab5a270543b7947020ff9726c8ee5314910c1b9acafc7066" +# BUCKET="hyprnote-cache" +BUCKET="hyprnote-models" FROM_PATH="$HOME/dev/hyprnote/.cache/" TO_PATH="v0/"