From 5cdf47fca89c80e48fcae2c25de540690d64c000 Mon Sep 17 00:00:00 2001 From: VadimL Date: Fri, 24 Jul 2026 20:01:28 +0300 Subject: [PATCH] Added short-term memory --- Cargo.lock | 1112 ++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 5 +- chat_history.db | Bin 0 -> 4096 bytes chat_history.db-shm | Bin 0 -> 32768 bytes chat_history.db-wal | Bin 0 -> 387312 bytes src/main.rs | 169 ++++++- 6 files changed, 1244 insertions(+), 42 deletions(-) create mode 100644 chat_history.db create mode 100644 chat_history.db-shm create mode 100644 chat_history.db-wal diff --git a/Cargo.lock b/Cargo.lock index 64127d7..eed4f03 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,25 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "anstream" version = "1.0.0" @@ -52,23 +71,62 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + [[package]] name = "atomic-waker" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + [[package]] name = "bitflags" version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] [[package]] name = "bumpalo" @@ -76,6 +134,12 @@ version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "bytes" version = "1.12.1" @@ -126,7 +190,7 @@ version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", "syn 3.0.3", @@ -144,6 +208,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "core-foundation" version = "0.9.4" @@ -170,6 +240,78 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" + +[[package]] +name = "crossbeam-queue" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + [[package]] name = "displaydoc" version = "0.2.6" @@ -181,6 +323,21 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "either" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +dependencies = [ + "serde", +] + [[package]] name = "encoding_rs" version = "0.8.35" @@ -206,6 +363,23 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + [[package]] name = "fastrand" version = "2.5.0" @@ -218,6 +392,17 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + [[package]] name = "fnv" version = "1.0.7" @@ -255,6 +440,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -263,6 +449,34 @@ version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" +[[package]] +name = "futures-executor" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" + [[package]] name = "futures-sink" version = "0.3.33" @@ -282,11 +496,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" dependencies = [ "futures-core", + "futures-io", + "futures-sink", "futures-task", + "memchr", "pin-project-lite", "slab", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.17" @@ -298,6 +525,18 @@ dependencies = [ "wasi", ] +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + [[package]] name = "getrandom" version = "0.4.3" @@ -306,7 +545,7 @@ checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 6.0.0", ] [[package]] @@ -328,18 +567,79 @@ dependencies = [ "tracing", ] +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + [[package]] name = "hashbrown" version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +[[package]] +name = "hashlink" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +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 = "http" version = "1.4.2" @@ -409,7 +709,7 @@ dependencies = [ "http", "hyper", "hyper-util", - "rustls", + "rustls 0.23.42", "tokio", "tokio-rustls", "tower-service", @@ -437,7 +737,7 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-channel", "futures-util", @@ -566,7 +866,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.17.1", ] [[package]] @@ -598,12 +898,50 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + [[package]] name = "libc" version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" +dependencies = [ + "bitflags", + "libc", + "plain", + "redox_syscall 0.9.0", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -631,6 +969,16 @@ version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "memchr" version = "2.8.3" @@ -643,6 +991,12 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "mio" version = "1.2.2" @@ -671,6 +1025,61 @@ dependencies = [ "tempfile", ] +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + [[package]] name = "once_cell" version = "1.21.4" @@ -744,11 +1153,26 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.18", "smallvec", "windows-link", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -761,12 +1185,39 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + [[package]] name = "potential_utf" version = "0.1.5" @@ -776,6 +1227,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 = "proc-macro2" version = "1.0.107" @@ -794,12 +1254,48 @@ 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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" +[[package]] +name = "rand" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + [[package]] name = "redox_syscall" version = "0.5.18" @@ -809,13 +1305,22 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_syscall" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5102a6aaa05aa011a238e178e6bca86d2cb56fc9f586d37cb80f5bca6e07759" +dependencies = [ + "bitflags", +] + [[package]] name = "reqwest" version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "encoding_rs", "futures-core", @@ -863,6 +1368,26 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rust-llm-agent" version = "0.1.0" @@ -871,6 +1396,7 @@ dependencies = [ "reqwest", "serde", "serde_json", + "sqlx", "tokio", ] @@ -887,6 +1413,17 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "ring", + "rustls-webpki 0.101.7", + "sct", +] + [[package]] name = "rustls" version = "0.23.42" @@ -895,11 +1432,20 @@ checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" dependencies = [ "once_cell", "rustls-pki-types", - "rustls-webpki", + "rustls-webpki 0.103.13", "subtle", "zeroize", ] +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + [[package]] name = "rustls-pki-types" version = "1.15.1" @@ -909,6 +1455,16 @@ dependencies = [ "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.13" @@ -947,6 +1503,16 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "security-framework" version = "3.7.0" @@ -1025,6 +1591,28 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "shlex" version = "2.0.1" @@ -1041,6 +1629,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + [[package]] name = "slab" version = "0.4.12" @@ -1063,12 +1661,248 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "spin" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlformat" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" +dependencies = [ + "nom", + "unicode_categories", +] + +[[package]] +name = "sqlx" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" +dependencies = [ + "ahash", + "atoi", + "byteorder", + "bytes", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-channel", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashlink", + "hex", + "indexmap", + "log", + "memchr", + "once_cell", + "paste", + "percent-encoding", + "rustls 0.21.12", + "rustls-pemfile", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlformat", + "thiserror", + "tokio", + "tokio-stream", + "tracing", + "url", + "webpki-roots", +] + +[[package]] +name = "sqlx-macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 1.0.109", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" +dependencies = [ + "dotenvy", + "either", + "heck 0.4.1", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-sqlite", + "syn 1.0.109", + "tempfile", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" +dependencies = [ + "atoi", + "base64 0.21.7", + "bitflags", + "byteorder", + "bytes", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" +dependencies = [ + "atoi", + "base64 0.21.7", + "bitflags", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "sqlx-core", + "tracing", + "url", + "urlencoding", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + [[package]] name = "strsim" version = "0.11.1" @@ -1081,6 +1915,17 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.119" @@ -1157,6 +2002,26 @@ dependencies = [ "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", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "tinystr" version = "0.8.3" @@ -1167,6 +2032,21 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +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.53.1" @@ -1211,7 +2091,18 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls", + "rustls 0.23.42", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" +dependencies = [ + "futures-core", + "pin-project-lite", "tokio", ] @@ -1280,10 +2171,23 @@ version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ + "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "tracing-core" version = "0.1.36" @@ -1299,12 +2203,51 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + [[package]] name = "untrusted" version = "0.9.0" @@ -1323,6 +2266,12 @@ dependencies = [ "serde", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -1341,6 +2290,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "want" version = "0.3.1" @@ -1356,6 +2311,21 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.126" @@ -1421,6 +2391,22 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "whoami" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" +dependencies = [ + "libredox", + "wasite", +] + [[package]] name = "windows-link" version = "0.2.1" @@ -1456,13 +2442,22 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -1474,34 +2469,67 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + [[package]] name = "windows-targets" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -1514,30 +2542,60 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "writeable" version = "0.6.3" @@ -1567,6 +2625,26 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zerocopy" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "zerofrom" version = "0.1.8" diff --git a/Cargo.toml b/Cargo.toml index d955c91..f53ba80 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,4 +15,7 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" # Парсинг аргументов CLI (флаги --session-id и т.д.) -clap = { version = "4.5", features = ["derive"] } \ No newline at end of file +clap = { version = "4.5", features = ["derive"] } + +# Асинхронная работа с SQLite +sqlx = { version = "0.7", features = ["runtime-tokio-rustls", "sqlite"] } \ No newline at end of file diff --git a/chat_history.db b/chat_history.db new file mode 100644 index 0000000000000000000000000000000000000000..4ebf78cf96088c7148cb47caf804cc036de75a34 GIT binary patch literal 4096 zcmWFz^vNtqRY=P(%1ta$FlG>7U}9o$P*7lCU|@t|AVoG{WY8;GzzfnYK(-m98b?E5 nGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nC=3ArfDQ*E literal 0 HcmV?d00001 diff --git a/chat_history.db-shm b/chat_history.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..cc1309a9bb499e0ea1e25ff6bc439788d0b29efd GIT binary patch literal 32768 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 &9Pl9uki|* zkXNxm^JMI`$i4t&A>Wx7ve$J~ays(*mgskw@(L<%N7_L2{B}T$AF9ObS#k0U+Nh6G z96Yh2g3Zt@`R<)H$>g81<_7}@yl!e$n)qM=ICD- z7P@mE}tm?lRM$qr;@CQL?~BiL+JJpG4t z*Q9H`KzimIk|U6RxFLW50+U1F>MOLF>$?(NXzzS~Qz&TcxXUhpPp-LI~=_5~$fEur3(bSK}j#<1Y`pqXk$PwsaI78HG*rOB&Cr2Q`I&uUW1tdo>awg^cWYyfQIOjv$g9$jVBXj3r0# z&oA7V`*hoTrf9uDM&?O7M<8FgA%Fk^<3M29l@bG(yEJ8NfQ>tMx7#@Yqcx~4_PZiY z&K<2-?N~r%IXMDt;TyI)<90J1L2|cfi}46zqbrQ2-g-!FJUIf#2o#znh}EPIu_8y% t6l!nX!*~RYM_|We^kN}LpqB*W5p+r;eLJ~Gjv#5!h@oR!j6Fy2{{e;H7zO|U literal 0 HcmV?d00001 diff --git a/src/main.rs b/src/main.rs index 6f03428..9f262ce 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,44 +1,129 @@ use clap::Parser; +use serde::{Deserialize, Serialize}; use serde_json::json; +use sqlx::sqlite::{SqliteConnectOptions, SqlitePoolOptions}; +use sqlx::{Pool, Sqlite}; use std::io::{self, Write}; +use std::str::FromStr; use tokio::io::{AsyncBufReadExt, BufReader}; -/// CLI-утилита для взаимодействия с LLM в рамках указанной сессии #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] struct Args { - /// Идентификатор сессии/беседы (на будущее для VK peer_id) #[arg(short, long, default_value = "default_session")] session_id: String, - /// URL OpenAI-совместимого эндпоинта (vLLM / llama.cpp / Ollama) #[arg( short, long, - default_value = "http://localhost" + default_value = "http://192.168.0.50:6969/v1/chat/completions" )] api_url: String, - /// Название модели (для Ollama/vLLM) #[arg(short, long, default_value = "qwen2.5-coder")] model: String, + + /// Путь к файлу базы данных SQLite + #[arg(long, default_value = "sqlite:chat_history.db?mode=rwc")] + db_url: String, } -/// Функция отправки Stateless-запроса к LLM -async fn send_llm_request( +#[derive(Serialize, Deserialize, Debug, Clone)] +struct ChatMessage { + role: String, + content: String, +} + +/// Инициализация БД: создание таблицы, индексов и включение режима WAL +async fn init_db(db_url: &str) -> Result, Box> { + let options = SqliteConnectOptions::from_str(db_url)? + .create_if_missing(true) + .journal_mode(sqlx::sqlite::SqliteJournalMode::Wal); // WAL режим для высокой параллельности + + let pool = SqlitePoolOptions::new() + .max_connections(10) // До 10 параллельных соединений к БД + .connect_with(options) + .await?; + + // Создаем таблицу и индекс, если их нет + sqlx::query( + r#" + CREATE TABLE IF NOT EXISTS messages ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + session_id TEXT NOT NULL, + role TEXT NOT NULL, + content TEXT NOT NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP + ); + CREATE INDEX IF NOT EXISTS idx_messages_session_id_id + ON messages (session_id, id DESC); + "#, + ) + .execute(&pool) + .await?; + + Ok(pool) +} + +/// Сохранение сообщения в историю +async fn save_message( + pool: &Pool, + session_id: &str, + role: &str, + content: &str, +) -> Result<(), sqlx::Error> { + sqlx::query("INSERT INTO messages (session_id, role, content) VALUES (?, ?, ?)") + .bind(session_id) + .bind(role) + .bind(content) + .execute(pool) + .await?; + + Ok(()) +} + +/// Выборка последних N (5) сообщений контекста в хронологическом порядке +async fn get_recent_history( + pool: &Pool, + session_id: &str, + limit: i64, +) -> Result, sqlx::Error> { + let rows = sqlx::query_as::<_, (String, String)>( + r#" + SELECT role, content + FROM ( + SELECT role, content, id + FROM messages + WHERE session_id = ? + ORDER BY id DESC + LIMIT ? + ) + ORDER BY id ASC + "#, + ) + .bind(session_id) + .bind(limit * 2) + .fetch_all(pool) + .await?; + + let history = rows + .into_iter() + .map(|(role, content)| ChatMessage { role, content }) + .collect(); + + Ok(history) +} + +/// Отправка запроса с учетом накопленного контекста +async fn send_llm_request_with_history( client: &reqwest::Client, api_url: &str, model: &str, - user_message: &str, + history: &[ChatMessage], ) -> Result> { let payload = json!({ "model": model, - "messages": [ - { - "role": "user", - "content": user_message - } - ], + "messages": history, // Передаем весь сохраненный контекст "temperature": 0.7 }); @@ -64,13 +149,23 @@ async fn main() { let args = Args::parse(); let client = reqwest::Client::new(); + // 1. Инициализируем БД + let db_pool = match init_db(&args.db_url).await { + Ok(pool) => pool, + Err(e) => { + eprintln!("Ошибка инициализации БД: {}", e); + return; + } + }; + println!("=================================================="); - println!(" LLM CLI Agent (Stage 1)"); + println!(" LLM CLI Agent with Memory (Stage 2)"); println!(" Session ID: {}", args.session_id); println!(" API URL: {}", args.api_url); println!(" Model: {}", args.model); + println!(" Database: SQLite (WAL Mode)"); println!("=================================================="); - println!("Введите сообщение и нажмите Enter. Для выхода наберите 'exit' или 'quit'.\n"); + println!("Введите сообщение. Для выхода наберите 'exit' или 'quit'.\n"); let stdin = tokio::io::stdin(); let mut reader = BufReader::new(stdin); @@ -83,7 +178,7 @@ async fn main() { let bytes_read = reader.read_line(&mut input).await.unwrap_or(0); if bytes_read == 0 { - break; // EOF (Ctrl+D) + break; } let trimmed_input = input.trim(); @@ -92,23 +187,49 @@ async fn main() { continue; } - if trimmed_input.eq_ignore_ascii_case("exit") - || trimmed_input.eq_ignore_ascii_case("quit") + if trimmed_input.eq_ignore_ascii_case("exit") || trimmed_input.eq_ignore_ascii_case("quit") { println!("Завершение работы."); break; } - print!("[Ожидание ответа от LLM...]\r"); + // 2. Сохраняем сообщение пользователя в БД + if let Err(e) = save_message(&db_pool, &args.session_id, "user", trimmed_input).await { + eprintln!("[Ошибка записи в БД]: {}", e); + continue; + } + + // 3. Достаем последние 5 сообщений из БД (включая только что сохраненное) + let history = match get_recent_history(&db_pool, &args.session_id, 5).await { + Ok(h) => h, + Err(e) => { + eprintln!("[Ошибка чтения из БД]: {}", e); + continue; + } + }; + + print!( + "[Запрос к LLM с контекстом ({} сообщ.)...]\r", + history.len() + ); io::stdout().flush().unwrap(); - match send_llm_request(&client, &args.api_url, &args.model, trimmed_input).await { + // 4. Отправляем контекст в LLM + match send_llm_request_with_history(&client, &args.api_url, &args.model, &history).await { Ok(reply) => { - println!("\r[LLM]: {}\n", reply); + // \r - в начало, \x1B[2K - очистить всю текущую строку терминала + print!("\r\x1B[2K"); + println!("[LLM]: {}\n", reply); + + if let Err(e) = save_message(&db_pool, &args.session_id, "assistant", &reply).await + { + eprintln!("[Ошибка записи ответа в БД]: {}", e); + } } Err(e) => { - eprintln!("\r[Ошибка]: {}\n", e); + print!("\r\x1B[2K"); + eprintln!("[Ошибка LLM]: {}\n", e); } } } -} \ No newline at end of file +}