diff --git a/Cargo.lock b/Cargo.lock index ff3f5ac..0a2c89f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -114,26 +114,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common", - "generic-array", -] - -[[package]] -name = "aegis" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e07d39d15384924b35b70d7b8fa1f9a2934101dd3fa4722ede163cc4f9b7b960" -dependencies = [ - "cc", - "softaes", -] - [[package]] name = "aes" version = "0.8.4" @@ -145,20 +125,6 @@ dependencies = [ "cpufeatures", ] -[[package]] -name = "aes-gcm" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" -dependencies = [ - "aead", - "aes", - "cipher", - "ctr", - "ghash", - "subtle", -] - [[package]] name = "ahash" version = "0.8.12" @@ -196,7 +162,7 @@ dependencies = [ "android-properties", "bitflags 2.12.1", "cc", - "jni 0.22.4", + "jni", "libc", "log", "ndk", @@ -206,24 +172,6 @@ dependencies = [ "thiserror 2.0.18", ] -[[package]] -name = "android-native-keyring-store" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c6349ddff23194f8fdce2ea8849380f5a4868c1648965b70e801e104cba9b3" -dependencies = [ - "base64", - "jni 0.21.1", - "keyring-core", - "log", - "ndk-context", - "regex", - "serde", - "serde_json", - "thiserror 2.0.18", - "tracing", -] - [[package]] name = "android-properties" version = "0.2.2" @@ -289,22 +237,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "antithesis_sdk" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18dbd97a5b6c21cc9176891cf715f7f0c273caf3959897f43b9bd1231939e675" -dependencies = [ - "libc", - "libloading", - "linkme", - "once_cell", - "rand 0.8.6", - "rustc_version_runtime", - "serde", - "serde_json", -] - [[package]] name = "anyhow" version = "1.0.102" @@ -378,12 +310,6 @@ dependencies = [ "libloading", ] -[[package]] -name = "assoc" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdc70193dadb9d7287fa4b633f15f90c876915b31f6af17da307fc59c9859a8" - [[package]] name = "async-broadcast" version = "0.7.2" @@ -656,42 +582,6 @@ version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" -[[package]] -name = "bigdecimal" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695" -dependencies = [ - "autocfg", - "libm", - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "bindgen" -version = "0.69.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" -dependencies = [ - "bitflags 2.12.1", - "cexpr", - "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex 1.3.0", - "syn 2.0.117", - "which", -] - [[package]] name = "bit-set" version = "0.5.3" @@ -737,27 +627,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "bitpacking" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96a7139abd3d9cebf8cd6f920a389cf3dc9576172e32f4563f188cae3c3eb019" -dependencies = [ - "crunchy", -] - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - [[package]] name = "block" version = "0.1.6" @@ -804,40 +673,6 @@ dependencies = [ "piper", ] -[[package]] -name = "bon" -version = "3.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f47dbe92550676ee653353c310dfb9cf6ba17ee70396e1f7cf0a2020ad49b2fe" -dependencies = [ - "bon-macros", - "rustversion", -] - -[[package]] -name = "bon-macros" -version = "3.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "519bd3116aeeb42d5372c29d982d16d0170d3d4a5ed85fc7dd91642ffff3c67c" -dependencies = [ - "darling", - "ident_case", - "prettyplease", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.117", -] - -[[package]] -name = "branches" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e426eb5cc1900033930ec955317b302e68f19f326cc7bb0c8a86865a826cdf0c" -dependencies = [ - "rustc_version", -] - [[package]] name = "bumpalo" version = "3.20.3" @@ -864,12 +699,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - [[package]] name = "byteorder-lite" version = "0.1.0" @@ -960,28 +789,7 @@ dependencies = [ "find-msvc-tools", "jobserver", "libc", - "shlex 2.0.1", -] - -[[package]] -name = "census" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4c707c6a209cbe82d10abd08e1ea8995e9ea937d2550646e02798948992be0" - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", + "shlex", ] [[package]] @@ -996,12 +804,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "cfg_block" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18758054972164c3264f7c8386f5fc6da6114cb46b619fd365d4e3b2dc3ae487" - [[package]] name = "cgl" version = "0.3.2" @@ -1044,17 +846,6 @@ dependencies = [ "inout", ] -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - [[package]] name = "clap" version = "4.6.1" @@ -1112,7 +903,7 @@ checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" dependencies = [ "serde", "termcolor", - "unicode-width 0.2.2", + "unicode-width", ] [[package]] @@ -1257,15 +1048,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crc32c" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a47af21622d091a8f0fb295b88bc886ac74efcc613efc19f5d0b21de5c89e47" -dependencies = [ - "rustc_version", -] - [[package]] name = "crc32fast" version = "1.5.0" @@ -1284,35 +1066,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-skiplist" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df29de440c58ca2cc6e587ec3d22347551a32435fbde9d2bff64e78a9ffa151b" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -1371,7 +1124,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", - "rand_core 0.6.4", "typenum", ] @@ -1385,15 +1137,6 @@ dependencies = [ "phf 0.11.3", ] -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - [[package]] name = "cursor-icon" version = "1.2.0" @@ -1473,32 +1216,6 @@ dependencies = [ "lock_api", "once_cell", "parking_lot_core", - "serde", -] - -[[package]] -name = "datasketches" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c286de4e81ea2590afc24d754e0f83810c566f50a1388fa75ebd57928c0d9745" - -[[package]] -name = "db-keystore" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc758963ac0d7ead30f47ff2a02a2fd3456cf4d7fc695cf9bae72e951a3df2b" -dependencies = [ - "anyhow", - "clap", - "futures", - "keyring-core", - "log", - "regex", - "serde", - "serde_json", - "turso", - "uuid", - "zeroize", ] [[package]] @@ -1565,7 +1282,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ "powerfmt", - "serde_core", ] [[package]] @@ -1653,12 +1369,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" -[[package]] -name = "downcast-rs" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "117240f60069e65410b3ae1bb213295bd828f707b5bec6596a1afc8793ce0cbc" - [[package]] name = "dpi" version = "0.1.2" @@ -1888,25 +1598,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "env_filter" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" -dependencies = [ - "log", -] - -[[package]] -name = "env_logger" -version = "0.11.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" -dependencies = [ - "env_filter", - "log", -] - [[package]] name = "epaint" version = "0.32.3" @@ -1937,17 +1628,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "erased-serde" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" -dependencies = [ - "serde", - "serde_core", - "typeid", -] - [[package]] name = "errno" version = "0.3.14" @@ -2016,23 +1696,6 @@ dependencies = [ "regex", ] -[[package]] -name = "fastbloom" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7f34442dbe69c60fe8eaf58a8cafff81a1f278816d8ab4db255b3bef4ac3c4" -dependencies = [ - "getrandom 0.3.4", - "libm", - "siphasher", -] - -[[package]] -name = "fastdivide" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afc2bd4d5a73106dd53d10d73d3401c2f32730ba2c0b93ddb888a8983680471" - [[package]] name = "fastrand" version = "2.4.1" @@ -2181,37 +1844,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fs4" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8640e34b88f7652208ce9e88b1a37a2ae95227d84abec377ccd3c5cfeb141ed4" -dependencies = [ - "rustix 1.1.4", - "windows-sys 0.59.0", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - [[package]] name = "futures-channel" version = "0.3.32" @@ -2219,7 +1851,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", - "futures-sink", ] [[package]] @@ -2228,17 +1859,6 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" -[[package]] -name = "futures-executor" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - [[package]] name = "futures-io" version = "0.3.32" @@ -2269,12 +1889,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "futures-sink" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" - [[package]] name = "futures-task" version = "0.3.32" @@ -2287,47 +1901,13 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ - "futures-channel", "futures-core", - "futures-io", "futures-macro", - "futures-sink", "futures-task", - "memchr", "pin-project-lite", "slab", ] -[[package]] -name = "genawaiter" -version = "0.99.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c86bd0361bcbde39b13475e6e36cb24c329964aa2611be285289d1e4b751c1a0" -dependencies = [ - "genawaiter-macro", -] - -[[package]] -name = "genawaiter-macro" -version = "0.99.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b32dfe1fdfc0bbde1f22a5da25355514b5e450c33a6af6770884c8750aedfbc" - -[[package]] -name = "generator" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3b854b0e584ead1a33f18b2fcad7cf7be18b3875c78816b753639aa501513ae" -dependencies = [ - "cc", - "cfg-if", - "libc", - "log", - "rustversion", - "windows-link 0.2.1", - "windows-result 0.4.1", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -2387,16 +1967,6 @@ dependencies = [ "wasip3", ] -[[package]] -name = "ghash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" -dependencies = [ - "opaque-debug", - "polyval", -] - [[package]] name = "gl_generator" version = "0.14.0" @@ -2408,12 +1978,6 @@ dependencies = [ "xml-rs", ] -[[package]] -name = "glob" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" - [[package]] name = "global-hotkey" version = "0.8.0" @@ -2698,13 +2262,14 @@ name = "hephd" version = "0.0.0" dependencies = [ "anyhow", + "apple-native-keyring-store", "axum", "base64", "chrono", "clap", + "dbus-secret-service-keyring-store", "heph-core", "jsonwebtoken", - "keyring", "keyring-core", "rand 0.8.6", "reqwest", @@ -2755,21 +2320,6 @@ dependencies = [ "digest", ] -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "htmlescape" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9025058dae765dee5070ec375f591e2ba14638c63feff74f13805a72e523163" - [[package]] name = "http" version = "1.4.1" @@ -3056,35 +2606,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "intrusive-collections" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" -dependencies = [ - "memoffset", -] - -[[package]] -name = "inventory" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" -dependencies = [ - "rustversion", -] - -[[package]] -name = "io-uring" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d09b98f7eace8982db770e4408e7470b028ce513ac28fecdc6bf4c30fe92b62" -dependencies = [ - "bitflags 2.12.1", - "cfg-if", - "libc", -] - [[package]] name = "ipnet" version = "2.12.0" @@ -3097,15 +2618,6 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.14.0" @@ -3121,22 +2633,6 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys 0.3.1", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - [[package]] name = "jni" version = "0.22.4" @@ -3263,39 +2759,13 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "keyring" -version = "4.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9933a54d9cdbab06776a617dfd0cbc320407e04402eb51bfbf7a5e1f583b5e" -dependencies = [ - "android-native-keyring-store", - "apple-native-keyring-store", - "base64", - "clap", - "db-keystore", - "dbus-secret-service-keyring-store", - "keyring-core", - "linux-keyutils-keyring-store", - "rpassword", - "rprompt", - "windows-native-keyring-store", - "zbus-secret-service-keyring-store", -] - [[package]] name = "keyring-core" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb1e621458ca9c51aa110bd0339d4751a056b9576bf1253aee1aa560dda0fc9d" dependencies = [ - "chrono", - "dashmap", "log", - "regex", - "ron", - "serde", - "uuid", ] [[package]] @@ -3330,24 +2800,12 @@ dependencies = [ "spin", ] -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "leb128fmt" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" -[[package]] -name = "levenshtein_automata" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2cdeb66e45e9f36bfad5bbdb4d2384e70936afbee843c6f6543f0c551ebb25" - [[package]] name = "libc" version = "0.2.186" @@ -3380,15 +2838,6 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" -[[package]] -name = "libmimalloc-sys" -version = "0.1.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a45a52f43e1c16f667ccfe4dd8c85b7f7c204fd5e3bf46c5b0db9a5c3c0b8e9" -dependencies = [ - "cc", -] - [[package]] name = "libredox" version = "0.1.17" @@ -3421,46 +2870,6 @@ dependencies = [ "bitflags 2.12.1", ] -[[package]] -name = "linkme" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83272d46373fb8decca684579ac3e7c8f3d71d4cc3aa693df8759e260ae41cf" -dependencies = [ - "linkme-impl", -] - -[[package]] -name = "linkme-impl" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32d59e20403c7d08fe62b4376edfe5c7fb2ef1e6b1465379686d0f21c8df444b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "linux-keyutils" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83270a18e9f90d0707c41e9f35efada77b64c0e6f3f1810e71c8368a864d5590" -dependencies = [ - "bitflags 2.12.1", - "libc", -] - -[[package]] -name = "linux-keyutils-keyring-store" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39fbed79f71dc21eb21d3d07c0e908a3c58ff9a1fdbf5cf44230fb3deb6d994b" -dependencies = [ - "keyring-core", - "linux-keyutils", -] - [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -3500,19 +2909,6 @@ version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "113b30b4cd05f7c06868fdb2854f66a7b9fece9a48425351cd532e810d74024f" -[[package]] -name = "loom" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "tracing", - "tracing-subscriber", -] - [[package]] name = "lru" version = "0.16.4" @@ -3522,12 +2918,6 @@ dependencies = [ "hashbrown 0.16.1", ] -[[package]] -name = "lz4_flex" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef0d4ed8669f8f8826eb00dc878084aa8f253506c4fd5e8f58f5bce72ddb97e" - [[package]] name = "mac_address" version = "1.1.8" @@ -3562,15 +2952,6 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" -[[package]] -name = "measure_time" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51c55d61e72fc3ab704396c5fa16f4c184db37978ae4e94ca8959693a235fc0e" -dependencies = [ - "log", -] - [[package]] name = "memchr" version = "2.8.1" @@ -3616,37 +2997,6 @@ dependencies = [ "paste", ] -[[package]] -name = "miette" -version = "7.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" -dependencies = [ - "cfg-if", - "miette-derive", - "unicode-width 0.1.14", -] - -[[package]] -name = "miette-derive" -version = "7.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "mimalloc" -version = "0.1.52" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d4139bb28d14ad1facf21d5eb8825051b326e172d216b39f6d31df53cc97862" -dependencies = [ - "libmimalloc-sys", -] - [[package]] name = "mime" version = "0.3.17" @@ -3691,12 +3041,6 @@ dependencies = [ "pxfm", ] -[[package]] -name = "murmurhash32" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2195bf6aa996a481483b29d62a7663eed3fe39600c460e323f8ff41e90bdd89b" - [[package]] name = "naga" version = "25.0.1" @@ -4229,18 +3573,6 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" -[[package]] -name = "oneshot" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "269bca4c2591a28585d6bf10d9ed0332b7d76900a1b02bec41bdc3a2cdcda107" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "openssl" version = "0.10.80" @@ -4307,15 +3639,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "ordered-float" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" -dependencies = [ - "num-traits", -] - [[package]] name = "ordered-stream" version = "0.2.0" @@ -4335,21 +3658,6 @@ dependencies = [ "ttf-parser", ] -[[package]] -name = "ownedbytes" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fbd56f7631767e61784dc43f8580f403f4475bd4aaa4da003e6295e1bab4a7e" -dependencies = [ - "stable_deref_trait", -] - -[[package]] -name = "owo-colors" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" - [[package]] name = "p256" version = "0.13.2" @@ -4374,15 +3682,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "pack1" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b7bb0ecf2e447b1f20ee94ee79ef6eed1e9d4b3c36ce1903b9dea3bf205523" -dependencies = [ - "bytemuck", -] - [[package]] name = "parking" version = "2.2.1" @@ -4418,12 +3717,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "pastey" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" - [[package]] name = "pem" version = "3.0.6" @@ -4659,18 +3952,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "polyval" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" -dependencies = [ - "cfg-if", - "cpufeatures", - "opaque-debug", - "universal-hash", -] - [[package]] name = "portable-atomic" version = "1.13.1" @@ -4769,29 +4050,6 @@ dependencies = [ "unarray", ] -[[package]] -name = "prost" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-derive" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "pulldown-cmark" version = "0.13.4" @@ -4852,12 +4110,6 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - [[package]] name = "rand" version = "0.8.6" @@ -4917,15 +4169,6 @@ dependencies = [ "getrandom 0.3.4", ] -[[package]] -name = "rand_pcg" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59cad018caf63deb318e5a4586d99a24424a364f40f1e5778c29aca23f4fc73e" -dependencies = [ - "rand_core 0.6.4", -] - [[package]] name = "rand_xorshift" version = "0.4.0" @@ -4941,15 +4184,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca45419789ae5a7899559e9512e58ca889e41f04f1f2445e9f4b290ceccd1d08" -[[package]] -name = "rapidhash" -version = "4.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e48930979c155e2f33aa36ab3119b5ee81332beb6482199a8ecd6029b80b59" -dependencies = [ - "rustversion", -] - [[package]] name = "ratatui" version = "0.30.0" @@ -4974,14 +4208,14 @@ dependencies = [ "compact_str", "hashbrown 0.16.1", "indoc", - "itertools 0.14.0", + "itertools", "kasuari", "lru", "strum 0.27.2", "thiserror 2.0.18", "unicode-segmentation", "unicode-truncate", - "unicode-width 0.2.2", + "unicode-width", ] [[package]] @@ -5026,13 +4260,13 @@ dependencies = [ "hashbrown 0.16.1", "indoc", "instability", - "itertools 0.14.0", + "itertools", "line-clipping", "ratatui-core", "strum 0.27.2", "time", "unicode-segmentation", - "unicode-width 0.2.2", + "unicode-width", ] [[package]] @@ -5041,26 +4275,6 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" -[[package]] -name = "rayon" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - [[package]] name = "redox_syscall" version = "0.4.1" @@ -5179,51 +4393,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "roaring" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dedc5658c6ecb3bdb5ef5f3295bb9253f42dcf3fd1402c03f6b1f7659c3c4a9" -dependencies = [ - "bytemuck", - "byteorder", -] - -[[package]] -name = "ron" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4147b952f3f819eca0e99527022f7d6a8d05f111aeb0a62960c74eb283bec8fc" -dependencies = [ - "bitflags 2.12.1", - "once_cell", - "serde", - "serde_derive", - "typeid", - "unicode-ident", -] - -[[package]] -name = "rpassword" -version = "7.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da316a15f47e3d053de9cb2c439650bd8fa4aaeb9365f2e5f27f492ff73c196" -dependencies = [ - "libc", - "rtoolbox", - "windows-sys 0.61.2", -] - -[[package]] -name = "rprompt" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69abf524bb9ccb7c071f7231441288d74b48d176cb309eb00e6f77d186c6e035" -dependencies = [ - "rtoolbox", - "windows-sys 0.59.0", -] - [[package]] name = "rrule" version = "0.14.0" @@ -5267,16 +4436,6 @@ dependencies = [ "thiserror 2.0.18", ] -[[package]] -name = "rtoolbox" -version = "0.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50a0e551c1e27e1731aba276dbeaeac73f53c7cd34d1bda485d02bd1e0f36844" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - [[package]] name = "rusqlite" version = "0.40.0" @@ -5292,16 +4451,6 @@ dependencies = [ "sqlite-wasm-rs", ] -[[package]] -name = "rust-stemmers" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e46a2036019fdb888131db7a4c847a1063a7493f971ed94ea82c67eada63ca54" -dependencies = [ - "serde", - "serde_derive", -] - [[package]] name = "rustc-hash" version = "1.1.0" @@ -5323,16 +4472,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustc_version_runtime" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dd18cd2bae1820af0b6ad5e54f4a51d0f3fcc53b05f845675074efcc7af071d" -dependencies = [ - "rustc_version", - "semver", -] - [[package]] name = "rustix" version = "0.38.44" @@ -5466,25 +4605,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "secret-service" -version = "5.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a62d7f86047af0077255a29494136b9aaaf697c76ff70b8e49cded4e2623c14" -dependencies = [ - "aes", - "cbc", - "futures-util", - "generic-array", - "getrandom 0.2.17", - "hkdf", - "num", - "once_cell", - "serde", - "sha2", - "zbus", -] - [[package]] name = "security-framework" version = "3.7.0" @@ -5591,12 +4711,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha1_smol" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" - [[package]] name = "sha2" version = "0.10.9" @@ -5617,38 +4731,12 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - [[package]] name = "shlex" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" -[[package]] -name = "shuttle" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab17edba38d63047f46780cf7360acf7467fec2c048928689a5c1dd1c2b4e31" -dependencies = [ - "assoc", - "bitvec", - "cfg-if", - "generator", - "hex", - "owo-colors", - "rand 0.8.6", - "rand_core 0.6.4", - "rand_pcg", - "scoped-tls", - "smallvec", - "tracing", -] - [[package]] name = "signal-hook" version = "0.3.18" @@ -5724,30 +4812,12 @@ dependencies = [ "time", ] -[[package]] -name = "simsimd" -version = "6.5.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fb3bc3cdce07a7d7d4caa4c54f8aa967f6be41690482b54b24100a2253fa70" -dependencies = [ - "cc", -] - [[package]] name = "siphasher" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" -[[package]] -name = "sketches-ddsketch" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e40b6cf54d988dc1a2223531b969c9a9e30906ad90ef64890c27b4bfbb46ea" -dependencies = [ - "serde", -] - [[package]] name = "slab" version = "0.4.12" @@ -5860,12 +4930,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "softaes" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e14297decde697ddf377c25752aead0927d5cfc89c2684d2af96901a4ceeea" - [[package]] name = "spin" version = "0.9.8" @@ -5976,12 +5040,6 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" -[[package]] -name = "symlink" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" - [[package]] name = "syn" version = "1.0.109" @@ -6024,160 +5082,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "tantivy" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edde6a10743fff00a4e1a8c9ef020bf5f3cbad301b7d2d39f2b07f123c4eac07" -dependencies = [ - "aho-corasick", - "arc-swap", - "base64", - "bitpacking", - "bon", - "byteorder", - "census", - "crc32fast", - "crossbeam-channel", - "datasketches", - "downcast-rs 2.0.2", - "fastdivide", - "fnv", - "fs4", - "htmlescape", - "itertools 0.14.0", - "levenshtein_automata", - "log", - "lru", - "lz4_flex", - "measure_time", - "memmap2", - "once_cell", - "oneshot", - "rayon", - "regex", - "rust-stemmers", - "rustc-hash 2.1.2", - "serde", - "serde_json", - "sketches-ddsketch", - "smallvec", - "tantivy-bitpacker", - "tantivy-columnar", - "tantivy-common", - "tantivy-fst", - "tantivy-query-grammar", - "tantivy-stacker", - "tantivy-tokenizer-api", - "tempfile", - "thiserror 2.0.18", - "time", - "typetag", - "uuid", - "winapi", -] - -[[package]] -name = "tantivy-bitpacker" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fed3d674429bcd2de5d0a6d1aa5495fed8afd9c5ecce993019caf7615f53fa4" -dependencies = [ - "bitpacking", -] - -[[package]] -name = "tantivy-columnar" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c57166f5bcfd478f370ab8445afb4678dce44801fa5ce5c451aaf8595583c5dc" -dependencies = [ - "downcast-rs 2.0.2", - "fastdivide", - "itertools 0.14.0", - "serde", - "tantivy-bitpacker", - "tantivy-common", - "tantivy-sstable", - "tantivy-stacker", -] - -[[package]] -name = "tantivy-common" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbf10915aa75da3c3b0d58b58853d2e889efbaf32d4982a4c3715dde6bba23e5" -dependencies = [ - "async-trait", - "byteorder", - "ownedbytes", - "serde", - "time", -] - -[[package]] -name = "tantivy-fst" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d60769b80ad7953d8a7b2c70cdfe722bbcdcac6bccc8ac934c40c034d866fc18" -dependencies = [ - "byteorder", - "regex-syntax", - "utf8-ranges", -] - -[[package]] -name = "tantivy-query-grammar" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfadb8526b6da90704feb293b0701a6aae62ea14983143344be2dc5ce30f1d82" -dependencies = [ - "fnv", - "nom", - "ordered-float 5.3.0", - "serde", - "serde_json", -] - -[[package]] -name = "tantivy-sstable" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a2cfc3ac5164cbadc28965ffb145a8f47582a60ae5897859ad8d4316596c606" -dependencies = [ - "futures-util", - "itertools 0.14.0", - "tantivy-bitpacker", - "tantivy-common", - "tantivy-fst", - "zstd", -] - -[[package]] -name = "tantivy-stacker" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cbb051742da9d53ca9e8fff43a9b10e319338b24e2c0e15d0372df19ffeb951" -dependencies = [ - "murmurhash32", - "tantivy-common", -] - -[[package]] -name = "tantivy-tokenizer-api" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac258c2c6390673f2685813afeeafcb8c4e0ee7de8dd3fc46838dcc37263f98" -dependencies = [ - "serde", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "tempfile" version = "3.27.0" @@ -6242,7 +5146,7 @@ dependencies = [ "nix", "num-derive", "num-traits", - "ordered-float 4.6.0", + "ordered-float", "pest", "pest_derive", "phf 0.11.3", @@ -6508,19 +5412,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-appender" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "050686193eb999b4bb3bc2acfa891a13da00f79734704c4b8b4ef1a10b368a3c" -dependencies = [ - "crossbeam-channel", - "symlink", - "thiserror 2.0.18", - "time", - "tracing-subscriber", -] - [[package]] name = "tracing-attributes" version = "0.1.31" @@ -6583,201 +5474,6 @@ version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" -[[package]] -name = "turso" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "832bb70436d4b4d3ed45285c5c6abd62328d5e2486297b32cf2b0812abeba6d4" -dependencies = [ - "mimalloc", - "thiserror 2.0.18", - "tracing", - "tracing-subscriber", - "turso_core", - "turso_sdk_kit", - "turso_sync_sdk_kit", -] - -[[package]] -name = "turso_core" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba8ef95330369724a1829b20dc1b728d644eaeb051891971b5d2b5617337a84b" -dependencies = [ - "aegis", - "aes", - "aes-gcm", - "antithesis_sdk", - "arc-swap", - "bigdecimal", - "bitflags 2.12.1", - "branches", - "bumpalo", - "bytemuck", - "cfg_aliases", - "cfg_block", - "chrono", - "crc32c", - "crossbeam-skiplist", - "either", - "fallible-iterator", - "fastbloom", - "hex", - "intrusive-collections", - "io-uring", - "libc", - "libloading", - "libm", - "loom", - "miette", - "num-bigint", - "num-traits", - "pack1", - "parking_lot", - "pastey", - "polling", - "rand 0.9.4", - "rapidhash", - "regex", - "regex-syntax", - "roaring", - "rustc-hash 2.1.2", - "rustix 1.1.4", - "ryu", - "serde_json", - "shuttle", - "simsimd", - "smallvec", - "strum 0.26.3", - "strum_macros 0.26.4", - "tantivy", - "tempfile", - "thiserror 2.0.18", - "tracing", - "tracing-subscriber", - "turso_ext", - "turso_macros", - "turso_parser", - "twox-hash", - "uncased", - "uuid", - "windows-sys 0.61.2", -] - -[[package]] -name = "turso_ext" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a47927d766b9ae7e3adf092d5e150dce80533615edc502641797878f190080" -dependencies = [ - "chrono", - "getrandom 0.4.2", - "turso_macros", -] - -[[package]] -name = "turso_macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0cdc6ae079c61aa21a89b595a4d0e19d9d848a2658542252e82f930c57c3d87" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "turso_parser" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b94707e5605411cddbd5a1bd6cc2d6b72181b02223b36b37ba350ed6b71877" -dependencies = [ - "bitflags 2.12.1", - "memchr", - "miette", - "strum 0.26.3", - "strum_macros 0.26.4", - "thiserror 2.0.18", - "turso_macros", -] - -[[package]] -name = "turso_sdk_kit" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12a86ce113e5dcedeaad7809d9fa1dc00f837f40ccd8012ac1d2144c57672a34" -dependencies = [ - "bindgen", - "env_logger", - "parking_lot", - "tracing", - "tracing-appender", - "tracing-subscriber", - "turso_core", - "turso_sdk_kit_macros", -] - -[[package]] -name = "turso_sdk_kit_macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca6ee03a3dc5a48a7a63ddd2c8f41aa7bb5195eb96f6a29831447c8cb3d841a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "turso_sync_engine" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c58fe60f17b694f91bd278e93aceca10fb340950f6a8f1aedef11c28b50c4b8" -dependencies = [ - "base64", - "bytes", - "genawaiter", - "http", - "libc", - "prost", - "roaring", - "serde", - "serde_json", - "thiserror 2.0.18", - "tracing", - "turso_core", - "turso_parser", - "uuid", -] - -[[package]] -name = "turso_sync_sdk_kit" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4512c7b28bb3bc09be1ba480ee60234ed9bbeb6686c9348323589ffcec504b93" -dependencies = [ - "bindgen", - "env_logger", - "genawaiter", - "parking_lot", - "tracing", - "tracing-appender", - "tracing-subscriber", - "turso_core", - "turso_sdk_kit", - "turso_sdk_kit_macros", - "turso_sync_engine", -] - -[[package]] -name = "twox-hash" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" -dependencies = [ - "rand 0.9.4", -] - [[package]] name = "type-map" version = "0.5.1" @@ -6787,42 +5483,12 @@ dependencies = [ "rustc-hash 2.1.2", ] -[[package]] -name = "typeid" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" - [[package]] name = "typenum" version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" -[[package]] -name = "typetag" -version = "0.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5a897b12c6c1151ad0b138b8db50252dc301f93bc3b027db05eec82aeed298c" -dependencies = [ - "erased-serde", - "inventory", - "once_cell", - "serde", - "typetag-impl", -] - -[[package]] -name = "typetag-impl" -version = "0.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf808357c6ed7e13ba0f3277ec8d8f21b2d501274895104263985330c726c1c5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "ucd-trie" version = "0.1.7" @@ -6856,15 +5522,6 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" -[[package]] -name = "uncased" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" -dependencies = [ - "version_check", -] - [[package]] name = "unicase" version = "2.9.0" @@ -6889,17 +5546,11 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16b380a1238663e5f8a691f9039c73e1cdae598a30e9855f541d29b08b53e9a5" dependencies = [ - "itertools 0.14.0", + "itertools", "unicode-segmentation", - "unicode-width 0.2.2", + "unicode-width", ] -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - [[package]] name = "unicode-width" version = "0.2.2" @@ -6912,16 +5563,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common", - "subtle", -] - [[package]] name = "untrusted" version = "0.9.0" @@ -6972,12 +5613,6 @@ dependencies = [ "serde", ] -[[package]] -name = "utf8-ranges" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcfc827f90e53a02eaef5e535ee14266c1d569214c6aa70133a624d8a3164ba" - [[package]] name = "utf8-zero" version = "0.8.1" @@ -7006,7 +5641,6 @@ dependencies = [ "getrandom 0.4.2", "js-sys", "serde_core", - "sha1_smol", "wasm-bindgen", ] @@ -7185,7 +5819,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2857dd20b54e916ec7253b3d6b4d5c4d7d4ca2c33c2e11c6c76a99bd8744755d" dependencies = [ "cc", - "downcast-rs 1.2.1", + "downcast-rs", "rustix 1.1.4", "scoped-tls", "smallvec", @@ -7340,7 +5974,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fc95580916af1e68ff6a7be07446fc5db73ebf71cf092de939bbf5f7e189f72" dependencies = [ "core-foundation 0.10.1", - "jni 0.22.4", + "jni", "log", "ndk-context", "objc2 0.6.4", @@ -7406,7 +6040,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f2ab60e120fd6eaa68d9567f3226e876684639d22a4219b313ff69ec0ccd5ac" dependencies = [ "log", - "ordered-float 4.6.0", + "ordered-float", "strsim", "thiserror 1.0.69", "wezterm-dynamic-derive", @@ -7553,7 +6187,7 @@ dependencies = [ "naga", "ndk-sys 0.5.0+25.2.9519653", "objc", - "ordered-float 4.6.0", + "ordered-float", "parking_lot", "portable-atomic", "profiling", @@ -7583,18 +6217,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.44", -] - [[package]] name = "winapi" version = "0.3.9" @@ -7764,19 +6386,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-native-keyring-store" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063426e76fdec7438d56bb777f67e318a84a25c707b07e575cb8b78e10c028f8" -dependencies = [ - "byteorder", - "keyring-core", - "regex", - "windows-sys 0.61.2", - "zeroize", -] - [[package]] name = "windows-numerics" version = "0.2.0" @@ -7842,15 +6451,6 @@ dependencies = [ "windows-link 0.2.1", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.52.0" @@ -7887,21 +6487,6 @@ dependencies = [ "windows-link 0.2.1", ] -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -7944,12 +6529,6 @@ dependencies = [ "windows-link 0.1.3", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -7962,12 +6541,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -7980,12 +6553,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -8010,12 +6577,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -8028,12 +6589,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -8046,12 +6601,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -8064,12 +6613,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -8243,15 +6786,6 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - [[package]] name = "x11-dl" version = "2.21.0" @@ -8415,17 +6949,6 @@ dependencies = [ "zvariant", ] -[[package]] -name = "zbus-secret-service-keyring-store" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ccede190ba363386a24e8021c7f3848393976609ec9f5d1f8c6c09ef37075b4" -dependencies = [ - "keyring-core", - "secret-service", - "zbus", -] - [[package]] name = "zbus_macros" version = "5.16.0" @@ -8564,34 +7087,6 @@ version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] - [[package]] name = "zune-core" version = "0.5.1" diff --git a/Cargo.toml b/Cargo.toml index ba6bb07..7d34a27 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,8 +41,19 @@ clap = { version = "4", features = ["derive"] } ratatui = "0.30" axum = "0.8" jsonwebtoken = { version = "10", features = ["rust_crypto"] } -keyring = { version = "4" } +# keyring 4's `keyring` meta-crate compiles *every* platform credential backend +# for the target (on Linux: the zbus + libdbus secret-service stacks, keyutils, +# and a sqlite/zstd db-keystore — ~290 crates). We use exactly one backend per +# platform, so depend on keyring-core (the API) + a single store crate per OS. keyring-core = "1" +apple-native-keyring-store = { version = "1", features = ["keychain"] } +# vendored: build libdbus from bundled source so the build needs no system +# libdbus-1-dev (the CI rust:1-bookworm image has none). crypto-rust: pure-Rust +# session crypto, no OpenSSL. +dbus-secret-service-keyring-store = { version = "1", features = [ + "crypto-rust", + "vendored", +] } ureq = { version = "3", features = ["json"] } reqwest = { version = "0.13", default-features = false, features = [ "json", diff --git a/crates/heph-core/src/sqlite/mod.rs b/crates/heph-core/src/sqlite/mod.rs index 2a11ef1..ebd01af 100644 --- a/crates/heph-core/src/sqlite/mod.rs +++ b/crates/heph-core/src/sqlite/mod.rs @@ -423,7 +423,7 @@ impl Store for LocalStore { syncstate::record(&self.conn, peer, pushed, pulled, now) } - fn authorize_owner_sub(&mut self, sub: &str) -> Result { + fn resolve_owner(&mut self, sub: &str) -> Result> { // The owner's bound identity (NULL until first authenticated sync). let current: Option = self .conn @@ -436,13 +436,15 @@ impl Store for LocalStore { .flatten(); match current { None => { + // Claim-on-first: bind this sub to the store's owner. self.conn.execute( "UPDATE users SET oidc_sub = ?1 WHERE id = ?2", (sub, &self.owner_id), )?; - Ok(true) + Ok(Some(self.owner_id.clone())) } - Some(existing) => Ok(existing == sub), + Some(existing) if existing == sub => Ok(Some(self.owner_id.clone())), + Some(_) => Ok(None), } } diff --git a/crates/heph-core/src/store.rs b/crates/heph-core/src/store.rs index cb0475d..3fd8275 100644 --- a/crates/heph-core/src/store.rs +++ b/crates/heph-core/src/store.rs @@ -216,12 +216,18 @@ pub trait Store { fn record_sync(&mut self, peer: &str, pushed: Option<&str>, pulled: Option<&str>) -> Result<()>; - /// Single-tenant authentication gate (tech-spec §13). Map an OIDC `sub` to - /// this store's owner: on first sight, **claim** the owner by binding its - /// `oidc_sub`; thereafter authorize only that same `sub`. Returns `true` if - /// the `sub` owns this store, `false` if a different identity presented a - /// token. A hub calls this before serving any op exchange. - fn authorize_owner_sub(&mut self, sub: &str) -> Result; + /// Resolve an OIDC `sub` to the `owner_id` it may act as on this store — + /// the **multi-tenancy seam** (tech-spec §13). On first sight, **claim** the + /// store's owner by binding its `oidc_sub`; thereafter resolve only that + /// same `sub`. Returns `Some(owner_id)` when the `sub` owns data here, or + /// `None` when a different identity presented a token (the hub then 403s). + /// + /// Today a store hosts exactly one owner, so this resolves to that single + /// owner or `None`. Multi-tenancy (serving N owners from one hub) extends + /// this to a real `sub → owner_id` mapping with per-`sub` provisioning, and + /// the hub scopes each request to the resolved owner — without changing this + /// contract. A hub calls this before serving any op exchange. + fn resolve_owner(&mut self, sub: &str) -> Result>; /// Open merge conflicts surfaced for the user (`heph conflicts`). fn conflicts_list(&self) -> Result>; diff --git a/crates/heph-core/tests/convergence.rs b/crates/heph-core/tests/convergence.rs index ea5d8fb..9f9608e 100644 --- a/crates/heph-core/tests/convergence.rs +++ b/crates/heph-core/tests/convergence.rs @@ -75,18 +75,26 @@ fn sync_cursors_default_empty_then_advance_per_direction() { } #[test] -fn owner_sub_gate_claims_first_then_requires_match() { - // Single-tenant gate (§13): the first sub claims the owner; only that sub - // is authorized thereafter. +fn resolve_owner_claims_first_then_requires_match() { + // The hub resolves an OIDC `sub` to its owner id (§13) — the multi-tenancy + // seam. The first sub claims the (single, for now) owner; only that sub + // resolves thereafter, and always to the same owner id. let (mut a, _ca) = replica(1000); - assert!(a.authorize_owner_sub("sub-alice").unwrap(), "first claims"); - assert!(a.authorize_owner_sub("sub-alice").unwrap(), "same sub ok"); + let owner = a.resolve_owner("sub-alice").unwrap().expect("first claims"); + assert_eq!( + a.resolve_owner("sub-alice").unwrap().as_deref(), + Some(owner.as_str()), + "same sub resolves to the same owner" + ); assert!( - !a.authorize_owner_sub("sub-mallory").unwrap(), - "a different identity must be rejected" + a.resolve_owner("sub-mallory").unwrap().is_none(), + "a different identity does not resolve (the hub then 403s)" ); // Still bound to the original after a rejection. - assert!(a.authorize_owner_sub("sub-alice").unwrap()); + assert_eq!( + a.resolve_owner("sub-alice").unwrap().as_deref(), + Some(owner.as_str()) + ); } #[test] diff --git a/crates/hephd/Cargo.toml b/crates/hephd/Cargo.toml index 8ae4934..9bb7b9e 100644 --- a/crates/hephd/Cargo.toml +++ b/crates/hephd/Cargo.toml @@ -29,11 +29,18 @@ tracing-subscriber.workspace = true clap.workspace = true axum.workspace = true jsonwebtoken.workspace = true -keyring.workspace = true keyring-core.workspace = true reqwest.workspace = true ureq.workspace = true +# The OS credential backend that `oauth.rs` registers as the keyring-core +# default store — exactly one per platform, not the whole keyring meta-crate. +[target.'cfg(target_os = "macos")'.dependencies] +apple-native-keyring-store.workspace = true + +[target.'cfg(target_os = "linux")'.dependencies] +dbus-secret-service-keyring-store.workspace = true + [dev-dependencies] tempfile = "3" # Auth tests generate a throwaway RSA key + JWKS at runtime (no key in the repo). diff --git a/crates/hephd/src/oauth.rs b/crates/hephd/src/oauth.rs index 136b8a6..53ee5f0 100644 --- a/crates/hephd/src/oauth.rs +++ b/crates/hephd/src/oauth.rs @@ -89,16 +89,24 @@ impl KeyringTokenStore { } fn entry(&self) -> Result { - // keyring 4 splits the cross-platform `Entry`/`Error` types into - // `keyring_core` and requires a credential store to be registered - // before any entry is built. Register the OS-native store once, - // lazily, on first use (idempotent across both surfaces). + // keyring-core holds the cross-platform `Entry`/`Error` types but no + // backend — a credential store must be registered before any entry is + // built. Register the OS-native store once, lazily, on first use + // (idempotent across both surfaces). We register a single backend per + // platform (macOS Keychain / Linux Secret Service) rather than pulling + // the `keyring` meta-crate, which compiles every backend at once. static NATIVE_STORE: std::sync::Once = std::sync::Once::new(); NATIVE_STORE.call_once(|| { - // `not_keyutils = true`: on Linux prefer the Secret Service over - // the kernel keyutils store, which is wiped on logout/reboot and - // would silently drop a persisted login token. - let _ = keyring::use_native_store(true); + #[cfg(target_os = "macos")] + if let Ok(store) = apple_native_keyring_store::keychain::Store::new() { + keyring_core::set_default_store(store); + } + // The D-Bus Secret Service (not the kernel keyutils store, which is + // wiped on logout/reboot and would silently drop a persisted token). + #[cfg(target_os = "linux")] + if let Ok(store) = dbus_secret_service_keyring_store::Store::new() { + keyring_core::set_default_store(store); + } }); keyring_core::Entry::new(&self.service, &self.account) .map_err(|e| AuthError::Provider(e.to_string())) diff --git a/crates/hephd/src/remote.rs b/crates/hephd/src/remote.rs index 9f405a8..c486055 100644 --- a/crates/hephd/src/remote.rs +++ b/crates/hephd/src/remote.rs @@ -315,10 +315,10 @@ impl Store for RemoteStore { Ok(()) } - fn authorize_owner_sub(&mut self, _sub: &str) -> Result { - // Hub-side gate; a no-replica client never hosts an endpoint to guard. + fn resolve_owner(&mut self, _sub: &str) -> Result> { + // Hub-side seam; a no-replica client never hosts an endpoint to guard. Err(Error::Remote( - "authorize_owner_sub is a hub-side operation".into(), + "resolve_owner is a hub-side operation".into(), )) } diff --git a/crates/hephd/src/sync.rs b/crates/hephd/src/sync.rs index 4080907..266cae1 100644 --- a/crates/hephd/src/sync.rs +++ b/crates/hephd/src/sync.rs @@ -136,20 +136,23 @@ async fn require_auth( _ => StatusCode::UNAUTHORIZED, })?; - // Single-tenant gate: the token's identity must own this hub. + // Multi-tenancy seam: resolve the token's identity to the owner it may act + // as. Today the hub serves one owner, so this is `Some(that owner)` or + // `None` (→ 403). When the hub becomes multi-owner, `_owner_id` is what each + // downstream handler scopes its ops to (rather than the store's lone owner). let store = state.store.clone(); - let owns = tokio::task::spawn_blocking(move || { + let owner = tokio::task::spawn_blocking(move || { store .lock() .expect("store mutex poisoned") - .authorize_owner_sub(&claims.sub) + .resolve_owner(&claims.sub) }) .await .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)? .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; - if !owns { + let Some(_owner_id) = owner else { return Err(StatusCode::FORBIDDEN); - } + }; Ok(next.run(request).await) } diff --git a/docs/changelog.d/+keyring-slim.infra.md b/docs/changelog.d/+keyring-slim.infra.md new file mode 100644 index 0000000..49aabd1 --- /dev/null +++ b/docs/changelog.d/+keyring-slim.infra.md @@ -0,0 +1 @@ +Slimmed the credential-keyring dependency to cut CI compile time. keyring 4's `keyring` meta-crate compiles *every* platform backend for the target — on Linux that pulled the zbus async stack, a redundant libdbus secret-service, the kernel keyutils store, a SQLite/zstd `db-keystore`, and OpenSSL (~290 crates in its subtree). Replaced it with `keyring-core` (the API) plus a single store per OS — macOS Keychain (`apple-native-keyring-store`), Linux Secret Service (`dbus-secret-service-keyring-store`, pure-Rust crypto, vendored libdbus so the build needs no system `libdbus-1-dev`) — registered directly in `oauth.rs`. hephd's Linux dependency graph drops from **401 to 235 crates** (−166), removing the zbus stack and two C builds. Runtime behavior is unchanged. diff --git a/docs/changelog.d/v1-hub-prep.doc.md b/docs/changelog.d/v1-hub-prep.doc.md new file mode 100644 index 0000000..08c92f0 --- /dev/null +++ b/docs/changelog.d/v1-hub-prep.doc.md @@ -0,0 +1 @@ +New how-to: [[set-up-sync-hub]] — stand up the canonical hub and connect an existing local device as an offline-capable spoke, the data-safe way (the hub adopts the device's identity rather than rewriting the device). diff --git a/docs/changelog.d/v1-hub-prep.infra.md b/docs/changelog.d/v1-hub-prep.infra.md new file mode 100644 index 0000000..e2a9ad4 --- /dev/null +++ b/docs/changelog.d/v1-hub-prep.infra.md @@ -0,0 +1 @@ +Hub auth now **resolves an OIDC `sub` to an `owner_id`** (`Store::resolve_owner → Option`) instead of a single-tenant boolean gate (`authorize_owner_sub → bool`). Behavior is unchanged for the single-owner hub (claim-on-first; a stranger's token still 403s), but the contract no longer assumes one global owner — this is the multi-tenancy seam, so serving N owners later is additive rather than a rewrite. See the `Adoption + multi-tenant` task's context for the full decision. diff --git a/docs/how-to/how-to.md b/docs/how-to/how-to.md index 265cd37..9a3a758 100644 --- a/docs/how-to/how-to.md +++ b/docs/how-to/how-to.md @@ -18,4 +18,5 @@ Task-oriented guides for common operations. - [[install-heph]] — Install `heph`/`hephd` from the forge, set up the Neovim plugin, and isolate in-repo development - [[run-the-daemon]] — Run `hephd` as an OS service with `heph daemon start/stop/restart/status` +- [[set-up-sync-hub]] — Stand up the canonical hub (indri) and connect an existing device as an offline-capable spoke - [[import-todoist]] — Seed a heph store from your Todoist projects + tasks (`mise run import-todoist`) diff --git a/docs/how-to/set-up-sync-hub.md b/docs/how-to/set-up-sync-hub.md new file mode 100644 index 0000000..a0f7706 --- /dev/null +++ b/docs/how-to/set-up-sync-hub.md @@ -0,0 +1,125 @@ +--- +title: Set up a sync hub (and connect a device) +modified: 2026-06-04 +tags: + - how-to +--- + +# Set up a sync hub (and connect a device) + +How to stand up the canonical **hub** (on `indri`, in blumeops) and connect an +existing **local** device (e.g. `gilbert`) to it as an offline-capable spoke, +**without migrating or risking the device's data**. + +## The model + +heph is **hub-and-spoke**, not a peer mesh ([[design]] §4, [[v1-prototype-tech-spec]] §3/§12/§13): + +- **Hub** — `hephd --mode server`: a full replica that also exposes an HTTP + endpoint others sync against. One canonical hub (`indri`). +- **Spoke** — `hephd --mode local --hub-url `: its own full SQLite replica, + **fully usable offline**, with an append-only op-log; it background-syncs + (pull → merge → push) when the hub is reachable. Every device is a spoke. + +Surfaces (CLI / TUI / nvim) only ever talk to the **local** daemon over the unix +socket; that daemon handles the hub conversation in the background. + +**Transport vs. identity.** Tailscale gives the devices a secure private network +(reachability + encryption). **Authentik** sits on top as the authorization +layer: the hub requires a valid OIDC bearer token on every op exchange, so +merely being on the tailnet is not enough — this is the owner's most sensitive +data. + +## The data-safety principle: the hub adopts the device, not the reverse + +A device's `owner_id` is embedded in some node ids (journals, tags), the op-log, +and link rows. Rewriting it in place is the risky operation we **avoid**. Instead +(**"Path A"**): the hub takes on the *existing device's* identity — same +`owner_id` and data — so the device is **never rewritten**. `gilbert`'s store is +untouched; `indri` is brought up as a copy of it and the two sync forward. + +> A device that is set up **after** the hub exists skips all of this: configure +> it with the hub + Authentik from first launch ("born authed"), before it +> creates data, and it simply joins. + +## 1. Authentik: register the heph application + +Create an OIDC/OAuth2 application + provider in Authentik for heph, configured +for the **device-code (RFC 8628) flow**. Note the values the daemon and devices +need: + +- **Issuer** — e.g. `https://authentik.ops.eblu.me/application/o/heph/` +- **Client id** — the device-code client id (this is also the token *audience*). + +## 2. Bring up the hub on `indri` + +**Seed it from `gilbert` (Path A).** Quiesce `gilbert` (`heph daemon stop`), +copy its store to `indri`, and give `indri` its **own device origin** so the two +replicas don't share one (see *Current gaps* — this seeding step is the bit the +blumeops deployment finalizes). `indri` now holds `gilbert`'s data under the same +`owner_id`. + +Run the hub with auth enabled (issuer **and** audience together turn auth on; +omit both only for local dev): + +```bash +hephd --mode server \ + --http-addr 0.0.0.0:8787 \ + --db /var/lib/heph/heph.db \ + --oidc-issuer https://authentik.ops.eblu.me/application/o/heph/ \ + --oidc-audience +``` + +The first identity to authenticate **claims** the hub's owner; thereafter only +that identity is served (single-owner today — see [[design]] and the +`Adoption + multi-tenant` task for the multi-tenancy seam). + +## 3. Point `gilbert` at the hub (spoke) + +Run `gilbert`'s daemon in local mode with the hub url + its OIDC client id, then +log in once (the device-code flow caches a bearer token in the OS keyring): + +```bash +hephd --mode local \ + --hub-url http://indri..ts.net:8787 \ + --oidc-issuer https://authentik.ops.eblu.me/application/o/heph/ \ + --oidc-client-id + +# one-time browser login on this device: +heph auth login \ + --hub-url http://indri..ts.net:8787 \ + --issuer https://authentik.ops.eblu.me/application/o/heph/ \ + --client-id +``` + +The spoke now attaches the (auto-refreshing) bearer token to every hub request +and background-syncs on its interval. + +## 4. Verify + +```bash +heph sync --status # last push/pull cursors, hub url +heph sync # force a cycle now +``` + +Make a change on `gilbert`, force a sync, and confirm it appears via the hub. + +## Current gaps (finalized by the blumeops deployment) + +The flag-level flow above works today; two enablers make it a clean, managed +deployment rather than a hand-run process — tracked in the `Hephaestus` project: + +- **`heph daemon` only generates a `--mode local` service** (no `--hub-url` / + `--oidc-*`). So for now the hub and the spoke config are expressed as `hephd` + flags (run directly, or via the blumeops-managed systemd unit), not via + `heph daemon start`. +- **Path A seeding is manual** (copy the store + reset the device origin). A + small enabler — seed a hub from a snapshot with a fresh origin, or + `hephd --owner-id` — would make this one step. + +## Related + +- [[run-the-daemon]] — manage the local daemon as an OS service +- [[install-heph]] — install `heph`/`hephd` and the plugin +- [[design]] — §4 the connect-only, hub-and-spoke model +- [[v1-prototype-tech-spec]] — §3 runtime modes, §12 sync, §13 auth