diff --git a/Cargo.lock b/Cargo.lock index d8e1c6b..4d6cb88 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -115,6 +115,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" version = "0.4.44" @@ -145,16 +151,6 @@ dependencies = [ "libc", ] -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -294,12 +290,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" -[[package]] -name = "fastrand" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a043dc74da1e37d6afe657061213aa6f425f855399a11d3463c6ecccc4dfda1f" - [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -318,21 +308,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.2.2" @@ -446,8 +421,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", ] [[package]] @@ -458,7 +449,7 @@ checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 6.0.0", "wasip2", "wasip3", ] @@ -482,25 +473,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "h2" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.4.0", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "hashbrown" version = "0.14.5" @@ -623,7 +595,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.27", + "h2", "http 0.2.12", "http-body 0.4.6", "httparse", @@ -647,7 +619,6 @@ dependencies = [ "bytes", "futures-channel", "futures-core", - "h2 0.4.13", "http 1.4.0", "http-body 1.0.1", "httparse", @@ -658,6 +629,20 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.32", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", +] + [[package]] name = "hyper-rustls" version = "0.27.7" @@ -667,40 +652,12 @@ dependencies = [ "http 1.4.0", "hyper 1.9.0", "hyper-util", - "rustls", + "rustls 0.23.37", "rustls-pki-types", "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.32", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper 1.9.0", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", + "tokio-rustls 0.26.4", "tower-service", + "webpki-roots 1.0.6", ] [[package]] @@ -721,11 +678,9 @@ dependencies = [ "percent-encoding", "pin-project-lite", "socket2 0.6.3", - "system-configuration 0.7.0", "tokio", "tower-service", "tracing", - "windows-registry", ] [[package]] @@ -951,12 +906,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - [[package]] name = "litemap" version = "0.8.2" @@ -978,6 +927,12 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "matchers" version = "0.2.0" @@ -1020,23 +975,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "native-tls" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "never" version = "0.1.0" @@ -1090,50 +1028,6 @@ version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" -[[package]] -name = "openssl" -version = "0.10.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "951c002c75e16ea2c65b8c7e4d3d51d5530d8dfa7d060b4776828c88cfb18ecf" -dependencies = [ - "bitflags 2.11.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "openssl-probe" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" - -[[package]] -name = "openssl-sys" -version = "0.9.112" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d55af3b3e226502be1526dfdba67ab0e9c96fc293004e79576b2b9edb0dbdb" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "parking_lot" version = "0.12.5" @@ -1180,7 +1074,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared", - "rand", + "rand 0.8.5", ] [[package]] @@ -1246,6 +1140,15 @@ dependencies = [ "zerovec", ] +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + [[package]] name = "prettyplease" version = "0.2.37" @@ -1308,6 +1211,61 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.37", + "socket2 0.5.10", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls 0.23.37", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.5.10", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "quote" version = "1.0.45" @@ -1317,6 +1275,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "r-efi" version = "6.0.0" @@ -1329,7 +1293,27 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", ] [[package]] @@ -1338,6 +1322,15 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + [[package]] name = "rc-box" version = "1.3.0" @@ -1384,28 +1377,28 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.3.27", + "h2", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.32", - "hyper-tls 0.5.0", + "hyper-rustls 0.24.2", "ipnet", "js-sys", "log", "mime", "mime_guess", - "native-tls", "once_cell", "percent-encoding", "pin-project-lite", + "rustls 0.21.12", "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 0.1.2", - "system-configuration 0.5.1", + "system-configuration", "tokio", - "tokio-native-tls", + "tokio-rustls 0.24.1", "tokio-util", "tower-service", "url", @@ -1413,6 +1406,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", + "webpki-roots 0.25.4", "winreg", ] @@ -1424,31 +1418,28 @@ checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ "base64 0.22.1", "bytes", - "encoding_rs", "futures-core", "futures-util", - "h2 0.4.13", "http 1.4.0", "http-body 1.0.1", "http-body-util", "hyper 1.9.0", - "hyper-rustls", - "hyper-tls 0.6.0", + "hyper-rustls 0.27.7", "hyper-util", "js-sys", "log", - "mime", "mime_guess", - "native-tls", "percent-encoding", "pin-project-lite", + "quinn", + "rustls 0.23.37", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.2", "tokio", - "tokio-native-tls", + "tokio-rustls 0.26.4", "tower", "tower-http", "tower-service", @@ -1456,6 +1447,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "webpki-roots 1.0.6", ] [[package]] @@ -1486,6 +1478,12 @@ dependencies = [ "smallvec", ] +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustc_version" version = "0.4.1" @@ -1496,16 +1494,15 @@ dependencies = [ ] [[package]] -name = "rustix" -version = "1.1.4" +name = "rustls" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ - "bitflags 2.11.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", + "log", + "ring", + "rustls-webpki 0.101.7", + "sct", ] [[package]] @@ -1515,8 +1512,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" dependencies = [ "once_cell", + "ring", "rustls-pki-types", - "rustls-webpki", + "rustls-webpki 0.103.10", "subtle", "zeroize", ] @@ -1536,9 +1534,20 @@ version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" dependencies = [ + "web-time", "zeroize", ] +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "rustls-webpki" version = "0.103.10" @@ -1562,15 +1571,6 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" -[[package]] -name = "schannel" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "scopeguard" version = "1.2.0" @@ -1578,26 +1578,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "security-framework" -version = "3.7.0" +name = "sct" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.10.1", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" -dependencies = [ - "core-foundation-sys", - "libc", + "ring", + "untrusted", ] [[package]] @@ -1828,19 +1815,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.4", - "system-configuration-sys 0.5.0", -] - -[[package]] -name = "system-configuration" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" -dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.9.4", - "system-configuration-sys 0.6.0", + "core-foundation", + "system-configuration-sys", ] [[package]] @@ -1853,16 +1829,6 @@ dependencies = [ "libc", ] -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "take_mut" version = "0.2.2" @@ -1894,7 +1860,7 @@ dependencies = [ "serde_with_macros", "teloxide-core", "teloxide-macros", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-util", @@ -1925,7 +1891,7 @@ dependencies = [ "serde_with_macros", "take_mut", "takecell", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-util", "url", @@ -1944,26 +1910,22 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "tempfile" -version = "3.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" -dependencies = [ - "fastrand", - "getrandom 0.4.2", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - [[package]] name = "thiserror" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", ] [[package]] @@ -1977,6 +1939,17 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "thread_local" version = "1.1.9" @@ -1996,6 +1969,21 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.51.0" @@ -2025,12 +2013,12 @@ dependencies = [ ] [[package]] -name = "tokio-native-tls" -version = "0.3.1" +name = "tokio-rustls" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "native-tls", + "rustls 0.21.12", "tokio", ] @@ -2040,7 +2028,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls", + "rustls 0.23.37", "tokio", ] @@ -2410,6 +2398,31 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "webpki-roots" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "windows-core" version = "0.62.2" @@ -2451,17 +2464,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" -dependencies = [ - "windows-link", - "windows-result", - "windows-strings", -] - [[package]] name = "windows-result" version = "0.4.1" diff --git a/Cargo.toml b/Cargo.toml index 04de24a..df9884d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,9 +14,9 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" serde_yaml = "0.9" pulldown-cmark = "0.12" -reqwest = { version = "0.12", features = ["json", "multipart"] } +reqwest = { version = "0.12", default-features = false, features = ["json", "multipart", "rustls-tls"] } rusqlite = { version = "0.32", features = ["bundled"] } -teloxide = { version = "0.12", features = ["macros"] } +teloxide = { version = "0.12", default-features = false, features = ["macros", "rustls", "ctrlc_handler"] } tokio = { version = "1", features = ["full"] } uuid = { version = "1", features = ["v5"] } tracing = "0.1" diff --git a/Makefile b/Makefile index 6958a19..bd723bd 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,33 @@ REPO := $(shell pwd) HERA := heradev HERA_DIR := noc +IMAGE := noc-suite -.PHONY: build test deploy deploy-hera +.PHONY: build build-musl test deploy deploy-hera docker build: cargo build --release +build-musl: + cargo build --release --target x86_64-unknown-linux-musl + strip target/x86_64-unknown-linux-musl/release/noc + test: cargo clippy -- -D warnings cargo test -- --nocapture +# ── docker ────────────────────────────────────────────────────────── + +docker: build-musl + cp target/x86_64-unknown-linux-musl/release/noc deploy/noc + cp -r tools deploy/tools + cp config.example.yaml deploy/config.example.yaml + sudo docker build -t $(IMAGE) deploy/ + rm -f deploy/noc deploy/config.example.yaml + rm -rf deploy/tools + +# ── systemd deploy ────────────────────────────────────────────────── + noc.service: noc.service.in sed -e 's|@REPO@|$(REPO)|g' -e 's|@PATH@|$(PATH)|g' $< > $@ diff --git a/deploy/Dockerfile b/deploy/Dockerfile new file mode 100644 index 0000000..e4a74aa --- /dev/null +++ b/deploy/Dockerfile @@ -0,0 +1,35 @@ +FROM debian:bookworm-slim + +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates git curl sqlite3 jq \ + && rm -rf /var/lib/apt/lists/* + +# install gitea +ARG GITEA_VERSION=1.23.7 +RUN curl -fSL "https://dl.gitea.com/gitea/${GITEA_VERSION}/gitea-${GITEA_VERSION}-linux-amd64" \ + -o /usr/local/bin/gitea \ + && chmod +x /usr/local/bin/gitea + +# noc binary (pre-built musl static binary) +COPY noc /usr/local/bin/noc +RUN chmod +x /usr/local/bin/noc + +COPY tools/ /opt/noc/tools/ +COPY config.example.yaml /opt/noc/config.example.yaml +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +RUN useradd -m -s /bin/bash noc \ + && mkdir -p /data/gitea /data/noc \ + && chown -R noc:noc /data /opt/noc +VOLUME ["/data"] +USER noc + +ENV RUST_LOG=noc=info \ + NOC_CONFIG=/data/noc/config.yaml \ + NOC_STATE=/data/noc/state.json \ + GITEA_WORK_DIR=/data/gitea + +EXPOSE 3000 + +ENTRYPOINT ["/entrypoint.sh"] diff --git a/deploy/entrypoint.sh b/deploy/entrypoint.sh new file mode 100644 index 0000000..1ac6812 --- /dev/null +++ b/deploy/entrypoint.sh @@ -0,0 +1,90 @@ +#!/bin/bash +set -euo pipefail + +GITEA_DATA="/data/gitea" +NOC_DATA="/data/noc" +GITEA_DB="$GITEA_DATA/gitea.db" +GITEA_INI="$GITEA_DATA/app.ini" +GITEA_TOKEN_FILE="$NOC_DATA/gitea-token" + +GITEA_ADMIN_USER="${GITEA_ADMIN_USER:-noc}" +GITEA_ADMIN_PASS="${GITEA_ADMIN_PASS:-noc-admin-changeme}" +GITEA_ADMIN_EMAIL="${GITEA_ADMIN_EMAIL:-noc@localhost}" +GITEA_HTTP_PORT="${GITEA_HTTP_PORT:-3000}" + +mkdir -p "$GITEA_DATA" "$NOC_DATA" + +# ── gitea config ──────────────────────────────────────────────────── +if [ ! -f "$GITEA_INI" ]; then + cat > "$GITEA_INI" < /dev/null 2>&1; then + echo "[suite] gitea ready" + break + fi + if [ "$i" -eq 30 ]; then + echo "[suite] ERROR: gitea failed to start" + exit 1 + fi + sleep 1 +done + +# ── create admin user + token ────────────────────────────────────── +if ! gitea admin user list --config "$GITEA_INI" 2>/dev/null | grep -q "$GITEA_ADMIN_USER"; then + gitea admin user create \ + --config "$GITEA_INI" \ + --username "$GITEA_ADMIN_USER" \ + --password "$GITEA_ADMIN_PASS" \ + --email "$GITEA_ADMIN_EMAIL" \ + --admin + echo "[suite] created admin user: $GITEA_ADMIN_USER" +fi + +if [ ! -f "$GITEA_TOKEN_FILE" ]; then + TOKEN=$(curl -sf -X POST \ + "http://localhost:${GITEA_HTTP_PORT}/api/v1/users/${GITEA_ADMIN_USER}/tokens" \ + -u "${GITEA_ADMIN_USER}:${GITEA_ADMIN_PASS}" \ + -H "Content-Type: application/json" \ + -d "{\"name\":\"noc-suite\",\"scopes\":[\"all\"]}" \ + | jq -r '.sha1') + echo "$TOKEN" > "$GITEA_TOKEN_FILE" + echo "[suite] admin token saved to $GITEA_TOKEN_FILE" +fi + +# ── copy default noc config if missing ───────────────────────────── +if [ ! -f "$NOC_DATA/config.yaml" ]; then + cp /opt/noc/config.example.yaml "$NOC_DATA/config.yaml" + echo "[suite] copied default config to $NOC_DATA/config.yaml — edit before use" +fi + +# ── start noc ────────────────────────────────────────────────────── +echo "[suite] starting noc..." +exec noc diff --git a/doc/suite.md b/doc/suite.md new file mode 100644 index 0000000..14d01f7 --- /dev/null +++ b/doc/suite.md @@ -0,0 +1,135 @@ +# Suite — 人与 AI 的协作套件 + +## 一句话 + +同一个 AI 内核,多种协作界面,覆盖人与 AI 互动的全部场景。 + +## 四种界面 + +``` +┌─────────────────────────────────────────────────────┐ +│ AI Core │ +│ persona · inner_state · memory · tools · context │ +└──────┬──────────┬──────────┬──────────┬──────────────┘ + │ │ │ │ + ┌───▼───┐ ┌───▼───┐ ┌───▼───┐ ┌───▼───┐ + │ Chat │ │ Gitea │ │Worker │ │ Self │ + │ │ │ Bot │ │ │ │ │ + └───────┘ └───────┘ └───────┘ └───────┘ +``` + +### Chat — 对话 + +实时聊天,最直接的人机沟通。 + +- 触发:用户发消息 +- 输出:流式文字回复、文件、语音 +- 前端:Telegram、飞书、未来更多 +- 已有:当前 suite 的主体 + +### Gitea Bot — 代码协作 + +AI 作为团队成员出现在代码流程中。 + +- 触发:webhook(push、PR、issue、comment) +- 输出:PR review comment、issue 回复、CI 状态通知 +- 上下文:git diff、commit history、issue 内容 +- 场景: + - PR 提交后自动 review + - issue 里 @bot 触发分析或执行 + - CI 失败后主动分析原因并评论 + - 代码变更后自动更新相关 issue 状态 + +### Worker — 后台任务 + +AI 在后台安静地干活,做完了才来找你。 + +- 触发:定时(cron)、事件(文件变化、监控告警)、Chat/Gitea 中委派 +- 输出:执行结果推送到 Chat 或 Gitea +- 场景: + - 定时巡检服务健康状态 + - 监控日志异常,发现问题主动通知 + - 跑长任务(数据分析、批量操作),完成后汇报 + - Chat 里说"帮我查一下 X",转为后台任务异步执行 +- 已有:SubAgent(雏形) + +### Self — AI 自身 + +不被触发,AI 按自己的节奏存在。 + +- 触发:内部驱动(life loop、反思周期) +- 输出:可能发消息,也可能只是更新内心状态 +- 场景: + - 早上主动问好,晚上道晚安 + - 感知用户状态(很久没聊、最近很累),决定是否主动关心 + - 定期整理记忆、反思最近的互动 + - 主动沉默也是一种行为 +- 已有:life loop + reflect + inner_state + +## 共享内核 + +四种界面共享同一个 AI Core: + +| 组件 | 说明 | +|------|------| +| Persona | 定义 AI 是谁 | +| Inner State | AI 对当前情况的感知,LLM 自更新 | +| Memory | 跨会话的持久记忆 | +| Context | 对话历史、summary、scratch | +| Tools | 统一的工具注册表,各界面按需可见 | + +所有界面的交互最终都流经同一个 LLM 调用路径,共享 persona 和 inner_state——无论 AI 是在回复聊天、review 代码还是自言自语,它都是同一个"人"。 + +## 界面之间的联动 + +界面不是孤立的,它们之间会互相触发: + +``` +Chat ──"帮我 review 那个 PR"──→ Gitea Bot +Gitea Bot ──"CI 挂了,要不要我看看"──→ Chat +Worker ──任务完成──→ Chat / Gitea Bot +Self ──"Fam 今天还没动过代码"──→ Chat(主动关心) +``` + +## 部署架构 + +Suite 是自包含的——不依赖外部服务,自己带齐所有组件: + +``` +┌─ suite 部署 ─────────────────────────────────┐ +│ │ +│ noc (Rust binary) │ +│ ├─ telegram loop (Chat) │ +│ ├─ axum http server (Gitea webhook) │ +│ ├─ life loop (Self) │ +│ └─ worker loop (Worker) │ +│ │ +│ Gitea (self-hosted, AI 专属) │ +│ ├─ noc 持有 admin token,完全控制 │ +│ ├─ webhook → noc http server │ +│ └─ noc 通过 REST API 读写一切 │ +│ │ +│ SQLite (共享状态) │ +│ │ +│ LLM backend (外部,OpenAI-compatible) │ +│ │ +└───────────────────────────────────────────────┘ +``` + +Gitea 是 noc 的"专属地盘"——admin token 意味着 noc 可以: +- 创建/删除 repo 和 branch +- 读写任意 PR、issue、comment +- 管理 webhook、CI、用户 +- 不用操心权限,想干嘛干嘛 + +部署方式:docker-compose 或 systemd 同机编排,一键拉起。 + +## 现状 → 目标 + +| 界面 | 现状 | 下一步 | +|------|------|--------| +| Chat | ✅ Telegram, streaming, tools | 多前端抽象(Telegram + 飞书) | +| Gitea Bot | ❌ 不存在 | webhook 接收 + PR review | +| Worker | 🟡 SubAgent 雏形 | 独立任务队列 + 结果路由 | +| Self | 🟡 life loop + reflect | 更丰富的自主行为 | +| Gitea | ❌ 外部依赖 | 纳入 suite 部署,self-hosted |